diff --git a/.editorconfig b/.editorconfig index ae10a5cc..a090db43 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,3 +8,6 @@ indent_size = 2 indent_style = space insert_final_newline = true trim_trailing_whitespace = true + +[{*.diff,*.patch}] +trim_trailing_whitespace = false diff --git a/examples/example-search-api/pages/advanced.tsx b/examples/example-search-api/pages/advanced.tsx index c8424837..a939ad6d 100644 --- a/examples/example-search-api/pages/advanced.tsx +++ b/examples/example-search-api/pages/advanced.tsx @@ -6,7 +6,7 @@ import { DrupalNode, getSearchIndexFromContext, deserialize, - JsonApiSearchApiResponse, + DrupalSearchApiJsonApiResponse, DrupalSearchApiFacet, } from "next-drupal" import { GetStaticPropsResult } from "next" @@ -209,14 +209,15 @@ export default function AdvancedPage({ export async function getStaticProps( context ): Promise> { - const results = await getSearchIndexFromContext( - "property", - context, - { - deserialize: false, - params, - } - ) + const results = + await getSearchIndexFromContext( + "property", + context, + { + deserialize: false, + params, + } + ) return { props: { diff --git a/modules/next/.gitlab-ci.yml b/modules/next/.gitlab-ci.yml index c81ebec4..68f90528 100644 --- a/modules/next/.gitlab-ci.yml +++ b/modules/next/.gitlab-ci.yml @@ -33,6 +33,11 @@ include: # View these include files at https://git.drupalcode.org/project/gitlab_templates/ ################ - project: $_GITLAB_TEMPLATES_REPO + # "ref" value can be: + # - Recommended (default) - `ref: $_GITLAB_TEMPLATES_REF` - The Drupal Association will update this value to the recommended tag for contrib. + # - Latest - `ref: main` - Get the latest additions and bug fixes as they are merged into the templates. + # - Minor or Major latests - `ref: 1.x-latest` or `ref: 1.0.x-latest` - Get the latest additions within a minor (mostly bugfixes) or major (bugs and new features). + # - Fixed tag - `ref: 1.0.1` - Set the value to a known tag. This will not get any updates. ref: $_GITLAB_TEMPLATES_REF file: - '/includes/include.drupalci.main.yml' diff --git a/package.json b/package.json index 36136c25..95b34c1e 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "format:check": "prettier --check .", "phpcs": "./drupal/vendor/bin/phpcs -p -s --colors --standard=modules/next/phpcs.xml modules/next", "test:next": "SIMPLETEST_DB=sqlite://localhost/:memory: ./drupal/vendor/bin/phpunit -c ./drupal/web/core modules/next", - "sync:modules": "./scripts/sync-repo.sh 1.0.x git@git.drupal.org:project/ \"modules/*\"", + "sync:modules": "./scripts/sync-repo.sh 2.x git@git.drupal.org:project/ \"modules/*\"", "sync:examples": "./scripts/sync-repo.sh main git@github.com:chapter-three/next- \"examples/example-*\"", "sync:starters": "./scripts/sync-repo.sh canary git@github.com:chapter-three/next-drupal- \"starters/*\"", "sync:starters:release": "./scripts/sync-repo.sh canary,main git@github.com:chapter-three/next-drupal- \"starters/*\"", @@ -32,46 +32,46 @@ "test:e2e:ci": "turbo run test:e2e:ci --parallel" }, "resolutions": { - "@types/react": "17.0.68", - "@types/react-dom": "17.0.21" + "@types/react": "17.0.75", + "@types/react-dom": "17.0.25" }, "devDependencies": { "@actions/core": "^1.10.1", - "@babel/core": "^7.23.2", - "@babel/eslint-parser": "^7.22.15", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-react": "^7.22.15", - "@commitlint/cli": "^18.6.0", - "@commitlint/config-conventional": "^17.8.0", + "@babel/core": "^7.23.9", + "@babel/eslint-parser": "^7.23.10", + "@babel/plugin-transform-runtime": "^7.23.9", + "@babel/preset-env": "^7.23.9", + "@babel/preset-react": "^7.23.3", + "@commitlint/cli": "^18.6.1", + "@commitlint/config-conventional": "^18.6.2", "@next/eslint-plugin-next": "^12.3.4", "@testing-library/cypress": "^8.0.7", - "@types/jest": "^27.5.2", - "@types/node": "^17.0.45", - "@types/react": "^17.0.68", - "@types/react-dom": "^17.0.21", + "@types/jest": "^29.5.12", + "@types/node": "^20.11.19", + "@types/react": "^17.0.75", + "@types/react-dom": "^17.0.25", "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/parser": "^7.0.2", "cypress": "^9.7.0", - "eslint": "^8.51.0", - "eslint-config-prettier": "^9.0.0", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-cypress": "^2.15.1", - "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react": "^7.33.2", "faker": "^6.6.6", "husky": "^9.0.11", "isomorphic-fetch": "^3.0.0", - "jest": "^27.5.1", - "lerna": "^8.0.1", - "lint-staged": "^15.0.2", - "prettier": "^3.0.3", + "jest": "^29.7.0", + "lerna": "^8.1.2", + "lint-staged": "^15.2.2", + "prettier": "^3.2.5", "start-server-and-test": "^1.15.5", - "ts-jest": "^27.1.5", - "ts-node": "^10.9.1", - "tsup": "^7.3.0", - "turbo": "^1.10.15", - "typescript": "^5.2.2", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + "tsup": "^8.0.2", + "turbo": "^1.12.4", + "typescript": "^5.3.3", "uuid": "^9.0.1", - "yaml": "^2.3.3" + "yaml": "^2.3.4" } } diff --git a/packages/next-drupal-query/jest.config.cjs b/packages/next-drupal-query/jest.config.cjs index 54219611..24a2d4bb 100644 --- a/packages/next-drupal-query/jest.config.cjs +++ b/packages/next-drupal-query/jest.config.cjs @@ -1,25 +1,29 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +/** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { preset: "ts-jest/presets/js-with-ts", testEnvironment: "node", setupFiles: ["dotenv/config"], setupFilesAfterEnv: ["/jest.setup.ts"], testMatch: ["**/tests/**/*.test.{ts,tsx}"], - globals: { - "ts-jest": { - isolatedModules: true, - }, + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { + isolatedModules: true, + }, + ], }, + testLocationInResults: true, coverageProvider: "v8", collectCoverage: true, collectCoverageFrom: ["./src/**"], coverageReporters: ["lcov", "text", "text-summary"], coverageThreshold: { global: { - statements: 85.11, - branches: 58, + statements: 84.22, + branches: 64.1, functions: 70, - lines: 85.11, + lines: 84.22, }, }, } diff --git a/packages/next-drupal-query/src/index.ts b/packages/next-drupal-query/src/index.ts index 1c72e3b0..9c27ee45 100644 --- a/packages/next-drupal-query/src/index.ts +++ b/packages/next-drupal-query/src/index.ts @@ -235,7 +235,7 @@ export function withPagination( } } - if (typeof opts.page !== undefined && typeof opts.limit !== undefined) { + if (typeof opts.page !== "undefined" && typeof opts.limit !== "undefined") { params.addPageLimit(opts.limit).addPageOffset(opts.page * opts.limit) } @@ -292,8 +292,8 @@ export function createQueries>>(queries: Q) { opts = massageRouteQuery(opts) if ( - typeof query["defaultOpts"] !== undefined && - typeof opts !== undefined + typeof query["defaultOpts"] !== "undefined" && + typeof opts !== "undefined" ) { // eslint-disable-next-line @typescript-eslint/no-explicit-any opts = deepmerge(query["defaultOpts"], opts as any) as any diff --git a/packages/next-drupal-query/tests/__snapshots__/index.test.ts.snap b/packages/next-drupal-query/tests/__snapshots__/index.test.ts.snap index 1abeff66..5aac1b87 100644 --- a/packages/next-drupal-query/tests/__snapshots__/index.test.ts.snap +++ b/packages/next-drupal-query/tests/__snapshots__/index.test.ts.snap @@ -1,13 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`formatData it formats data 1`] = ` -Object { +{ "name": "First Last", } `; exports[`getData it accepts data options 1`] = ` -Object { +{ "author": "shadcn", "id": "ID", "title": "Title of Article", @@ -16,14 +16,14 @@ Object { `; exports[`getData it accepts placeholder options 1`] = ` -Object { +{ "email": "name@example.com", "name": "shadcn", } `; exports[`getData it returns data for a query 1`] = ` -Object { +{ "author": "shadcn", "id": "id", "title": "Title of Article", @@ -32,52 +32,52 @@ Object { `; exports[`getData it returns data when both data and placeholder is defined 1`] = ` -Object { +{ "email": "foo@example.com", } `; exports[`getData it returns formatted data if a formatter is defined 1`] = ` -Object { +{ "email": "foo@example.com", "name": "First Last", } `; exports[`getData it returns placeholder data if a query does not define data 1`] = ` -Object { +{ "name": "shadcn", } `; exports[`getParams it accepts params options 1`] = ` -Object { - "fields": Object { +{ + "fields": { "resource": "foo,bar", }, - "filter": Object {}, - "include": Array [], - "sort": Array [], + "filter": {}, + "include": [], + "sort": [], } `; exports[`getParams it allows params to be nested 1`] = ` -Object { - "fields": Object {}, - "filter": Object {}, +{ + "fields": {}, + "filter": {}, "include": "field_image,uid", - "page": Object { + "page": { "limit": 10, }, - "sort": Array [], + "sort": [], } `; exports[`getParams it returns params for a query 1`] = ` -Object { - "fields": Object {}, - "filter": Object {}, +{ + "fields": {}, + "filter": {}, "include": "field_image,uid", - "sort": Array [], + "sort": [], } `; diff --git a/packages/next-drupal/jest.config.cjs b/packages/next-drupal/jest.config.cjs index 628ca568..a7ccdfe7 100644 --- a/packages/next-drupal/jest.config.cjs +++ b/packages/next-drupal/jest.config.cjs @@ -1,27 +1,35 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +/** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { preset: "ts-jest", testEnvironment: "node", setupFiles: ["dotenv/config"], setupFilesAfterEnv: ["/jest.setup.ts"], testMatch: ["**/tests/**/*.test.{ts,tsx}"], - globals: { - "ts-jest": { - isolatedModules: true, - }, + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { + isolatedModules: true, + }, + ], }, + testLocationInResults: true, coverageProvider: "v8", collectCoverage: true, collectCoverageFrom: ["./src/**"], - coveragePathIgnorePatterns: ["./src/get-*"], + coveragePathIgnorePatterns: [ + "./src/deprecated/*", + "./src/deprecated.ts", + "./src/navigation.ts", + "./src/types/*", + ], coverageReporters: ["lcov", "text", "text-summary"], coverageThreshold: { global: { - // @TODO Make these thresholds strict once #608 is completed. - statements: 50, // 55.1, - branches: 80, // 84.16, - functions: 70, // 72.41, - lines: 50, // 55.1, + statements: 100, + branches: 100, + functions: 100, + lines: 100, }, }, } diff --git a/packages/next-drupal/package.json b/packages/next-drupal/package.json index 44ad581e..b008de9b 100644 --- a/packages/next-drupal/package.json +++ b/packages/next-drupal/package.json @@ -72,7 +72,7 @@ "directory": "packages/next-drupal" }, "devDependencies": { - "typescript": "^5.2.2" + "typescript": "^5.3.3" }, "dependencies": { "jsona": "^1.12.1", diff --git a/packages/next-drupal/src/client.ts b/packages/next-drupal/src/client.ts index bd0cebe9..0e51bc01 100644 --- a/packages/next-drupal/src/client.ts +++ b/packages/next-drupal/src/client.ts @@ -23,14 +23,14 @@ import type { FetchOptions, JsonApiCreateFileResourceBody, JsonApiCreateResourceBody, + JsonApiOptions, JsonApiParams, JsonApiResource, JsonApiResourceWithPath, JsonApiResponse, JsonApiUpdateResourceBody, - JsonApiWithAuthOptions, + JsonApiWithAuthOption, JsonApiWithCacheOptions, - JsonApiWithLocaleOptions, Locale, PathAlias, PathPrefix, @@ -264,7 +264,7 @@ export class DrupalClient { if (token) { init["headers"]["Authorization"] = `Bearer ${token.access_token}` } - } else if (isAccessTokenAuth(this._auth)) { + } /* c8 ignore next 4 */ else if (isAccessTokenAuth(this._auth)) { init["headers"]["Authorization"] = `${this._auth.token_type} ${this._auth.access_token}` } @@ -273,7 +273,7 @@ export class DrupalClient { this.debug(`Using custom authorization header.`) init["headers"]["Authorization"] = init.withAuth - } else if (typeof init.withAuth === "function") { + } /* c8 ignore next 4 */ else if (typeof init.withAuth === "function") { this.debug(`Using custom authorization callback.`) init["headers"]["Authorization"] = init.withAuth() @@ -292,7 +292,7 @@ export class DrupalClient { if (token) { init["headers"]["Authorization"] = `Bearer ${token.access_token}` } - } else if (isAccessTokenAuth(init.withAuth)) { + } /* c8 ignore next 4 */ else if (isAccessTokenAuth(init.withAuth)) { init["headers"]["Authorization"] = `${init.withAuth.token_type} ${init.withAuth.access_token}` } @@ -312,7 +312,7 @@ export class DrupalClient { async createResource( type: string, body: JsonApiCreateResourceBody, - options?: JsonApiWithLocaleOptions & JsonApiWithAuthOptions + options?: JsonApiOptions ): Promise { options = { deserialize: true, @@ -322,7 +322,9 @@ export class DrupalClient { const apiPath = await this.getEntryForResourceType( type, - options?.locale !== options?.defaultLocale ? options.locale : undefined + options?.locale !== options?.defaultLocale + ? /* c8 ignore next */ options.locale + : undefined ) const url = this.buildUrl(apiPath, options?.params) @@ -338,19 +340,19 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const json = await response.json() - return options.deserialize ? this.deserialize(json) : json + return options.deserialize + ? this.deserialize(json) + : /* c8 ignore next */ json } async createFileResource( type: string, body: JsonApiCreateFileResourceBody, - options?: JsonApiWithLocaleOptions & JsonApiWithAuthOptions + options?: JsonApiOptions ): Promise { options = { deserialize: true, @@ -383,9 +385,7 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const json = await response.json() @@ -396,7 +396,7 @@ export class DrupalClient { type: string, uuid: string, body: JsonApiUpdateResourceBody, - options?: JsonApiWithLocaleOptions & JsonApiWithAuthOptions + options?: JsonApiOptions ): Promise { options = { deserialize: true, @@ -406,7 +406,9 @@ export class DrupalClient { const apiPath = await this.getEntryForResourceType( type, - options?.locale !== options?.defaultLocale ? options.locale : undefined + options?.locale !== options?.defaultLocale + ? /* c8 ignore next */ options.locale + : undefined ) const url = this.buildUrl(`${apiPath}/${uuid}`, options?.params) @@ -423,19 +425,19 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const json = await response.json() - return options.deserialize ? this.deserialize(json) : json + return options.deserialize + ? this.deserialize(json) + : /* c8 ignore next */ json } async deleteResource( type: string, uuid: string, - options?: JsonApiWithLocaleOptions & JsonApiWithAuthOptions + options?: JsonApiOptions ): Promise { options = { withAuth: true, @@ -445,7 +447,9 @@ export class DrupalClient { const apiPath = await this.getEntryForResourceType( type, - options?.locale !== options?.defaultLocale ? options.locale : undefined + options?.locale !== options?.defaultLocale + ? /* c8 ignore next */ options.locale + : undefined ) const url = this.buildUrl(`${apiPath}/${uuid}`, options?.params) @@ -457,9 +461,7 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) return response.status === 204 } @@ -467,9 +469,7 @@ export class DrupalClient { async getResource( type: string, uuid: string, - options?: JsonApiWithLocaleOptions & - JsonApiWithAuthOptions & - JsonApiWithCacheOptions + options?: JsonApiOptions & JsonApiWithCacheOptions ): Promise { options = { deserialize: true, @@ -479,6 +479,7 @@ export class DrupalClient { ...options, } + /* c8 ignore next 11 */ if (options.withCache) { const cached = (await this.cache.get(options.cacheKey)) as string @@ -504,12 +505,11 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const json = await response.json() + /* c8 ignore next 3 */ if (options.withCache) { await this.cache.set(options.cacheKey, JSON.stringify(json)) } @@ -523,8 +523,7 @@ export class DrupalClient { options?: { pathPrefix?: PathPrefix isVersionable?: boolean - } & JsonApiWithLocaleOptions & - JsonApiWithAuthOptions + } & JsonApiOptions ): Promise { const type = typeof input === "string" ? input : input.jsonapi.resourceName @@ -571,6 +570,7 @@ export class DrupalClient { // When we try to translate /es/example, decoupled router will properly // translate to the untranslated version and set the locale to es. // However a subrequests to /es/subrequests for decoupled router will fail. + /* c8 ignore next 3 */ if (context.locale && input.entity.langcode !== context.locale) { context.locale = input.entity.langcode } @@ -605,8 +605,7 @@ export class DrupalClient { path: string, options?: { isVersionable?: boolean - } & JsonApiWithLocaleOptions & - JsonApiWithAuthOptions + } & JsonApiOptions ): Promise { options = { deserialize: true, @@ -625,7 +624,7 @@ export class DrupalClient { options.defaultLocale && path.indexOf(options.locale) !== 1 ) { - path = path === "/" ? path : path.replace(/^\/+/, "") + path = path === "/" ? /* c8 ignore next */ path : path.replace(/^\/+/, "") path = this.getPathFromContext({ params: { slug: [path] }, locale: options.locale, @@ -716,8 +715,7 @@ export class DrupalClient { type: string, options?: { deserialize?: boolean - } & JsonApiWithLocaleOptions & - JsonApiWithAuthOptions + } & JsonApiOptions ): Promise { options = { withAuth: this.withAuth, @@ -740,9 +738,7 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const json = await response.json() @@ -754,8 +750,7 @@ export class DrupalClient { context: GetStaticPropsContext, options?: { deserialize?: boolean - } & JsonApiWithLocaleOptions & - JsonApiWithAuthOptions + } & JsonApiOptions ): Promise { options = { deserialize: true, @@ -778,7 +773,7 @@ export class DrupalClient { options?: { params?: JsonApiParams pathPrefix?: PathPrefix - } & JsonApiWithAuthOptions + } & JsonApiWithAuthOption ): Promise["paths"]> { options = { withAuth: this.withAuth, @@ -893,7 +888,7 @@ export class DrupalClient { async translatePath( path: string, - options?: JsonApiWithAuthOptions + options?: JsonApiWithAuthOption ): Promise { options = { withAuth: this.withAuth, @@ -926,7 +921,7 @@ export class DrupalClient { context: GetStaticPropsContext, options?: { pathPrefix?: PathPrefix - } & JsonApiWithAuthOptions + } & JsonApiWithAuthOption ): Promise { options = { pathPrefix: "/", @@ -1034,6 +1029,7 @@ export class DrupalClient { const pattern = `^\\/${locale}\\/` const path = href.replace(this.baseUrl, "") + /* c8 ignore next 3 */ if (!new RegExp(pattern, "i").test(path)) { return `${this.baseUrl}/${locale}${path}` } @@ -1079,6 +1075,7 @@ export class DrupalClient { response: NextApiResponse, options?: Parameters[0] ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { slug, resourceVersion, plugin, secret, scope, ...draftData } = request.query const useDraftMode = options?.enable @@ -1160,9 +1157,7 @@ export class DrupalClient { async getMenu( name: string, - options?: JsonApiWithLocaleOptions & - JsonApiWithAuthOptions & - JsonApiWithCacheOptions + options?: JsonApiOptions & JsonApiWithCacheOptions ): Promise<{ items: T[] tree: T[] @@ -1175,6 +1170,7 @@ export class DrupalClient { ...options, } + /* c8 ignore next 9 */ if (options.withCache) { const cached = (await this.cache.get(options.cacheKey)) as string @@ -1200,13 +1196,13 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const data = await response.json() - const items = options.deserialize ? this.deserialize(data) : data + const items = options.deserialize + ? this.deserialize(data) + : /* c8 ignore next */ data const { items: tree } = this.buildMenuTree(items) @@ -1215,6 +1211,7 @@ export class DrupalClient { tree, } + /* c8 ignore next 3 */ if (options.withCache) { await this.cache.set(options.cacheKey, JSON.stringify(menu)) } @@ -1246,7 +1243,7 @@ export class DrupalClient { async getView( name: string, - options?: JsonApiWithLocaleOptions & JsonApiWithAuthOptions + options?: JsonApiOptions ): Promise> { options = { withAuth: this.withAuth, @@ -1273,9 +1270,7 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const data = await response.json() @@ -1291,7 +1286,7 @@ export class DrupalClient { async getSearchIndex( name: string, - options?: JsonApiWithLocaleOptions & JsonApiWithAuthOptions + options?: JsonApiOptions ): Promise { options = { withAuth: this.withAuth, @@ -1315,9 +1310,7 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const json = await response.json() @@ -1327,7 +1320,7 @@ export class DrupalClient { async getSearchIndexFromContext( name: string, context: GetStaticPropsContext, - options?: JsonApiWithLocaleOptions & JsonApiWithAuthOptions + options?: JsonApiOptions ): Promise { return await this.getSearchIndex(name, { ...options, @@ -1382,7 +1375,7 @@ export class DrupalClient { const clientId = opts?.clientId || this._auth.clientId const clientSecret = opts?.clientSecret || this._auth.clientSecret - const url = this.buildUrl(opts?.url || this._auth.url || DEFAULT_AUTH_URL) + const url = this.buildUrl(opts?.url || this._auth.url) if ( this.accessTokenScope === opts?.scope && @@ -1415,9 +1408,7 @@ export class DrupalClient { body, }) - if (!response?.ok) { - await this.handleJsonApiErrors(response) - } + await this.throwIfJsonApiErrors(response) const result: AccessToken = await response.json() @@ -1484,7 +1475,7 @@ export class DrupalClient { throw error } - private async handleJsonApiErrors(response: Response) { + private async throwIfJsonApiErrors(response: Response) { if (!response?.ok) { const errors = await this.getErrorsFromResponse(response) throw new JsonApiErrors(errors, response.status) @@ -1493,7 +1484,7 @@ export class DrupalClient { private getAuthFromContextAndOptions( context: GetStaticPropsContext, - options: JsonApiWithAuthOptions + options: JsonApiWithAuthOption ) { // If not in preview or withAuth is provided, use that. if (!context.preview) { diff --git a/packages/next-drupal/src/deprecated.ts b/packages/next-drupal/src/deprecated.ts new file mode 100644 index 00000000..8693c514 --- /dev/null +++ b/packages/next-drupal/src/deprecated.ts @@ -0,0 +1,19 @@ +export * from "./deprecated/get-access-token" +export * from "./deprecated/get-menu" +export * from "./deprecated/get-paths" +export * from "./deprecated/get-resource-collection" +export * from "./deprecated/preview" +export * from "./deprecated/get-resource-type" +export * from "./deprecated/get-resource" +export * from "./deprecated/get-search-index" +export * from "./deprecated/get-view" +export * from "./deprecated/translate-path" +export { + deserialize, + buildUrl, + getJsonApiIndex, + getJsonApiPathForResourceType, + syncDrupalPreviewRoutes, +} from "./deprecated/utils" + +export type * from "./types/deprecated" diff --git a/packages/next-drupal/src/get-access-token.ts b/packages/next-drupal/src/deprecated/get-access-token.ts similarity index 95% rename from packages/next-drupal/src/get-access-token.ts rename to packages/next-drupal/src/deprecated/get-access-token.ts index 6e718b00..017a6660 100644 --- a/packages/next-drupal/src/get-access-token.ts +++ b/packages/next-drupal/src/deprecated/get-access-token.ts @@ -1,5 +1,5 @@ import { cache } from "./get-cache" -import type { AccessToken } from "./types" +import type { AccessToken } from "../types" const CACHE_KEY = "NEXT_DRUPAL_ACCESS_TOKEN" diff --git a/packages/next-drupal/src/get-cache.ts b/packages/next-drupal/src/deprecated/get-cache.ts similarity index 100% rename from packages/next-drupal/src/get-cache.ts rename to packages/next-drupal/src/deprecated/get-cache.ts diff --git a/packages/next-drupal/src/get-menu.ts b/packages/next-drupal/src/deprecated/get-menu.ts similarity index 90% rename from packages/next-drupal/src/get-menu.ts rename to packages/next-drupal/src/deprecated/get-menu.ts index bee99b21..17262968 100644 --- a/packages/next-drupal/src/get-menu.ts +++ b/packages/next-drupal/src/deprecated/get-menu.ts @@ -1,9 +1,6 @@ import { buildHeaders, buildUrl, deserialize } from "./utils" -import type { - AccessToken, - DrupalMenuLinkContent, - JsonApiWithLocaleOptions, -} from "./types" +import type { AccessToken, DrupalMenuLinkContent } from "../types" +import type { JsonApiWithLocaleOptions } from "../types/deprecated" export async function getMenu( name: string, diff --git a/packages/next-drupal/src/get-paths.ts b/packages/next-drupal/src/deprecated/get-paths.ts similarity index 97% rename from packages/next-drupal/src/get-paths.ts rename to packages/next-drupal/src/deprecated/get-paths.ts index 62f4b341..a2bbfe01 100644 --- a/packages/next-drupal/src/get-paths.ts +++ b/packages/next-drupal/src/deprecated/get-paths.ts @@ -1,6 +1,6 @@ import { getResourceCollection } from "./get-resource-collection" import type { GetStaticPathsContext, GetStaticPathsResult } from "next" -import type { AccessToken, JsonApiParams, Locale } from "./types" +import type { AccessToken, JsonApiParams, Locale } from "../types" export async function getPathsFromContext( types: string | string[], diff --git a/packages/next-drupal/src/get-resource-collection.ts b/packages/next-drupal/src/deprecated/get-resource-collection.ts similarity index 91% rename from packages/next-drupal/src/get-resource-collection.ts rename to packages/next-drupal/src/deprecated/get-resource-collection.ts index 9c182351..209cd3da 100644 --- a/packages/next-drupal/src/get-resource-collection.ts +++ b/packages/next-drupal/src/deprecated/get-resource-collection.ts @@ -5,12 +5,8 @@ import { getJsonApiPathForResourceType, } from "./utils" import type { GetStaticPropsContext } from "next" -import type { - AccessToken, - JsonApiParams, - JsonApiResource, - JsonApiWithLocaleOptions, -} from "./types" +import type { AccessToken, JsonApiParams, JsonApiResource } from "../types" +import type { JsonApiWithLocaleOptions } from "../types/deprecated" export async function getResourceCollection( type: string, diff --git a/packages/next-drupal/src/get-resource-type.ts b/packages/next-drupal/src/deprecated/get-resource-type.ts similarity index 91% rename from packages/next-drupal/src/get-resource-type.ts rename to packages/next-drupal/src/deprecated/get-resource-type.ts index fb3ee9d4..85f52044 100644 --- a/packages/next-drupal/src/get-resource-type.ts +++ b/packages/next-drupal/src/deprecated/get-resource-type.ts @@ -1,6 +1,6 @@ import { translatePathFromContext } from "./translate-path" import type { GetStaticPropsContext } from "next" -import type { AccessToken } from "./types" +import type { AccessToken } from "../types" export async function getResourceTypeFromContext( context: GetStaticPropsContext, diff --git a/packages/next-drupal/src/get-resource.ts b/packages/next-drupal/src/deprecated/get-resource.ts similarity index 97% rename from packages/next-drupal/src/get-resource.ts rename to packages/next-drupal/src/deprecated/get-resource.ts index cc6e28f9..7da11f90 100644 --- a/packages/next-drupal/src/get-resource.ts +++ b/packages/next-drupal/src/deprecated/get-resource.ts @@ -7,12 +7,8 @@ import { getPathFromContext, } from "./utils" import type { GetStaticPropsContext } from "next" -import type { - AccessToken, - JsonApiParams, - JsonApiResource, - JsonApiWithLocaleOptions, -} from "./types" +import type { AccessToken, JsonApiParams, JsonApiResource } from "../types" +import type { JsonApiWithLocaleOptions } from "../types/deprecated" export async function getResourceFromContext( type: string, diff --git a/packages/next-drupal/src/get-search-index.ts b/packages/next-drupal/src/deprecated/get-search-index.ts similarity index 90% rename from packages/next-drupal/src/get-search-index.ts rename to packages/next-drupal/src/deprecated/get-search-index.ts index a40a5433..f97d2faf 100644 --- a/packages/next-drupal/src/get-search-index.ts +++ b/packages/next-drupal/src/deprecated/get-search-index.ts @@ -1,10 +1,7 @@ import { buildHeaders, buildUrl, deserialize } from "./utils" import type { GetStaticPropsContext } from "next" -import type { - AccessToken, - JsonApiResource, - JsonApiWithLocaleOptions, -} from "./types" +import type { AccessToken, JsonApiResource } from "../types" +import type { JsonApiWithLocaleOptions } from "../types/deprecated" export async function getSearchIndex( name: string, diff --git a/packages/next-drupal/src/get-view.ts b/packages/next-drupal/src/deprecated/get-view.ts similarity index 90% rename from packages/next-drupal/src/get-view.ts rename to packages/next-drupal/src/deprecated/get-view.ts index 8241b0c6..2b7cb0ca 100644 --- a/packages/next-drupal/src/get-view.ts +++ b/packages/next-drupal/src/deprecated/get-view.ts @@ -1,5 +1,6 @@ import { buildHeaders, buildUrl, deserialize } from "./utils" -import type { AccessToken, JsonApiWithLocaleOptions } from "./types" +import type { AccessToken } from "../types" +import type { JsonApiWithLocaleOptions } from "../types/deprecated" export async function getView( name: string, diff --git a/packages/next-drupal/src/preview.ts b/packages/next-drupal/src/deprecated/preview.ts similarity index 96% rename from packages/next-drupal/src/preview.ts rename to packages/next-drupal/src/deprecated/preview.ts index 224077b0..7e4d096f 100644 --- a/packages/next-drupal/src/preview.ts +++ b/packages/next-drupal/src/deprecated/preview.ts @@ -1,6 +1,6 @@ import { getResourceByPath } from "./get-resource" import type { NextApiRequest, NextApiResponse } from "next" -import type { JsonApiWithLocaleOptions } from "./types" +import type { JsonApiWithLocaleOptions } from "../types/deprecated" interface PreviewOptions { errorMessages?: { diff --git a/packages/next-drupal/src/translate-path.ts b/packages/next-drupal/src/deprecated/translate-path.ts similarity index 93% rename from packages/next-drupal/src/translate-path.ts rename to packages/next-drupal/src/deprecated/translate-path.ts index ace83fc0..0651957d 100644 --- a/packages/next-drupal/src/translate-path.ts +++ b/packages/next-drupal/src/deprecated/translate-path.ts @@ -1,6 +1,6 @@ import { buildHeaders, buildUrl, getPathFromContext } from "./utils" import type { GetStaticPropsContext } from "next" -import type { AccessToken, DrupalTranslatedPath } from "./types" +import type { AccessToken, DrupalTranslatedPath } from "../types" export async function translatePath( path: string, diff --git a/packages/next-drupal/src/navigation/use-menu.ts b/packages/next-drupal/src/deprecated/use-menu.ts similarity index 96% rename from packages/next-drupal/src/navigation/use-menu.ts rename to packages/next-drupal/src/deprecated/use-menu.ts index cbc4b3f6..25c82c2d 100644 --- a/packages/next-drupal/src/navigation/use-menu.ts +++ b/packages/next-drupal/src/deprecated/use-menu.ts @@ -1,6 +1,6 @@ import { useRouter } from "next/router" import { useEffect, useState } from "react" -import { getMenu } from "../get-menu" +import { getMenu } from "./get-menu" import type { DrupalMenuLinkContent } from "../types" export function useMenu( diff --git a/packages/next-drupal/src/utils.ts b/packages/next-drupal/src/deprecated/utils.ts similarity index 98% rename from packages/next-drupal/src/utils.ts rename to packages/next-drupal/src/deprecated/utils.ts index dd8330ec..8e86f6b9 100644 --- a/packages/next-drupal/src/utils.ts +++ b/packages/next-drupal/src/deprecated/utils.ts @@ -2,7 +2,7 @@ import { Jsona } from "jsona" import { stringify } from "qs" import { getAccessToken } from "./get-access-token" import type { GetStaticPropsContext } from "next" -import type { AccessToken, Locale } from "./types" +import type { AccessToken, Locale } from "../types" const JSONAPI_PREFIX = process.env.DRUPAL_JSONAPI_PREFIX || "/jsonapi" diff --git a/packages/next-drupal/src/draft.ts b/packages/next-drupal/src/draft.ts index 32f42cd0..a598db72 100644 --- a/packages/next-drupal/src/draft.ts +++ b/packages/next-drupal/src/draft.ts @@ -34,6 +34,7 @@ export async function enableDraftMode( } // Send Drupal's data to the draft-mode page. + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { secret, scope, plugin, ...draftData } = Object.fromEntries( searchParams.entries() ) diff --git a/packages/next-drupal/src/index.ts b/packages/next-drupal/src/index.ts index fb7c2513..860e0b0e 100644 --- a/packages/next-drupal/src/index.ts +++ b/packages/next-drupal/src/index.ts @@ -1,21 +1,6 @@ -export * from "./get-access-token" -export * from "./get-menu" -export * from "./get-paths" -export * from "./get-resource-collection" -export * from "./preview" -export * from "./get-resource-type" -export * from "./get-resource" -export * from "./get-search-index" -export * from "./get-view" -export * from "./types" -export * from "./translate-path" -export { - deserialize, - buildUrl, - getJsonApiIndex, - getJsonApiPathForResourceType, - syncDrupalPreviewRoutes, -} from "./utils" - export * from "./client" export * from "./jsonapi-errors" + +export type * from "./types" + +export * from "./deprecated" diff --git a/packages/next-drupal/src/jsonapi-errors.ts b/packages/next-drupal/src/jsonapi-errors.ts index d26f6f9c..e2c4c322 100644 --- a/packages/next-drupal/src/jsonapi-errors.ts +++ b/packages/next-drupal/src/jsonapi-errors.ts @@ -1,4 +1,17 @@ -import type { JsonApiError } from "./types" +// https://jsonapi.org/format/#error-objects +export interface JsonApiError { + id?: string + status?: string + code?: string + title?: string + detail?: string + links?: JsonApiLinks +} + +// https://jsonapi.org/format/#document-links +export interface JsonApiLinks { + [key: string]: string | Record +} export class JsonApiErrors extends Error { errors: JsonApiError[] | string diff --git a/packages/next-drupal/src/navigation.ts b/packages/next-drupal/src/navigation.ts index 33d5f232..33b89724 100644 --- a/packages/next-drupal/src/navigation.ts +++ b/packages/next-drupal/src/navigation.ts @@ -1 +1 @@ -export { useMenu } from "./navigation/use-menu" +export { useMenu } from "./deprecated/use-menu" diff --git a/packages/next-drupal/src/types.ts b/packages/next-drupal/src/types.ts deleted file mode 100644 index 0e5c9730..00000000 --- a/packages/next-drupal/src/types.ts +++ /dev/null @@ -1,478 +0,0 @@ -export type DrupalClientOptions = { - /** - * Set the JSON:API prefix. - * - * * **Default value**: `/jsonapi` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#apiprefix) - */ - apiPrefix?: string - - /** - * Set debug to true to enable debug messages. - * - * * **Default value**: `false` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#debug) - */ - debug?: boolean - - /** - * Set the default frontPage. - * - * * **Default value**: `/home` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#frontpage) - */ - frontPage?: string - - /** - * Set custom headers for the fetcher. - * - * * **Default value**: { "Content-Type": "application/vnd.api+json", Accept: "application/vnd.api+json" } - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#headers) - */ - headers?: HeadersInit - - /** - * Override the default data serializer. You can use this to add your own JSON:API data deserializer. - * - * * **Default value**: `jsona` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#serializer) - */ - serializer?: Serializer - /** - * Override the default fetcher. Use this to add your own fetcher ex. axios. - * - * * **Default value**: `fetch` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#fetcher) - */ - fetcher?: Fetcher - - /** - * Override the default cache. - * - * * **Default value**: `node-cache` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#cache) - */ - cache?: DataCache - - /** - * If set to true, JSON:API errors are thrown in non-production environments. The errors are shown in the Next.js overlay. - * - * **Default value**: `true` - * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#throwjsonapierrors) - */ - throwJsonApiErrors?: boolean - - /** - * Override the default logger. You can use this to send logs to a third-party service. - * - * * **Default value**: `console` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#logger) - */ - logger?: Logger - - /** - * Override the default auth. You can use this to implement your own authentication mechanism. - * - * [Documentation](https://next-drupal.org/docs/client/configuration#auth) - */ - auth?: DrupalClientAuth - - /** - * Set whether the client should use authenticated requests by default. - * - * * **Default value**: `true` - * * **Required**: **No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#withauth) - */ - withAuth?: boolean - - /** - * By default, the client will make a request to JSON:API to retrieve the index. You can turn this off and use the default entry point from the resource name. - * - * * **Default value**: `false` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#auth) - */ - useDefaultResourceTypeEntry?: boolean - - /** - * The secret to use for preview mode. - * - * * **Default value**: `null` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#previewsecret) - */ - previewSecret?: string - - /** - * A long-lived access token you can set for the client. - * - * * **Default value**: `null` - * * **Required**: *No* - * - * [Documentation](https://next-drupal.org/docs/client/configuration#accesstoken) - */ - accessToken?: AccessToken - - /** - * The scope used for the current access token. - */ - accessTokenScope?: string -} - -export type DrupalClientAuth = - | DrupalClientAuthClientIdSecret - | DrupalClientAuthUsernamePassword - | DrupalClientAuthAccessToken - | (() => string) - | string - -export interface DrupalClientAuthUsernamePassword { - username: string - password: string -} - -export interface DrupalClientAuthClientIdSecret { - clientId: string - clientSecret: string - url?: string - scope?: string -} - -export type DrupalClientAuthAccessToken = AccessToken - -export interface Logger { - log(message): void - - debug(message): void - - warn(message): void - - error(message): void -} - -/** - * The baseUrl of your Drupal site. Do not add the /jsonapi suffix. - * - * **Required**: *yes* - * - * @example - * - * https://example.com - */ -export type BaseUrl = string - -export type Locale = string - -export type PathPrefix = string - -export type JsonApiOptions = { - deserialize?: boolean - params?: JsonApiParams -} - -export type JsonApiWithLocaleOptions = JsonApiOptions & - ( - | { - locale: Locale - defaultLocale: Locale - } - | { - locale?: undefined - defaultLocale?: never - } - ) - -export type JsonApiWithAuthOptions = { - withAuth?: boolean | DrupalClientAuth -} - -export type JsonApiWithCacheOptions = { - withCache?: boolean - cacheKey?: string -} - -// TODO: Properly type this. -/* eslint-disable @typescript-eslint/no-explicit-any */ -export type JsonApiParams = Record - -// https://jsonapi.org/format/#error-objects -export interface JsonApiError { - id?: string - status?: string - code?: string - title?: string - detail?: string - links?: JsonApiLinks -} - -// https://jsonapi.org/format/#document-links -export interface JsonApiLinks { - [key: string]: string | Record -} - -// TODO: any...ugh. -export interface JsonApiResponse extends Record { - jsonapi?: { - version: string - meta: Record[] - } - data: Record[] - errors: JsonApiError[] - meta: { - count: number - [key: string]: any - } - links?: JsonApiLinks - included?: Record[] -} - -export interface JsonApiResourceBodyRelationship { - data: { - type: string - id: string - } -} - -export interface JsonApiCreateResourceBody { - data: { - type?: string - attributes?: Record - relationships?: Record - } -} - -export interface JsonApiCreateFileResourceBody { - data: { - type?: string - attributes: { - type: string - field: string - filename: string - file: Buffer - } - } -} - -export interface JsonApiUpdateResourceBody { - data: { - type?: string - id?: string - attributes?: Record - relationships?: Record - } -} - -export interface JsonApiSearchApiResponse extends JsonApiResponse { - meta: JsonApiResponse["meta"] & { - facets?: DrupalSearchApiFacet[] - } -} - -export interface Serializer { - deserialize( - body: Record, - options?: Record - ): unknown -} - -export type Fetcher = WindowOrWorkerGlobalScope["fetch"] - -export interface DataCache { - get(key): Promise - - set(key, value, ttl?: number): Promise - - del?(keys): Promise -} - -export interface FetchOptions extends RequestInit { - withAuth?: boolean | DrupalClientAuth -} - -export interface DrupalSearchApiFacet { - id: string - label?: string - path?: string - terms?: { - url: string - values: { - value: string - label: string - active?: boolean - count?: number - } - }[] -} - -export interface DrupalTranslatedPath { - resolved: string - isHomePath: boolean - entity: { - canonical: string - type: string - bundle: string - id: string - uuid: string - langcode?: string - path?: string - } - label?: string - jsonapi?: { - individual: string - resourceName: string - pathPrefix: string - basePath: string - entryPoint: string - } - meta?: Record - redirect?: { - from: string - to: string - status: string - }[] -} - -export interface DrupalMenuLinkContent { - description: string - enabled: boolean - expanded: boolean - id: string - menu_name: string - meta: Record - options: Record - parent: string - provider: string - route: { - name: string - parameters: Record - } - title: string - type: string - url: string - weight: string - items?: DrupalMenuLinkContent[] -} - -export type AccessToken = { - token_type: string - expires_in: number - access_token: string - refresh_token?: string -} - -export type PathAlias = { - alias: string - pid: number - langcode: string -} - -/* eslint-disable @typescript-eslint/no-explicit-any */ -export interface JsonApiResource extends Record { - id: string - type: string - langcode: string - status: boolean -} - -export interface JsonApiResourceWithPath extends JsonApiResource { - path: PathAlias -} - -export type GetResourcePreviewUrlOptions = JsonApiWithLocaleOptions & { - isVersionable?: boolean -} - -export interface DrupalNode extends JsonApiResourceWithPath { - drupal_internal__nid: number - drupal_internal__vid: number - changed: string - created: string - title: string - default_langcode: boolean - sticky: boolean -} - -export interface DrupalParagraph extends JsonApiResource { - drupal_internal__id: number - drupal_internal__revision_id: number -} - -export interface DrupalBlock extends JsonApiResource { - info: string -} - -export interface DrupalMedia extends JsonApiResource { - drupal_internal__mid: string - drupal_internal__vid: string - changed: string - created: string - name: string -} - -export interface DrupalFile extends JsonApiResource { - drupal_internal__fid: string - changed: string - created: string - filename: string - uri: { - value: string - url: string - } - filesize: number - filemime: string - resourceIdObjMeta?: DrupalFileMeta -} - -export interface DrupalFileMeta { - alt?: string - title?: string - width: number - height: number -} - -export interface DrupalTaxonomyTerm extends JsonApiResourceWithPath { - drupal_internal__tid: string - changed: string - default_langcode: boolean - name: string - description: string - weight: number -} - -export interface DrupalUser extends JsonApiResourceWithPath { - drupal_internal__uid: string - changed: string - created: string - default_langcode: boolean - name: string -} - -/* eslint-disable @typescript-eslint/no-explicit-any */ -export interface DrupalView[]> { - id: string - results: T - meta: JsonApiResponse["meta"] - links: JsonApiResponse["links"] -} diff --git a/packages/next-drupal/src/types/client.ts b/packages/next-drupal/src/types/client.ts new file mode 100644 index 00000000..924caa53 --- /dev/null +++ b/packages/next-drupal/src/types/client.ts @@ -0,0 +1,197 @@ +export type DrupalClientOptions = { + /** + * Set the JSON:API prefix. + * + * * **Default value**: `/jsonapi` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#apiprefix) + */ + apiPrefix?: string + + /** + * Set debug to true to enable debug messages. + * + * * **Default value**: `false` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#debug) + */ + debug?: boolean + + /** + * Set the default frontPage. + * + * * **Default value**: `/home` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#frontpage) + */ + frontPage?: string + + /** + * Set custom headers for the fetcher. + * + * * **Default value**: { "Content-Type": "application/vnd.api+json", Accept: "application/vnd.api+json" } + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#headers) + */ + headers?: HeadersInit + + /** + * Override the default data serializer. You can use this to add your own JSON:API data deserializer. + * + * * **Default value**: `jsona` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#serializer) + */ + serializer?: Serializer + /** + * Override the default fetcher. Use this to add your own fetcher ex. axios. + * + * * **Default value**: `fetch` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#fetcher) + */ + fetcher?: Fetcher + + /** + * Override the default cache. + * + * * **Default value**: `node-cache` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#cache) + */ + cache?: DataCache + + /** + * If set to true, JSON:API errors are thrown in non-production environments. The errors are shown in the Next.js overlay. + * + * **Default value**: `true` + * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#throwjsonapierrors) + */ + throwJsonApiErrors?: boolean + + /** + * Override the default logger. You can use this to send logs to a third-party service. + * + * * **Default value**: `console` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#logger) + */ + logger?: Logger + + /** + * Override the default auth. You can use this to implement your own authentication mechanism. + * + * [Documentation](https://next-drupal.org/docs/client/configuration#auth) + */ + auth?: DrupalClientAuth + + /** + * Set whether the client should use authenticated requests by default. + * + * * **Default value**: `true` + * * **Required**: **No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#withauth) + */ + withAuth?: boolean + + /** + * By default, the client will make a request to JSON:API to retrieve the index. You can turn this off and use the default entry point from the resource name. + * + * * **Default value**: `false` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#auth) + */ + useDefaultResourceTypeEntry?: boolean + + /** + * The secret to use for preview mode. + * + * * **Default value**: `null` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#previewsecret) + */ + previewSecret?: string + + /** + * A long-lived access token you can set for the client. + * + * * **Default value**: `null` + * * **Required**: *No* + * + * [Documentation](https://next-drupal.org/docs/client/configuration#accesstoken) + */ + accessToken?: AccessToken + + /** + * The scope used for the current access token. + */ + accessTokenScope?: string +} + +export type DrupalClientAuth = + | DrupalClientAuthClientIdSecret + | DrupalClientAuthUsernamePassword + | DrupalClientAuthAccessToken + | (() => string) + | string + +export interface DrupalClientAuthUsernamePassword { + username: string + password: string +} + +export interface DrupalClientAuthClientIdSecret { + clientId: string + clientSecret: string + url?: string + scope?: string +} + +export type DrupalClientAuthAccessToken = AccessToken + +export type AccessToken = { + token_type: string + expires_in: number + access_token: string + refresh_token?: string +} + +export interface DataCache { + get(key): Promise + + set(key, value, ttl?: number): Promise + + del?(keys): Promise +} + +export type Fetcher = WindowOrWorkerGlobalScope["fetch"] + +export interface Logger { + log(message): void + + debug(message): void + + warn(message): void + + error(message): void +} + +export interface Serializer { + deserialize( + body: Record, + options?: Record + ): unknown +} diff --git a/packages/next-drupal/src/types/deprecated.ts b/packages/next-drupal/src/types/deprecated.ts new file mode 100644 index 00000000..e79c20c2 --- /dev/null +++ b/packages/next-drupal/src/types/deprecated.ts @@ -0,0 +1,3 @@ +import type { JsonApiOptions } from "./index" + +export type JsonApiWithLocaleOptions = Omit diff --git a/packages/next-drupal/src/types/drupal.ts b/packages/next-drupal/src/types/drupal.ts new file mode 100644 index 00000000..b2a77c93 --- /dev/null +++ b/packages/next-drupal/src/types/drupal.ts @@ -0,0 +1,154 @@ +import type { + JsonApiResource, + JsonApiResourceWithPath, + JsonApiResponse, +} from "./resource" + +export interface DrupalBlock extends JsonApiResource { + info: string +} + +export interface DrupalFile extends JsonApiResource { + drupal_internal__fid: string + changed: string + created: string + filename: string + uri: { + value: string + url: string + } + filesize: number + filemime: string + resourceIdObjMeta?: DrupalFileMeta +} + +export interface DrupalFileMeta { + alt?: string + title?: string + width: number + height: number +} + +export interface DrupalMedia extends JsonApiResource { + drupal_internal__mid: string + drupal_internal__vid: string + changed: string + created: string + name: string +} + +export interface DrupalMenuLinkContent { + description: string + enabled: boolean + expanded: boolean + id: string + menu_name: string + meta: Record + options: Record + parent: string + provider: string + route: { + name: string + parameters: Record + } + title: string + type: string + url: string + weight: string + items?: DrupalMenuLinkContent[] +} + +export interface DrupalNode extends JsonApiResourceWithPath { + drupal_internal__nid: number + drupal_internal__vid: number + changed: string + created: string + title: string + default_langcode: boolean + sticky: boolean +} + +export interface DrupalParagraph extends JsonApiResource { + drupal_internal__id: number + drupal_internal__revision_id: number +} + +export interface DrupalSearchApiJsonApiResponse extends JsonApiResponse { + meta: JsonApiResponse["meta"] & { + facets?: DrupalSearchApiFacet[] + } +} + +export interface DrupalSearchApiFacet { + id: string + label?: string + path?: string + terms?: { + url: string + values: { + value: string + label: string + active?: boolean + count?: number + } + }[] +} + +export interface DrupalTaxonomyTerm extends JsonApiResourceWithPath { + drupal_internal__tid: string + changed: string + default_langcode: boolean + name: string + description: string + weight: number +} + +export interface DrupalTranslatedPath { + resolved: string + isHomePath: boolean + entity: { + canonical: string + type: string + bundle: string + id: string + uuid: string + langcode?: string + path?: string + } + label?: string + jsonapi?: { + individual: string + resourceName: string + pathPrefix: string + basePath: string + entryPoint: string + } + meta?: Record + redirect?: { + from: string + to: string + status: string + }[] +} + +export interface DrupalUser extends JsonApiResourceWithPath { + drupal_internal__uid: string + changed: string + created: string + default_langcode: boolean + name: string +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export interface DrupalView[]> { + id: string + results: T + meta: JsonApiResponse["meta"] + links: JsonApiResponse["links"] +} + +export type PathAlias = { + alias: string + pid: number + langcode: string +} diff --git a/packages/next-drupal/src/types/index.ts b/packages/next-drupal/src/types/index.ts new file mode 100644 index 00000000..f8194aaf --- /dev/null +++ b/packages/next-drupal/src/types/index.ts @@ -0,0 +1,4 @@ +export type * from "./client" +export type * from "./drupal" +export type * from "./options" +export type * from "./resource" diff --git a/packages/next-drupal/src/types/options.ts b/packages/next-drupal/src/types/options.ts new file mode 100644 index 00000000..c03e0d72 --- /dev/null +++ b/packages/next-drupal/src/types/options.ts @@ -0,0 +1,39 @@ +import type { DrupalClientAuth } from "./client" + +export type BaseUrl = string + +export type Locale = string + +export type PathPrefix = string + +export interface FetchOptions extends RequestInit { + withAuth?: boolean | DrupalClientAuth +} + +export type JsonApiOptions = { + deserialize?: boolean + params?: JsonApiParams +} & JsonApiWithAuthOption & + ( + | { + locale: Locale + defaultLocale: Locale + } + | { + locale?: undefined + defaultLocale?: never + } + ) + +export type JsonApiWithAuthOption = { + withAuth?: boolean | DrupalClientAuth +} + +export type JsonApiWithCacheOptions = { + withCache?: boolean + cacheKey?: string +} + +// TODO: Properly type this. +/* eslint-disable @typescript-eslint/no-explicit-any */ +export type JsonApiParams = Record diff --git a/packages/next-drupal/src/types/resource.ts b/packages/next-drupal/src/types/resource.ts new file mode 100644 index 00000000..99e5f28b --- /dev/null +++ b/packages/next-drupal/src/types/resource.ts @@ -0,0 +1,67 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import type { JsonApiError, JsonApiLinks } from "../jsonapi-errors" +import type { PathAlias } from "./drupal" + +// TODO: any...ugh. +export interface JsonApiResponse extends Record { + jsonapi?: { + version: string + meta: Record[] + } + data: Record[] + errors: JsonApiError[] + meta: { + count: number + [key: string]: any + } + links?: JsonApiLinks + included?: Record[] +} + +export interface JsonApiResourceBodyRelationship { + data: { + type: string + id: string + } +} + +export interface JsonApiCreateResourceBody { + data: { + type?: string + attributes?: Record + relationships?: Record + } +} + +export interface JsonApiCreateFileResourceBody { + data: { + type?: string + attributes: { + type: string + field: string + filename: string + file: Buffer + } + } +} + +export interface JsonApiUpdateResourceBody { + data: { + type?: string + id?: string + attributes?: Record + relationships?: Record + } +} + +export interface JsonApiResource extends Record { + id: string + type: string + langcode: string + status: boolean +} + +export interface JsonApiResourceWithPath extends JsonApiResource { + path: PathAlias +} diff --git a/packages/next-drupal/tests/.eslintrc.json b/packages/next-drupal/tests/.eslintrc.json new file mode 100644 index 00000000..6da4ba50 --- /dev/null +++ b/packages/next-drupal/tests/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "extends": ["../../../.eslintrc.json"], + "overrides": [ + { + "files": ["*.test.ts"], + "rules": { + "@typescript-eslint/ban-ts-comment": "off" + } + } + ] +} diff --git a/packages/next-drupal/tests/DrupalClient/__snapshots__/basic-methods.test.ts.snap b/packages/next-drupal/tests/DrupalClient/__snapshots__/basic-methods.test.ts.snap new file mode 100644 index 00000000..c1cac65e --- /dev/null +++ b/packages/next-drupal/tests/DrupalClient/__snapshots__/basic-methods.test.ts.snap @@ -0,0 +1,406 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`deserialize() allows for custom data serializer 1`] = ` +{ + "id": "52837ad0-f218-46bd-a106-5710336b7053", + "title": "TITLE: Give it a go and grow your own herbs", +} +`; + +exports[`deserialize() deserializes JSON:API collection 1`] = ` +[ + { + "id": "52837ad0-f218-46bd-a106-5710336b7053", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", + }, + }, + "title": "Give it a go and grow your own herbs", + "type": "node--article", + }, + { + "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", + }, + }, + "title": "Dairy-free and delicious milk chocolate", + "type": "node--article", + }, + { + "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", + }, + }, + "title": "The real deal for supermarket savvy shopping", + "type": "node--article", + }, + { + "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", + }, + }, + "title": "The Umami guide to our favorite mushrooms", + "type": "node--article", + }, + { + "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", + }, + }, + "title": "Let's hear it for carrots", + "type": "node--article", + }, + { + "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", + }, + }, + "title": "Baking mishaps - our troubleshooting tips", + "type": "node--article", + }, + { + "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", + }, + }, + "title": "Skip the spirits with delicious mocktails", + "type": "node--article", + }, + { + "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", + }, + }, + "title": "Give your oatmeal the ultimate makeover", + "type": "node--article", + }, +] +`; + +exports[`deserialize() deserializes JSON:API resource 1`] = ` +{ + "body": { + "format": "basic_html", + "processed": "

There's nothing like having your own supply of fresh herbs, readily available and close at hand to use while cooking. Whether you have a large garden or a small kitchen window sill, there's always enough room for something home grown.

+

Outdoors

+

Mint

+

Mint is a great plant to grow as it's hardy and can grow in almost any soil. Mint can grow wild, so keep it contained in a pot or it might spread and take over your whole garden.

+

Sage

+

Like mint, sage is another prolific growing plant and will take over your garden if you let it. Highly aromatic, the sage plant can be planted in a pot or flower bed in well drained soil. The best way to store the herb is to sun dry the leaves and store in a cool, dark cupboard in a sealed container.

+

Rosemary

+

Rosemary plants grow into lovely shrubs. Easily grown from cuttings, rosemary plants do not like freezing temperatures so keep pots or planted bushes near the home to shelter them from the cold. It grows well in pots as it likes dry soil, but can survive well in the ground too. If pruning rosemary to encourage it into a better shape, save the branches and hang them upside down to preserve the flavor and use in food.

+

Indoors

+

Basil

+

Perfect in sunny spot on a kitchen window sill. Basil is an annual plant, so will die off in the autumn, so it's a good idea to harvest it in the summer if you have an abundance and dry it. Picked basil stays fresh longer if it is placed in water (like fresh flowers). A great way to store basil is to make it into pesto!

+

Chives

+

A versatile herb, chives can grow well indoors. Ensure the plant is watered well, and gets plenty of light. Remember to regularly trim the chives. This prevents the flowers from developing and encourages new growth.

+

Coriander (Cilantro)

+

Coriander can grow indoors, but unlike the other herbs, it doesn't like full sun. If you have a south facing kitchen window, this isn't the place for it. Although not as thirsty as basil, coriander doesn't like dry soil so don't forget to water it! Cut coriander is best stored in the fridge.

+", + "summary": null, + "value": "

There's nothing like having your own supply of fresh herbs, readily available and close at hand to use while cooking. Whether you have a large garden or a small kitchen window sill, there's always enough room for something home grown.

+

Outdoors

+

Mint

+

Mint is a great plant to grow as it's hardy and can grow in almost any soil. Mint can grow wild, so keep it contained in a pot or it might spread and take over your whole garden.

+

Sage

+

Like mint, sage is another prolific growing plant and will take over your garden if you let it. Highly aromatic, the sage plant can be planted in a pot or flower bed in well drained soil. The best way to store the herb is to sun dry the leaves and store in a cool, dark cupboard in a sealed container.

+

Rosemary

+

Rosemary plants grow into lovely shrubs. Easily grown from cuttings, rosemary plants do not like freezing temperatures so keep pots or planted bushes near the home to shelter them from the cold. It grows well in pots as it likes dry soil, but can survive well in the ground too. If pruning rosemary to encourage it into a better shape, save the branches and hang them upside down to preserve the flavor and use in food.

+

Indoors

+

Basil

+

Perfect in sunny spot on a kitchen window sill. Basil is an annual plant, so will die off in the autumn, so it's a good idea to harvest it in the summer if you have an abundance and dry it. Picked basil stays fresh longer if it is placed in water (like fresh flowers). A great way to store basil is to make it into pesto!

+

Chives

+

A versatile herb, chives can grow well indoors. Ensure the plant is watered well, and gets plenty of light. Remember to regularly trim the chives. This prevents the flowers from developing and encourages new growth.

+

Coriander (Cilantro)

+

Coriander can grow indoors, but unlike the other herbs, it doesn't like full sun. If you have a south facing kitchen window, this isn't the place for it. Although not as thirsty as basil, coriander doesn't like dry soil so don't forget to water it! Cut coriander is best stored in the fridge.

+", + }, + "changed": "2022-03-21T10:52:42+00:00", + "content_translation_outdated": false, + "content_translation_source": "und", + "created": "2022-03-21T10:52:42+00:00", + "default_langcode": true, + "drupal_internal__nid": 10, + "drupal_internal__vid": 20, + "field_media_image": { + "id": "e5091a16-134e-400d-8393-cfe4eccbcaa2", + "resourceIdObjMeta": { + "drupal_internal__target_id": 10, + }, + "type": "media--image", + }, + "field_tags": [ + { + "changed": "2022-03-21T10:52:42+00:00", + "content_translation_created": "2022-03-21T10:52:42+00:00", + "content_translation_outdated": false, + "content_translation_source": "und", + "content_translation_uid": { + "id": "256a133b-0bd7-4426-a823-b8ce81e0d778", + "resourceIdObjMeta": { + "drupal_internal__target_id": 0, + }, + "type": "user--user", + }, + "default_langcode": true, + "description": null, + "drupal_internal__revision_id": 14, + "drupal_internal__tid": 14, + "id": "dcd81647-71b7-48cb-b555-e20322bcb7a7", + "langcode": "en", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_term/tags/dcd81647-71b7-48cb-b555-e20322bcb7a7?resourceVersion=id%3A14", + }, + }, + "name": "Grow your own", + "parent": [ + { + "id": "virtual", + "resourceIdObjMeta": { + "links": { + "help": { + "href": "https://www.drupal.org/docs/8/modules/json-api/core-concepts#virtual", + "meta": { + "about": "Usage and meaning of the 'virtual' resource identifier.", + }, + }, + }, + }, + "type": "taxonomy_term--tags", + }, + ], + "path": { + "alias": "/tags/grow-your-own", + "langcode": "en", + "pid": 27, + }, + "relationshipNames": [ + "vid", + "revision_user", + "parent", + "content_translation_uid", + ], + "resourceIdObjMeta": { + "drupal_internal__target_id": 14, + }, + "revision_created": "2022-03-21T10:52:42+00:00", + "revision_log_message": null, + "revision_translation_affected": true, + "revision_user": null, + "status": true, + "type": "taxonomy_term--tags", + "vid": { + "id": "b0442737-e5ff-4c7c-8c2b-c977886d6e73", + "resourceIdObjMeta": { + "drupal_internal__target_id": "tags", + }, + "type": "taxonomy_vocabulary--taxonomy_vocabulary", + }, + "weight": 0, + }, + { + "changed": "2022-03-21T10:52:42+00:00", + "content_translation_created": "2022-03-21T10:52:42+00:00", + "content_translation_outdated": false, + "content_translation_source": "und", + "content_translation_uid": { + "id": "256a133b-0bd7-4426-a823-b8ce81e0d778", + "resourceIdObjMeta": { + "drupal_internal__target_id": 0, + }, + "type": "user--user", + }, + "default_langcode": true, + "description": null, + "drupal_internal__revision_id": 23, + "drupal_internal__tid": 23, + "id": "60d20a4c-9d42-4b25-b717-3af3cba6abe8", + "langcode": "en", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_term/tags/60d20a4c-9d42-4b25-b717-3af3cba6abe8?resourceVersion=id%3A23", + }, + }, + "name": "Seasonal", + "parent": [ + { + "id": "virtual", + "resourceIdObjMeta": { + "links": { + "help": { + "href": "https://www.drupal.org/docs/8/modules/json-api/core-concepts#virtual", + "meta": { + "about": "Usage and meaning of the 'virtual' resource identifier.", + }, + }, + }, + }, + "type": "taxonomy_term--tags", + }, + ], + "path": { + "alias": "/tags/seasonal", + "langcode": "en", + "pid": 45, + }, + "relationshipNames": [ + "vid", + "revision_user", + "parent", + "content_translation_uid", + ], + "resourceIdObjMeta": { + "drupal_internal__target_id": 23, + }, + "revision_created": "2022-03-21T10:52:42+00:00", + "revision_log_message": null, + "revision_translation_affected": true, + "revision_user": null, + "status": true, + "type": "taxonomy_term--tags", + "vid": { + "id": "b0442737-e5ff-4c7c-8c2b-c977886d6e73", + "resourceIdObjMeta": { + "drupal_internal__target_id": "tags", + }, + "type": "taxonomy_vocabulary--taxonomy_vocabulary", + }, + "weight": 0, + }, + { + "changed": "2022-03-21T10:52:42+00:00", + "content_translation_created": "2022-03-21T10:52:42+00:00", + "content_translation_outdated": false, + "content_translation_source": "und", + "content_translation_uid": { + "id": "256a133b-0bd7-4426-a823-b8ce81e0d778", + "resourceIdObjMeta": { + "drupal_internal__target_id": 0, + }, + "type": "user--user", + }, + "default_langcode": true, + "description": null, + "drupal_internal__revision_id": 16, + "drupal_internal__tid": 16, + "id": "57a1d9f6-23a6-4215-a8a9-582202cd938d", + "langcode": "en", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_term/tags/57a1d9f6-23a6-4215-a8a9-582202cd938d?resourceVersion=id%3A16", + }, + }, + "name": "Herbs", + "parent": [ + { + "id": "virtual", + "resourceIdObjMeta": { + "links": { + "help": { + "href": "https://www.drupal.org/docs/8/modules/json-api/core-concepts#virtual", + "meta": { + "about": "Usage and meaning of the 'virtual' resource identifier.", + }, + }, + }, + }, + "type": "taxonomy_term--tags", + }, + ], + "path": { + "alias": "/tags/herbs", + "langcode": "en", + "pid": 31, + }, + "relationshipNames": [ + "vid", + "revision_user", + "parent", + "content_translation_uid", + ], + "resourceIdObjMeta": { + "drupal_internal__target_id": 16, + }, + "revision_created": "2022-03-21T10:52:42+00:00", + "revision_log_message": null, + "revision_translation_affected": true, + "revision_user": null, + "status": true, + "type": "taxonomy_term--tags", + "vid": { + "id": "b0442737-e5ff-4c7c-8c2b-c977886d6e73", + "resourceIdObjMeta": { + "drupal_internal__target_id": "tags", + }, + "type": "taxonomy_vocabulary--taxonomy_vocabulary", + }, + "weight": 0, + }, + ], + "id": "52837ad0-f218-46bd-a106-5710336b7053", + "langcode": "en", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", + }, + }, + "moderation_state": "published", + "node_type": { + "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", + "resourceIdObjMeta": { + "drupal_internal__target_id": "article", + }, + "type": "node_type--node_type", + }, + "path": { + "alias": "/articles/give-it-a-go-and-grow-your-own-herbs", + "langcode": "en", + "pid": 85, + }, + "promote": true, + "relationshipNames": [ + "node_type", + "revision_uid", + "uid", + "field_media_image", + "field_tags", + ], + "revision_log": null, + "revision_timestamp": "2022-03-21T10:52:42+00:00", + "revision_translation_affected": null, + "revision_uid": { + "id": "dd9c916d-4d66-4bff-a851-eeba0cf7673a", + "resourceIdObjMeta": { + "drupal_internal__target_id": 5, + }, + "type": "user--user", + }, + "status": true, + "sticky": false, + "title": "Give it a go and grow your own herbs", + "type": "node--article", + "uid": { + "id": "dd9c916d-4d66-4bff-a851-eeba0cf7673a", + "resourceIdObjMeta": { + "drupal_internal__target_id": 5, + }, + "type": "user--user", + }, +} +`; diff --git a/packages/next-drupal/tests/__snapshots__/client.test.ts.snap b/packages/next-drupal/tests/DrupalClient/__snapshots__/fetch-related-methods.test.ts.snap similarity index 66% rename from packages/next-drupal/tests/__snapshots__/client.test.ts.snap rename to packages/next-drupal/tests/DrupalClient/__snapshots__/fetch-related-methods.test.ts.snap index 31b9e41f..120346a7 100644 --- a/packages/next-drupal/tests/__snapshots__/client.test.ts.snap +++ b/packages/next-drupal/tests/DrupalClient/__snapshots__/fetch-related-methods.test.ts.snap @@ -1,600 +1,10 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`buildStaticPathsFromResources it builds static paths from resources 1`] = ` -Array [ - Object { - "params": Object { - "slug": Array [ - "blog", - "post", - "one", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "blog", - "post", - "two", - ], - }, - }, -] -`; - -exports[`buildStaticPathsFromResources it builds static paths from resources 2`] = ` -Array [ - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "blog", - "post", - "one", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "blog", - "post", - "two", - ], - }, - }, -] -`; - -exports[`buildStaticPathsFromResources it builds static paths from resources with pathPrefix 1`] = ` -Array [ - Object { - "params": Object { - "slug": Array [ - "post", - "one", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "post", - "two", - ], - }, - }, -] -`; - -exports[`buildStaticPathsFromResources it builds static paths from resources with pathPrefix 2`] = ` -Array [ - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "one", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "two", - ], - }, - }, -] -`; - -exports[`buildStaticPathsParamsFromPaths it builds static paths from paths 1`] = ` -Array [ - Object { - "params": Object { - "slug": Array [ - "blog", - "post", - "one", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "blog", - "post", - "two", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "blog", - "post", - "three", - ], - }, - }, -] -`; - -exports[`buildStaticPathsParamsFromPaths it builds static paths from paths 2`] = ` -Array [ - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "blog", - "post", - "one", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "blog", - "post", - "two", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "blog", - "post", - "three", - ], - }, - }, -] -`; - -exports[`buildStaticPathsParamsFromPaths it builds static paths from paths with pathPrefix 1`] = ` -Array [ - Object { - "params": Object { - "slug": Array [ - "post", - "one", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "post", - "two", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "post", - ], - }, - }, -] -`; - -exports[`deserialize it allows for custom data serializer 1`] = ` -Object { - "id": "52837ad0-f218-46bd-a106-5710336b7053", - "title": "TITLE: Give it a go and grow your own herbs", -} -`; - -exports[`deserialize it deserializes JSON:API collection 1`] = ` -Array [ - Object { - "id": "52837ad0-f218-46bd-a106-5710336b7053", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", - }, - }, - "title": "Give it a go and grow your own herbs", - "type": "node--article", - }, - Object { - "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", - }, - }, - "title": "Dairy-free and delicious milk chocolate", - "type": "node--article", - }, - Object { - "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", - }, - }, - "title": "The real deal for supermarket savvy shopping", - "type": "node--article", - }, - Object { - "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", - }, - }, - "title": "The Umami guide to our favorite mushrooms", - "type": "node--article", - }, - Object { - "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", - }, - }, - "title": "Let's hear it for carrots", - "type": "node--article", - }, - Object { - "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", - }, - }, - "title": "Baking mishaps - our troubleshooting tips", - "type": "node--article", - }, - Object { - "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", - }, - }, - "title": "Skip the spirits with delicious mocktails", - "type": "node--article", - }, - Object { - "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", - }, - }, - "title": "Give your oatmeal the ultimate makeover", - "type": "node--article", - }, -] -`; - -exports[`deserialize it deserializes JSON:API resource 1`] = ` -Object { - "body": Object { - "format": "basic_html", - "processed": "

There's nothing like having your own supply of fresh herbs, readily available and close at hand to use while cooking. Whether you have a large garden or a small kitchen window sill, there's always enough room for something home grown.

-

Outdoors

-

Mint

-

Mint is a great plant to grow as it's hardy and can grow in almost any soil. Mint can grow wild, so keep it contained in a pot or it might spread and take over your whole garden.

-

Sage

-

Like mint, sage is another prolific growing plant and will take over your garden if you let it. Highly aromatic, the sage plant can be planted in a pot or flower bed in well drained soil. The best way to store the herb is to sun dry the leaves and store in a cool, dark cupboard in a sealed container.

-

Rosemary

-

Rosemary plants grow into lovely shrubs. Easily grown from cuttings, rosemary plants do not like freezing temperatures so keep pots or planted bushes near the home to shelter them from the cold. It grows well in pots as it likes dry soil, but can survive well in the ground too. If pruning rosemary to encourage it into a better shape, save the branches and hang them upside down to preserve the flavor and use in food.

-

Indoors

-

Basil

-

Perfect in sunny spot on a kitchen window sill. Basil is an annual plant, so will die off in the autumn, so it's a good idea to harvest it in the summer if you have an abundance and dry it. Picked basil stays fresh longer if it is placed in water (like fresh flowers). A great way to store basil is to make it into pesto!

-

Chives

-

A versatile herb, chives can grow well indoors. Ensure the plant is watered well, and gets plenty of light. Remember to regularly trim the chives. This prevents the flowers from developing and encourages new growth.

-

Coriander (Cilantro)

-

Coriander can grow indoors, but unlike the other herbs, it doesn't like full sun. If you have a south facing kitchen window, this isn't the place for it. Although not as thirsty as basil, coriander doesn't like dry soil so don't forget to water it! Cut coriander is best stored in the fridge.

-", - "summary": null, - "value": "

There's nothing like having your own supply of fresh herbs, readily available and close at hand to use while cooking. Whether you have a large garden or a small kitchen window sill, there's always enough room for something home grown.

-

Outdoors

-

Mint

-

Mint is a great plant to grow as it's hardy and can grow in almost any soil. Mint can grow wild, so keep it contained in a pot or it might spread and take over your whole garden.

-

Sage

-

Like mint, sage is another prolific growing plant and will take over your garden if you let it. Highly aromatic, the sage plant can be planted in a pot or flower bed in well drained soil. The best way to store the herb is to sun dry the leaves and store in a cool, dark cupboard in a sealed container.

-

Rosemary

-

Rosemary plants grow into lovely shrubs. Easily grown from cuttings, rosemary plants do not like freezing temperatures so keep pots or planted bushes near the home to shelter them from the cold. It grows well in pots as it likes dry soil, but can survive well in the ground too. If pruning rosemary to encourage it into a better shape, save the branches and hang them upside down to preserve the flavor and use in food.

-

Indoors

-

Basil

-

Perfect in sunny spot on a kitchen window sill. Basil is an annual plant, so will die off in the autumn, so it's a good idea to harvest it in the summer if you have an abundance and dry it. Picked basil stays fresh longer if it is placed in water (like fresh flowers). A great way to store basil is to make it into pesto!

-

Chives

-

A versatile herb, chives can grow well indoors. Ensure the plant is watered well, and gets plenty of light. Remember to regularly trim the chives. This prevents the flowers from developing and encourages new growth.

-

Coriander (Cilantro)

-

Coriander can grow indoors, but unlike the other herbs, it doesn't like full sun. If you have a south facing kitchen window, this isn't the place for it. Although not as thirsty as basil, coriander doesn't like dry soil so don't forget to water it! Cut coriander is best stored in the fridge.

-", - }, - "changed": "2022-03-21T10:52:42+00:00", - "content_translation_outdated": false, - "content_translation_source": "und", - "created": "2022-03-21T10:52:42+00:00", - "default_langcode": true, - "drupal_internal__nid": 10, - "drupal_internal__vid": 20, - "field_media_image": Object { - "id": "e5091a16-134e-400d-8393-cfe4eccbcaa2", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 10, - }, - "type": "media--image", - }, - "field_tags": Array [ - Object { - "changed": "2022-03-21T10:52:42+00:00", - "content_translation_created": "2022-03-21T10:52:42+00:00", - "content_translation_outdated": false, - "content_translation_source": "und", - "content_translation_uid": Object { - "id": "256a133b-0bd7-4426-a823-b8ce81e0d778", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 0, - }, - "type": "user--user", - }, - "default_langcode": true, - "description": null, - "drupal_internal__revision_id": 14, - "drupal_internal__tid": 14, - "id": "dcd81647-71b7-48cb-b555-e20322bcb7a7", - "langcode": "en", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_term/tags/dcd81647-71b7-48cb-b555-e20322bcb7a7?resourceVersion=id%3A14", - }, - }, - "name": "Grow your own", - "parent": Array [ - Object { - "id": "virtual", - "resourceIdObjMeta": Object { - "links": Object { - "help": Object { - "href": "https://www.drupal.org/docs/8/modules/json-api/core-concepts#virtual", - "meta": Object { - "about": "Usage and meaning of the 'virtual' resource identifier.", - }, - }, - }, - }, - "type": "taxonomy_term--tags", - }, - ], - "path": Object { - "alias": "/tags/grow-your-own", - "langcode": "en", - "pid": 27, - }, - "relationshipNames": Array [ - "vid", - "revision_user", - "parent", - "content_translation_uid", - ], - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 14, - }, - "revision_created": "2022-03-21T10:52:42+00:00", - "revision_log_message": null, - "revision_translation_affected": true, - "revision_user": null, - "status": true, - "type": "taxonomy_term--tags", - "vid": Object { - "id": "b0442737-e5ff-4c7c-8c2b-c977886d6e73", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": "tags", - }, - "type": "taxonomy_vocabulary--taxonomy_vocabulary", - }, - "weight": 0, - }, - Object { - "changed": "2022-03-21T10:52:42+00:00", - "content_translation_created": "2022-03-21T10:52:42+00:00", - "content_translation_outdated": false, - "content_translation_source": "und", - "content_translation_uid": Object { - "id": "256a133b-0bd7-4426-a823-b8ce81e0d778", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 0, - }, - "type": "user--user", - }, - "default_langcode": true, - "description": null, - "drupal_internal__revision_id": 23, - "drupal_internal__tid": 23, - "id": "60d20a4c-9d42-4b25-b717-3af3cba6abe8", - "langcode": "en", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_term/tags/60d20a4c-9d42-4b25-b717-3af3cba6abe8?resourceVersion=id%3A23", - }, - }, - "name": "Seasonal", - "parent": Array [ - Object { - "id": "virtual", - "resourceIdObjMeta": Object { - "links": Object { - "help": Object { - "href": "https://www.drupal.org/docs/8/modules/json-api/core-concepts#virtual", - "meta": Object { - "about": "Usage and meaning of the 'virtual' resource identifier.", - }, - }, - }, - }, - "type": "taxonomy_term--tags", - }, - ], - "path": Object { - "alias": "/tags/seasonal", - "langcode": "en", - "pid": 45, - }, - "relationshipNames": Array [ - "vid", - "revision_user", - "parent", - "content_translation_uid", - ], - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 23, - }, - "revision_created": "2022-03-21T10:52:42+00:00", - "revision_log_message": null, - "revision_translation_affected": true, - "revision_user": null, - "status": true, - "type": "taxonomy_term--tags", - "vid": Object { - "id": "b0442737-e5ff-4c7c-8c2b-c977886d6e73", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": "tags", - }, - "type": "taxonomy_vocabulary--taxonomy_vocabulary", - }, - "weight": 0, - }, - Object { - "changed": "2022-03-21T10:52:42+00:00", - "content_translation_created": "2022-03-21T10:52:42+00:00", - "content_translation_outdated": false, - "content_translation_source": "und", - "content_translation_uid": Object { - "id": "256a133b-0bd7-4426-a823-b8ce81e0d778", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 0, - }, - "type": "user--user", - }, - "default_langcode": true, - "description": null, - "drupal_internal__revision_id": 16, - "drupal_internal__tid": 16, - "id": "57a1d9f6-23a6-4215-a8a9-582202cd938d", - "langcode": "en", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_term/tags/57a1d9f6-23a6-4215-a8a9-582202cd938d?resourceVersion=id%3A16", - }, - }, - "name": "Herbs", - "parent": Array [ - Object { - "id": "virtual", - "resourceIdObjMeta": Object { - "links": Object { - "help": Object { - "href": "https://www.drupal.org/docs/8/modules/json-api/core-concepts#virtual", - "meta": Object { - "about": "Usage and meaning of the 'virtual' resource identifier.", - }, - }, - }, - }, - "type": "taxonomy_term--tags", - }, - ], - "path": Object { - "alias": "/tags/herbs", - "langcode": "en", - "pid": 31, - }, - "relationshipNames": Array [ - "vid", - "revision_user", - "parent", - "content_translation_uid", - ], - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 16, - }, - "revision_created": "2022-03-21T10:52:42+00:00", - "revision_log_message": null, - "revision_translation_affected": true, - "revision_user": null, - "status": true, - "type": "taxonomy_term--tags", - "vid": Object { - "id": "b0442737-e5ff-4c7c-8c2b-c977886d6e73", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": "tags", - }, - "type": "taxonomy_vocabulary--taxonomy_vocabulary", - }, - "weight": 0, - }, - ], - "id": "52837ad0-f218-46bd-a106-5710336b7053", - "langcode": "en", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", - }, - }, - "moderation_state": "published", - "node_type": Object { - "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": "article", - }, - "type": "node_type--node_type", - }, - "path": Object { - "alias": "/articles/give-it-a-go-and-grow-your-own-herbs", - "langcode": "en", - "pid": 85, - }, - "promote": true, - "relationshipNames": Array [ - "node_type", - "revision_uid", - "uid", - "field_media_image", - "field_tags", - ], - "revision_log": null, - "revision_timestamp": "2022-03-21T10:52:42+00:00", - "revision_translation_affected": null, - "revision_uid": Object { - "id": "dd9c916d-4d66-4bff-a851-eeba0cf7673a", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 5, - }, - "type": "user--user", - }, - "status": true, - "sticky": false, - "title": "Give it a go and grow your own herbs", - "type": "node--article", - "uid": Object { - "id": "dd9c916d-4d66-4bff-a851-eeba0cf7673a", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 5, - }, - "type": "user--user", - }, -} -`; - -exports[`fetch it allows fetching custom url 1`] = ` -Object { - "data": Object { - "attributes": Object { - "body": Object { +exports[`fetch() allows fetching custom url 1`] = ` +{ + "data": { + "attributes": { + "body": { "format": "basic_html", "processed": "

There's nothing like having your own supply of fresh herbs, readily available and close at hand to use while cooking. Whether you have a large garden or a small kitchen window sill, there's always enough room for something home grown.

Outdoors

@@ -639,7 +49,7 @@ Object { "drupal_internal__vid": 20, "langcode": "en", "moderation_state": "published", - "path": Object { + "path": { "alias": "/articles/give-it-a-go-and-grow-your-own-herbs", "langcode": "en", "pid": 85, @@ -653,109 +63,109 @@ Object { "title": "Give it a go and grow your own herbs", }, "id": "52837ad0-f218-46bd-a106-5710336b7053", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", }, }, - "relationships": Object { - "field_media_image": Object { - "data": Object { + "relationships": { + "field_media_image": { + "data": { "id": "e5091a16-134e-400d-8393-cfe4eccbcaa2", - "meta": Object { + "meta": { "drupal_internal__target_id": 10, }, "type": "media--image", }, - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/field_media_image?resourceVersion=id%3A20", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/relationships/field_media_image?resourceVersion=id%3A20", }, }, }, - "field_tags": Object { - "data": Array [ - Object { + "field_tags": { + "data": [ + { "id": "dcd81647-71b7-48cb-b555-e20322bcb7a7", - "meta": Object { + "meta": { "drupal_internal__target_id": 14, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "60d20a4c-9d42-4b25-b717-3af3cba6abe8", - "meta": Object { + "meta": { "drupal_internal__target_id": 23, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "57a1d9f6-23a6-4215-a8a9-582202cd938d", - "meta": Object { + "meta": { "drupal_internal__target_id": 16, }, "type": "taxonomy_term--tags", }, ], - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/field_tags?resourceVersion=id%3A20", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/relationships/field_tags?resourceVersion=id%3A20", }, }, }, - "node_type": Object { - "data": Object { + "node_type": { + "data": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "meta": Object { + "meta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/node_type?resourceVersion=id%3A20", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/relationships/node_type?resourceVersion=id%3A20", }, }, }, - "revision_uid": Object { - "data": Object { + "revision_uid": { + "data": { "id": "dd9c916d-4d66-4bff-a851-eeba0cf7673a", - "meta": Object { + "meta": { "drupal_internal__target_id": 5, }, "type": "user--user", }, - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/revision_uid?resourceVersion=id%3A20", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/relationships/revision_uid?resourceVersion=id%3A20", }, }, }, - "uid": Object { - "data": Object { + "uid": { + "data": { "id": "dd9c916d-4d66-4bff-a851-eeba0cf7673a", - "meta": Object { + "meta": { "drupal_internal__target_id": 5, }, "type": "user--user", }, - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/uid?resourceVersion=id%3A20", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053/relationships/uid?resourceVersion=id%3A20", }, }, @@ -763,504 +173,504 @@ Object { }, "type": "node--article", }, - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053", }, }, } `; -exports[`getIndex it fetches the JSON:API index 1`] = ` -Object { - "data": Array [], - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { +exports[`getIndex() fetches the JSON:API index 1`] = ` +{ + "data": [], + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "action--action": Object { + "links": { + "action--action": { "href": "https://tests.next-drupal.org/en/jsonapi/action/action", }, - "base_field_override--base_field_override": Object { + "base_field_override--base_field_override": { "href": "https://tests.next-drupal.org/en/jsonapi/base_field_override/base_field_override", }, - "block--block": Object { + "block--block": { "href": "https://tests.next-drupal.org/en/jsonapi/block/block", }, - "block_content--banner_block": Object { + "block_content--banner_block": { "href": "https://tests.next-drupal.org/en/jsonapi/block_content/banner_block", }, - "block_content--basic": Object { + "block_content--basic": { "href": "https://tests.next-drupal.org/en/jsonapi/block_content/basic", }, - "block_content--disclaimer_block": Object { + "block_content--disclaimer_block": { "href": "https://tests.next-drupal.org/en/jsonapi/block_content/disclaimer_block", }, - "block_content--footer_promo_block": Object { + "block_content--footer_promo_block": { "href": "https://tests.next-drupal.org/en/jsonapi/block_content/footer_promo_block", }, - "block_content_type--block_content_type": Object { + "block_content_type--block_content_type": { "href": "https://tests.next-drupal.org/en/jsonapi/block_content_type/block_content_type", }, - "configurable_language--configurable_language": Object { + "configurable_language--configurable_language": { "href": "https://tests.next-drupal.org/en/jsonapi/configurable_language/configurable_language", }, - "consumer--consumer": Object { + "consumer--consumer": { "href": "https://tests.next-drupal.org/en/jsonapi/consumer/consumer", }, - "contact_form--contact_form": Object { + "contact_form--contact_form": { "href": "https://tests.next-drupal.org/en/jsonapi/contact_form/contact_form", }, - "contact_message--feedback": Object { + "contact_message--feedback": { "href": "https://tests.next-drupal.org/en/jsonapi/contact_message/feedback", }, - "contact_message--personal": Object { + "contact_message--personal": { "href": "https://tests.next-drupal.org/en/jsonapi/contact_message/personal", }, - "date_format--date_format": Object { + "date_format--date_format": { "href": "https://tests.next-drupal.org/en/jsonapi/date_format/date_format", }, - "editor--editor": Object { + "editor--editor": { "href": "https://tests.next-drupal.org/en/jsonapi/editor/editor", }, - "entity_form_display--entity_form_display": Object { + "entity_form_display--entity_form_display": { "href": "https://tests.next-drupal.org/en/jsonapi/entity_form_display/entity_form_display", }, - "entity_form_mode--entity_form_mode": Object { + "entity_form_mode--entity_form_mode": { "href": "https://tests.next-drupal.org/en/jsonapi/entity_form_mode/entity_form_mode", }, - "entity_view_display--entity_view_display": Object { + "entity_view_display--entity_view_display": { "href": "https://tests.next-drupal.org/en/jsonapi/entity_view_display/entity_view_display", }, - "entity_view_mode--entity_view_mode": Object { + "entity_view_mode--entity_view_mode": { "href": "https://tests.next-drupal.org/en/jsonapi/entity_view_mode/entity_view_mode", }, - "facets_facet--facets_facet": Object { + "facets_facet--facets_facet": { "href": "https://tests.next-drupal.org/en/jsonapi/facets_facet/facets_facet", }, - "facets_facet_source--facets_facet_source": Object { + "facets_facet_source--facets_facet_source": { "href": "https://tests.next-drupal.org/en/jsonapi/facets_facet_source/facets_facet_source", }, - "field_config--field_config": Object { + "field_config--field_config": { "href": "https://tests.next-drupal.org/en/jsonapi/field_config/field_config", }, - "field_storage_config--field_storage_config": Object { + "field_storage_config--field_storage_config": { "href": "https://tests.next-drupal.org/en/jsonapi/field_storage_config/field_storage_config", }, - "file--file": Object { + "file--file": { "href": "https://tests.next-drupal.org/en/jsonapi/file/file", }, - "filter_format--filter_format": Object { + "filter_format--filter_format": { "href": "https://tests.next-drupal.org/en/jsonapi/filter_format/filter_format", }, - "image_style--image_style": Object { + "image_style--image_style": { "href": "https://tests.next-drupal.org/en/jsonapi/image_style/image_style", }, - "language_content_settings--language_content_settings": Object { + "language_content_settings--language_content_settings": { "href": "https://tests.next-drupal.org/en/jsonapi/language_content_settings/language_content_settings", }, - "media--audio": Object { + "media--audio": { "href": "https://tests.next-drupal.org/en/jsonapi/media/audio", }, - "media--document": Object { + "media--document": { "href": "https://tests.next-drupal.org/en/jsonapi/media/document", }, - "media--image": Object { + "media--image": { "href": "https://tests.next-drupal.org/en/jsonapi/media/image", }, - "media--remote_video": Object { + "media--remote_video": { "href": "https://tests.next-drupal.org/en/jsonapi/media/remote_video", }, - "media--video": Object { + "media--video": { "href": "https://tests.next-drupal.org/en/jsonapi/media/video", }, - "media_type--media_type": Object { + "media_type--media_type": { "href": "https://tests.next-drupal.org/en/jsonapi/media_type/media_type", }, - "menu--menu": Object { + "menu--menu": { "href": "https://tests.next-drupal.org/en/jsonapi/menu/menu", }, - "menu_link_content--menu_link_content": Object { + "menu_link_content--menu_link_content": { "href": "https://tests.next-drupal.org/en/jsonapi/menu_link_content/menu_link_content", }, - "next_entity_type_config--next_entity_type_config": Object { + "next_entity_type_config--next_entity_type_config": { "href": "https://tests.next-drupal.org/en/jsonapi/next_entity_type_config/next_entity_type_config", }, - "next_site--next_site": Object { + "next_site--next_site": { "href": "https://tests.next-drupal.org/en/jsonapi/next_site/next_site", }, - "node--article": Object { + "node--article": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article", }, - "node--page": Object { + "node--page": { "href": "https://tests.next-drupal.org/en/jsonapi/node/page", }, - "node--recipe": Object { + "node--recipe": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe", }, - "node_type--node_type": Object { + "node_type--node_type": { "href": "https://tests.next-drupal.org/en/jsonapi/node_type/node_type", }, - "oauth2_token--access_token": Object { + "oauth2_token--access_token": { "href": "https://tests.next-drupal.org/en/jsonapi/oauth2_token/access_token", }, - "oauth2_token--auth_code": Object { + "oauth2_token--auth_code": { "href": "https://tests.next-drupal.org/en/jsonapi/oauth2_token/auth_code", }, - "oauth2_token--refresh_token": Object { + "oauth2_token--refresh_token": { "href": "https://tests.next-drupal.org/en/jsonapi/oauth2_token/refresh_token", }, - "oauth2_token_type--oauth2_token_type": Object { + "oauth2_token_type--oauth2_token_type": { "href": "https://tests.next-drupal.org/en/jsonapi/oauth2_token_type/oauth2_token_type", }, - "path_alias--path_alias": Object { + "path_alias--path_alias": { "href": "https://tests.next-drupal.org/en/jsonapi/path_alias/path_alias", }, - "pathauto_pattern--pathauto_pattern": Object { + "pathauto_pattern--pathauto_pattern": { "href": "https://tests.next-drupal.org/en/jsonapi/pathauto_pattern/pathauto_pattern", }, - "rdf_mapping--rdf_mapping": Object { + "rdf_mapping--rdf_mapping": { "href": "https://tests.next-drupal.org/en/jsonapi/rdf_mapping/rdf_mapping", }, - "responsive_image_style--responsive_image_style": Object { + "responsive_image_style--responsive_image_style": { "href": "https://tests.next-drupal.org/en/jsonapi/responsive_image_style/responsive_image_style", }, - "search_api_index--search_api_index": Object { + "search_api_index--search_api_index": { "href": "https://tests.next-drupal.org/en/jsonapi/search_api_index/search_api_index", }, - "search_api_server--search_api_server": Object { + "search_api_server--search_api_server": { "href": "https://tests.next-drupal.org/en/jsonapi/search_api_server/search_api_server", }, - "search_api_task--search_api_task": Object { + "search_api_task--search_api_task": { "href": "https://tests.next-drupal.org/en/jsonapi/search_api_task/search_api_task", }, - "search_page--search_page": Object { + "search_page--search_page": { "href": "https://tests.next-drupal.org/en/jsonapi/search_page/search_page", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi", }, - "shortcut--default": Object { + "shortcut--default": { "href": "https://tests.next-drupal.org/en/jsonapi/shortcut/default", }, - "shortcut_set--shortcut_set": Object { + "shortcut_set--shortcut_set": { "href": "https://tests.next-drupal.org/en/jsonapi/shortcut_set/shortcut_set", }, - "taxonomy_term--recipe_category": Object { + "taxonomy_term--recipe_category": { "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_term/recipe_category", }, - "taxonomy_term--tags": Object { + "taxonomy_term--tags": { "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_term/tags", }, - "taxonomy_vocabulary--taxonomy_vocabulary": Object { + "taxonomy_vocabulary--taxonomy_vocabulary": { "href": "https://tests.next-drupal.org/en/jsonapi/taxonomy_vocabulary/taxonomy_vocabulary", }, - "tour--tour": Object { + "tour--tour": { "href": "https://tests.next-drupal.org/en/jsonapi/tour/tour", }, - "user--user": Object { + "user--user": { "href": "https://tests.next-drupal.org/en/jsonapi/user/user", }, - "user_role--user_role": Object { + "user_role--user_role": { "href": "https://tests.next-drupal.org/en/jsonapi/user_role/user_role", }, - "view--view": Object { + "view--view": { "href": "https://tests.next-drupal.org/en/jsonapi/view/view", }, - "workflow--workflow": Object { + "workflow--workflow": { "href": "https://tests.next-drupal.org/en/jsonapi/workflow/workflow", }, }, } `; -exports[`getIndex it fetches the JSON:API index with locale 1`] = ` -Object { - "data": Array [], - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { +exports[`getIndex() fetches the JSON:API index with locale 1`] = ` +{ + "data": [], + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "action--action": Object { + "links": { + "action--action": { "href": "https://tests.next-drupal.org/es/jsonapi/action/action", }, - "base_field_override--base_field_override": Object { + "base_field_override--base_field_override": { "href": "https://tests.next-drupal.org/es/jsonapi/base_field_override/base_field_override", }, - "block--block": Object { + "block--block": { "href": "https://tests.next-drupal.org/es/jsonapi/block/block", }, - "block_content--banner_block": Object { + "block_content--banner_block": { "href": "https://tests.next-drupal.org/es/jsonapi/block_content/banner_block", }, - "block_content--basic": Object { + "block_content--basic": { "href": "https://tests.next-drupal.org/es/jsonapi/block_content/basic", }, - "block_content--disclaimer_block": Object { + "block_content--disclaimer_block": { "href": "https://tests.next-drupal.org/es/jsonapi/block_content/disclaimer_block", }, - "block_content--footer_promo_block": Object { + "block_content--footer_promo_block": { "href": "https://tests.next-drupal.org/es/jsonapi/block_content/footer_promo_block", }, - "block_content_type--block_content_type": Object { + "block_content_type--block_content_type": { "href": "https://tests.next-drupal.org/es/jsonapi/block_content_type/block_content_type", }, - "configurable_language--configurable_language": Object { + "configurable_language--configurable_language": { "href": "https://tests.next-drupal.org/es/jsonapi/configurable_language/configurable_language", }, - "consumer--consumer": Object { + "consumer--consumer": { "href": "https://tests.next-drupal.org/es/jsonapi/consumer/consumer", }, - "contact_form--contact_form": Object { + "contact_form--contact_form": { "href": "https://tests.next-drupal.org/es/jsonapi/contact_form/contact_form", }, - "contact_message--feedback": Object { + "contact_message--feedback": { "href": "https://tests.next-drupal.org/es/jsonapi/contact_message/feedback", }, - "contact_message--personal": Object { + "contact_message--personal": { "href": "https://tests.next-drupal.org/es/jsonapi/contact_message/personal", }, - "date_format--date_format": Object { + "date_format--date_format": { "href": "https://tests.next-drupal.org/es/jsonapi/date_format/date_format", }, - "editor--editor": Object { + "editor--editor": { "href": "https://tests.next-drupal.org/es/jsonapi/editor/editor", }, - "entity_form_display--entity_form_display": Object { + "entity_form_display--entity_form_display": { "href": "https://tests.next-drupal.org/es/jsonapi/entity_form_display/entity_form_display", }, - "entity_form_mode--entity_form_mode": Object { + "entity_form_mode--entity_form_mode": { "href": "https://tests.next-drupal.org/es/jsonapi/entity_form_mode/entity_form_mode", }, - "entity_view_display--entity_view_display": Object { + "entity_view_display--entity_view_display": { "href": "https://tests.next-drupal.org/es/jsonapi/entity_view_display/entity_view_display", }, - "entity_view_mode--entity_view_mode": Object { + "entity_view_mode--entity_view_mode": { "href": "https://tests.next-drupal.org/es/jsonapi/entity_view_mode/entity_view_mode", }, - "facets_facet--facets_facet": Object { + "facets_facet--facets_facet": { "href": "https://tests.next-drupal.org/es/jsonapi/facets_facet/facets_facet", }, - "facets_facet_source--facets_facet_source": Object { + "facets_facet_source--facets_facet_source": { "href": "https://tests.next-drupal.org/es/jsonapi/facets_facet_source/facets_facet_source", }, - "field_config--field_config": Object { + "field_config--field_config": { "href": "https://tests.next-drupal.org/es/jsonapi/field_config/field_config", }, - "field_storage_config--field_storage_config": Object { + "field_storage_config--field_storage_config": { "href": "https://tests.next-drupal.org/es/jsonapi/field_storage_config/field_storage_config", }, - "file--file": Object { + "file--file": { "href": "https://tests.next-drupal.org/es/jsonapi/file/file", }, - "filter_format--filter_format": Object { + "filter_format--filter_format": { "href": "https://tests.next-drupal.org/es/jsonapi/filter_format/filter_format", }, - "image_style--image_style": Object { + "image_style--image_style": { "href": "https://tests.next-drupal.org/es/jsonapi/image_style/image_style", }, - "language_content_settings--language_content_settings": Object { + "language_content_settings--language_content_settings": { "href": "https://tests.next-drupal.org/es/jsonapi/language_content_settings/language_content_settings", }, - "media--audio": Object { + "media--audio": { "href": "https://tests.next-drupal.org/es/jsonapi/media/audio", }, - "media--document": Object { + "media--document": { "href": "https://tests.next-drupal.org/es/jsonapi/media/document", }, - "media--image": Object { + "media--image": { "href": "https://tests.next-drupal.org/es/jsonapi/media/image", }, - "media--remote_video": Object { + "media--remote_video": { "href": "https://tests.next-drupal.org/es/jsonapi/media/remote_video", }, - "media--video": Object { + "media--video": { "href": "https://tests.next-drupal.org/es/jsonapi/media/video", }, - "media_type--media_type": Object { + "media_type--media_type": { "href": "https://tests.next-drupal.org/es/jsonapi/media_type/media_type", }, - "menu--menu": Object { + "menu--menu": { "href": "https://tests.next-drupal.org/es/jsonapi/menu/menu", }, - "menu_link_content--menu_link_content": Object { + "menu_link_content--menu_link_content": { "href": "https://tests.next-drupal.org/es/jsonapi/menu_link_content/menu_link_content", }, - "next_entity_type_config--next_entity_type_config": Object { + "next_entity_type_config--next_entity_type_config": { "href": "https://tests.next-drupal.org/es/jsonapi/next_entity_type_config/next_entity_type_config", }, - "next_site--next_site": Object { + "next_site--next_site": { "href": "https://tests.next-drupal.org/es/jsonapi/next_site/next_site", }, - "node--article": Object { + "node--article": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article", }, - "node--page": Object { + "node--page": { "href": "https://tests.next-drupal.org/es/jsonapi/node/page", }, - "node--recipe": Object { + "node--recipe": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe", }, - "node_type--node_type": Object { + "node_type--node_type": { "href": "https://tests.next-drupal.org/es/jsonapi/node_type/node_type", }, - "oauth2_token--access_token": Object { + "oauth2_token--access_token": { "href": "https://tests.next-drupal.org/es/jsonapi/oauth2_token/access_token", }, - "oauth2_token--auth_code": Object { + "oauth2_token--auth_code": { "href": "https://tests.next-drupal.org/es/jsonapi/oauth2_token/auth_code", }, - "oauth2_token--refresh_token": Object { + "oauth2_token--refresh_token": { "href": "https://tests.next-drupal.org/es/jsonapi/oauth2_token/refresh_token", }, - "oauth2_token_type--oauth2_token_type": Object { + "oauth2_token_type--oauth2_token_type": { "href": "https://tests.next-drupal.org/es/jsonapi/oauth2_token_type/oauth2_token_type", }, - "path_alias--path_alias": Object { + "path_alias--path_alias": { "href": "https://tests.next-drupal.org/es/jsonapi/path_alias/path_alias", }, - "pathauto_pattern--pathauto_pattern": Object { + "pathauto_pattern--pathauto_pattern": { "href": "https://tests.next-drupal.org/es/jsonapi/pathauto_pattern/pathauto_pattern", }, - "rdf_mapping--rdf_mapping": Object { + "rdf_mapping--rdf_mapping": { "href": "https://tests.next-drupal.org/es/jsonapi/rdf_mapping/rdf_mapping", }, - "responsive_image_style--responsive_image_style": Object { + "responsive_image_style--responsive_image_style": { "href": "https://tests.next-drupal.org/es/jsonapi/responsive_image_style/responsive_image_style", }, - "search_api_index--search_api_index": Object { + "search_api_index--search_api_index": { "href": "https://tests.next-drupal.org/es/jsonapi/search_api_index/search_api_index", }, - "search_api_server--search_api_server": Object { + "search_api_server--search_api_server": { "href": "https://tests.next-drupal.org/es/jsonapi/search_api_server/search_api_server", }, - "search_api_task--search_api_task": Object { + "search_api_task--search_api_task": { "href": "https://tests.next-drupal.org/es/jsonapi/search_api_task/search_api_task", }, - "search_page--search_page": Object { + "search_page--search_page": { "href": "https://tests.next-drupal.org/es/jsonapi/search_page/search_page", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi", }, - "shortcut--default": Object { + "shortcut--default": { "href": "https://tests.next-drupal.org/es/jsonapi/shortcut/default", }, - "shortcut_set--shortcut_set": Object { + "shortcut_set--shortcut_set": { "href": "https://tests.next-drupal.org/es/jsonapi/shortcut_set/shortcut_set", }, - "taxonomy_term--recipe_category": Object { + "taxonomy_term--recipe_category": { "href": "https://tests.next-drupal.org/es/jsonapi/taxonomy_term/recipe_category", }, - "taxonomy_term--tags": Object { + "taxonomy_term--tags": { "href": "https://tests.next-drupal.org/es/jsonapi/taxonomy_term/tags", }, - "taxonomy_vocabulary--taxonomy_vocabulary": Object { + "taxonomy_vocabulary--taxonomy_vocabulary": { "href": "https://tests.next-drupal.org/es/jsonapi/taxonomy_vocabulary/taxonomy_vocabulary", }, - "tour--tour": Object { + "tour--tour": { "href": "https://tests.next-drupal.org/es/jsonapi/tour/tour", }, - "user--user": Object { + "user--user": { "href": "https://tests.next-drupal.org/es/jsonapi/user/user", }, - "user_role--user_role": Object { + "user_role--user_role": { "href": "https://tests.next-drupal.org/es/jsonapi/user_role/user_role", }, - "view--view": Object { + "view--view": { "href": "https://tests.next-drupal.org/es/jsonapi/view/view", }, - "workflow--workflow": Object { + "workflow--workflow": { "href": "https://tests.next-drupal.org/es/jsonapi/workflow/workflow", }, }, } `; -exports[`getMenu it fetches menu items for a menu 1`] = ` -Object { - "items": Array [ - Object { +exports[`getMenu() fetches menu items for a menu 1`] = ` +{ + "items": [ + { "description": "", "enabled": true, "expanded": false, "id": "standard.front_page", "menu_name": "main", - "meta": Array [], - "options": Array [], + "meta": [], + "options": [], "parent": "", "provider": "demo_umami", - "route": Object { + "route": { "name": "", - "parameters": Array [], + "parameters": [], }, "title": "Home", "type": "menu_link_content--menu_link_content", "url": "/en", "weight": "0", }, - Object { + { "description": "", "enabled": true, "expanded": false, "id": "views_view:views.featured_articles.page_1", "menu_name": "main", - "meta": Object { + "meta": { "display_id": "page_1", "view_id": "featured_articles", }, - "options": Array [], + "options": [], "parent": "", "provider": "views", - "route": Object { + "route": { "name": "view.featured_articles.page_1", - "parameters": Array [], + "parameters": [], }, "title": "Articles", "type": "menu_link_content--menu_link_content", "url": "/en/articles", "weight": "20", }, - Object { + { "description": "", "enabled": true, "expanded": false, "id": "views_view:views.recipes.page_1", "menu_name": "main", - "meta": Object { + "meta": { "display_id": "page_1", "view_id": "recipes", }, - "options": Array [], + "options": [], "parent": "", "provider": "views", - "route": Object { + "route": { "name": "view.recipes.page_1", - "parameters": Array [], + "parameters": [], }, "title": "Recipes", "type": "menu_link_content--menu_link_content", @@ -1268,64 +678,64 @@ Object { "weight": "30", }, ], - "tree": Array [ - Object { + "tree": [ + { "description": "", "enabled": true, "expanded": false, "id": "standard.front_page", "menu_name": "main", - "meta": Array [], - "options": Array [], + "meta": [], + "options": [], "parent": "", "provider": "demo_umami", - "route": Object { + "route": { "name": "", - "parameters": Array [], + "parameters": [], }, "title": "Home", "type": "menu_link_content--menu_link_content", "url": "/en", "weight": "0", }, - Object { + { "description": "", "enabled": true, "expanded": false, "id": "views_view:views.featured_articles.page_1", "menu_name": "main", - "meta": Object { + "meta": { "display_id": "page_1", "view_id": "featured_articles", }, - "options": Array [], + "options": [], "parent": "", "provider": "views", - "route": Object { + "route": { "name": "view.featured_articles.page_1", - "parameters": Array [], + "parameters": [], }, "title": "Articles", "type": "menu_link_content--menu_link_content", "url": "/en/articles", "weight": "20", }, - Object { + { "description": "", "enabled": true, "expanded": false, "id": "views_view:views.recipes.page_1", "menu_name": "main", - "meta": Object { + "meta": { "display_id": "page_1", "view_id": "recipes", }, - "options": Array [], + "options": [], "parent": "", "provider": "views", - "route": Object { + "route": { "name": "view.recipes.page_1", - "parameters": Array [], + "parameters": [], }, "title": "Recipes", "type": "menu_link_content--menu_link_content", @@ -1336,66 +746,66 @@ Object { } `; -exports[`getMenu it fetches menu items for a menu with locale 1`] = ` -Object { - "items": Array [ - Object { +exports[`getMenu() fetches menu items for a menu with locale 1`] = ` +{ + "items": [ + { "description": "", "enabled": true, "expanded": false, "id": "standard.front_page", "menu_name": "main", - "meta": Array [], - "options": Array [], + "meta": [], + "options": [], "parent": "", "provider": "demo_umami", - "route": Object { + "route": { "name": "", - "parameters": Array [], + "parameters": [], }, "title": "Inicio", "type": "menu_link_content--menu_link_content", "url": "/es", "weight": "0", }, - Object { + { "description": "", "enabled": true, "expanded": false, "id": "views_view:views.featured_articles.page_1", "menu_name": "main", - "meta": Object { + "meta": { "display_id": "page_1", "view_id": "featured_articles", }, - "options": Array [], + "options": [], "parent": "", "provider": "views", - "route": Object { + "route": { "name": "view.featured_articles.page_1", - "parameters": Array [], + "parameters": [], }, "title": "Artículos", "type": "menu_link_content--menu_link_content", "url": "/es/articles", "weight": "20", }, - Object { + { "description": "", "enabled": true, "expanded": false, "id": "views_view:views.recipes.page_1", "menu_name": "main", - "meta": Object { + "meta": { "display_id": "page_1", "view_id": "recipes", }, - "options": Array [], + "options": [], "parent": "", "provider": "views", - "route": Object { + "route": { "name": "view.recipes.page_1", - "parameters": Array [], + "parameters": [], }, "title": "Recetas", "type": "menu_link_content--menu_link_content", @@ -1403,64 +813,64 @@ Object { "weight": "30", }, ], - "tree": Array [ - Object { + "tree": [ + { "description": "", "enabled": true, "expanded": false, "id": "standard.front_page", "menu_name": "main", - "meta": Array [], - "options": Array [], + "meta": [], + "options": [], "parent": "", "provider": "demo_umami", - "route": Object { + "route": { "name": "", - "parameters": Array [], + "parameters": [], }, "title": "Inicio", "type": "menu_link_content--menu_link_content", "url": "/es", "weight": "0", }, - Object { + { "description": "", "enabled": true, "expanded": false, "id": "views_view:views.featured_articles.page_1", "menu_name": "main", - "meta": Object { + "meta": { "display_id": "page_1", "view_id": "featured_articles", }, - "options": Array [], + "options": [], "parent": "", "provider": "views", - "route": Object { + "route": { "name": "view.featured_articles.page_1", - "parameters": Array [], + "parameters": [], }, "title": "Artículos", "type": "menu_link_content--menu_link_content", "url": "/es/articles", "weight": "20", }, - Object { + { "description": "", "enabled": true, "expanded": false, "id": "views_view:views.recipes.page_1", "menu_name": "main", - "meta": Object { + "meta": { "display_id": "page_1", "view_id": "recipes", }, - "options": Array [], + "options": [], "parent": "", "provider": "views", - "route": Object { + "route": { "name": "view.recipes.page_1", - "parameters": Array [], + "parameters": [], }, "title": "Recetas", "type": "menu_link_content--menu_link_content", @@ -1471,20 +881,20 @@ Object { } `; -exports[`getMenu it fetches menu items for a menu with params 1`] = ` -Object { - "items": Array [ - Object { +exports[`getMenu() fetches menu items for a menu with params 1`] = ` +{ + "items": [ + { "id": "standard.front_page", "title": "Home", "type": "menu_link_content--menu_link_content", }, - Object { + { "id": "views_view:views.featured_articles.page_1", "title": "Articles", "type": "menu_link_content--menu_link_content", }, - Object { + { "id": "views_view:views.recipes.page_1", "title": "Recipes", "type": "menu_link_content--menu_link_content", @@ -1494,37 +904,8 @@ Object { } `; -exports[`getPathFromContext it encodes path with punctuation 1`] = ` -Object { - "entity": Object { - "bundle": "page", - "canonical": "https://tests.next-drupal.org/en/path%26with%5Epunc%26in%24path", - "id": "20", - "langcode": "en", - "path": "/en/path%26with%5Epunc%26in%24path", - "type": "node", - "uuid": "e4bbe727-14ee-44bc-a34a-14ce5c86a82e", - }, - "isHomePath": false, - "jsonapi": Object { - "basePath": "/en/jsonapi", - "entryPoint": "https://tests.next-drupal.org/en/jsonapi", - "individual": "https://tests.next-drupal.org/en/jsonapi/node/page/e4bbe727-14ee-44bc-a34a-14ce5c86a82e", - "pathPrefix": "en/jsonapi", - "resourceName": "node--page", - }, - "label": "Page with characters in path", - "meta": Object { - "deprecated": Object { - "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", - }, - }, - "resolved": "https://tests.next-drupal.org/en/path%26with%5Epunc%26in%24path", -} -`; - -exports[`getResource it fetches a resource by uuid 1`] = ` -Object { +exports[`getResource() fetches a resource by uuid 1`] = ` +{ "changed": "2022-03-25T08:02:17+00:00", "content_translation_outdated": false, "content_translation_source": "und", @@ -1534,7 +915,7 @@ Object { "drupal_internal__vid": 37, "field_cooking_time": 30, "field_difficulty": "medium", - "field_ingredients": Array [ + "field_ingredients": [ "For the pastry:", "280g plain flour", "140g butter", @@ -1549,25 +930,25 @@ Object { "200g sun dried tomatoes", "100g feta", ], - "field_media_image": Object { + "field_media_image": { "id": "bbfe9d97-2da2-432b-a22c-0396c08e06ca", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 1, }, "type": "media--image", }, "field_number_of_servings": 8, "field_preparation_time": 40, - "field_recipe_category": Array [ - Object { + "field_recipe_category": [ + { "id": "a6c02fe4-67bf-462c-90cb-32281a07efe4", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 31, }, "type": "taxonomy_term--recipe_category", }, ], - "field_recipe_instruction": Object { + "field_recipe_instruction": { "format": "basic_html", "processed": "
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  3. @@ -1584,24 +965,24 @@ Object {
", }, - "field_summary": Object { + "field_summary": { "format": "basic_html", "processed": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

", "value": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "46258827-cfad-4813-99dc-287c4cb41117", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 22, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "f32a4d84-0568-4bfd-8be3-8217d36efb6d", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 13, }, "type": "taxonomy_term--tags", @@ -1609,26 +990,26 @@ Object { ], "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "9b70a287-cade-454f-be8b-dea7b9a37c7a", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "recipe", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/recipes/deep-mediterranean-quiche", "langcode": "en", "pid": 67, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -1639,9 +1020,9 @@ Object { "revision_log": null, "revision_timestamp": "2022-03-25T08:02:17+00:00", "revision_translation_affected": true, - "revision_uid": Object { + "revision_uid": { "id": "365cc7b5-ddc4-4b3b-939e-1494400aab4a", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 1, }, "type": "user--user", @@ -1650,9 +1031,9 @@ Object { "sticky": false, "title": "Deep mediterranean quiche - edited", "type": "node--recipe", - "uid": Object { + "uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", @@ -1660,12 +1041,12 @@ Object { } `; -exports[`getResource it fetches a resource by uuid with params 1`] = ` -Object { +exports[`getResource() fetches a resource by uuid with params 1`] = ` +{ "field_cooking_time": 30, "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, @@ -1674,12 +1055,12 @@ Object { } `; -exports[`getResource it fetches a resource using locale 1`] = ` -Object { +exports[`getResource() fetches a resource using locale 1`] = ` +{ "field_cooking_time": 30, "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, @@ -1688,10 +1069,10 @@ Object { } `; -exports[`getResource it fetches raw data 1`] = ` -Object { - "data": Object { - "attributes": Object { +exports[`getResource() fetches raw data 1`] = ` +{ + "data": { + "attributes": { "changed": "2022-03-25T08:02:17+00:00", "content_translation_outdated": false, "content_translation_source": "und", @@ -1701,7 +1082,7 @@ Object { "drupal_internal__vid": 37, "field_cooking_time": 30, "field_difficulty": "medium", - "field_ingredients": Array [ + "field_ingredients": [ "For the pastry:", "280g plain flour", "140g butter", @@ -1718,7 +1099,7 @@ Object { ], "field_number_of_servings": 8, "field_preparation_time": 40, - "field_recipe_instruction": Object { + "field_recipe_instruction": { "format": "basic_html", "processed": "
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  3. @@ -1735,7 +1116,7 @@ Object {
", }, - "field_summary": Object { + "field_summary": { "format": "basic_html", "processed": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

", @@ -1744,7 +1125,7 @@ Object { }, "langcode": "en", "moderation_state": "published", - "path": Object { + "path": { "alias": "/recipes/deep-mediterranean-quiche", "langcode": "en", "pid": 67, @@ -1758,121 +1139,121 @@ Object { "title": "Deep mediterranean quiche - edited", }, "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, - "relationships": Object { - "field_media_image": Object { - "data": Object { + "relationships": { + "field_media_image": { + "data": { "id": "bbfe9d97-2da2-432b-a22c-0396c08e06ca", - "meta": Object { + "meta": { "drupal_internal__target_id": 1, }, "type": "media--image", }, - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_media_image?resourceVersion=id%3A37", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_media_image?resourceVersion=id%3A37", }, }, }, - "field_recipe_category": Object { - "data": Array [ - Object { + "field_recipe_category": { + "data": [ + { "id": "a6c02fe4-67bf-462c-90cb-32281a07efe4", - "meta": Object { + "meta": { "drupal_internal__target_id": 31, }, "type": "taxonomy_term--recipe_category", }, ], - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_recipe_category?resourceVersion=id%3A37", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_recipe_category?resourceVersion=id%3A37", }, }, }, - "field_tags": Object { - "data": Array [ - Object { + "field_tags": { + "data": [ + { "id": "46258827-cfad-4813-99dc-287c4cb41117", - "meta": Object { + "meta": { "drupal_internal__target_id": 22, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "f32a4d84-0568-4bfd-8be3-8217d36efb6d", - "meta": Object { + "meta": { "drupal_internal__target_id": 13, }, "type": "taxonomy_term--tags", }, ], - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_tags?resourceVersion=id%3A37", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_tags?resourceVersion=id%3A37", }, }, }, - "node_type": Object { - "data": Object { + "node_type": { + "data": { "id": "9b70a287-cade-454f-be8b-dea7b9a37c7a", - "meta": Object { + "meta": { "drupal_internal__target_id": "recipe", }, "type": "node_type--node_type", }, - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/node_type?resourceVersion=id%3A37", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/node_type?resourceVersion=id%3A37", }, }, }, - "revision_uid": Object { - "data": Object { + "revision_uid": { + "data": { "id": "365cc7b5-ddc4-4b3b-939e-1494400aab4a", - "meta": Object { + "meta": { "drupal_internal__target_id": 1, }, "type": "user--user", }, - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/revision_uid?resourceVersion=id%3A37", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/revision_uid?resourceVersion=id%3A37", }, }, }, - "uid": Object { - "data": Object { + "uid": { + "data": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "meta": Object { + "meta": { "drupal_internal__target_id": 4, }, "type": "user--user", }, - "links": Object { - "related": Object { + "links": { + "related": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/uid?resourceVersion=id%3A37", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/uid?resourceVersion=id%3A37", }, }, @@ -1880,26 +1261,26 @@ Object { }, "type": "node--recipe", }, - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", }, }, } `; -exports[`getResourceByPath it fetches a resource by path 1`] = ` -Object { +exports[`getResourceByPath() fetches a resource by path 1`] = ` +{ "changed": "2022-03-25T08:02:17+00:00", "content_translation_outdated": false, "content_translation_source": "und", @@ -1909,7 +1290,7 @@ Object { "drupal_internal__vid": 37, "field_cooking_time": 30, "field_difficulty": "medium", - "field_ingredients": Array [ + "field_ingredients": [ "For the pastry:", "280g plain flour", "140g butter", @@ -1924,25 +1305,25 @@ Object { "200g sun dried tomatoes", "100g feta", ], - "field_media_image": Object { + "field_media_image": { "id": "bbfe9d97-2da2-432b-a22c-0396c08e06ca", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 1, }, "type": "media--image", }, "field_number_of_servings": 8, "field_preparation_time": 40, - "field_recipe_category": Array [ - Object { + "field_recipe_category": [ + { "id": "a6c02fe4-67bf-462c-90cb-32281a07efe4", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 31, }, "type": "taxonomy_term--recipe_category", }, ], - "field_recipe_instruction": Object { + "field_recipe_instruction": { "format": "basic_html", "processed": "
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  3. @@ -1959,24 +1340,24 @@ Object {
", }, - "field_summary": Object { + "field_summary": { "format": "basic_html", "processed": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

", "value": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "46258827-cfad-4813-99dc-287c4cb41117", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 22, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "f32a4d84-0568-4bfd-8be3-8217d36efb6d", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 13, }, "type": "taxonomy_term--tags", @@ -1984,26 +1365,26 @@ Object { ], "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "9b70a287-cade-454f-be8b-dea7b9a37c7a", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "recipe", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/recipes/deep-mediterranean-quiche", "langcode": "en", "pid": 67, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -2014,9 +1395,9 @@ Object { "revision_log": null, "revision_timestamp": "2022-03-25T08:02:17+00:00", "revision_translation_affected": true, - "revision_uid": Object { + "revision_uid": { "id": "365cc7b5-ddc4-4b3b-939e-1494400aab4a", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 1, }, "type": "user--user", @@ -2025,9 +1406,9 @@ Object { "sticky": false, "title": "Deep mediterranean quiche - edited", "type": "node--recipe", - "uid": Object { + "uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", @@ -2035,12 +1416,12 @@ Object { } `; -exports[`getResourceByPath it fetches a resource by path using locale 1`] = ` -Object { +exports[`getResourceByPath() fetches a resource by path using locale 1`] = ` +{ "field_cooking_time": 30, "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, @@ -2049,12 +1430,12 @@ Object { } `; -exports[`getResourceByPath it fetches a resource by path with params 1`] = ` -Object { +exports[`getResourceByPath() fetches a resource by path with params 1`] = ` +{ "field_cooking_time": 30, "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, @@ -2063,10 +1444,10 @@ Object { } `; -exports[`getResourceByPath it fetches raw data 1`] = ` -Object { - "data": Object { - "attributes": Object { +exports[`getResourceByPath() fetches raw data 1`] = ` +{ + "data": { + "attributes": { "changed": "2022-03-25T08:02:17+00:00", "content_translation_outdated": false, "content_translation_source": "und", @@ -2076,7 +1457,7 @@ Object { "drupal_internal__vid": 37, "field_cooking_time": 30, "field_difficulty": "medium", - "field_ingredients": Array [ + "field_ingredients": [ "For the pastry:", "280g plain flour", "140g butter", @@ -2093,7 +1474,7 @@ Object { ], "field_number_of_servings": 8, "field_preparation_time": 40, - "field_recipe_instruction": Object { + "field_recipe_instruction": { "format": "basic_html", "processed": "
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  3. @@ -2110,7 +1491,7 @@ Object {
", }, - "field_summary": Object { + "field_summary": { "format": "basic_html", "processed": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

", @@ -2119,7 +1500,7 @@ Object { }, "langcode": "en", "moderation_state": "published", - "path": Object { + "path": { "alias": "/recipes/deep-mediterranean-quiche", "langcode": "en", "pid": 67, @@ -2131,451 +1512,224 @@ Object { "status": true, "sticky": false, "title": "Deep mediterranean quiche - edited", - }, - "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", - }, - }, - "relationships": Object { - "field_media_image": Object { - "data": Object { - "id": "bbfe9d97-2da2-432b-a22c-0396c08e06ca", - "meta": Object { - "drupal_internal__target_id": 1, - }, - "type": "media--image", - }, - "links": Object { - "related": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_media_image?resourceVersion=id%3A37", - }, - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_media_image?resourceVersion=id%3A37", - }, - }, - }, - "field_recipe_category": Object { - "data": Array [ - Object { - "id": "a6c02fe4-67bf-462c-90cb-32281a07efe4", - "meta": Object { - "drupal_internal__target_id": 31, - }, - "type": "taxonomy_term--recipe_category", - }, - ], - "links": Object { - "related": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_recipe_category?resourceVersion=id%3A37", - }, - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_recipe_category?resourceVersion=id%3A37", - }, - }, - }, - "field_tags": Object { - "data": Array [ - Object { - "id": "46258827-cfad-4813-99dc-287c4cb41117", - "meta": Object { - "drupal_internal__target_id": 22, - }, - "type": "taxonomy_term--tags", - }, - Object { - "id": "f32a4d84-0568-4bfd-8be3-8217d36efb6d", - "meta": Object { - "drupal_internal__target_id": 13, - }, - "type": "taxonomy_term--tags", - }, - ], - "links": Object { - "related": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_tags?resourceVersion=id%3A37", - }, - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_tags?resourceVersion=id%3A37", - }, - }, - }, - "node_type": Object { - "data": Object { - "id": "9b70a287-cade-454f-be8b-dea7b9a37c7a", - "meta": Object { - "drupal_internal__target_id": "recipe", - }, - "type": "node_type--node_type", - }, - "links": Object { - "related": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/node_type?resourceVersion=id%3A37", - }, - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/node_type?resourceVersion=id%3A37", - }, - }, - }, - "revision_uid": Object { - "data": Object { - "id": "365cc7b5-ddc4-4b3b-939e-1494400aab4a", - "meta": Object { - "drupal_internal__target_id": 1, - }, - "type": "user--user", - }, - "links": Object { - "related": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/revision_uid?resourceVersion=id%3A37", - }, - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/revision_uid?resourceVersion=id%3A37", - }, - }, - }, - "uid": Object { - "data": Object { - "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "meta": Object { - "drupal_internal__target_id": 4, - }, - "type": "user--user", - }, - "links": Object { - "related": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/uid?resourceVersion=id%3A37", - }, - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/uid?resourceVersion=id%3A37", - }, - }, - }, - }, - "type": "node--recipe", - }, - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { - "href": "http://jsonapi.org/format/1.0/", - }, - }, - }, - "version": "1.0", - }, - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", - }, - }, -} -`; - -exports[`getResourceCollection it fetches a resource collection 1`] = ` -Array [ - Object { - "id": "52837ad0-f218-46bd-a106-5710336b7053", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", - }, - }, - "title": "Give it a go and grow your own herbs", - "type": "node--article", - }, - Object { - "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", - }, - }, - "title": "Dairy-free and delicious milk chocolate", - "type": "node--article", - }, - Object { - "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", - }, - }, - "title": "The real deal for supermarket savvy shopping", - "type": "node--article", - }, - Object { - "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", - }, - }, - "title": "The Umami guide to our favorite mushrooms", - "type": "node--article", - }, - Object { - "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", - }, - }, - "title": "Let's hear it for carrots", - "type": "node--article", - }, - Object { - "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", - }, - }, - "title": "Baking mishaps - our troubleshooting tips", - "type": "node--article", - }, - Object { - "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", - }, - }, - "title": "Skip the spirits with delicious mocktails", - "type": "node--article", - }, - Object { - "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", - }, - }, - "title": "Give your oatmeal the ultimate makeover", - "type": "node--article", - }, -] -`; - -exports[`getResourceCollection it fetches a resource collection using locale 1`] = ` -Array [ - Object { - "id": "52837ad0-f218-46bd-a106-5710336b7053", - "langcode": "es", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", - }, - }, - "title": "Prueba y cultiva tus propias hierbas", - "type": "node--article", - }, - Object { - "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", - "langcode": "es", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", - }, - }, - "title": "Delicioso chocolate sin lactosa", - "type": "node--article", - }, - Object { - "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", - "langcode": "es", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", - }, - }, - "title": "El verdadero negocio para comprar en el supermercado", - "type": "node--article", - }, - Object { - "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", - "langcode": "es", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", - }, - }, - "title": "Guía Umami de nuestras setas preferidas", - "type": "node--article", - }, - Object { - "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", - "langcode": "es", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", - }, - }, - "title": "Un aplauso para las zanahorias", - "type": "node--article", - }, - Object { - "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", - "langcode": "es", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", - }, - }, - "title": "Percances al hornear - nuestros consejos para solucionar los problemas", - "type": "node--article", - }, - Object { - "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", - "langcode": "es", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", - }, - }, - "title": "Salta los espíritus con deliciosos cócteles sin alcohol", - "type": "node--article", - }, - Object { - "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", - "langcode": "es", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", + }, + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, - "title": "Dale a tu avena el cambio de imagen definitivo", - "type": "node--article", - }, -] -`; - -exports[`getResourceCollection it fetches raw data 1`] = ` -Object { - "data": Array [ - Object { - "attributes": Object { - "title": "Vegan chocolate and nut brownies", + "relationships": { + "field_media_image": { + "data": { + "id": "bbfe9d97-2da2-432b-a22c-0396c08e06ca", + "meta": { + "drupal_internal__target_id": 1, + }, + "type": "media--image", + }, + "links": { + "related": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_media_image?resourceVersion=id%3A37", + }, + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_media_image?resourceVersion=id%3A37", + }, + }, }, - "id": "7862d283-ece2-4ae1-8bef-865259f72315", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/7862d283-ece2-4ae1-8bef-865259f72315?resourceVersion=id%3A4", + "field_recipe_category": { + "data": [ + { + "id": "a6c02fe4-67bf-462c-90cb-32281a07efe4", + "meta": { + "drupal_internal__target_id": 31, + }, + "type": "taxonomy_term--recipe_category", + }, + ], + "links": { + "related": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_recipe_category?resourceVersion=id%3A37", + }, + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_recipe_category?resourceVersion=id%3A37", + }, }, }, - "type": "node--recipe", - }, - Object { - "attributes": Object { - "title": "Super easy vegetarian pasta bake", + "field_tags": { + "data": [ + { + "id": "46258827-cfad-4813-99dc-287c4cb41117", + "meta": { + "drupal_internal__target_id": 22, + }, + "type": "taxonomy_term--tags", + }, + { + "id": "f32a4d84-0568-4bfd-8be3-8217d36efb6d", + "meta": { + "drupal_internal__target_id": 13, + }, + "type": "taxonomy_term--tags", + }, + ], + "links": { + "related": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/field_tags?resourceVersion=id%3A37", + }, + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/field_tags?resourceVersion=id%3A37", + }, + }, }, - "id": "8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7?resourceVersion=id%3A6", + "node_type": { + "data": { + "id": "9b70a287-cade-454f-be8b-dea7b9a37c7a", + "meta": { + "drupal_internal__target_id": "recipe", + }, + "type": "node_type--node_type", + }, + "links": { + "related": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/node_type?resourceVersion=id%3A37", + }, + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/node_type?resourceVersion=id%3A37", + }, + }, + }, + "revision_uid": { + "data": { + "id": "365cc7b5-ddc4-4b3b-939e-1494400aab4a", + "meta": { + "drupal_internal__target_id": 1, + }, + "type": "user--user", + }, + "links": { + "related": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/revision_uid?resourceVersion=id%3A37", + }, + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/revision_uid?resourceVersion=id%3A37", + }, + }, + }, + "uid": { + "data": { + "id": "9e4944e8-dd77-407a-8610-83e823b48b56", + "meta": { + "drupal_internal__target_id": 4, + }, + "type": "user--user", + }, + "links": { + "related": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/uid?resourceVersion=id%3A37", + }, + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f/relationships/uid?resourceVersion=id%3A37", + }, }, }, - "type": "node--recipe", }, - ], - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { + "type": "node--recipe", + }, + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "next": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe?fields%5Bnode--recipe%5D=title&page%5Boffset%5D=2&page%5Blimit%5D=2", - }, - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe?fields%5Bnode--recipe%5D=title&page%5Blimit%5D=2", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", }, }, } `; -exports[`getResourceCollectionFromContext it fetches a resource collection 1`] = ` -Array [ - Object { +exports[`getResourceCollection() fetches a resource collection 1`] = ` +[ + { "id": "52837ad0-f218-46bd-a106-5710336b7053", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", }, }, "title": "Give it a go and grow your own herbs", "type": "node--article", }, - Object { + { "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", }, }, "title": "Dairy-free and delicious milk chocolate", "type": "node--article", }, - Object { + { "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", }, }, "title": "The real deal for supermarket savvy shopping", "type": "node--article", }, - Object { + { "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", }, }, "title": "The Umami guide to our favorite mushrooms", "type": "node--article", }, - Object { + { "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", }, }, "title": "Let's hear it for carrots", "type": "node--article", }, - Object { + { "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", }, }, "title": "Baking mishaps - our troubleshooting tips", "type": "node--article", }, - Object { + { "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", }, }, "title": "Skip the spirits with delicious mocktails", "type": "node--article", }, - Object { + { "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", }, }, @@ -2585,90 +1739,90 @@ Array [ ] `; -exports[`getResourceCollectionFromContext it fetches a resource collection using locale 1`] = ` -Array [ - Object { +exports[`getResourceCollection() fetches a resource collection using locale 1`] = ` +[ + { "id": "52837ad0-f218-46bd-a106-5710336b7053", "langcode": "es", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", }, }, "title": "Prueba y cultiva tus propias hierbas", "type": "node--article", }, - Object { + { "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", "langcode": "es", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", }, }, "title": "Delicioso chocolate sin lactosa", "type": "node--article", }, - Object { + { "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", "langcode": "es", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", }, }, "title": "El verdadero negocio para comprar en el supermercado", "type": "node--article", }, - Object { + { "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", "langcode": "es", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", }, }, "title": "Guía Umami de nuestras setas preferidas", "type": "node--article", }, - Object { + { "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", "langcode": "es", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", }, }, "title": "Un aplauso para las zanahorias", "type": "node--article", }, - Object { + { "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", "langcode": "es", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", }, }, "title": "Percances al hornear - nuestros consejos para solucionar los problemas", "type": "node--article", }, - Object { + { "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", "langcode": "es", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", }, }, "title": "Salta los espíritus con deliciosos cócteles sin alcohol", "type": "node--article", }, - Object { + { "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", "langcode": "es", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", }, }, @@ -2678,356 +1832,141 @@ Array [ ] `; -exports[`getResourceCollectionFromContext it fetches raw data 1`] = ` -Object { - "data": Array [ - Object { - "attributes": Object { +exports[`getResourceCollection() fetches raw data 1`] = ` +{ + "data": [ + { + "attributes": { "title": "Vegan chocolate and nut brownies", }, "id": "7862d283-ece2-4ae1-8bef-865259f72315", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/7862d283-ece2-4ae1-8bef-865259f72315?resourceVersion=id%3A4", }, }, "type": "node--recipe", }, - Object { - "attributes": Object { + { + "attributes": { "title": "Super easy vegetarian pasta bake", }, "id": "8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7?resourceVersion=id%3A6", }, }, "type": "node--recipe", }, ], - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "next": Object { + "links": { + "next": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe?fields%5Bnode--recipe%5D=title&page%5Boffset%5D=2&page%5Blimit%5D=2", }, - "self": Object { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe?fields%5Bnode--recipe%5D=title&page%5Blimit%5D=2", }, }, } `; -exports[`getResourceFromContext it accepts a translated path 1`] = ` -Object { - "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", - }, - }, - "path": Object { - "alias": "/recipes/deep-mediterranean-quiche", - "langcode": "en", - "pid": 67, - }, - "status": true, - "title": "Deep mediterranean quiche - edited", - "type": "node--recipe", -} -`; - -exports[`getResourceFromContext it fetches a resource from context 1`] = ` -Object { - "changed": "2022-03-25T08:02:17+00:00", - "content_translation_outdated": false, - "content_translation_source": "und", - "created": "2022-03-21T10:52:42+00:00", - "default_langcode": true, - "drupal_internal__nid": 1, - "drupal_internal__vid": 37, - "field_cooking_time": 30, - "field_difficulty": "medium", - "field_ingredients": Array [ - "For the pastry:", - "280g plain flour", - "140g butter", - "Cold water", - "For the filling:", - "1 onion", - "2 garlic cloves", - "Half a courgette", - "450ml soya milk", - "500g grated parmesan", - "2 eggs", - "200g sun dried tomatoes", - "100g feta", - ], - "field_media_image": Object { - "id": "bbfe9d97-2da2-432b-a22c-0396c08e06ca", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 1, - }, - "type": "media--image", - }, - "field_number_of_servings": 8, - "field_preparation_time": 40, - "field_recipe_category": Array [ - Object { - "id": "a6c02fe4-67bf-462c-90cb-32281a07efe4", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 31, - }, - "type": "taxonomy_term--recipe_category", - }, - ], - "field_recipe_instruction": Object { - "format": "basic_html", - "processed": "
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. -
  3. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  4. -
  5. Whilst the pastry is cooling, chop and gently cook the onions, garlic and courgette.
  6. -
  7. In a large bowl, add the soya milk, half the parmesan, and the eggs. Gently mix.
  8. -
  9. Once the pastry is cooked, spread the onions, garlic and sun dried tomatoes over the base and pour the eggs mix over. Sprinkle the remaining parmesan and careful lay the feta over the top. Bake for 30 minutes or until golden brown.
  10. -
", - "value": "
    -
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. -
  3. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  4. -
  5. Whilst the pastry is cooling, chop and gently cook the onions, garlic and courgette.
  6. -
  7. In a large bowl, add the soya milk, half the parmesan, and the eggs. Gently mix.
  8. -
  9. Once the pastry is cooked, spread the onions, garlic and sun dried tomatoes over the base and pour the eggs mix over. Sprinkle the remaining parmesan and careful lay the feta over the top. Bake for 30 minutes or until golden brown.
  10. -
-", - }, - "field_summary": Object { - "format": "basic_html", - "processed": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

-", - "value": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

-", - }, - "field_tags": Array [ - Object { - "id": "46258827-cfad-4813-99dc-287c4cb41117", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 22, - }, - "type": "taxonomy_term--tags", - }, - Object { - "id": "f32a4d84-0568-4bfd-8be3-8217d36efb6d", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 13, - }, - "type": "taxonomy_term--tags", - }, - ], - "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "langcode": "en", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", - }, - }, - "moderation_state": "published", - "node_type": Object { - "id": "9b70a287-cade-454f-be8b-dea7b9a37c7a", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": "recipe", - }, - "type": "node_type--node_type", - }, - "path": Object { - "alias": "/recipes/deep-mediterranean-quiche", - "langcode": "en", - "pid": 67, - }, - "promote": true, - "relationshipNames": Array [ - "node_type", - "revision_uid", - "uid", - "field_media_image", - "field_recipe_category", - "field_tags", - ], - "revision_log": null, - "revision_timestamp": "2022-03-25T08:02:17+00:00", - "revision_translation_affected": true, - "revision_uid": Object { - "id": "365cc7b5-ddc4-4b3b-939e-1494400aab4a", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 1, - }, - "type": "user--user", - }, - "status": true, - "sticky": false, - "title": "Deep mediterranean quiche - edited", - "type": "node--recipe", - "uid": Object { - "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { - "drupal_internal__target_id": 4, - }, - "type": "user--user", - }, -} -`; - -exports[`getResourceFromContext it fetches a resource from context using locale 1`] = ` -Object { - "field_cooking_time": 30, - "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", - }, - }, - "title": "Quiche mediterráneo profundo", - "type": "node--recipe", -} -`; - -exports[`getResourceFromContext it fetches a resource from context with params 1`] = ` -Object { - "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", - }, - }, - "title": "Deep mediterranean quiche - edited", - "type": "node--recipe", -} -`; - -exports[`getResourceFromContext it fetches raw data 1`] = ` -Object { - "data": Object { - "attributes": Object { - "title": "Deep mediterranean quiche - edited", - }, - "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", - }, - }, - "type": "node--recipe", - }, - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { - "href": "http://jsonapi.org/format/1.0/", - }, - }, - }, - "version": "1.0", - }, - "links": Object { - "self": Object { - "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?fields%5Bnode--recipe%5D=title&resourceVersion=rel%3Alatest-version", - }, - }, -} -`; - -exports[`getSearchIndex it fetches a search index 1`] = ` -Array [ - Object { +exports[`getSearchIndex() fetches a search index 1`] = ` +[ + { "id": "3873f7b4-790c-4f93-ac7a-b4ca71272128", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/3873f7b4-790c-4f93-ac7a-b4ca71272128?resourceVersion=id%3A18", }, }, "title": "Fiery chili sauce", "type": "node--recipe", }, - Object { + { "id": "f4fff2df-1a2a-4762-be23-6b7d5755eba1", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/f4fff2df-1a2a-4762-be23-6b7d5755eba1?resourceVersion=id%3A10", }, }, "title": "Victoria sponge cake", "type": "node--recipe", }, - Object { + { "id": "20b576d2-2343-4b94-bd46-445ecc526e48", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/20b576d2-2343-4b94-bd46-445ecc526e48?resourceVersion=id%3A16", }, }, "title": "Crema catalana", "type": "node--recipe", }, - Object { + { "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, "title": "Deep mediterranean quiche - edited", "type": "node--recipe", }, - Object { + { "id": "8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7?resourceVersion=id%3A6", }, }, "title": "Super easy vegetarian pasta bake", "type": "node--recipe", }, - Object { + { "id": "84e09cbf-e33e-46bd-b40c-4dda4e00937a", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/84e09cbf-e33e-46bd-b40c-4dda4e00937a?resourceVersion=id%3A12", }, }, "title": "Gluten free pizza", "type": "node--recipe", }, - Object { + { "id": "194f2647-1fbb-42b1-9ea5-3a3eb0494e04", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/194f2647-1fbb-42b1-9ea5-3a3eb0494e04?resourceVersion=id%3A14", }, }, "title": "Thai green curry", "type": "node--recipe", }, - Object { + { "id": "7862d283-ece2-4ae1-8bef-865259f72315", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/7862d283-ece2-4ae1-8bef-865259f72315?resourceVersion=id%3A4", }, }, "title": "Vegan chocolate and nut brownies", "type": "node--recipe", }, - Object { + { "id": "0bf47bce-51c9-480e-9c24-cd0a457a4f9b", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/0bf47bce-51c9-480e-9c24-cd0a457a4f9b?resourceVersion=id%3A8", }, }, @@ -3037,110 +1976,110 @@ Array [ ] `; -exports[`getSearchIndex it fetches a search index with facets filters 1`] = ` -Object { - "data": Array [ - Object { - "attributes": Object { +exports[`getSearchIndex() fetches a search index with facets filters 1`] = ` +{ + "data": [ + { + "attributes": { "field_difficulty": "easy", "title": "Super easy vegetarian pasta bake", }, "id": "8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7?resourceVersion=id%3A6", }, }, "type": "node--recipe", }, - Object { - "attributes": Object { + { + "attributes": { "field_difficulty": "easy", "title": "Watercress soup", }, "id": "0bf47bce-51c9-480e-9c24-cd0a457a4f9b", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/0bf47bce-51c9-480e-9c24-cd0a457a4f9b?resourceVersion=id%3A8", }, }, "type": "node--recipe", }, - Object { - "attributes": Object { + { + "attributes": { "field_difficulty": "easy", "title": "Victoria sponge cake", }, "id": "f4fff2df-1a2a-4762-be23-6b7d5755eba1", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/f4fff2df-1a2a-4762-be23-6b7d5755eba1?resourceVersion=id%3A10", }, }, "type": "node--recipe", }, - Object { - "attributes": Object { + { + "attributes": { "field_difficulty": "easy", "title": "Fiery chili sauce", }, "id": "3873f7b4-790c-4f93-ac7a-b4ca71272128", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/3873f7b4-790c-4f93-ac7a-b4ca71272128?resourceVersion=id%3A18", }, }, "type": "node--recipe", }, ], - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/jsonapi/index/recipes?fields%5Bnode--recipe%5D=title%2Cfield_difficulty&filter%5Bdifficulty%5D=easy", }, }, - "meta": Object { + "meta": { "count": 8, - "facets": Array [ - Object { - "#attached": Object { - "library": Array [ + "facets": [ + { + "#attached": { + "library": [ "facets/drupal.facets.link-widget", ], }, - "#attributes": Object { - "class": Array [ + "#attributes": { + "class": [ "facet-active", "js-facets-links", ], "data-drupal-facet-alias": "difficulty", "data-drupal-facet-id": "difficulty", }, - "#context": Object { + "#context": { "list_style": "links", }, - "#facet": Object { + "#facet": { "show_title": null, }, - "#items": Array [ - Object { - "#attributes": Object { + "#items": [ + { + "#attributes": { "data-drupal-facet-item-count": 10, "data-drupal-facet-item-id": "difficulty-medium", "data-drupal-facet-item-value": "medium", }, - "#title": Object { + "#title": { "#count": 10, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3150,25 +2089,25 @@ Object { "#value": "medium", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - Object { - "#attributes": Object { - "class": Array [ + { + "#attributes": { + "class": [ "is-active", ], "data-drupal-facet-item-count": 8, "data-drupal-facet-item-id": "difficulty-easy", "data-drupal-facet-item-value": "easy", }, - "#title": Object { + "#title": { "#count": 8, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": true, @@ -3178,9 +2117,9 @@ Object { "#value": "easy", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, @@ -3188,36 +2127,36 @@ Object { ], "#theme": "facets_item_list__links__difficulty", }, - Object { - "#attached": Object { - "library": Array [ + { + "#attached": { + "library": [ "facets/drupal.facets.link-widget", ], }, - "#attributes": Object { - "class": Array [ + "#attributes": { + "class": [ "facet-inactive", "js-facets-links", ], "data-drupal-facet-alias": "recipe_category", "data-drupal-facet-id": "recipe_category", }, - "#context": Object { + "#context": { "list_style": "links", }, - "#facet": Object { + "#facet": { "show_title": null, }, - "#items": Array [ - Object { - "#attributes": Object { + "#items": [ + { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "recipe-category-29", "data-drupal-facet-item-value": "29", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3227,22 +2166,22 @@ Object { "#value": "29", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - Object { - "#attributes": Object { + { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "recipe-category-30", "data-drupal-facet-item-value": "30", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3252,22 +2191,22 @@ Object { "#value": "30", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - Object { - "#attributes": Object { + { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "recipe-category-31", "data-drupal-facet-item-value": "31", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3277,22 +2216,22 @@ Object { "#value": "31", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - Object { - "#attributes": Object { + { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "recipe-category-33", "data-drupal-facet-item-value": "33", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3302,9 +2241,9 @@ Object { "#value": "33", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, @@ -3312,36 +2251,36 @@ Object { ], "#theme": "facets_item_list__links__recipe_category", }, - Object { - "#attached": Object { - "library": Array [ + { + "#attached": { + "library": [ "facets/drupal.facets.link-widget", ], }, - "#attributes": Object { - "class": Array [ + "#attributes": { + "class": [ "facet-inactive", "js-facets-links", ], "data-drupal-facet-alias": "title", "data-drupal-facet-id": "title", }, - "#context": Object { + "#context": { "list_style": "links", }, - "#facet": Object { + "#facet": { "show_title": null, }, - "#items": Object { - "0": Object { - "#attributes": Object { + "#items": { + "0": { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "title-de", "data-drupal-facet-item-value": "de", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3351,22 +2290,22 @@ Object { "#value": "de", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "1": Object { - "#attributes": Object { + "1": { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "title-pasta", "data-drupal-facet-item-value": "pasta", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3376,22 +2315,22 @@ Object { "#value": "pasta", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "10": Object { - "#attributes": Object { + "10": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-easy", "data-drupal-facet-item-value": "easy", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3401,22 +2340,22 @@ Object { "#value": "easy", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "11": Object { - "#attributes": Object { + "11": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-fiery", "data-drupal-facet-item-value": "fiery", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3426,22 +2365,22 @@ Object { "#value": "fiery", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "12": Object { - "#attributes": Object { + "12": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-fácil", "data-drupal-facet-item-value": "fácil", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3451,22 +2390,22 @@ Object { "#value": "fácil", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "13": Object { - "#attributes": Object { + "13": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-horno", "data-drupal-facet-item-value": "horno", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3476,22 +2415,22 @@ Object { "#value": "horno", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "14": Object { - "#attributes": Object { + "14": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-pastel", "data-drupal-facet-item-value": "pastel", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3501,22 +2440,22 @@ Object { "#value": "pastel", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "15": Object { - "#attributes": Object { + "15": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-salsa", "data-drupal-facet-item-value": "salsa", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3526,22 +2465,22 @@ Object { "#value": "salsa", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "16": Object { - "#attributes": Object { + "16": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-sauce", "data-drupal-facet-item-value": "sauce", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3551,22 +2490,22 @@ Object { "#value": "sauce", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "17": Object { - "#attributes": Object { + "17": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-sopa", "data-drupal-facet-item-value": "sopa", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3576,22 +2515,22 @@ Object { "#value": "sopa", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "18": Object { - "#attributes": Object { + "18": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-soup", "data-drupal-facet-item-value": "soup", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3601,22 +2540,22 @@ Object { "#value": "soup", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "19": Object { - "#attributes": Object { + "19": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-sponge", "data-drupal-facet-item-value": "sponge", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3626,22 +2565,22 @@ Object { "#value": "sponge", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "2": Object { - "#attributes": Object { + "2": { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "title-victoria", "data-drupal-facet-item-value": "victoria", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3651,22 +2590,22 @@ Object { "#value": "victoria", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "20": Object { - "#attributes": Object { + "20": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-super", "data-drupal-facet-item-value": "super", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3676,22 +2615,22 @@ Object { "#value": "super", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "21": Object { - "#attributes": Object { + "21": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-súper", "data-drupal-facet-item-value": "súper", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3701,22 +2640,22 @@ Object { "#value": "súper", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "22": Object { - "#attributes": Object { + "22": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-vegetarian", "data-drupal-facet-item-value": "vegetarian", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3726,22 +2665,22 @@ Object { "#value": "vegetarian", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "23": Object { - "#attributes": Object { + "23": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-vegetariana", "data-drupal-facet-item-value": "vegetariana", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3751,22 +2690,22 @@ Object { "#value": "vegetariana", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "24": Object { - "#attributes": Object { + "24": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-watercress", "data-drupal-facet-item-value": "watercress", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3776,22 +2715,22 @@ Object { "#value": "watercress", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "3": Object { - "#attributes": Object { + "3": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-al", "data-drupal-facet-item-value": "al", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3801,22 +2740,22 @@ Object { "#value": "al", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "4": Object { - "#attributes": Object { + "4": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-ardiente", "data-drupal-facet-item-value": "ardiente", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3826,22 +2765,22 @@ Object { "#value": "ardiente", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "5": Object { - "#attributes": Object { + "5": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-bake", "data-drupal-facet-item-value": "bake", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3851,22 +2790,22 @@ Object { "#value": "bake", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "6": Object { - "#attributes": Object { + "6": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-berro", "data-drupal-facet-item-value": "berro", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3876,22 +2815,22 @@ Object { "#value": "berro", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "7": Object { - "#attributes": Object { + "7": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-cake", "data-drupal-facet-item-value": "cake", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3901,22 +2840,22 @@ Object { "#value": "cake", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "8": Object { - "#attributes": Object { + "8": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-chile", "data-drupal-facet-item-value": "chile", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3926,22 +2865,22 @@ Object { "#value": "chile", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "9": Object { - "#attributes": Object { + "9": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-chili", "data-drupal-facet-item-value": "chili", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -3951,9 +2890,9 @@ Object { "#value": "chili", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, @@ -3966,92 +2905,92 @@ Object { } `; -exports[`getSearchIndex it fetches a search index with locale 1`] = ` -Array [ - Object { +exports[`getSearchIndex() fetches a search index with locale 1`] = ` +[ + { "id": "3873f7b4-790c-4f93-ac7a-b4ca71272128", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/3873f7b4-790c-4f93-ac7a-b4ca71272128?resourceVersion=id%3A18", }, }, "title": "Salsa de chile ardiente", "type": "node--recipe", }, - Object { + { "id": "f4fff2df-1a2a-4762-be23-6b7d5755eba1", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/f4fff2df-1a2a-4762-be23-6b7d5755eba1?resourceVersion=id%3A10", }, }, "title": "Pastel Victoria", "type": "node--recipe", }, - Object { + { "id": "20b576d2-2343-4b94-bd46-445ecc526e48", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/20b576d2-2343-4b94-bd46-445ecc526e48?resourceVersion=id%3A16", }, }, "title": "Crema catalana", "type": "node--recipe", }, - Object { + { "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", }, }, "title": "Quiche mediterráneo profundo", "type": "node--recipe", }, - Object { + { "id": "8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7?resourceVersion=id%3A6", }, }, "title": "Pasta vegetariana al horno súper fácil", "type": "node--recipe", }, - Object { + { "id": "84e09cbf-e33e-46bd-b40c-4dda4e00937a", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/84e09cbf-e33e-46bd-b40c-4dda4e00937a?resourceVersion=id%3A12", }, }, "title": "Pizza sin gluten", "type": "node--recipe", }, - Object { + { "id": "194f2647-1fbb-42b1-9ea5-3a3eb0494e04", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/194f2647-1fbb-42b1-9ea5-3a3eb0494e04?resourceVersion=id%3A14", }, }, "title": "Curry verde tailandés", "type": "node--recipe", }, - Object { + { "id": "7862d283-ece2-4ae1-8bef-865259f72315", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/7862d283-ece2-4ae1-8bef-865259f72315?resourceVersion=id%3A4", }, }, "title": "Bizcochos veganos de chocolate y nueces", "type": "node--recipe", }, - Object { + { "id": "0bf47bce-51c9-480e-9c24-cd0a457a4f9b", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/0bf47bce-51c9-480e-9c24-cd0a457a4f9b?resourceVersion=id%3A8", }, }, @@ -4061,110 +3000,110 @@ Array [ ] `; -exports[`getSearchIndex it fetches raw data from search index 1`] = ` -Object { - "data": Array [ - Object { - "attributes": Object { +exports[`getSearchIndex() fetches raw data from search index 1`] = ` +{ + "data": [ + { + "attributes": { "field_difficulty": "easy", "title": "Super easy vegetarian pasta bake", }, "id": "8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7?resourceVersion=id%3A6", }, }, "type": "node--recipe", }, - Object { - "attributes": Object { + { + "attributes": { "field_difficulty": "easy", "title": "Watercress soup", }, "id": "0bf47bce-51c9-480e-9c24-cd0a457a4f9b", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/0bf47bce-51c9-480e-9c24-cd0a457a4f9b?resourceVersion=id%3A8", }, }, "type": "node--recipe", }, - Object { - "attributes": Object { + { + "attributes": { "field_difficulty": "easy", "title": "Victoria sponge cake", }, "id": "f4fff2df-1a2a-4762-be23-6b7d5755eba1", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/f4fff2df-1a2a-4762-be23-6b7d5755eba1?resourceVersion=id%3A10", }, }, "type": "node--recipe", }, - Object { - "attributes": Object { + { + "attributes": { "field_difficulty": "easy", "title": "Fiery chili sauce", }, "id": "3873f7b4-790c-4f93-ac7a-b4ca71272128", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/3873f7b4-790c-4f93-ac7a-b4ca71272128?resourceVersion=id%3A18", }, }, "type": "node--recipe", }, ], - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/jsonapi/index/recipes?fields%5Bnode--recipe%5D=title%2Cfield_difficulty&filter%5Bdifficulty%5D=easy", }, }, - "meta": Object { + "meta": { "count": 8, - "facets": Array [ - Object { - "#attached": Object { - "library": Array [ + "facets": [ + { + "#attached": { + "library": [ "facets/drupal.facets.link-widget", ], }, - "#attributes": Object { - "class": Array [ + "#attributes": { + "class": [ "facet-active", "js-facets-links", ], "data-drupal-facet-alias": "difficulty", "data-drupal-facet-id": "difficulty", }, - "#context": Object { + "#context": { "list_style": "links", }, - "#facet": Object { + "#facet": { "show_title": null, }, - "#items": Array [ - Object { - "#attributes": Object { + "#items": [ + { + "#attributes": { "data-drupal-facet-item-count": 10, "data-drupal-facet-item-id": "difficulty-medium", "data-drupal-facet-item-value": "medium", }, - "#title": Object { + "#title": { "#count": 10, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4174,25 +3113,25 @@ Object { "#value": "medium", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - Object { - "#attributes": Object { - "class": Array [ + { + "#attributes": { + "class": [ "is-active", ], "data-drupal-facet-item-count": 8, "data-drupal-facet-item-id": "difficulty-easy", "data-drupal-facet-item-value": "easy", }, - "#title": Object { + "#title": { "#count": 8, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": true, @@ -4202,9 +3141,9 @@ Object { "#value": "easy", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, @@ -4212,36 +3151,36 @@ Object { ], "#theme": "facets_item_list__links__difficulty", }, - Object { - "#attached": Object { - "library": Array [ + { + "#attached": { + "library": [ "facets/drupal.facets.link-widget", ], }, - "#attributes": Object { - "class": Array [ + "#attributes": { + "class": [ "facet-inactive", "js-facets-links", ], "data-drupal-facet-alias": "recipe_category", "data-drupal-facet-id": "recipe_category", }, - "#context": Object { + "#context": { "list_style": "links", }, - "#facet": Object { + "#facet": { "show_title": null, }, - "#items": Array [ - Object { - "#attributes": Object { + "#items": [ + { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "recipe-category-29", "data-drupal-facet-item-value": "29", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4251,22 +3190,22 @@ Object { "#value": "29", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - Object { - "#attributes": Object { + { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "recipe-category-30", "data-drupal-facet-item-value": "30", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4276,22 +3215,22 @@ Object { "#value": "30", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - Object { - "#attributes": Object { + { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "recipe-category-31", "data-drupal-facet-item-value": "31", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4301,22 +3240,22 @@ Object { "#value": "31", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - Object { - "#attributes": Object { + { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "recipe-category-33", "data-drupal-facet-item-value": "33", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4326,9 +3265,9 @@ Object { "#value": "33", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, @@ -4336,36 +3275,36 @@ Object { ], "#theme": "facets_item_list__links__recipe_category", }, - Object { - "#attached": Object { - "library": Array [ + { + "#attached": { + "library": [ "facets/drupal.facets.link-widget", ], }, - "#attributes": Object { - "class": Array [ + "#attributes": { + "class": [ "facet-inactive", "js-facets-links", ], "data-drupal-facet-alias": "title", "data-drupal-facet-id": "title", }, - "#context": Object { + "#context": { "list_style": "links", }, - "#facet": Object { + "#facet": { "show_title": null, }, - "#items": Object { - "0": Object { - "#attributes": Object { + "#items": { + "0": { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "title-de", "data-drupal-facet-item-value": "de", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4375,22 +3314,22 @@ Object { "#value": "de", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "1": Object { - "#attributes": Object { + "1": { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "title-pasta", "data-drupal-facet-item-value": "pasta", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4400,22 +3339,22 @@ Object { "#value": "pasta", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "10": Object { - "#attributes": Object { + "10": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-easy", "data-drupal-facet-item-value": "easy", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4425,22 +3364,22 @@ Object { "#value": "easy", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "11": Object { - "#attributes": Object { + "11": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-fiery", "data-drupal-facet-item-value": "fiery", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4450,22 +3389,22 @@ Object { "#value": "fiery", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "12": Object { - "#attributes": Object { + "12": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-fácil", "data-drupal-facet-item-value": "fácil", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4475,22 +3414,22 @@ Object { "#value": "fácil", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "13": Object { - "#attributes": Object { + "13": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-horno", "data-drupal-facet-item-value": "horno", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4500,22 +3439,22 @@ Object { "#value": "horno", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "14": Object { - "#attributes": Object { + "14": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-pastel", "data-drupal-facet-item-value": "pastel", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4525,22 +3464,22 @@ Object { "#value": "pastel", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "15": Object { - "#attributes": Object { + "15": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-salsa", "data-drupal-facet-item-value": "salsa", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4550,22 +3489,22 @@ Object { "#value": "salsa", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "16": Object { - "#attributes": Object { + "16": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-sauce", "data-drupal-facet-item-value": "sauce", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4575,22 +3514,22 @@ Object { "#value": "sauce", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "17": Object { - "#attributes": Object { + "17": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-sopa", "data-drupal-facet-item-value": "sopa", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4600,22 +3539,22 @@ Object { "#value": "sopa", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "18": Object { - "#attributes": Object { + "18": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-soup", "data-drupal-facet-item-value": "soup", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4625,22 +3564,22 @@ Object { "#value": "soup", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "19": Object { - "#attributes": Object { + "19": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-sponge", "data-drupal-facet-item-value": "sponge", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4650,22 +3589,22 @@ Object { "#value": "sponge", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "2": Object { - "#attributes": Object { + "2": { + "#attributes": { "data-drupal-facet-item-count": 2, "data-drupal-facet-item-id": "title-victoria", "data-drupal-facet-item-value": "victoria", }, - "#title": Object { + "#title": { "#count": 2, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4675,22 +3614,22 @@ Object { "#value": "victoria", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "20": Object { - "#attributes": Object { + "20": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-super", "data-drupal-facet-item-value": "super", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4700,22 +3639,22 @@ Object { "#value": "super", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "21": Object { - "#attributes": Object { + "21": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-súper", "data-drupal-facet-item-value": "súper", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4725,22 +3664,22 @@ Object { "#value": "súper", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "22": Object { - "#attributes": Object { + "22": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-vegetarian", "data-drupal-facet-item-value": "vegetarian", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4750,22 +3689,22 @@ Object { "#value": "vegetarian", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "23": Object { - "#attributes": Object { + "23": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-vegetariana", "data-drupal-facet-item-value": "vegetariana", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4775,22 +3714,22 @@ Object { "#value": "vegetariana", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "24": Object { - "#attributes": Object { + "24": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-watercress", "data-drupal-facet-item-value": "watercress", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4800,22 +3739,22 @@ Object { "#value": "watercress", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "3": Object { - "#attributes": Object { + "3": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-al", "data-drupal-facet-item-value": "al", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4825,22 +3764,22 @@ Object { "#value": "al", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "4": Object { - "#attributes": Object { + "4": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-ardiente", "data-drupal-facet-item-value": "ardiente", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4850,22 +3789,22 @@ Object { "#value": "ardiente", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "5": Object { - "#attributes": Object { + "5": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-bake", "data-drupal-facet-item-value": "bake", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4875,22 +3814,22 @@ Object { "#value": "bake", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "6": Object { - "#attributes": Object { + "6": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-berro", "data-drupal-facet-item-value": "berro", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4900,22 +3839,22 @@ Object { "#value": "berro", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "7": Object { - "#attributes": Object { + "7": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-cake", "data-drupal-facet-item-value": "cake", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4925,22 +3864,22 @@ Object { "#value": "cake", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "8": Object { - "#attributes": Object { + "8": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-chile", "data-drupal-facet-item-value": "chile", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4950,22 +3889,22 @@ Object { "#value": "chile", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, }, - "9": Object { - "#attributes": Object { + "9": { + "#attributes": { "data-drupal-facet-item-count": 1, "data-drupal-facet-item-id": "title-chili", "data-drupal-facet-item-value": "chili", }, - "#title": Object { + "#title": { "#count": 1, - "#facet": Object { + "#facet": { "show_title": null, }, "#is_active": false, @@ -4975,9 +3914,9 @@ Object { "#value": "chili", }, "#type": "link", - "#url": Object {}, - "#wrapper_attributes": Object { - "class": Array [ + "#url": {}, + "#wrapper_attributes": { + "class": [ "facet-item", ], }, @@ -4990,618 +3929,20 @@ Object { } `; -exports[`getStaticPathsFromContext it returns static paths for multiple resource types from context 1`] = ` -Array [ - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "give-it-a-go-and-grow-your-own-herbs", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "dairy-free-and-delicious-milk-chocolate", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "the-real-deal-for-supermarket-savvy-shopping", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "the-umami-guide-to-our-favourite-mushrooms", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "lets-hear-it-for-carrots", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "baking-mishaps-our-troubleshooting-tips", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "skip-the-spirits-with-delicious-mocktails", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "give-your-oatmeal-the-ultimate-makeover", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "prueba-y-cultiva-tus-propias-hierbas", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "delicioso-chocolate-sin-lactosa", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "el-verdadeo-negocio-para-comprar-en-el-supermercado", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "guia-umami-de-nuestras-setas-preferidas", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "un-aplauso-para-las-zanahorias", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "percances-al-hornear-nuestros-consejos-para-solucionar-problemas", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "salta-los-espiritus-con-deliciosos-cocteles-sin-alcohol", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "dale-a-tu-avena-el-cambio-de-imagen-definitivo", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "vegan-chocolate-and-nut-brownies", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "super-easy-vegetarian-pasta-bake", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "watercress-soup", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "victoria-sponge-cake", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "gluten-free-pizza", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "thai-green-curry", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "crema-catalana", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "fiery-chili-sauce", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "recipes", - "deep-mediterranean-quiche", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "bizcochos-veganos-de-chocolate-y-nueces", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "pasta-vegetariana-horno-super-facil", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "sopa-de-berro", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "pastel-victoria", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "pizza-sin-gluten", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "curry-verde-tailandes", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "crema-catalana", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "salsa-de-chile-ardiente", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "recipes", - "quiche-mediterráneo-profundo", - ], - }, - }, -] -`; - -exports[`getStaticPathsFromContext it returns static paths from context 1`] = ` -Array [ - Object { - "params": Object { - "slug": Array [ - "articles", - "give-it-a-go-and-grow-your-own-herbs", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "dairy-free-and-delicious-milk-chocolate", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "the-real-deal-for-supermarket-savvy-shopping", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "the-umami-guide-to-our-favourite-mushrooms", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "lets-hear-it-for-carrots", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "baking-mishaps-our-troubleshooting-tips", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "skip-the-spirits-with-delicious-mocktails", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "give-your-oatmeal-the-ultimate-makeover", - ], - }, - }, -] -`; - -exports[`getStaticPathsFromContext it returns static paths from context with locale 1`] = ` -Array [ - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "give-it-a-go-and-grow-your-own-herbs", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "dairy-free-and-delicious-milk-chocolate", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "the-real-deal-for-supermarket-savvy-shopping", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "the-umami-guide-to-our-favourite-mushrooms", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "lets-hear-it-for-carrots", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "baking-mishaps-our-troubleshooting-tips", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "skip-the-spirits-with-delicious-mocktails", - ], - }, - }, - Object { - "locale": "en", - "params": Object { - "slug": Array [ - "articles", - "give-your-oatmeal-the-ultimate-makeover", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "prueba-y-cultiva-tus-propias-hierbas", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "delicioso-chocolate-sin-lactosa", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "el-verdadeo-negocio-para-comprar-en-el-supermercado", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "guia-umami-de-nuestras-setas-preferidas", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "un-aplauso-para-las-zanahorias", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "percances-al-hornear-nuestros-consejos-para-solucionar-problemas", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "salta-los-espiritus-con-deliciosos-cocteles-sin-alcohol", - ], - }, - }, - Object { - "locale": "es", - "params": Object { - "slug": Array [ - "articles", - "dale-a-tu-avena-el-cambio-de-imagen-definitivo", - ], - }, - }, -] -`; - -exports[`getStaticPathsFromContext it returns static paths from context with params 1`] = ` -Array [ - Object { - "params": Object { - "slug": Array [ - "articles", - "give-it-a-go-and-grow-your-own-herbs", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "dairy-free-and-delicious-milk-chocolate", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "the-real-deal-for-supermarket-savvy-shopping", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "the-umami-guide-to-our-favourite-mushrooms", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "lets-hear-it-for-carrots", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "baking-mishaps-our-troubleshooting-tips", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "skip-the-spirits-with-delicious-mocktails", - ], - }, - }, - Object { - "params": Object { - "slug": Array [ - "articles", - "give-your-oatmeal-the-ultimate-makeover", - ], - }, - }, -] -`; - -exports[`getView it fetches a view 1`] = ` -Object { +exports[`getView() fetches a view 1`] = ` +{ "id": "featured_articles--page_1", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/jsonapi/views/featured_articles/page_1", }, }, - "meta": Object { + "meta": { "count": 8, }, - "results": Array [ - Object { - "body": Object { + "results": [ + { + "body": { "format": "basic_html", "processed": "

There's nothing like having your own supply of fresh herbs, readily available and close at hand to use while cooking. Whether you have a large garden or a small kitchen window sill, there's always enough room for something home grown.

Outdoors

@@ -5644,31 +3985,31 @@ Object { "default_langcode": true, "drupal_internal__nid": 10, "drupal_internal__vid": 20, - "field_media_image": Object { + "field_media_image": { "id": "e5091a16-134e-400d-8393-cfe4eccbcaa2", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 10, }, "type": "media--image", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "dcd81647-71b7-48cb-b555-e20322bcb7a7", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 14, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "60d20a4c-9d42-4b25-b717-3af3cba6abe8", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 23, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "57a1d9f6-23a6-4215-a8a9-582202cd938d", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 16, }, "type": "taxonomy_term--tags", @@ -5676,26 +4017,26 @@ Object { ], "id": "52837ad0-f218-46bd-a106-5710336b7053", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/articles/give-it-a-go-and-grow-your-own-herbs", "langcode": "en", "pid": 85, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -5705,9 +4046,9 @@ Object { "revision_log": null, "revision_timestamp": "2022-03-21T10:52:42+00:00", "revision_translation_affected": null, - "revision_uid": Object { + "revision_uid": { "id": "dd9c916d-4d66-4bff-a851-eeba0cf7673a", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 5, }, "type": "user--user", @@ -5716,16 +4057,16 @@ Object { "sticky": false, "title": "Give it a go and grow your own herbs", "type": "node--article", - "uid": Object { + "uid": { "id": "dd9c916d-4d66-4bff-a851-eeba0cf7673a", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 5, }, "type": "user--user", }, }, - Object { - "body": Object { + { + "body": { "format": "basic_html", "processed": "

The calendar is full of excuses for chocolate-lovers to indulge, from religious festivals to birthdays - and even World Chocolate Day on the 7th July. But for those who are vegan, or on dairy-free diets, there is no need to miss out, because there are plenty of delicious vegan chocolate varieties on offer.

Dairy-free milk chocolate is made in largely the same way as regular chocolate, until the point when the milk is added. Cacao beans are roasted for a couple of hours until they develop a rich flavor. The outer shells are removed, and the interior nibs are ground to make a paste that can be mixed with cocoa butter to produce the desired percentage of chocolate. Flavorings, sugar and milk are added in different quantities to get the type of chocolate being produced. The chocolate is grainy at this point and needs to be mashed until it is smooth - this can take days! Finally, it is tempered through a process of heating and cooling until it is ready to eat.

@@ -5762,24 +4103,24 @@ Object { "default_langcode": true, "drupal_internal__nid": 11, "drupal_internal__vid": 22, - "field_media_image": Object { + "field_media_image": { "id": "8427a15e-771b-405c-b887-3f712973c006", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 11, }, "type": "media--image", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "a47d1f3a-cc76-4d32-bffe-baf1ed2ee8a3", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 27, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "7b732cc1-c963-498f-91ae-c429059a3cdc", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 7, }, "type": "taxonomy_term--tags", @@ -5787,26 +4128,26 @@ Object { ], "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/articles/dairy-free-and-delicious-milk-chocolate", "langcode": "en", "pid": 87, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -5816,9 +4157,9 @@ Object { "revision_log": null, "revision_timestamp": "2022-03-21T10:52:42+00:00", "revision_translation_affected": null, - "revision_uid": Object { + "revision_uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", @@ -5827,16 +4168,16 @@ Object { "sticky": false, "title": "Dairy-free and delicious milk chocolate", "type": "node--article", - "uid": Object { + "uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", }, }, - Object { - "body": Object { + { + "body": { "format": "basic_html", "processed": "

This may not surprise you - but your supermarket is a hot bed of marketing mayhem, designed to improve their profit and to encourage the consumer to spend more than they intended. The tricks that all supermarkets employ are sometimes sensible ploys that any retailer should do to improve sales - but some may be more subtle and less obvious than you might think.

With consumer awareness articles and documentaries frequently picking up on this topic, it's likely the case that retailers find it harder to get away with the more obvious ploys. We are becoming ever more savvy consumers and there's probably not a great deal that gets past us. But here's a few retail tricks to keep in mind when you are rushing around the weekly supermarket stock-up.

@@ -5880,24 +4221,24 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "default_langcode": true, "drupal_internal__nid": 12, "drupal_internal__vid": 24, - "field_media_image": Object { + "field_media_image": { "id": "2c9a045b-ee1a-4664-86de-4328d891a444", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 12, }, "type": "media--image", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "3dd82cec-a0ad-44ae-b5aa-b22b29ca9e9c", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 26, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "4b1d0dcc-3fc7-4946-8702-00c04688b790", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 24, }, "type": "taxonomy_term--tags", @@ -5905,26 +4246,26 @@ Our tip: Make your shopping list before leaving the house, checking what you nee ], "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/articles/the-real-deal-for-supermarket-savvy-shopping", "langcode": "en", "pid": 89, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -5934,9 +4275,9 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "revision_log": null, "revision_timestamp": "2022-03-21T10:52:42+00:00", "revision_translation_affected": null, - "revision_uid": Object { + "revision_uid": { "id": "cddd2eed-95b6-4261-8de1-d09958a079e7", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 6, }, "type": "user--user", @@ -5945,16 +4286,16 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "sticky": false, "title": "The real deal for supermarket savvy shopping", "type": "node--article", - "uid": Object { + "uid": { "id": "cddd2eed-95b6-4261-8de1-d09958a079e7", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 6, }, "type": "user--user", }, }, - Object { - "body": Object { + { + "body": { "format": "basic_html", "processed": "

We think mushrooms are one of the most enjoyable ingredients to cook with. There are plenty of edible varieties to try, each with their own distinctive shape, size, and taste. And with curious names such as chanterelle, the gypsy, horn of plenty, or hen of the woods, who wouldn't want to know more about cooking with the mighty mushroom?

One of the best things about mushrooms is their versatility. They can be fried, roasted, grilled, steamed, or even cooked in the microwave. And they can be served as the main ingredient for a dish, or simply added as part of the mix. This makes mushrooms an ideal choice for creating absolutely delicious vegetarian dishes.

@@ -5981,24 +4322,24 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "default_langcode": true, "drupal_internal__nid": 13, "drupal_internal__vid": 26, - "field_media_image": Object { + "field_media_image": { "id": "cea9398a-a669-4465-92c4-546fd43f7eb3", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 13, }, "type": "media--image", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "c8baa7f8-245e-45c6-b26c-8456c5c87190", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 18, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "f19c842c-17ec-47e8-9079-44afda5ed90d", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 28, }, "type": "taxonomy_term--tags", @@ -6006,26 +4347,26 @@ Our tip: Make your shopping list before leaving the house, checking what you nee ], "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/articles/the-umami-guide-to-our-favourite-mushrooms", "langcode": "en", "pid": 91, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -6035,9 +4376,9 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "revision_log": null, "revision_timestamp": "2022-03-21T10:52:42+00:00", "revision_translation_affected": null, - "revision_uid": Object { + "revision_uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", @@ -6046,16 +4387,16 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "sticky": false, "title": "The Umami guide to our favorite mushrooms", "type": "node--article", - "uid": Object { + "uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", }, }, - Object { - "body": Object { + { + "body": { "format": "basic_html", "processed": "

Let's hear it for the humble carrot! This sweet and healthy ‘everyday’ veg packs it all in. Great flavor, fantastic color, and if you're one for believing the old story, they can even help you to see better in the dark.

Who doesn't love cooking with this super versatile root veg? We roast them, boil them, blend them into soups, and grate them into salads. The humble carrot has to be one of our favorite veg choices and it's been grown for thousands of years. But back then you were more likely to find a purple, red, yellow or white carrot and not the orange one we are all so familiar with today.

@@ -6090,31 +4431,31 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "default_langcode": true, "drupal_internal__nid": 14, "drupal_internal__vid": 28, - "field_media_image": Object { + "field_media_image": { "id": "f40adf47-e201-421a-968f-65221d09d4ce", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 14, }, "type": "media--image", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "83a40a0b-b420-40d5-9a30-aedd15a87cde", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 6, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "f19c842c-17ec-47e8-9079-44afda5ed90d", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 28, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "359d7eee-03f0-420f-8c65-30dcc51cdafe", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 15, }, "type": "taxonomy_term--tags", @@ -6122,26 +4463,26 @@ Our tip: Make your shopping list before leaving the house, checking what you nee ], "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/articles/lets-hear-it-for-carrots", "langcode": "en", "pid": 93, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -6151,9 +4492,9 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "revision_log": null, "revision_timestamp": "2022-03-21T10:52:42+00:00", "revision_translation_affected": null, - "revision_uid": Object { + "revision_uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", @@ -6162,16 +4503,16 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "sticky": false, "title": "Let's hear it for carrots", "type": "node--article", - "uid": Object { + "uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", }, }, - Object { - "body": Object { + { + "body": { "format": "basic_html", "processed": "

You follow the recipe, you weigh all your ingredients, you use the right oven temperature and you take your time and yet still, your baking comes out with a soggy bottom, fails to rise or just tastes plain horrible. We have come up with a list of the most frustrating baking problems and the techniques you can use to try and avoid them.

Your cake failed to rise

@@ -6210,24 +4551,24 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "default_langcode": true, "drupal_internal__nid": 15, "drupal_internal__vid": 30, - "field_media_image": Object { + "field_media_image": { "id": "73b0659f-323b-4391-bf53-f650ab1ec9d3", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 15, }, "type": "media--image", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "c504fd5e-2422-452f-9f89-d001079329fa", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 3, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "500189ad-65ee-4b9b-93f0-748a297c0134", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 17, }, "type": "taxonomy_term--tags", @@ -6235,26 +4576,26 @@ Our tip: Make your shopping list before leaving the house, checking what you nee ], "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/articles/baking-mishaps-our-troubleshooting-tips", "langcode": "en", "pid": 95, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -6264,9 +4605,9 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "revision_log": null, "revision_timestamp": "2022-03-21T10:52:42+00:00", "revision_translation_affected": null, - "revision_uid": Object { + "revision_uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", @@ -6275,16 +4616,16 @@ Our tip: Make your shopping list before leaving the house, checking what you nee "sticky": false, "title": "Baking mishaps - our troubleshooting tips", "type": "node--article", - "uid": Object { + "uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", }, }, - Object { - "body": Object { + { + "body": { "format": "basic_html", "processed": "

Having a cocktail party? Then why not serve up something just as special for those who don't drink alcohol but do want to join in on all the fun? After all, what cocktail party is complete without those incredible looking glasses of mixed fruits, bright colors and of course, the little umbrellas? Do your bit for the environment by ditching the plastic straws and get hold of some great looking alternatives made out of glass, metal, or even bamboo. Don't forget the classic cocktail glasses and cool tumblers to really bring these recipes to life.

@@ -6339,45 +4680,45 @@ So, grab the cocktail mixer, skip the spirits, and shake up these deliciously re "default_langcode": true, "drupal_internal__nid": 16, "drupal_internal__vid": 32, - "field_media_image": Object { + "field_media_image": { "id": "e1950c46-ec1a-4a93-a761-6705342c0e04", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 16, }, "type": "media--image", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "77c4a26a-ce8d-44be-a098-e0bedd11f9f0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 1, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "d2ceae46-6cc5-4891-b67f-b896d1055bcf", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 12, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "606fa8a9-b565-45d2-bd18-6ffb256459c3", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 20, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "14edf86c-8dfb-4da8-9632-2d72b36f622f", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 8, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "a1bd5b9e-ba25-4a37-a44d-a6ab51f70334", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 11, }, "type": "taxonomy_term--tags", @@ -6385,26 +4726,26 @@ So, grab the cocktail mixer, skip the spirits, and shake up these deliciously re ], "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/articles/skip-the-spirits-with-delicious-mocktails", "langcode": "en", "pid": 97, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -6414,9 +4755,9 @@ So, grab the cocktail mixer, skip the spirits, and shake up these deliciously re "revision_log": null, "revision_timestamp": "2022-03-21T10:52:42+00:00", "revision_translation_affected": null, - "revision_uid": Object { + "revision_uid": { "id": "cddd2eed-95b6-4261-8de1-d09958a079e7", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 6, }, "type": "user--user", @@ -6425,16 +4766,16 @@ So, grab the cocktail mixer, skip the spirits, and shake up these deliciously re "sticky": false, "title": "Skip the spirits with delicious mocktails", "type": "node--article", - "uid": Object { + "uid": { "id": "cddd2eed-95b6-4261-8de1-d09958a079e7", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 6, }, "type": "user--user", }, }, - Object { - "body": Object { + { + "body": { "format": "basic_html", "processed": "

It is vegan, gluten-free, low in fat, high in fiber, and can even lower cholesterol - but oatmeal is boring, right? Well, before you write off that boring jar of oats, you might want to take inspiration from our topping ideas that will take your oatmeal from bland to creatively delicious in just a few minutes. @@ -6519,45 +4860,45 @@ This low-sugar delight will meet all of those chocolate cravings and is the perf "default_langcode": true, "drupal_internal__nid": 17, "drupal_internal__vid": 34, - "field_media_image": Object { + "field_media_image": { "id": "fef8de9e-7e41-4fa7-a58f-7f54db52ffe3", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 17, }, "type": "media--image", }, - "field_tags": Array [ - Object { + "field_tags": [ + { "id": "a47d1f3a-cc76-4d32-bffe-baf1ed2ee8a3", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 27, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "f19c842c-17ec-47e8-9079-44afda5ed90d", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 28, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "f775118a-6c20-482e-9117-20314c76f2a3", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 19, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "0a31fa5c-3b1d-40b0-9841-2f607fe35272", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "taxonomy_term--tags", }, - Object { + { "id": "eaf76dc5-7988-48cc-8c5b-d240f86d0acc", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 10, }, "type": "taxonomy_term--tags", @@ -6565,26 +4906,26 @@ This low-sugar delight will meet all of those chocolate cravings and is the perf ], "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", "langcode": "en", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", }, }, "moderation_state": "published", - "node_type": Object { + "node_type": { "id": "a145b65a-e660-4f5d-ac0d-bd2ff9e3f0b0", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": "article", }, "type": "node_type--node_type", }, - "path": Object { + "path": { "alias": "/articles/give-your-oatmeal-the-ultimate-makeover", "langcode": "en", "pid": 99, }, "promote": true, - "relationshipNames": Array [ + "relationshipNames": [ "node_type", "revision_uid", "uid", @@ -6594,9 +4935,9 @@ This low-sugar delight will meet all of those chocolate cravings and is the perf "revision_log": null, "revision_timestamp": "2022-03-21T10:52:42+00:00", "revision_translation_affected": null, - "revision_uid": Object { + "revision_uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", @@ -6605,9 +4946,9 @@ This low-sugar delight will meet all of those chocolate cravings and is the perf "sticky": false, "title": "Give your oatmeal the ultimate makeover", "type": "node--article", - "uid": Object { + "uid": { "id": "9e4944e8-dd77-407a-8610-83e823b48b56", - "resourceIdObjMeta": Object { + "resourceIdObjMeta": { "drupal_internal__target_id": 4, }, "type": "user--user", @@ -6617,92 +4958,92 @@ This low-sugar delight will meet all of those chocolate cravings and is the perf } `; -exports[`getView it fetches a view with locale 1`] = ` -Object { +exports[`getView() fetches a view with locale 1`] = ` +{ "id": "featured_articles--page_1", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/views/featured_articles/page_1?fields%5Bnode--article%5D=title", }, }, - "meta": Object { + "meta": { "count": 8, }, - "results": Array [ - Object { + "results": [ + { "id": "52837ad0-f218-46bd-a106-5710336b7053", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", }, }, "title": "Prueba y cultiva tus propias hierbas", "type": "node--article", }, - Object { + { "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", }, }, "title": "Delicioso chocolate sin lactosa", "type": "node--article", }, - Object { + { "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", }, }, "title": "El verdadero negocio para comprar en el supermercado", "type": "node--article", }, - Object { + { "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", }, }, "title": "Guía Umami de nuestras setas preferidas", "type": "node--article", }, - Object { + { "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", }, }, "title": "Un aplauso para las zanahorias", "type": "node--article", }, - Object { + { "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", }, }, "title": "Percances al hornear - nuestros consejos para solucionar los problemas", "type": "node--article", }, - Object { + { "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", }, }, "title": "Salta los espíritus con deliciosos cócteles sin alcohol", "type": "node--article", }, - Object { + { "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", }, }, @@ -6713,92 +5054,92 @@ Object { } `; -exports[`getView it fetches a view with params 1`] = ` -Object { +exports[`getView() fetches a view with params 1`] = ` +{ "id": "featured_articles--page_1", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/jsonapi/views/featured_articles/page_1?fields%5Bnode--article%5D=title", }, }, - "meta": Object { + "meta": { "count": 8, }, - "results": Array [ - Object { + "results": [ + { "id": "52837ad0-f218-46bd-a106-5710336b7053", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", }, }, "title": "Give it a go and grow your own herbs", "type": "node--article", }, - Object { + { "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", }, }, "title": "Dairy-free and delicious milk chocolate", "type": "node--article", }, - Object { + { "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", }, }, "title": "The real deal for supermarket savvy shopping", "type": "node--article", }, - Object { + { "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", }, }, "title": "The Umami guide to our favorite mushrooms", "type": "node--article", }, - Object { + { "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", }, }, "title": "Let's hear it for carrots", "type": "node--article", }, - Object { + { "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", }, }, "title": "Baking mishaps - our troubleshooting tips", "type": "node--article", }, - Object { + { "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", }, }, "title": "Skip the spirits with delicious mocktails", "type": "node--article", }, - Object { + { "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/en/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", }, }, @@ -6809,199 +5150,141 @@ Object { } `; -exports[`getView it fetches raw data 1`] = ` -Object { +exports[`getView() fetches raw data 1`] = ` +{ "id": "featured_articles--page_1", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/views/featured_articles/page_1?fields%5Bnode--article%5D=title", }, }, - "meta": Object { + "meta": { "count": 8, }, - "results": Object { - "data": Array [ - Object { - "attributes": Object { + "results": { + "data": [ + { + "attributes": { "title": "Prueba y cultiva tus propias hierbas", }, "id": "52837ad0-f218-46bd-a106-5710336b7053", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", }, }, "type": "node--article", }, - Object { - "attributes": Object { + { + "attributes": { "title": "Delicioso chocolate sin lactosa", }, "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", }, }, "type": "node--article", }, - Object { - "attributes": Object { + { + "attributes": { "title": "El verdadero negocio para comprar en el supermercado", }, "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", }, }, "type": "node--article", }, - Object { - "attributes": Object { + { + "attributes": { "title": "Guía Umami de nuestras setas preferidas", }, "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", }, }, "type": "node--article", }, - Object { - "attributes": Object { + { + "attributes": { "title": "Un aplauso para las zanahorias", }, "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", }, }, "type": "node--article", }, - Object { - "attributes": Object { + { + "attributes": { "title": "Percances al hornear - nuestros consejos para solucionar los problemas", }, "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", }, }, "type": "node--article", }, - Object { - "attributes": Object { + { + "attributes": { "title": "Salta los espíritus con deliciosos cócteles sin alcohol", }, "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", }, }, "type": "node--article", }, - Object { - "attributes": Object { + { + "attributes": { "title": "Dale a tu avena el cambio de imagen definitivo", }, "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", }, }, "type": "node--article", }, ], - "jsonapi": Object { - "meta": Object { - "links": Object { - "self": Object { + "jsonapi": { + "meta": { + "links": { + "self": { "href": "http://jsonapi.org/format/1.0/", }, }, }, "version": "1.0", }, - "links": Object { - "self": Object { + "links": { + "self": { "href": "https://tests.next-drupal.org/es/jsonapi/views/featured_articles/page_1?fields%5Bnode--article%5D=title", }, }, - "meta": Object { + "meta": { "count": 8, }, }, } `; -exports[`translatePath it translates a path 1`] = ` -Object { - "entity": Object { - "bundle": "recipe", - "canonical": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", - "id": "1", - "langcode": "en", - "path": "/en/recipes/deep-mediterranean-quiche", - "type": "node", - "uuid": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - }, - "isHomePath": false, - "jsonapi": Object { - "basePath": "/en/jsonapi", - "entryPoint": "https://tests.next-drupal.org/en/jsonapi", - "individual": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "pathPrefix": "en/jsonapi", - "resourceName": "node--recipe", - }, - "label": "Deep mediterranean quiche - edited", - "meta": Object { - "deprecated": Object { - "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", - }, - }, - "resolved": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", -} -`; - -exports[`translatePathFromContext it translates a path 1`] = ` -Object { - "entity": Object { - "bundle": "recipe", - "canonical": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", - "id": "1", - "langcode": "en", - "path": "/en/recipes/deep-mediterranean-quiche", - "type": "node", - "uuid": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - }, - "isHomePath": false, - "jsonapi": Object { - "basePath": "/en/jsonapi", - "entryPoint": "https://tests.next-drupal.org/en/jsonapi", - "individual": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", - "pathPrefix": "en/jsonapi", - "resourceName": "node--recipe", - }, - "label": "Deep mediterranean quiche - edited", - "meta": Object { - "deprecated": Object { - "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", - }, - }, - "resolved": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", -} -`; - -exports[`translatePathFromContext it translates a path with pathPrefix 1`] = ` -Object { - "entity": Object { +exports[`translatePath() translates a path 1`] = ` +{ + "entity": { "bundle": "recipe", "canonical": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", "id": "1", @@ -7011,7 +5294,7 @@ Object { "uuid": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", }, "isHomePath": false, - "jsonapi": Object { + "jsonapi": { "basePath": "/en/jsonapi", "entryPoint": "https://tests.next-drupal.org/en/jsonapi", "individual": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", @@ -7019,8 +5302,8 @@ Object { "resourceName": "node--recipe", }, "label": "Deep mediterranean quiche - edited", - "meta": Object { - "deprecated": Object { + "meta": { + "deprecated": { "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", }, }, diff --git a/packages/next-drupal/tests/DrupalClient/__snapshots__/pages-router-methods.test.ts.snap b/packages/next-drupal/tests/DrupalClient/__snapshots__/pages-router-methods.test.ts.snap new file mode 100644 index 00000000..03312b32 --- /dev/null +++ b/packages/next-drupal/tests/DrupalClient/__snapshots__/pages-router-methods.test.ts.snap @@ -0,0 +1,2255 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`getPathFromContext() encodes path with punctuation 1`] = ` +{ + "entity": { + "bundle": "page", + "canonical": "https://tests.next-drupal.org/en/path%26with%5Epunc%26in%24path", + "id": "20", + "langcode": "en", + "path": "/en/path%26with%5Epunc%26in%24path", + "type": "node", + "uuid": "e4bbe727-14ee-44bc-a34a-14ce5c86a82e", + }, + "isHomePath": false, + "jsonapi": { + "basePath": "/en/jsonapi", + "entryPoint": "https://tests.next-drupal.org/en/jsonapi", + "individual": "https://tests.next-drupal.org/en/jsonapi/node/page/e4bbe727-14ee-44bc-a34a-14ce5c86a82e", + "pathPrefix": "en/jsonapi", + "resourceName": "node--page", + }, + "label": "Page with characters in path", + "meta": { + "deprecated": { + "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", + }, + }, + "resolved": "https://tests.next-drupal.org/en/path%26with%5Epunc%26in%24path", +} +`; + +exports[`getResourceCollectionFromContext() fetches a resource collection 1`] = ` +[ + { + "id": "52837ad0-f218-46bd-a106-5710336b7053", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", + }, + }, + "title": "Give it a go and grow your own herbs", + "type": "node--article", + }, + { + "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", + }, + }, + "title": "Dairy-free and delicious milk chocolate", + "type": "node--article", + }, + { + "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", + }, + }, + "title": "The real deal for supermarket savvy shopping", + "type": "node--article", + }, + { + "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", + }, + }, + "title": "The Umami guide to our favorite mushrooms", + "type": "node--article", + }, + { + "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", + }, + }, + "title": "Let's hear it for carrots", + "type": "node--article", + }, + { + "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", + }, + }, + "title": "Baking mishaps - our troubleshooting tips", + "type": "node--article", + }, + { + "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", + }, + }, + "title": "Skip the spirits with delicious mocktails", + "type": "node--article", + }, + { + "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", + }, + }, + "title": "Give your oatmeal the ultimate makeover", + "type": "node--article", + }, +] +`; + +exports[`getResourceCollectionFromContext() fetches a resource collection using locale 1`] = ` +[ + { + "id": "52837ad0-f218-46bd-a106-5710336b7053", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", + }, + }, + "title": "Prueba y cultiva tus propias hierbas", + "type": "node--article", + }, + { + "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", + }, + }, + "title": "Delicioso chocolate sin lactosa", + "type": "node--article", + }, + { + "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", + }, + }, + "title": "El verdadero negocio para comprar en el supermercado", + "type": "node--article", + }, + { + "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", + }, + }, + "title": "Guía Umami de nuestras setas preferidas", + "type": "node--article", + }, + { + "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", + }, + }, + "title": "Un aplauso para las zanahorias", + "type": "node--article", + }, + { + "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", + }, + }, + "title": "Percances al hornear - nuestros consejos para solucionar los problemas", + "type": "node--article", + }, + { + "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", + }, + }, + "title": "Salta los espíritus con deliciosos cócteles sin alcohol", + "type": "node--article", + }, + { + "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", + }, + }, + "title": "Dale a tu avena el cambio de imagen definitivo", + "type": "node--article", + }, +] +`; + +exports[`getResourceCollectionFromContext() fetches raw data 1`] = ` +{ + "data": [ + { + "attributes": { + "title": "Vegan chocolate and nut brownies", + }, + "id": "7862d283-ece2-4ae1-8bef-865259f72315", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/7862d283-ece2-4ae1-8bef-865259f72315?resourceVersion=id%3A4", + }, + }, + "type": "node--recipe", + }, + { + "attributes": { + "title": "Super easy vegetarian pasta bake", + }, + "id": "8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7?resourceVersion=id%3A6", + }, + }, + "type": "node--recipe", + }, + ], + "jsonapi": { + "meta": { + "links": { + "self": { + "href": "http://jsonapi.org/format/1.0/", + }, + }, + }, + "version": "1.0", + }, + "links": { + "next": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe?fields%5Bnode--recipe%5D=title&page%5Boffset%5D=2&page%5Blimit%5D=2", + }, + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe?fields%5Bnode--recipe%5D=title&page%5Blimit%5D=2", + }, + }, +} +`; + +exports[`getResourceFromContext() accepts a translated path 1`] = ` +{ + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "path": { + "alias": "/recipes/deep-mediterranean-quiche", + "langcode": "en", + "pid": 67, + }, + "status": true, + "title": "Deep mediterranean quiche - edited", + "type": "node--recipe", +} +`; + +exports[`getResourceFromContext() fetches a resource from context 1`] = ` +{ + "changed": "2022-03-25T08:02:17+00:00", + "content_translation_outdated": false, + "content_translation_source": "und", + "created": "2022-03-21T10:52:42+00:00", + "default_langcode": true, + "drupal_internal__nid": 1, + "drupal_internal__vid": 37, + "field_cooking_time": 30, + "field_difficulty": "medium", + "field_ingredients": [ + "For the pastry:", + "280g plain flour", + "140g butter", + "Cold water", + "For the filling:", + "1 onion", + "2 garlic cloves", + "Half a courgette", + "450ml soya milk", + "500g grated parmesan", + "2 eggs", + "200g sun dried tomatoes", + "100g feta", + ], + "field_media_image": { + "id": "bbfe9d97-2da2-432b-a22c-0396c08e06ca", + "resourceIdObjMeta": { + "drupal_internal__target_id": 1, + }, + "type": "media--image", + }, + "field_number_of_servings": 8, + "field_preparation_time": 40, + "field_recipe_category": [ + { + "id": "a6c02fe4-67bf-462c-90cb-32281a07efe4", + "resourceIdObjMeta": { + "drupal_internal__target_id": 31, + }, + "type": "taxonomy_term--recipe_category", + }, + ], + "field_recipe_instruction": { + "format": "basic_html", + "processed": "

  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. +
  3. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  4. +
  5. Whilst the pastry is cooling, chop and gently cook the onions, garlic and courgette.
  6. +
  7. In a large bowl, add the soya milk, half the parmesan, and the eggs. Gently mix.
  8. +
  9. Once the pastry is cooked, spread the onions, garlic and sun dried tomatoes over the base and pour the eggs mix over. Sprinkle the remaining parmesan and careful lay the feta over the top. Bake for 30 minutes or until golden brown.
  10. +
", + "value": "
    +
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. +
  3. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  4. +
  5. Whilst the pastry is cooling, chop and gently cook the onions, garlic and courgette.
  6. +
  7. In a large bowl, add the soya milk, half the parmesan, and the eggs. Gently mix.
  8. +
  9. Once the pastry is cooked, spread the onions, garlic and sun dried tomatoes over the base and pour the eggs mix over. Sprinkle the remaining parmesan and careful lay the feta over the top. Bake for 30 minutes or until golden brown.
  10. +
+", + }, + "field_summary": { + "format": "basic_html", + "processed": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

+", + "value": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

+", + }, + "field_tags": [ + { + "id": "46258827-cfad-4813-99dc-287c4cb41117", + "resourceIdObjMeta": { + "drupal_internal__target_id": 22, + }, + "type": "taxonomy_term--tags", + }, + { + "id": "f32a4d84-0568-4bfd-8be3-8217d36efb6d", + "resourceIdObjMeta": { + "drupal_internal__target_id": 13, + }, + "type": "taxonomy_term--tags", + }, + ], + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "langcode": "en", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "moderation_state": "published", + "node_type": { + "id": "9b70a287-cade-454f-be8b-dea7b9a37c7a", + "resourceIdObjMeta": { + "drupal_internal__target_id": "recipe", + }, + "type": "node_type--node_type", + }, + "path": { + "alias": "/recipes/deep-mediterranean-quiche", + "langcode": "en", + "pid": 67, + }, + "promote": true, + "relationshipNames": [ + "node_type", + "revision_uid", + "uid", + "field_media_image", + "field_recipe_category", + "field_tags", + ], + "revision_log": null, + "revision_timestamp": "2022-03-25T08:02:17+00:00", + "revision_translation_affected": true, + "revision_uid": { + "id": "365cc7b5-ddc4-4b3b-939e-1494400aab4a", + "resourceIdObjMeta": { + "drupal_internal__target_id": 1, + }, + "type": "user--user", + }, + "status": true, + "sticky": false, + "title": "Deep mediterranean quiche - edited", + "type": "node--recipe", + "uid": { + "id": "9e4944e8-dd77-407a-8610-83e823b48b56", + "resourceIdObjMeta": { + "drupal_internal__target_id": 4, + }, + "type": "user--user", + }, +} +`; + +exports[`getResourceFromContext() fetches a resource from context using locale 1`] = ` +{ + "field_cooking_time": 30, + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "title": "Quiche mediterráneo profundo", + "type": "node--recipe", +} +`; + +exports[`getResourceFromContext() fetches a resource from context with params 1`] = ` +{ + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "title": "Deep mediterranean quiche - edited", + "type": "node--recipe", +} +`; + +exports[`getResourceFromContext() fetches raw data 1`] = ` +{ + "data": { + "attributes": { + "title": "Deep mediterranean quiche - edited", + }, + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "type": "node--recipe", + }, + "jsonapi": { + "meta": { + "links": { + "self": { + "href": "http://jsonapi.org/format/1.0/", + }, + }, + }, + "version": "1.0", + }, + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?fields%5Bnode--recipe%5D=title&resourceVersion=rel%3Alatest-version", + }, + }, +} +`; + +exports[`getStaticPathsFromContext() returns static paths for multiple resource types from context 1`] = ` +[ + { + "locale": "en", + "params": { + "slug": [ + "articles", + "give-it-a-go-and-grow-your-own-herbs", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "dairy-free-and-delicious-milk-chocolate", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "the-real-deal-for-supermarket-savvy-shopping", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "the-umami-guide-to-our-favourite-mushrooms", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "lets-hear-it-for-carrots", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "baking-mishaps-our-troubleshooting-tips", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "skip-the-spirits-with-delicious-mocktails", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "give-your-oatmeal-the-ultimate-makeover", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "prueba-y-cultiva-tus-propias-hierbas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "delicioso-chocolate-sin-lactosa", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "el-verdadeo-negocio-para-comprar-en-el-supermercado", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "guia-umami-de-nuestras-setas-preferidas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "un-aplauso-para-las-zanahorias", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "percances-al-hornear-nuestros-consejos-para-solucionar-problemas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "salta-los-espiritus-con-deliciosos-cocteles-sin-alcohol", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "dale-a-tu-avena-el-cambio-de-imagen-definitivo", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "vegan-chocolate-and-nut-brownies", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "super-easy-vegetarian-pasta-bake", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "watercress-soup", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "victoria-sponge-cake", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "gluten-free-pizza", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "thai-green-curry", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "crema-catalana", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "fiery-chili-sauce", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "deep-mediterranean-quiche", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "bizcochos-veganos-de-chocolate-y-nueces", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "pasta-vegetariana-horno-super-facil", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "sopa-de-berro", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "pastel-victoria", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "pizza-sin-gluten", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "curry-verde-tailandes", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "crema-catalana", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "salsa-de-chile-ardiente", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "quiche-mediterráneo-profundo", + ], + }, + }, +] +`; + +exports[`getStaticPathsFromContext() returns static paths from context 1`] = ` +[ + { + "params": { + "slug": [ + "articles", + "give-it-a-go-and-grow-your-own-herbs", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "dairy-free-and-delicious-milk-chocolate", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "the-real-deal-for-supermarket-savvy-shopping", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "the-umami-guide-to-our-favourite-mushrooms", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "lets-hear-it-for-carrots", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "baking-mishaps-our-troubleshooting-tips", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "skip-the-spirits-with-delicious-mocktails", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "give-your-oatmeal-the-ultimate-makeover", + ], + }, + }, +] +`; + +exports[`getStaticPathsFromContext() returns static paths from context with locale 1`] = ` +[ + { + "locale": "en", + "params": { + "slug": [ + "articles", + "give-it-a-go-and-grow-your-own-herbs", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "dairy-free-and-delicious-milk-chocolate", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "the-real-deal-for-supermarket-savvy-shopping", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "the-umami-guide-to-our-favourite-mushrooms", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "lets-hear-it-for-carrots", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "baking-mishaps-our-troubleshooting-tips", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "skip-the-spirits-with-delicious-mocktails", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "give-your-oatmeal-the-ultimate-makeover", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "prueba-y-cultiva-tus-propias-hierbas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "delicioso-chocolate-sin-lactosa", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "el-verdadeo-negocio-para-comprar-en-el-supermercado", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "guia-umami-de-nuestras-setas-preferidas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "un-aplauso-para-las-zanahorias", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "percances-al-hornear-nuestros-consejos-para-solucionar-problemas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "salta-los-espiritus-con-deliciosos-cocteles-sin-alcohol", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "dale-a-tu-avena-el-cambio-de-imagen-definitivo", + ], + }, + }, +] +`; + +exports[`getStaticPathsFromContext() returns static paths from context with params 1`] = ` +[ + { + "params": { + "slug": [ + "articles", + "give-it-a-go-and-grow-your-own-herbs", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "dairy-free-and-delicious-milk-chocolate", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "the-real-deal-for-supermarket-savvy-shopping", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "the-umami-guide-to-our-favourite-mushrooms", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "lets-hear-it-for-carrots", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "baking-mishaps-our-troubleshooting-tips", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "skip-the-spirits-with-delicious-mocktails", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "give-your-oatmeal-the-ultimate-makeover", + ], + }, + }, +] +`; + +exports[`translatePathFromContext() translates a path 1`] = ` +{ + "entity": { + "bundle": "recipe", + "canonical": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", + "id": "1", + "langcode": "en", + "path": "/en/recipes/deep-mediterranean-quiche", + "type": "node", + "uuid": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + }, + "isHomePath": false, + "jsonapi": { + "basePath": "/en/jsonapi", + "entryPoint": "https://tests.next-drupal.org/en/jsonapi", + "individual": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "pathPrefix": "en/jsonapi", + "resourceName": "node--recipe", + }, + "label": "Deep mediterranean quiche - edited", + "meta": { + "deprecated": { + "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", + }, + }, + "resolved": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", +} +`; + +exports[`translatePathFromContext() translates a path with pathPrefix 1`] = ` +{ + "entity": { + "bundle": "recipe", + "canonical": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", + "id": "1", + "langcode": "en", + "path": "/en/recipes/deep-mediterranean-quiche", + "type": "node", + "uuid": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + }, + "isHomePath": false, + "jsonapi": { + "basePath": "/en/jsonapi", + "entryPoint": "https://tests.next-drupal.org/en/jsonapi", + "individual": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "pathPrefix": "en/jsonapi", + "resourceName": "node--recipe", + }, + "label": "Deep mediterranean quiche - edited", + "meta": { + "deprecated": { + "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", + }, + }, + "resolved": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", +} +`; + +exports[`getPathFromContext() encodes path with punctuation 1`] = ` +{ + "entity": { + "bundle": "page", + "canonical": "https://tests.next-drupal.org/en/path%26with%5Epunc%26in%24path", + "id": "20", + "langcode": "en", + "path": "/en/path%26with%5Epunc%26in%24path", + "type": "node", + "uuid": "e4bbe727-14ee-44bc-a34a-14ce5c86a82e", + }, + "isHomePath": false, + "jsonapi": { + "basePath": "/en/jsonapi", + "entryPoint": "https://tests.next-drupal.org/en/jsonapi", + "individual": "https://tests.next-drupal.org/en/jsonapi/node/page/e4bbe727-14ee-44bc-a34a-14ce5c86a82e", + "pathPrefix": "en/jsonapi", + "resourceName": "node--page", + }, + "label": "Page with characters in path", + "meta": { + "deprecated": { + "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", + }, + }, + "resolved": "https://tests.next-drupal.org/en/path%26with%5Epunc%26in%24path", +} +`; + +exports[`getResourceCollectionFromContext() fetches a resource collection 1`] = ` +[ + { + "id": "52837ad0-f218-46bd-a106-5710336b7053", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", + }, + }, + "title": "Give it a go and grow your own herbs", + "type": "node--article", + }, + { + "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", + }, + }, + "title": "Dairy-free and delicious milk chocolate", + "type": "node--article", + }, + { + "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", + }, + }, + "title": "The real deal for supermarket savvy shopping", + "type": "node--article", + }, + { + "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", + }, + }, + "title": "The Umami guide to our favorite mushrooms", + "type": "node--article", + }, + { + "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", + }, + }, + "title": "Let's hear it for carrots", + "type": "node--article", + }, + { + "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", + }, + }, + "title": "Baking mishaps - our troubleshooting tips", + "type": "node--article", + }, + { + "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", + }, + }, + "title": "Skip the spirits with delicious mocktails", + "type": "node--article", + }, + { + "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", + }, + }, + "title": "Give your oatmeal the ultimate makeover", + "type": "node--article", + }, +] +`; + +exports[`getResourceCollectionFromContext() fetches a resource collection using locale 1`] = ` +[ + { + "id": "52837ad0-f218-46bd-a106-5710336b7053", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053?resourceVersion=id%3A20", + }, + }, + "title": "Prueba y cultiva tus propias hierbas", + "type": "node--article", + }, + { + "id": "3d5a7bca-5b4a-49ee-87d2-cbe313562903", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/3d5a7bca-5b4a-49ee-87d2-cbe313562903?resourceVersion=id%3A22", + }, + }, + "title": "Delicioso chocolate sin lactosa", + "type": "node--article", + }, + { + "id": "a1ef61c9-ed15-4b6d-bba2-bf6e5141f961", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/a1ef61c9-ed15-4b6d-bba2-bf6e5141f961?resourceVersion=id%3A24", + }, + }, + "title": "El verdadero negocio para comprar en el supermercado", + "type": "node--article", + }, + { + "id": "ac0b8b56-db8d-4322-9b1e-224f22083f0d", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ac0b8b56-db8d-4322-9b1e-224f22083f0d?resourceVersion=id%3A26", + }, + }, + "title": "Guía Umami de nuestras setas preferidas", + "type": "node--article", + }, + { + "id": "22874ecc-0443-441b-a3c9-3aa94d85b800", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/22874ecc-0443-441b-a3c9-3aa94d85b800?resourceVersion=id%3A28", + }, + }, + "title": "Un aplauso para las zanahorias", + "type": "node--article", + }, + { + "id": "ec51b1de-f51e-4761-b061-aa2624e58b4a", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/ec51b1de-f51e-4761-b061-aa2624e58b4a?resourceVersion=id%3A30", + }, + }, + "title": "Percances al hornear - nuestros consejos para solucionar los problemas", + "type": "node--article", + }, + { + "id": "d5b9ef80-c0aa-45ca-88e7-79c28abe5d50", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/d5b9ef80-c0aa-45ca-88e7-79c28abe5d50?resourceVersion=id%3A32", + }, + }, + "title": "Salta los espíritus con deliciosos cócteles sin alcohol", + "type": "node--article", + }, + { + "id": "6c7c249f-cd1a-41d5-944b-b3bfce68b325", + "langcode": "es", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/article/6c7c249f-cd1a-41d5-944b-b3bfce68b325?resourceVersion=id%3A34", + }, + }, + "title": "Dale a tu avena el cambio de imagen definitivo", + "type": "node--article", + }, +] +`; + +exports[`getResourceCollectionFromContext() fetches raw data 1`] = ` +{ + "data": [ + { + "attributes": { + "title": "Vegan chocolate and nut brownies", + }, + "id": "7862d283-ece2-4ae1-8bef-865259f72315", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/7862d283-ece2-4ae1-8bef-865259f72315?resourceVersion=id%3A4", + }, + }, + "type": "node--recipe", + }, + { + "attributes": { + "title": "Super easy vegetarian pasta bake", + }, + "id": "8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/8d4b237f-f6fe-4bb1-95ef-f9e3b3f9d6b7?resourceVersion=id%3A6", + }, + }, + "type": "node--recipe", + }, + ], + "jsonapi": { + "meta": { + "links": { + "self": { + "href": "http://jsonapi.org/format/1.0/", + }, + }, + }, + "version": "1.0", + }, + "links": { + "next": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe?fields%5Bnode--recipe%5D=title&page%5Boffset%5D=2&page%5Blimit%5D=2", + }, + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe?fields%5Bnode--recipe%5D=title&page%5Blimit%5D=2", + }, + }, +} +`; + +exports[`getResourceFromContext() accepts a translated path 1`] = ` +{ + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "path": { + "alias": "/recipes/deep-mediterranean-quiche", + "langcode": "en", + "pid": 67, + }, + "status": true, + "title": "Deep mediterranean quiche - edited", + "type": "node--recipe", +} +`; + +exports[`getResourceFromContext() fetches a resource from context 1`] = ` +{ + "changed": "2022-03-25T08:02:17+00:00", + "content_translation_outdated": false, + "content_translation_source": "und", + "created": "2022-03-21T10:52:42+00:00", + "default_langcode": true, + "drupal_internal__nid": 1, + "drupal_internal__vid": 37, + "field_cooking_time": 30, + "field_difficulty": "medium", + "field_ingredients": [ + "For the pastry:", + "280g plain flour", + "140g butter", + "Cold water", + "For the filling:", + "1 onion", + "2 garlic cloves", + "Half a courgette", + "450ml soya milk", + "500g grated parmesan", + "2 eggs", + "200g sun dried tomatoes", + "100g feta", + ], + "field_media_image": { + "id": "bbfe9d97-2da2-432b-a22c-0396c08e06ca", + "resourceIdObjMeta": { + "drupal_internal__target_id": 1, + }, + "type": "media--image", + }, + "field_number_of_servings": 8, + "field_preparation_time": 40, + "field_recipe_category": [ + { + "id": "a6c02fe4-67bf-462c-90cb-32281a07efe4", + "resourceIdObjMeta": { + "drupal_internal__target_id": 31, + }, + "type": "taxonomy_term--recipe_category", + }, + ], + "field_recipe_instruction": { + "format": "basic_html", + "processed": "
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. +
  3. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  4. +
  5. Whilst the pastry is cooling, chop and gently cook the onions, garlic and courgette.
  6. +
  7. In a large bowl, add the soya milk, half the parmesan, and the eggs. Gently mix.
  8. +
  9. Once the pastry is cooked, spread the onions, garlic and sun dried tomatoes over the base and pour the eggs mix over. Sprinkle the remaining parmesan and careful lay the feta over the top. Bake for 30 minutes or until golden brown.
  10. +
", + "value": "
    +
  1. Preheat the oven to 400°F/200°C. Starting with the pastry; rub the flour and butter together in a bowl until crumbling like breadcrumbs. Add water, a little at a time, until it forms a dough.
  2. +
  3. Roll out the pastry on a floured board and gently spread over your tin. Place in the fridge for 20 minutes before blind baking for a further 10.
  4. +
  5. Whilst the pastry is cooling, chop and gently cook the onions, garlic and courgette.
  6. +
  7. In a large bowl, add the soya milk, half the parmesan, and the eggs. Gently mix.
  8. +
  9. Once the pastry is cooked, spread the onions, garlic and sun dried tomatoes over the base and pour the eggs mix over. Sprinkle the remaining parmesan and careful lay the feta over the top. Bake for 30 minutes or until golden brown.
  10. +
+", + }, + "field_summary": { + "format": "basic_html", + "processed": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

+", + "value": "

An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.

+", + }, + "field_tags": [ + { + "id": "46258827-cfad-4813-99dc-287c4cb41117", + "resourceIdObjMeta": { + "drupal_internal__target_id": 22, + }, + "type": "taxonomy_term--tags", + }, + { + "id": "f32a4d84-0568-4bfd-8be3-8217d36efb6d", + "resourceIdObjMeta": { + "drupal_internal__target_id": 13, + }, + "type": "taxonomy_term--tags", + }, + ], + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "langcode": "en", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "moderation_state": "published", + "node_type": { + "id": "9b70a287-cade-454f-be8b-dea7b9a37c7a", + "resourceIdObjMeta": { + "drupal_internal__target_id": "recipe", + }, + "type": "node_type--node_type", + }, + "path": { + "alias": "/recipes/deep-mediterranean-quiche", + "langcode": "en", + "pid": 67, + }, + "promote": true, + "relationshipNames": [ + "node_type", + "revision_uid", + "uid", + "field_media_image", + "field_recipe_category", + "field_tags", + ], + "revision_log": null, + "revision_timestamp": "2022-03-25T08:02:17+00:00", + "revision_translation_affected": true, + "revision_uid": { + "id": "365cc7b5-ddc4-4b3b-939e-1494400aab4a", + "resourceIdObjMeta": { + "drupal_internal__target_id": 1, + }, + "type": "user--user", + }, + "status": true, + "sticky": false, + "title": "Deep mediterranean quiche - edited", + "type": "node--recipe", + "uid": { + "id": "9e4944e8-dd77-407a-8610-83e823b48b56", + "resourceIdObjMeta": { + "drupal_internal__target_id": 4, + }, + "type": "user--user", + }, +} +`; + +exports[`getResourceFromContext() fetches a resource from context using locale 1`] = ` +{ + "field_cooking_time": 30, + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/es/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "title": "Quiche mediterráneo profundo", + "type": "node--recipe", +} +`; + +exports[`getResourceFromContext() fetches a resource from context with params 1`] = ` +{ + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "title": "Deep mediterranean quiche - edited", + "type": "node--recipe", +} +`; + +exports[`getResourceFromContext() fetches raw data 1`] = ` +{ + "data": { + "attributes": { + "title": "Deep mediterranean quiche - edited", + }, + "id": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?resourceVersion=id%3A37", + }, + }, + "type": "node--recipe", + }, + "jsonapi": { + "meta": { + "links": { + "self": { + "href": "http://jsonapi.org/format/1.0/", + }, + }, + }, + "version": "1.0", + }, + "links": { + "self": { + "href": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f?fields%5Bnode--recipe%5D=title&resourceVersion=rel%3Alatest-version", + }, + }, +} +`; + +exports[`getStaticPathsFromContext() returns static paths for multiple resource types from context 1`] = ` +[ + { + "locale": "en", + "params": { + "slug": [ + "articles", + "give-it-a-go-and-grow-your-own-herbs", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "dairy-free-and-delicious-milk-chocolate", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "the-real-deal-for-supermarket-savvy-shopping", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "the-umami-guide-to-our-favourite-mushrooms", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "lets-hear-it-for-carrots", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "baking-mishaps-our-troubleshooting-tips", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "skip-the-spirits-with-delicious-mocktails", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "give-your-oatmeal-the-ultimate-makeover", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "prueba-y-cultiva-tus-propias-hierbas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "delicioso-chocolate-sin-lactosa", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "el-verdadeo-negocio-para-comprar-en-el-supermercado", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "guia-umami-de-nuestras-setas-preferidas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "un-aplauso-para-las-zanahorias", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "percances-al-hornear-nuestros-consejos-para-solucionar-problemas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "salta-los-espiritus-con-deliciosos-cocteles-sin-alcohol", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "dale-a-tu-avena-el-cambio-de-imagen-definitivo", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "vegan-chocolate-and-nut-brownies", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "super-easy-vegetarian-pasta-bake", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "watercress-soup", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "victoria-sponge-cake", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "gluten-free-pizza", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "thai-green-curry", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "crema-catalana", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "fiery-chili-sauce", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "recipes", + "deep-mediterranean-quiche", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "bizcochos-veganos-de-chocolate-y-nueces", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "pasta-vegetariana-horno-super-facil", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "sopa-de-berro", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "pastel-victoria", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "pizza-sin-gluten", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "curry-verde-tailandes", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "crema-catalana", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "salsa-de-chile-ardiente", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "recipes", + "quiche-mediterráneo-profundo", + ], + }, + }, +] +`; + +exports[`getStaticPathsFromContext() returns static paths from context 1`] = ` +[ + { + "params": { + "slug": [ + "articles", + "give-it-a-go-and-grow-your-own-herbs", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "dairy-free-and-delicious-milk-chocolate", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "the-real-deal-for-supermarket-savvy-shopping", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "the-umami-guide-to-our-favourite-mushrooms", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "lets-hear-it-for-carrots", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "baking-mishaps-our-troubleshooting-tips", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "skip-the-spirits-with-delicious-mocktails", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "give-your-oatmeal-the-ultimate-makeover", + ], + }, + }, +] +`; + +exports[`getStaticPathsFromContext() returns static paths from context with locale 1`] = ` +[ + { + "locale": "en", + "params": { + "slug": [ + "articles", + "give-it-a-go-and-grow-your-own-herbs", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "dairy-free-and-delicious-milk-chocolate", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "the-real-deal-for-supermarket-savvy-shopping", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "the-umami-guide-to-our-favourite-mushrooms", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "lets-hear-it-for-carrots", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "baking-mishaps-our-troubleshooting-tips", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "skip-the-spirits-with-delicious-mocktails", + ], + }, + }, + { + "locale": "en", + "params": { + "slug": [ + "articles", + "give-your-oatmeal-the-ultimate-makeover", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "prueba-y-cultiva-tus-propias-hierbas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "delicioso-chocolate-sin-lactosa", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "el-verdadeo-negocio-para-comprar-en-el-supermercado", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "guia-umami-de-nuestras-setas-preferidas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "un-aplauso-para-las-zanahorias", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "percances-al-hornear-nuestros-consejos-para-solucionar-problemas", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "salta-los-espiritus-con-deliciosos-cocteles-sin-alcohol", + ], + }, + }, + { + "locale": "es", + "params": { + "slug": [ + "articles", + "dale-a-tu-avena-el-cambio-de-imagen-definitivo", + ], + }, + }, +] +`; + +exports[`getStaticPathsFromContext() returns static paths from context with params 1`] = ` +[ + { + "params": { + "slug": [ + "articles", + "give-it-a-go-and-grow-your-own-herbs", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "dairy-free-and-delicious-milk-chocolate", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "the-real-deal-for-supermarket-savvy-shopping", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "the-umami-guide-to-our-favourite-mushrooms", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "lets-hear-it-for-carrots", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "baking-mishaps-our-troubleshooting-tips", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "skip-the-spirits-with-delicious-mocktails", + ], + }, + }, + { + "params": { + "slug": [ + "articles", + "give-your-oatmeal-the-ultimate-makeover", + ], + }, + }, +] +`; + +exports[`translatePathFromContext() translates a path 1`] = ` +{ + "entity": { + "bundle": "recipe", + "canonical": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", + "id": "1", + "langcode": "en", + "path": "/en/recipes/deep-mediterranean-quiche", + "type": "node", + "uuid": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + }, + "isHomePath": false, + "jsonapi": { + "basePath": "/en/jsonapi", + "entryPoint": "https://tests.next-drupal.org/en/jsonapi", + "individual": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "pathPrefix": "en/jsonapi", + "resourceName": "node--recipe", + }, + "label": "Deep mediterranean quiche - edited", + "meta": { + "deprecated": { + "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", + }, + }, + "resolved": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", +} +`; + +exports[`translatePathFromContext() translates a path with pathPrefix 1`] = ` +{ + "entity": { + "bundle": "recipe", + "canonical": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", + "id": "1", + "langcode": "en", + "path": "/en/recipes/deep-mediterranean-quiche", + "type": "node", + "uuid": "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + }, + "isHomePath": false, + "jsonapi": { + "basePath": "/en/jsonapi", + "entryPoint": "https://tests.next-drupal.org/en/jsonapi", + "individual": "https://tests.next-drupal.org/en/jsonapi/node/recipe/71e04ead-4cc7-416c-b9ca-60b635fdc50f", + "pathPrefix": "en/jsonapi", + "resourceName": "node--recipe", + }, + "label": "Deep mediterranean quiche - edited", + "meta": { + "deprecated": { + "jsonapi.pathPrefix": "This property has been deprecated and will be removed in the next version of Decoupled Router. Use basePath instead.", + }, + }, + "resolved": "https://tests.next-drupal.org/en/recipes/deep-mediterranean-quiche", +} +`; diff --git a/packages/next-drupal/tests/DrupalClient/basic-methods.test.ts b/packages/next-drupal/tests/DrupalClient/basic-methods.test.ts new file mode 100644 index 00000000..c8684a47 --- /dev/null +++ b/packages/next-drupal/tests/DrupalClient/basic-methods.test.ts @@ -0,0 +1,597 @@ +import { afterEach, describe, expect, jest, test } from "@jest/globals" +import { NextApiRequest, NextApiResponse } from "next" +import { DRAFT_DATA_COOKIE_NAME, DrupalClient, JsonApiErrors } from "../../src" +import { BASE_URL, mockLogger, spyOnFetch, spyOnFetchOnce } from "../utils" +import type { DrupalNode, JsonApiError, Serializer } from "../../src" + +afterEach(() => { + jest.restoreAllMocks() +}) + +describe("buildMenuTree()", () => { + test.todo("add tests") +}) + +describe("buildUrl()", () => { + const client = new DrupalClient(BASE_URL) + + test("builds a url", () => { + expect(client.buildUrl("http://example.com").toString()).toEqual( + "http://example.com/" + ) + }) + + test("builds a relative url", () => { + expect(client.buildUrl("/foo").toString()).toEqual(`${BASE_URL}/foo`) + }) + + test("builds a url with params", () => { + expect(client.buildUrl("/foo", { bar: "baz" }).toString()).toEqual( + `${BASE_URL}/foo?bar=baz` + ) + + expect( + client + .buildUrl("/jsonapi/node/article", { + sort: "-created", + "fields[node--article]": "title,path", + }) + .toString() + ).toEqual( + `${BASE_URL}/jsonapi/node/article?sort=-created&fields%5Bnode--article%5D=title%2Cpath` + ) + }) + + test("builds a url from object (DrupalJsonApiParams)", () => { + const params = { + getQueryObject: () => ({ + sort: "-created", + "fields[node--article]": "title,path", + }), + } + + expect(client.buildUrl("/jsonapi/node/article", params).toString()).toEqual( + `${BASE_URL}/jsonapi/node/article?sort=-created&fields%5Bnode--article%5D=title%2Cpath` + ) + }) +}) + +describe("debug()", () => { + test("does not print messages by default", () => { + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { logger }) + const message = "Example message" + client.debug(message) + expect(logger.debug).not.toHaveBeenCalled() + }) + + test("prints messages when debugging on", () => { + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { logger, debug: true }) + const message = "Example message" + client.debug(message) + expect(logger.debug).toHaveBeenCalledWith("Debug mode is on.") + expect(logger.debug).toHaveBeenCalledWith(message) + }) +}) + +describe("deserialize()", () => { + test("deserializes JSON:API resource", async () => { + const client = new DrupalClient(BASE_URL) + const url = client.buildUrl( + "/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053", + { + include: "field_tags", + } + ) + + const response = await client.fetch(url.toString()) + const json = await response.json() + const article = client.deserialize(json) as DrupalNode + + expect(article).toMatchSnapshot() + expect(article.id).toEqual("52837ad0-f218-46bd-a106-5710336b7053") + expect(article.field_tags).toHaveLength(3) + }) + + test("deserializes JSON:API collection", async () => { + const client = new DrupalClient(BASE_URL) + const url = client.buildUrl("/jsonapi/node/article", { + getQueryObject: () => ({ + "fields[node--article]": "title", + }), + }) + + const response = await client.fetch(url.toString()) + const json = await response.json() + const articles = client.deserialize(json) as DrupalNode[] + + expect(articles).toMatchSnapshot() + }) + + test("allows for custom data serializer", async () => { + const serializer: Serializer = { + deserialize: ( + body: { data: { id: string; attributes: { title: string } } }, + options: { pathPrefix: string } + ) => { + return { + id: body.data.id, + title: `${options.pathPrefix}: ${body.data.attributes.title}`, + } + }, + } + const client = new DrupalClient(BASE_URL, { + serializer, + }) + const url = client.buildUrl( + "/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053" + ) + + const response = await client.fetch(url.toString()) + const json = await response.json() + const article = client.deserialize(json, { + pathPrefix: "TITLE", + }) as DrupalNode + + expect(article).toMatchSnapshot() + expect(article.id).toEqual("52837ad0-f218-46bd-a106-5710336b7053") + expect(article.title).toEqual(`TITLE: ${json.data.attributes.title}`) + }) + + test("returns null if no body", () => { + const client = new DrupalClient(BASE_URL) + expect(client.deserialize("")).toBe(null) + }) +}) + +describe("formatJsonApiErrors()", () => { + const errors: JsonApiError[] = [ + { + status: "404", + title: "First error", + }, + { + status: "500", + title: "Second error", + detail: "is ignored", + }, + ] + const client = new DrupalClient(BASE_URL) + + test("formats the first error in the array", () => { + expect(client.formatJsonApiErrors(errors)).toBe("404 First error") + }) + + test("includes the optional error detail", () => { + expect( + client.formatJsonApiErrors([ + { + ...errors[0], + detail: "Detail is included.", + }, + errors[1], + ]) + ).toBe("404 First error\nDetail is included.") + }) +}) + +describe("getErrorsFromResponse()", () => { + const client = new DrupalClient(BASE_URL) + + test("returns application/json error message", async () => { + const message = "An error occurred." + const response = new Response(JSON.stringify({ message }), { + status: 403, + headers: { + "content-type": "application/json", + }, + }) + + expect(await client.getErrorsFromResponse(response)).toBe(message) + }) + + test("returns application/vnd.api+json errors", async () => { + const payload = { + errors: [ + { + status: "404", + title: "Not found", + detail: "Oops.", + }, + { + status: "418", + title: "I am a teapot", + detail: "Even RFCs have easter eggs.", + }, + ] as JsonApiError[], + } + const response = new Response(JSON.stringify(payload), { + status: 403, + headers: { + "content-type": "application/vnd.api+json", + }, + }) + + expect(await client.getErrorsFromResponse(response)).toMatchObject( + payload.errors + ) + }) + + test("returns the response status text if the application/vnd.api+json errors cannot be found", async () => { + const payload = { + contains: 'no "errors" entry', + } + const response = new Response(JSON.stringify(payload), { + status: 418, + statusText: "I'm a Teapot", + headers: { + "content-type": "application/vnd.api+json", + }, + }) + + expect(await client.getErrorsFromResponse(response)).toBe("I'm a Teapot") + }) + + test("returns the response status text if no errors can be found", async () => { + const response = new Response(JSON.stringify({}), { + status: 403, + statusText: "Forbidden", + }) + + expect(await client.getErrorsFromResponse(response)).toBe("Forbidden") + }) +}) + +describe("preview()", () => { + // Get values from our mocked request. + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { slug, resourceVersion, plugin, secret, ...draftData } = + new NextApiRequest().query + const dataCookie = `${DRAFT_DATA_COOKIE_NAME}=${encodeURIComponent( + JSON.stringify({ slug, resourceVersion, ...draftData }) + )}; Path=/; HttpOnly; SameSite=None; Secure` + const validationPayload = { + slug, + maxAge: 30, + } + + test("turns on preview mode and clears preview data", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const client = new DrupalClient(BASE_URL) + spyOnFetch({ responseBody: validationPayload }) + + await client.preview(request, response) + + expect(response.clearPreviewData).toBeCalledTimes(1) + expect(response.setPreviewData).toBeCalledWith({ + resourceVersion, + plugin, + ...validationPayload, + }) + }) + + test("does not enable preview mode if validation fails", async () => { + const logger = mockLogger() + const request = new NextApiRequest() + const response = new NextApiResponse() + const client = new DrupalClient(BASE_URL, { debug: true, logger }) + const status = 403 + const message = "mock fail" + spyOnFetch({ + responseBody: { message }, + status, + headers: { + "Content-Type": "application/json", + }, + }) + + await client.preview(request, response) + + expect(logger.debug).toBeCalledWith( + `Draft url validation error: ${message}` + ) + expect(response.setPreviewData).toBeCalledTimes(0) + expect(response.statusCode).toBe(status) + expect(response.json).toBeCalledWith({ message }) + }) + + test("does not turn on draft mode by default", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const client = new DrupalClient(BASE_URL) + spyOnFetch({ responseBody: validationPayload }) + + await client.preview(request, response) + + expect(response.setDraftMode).toBeCalledTimes(0) + + // Also check for no draft data cookie. + const cookies = response.getHeader("Set-Cookie") + expect(cookies[cookies.length - 1]).not.toBe(dataCookie) + }) + + test("optionally turns on draft mode", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { + debug: true, + logger, + }) + spyOnFetch({ responseBody: validationPayload }) + + const options = { enable: true } + await client.preview(request, response, options) + + expect(response.setDraftMode).toBeCalledWith(options) + + // Also check for draft data cookie. + const cookies = response.getHeader("Set-Cookie") + expect(cookies[cookies.length - 1]).toBe(dataCookie) + + expect(logger.debug).toHaveBeenLastCalledWith("Draft mode enabled.") + }) + + test("updates preview mode cookie’s sameSite flag", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const client = new DrupalClient(BASE_URL) + spyOnFetch({ responseBody: validationPayload }) + + // Our mock response.setPreviewData() does not set a cookie, so we set one. + const previewCookie = + "__next_preview_data=secret-data; Path=/; HttpOnly; SameSite=Lax" + response.setHeader("Set-Cookie", [ + previewCookie, + ...response.getHeader("Set-Cookie"), + ]) + + const cookies = response.getHeader("Set-Cookie") + cookies[0] = cookies[0].replace("SameSite=Lax", "SameSite=None; Secure") + + await client.preview(request, response) + + expect(response.getHeader).toHaveBeenLastCalledWith("Set-Cookie") + expect(response.setHeader).toHaveBeenLastCalledWith("Set-Cookie", cookies) + expect(response.getHeader("Set-Cookie")).toStrictEqual(cookies) + }) + + test("redirects to the slug path", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { debug: true, logger }) + spyOnFetch({ responseBody: validationPayload }) + + await client.preview(request, response) + + expect(response.setPreviewData).toBeCalledWith({ + resourceVersion, + plugin, + ...validationPayload, + }) + expect(response.writeHead).toBeCalledWith(307, { Location: slug }) + expect(logger.debug).toHaveBeenLastCalledWith("Preview mode enabled.") + }) + + test("returns a 422 response on error", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { debug: true, logger }) + const message = "mock internal error" + response.clearPreviewData = jest.fn(() => { + throw new Error(message) + }) + + await client.preview(request, response) + + expect(logger.debug).toHaveBeenLastCalledWith(`Preview failed: ${message}`) + expect(response.status).toBeCalledWith(422) + expect(response.end).toHaveBeenCalled() + }) +}) + +describe("previewDisable()", () => { + test("clears preview data", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const client = new DrupalClient(BASE_URL) + + await client.previewDisable(request, response) + expect(response.clearPreviewData).toBeCalledTimes(1) + }) + + test("disables draft mode", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const client = new DrupalClient(BASE_URL) + + await client.previewDisable(request, response) + expect(response.setDraftMode).toBeCalledWith({ enable: false }) + }) + + test("deletes the draft cookie", async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const client = new DrupalClient(BASE_URL) + + await client.previewDisable(request, response) + const cookies = response.getHeader("Set-Cookie") + expect(cookies[cookies.length - 1]).toBe( + `${DRAFT_DATA_COOKIE_NAME}=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly; SameSite=None; Secure` + ) + }) + + test('redirects to "/"', async () => { + const request = new NextApiRequest() + const response = new NextApiResponse() + const client = new DrupalClient(BASE_URL) + + await client.previewDisable(request, response) + expect(response.writeHead).toBeCalledWith(307, { Location: "/" }) + expect(response.end).toBeCalled() + }) +}) + +describe("throwError()", () => { + test("throws the error", () => { + const client = new DrupalClient(BASE_URL) + expect(() => { + client.throwError(new Error("Example error")) + }).toThrow("Example error") + }) + + test("logs the error when throwJsonApiErrors is false", () => { + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { + throwJsonApiErrors: false, + logger, + }) + expect(() => { + client.throwError(new Error("Example error")) + }).not.toThrow() + expect(logger.error).toHaveBeenCalledWith(new Error("Example error")) + }) +}) + +describe("throwIfJsonApiErrors()", () => { + const client = new DrupalClient(BASE_URL) + + test("does not throw if response is ok", async () => { + expect.assertions(1) + + const response = new Response(JSON.stringify({})) + + await expect(client.throwIfJsonApiErrors(response)).resolves.toBe(undefined) + }) + + test("throws a JsonApiErrors object", async () => { + expect.assertions(1) + + const payload = { + errors: [ + { + status: "404", + title: "Not found", + detail: "Oops.", + }, + { + status: "418", + title: "I am a teapot", + detail: "Even RFCs have easter eggs.", + }, + ] as JsonApiError[], + } + const status = 403 + const response = new Response(JSON.stringify(payload), { + status, + headers: { + "content-type": "application/vnd.api+json", + }, + }) + + const expectedError = new JsonApiErrors(payload.errors, status) + await expect(client.throwIfJsonApiErrors(response)).rejects.toEqual( + expectedError + ) + }) +}) + +describe("validateDraftUrl()", () => { + test("outputs debug messages", async () => { + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { + debug: true, + logger, + }) + const slug = "/example" + const searchParams = new URLSearchParams({ + slug, + }) + + const testPayload = { test: "resolved" } + spyOnFetchOnce({ + responseBody: testPayload, + }) + spyOnFetchOnce({ + responseBody: { + message: "fail", + }, + status: 404, + }) + + let response = await client.validateDraftUrl(searchParams) + expect(response.status).toBe(200) + expect(logger.debug).toHaveBeenCalledWith("Debug mode is on.") + expect(logger.debug).toHaveBeenCalledWith( + `Fetching draft url validation for ${slug}.` + ) + expect(logger.debug).toHaveBeenCalledWith(`Validated slug, ${slug}`) + + response = await client.validateDraftUrl(searchParams) + expect(response.status).toBe(404) + expect(logger.debug).toHaveBeenCalledWith( + `Could not validate slug, ${slug}` + ) + }) + + test("calls draft-url endpoint", async () => { + const client = new DrupalClient(BASE_URL) + const searchParams = new URLSearchParams({ + slug: "/example", + }) + + const testPayload = { test: "resolved" } + const fetchSpy = spyOnFetch({ responseBody: testPayload }) + + await client.validateDraftUrl(searchParams) + + expect(fetchSpy).toHaveBeenNthCalledWith( + 1, + `${BASE_URL}/next/draft-url`, + expect.objectContaining({ + method: "POST", + headers: { + Accept: "application/vnd.api+json", + "Content-Type": "application/json", + }, + body: JSON.stringify(Object.fromEntries(searchParams.entries())), + }) + ) + }) + + test("returns a response object on success", async () => { + const client = new DrupalClient(BASE_URL) + const searchParams = new URLSearchParams({ + slug: "/example", + }) + + const testPayload = { test: "resolved" } + spyOnFetch({ responseBody: testPayload }) + + const response = await client.validateDraftUrl(searchParams) + + expect(response.ok).toBe(true) + expect(response.status).toBe(200) + expect(await response.json()).toMatchObject(testPayload) + }) + + test("returns a response if fetch throws", async () => { + const client = new DrupalClient(BASE_URL) + const searchParams = new URLSearchParams({ + slug: "/example", + }) + + const message = "random fetch error" + spyOnFetch({ throwErrorMessage: message }) + + const response = await client.validateDraftUrl(searchParams) + + expect(response.ok).toBe(false) + expect(response.status).toBe(401) + expect(await response.json()).toMatchObject({ message }) + }) +}) diff --git a/packages/next-drupal/tests/DrupalClient/constructor.test.ts b/packages/next-drupal/tests/DrupalClient/constructor.test.ts new file mode 100644 index 00000000..b31dba4e --- /dev/null +++ b/packages/next-drupal/tests/DrupalClient/constructor.test.ts @@ -0,0 +1,333 @@ +import { afterEach, describe, expect, jest, test } from "@jest/globals" +import { Jsona } from "jsona" +import { DrupalClient } from "../../src" +import { DEBUG_MESSAGE_PREFIX, logger as defaultLogger } from "../../src/logger" +import { BASE_URL } from "../utils" +import type { Logger } from "../../src" + +afterEach(() => { + jest.restoreAllMocks() +}) + +describe("baseUrl parameter", () => { + const env = process.env + + beforeEach(() => { + jest.resetModules() + process.env = { ...env } + }) + + afterEach(() => { + process.env = env + }) + + test("throws error given an invalid baseUrl", () => { + // @ts-ignore + expect(() => new DrupalClient()).toThrow("The 'baseUrl' param is required.") + + // @ts-ignore + expect(() => new DrupalClient({})).toThrow( + "The 'baseUrl' param is required." + ) + }) + + test("turns throwJsonApiErrors off in production", () => { + process.env = { + ...process.env, + NODE_ENV: "production", + } + + const client = new DrupalClient(BASE_URL) + expect(client.throwJsonApiErrors).toBe(false) + }) + + test("announces debug mode when turned on", () => { + const consoleSpy = jest.spyOn(console, "debug").mockImplementation(() => { + // + }) + + new DrupalClient(BASE_URL, { + debug: true, + }) + + expect(consoleSpy).toHaveBeenCalledWith( + DEBUG_MESSAGE_PREFIX, + "Debug mode is on." + ) + }) + + test("returns a DrupalClient", () => { + expect(new DrupalClient(BASE_URL)).toBeInstanceOf(DrupalClient) + }) +}) + +describe("options parameter", () => { + describe("accessToken", () => { + test("defaults to `undefined`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.accessToken).toBe(undefined) + }) + + test("sets the accessToken", async () => { + const accessToken = { + token_type: "Bearer", + expires_in: 300, + access_token: + "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImVlNDkyOTI4ZTZjNj", + } + + const client = new DrupalClient(BASE_URL, { + accessToken, + }) + + expect(client.accessToken).toEqual(accessToken) + }) + }) + + describe("apiPrefix", () => { + test('defaults to "/jsonapi"', () => { + const client = new DrupalClient(BASE_URL) + expect(client.apiPrefix).toBe("/jsonapi") + }) + + test("sets the apiPrefix", () => { + const customEndPoint = "/customapi" + const client = new DrupalClient(BASE_URL, { + apiPrefix: customEndPoint, + }) + expect(client.apiPrefix).toBe(customEndPoint) + }) + }) + + describe("auth", () => { + test("defaults to `undefined`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.auth).toBe(undefined) + }) + + test("sets the auth credentials", () => { + const auth: DrupalClient["auth"] = { + username: "example", + password: "pw", + } + const client = new DrupalClient(BASE_URL, { + auth, + }) + expect(client._auth).toMatchObject({ + ...auth, + url: "/oauth/token", + }) + }) + }) + + describe("cache", () => { + test("defaults to `null`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.cache).toBe(null) + }) + + test("sets the cache storage", () => { + const customCache: DrupalClient["cache"] = { + async get(key) { + // + }, + async set(key, value, ttl?: number) { + // + }, + } + const client = new DrupalClient(BASE_URL, { + cache: customCache, + }) + expect(client.cache).toBe(customCache) + }) + }) + + describe("debug", () => { + test("defaults to `false`", () => { + const consoleSpy = jest.spyOn(console, "debug").mockImplementation(() => { + // + }) + + new DrupalClient(BASE_URL) + + expect(consoleSpy).toBeCalledTimes(0) + }) + + test("turns on debug mode", () => { + const consoleSpy = jest.spyOn(console, "debug").mockImplementation(() => { + // + }) + + new DrupalClient(BASE_URL, { debug: true }) + + expect(consoleSpy).toBeCalledTimes(1) + }) + }) + + describe("fetcher", () => { + test("defaults to `undefined`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.fetcher).toBe(undefined) + }) + + test("sets up a custom fetcher", () => { + const customFetcher: DrupalClient["fetcher"] = async () => { + // + } + const client = new DrupalClient(BASE_URL, { + fetcher: customFetcher, + }) + expect(client.fetcher).toBe(customFetcher) + }) + }) + + describe("frontPage", () => { + test('defaults to "/home"', () => { + const client = new DrupalClient(BASE_URL) + expect(client.frontPage).toBe("/home") + }) + + test("sets up a custom frontPage", () => { + const customFrontPage = "/front" + + const client = new DrupalClient(BASE_URL, { + frontPage: customFrontPage, + }) + expect(client.frontPage).toBe(customFrontPage) + }) + }) + + describe("headers", () => { + test("defaults to `Content-Type`/`Accept`", () => { + const client = new DrupalClient(BASE_URL) + expect(client._headers).toMatchObject({ + "Content-Type": "application/vnd.api+json", + Accept: "application/vnd.api+json", + }) + }) + + test("sets custom headers", () => { + const customHeaders = { + CustomContentType: "application/json", + CustomAccept: "application/json", + } + + const client = new DrupalClient(BASE_URL, { + headers: customHeaders, + }) + expect(client._headers).toMatchObject(customHeaders) + }) + }) + + describe("logger", () => { + test("defaults to `console`-based `Logger`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.logger).toBe(defaultLogger) + }) + + test("sets up a custom logger", () => { + const customLogger: Logger = { + log: () => { + // + }, + debug: () => { + // + }, + warn: () => { + // + }, + error: () => { + // + }, + } + + const client = new DrupalClient(BASE_URL, { + logger: customLogger, + }) + expect(client.logger).toBe(customLogger) + }) + }) + + describe("previewSecret", () => { + test("defaults to `undefined`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.previewSecret).toBe(undefined) + }) + + test("sets up a custom previewSecret", () => { + const customPreviewSecret = "custom-secret-value" + + const client = new DrupalClient(BASE_URL, { + previewSecret: customPreviewSecret, + }) + expect(client.previewSecret).toBe(customPreviewSecret) + }) + }) + + describe("serializer", () => { + test("defaults to `new Jsona()`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.serializer).toBeInstanceOf(Jsona) + }) + + test("sets up a custom serializer", () => { + const customSerializer: DrupalClient["serializer"] = { + deserialize( + body: Record, + options?: Record + ): unknown { + return { + deserialized: true, + } + }, + } + + const client = new DrupalClient(BASE_URL, { + serializer: customSerializer, + }) + expect(client.serializer).toBe(customSerializer) + }) + }) + + describe("throwJsonApiErrors", () => { + test("defaults to `true`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.throwJsonApiErrors).toBe(true) + }) + + test("can be set to `false`", () => { + const client = new DrupalClient(BASE_URL, { + throwJsonApiErrors: false, + }) + expect(client.throwJsonApiErrors).toBe(false) + }) + }) + + describe("useDefaultResourceTypeEntry", () => { + test("defaults to `false`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.useDefaultResourceTypeEntry).toBe(false) + }) + + test("can be set to `true`", () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + }) + expect(client.useDefaultResourceTypeEntry).toBe(true) + }) + }) + + describe("withAuth", () => { + test("defaults to `false`", () => { + const client = new DrupalClient(BASE_URL) + expect(client.withAuth).toBe(false) + }) + + test("can be set to `true`", () => { + const client = new DrupalClient(BASE_URL, { + withAuth: true, + }) + expect(client.withAuth).toBe(true) + }) + }) +}) diff --git a/packages/next-drupal/tests/crud.test.ts b/packages/next-drupal/tests/DrupalClient/crud-methods.test.ts similarity index 67% rename from packages/next-drupal/tests/crud.test.ts rename to packages/next-drupal/tests/DrupalClient/crud-methods.test.ts index ed9a00b2..cb8e4015 100644 --- a/packages/next-drupal/tests/crud.test.ts +++ b/packages/next-drupal/tests/DrupalClient/crud-methods.test.ts @@ -1,10 +1,25 @@ -import { expect } from "@jest/globals" -import { DrupalClient } from "../src/client" -import type { DrupalNode } from "../src/types" -import { BASE_URL, deleteTestNodes, toggleDrupalModule } from "./utils" +import { + afterAll, + afterEach, + beforeAll, + describe, + expect, + jest, + test, +} from "@jest/globals" +import { DrupalClient } from "../../src" +import { + BASE_URL, + deleteTestNodes, + toggleDrupalModule, + mocks, + mockLogger, + spyOnFetch, +} from "../utils" +import type { DrupalNode, JsonApiCreateFileResourceBody } from "../../src" // Enabling and disabling modules takes longer. -// So we increase the time out to handle this. +// So we increase the timeout to 10 seconds to handle this. jest.setTimeout(10000) beforeAll(async () => { @@ -21,8 +36,8 @@ afterAll(async () => { await deleteTestNodes() }) -describe("createResource", () => { - test("it creates a resource", async () => { +describe("createResource()", () => { + test("creates a resource", async () => { const client = new DrupalClient(BASE_URL) const article = await client.createResource( @@ -46,7 +61,7 @@ describe("createResource", () => { expect(article.title).toEqual("TEST New article") }) - test("it creates a resource with a relationship", async () => { + test("creates a resource with a relationship", async () => { const client = new DrupalClient(BASE_URL, { auth: { username: process.env.DRUPAL_USERNAME, @@ -92,7 +107,7 @@ describe("createResource", () => { expect(article.field_media_image.name).toEqual(mediaImage.name) }) - test("it creates a localized resource", async () => { + test("creates a localized resource", async () => { const client = new DrupalClient(BASE_URL, { auth: { username: process.env.DRUPAL_USERNAME, @@ -112,7 +127,7 @@ describe("createResource", () => { expect(article.langcode).toEqual("es") }) - test("it throws an error for missing required attributes", async () => { + test("throws an error for missing required attributes", async () => { const client = new DrupalClient(BASE_URL, { auth: { username: process.env.DRUPAL_USERNAME, @@ -131,7 +146,7 @@ describe("createResource", () => { ) }) - test("it throws an error for invalid attributes", async () => { + test("throws an error for invalid attributes", async () => { const client = new DrupalClient(BASE_URL, { auth: { username: process.env.DRUPAL_USERNAME, @@ -172,8 +187,115 @@ describe("createResource", () => { }) }) -describe("updateResource", () => { - test("it updates a resource", async () => { +describe("createFileResource()", () => { + const mockBody: JsonApiCreateFileResourceBody = { + data: { + attributes: { + type: "file--file", + field: "field_media_image", + filename: "mediterranean-quiche-umami.jpg", + file: Buffer.from("mock-file-data"), + }, + }, + } + const mockResponseData = mocks.resources.file + + test("constructs the API path from body and options", async () => { + const logger = mockLogger() + const client = new DrupalClient("https://example.com", { + useDefaultResourceTypeEntry: true, + debug: true, + logger, + }) + const type = "type--from-first-argument" + const fetchSpy = spyOnFetch({ responseBody: mockResponseData }) + + await client.createFileResource(type, mockBody, { + withAuth: false, + params: { include: "extra_field" }, + }) + + expect(logger.debug).toBeCalledWith( + `Creating file resource for media of type ${type}.` + ) + expect(fetchSpy.mock.lastCall[0]).toBe( + "https://example.com/jsonapi/file/file/field_media_image?include=extra_field" + ) + }) + + test("constructs the API path using non-default locale", async () => { + const client = new DrupalClient("https://example.com", { + useDefaultResourceTypeEntry: true, + }) + const type = "type--from-first-argument" + const fetchSpy = spyOnFetch({ responseBody: mockResponseData }) + + await client.createFileResource(type, mockBody, { + withAuth: false, + params: { include: "extra_field" }, + locale: "es", + defaultLocale: "en", + }) + + expect(fetchSpy.mock.lastCall[0]).toBe( + "https://example.com/es/jsonapi/file/file/field_media_image?include=extra_field" + ) + }) + + test("returns the deserialized data", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + }) + spyOnFetch({ responseBody: mockResponseData }) + + const result = await client.createFileResource("ignored", mockBody, { + withAuth: false, + }) + + expect(result?.filename).toBe(mockResponseData.data.attributes.filename) + expect(result?.data?.attributes?.filename).toBe(undefined) + }) + + test("optionally returns the raw data", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + }) + spyOnFetch({ responseBody: mockResponseData }) + + const result = await client.createFileResource("ignored", mockBody, { + withAuth: false, + deserialize: false, + }) + + expect(result?.filename).toBe(undefined) + expect(result?.data?.attributes?.filename).toBe( + mockResponseData.data.attributes.filename + ) + }) + + test("throws error if response is not ok", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + }) + const message = "mock error" + spyOnFetch({ + responseBody: { message }, + status: 403, + headers: { + "content-type": "application/json", + }, + }) + + await expect( + client.createFileResource("ignored", mockBody, { + withAuth: false, + }) + ).rejects.toThrow(message) + }) +}) + +describe("updateResource()", () => { + test("updates a resource", async () => { const client = new DrupalClient(BASE_URL) const basic = Buffer.from( @@ -213,7 +335,7 @@ describe("updateResource", () => { expect(updatedArticle.title).toEqual("TEST New article updated") }) - test("it updates a resource with a relationship", async () => { + test("updates a resource with a relationship", async () => { const basic = Buffer.from( `${process.env.DRUPAL_USERNAME}:${process.env.DRUPAL_PASSWORD}` ).toString("base64") @@ -273,7 +395,7 @@ describe("updateResource", () => { expect(updatedArticle.field_media_image.name).toEqual(mediaImage.name) }) - test("it throws an error for missing required attributes", async () => { + test("throws an error for missing required attributes", async () => { const client = new DrupalClient(BASE_URL, { auth: { username: process.env.DRUPAL_USERNAME, @@ -302,7 +424,7 @@ describe("updateResource", () => { ) }) - test("it throws an error for invalid attributes", async () => { + test("throws an error for invalid attributes", async () => { const client = new DrupalClient(BASE_URL, { auth: { username: process.env.DRUPAL_USERNAME, @@ -349,8 +471,8 @@ describe("updateResource", () => { }) }) -describe("deleteResource", () => { - test("it deletes a resource", async () => { +describe("deleteResource()", () => { + test("deletes a resource", async () => { const client = new DrupalClient(BASE_URL, { auth: { username: process.env.DRUPAL_USERNAME, @@ -377,7 +499,7 @@ describe("deleteResource", () => { ) }) - test("it throws an error for invalid resource", async () => { + test("throws an error for invalid resource", async () => { const client = new DrupalClient(BASE_URL, { auth: { username: process.env.DRUPAL_USERNAME, diff --git a/packages/next-drupal/tests/DrupalClient/fetch-related-methods.test.ts b/packages/next-drupal/tests/DrupalClient/fetch-related-methods.test.ts new file mode 100644 index 00000000..1bdfe463 --- /dev/null +++ b/packages/next-drupal/tests/DrupalClient/fetch-related-methods.test.ts @@ -0,0 +1,1186 @@ +import { afterEach, describe, expect, jest, test } from "@jest/globals" +import { DrupalClient } from "../../src" +import { + BASE_URL, + mockLogger, + mocks, + spyOnFetch, + spyOnFetchOnce, +} from "../utils" +import type { + AccessToken, + DrupalClientAuth, + DrupalNode, + DrupalSearchApiJsonApiResponse, +} from "../../src" + +afterEach(() => { + jest.restoreAllMocks() +}) + +describe("fetch()", () => { + test("allows fetching custom url", async () => { + const client = new DrupalClient(BASE_URL) + const url = client.buildUrl( + "/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053" + ) + + const response = await client.fetch(url.toString()) + expect(response.headers.get("content-type")).toEqual( + "application/vnd.api+json" + ) + const json = await response.json() + expect(json).toMatchSnapshot() + }) + + test("allows for custom fetcher", async () => { + const customFetch = jest.fn() + + const client = new DrupalClient(BASE_URL, { + fetcher: customFetch, + }) + const url = client.buildUrl("/jsonapi").toString() + + await client.fetch(url) + expect(customFetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + headers: { + "Content-Type": "application/vnd.api+json", + Accept: "application/vnd.api+json", + }, + }) + ) + + await client.fetch(url, { + headers: { + foo: "bar", + }, + }) + expect(customFetch).toHaveBeenLastCalledWith( + url, + expect.objectContaining({ + headers: { + Accept: "application/vnd.api+json", + "Content-Type": "application/vnd.api+json", + foo: "bar", + }, + }) + ) + }) + + describe("authentication", () => { + const clientIdSecret = mocks.auth.clientIdSecret + + test("throws an error if withAuth is called when auth is not configured", async () => { + const client = new DrupalClient(BASE_URL) + + const url = client.buildUrl("/jsonapi") + + await expect( + client.fetch(url.toString(), { + withAuth: true, + }) + ).rejects.toThrow("auth is not configured.") + }) + + test("accepts username and password", async () => { + const customFetch = jest.fn() + + const client = new DrupalClient(BASE_URL, { + auth: { + username: "admin", + password: "password", + }, + fetcher: customFetch, + }) + const url = client.buildUrl("/jsonapi").toString() + + await client.fetch(url, { withAuth: true }) + expect(customFetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + headers: { + "Content-Type": "application/vnd.api+json", + Accept: "application/vnd.api+json", + Authorization: "Basic YWRtaW46cGFzc3dvcmQ=", + }, + withAuth: true, + }) + ) + }) + + test("accepts callback", async () => { + const customAuth = jest + .fn() + .mockReturnValue( + "Basic YXJzaGFkQG5leHQtZHJ1cGFsLm9yZzphYmMxMjM=" + ) as DrupalClientAuth + const customFetch = jest.fn() + + const client = new DrupalClient(BASE_URL, { + auth: customAuth, + fetcher: customFetch, + }) + const url = client.buildUrl("/jsonapi").toString() + + await client.fetch(url, { withAuth: true }) + expect(customFetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + headers: { + "Content-Type": "application/vnd.api+json", + Accept: "application/vnd.api+json", + Authorization: "Basic YXJzaGFkQG5leHQtZHJ1cGFsLm9yZzphYmMxMjM=", + }, + withAuth: true, + }) + ) + }) + + test("accepts clientId and clientSecret", async () => { + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + }) + const fetchSpy = spyOnFetch() + + const basic = Buffer.from( + `${clientIdSecret.clientId}:${clientIdSecret.clientSecret}` + ).toString("base64") + + await client.fetch("http://example.com", { withAuth: true }) + expect(fetchSpy).toHaveBeenNthCalledWith( + 1, + `${BASE_URL}/oauth/token`, + expect.objectContaining({ + headers: { + Accept: "application/json", + Authorization: `Basic ${basic}`, + "Content-Type": "application/x-www-form-urlencoded", + }, + }) + ) + }) + + test("accepts custom auth url", async () => { + const client = new DrupalClient(BASE_URL, { + auth: { + ...clientIdSecret, + url: "/custom/oauth", + }, + }) + const fetchSpy = spyOnFetch() + + await client.fetch("http://example.com", { withAuth: true }) + expect(fetchSpy).toHaveBeenNthCalledWith( + 1, + `${BASE_URL}/custom/oauth`, + expect.anything() + ) + }) + }) + + describe("headers", () => { + // TODO: Are these duplicates of getters-setters/headers tests? + test("allows setting custom headers", async () => { + const customFetch = jest.fn() + const client = new DrupalClient(BASE_URL, { + fetcher: customFetch, + }) + client.headers = { + foo: "bar", + } + + const url = "http://example.com" + + await client.fetch(url) + expect(customFetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + headers: { foo: "bar" }, + }) + ) + }) + + test("allows setting custom headers with custom auth", async () => { + const customFetch = jest.fn() + const client = new DrupalClient(BASE_URL, { + fetcher: customFetch, + headers: { + foo: "bar", + }, + auth: jest + .fn() + .mockReturnValue( + "Basic YXJzaGFkQG5leHQtZHJ1cGFsLm9yZzphYmMxMjM=" + ) as DrupalClientAuth, + }) + + const url = "http://example.com" + + await client.fetch(url, { withAuth: true }) + + expect(customFetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + headers: { + foo: "bar", + Authorization: "Basic YXJzaGFkQG5leHQtZHJ1cGFsLm9yZzphYmMxMjM=", + }, + withAuth: true, + }) + ) + }) + }) +}) + +describe("getAccessToken()", () => { + const accessToken = mocks.auth.accessToken + const clientIdSecret = mocks.auth.clientIdSecret + + test("uses the long-lived access token from constructor", async () => { + const longLivedAccessToken: AccessToken = { + ...accessToken, + expires_in: 360000, + } + const client = new DrupalClient(BASE_URL, { + accessToken: longLivedAccessToken, + }) + const fetchSpy = spyOnFetch({ + responseBody: { + ...accessToken, + access_token: "not-used", + }, + }) + + const token = await client.getAccessToken({ + clientId: "", + clientSecret: "", + scope: undefined, + }) + expect(fetchSpy).toHaveBeenCalledTimes(0) + expect(token).toBe(longLivedAccessToken) + }) + + test("throws if auth is not configured", async () => { + const fetchSpy = spyOnFetch({ + responseBody: accessToken, + }) + + const client = new DrupalClient(BASE_URL) + + await expect( + // @ts-ignore + client.getAccessToken({ clientId: clientIdSecret.clientId }) + ).rejects.toThrow( + "auth is not configured. See https://next-drupal.org/docs/client/auth" + ) + expect(fetchSpy).toHaveBeenCalledTimes(0) + }) + + test("BUG: throws if auth is ClientIdSecret and not given as opts", async () => { + const fetchSpy = spyOnFetch({ + responseBody: accessToken, + }) + + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + withAuth: true, + }) + + await expect( + // @ts-ignore + client.getAccessToken({ scope: "irrelevant" }) + ).rejects.toThrow( + "'clientId' and 'clientSecret' required. See https://next-drupal.org/docs/client/auth" + ) + expect(fetchSpy).toHaveBeenCalledTimes(0) + }) + + test("fetches an access token", async () => { + spyOnFetch({ + responseBody: accessToken, + }) + + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + debug: true, + logger, + }) + + const token = await client.getAccessToken() + expect(token).toEqual(accessToken) + expect(logger.debug).toHaveBeenCalledWith("Fetching new access token.") + }) + + test("re-uses access token", async () => { + spyOnFetchOnce({ + responseBody: accessToken, + }) + const fetchSpy = spyOnFetchOnce({ + responseBody: { + ...accessToken, + access_token: "differentAccessToken", + expires_in: 1800, + }, + }) + + const logger = mockLogger() + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + debug: true, + logger, + }) + + const token1 = await client.getAccessToken() + const token2 = await client.getAccessToken() + expect(token1).toEqual(token2) + expect(logger.debug).toHaveBeenLastCalledWith( + "Using existing access token." + ) + expect(fetchSpy).toHaveBeenCalledTimes(1) + }) +}) + +describe("getEntryForResourceType()", () => { + test("returns the JSON:API entry for a resource type", async () => { + const client = new DrupalClient(BASE_URL) + const getIndexSpy = jest.spyOn(client, "getIndex") + + const recipeEntry = await client.getEntryForResourceType("node--recipe") + expect(recipeEntry).toMatch(`${BASE_URL}/en/jsonapi/node/recipe`) + expect(getIndexSpy).toHaveBeenCalledTimes(1) + + const articleEntry = await client.getEntryForResourceType("node--article") + expect(articleEntry).toMatch(`${BASE_URL}/en/jsonapi/node/article`) + expect(getIndexSpy).toHaveBeenCalledTimes(2) + }) + + test("assembles JSON:API entry without fetching index", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + }) + const getIndexSpy = jest.spyOn(client, "getIndex") + + const recipeEntry = await client.getEntryForResourceType("node--article") + expect(recipeEntry).toMatch(`${BASE_URL}/jsonapi/node/article`) + expect(getIndexSpy).toHaveBeenCalledTimes(0) + }) + + test("throws an error if resource type does not exist", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getEntryForResourceType("RESOURCE-DOES-NOT-EXIST") + ).rejects.toThrow("Resource of type 'RESOURCE-DOES-NOT-EXIST' not found.") + }) +}) + +describe("getIndex()", () => { + test("fetches the JSON:API index", async () => { + const client = new DrupalClient(BASE_URL) + const index = await client.getIndex() + + expect(index).toMatchSnapshot() + }) + + test("fetches the JSON:API index with locale", async () => { + const client = new DrupalClient(BASE_URL) + const index = await client.getIndex("es") + + expect(index).toMatchSnapshot() + }) + + test("throws error for invalid base url", async () => { + const client = new DrupalClient("https://example.com") + + await expect(client.getIndex()).rejects.toThrow( + "Failed to fetch JSON:API index at https://example.com/jsonapi" + ) + }) +}) + +describe("getMenu()", () => { + test("fetches menu items for a menu", async () => { + const client = new DrupalClient(BASE_URL) + + const menu = await client.getMenu("main") + + expect(menu).toMatchSnapshot() + }) + + test("fetches menu items for a menu with locale", async () => { + const client = new DrupalClient(BASE_URL) + + const menu = await client.getMenu("main", { + locale: "es", + defaultLocale: "en", + }) + + expect(menu).toMatchSnapshot() + }) + + test("fetches menu items for a menu with params", async () => { + const client = new DrupalClient(BASE_URL) + + const menu = await client.getMenu("main", { + params: { + "fields[menu_link_content--menu_link_content]": "title", + }, + }) + + expect(menu).toMatchSnapshot() + }) + + test("throws an error for invalid menu name", async () => { + const client = new DrupalClient(BASE_URL) + + await expect(client.getMenu("INVALID")).rejects.toThrow( + '404 Not Found\nThe "menu" parameter was not converted for the path "/jsonapi/menu_items/{menu}" (route name: "jsonapi_menu_items.menu")' + ) + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + await client.getMenu("main") + expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { + withAuth: false, + }) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + await client.getMenu("main", { withAuth: true }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) +}) + +describe("getResource()", () => { + test("fetches a resource by uuid", async () => { + const client = new DrupalClient(BASE_URL) + const recipe = await client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f" + ) + + expect(recipe).toMatchSnapshot() + }) + + test("fetches a resource by uuid with params", async () => { + const client = new DrupalClient(BASE_URL) + const recipe = await client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + params: { + "fields[node--recipe]": "title,field_cooking_time", + }, + } + ) + + expect(recipe).toMatchSnapshot() + }) + + test("fetches a resource using locale", async () => { + const client = new DrupalClient(BASE_URL) + const recipe = await client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + locale: "es", + defaultLocale: "en", + params: { + "fields[node--recipe]": "title,field_cooking_time", + }, + } + ) + + expect(recipe).toMatchSnapshot() + }) + + test("fetches raw data", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + deserialize: false, + } + ) + ).resolves.toMatchSnapshot() + }) + + test("fetches a resource by revision", async () => { + const client = new DrupalClient(BASE_URL) + const recipe = await client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + params: { + "fields[node--recipe]": "drupal_internal__vid", + }, + } + ) + const latestRevision = await client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + params: { + resourceVersion: "rel:latest-version", + "fields[node--recipe]": "drupal_internal__vid", + }, + } + ) + + expect(recipe.drupal_internal__vid).toEqual( + latestRevision.drupal_internal__vid + ) + }) + + test("throws an error for invalid revision", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + params: { + resourceVersion: "id:-11", + "fields[node--recipe]": "title", + }, + } + ) + ).rejects.toThrow( + "404 Not Found\nThe requested version, identified by `id:-11`, could not be found." + ) + }) + + test("throws an error if revision access is forbidden", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + params: { + resourceVersion: "id:1", + "fields[node--recipe]": "title", + }, + } + ) + ).rejects.toThrow( + "403 Forbidden\nThe current user is not allowed to GET the selected resource. The user does not have access to the requested version." + ) + }) + + test("throws an error for invalid resource type", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResource( + "RESOURCE-DOES-NOT-EXIST", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f" + ) + ).rejects.toThrow("Resource of type 'RESOURCE-DOES-NOT-EXIST' not found.") + }) + + test("throws an error for invalid params", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + params: { + include: "invalid_relationship", + }, + } + ) + ).rejects.toThrow( + "400 Bad Request\n`invalid_relationship` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media_image, field_recipe_category, field_tags." + ) + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + await client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f" + ) + expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { + withAuth: false, + }) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + await client.getResource( + "node--recipe", + "71e04ead-4cc7-416c-b9ca-60b635fdc50f", + { + withAuth: true, + } + ) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) +}) + +describe("getResourceByPath()", () => { + test("fetches a resource by path", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceByPath("/recipes/deep-mediterranean-quiche") + ).resolves.toMatchSnapshot() + }) + + test("fetches a resource by path with params", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceByPath("/recipes/deep-mediterranean-quiche", { + params: { + "fields[node--recipe]": "title,field_cooking_time", + }, + }) + ).resolves.toMatchSnapshot() + }) + + test("fetches a resource by path using locale", async () => { + const client = new DrupalClient(BASE_URL) + const recipe = await client.getResourceByPath( + "/recipes/quiche-mediterráneo-profundo", + { + locale: "es", + defaultLocale: "en", + params: { + "fields[node--recipe]": "title,field_cooking_time", + }, + } + ) + + expect(recipe).toMatchSnapshot() + }) + + test("fetches raw data", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceByPath("/recipes/deep-mediterranean-quiche", { + deserialize: false, + }) + ).resolves.toMatchSnapshot() + }) + + test("fetches a resource by revision", async () => { + const client = new DrupalClient(BASE_URL) + const recipe = await client.getResourceByPath( + "/recipes/deep-mediterranean-quiche", + { + params: { + "fields[node--recipe]": "drupal_internal__vid", + }, + } + ) + const latestRevision = await client.getResourceByPath( + "/recipes/deep-mediterranean-quiche", + { + params: { + resourceVersion: "rel:latest-version", + "fields[node--recipe]": "drupal_internal__vid", + }, + } + ) + + expect(recipe.drupal_internal__vid).toEqual( + latestRevision.drupal_internal__vid + ) + }) + + test("throws an error for invalid revision", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceByPath( + "/recipes/deep-mediterranean-quiche", + { + params: { + resourceVersion: "id:-11", + "fields[node--recipe]": "title", + }, + } + ) + ).rejects.toThrow( + "404 Not Found\nThe requested version, identified by `id:-11`, could not be found." + ) + }) + + test("throws an error if revision access is forbidden", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceByPath( + "/recipes/deep-mediterranean-quiche", + { + params: { + resourceVersion: "id:1", + "fields[node--recipe]": "title", + }, + } + ) + ).rejects.toThrow( + "403 Forbidden\nThe current user is not allowed to GET the selected resource. The user does not have access to the requested version." + ) + }) + + test("returns null for path not found", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceByPath("/path-do-not-exist") + ).rejects.toThrow("Unable to resolve path /path-do-not-exist.") + }) + + test("throws an error for invalid params", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceByPath( + "/recipes/deep-mediterranean-quiche", + { + params: { + include: "invalid_relationship", + }, + } + ) + ).rejects.toThrow( + "400 Bad Request\n`invalid_relationship` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media_image, field_recipe_category, field_tags." + ) + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + const getAccessTokenSpy = jest.spyOn(client, "getAccessToken") + + await client.getResourceByPath( + "/recipes/deep-mediterranean-quiche" + ) + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.not.objectContaining({ + withAuth: true, + }) + ) + expect(getAccessTokenSpy).not.toHaveBeenCalled() + }) + + test("makes authenticated requests with withAuth", async () => { + const client = new DrupalClient(BASE_URL, { + auth: mocks.auth.clientIdSecret, + }) + const fetchSpy = spyOnFetch() + const getAccessTokenSpy = jest.spyOn(client, "getAccessToken") + + await client.getResourceByPath( + "/recipes/deep-mediterranean-quiche", + { + withAuth: true, + } + ) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + expect(getAccessTokenSpy).toHaveBeenCalled() + }) + + test("returns null if path is falsey", async () => { + const client = new DrupalClient(BASE_URL) + + const resource = await client.getResourceByPath("") + expect(resource).toBe(null) + }) +}) + +describe("getResourceCollection()", () => { + test("fetches a resource collection", async () => { + const client = new DrupalClient(BASE_URL) + + const articles = await client.getResourceCollection("node--article", { + params: { + "fields[node--article]": "title", + }, + }) + + expect(articles).toMatchSnapshot() + }) + + test("fetches a resource collection using locale", async () => { + const client = new DrupalClient(BASE_URL) + + const articles = await client.getResourceCollection("node--article", { + locale: "es", + defaultLocale: "en", + params: { + "fields[node--article]": "title,langcode", + }, + }) + + expect(articles[0].langcode).toEqual("es") + + expect(articles).toMatchSnapshot() + }) + + test("fetches raw data", async () => { + const client = new DrupalClient(BASE_URL) + + const recipes = await client.getResourceCollection("node--recipe", { + deserialize: false, + params: { + "fields[node--recipe]": "title", + "page[limit]": 2, + }, + }) + + expect(recipes).toMatchSnapshot() + }) + + test("throws an error for invalid resource type", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceCollection("RESOURCE-DOES-NOT-EXIST") + ).rejects.toThrow("Resource of type 'RESOURCE-DOES-NOT-EXIST' not found.") + }) + + test("throws an error for invalid params", async () => { + const client = new DrupalClient(BASE_URL) + + await expect( + client.getResourceCollection("node--recipe", { + params: { + include: "invalid_relationship", + }, + }) + ).rejects.toThrow( + "400 Bad Request\n`invalid_relationship` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media_image, field_recipe_category, field_tags." + ) + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + await client.getResourceCollection("node--recipe") + expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { + withAuth: false, + }) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + await client.getResourceCollection("node--recipe", { + withAuth: true, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) +}) + +describe("getSearchIndex()", () => { + test("fetches a search index", async () => { + const client = new DrupalClient(BASE_URL) + + const search = await client.getSearchIndex("recipes", { + params: { + "fields[node--recipe]": "title", + }, + }) + + expect(search).toMatchSnapshot() + }) + + test("fetches a search index with locale", async () => { + const client = new DrupalClient(BASE_URL) + + const search = await client.getSearchIndex("recipes", { + locale: "es", + defaultLocale: "en", + params: { + "fields[node--recipe]": "title", + }, + }) + + expect(search).toMatchSnapshot() + }) + + test("fetches a search index with facets filters", async () => { + const client = new DrupalClient(BASE_URL) + + const search = await client.getSearchIndex( + "recipes", + { + deserialize: false, + params: { + "filter[difficulty]": "easy", + "fields[node--recipe]": "title,field_difficulty", + }, + } + ) + + expect(search).toMatchSnapshot() + expect(search.meta.facets).not.toBeNull() + }) + + test("fetches raw data from search index", async () => { + const client = new DrupalClient(BASE_URL) + + const search = await client.getSearchIndex("recipes", { + deserialize: false, + params: { + "filter[difficulty]": "easy", + "fields[node--recipe]": "title,field_difficulty", + }, + }) + + expect(search).toMatchSnapshot() + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + await client.getSearchIndex("recipes") + + expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { + withAuth: false, + }) + }) + + test("throws an error for invalid index", async () => { + const client = new DrupalClient(BASE_URL) + + await expect(client.getSearchIndex("INVALID-INDEX")).rejects.toThrow( + "Not Found" + ) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + await client.getSearchIndex("recipes", { + withAuth: true, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) +}) + +describe("getView()", () => { + test("fetches a view", async () => { + const client = new DrupalClient(BASE_URL) + + const view = await client.getView("featured_articles--page_1") + + expect(view).toMatchSnapshot() + }) + + test("fetches a view with params", async () => { + const client = new DrupalClient(BASE_URL) + + const view = await client.getView("featured_articles--page_1", { + params: { + "fields[node--article]": "title", + }, + }) + + expect(view).toMatchSnapshot() + }) + + test("fetches a view with locale", async () => { + const client = new DrupalClient(BASE_URL) + + const view = await client.getView("featured_articles--page_1", { + locale: "es", + defaultLocale: "en", + params: { + "fields[node--article]": "title", + }, + }) + + expect(view).toMatchSnapshot() + }) + + test("fetches raw data", async () => { + const client = new DrupalClient(BASE_URL) + + const view = await client.getView("featured_articles--page_1", { + locale: "es", + defaultLocale: "en", + deserialize: false, + params: { + "fields[node--article]": "title", + }, + }) + + expect(view).toMatchSnapshot() + }) + + test("throws an error for invalid view name", async () => { + const client = new DrupalClient(BASE_URL) + + await expect(client.getView("INVALID")).rejects.toThrow("Not Found") + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + await client.getView("featured_articles--page_1") + expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { + withAuth: false, + }) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + await client.getView("featured_articles--page_1", { withAuth: true }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) + + test("fetches a view with links for pagination", async () => { + const client = new DrupalClient(BASE_URL) + const view = await client.getView("recipes--page_1") + + expect(view.links).toHaveProperty("next") + }) +}) + +describe("translatePath()", () => { + test("translates a path", async () => { + const client = new DrupalClient(BASE_URL) + + const path = await client.translatePath("recipes/deep-mediterranean-quiche") + + expect(path).toMatchSnapshot() + + const path2 = await client.translatePath( + "/recipes/deep-mediterranean-quiche" + ) + + expect(path).toEqual(path2) + }) + + test("returns null for path not found", async () => { + const client = new DrupalClient(BASE_URL) + + const path = await client.translatePath("/path-not-found") + + expect(path).toBeNull() + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + await client.translatePath("recipes/deep-mediterranean-quiche") + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: false, + }) + ) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + await client.translatePath("recipes/deep-mediterranean-quiche", { + withAuth: true, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) +}) diff --git a/packages/next-drupal/tests/DrupalClient/getters-setters.test.ts b/packages/next-drupal/tests/DrupalClient/getters-setters.test.ts new file mode 100644 index 00000000..ce224196 --- /dev/null +++ b/packages/next-drupal/tests/DrupalClient/getters-setters.test.ts @@ -0,0 +1,224 @@ +import { afterEach, describe, expect, jest, test } from "@jest/globals" +import { + AccessToken, + DrupalClient, + DrupalClientAuthAccessToken, + DrupalClientAuthUsernamePassword, + DrupalClientOptions, +} from "../../src" +import { BASE_URL, mocks } from "../utils" + +afterEach(() => { + jest.restoreAllMocks() +}) + +describe("apiPrefix", () => { + test("get apiPrefix", () => { + const client = new DrupalClient(BASE_URL) + expect(client.apiPrefix).toBe("/jsonapi") + }) + test("set apiPrefix", () => { + const client = new DrupalClient(BASE_URL) + client.apiPrefix = "/api" + expect(client.apiPrefix).toBe("/api") + }) + test('set apiPrefix and prefixes with "/"', () => { + const client = new DrupalClient(BASE_URL) + client.apiPrefix = "api" + expect(client.apiPrefix).toBe("/api") + }) +}) + +describe("auth", () => { + describe("throws an error if invalid Basic Auth", () => { + test("missing username", () => { + expect(() => { + const client = new DrupalClient(BASE_URL) + // @ts-ignore + client.auth = { + password: "password", + } + }).toThrow( + "'username' and 'password' are required for auth. See https://next-drupal.org/docs/client/auth" + ) + }) + + test("missing password", () => { + expect(() => { + const client = new DrupalClient(BASE_URL) + // @ts-ignore + client.auth = { + username: "admin", + } + }).toThrow( + "'username' and 'password' are required for auth. See https://next-drupal.org/docs/client/auth" + ) + }) + }) + + describe("throws an error if invalid Access Token", () => { + // TODO: The wrong error is thrown. + test.skip("missing access_token", () => { + expect(() => { + const client = new DrupalClient(BASE_URL) + // @ts-ignore + client.auth = { + token_type: "bearer", + } + }).toThrow( + "'access_token' and 'token_type' are required for auth. See https://next-drupal.org/docs/client/auth" + ) + }) + + test("missing token_type", () => { + expect(() => { + const client = new DrupalClient(BASE_URL) + // @ts-ignore + client.auth = { + access_token: mocks.auth.accessToken.access_token, + } + }).toThrow( + "'access_token' and 'token_type' are required for auth. See https://next-drupal.org/docs/client/auth" + ) + }) + }) + + describe("throws an error if invalid Client ID/Secret", () => { + test("missing clientId", () => { + expect(() => { + const client = new DrupalClient(BASE_URL) + // @ts-ignore + client.auth = { + clientSecret: mocks.auth.clientIdSecret.clientSecret, + } + }).toThrow( + "'clientId' and 'clientSecret' are required for auth. See https://next-drupal.org/docs/client/auth" + ) + }) + + test("missing clientSecret", () => { + expect(() => { + const client = new DrupalClient(BASE_URL) + // @ts-ignore + client.auth = { + clientId: mocks.auth.clientIdSecret.clientId, + } + }).toThrow( + "'clientId' and 'clientSecret' are required for auth. See https://next-drupal.org/docs/client/auth" + ) + }) + }) + + test("sets Basic Auth", () => { + const basicAuth: DrupalClientAuthUsernamePassword = { + ...mocks.auth.basicAuth, + } + const client = new DrupalClient(BASE_URL) + client.auth = basicAuth + expect(client._auth).toMatchObject({ ...basicAuth }) + }) + + test("sets Access Token", () => { + const accessToken = { + ...mocks.auth.accessToken, + } + const client = new DrupalClient(BASE_URL) + client.auth = accessToken + expect(client._auth).toMatchObject({ ...accessToken }) + }) + + test("sets Client ID/Secret", () => { + const clientIdSecret = { + ...mocks.auth.clientIdSecret, + } + const client = new DrupalClient(BASE_URL) + client.auth = clientIdSecret + expect(client._auth).toMatchObject({ ...clientIdSecret }) + }) + + test("sets auth function", () => { + const authFunction = mocks.auth.function + const client = new DrupalClient(BASE_URL) + client.auth = authFunction + expect(client._auth).toBe(authFunction) + }) + + test("sets custom Authorization string", () => { + const authString = `${mocks.auth.customAuthenticationHeader}` + const client = new DrupalClient(BASE_URL) + client.auth = authString + expect(client._auth).toBe(authString) + }) + + test("sets a default access token url", () => { + const accessToken = { + ...mocks.auth.accessToken, + } + const client = new DrupalClient(BASE_URL) + client.auth = accessToken + expect(client._auth.url).toBe("/oauth/token") + }) + + test("can override the default access token url", () => { + const accessToken = { + ...mocks.auth.accessToken, + url: "/custom/oauth/token", + } + const client = new DrupalClient(BASE_URL) + client.auth = accessToken + expect(client._auth.url).toBe("/custom/oauth/token") + }) +}) + +describe("headers", () => { + describe("set headers", () => { + test("using key-value pairs", () => { + const headers = [ + ["Content-Type", "application/x-www-form-urlencoded"], + ["Accept", "application/json"], + ] as DrupalClientOptions["headers"] + const client = new DrupalClient(BASE_URL) + client.headers = headers + expect(client._headers).toBe(headers) + }) + + test("using object literal", () => { + const headers = { + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json", + } as DrupalClientOptions["headers"] + const client = new DrupalClient(BASE_URL) + client.headers = headers + expect(client._headers).toBe(headers) + }) + + test("using Headers object", () => { + const headers = new Headers() + headers.append("Content-Type", "application/x-www-form-urlencoded") + headers.append("Accept", "application/json") + + const client = new DrupalClient(BASE_URL) + client.headers = headers + expect(client._headers).toBe(headers) + }) + }) +}) + +describe("token", () => { + test("set token", () => { + function getExpiresOn(token: AccessToken): number { + return Date.now() + token.expires_in * 1000 + } + + const accessToken = { + ...mocks.auth.accessToken, + } as DrupalClientAuthAccessToken + const before = getExpiresOn(accessToken) + + const client = new DrupalClient(BASE_URL) + client.token = accessToken + expect(client._token).toBe(accessToken) + expect(client.tokenExpiresOn).toBeGreaterThanOrEqual(before) + expect(client.tokenExpiresOn).toBeLessThanOrEqual(getExpiresOn(accessToken)) + }) +}) diff --git a/packages/next-drupal/tests/DrupalClient/pages-router-methods.test.ts b/packages/next-drupal/tests/DrupalClient/pages-router-methods.test.ts new file mode 100644 index 00000000..fa4679b5 --- /dev/null +++ b/packages/next-drupal/tests/DrupalClient/pages-router-methods.test.ts @@ -0,0 +1,1252 @@ +import { afterEach, describe, expect, jest, test } from "@jest/globals" +import { GetStaticPropsContext } from "next" +import { DrupalClient } from "../../src" +import { BASE_URL, mocks, spyOnFetch } from "../utils" +import type { DrupalNode, JsonApiResourceWithPath } from "../../src" + +afterEach(() => { + jest.restoreAllMocks() +}) + +describe("buildStaticPathsFromResources()", () => { + const resources: Pick[] = [ + { + path: { + alias: "/blog/post/one", + pid: 1, + langcode: "en", + }, + }, + { + path: { + alias: "/blog/post/two", + pid: 2, + langcode: "en", + }, + }, + ] + + test("builds static paths from resources", () => { + const client = new DrupalClient(BASE_URL) + + expect(client.buildStaticPathsFromResources(resources)).toMatchObject([ + { + params: { + slug: ["blog", "post", "one"], + }, + }, + { + params: { + slug: ["blog", "post", "two"], + }, + }, + ]) + + expect( + client.buildStaticPathsFromResources(resources, { locale: "es" }) + ).toMatchObject([ + { + locale: "es", + params: { + slug: ["blog", "post", "one"], + }, + }, + { + locale: "es", + params: { + slug: ["blog", "post", "two"], + }, + }, + ]) + }) + + test("builds static paths from resources with pathPrefix", () => { + const client = new DrupalClient(BASE_URL) + + const paths = client.buildStaticPathsFromResources(resources, { + pathPrefix: "blog", + }) + + const paths2 = client.buildStaticPathsFromResources(resources, { + pathPrefix: "/blog", + }) + + const paths3 = client.buildStaticPathsFromResources(resources, { + pathPrefix: "/blog/post", + locale: "es", + }) + + const paths4 = client.buildStaticPathsFromResources(resources, { + pathPrefix: "blog/post", + locale: "es", + }) + + expect(paths).toMatchObject([ + { + params: { + slug: ["post", "one"], + }, + }, + { + params: { + slug: ["post", "two"], + }, + }, + ]) + expect(paths3).toMatchObject([ + { + locale: "es", + params: { + slug: ["one"], + }, + }, + { + locale: "es", + params: { + slug: ["two"], + }, + }, + ]) + + expect(paths).toEqual(paths2) + expect(paths3).toEqual(paths4) + }) + + test('converts frontPage path to "/"', () => { + const client = new DrupalClient(BASE_URL) + + const resources: Pick[] = [ + { + path: { + alias: "/home", + pid: 1, + langcode: "en", + }, + }, + ] + + expect(client.buildStaticPathsFromResources(resources)).toMatchObject([ + { + params: { + slug: [""], + }, + }, + ]) + }) +}) + +describe("buildStaticPathsParamsFromPaths()", () => { + test("builds static paths from paths", () => { + const client = new DrupalClient(BASE_URL) + + const paths = ["/blog/post/one", "/blog/post/two", "/blog/post/three"] + + expect(client.buildStaticPathsParamsFromPaths(paths)).toMatchObject([ + { + params: { + slug: ["blog", "post", "one"], + }, + }, + { + params: { + slug: ["blog", "post", "two"], + }, + }, + { + params: { + slug: ["blog", "post", "three"], + }, + }, + ]) + + expect( + client.buildStaticPathsParamsFromPaths(paths, { locale: "en" }) + ).toMatchObject([ + { + locale: "en", + params: { + slug: ["blog", "post", "one"], + }, + }, + { + locale: "en", + params: { + slug: ["blog", "post", "two"], + }, + }, + { + locale: "en", + params: { + slug: ["blog", "post", "three"], + }, + }, + ]) + }) + + test("builds static paths from paths with pathPrefix", () => { + const client = new DrupalClient(BASE_URL) + + const paths = client.buildStaticPathsParamsFromPaths( + ["/blog/post/one", "/blog/post/two", "/blog/post"], + { pathPrefix: "blog" } + ) + + const paths2 = client.buildStaticPathsParamsFromPaths( + ["/blog/post/one", "/blog/post/two", "/blog/post"], + { pathPrefix: "/blog" } + ) + + const paths3 = client.buildStaticPathsParamsFromPaths( + ["blog/post/one", "blog/post/two", "blog/post"], + { pathPrefix: "/blog" } + ) + + const paths4 = client.buildStaticPathsParamsFromPaths( + ["blog/post/one", "blog/post/two", "blog/post"], + { pathPrefix: "blog" } + ) + + expect(paths).toMatchObject([ + { + params: { + slug: ["post", "one"], + }, + }, + { + params: { + slug: ["post", "two"], + }, + }, + { + params: { + slug: ["post"], + }, + }, + ]) + + expect(paths).toEqual(paths2) + expect(paths).toEqual(paths3) + expect(paths).toEqual(paths4) + }) +}) + +describe("getAuthFromContextAndOptions()", () => { + const clientIdSecret = mocks.auth.clientIdSecret + + test("should use the withAuth option if provided and NOT in preview", async () => { + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + await client.getResourceFromContext( + "node--article", + { + preview: false, + }, + { + withAuth: true, + } + ) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + + await client.getResourceFromContext( + "node--article", + { + preview: false, + }, + { + withAuth: { + clientId: "foo", + clientSecret: "bar", + scope: "baz", + }, + } + ) + + expect(fetchSpy).toHaveBeenLastCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: { + clientId: "foo", + clientSecret: "bar", + scope: "baz", + }, + }) + ) + }) + + test("should fallback to the global auth if NOT in preview and no withAuth option provided", async () => { + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + }) + const fetchSpy = spyOnFetch() + + await client.getResourceFromContext("node--article", { + preview: false, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: false, + }) + ) + + const client2 = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + withAuth: true, + }) + jest.spyOn(client2, "getAccessToken").mockImplementation(async () => ({ + token_type: "", + expires_in: 0, + access_token: "", + })) + + await client2.getResourceFromContext("node--article", { + preview: false, + }) + + expect(fetchSpy).toHaveBeenLastCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) + + test("should NOT use the global auth if in preview", async () => { + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + withAuth: true, + }) + const fetchSpy = spyOnFetch() + + await client.getResourceFromContext("node--article", { + preview: true, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: null, + }) + ) + }) + + test("should use the scope from context if in preview and using the simple_oauth plugin", async () => { + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + }) + const fetchSpy = spyOnFetch() + + await client.getResourceFromContext("node--article", { + preview: true, + previewData: { + plugin: "simple_oauth", + scope: "editor", + }, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: { + ...clientIdSecret, + scope: "editor", + url: "/oauth/token", + }, + }) + ) + }) + + test("should use the scope from context even with global withAuth if in preview and using the simple_oauth plugin", async () => { + const client = new DrupalClient(BASE_URL, { + auth: { + ...clientIdSecret, + scope: "administrator", + }, + withAuth: true, + }) + const fetchSpy = spyOnFetch() + + await client.getResourceFromContext("node--article", { + preview: true, + previewData: { + plugin: "simple_oauth", + scope: "editor", + }, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: { + ...clientIdSecret, + scope: "editor", + url: "/oauth/token", + }, + }) + ) + }) + + test("should use the access_token from context if in preview and using the jwt plugin", async () => { + const client = new DrupalClient(BASE_URL, { + auth: clientIdSecret, + }) + const fetchSpy = spyOnFetch() + + await client.getResourceFromContext("node--article", { + preview: true, + previewData: { + plugin: "jwt", + access_token: "example-token", + }, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: `Bearer example-token`, + }) + ) + }) + + test("should use the access token from context even with global withAuth if in preview and using the jwt plugin", async () => { + const client = new DrupalClient(BASE_URL, { + auth: { + ...clientIdSecret, + scope: "administrator", + }, + withAuth: true, + }) + const fetchSpy = spyOnFetch() + + await client.getResourceFromContext("node--article", { + preview: true, + previewData: { + plugin: "jwt", + access_token: "example-token", + }, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: `Bearer example-token`, + }) + ) + }) +}) + +describe("getPathFromContext()", () => { + test("returns a path from context", async () => { + const client = new DrupalClient(BASE_URL) + + expect( + client.getPathFromContext({ + params: { + slug: ["foo"], + }, + }) + ).toEqual("/foo") + + expect( + client.getPathFromContext({ + params: { + slug: ["foo", "bar"], + }, + }) + ).toEqual("/foo/bar") + + expect( + client.getPathFromContext({ + locale: "en", + defaultLocale: "es", + params: { + slug: ["foo", "bar"], + }, + }) + ).toEqual("/en/foo/bar") + + expect( + client.getPathFromContext({ + params: { + slug: [], + }, + }) + ).toEqual("/home") + + client.frontPage = "/front" + + expect( + client.getPathFromContext({ + params: { + slug: [], + }, + }) + ).toEqual("/front") + + expect( + client.getPathFromContext({ + locale: "es", + defaultLocale: "en", + params: { + slug: [], + }, + }) + ).toEqual("/es/front") + }) + + test("returns a path from context with pathPrefix", () => { + const client = new DrupalClient(BASE_URL) + + expect( + client.getPathFromContext( + { + params: { + slug: ["bar", "baz"], + }, + }, + { + pathPrefix: "/foo", + } + ) + ).toEqual("/foo/bar/baz") + + expect( + client.getPathFromContext( + { + params: { + slug: ["bar", "baz"], + }, + }, + { + pathPrefix: "foo", + } + ) + ).toEqual("/foo/bar/baz") + + expect( + client.getPathFromContext( + { + locale: "en", + defaultLocale: "en", + params: { + slug: ["bar", "baz"], + }, + }, + { + pathPrefix: "foo", + } + ) + ).toEqual("/foo/bar/baz") + + expect( + client.getPathFromContext( + { + locale: "es", + defaultLocale: "en", + params: { + slug: ["bar", "baz"], + }, + }, + { + pathPrefix: "foo", + } + ) + ).toEqual("/es/foo/bar/baz") + + expect( + client.getPathFromContext( + { + locale: "es", + defaultLocale: "en", + params: { + slug: [], + }, + }, + { + pathPrefix: "/foo", + } + ) + ).toEqual("/es/foo/home") + + client.frontPage = "/baz" + + expect( + client.getPathFromContext( + { + locale: "en", + defaultLocale: "en", + params: { + slug: [], + }, + }, + { + pathPrefix: "foo", + } + ) + ).toEqual("/foo/baz") + + expect( + client.getPathFromContext( + { + params: { + slug: [], + }, + }, + { + pathPrefix: "/foo/bar", + } + ) + ).toEqual("/foo/bar/baz") + }) + + test("encodes path with punctuation", async () => { + const client = new DrupalClient(BASE_URL) + + const path = client.getPathFromContext({ + params: { + slug: ["path&with^punc&in$path"], + }, + }) + + expect(path).toEqual("/path%26with%5Epunc%26in%24path") + + const translatedPath = await client.translatePath(path) + + expect(translatedPath).toMatchSnapshot() + }) +}) + +describe("getPathsFromContext()", () => { + test("is an alias for getStaticPathsFromContext", () => { + const client = new DrupalClient(BASE_URL) + expect(client.getPathsFromContext).toBe(client.getStaticPathsFromContext) + }) +}) + +describe("getResourceCollectionFromContext()", () => { + test("fetches a resource collection", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + locale: "en", + defaultLocale: "en", + } + + const articles = await client.getResourceCollectionFromContext( + "node--article", + context, + { + params: { + "fields[node--article]": "title", + }, + } + ) + + expect(articles).toMatchSnapshot() + }) + + test("fetches a resource collection using locale", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + locale: "es", + defaultLocale: "en", + } + + const articles = await client.getResourceCollectionFromContext( + "node--article", + context, + { + params: { + "fields[node--article]": "title,langcode", + }, + } + ) + + expect(articles[0].langcode).toEqual("es") + + expect(articles).toMatchSnapshot() + }) + + test("fetches raw data", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + locale: "en", + defaultLocale: "en", + } + + const recipes = await client.getResourceCollectionFromContext( + "node--recipe", + context, + { + deserialize: false, + params: { + "fields[node--recipe]": "title", + "page[limit]": 2, + }, + } + ) + + expect(recipes).toMatchSnapshot() + }) + + test("throws an error for invalid resource type", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + locale: "en", + defaultLocale: "en", + } + + await expect( + client.getResourceCollectionFromContext( + "RESOURCE-DOES-NOT-EXIST", + context + ) + ).rejects.toThrow("Resource of type 'RESOURCE-DOES-NOT-EXIST' not found.") + }) + + test("throws an error for invalid params", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + locale: "en", + defaultLocale: "en", + } + + await expect( + client.getResourceCollectionFromContext( + "node--recipe", + context, + { + params: { + include: "invalid_relationship", + }, + } + ) + ).rejects.toThrow( + "400 Bad Request\n`invalid_relationship` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media_image, field_recipe_category, field_tags." + ) + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + const context: GetStaticPropsContext = { + locale: "en", + defaultLocale: "en", + } + + await client.getResourceCollectionFromContext("node--recipe", context) + expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { + withAuth: false, + }) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + const context: GetStaticPropsContext = { + locale: "en", + defaultLocale: "en", + } + await client.getResourceCollectionFromContext("node--recipe", context, { + withAuth: true, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) +}) + +describe("getResourceFromContext()", () => { + test("fetches a resource from context", async () => { + const client = new DrupalClient(BASE_URL) + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + const recipe = await client.getResourceFromContext( + "node--recipe", + context + ) + + expect(recipe).toMatchSnapshot() + }) + + test("fetches a resource from context with params", async () => { + const client = new DrupalClient(BASE_URL) + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + const recipe = await client.getResourceFromContext( + "node--recipe", + context, + { + params: { + "fields[node--recipe]": "title", + }, + } + ) + + expect(recipe).toMatchSnapshot() + }) + + test("fetches a resource from context using locale", async () => { + const client = new DrupalClient(BASE_URL) + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "quiche-mediterráneo-profundo"], + }, + locale: "es", + defaultLocale: "en", + } + const recipe = await client.getResourceFromContext( + "node--recipe", + context, + { + params: { + "fields[node--recipe]": "title,field_cooking_time", + }, + } + ) + + expect(recipe).toMatchSnapshot() + }) + + test("fetches raw data", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + const recipe = await client.getResourceFromContext( + "node--recipe", + context, + { + deserialize: false, + params: { + "fields[node--recipe]": "title", + }, + } + ) + + expect(recipe).toMatchSnapshot() + }) + + test("fetches a resource from context by revision", async () => { + const client = new DrupalClient(BASE_URL) + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "quiche-mediterráneo-profundo"], + }, + locale: "es", + defaultLocale: "en", + } + const recipe = await client.getResourceFromContext( + "node--recipe", + context, + { + params: { + "fields[node--recipe]": "drupal_internal__vid", + }, + } + ) + + context.previewData = { resourceVersion: "rel:latest-version" } + + const latestRevision = await client.getResourceFromContext( + "node--recipe", + context, + { + params: { + "fields[node--recipe]": "drupal_internal__vid", + }, + } + ) + + expect(recipe.drupal_internal__vid).toEqual( + latestRevision.drupal_internal__vid + ) + }) + + test("throws an error for invalid revision", async () => { + const client = new DrupalClient(BASE_URL) + const context: GetStaticPropsContext = { + previewData: { + resourceVersion: "id:-11", + }, + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + + await expect( + client.getResourceFromContext("node--recipe", context, { + params: { + "fields[node--recipe]": "drupal_internal__vid", + }, + }) + ).rejects.toThrow( + "404 Not Found\nThe requested version, identified by `id:-11`, could not be found." + ) + }) + + test("throws an error if revision access is forbidden", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + previewData: { + resourceVersion: "id:1", + }, + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + + await expect( + client.getResourceFromContext("node--recipe", context, { + params: { + "fields[node--recipe]": "title", + }, + }) + ).rejects.toThrow( + "403 Forbidden\nThe current user is not allowed to GET the selected resource. The user does not have access to the requested version." + ) + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + + await client.getResourceFromContext("node--recipe", context) + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: false, + }) + ) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + + await client.getResourceFromContext("node--recipe", context, { + withAuth: true, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) + + test("makes authenticated requests when preview is true", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + const context: GetStaticPropsContext = { + preview: true, + previewData: { + plugin: "simple_oauth", + scope: "editor", + }, + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + + await client.getResourceFromContext("node--recipe", context) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: `Bearer sample-token`, + }) + ) + }) + + test("accepts a translated path", async () => { + const client = new DrupalClient(BASE_URL) + + const path = await client.translatePath("recipes/deep-mediterranean-quiche") + + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + + const recipe = await client.getResourceFromContext(path, context, { + params: { + "fields[node--recipe]": "title,path,status", + }, + }) + + await expect(recipe).toMatchSnapshot() + }) +}) + +describe("getSearchIndexFromContext()", () => { + test("calls getSearchIndex() with context data", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest + .spyOn(client, "getSearchIndex") + .mockImplementation(async () => jest.fn()) + const name = "resource-name" + const locale = "en-uk" + const defaultLocale = "en-us" + const options = { + deserialize: true, + } + + await client.getSearchIndexFromContext( + name, + { locale, defaultLocale }, + options + ) + + expect(fetchSpy).toHaveBeenCalledWith(name, { + ...options, + locale, + defaultLocale, + }) + }) +}) + +describe("getStaticPathsFromContext()", () => { + test("returns static paths from context", async () => { + const client = new DrupalClient(BASE_URL) + + const paths = await client.getStaticPathsFromContext("node--article", {}) + + expect(paths).toMatchSnapshot() + }) + + test("returns static paths from context with locale", async () => { + const client = new DrupalClient(BASE_URL) + + const paths = await client.getStaticPathsFromContext("node--article", { + locales: ["en", "es"], + defaultLocale: "en", + }) + + expect(paths).toMatchSnapshot() + }) + + test("returns static paths for multiple resource types from context", async () => { + const client = new DrupalClient(BASE_URL) + + const paths = await client.getStaticPathsFromContext( + ["node--article", "node--recipe"], + { + locales: ["en", "es"], + defaultLocale: "en", + } + ) + + expect(paths).toMatchSnapshot() + }) + + test("returns static paths from context with params", async () => { + const client = new DrupalClient(BASE_URL) + + const paths = await client.getStaticPathsFromContext( + "node--article", + {}, + { + params: { + "filter[promote]": 1, + }, + } + ) + + expect(paths).toMatchSnapshot() + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + await client.getStaticPathsFromContext("node--article", { + locales: ["en", "es"], + defaultLocale: "en", + }) + expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { + withAuth: false, + }) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + await client.getStaticPathsFromContext( + "node--article", + { + locales: ["en", "es"], + defaultLocale: "en", + }, + { + withAuth: true, + } + ) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) +}) + +describe("translatePathFromContext()", () => { + test("translates a path", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + + const path = await client.translatePathFromContext(context) + + expect(path).toMatchSnapshot() + }) + + test("returns null for path not found", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + params: { + slug: ["path-not-found"], + }, + } + + const path = await client.translatePathFromContext(context) + + expect(path).toBeNull() + }) + + test("translates a path with pathPrefix", async () => { + const client = new DrupalClient(BASE_URL) + + const context: GetStaticPropsContext = { + params: { + slug: ["deep-mediterranean-quiche"], + }, + } + + const path = await client.translatePathFromContext(context, { + pathPrefix: "recipes", + }) + + expect(path).toMatchSnapshot() + + const path2 = await client.translatePathFromContext(context, { + pathPrefix: "/recipes", + }) + + expect(path).toEqual(path2) + }) + + test("makes un-authenticated requests by default", async () => { + const client = new DrupalClient(BASE_URL) + const fetchSpy = jest.spyOn(client, "fetch") + + const context: GetStaticPropsContext = { + params: { + slug: ["recipes", "deep-mediterranean-quiche"], + }, + } + await client.translatePathFromContext(context) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: false, + }) + ) + }) + + test("makes authenticated requests with withAuth option", async () => { + const client = new DrupalClient(BASE_URL, { + useDefaultResourceTypeEntry: true, + auth: `Bearer sample-token`, + }) + const fetchSpy = spyOnFetch() + jest.spyOn(client, "getAccessToken") + + const context: GetStaticPropsContext = { + params: { + slug: ["deep-mediterranean-quiche"], + }, + } + await client.translatePathFromContext(context, { + pathPrefix: "recipes", + withAuth: true, + }) + + expect(fetchSpy).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + withAuth: true, + }) + ) + }) +}) diff --git a/packages/next-drupal/tests/Logger/logger.test.ts b/packages/next-drupal/tests/Logger/logger.test.ts new file mode 100644 index 00000000..4ecf4150 --- /dev/null +++ b/packages/next-drupal/tests/Logger/logger.test.ts @@ -0,0 +1,69 @@ +import { describe, expect, jest, test } from "@jest/globals" +import { + LOG_MESSAGE_PREFIX, + DEBUG_MESSAGE_PREFIX, + WARN_MESSAGE_PREFIX, + ERROR_MESSAGE_PREFIX, + logger, +} from "../../src/logger" +import type { Logger } from "../../src" + +test("is type Logger", () => { + // At compile time, compilation will fail if not a Logger type. + const test: Logger = logger + + // At run-time, we just check for object. + expect(typeof test === "object").toBe(true) +}) + +describe("method: debug", () => { + test("logs a message", () => { + const consoleSpy = jest + .spyOn(console, "debug") + .mockImplementation((message) => message) + const message = "Test debug message" + + logger.debug(message) + + expect(consoleSpy).toHaveBeenCalledWith(DEBUG_MESSAGE_PREFIX, message) + }) +}) + +describe("method: error", () => { + test("logs a message", () => { + const consoleSpy = jest + .spyOn(console, "error") + .mockImplementation((message) => message) + const message = "Test error message" + + logger.error(message) + + expect(consoleSpy).toHaveBeenCalledWith(ERROR_MESSAGE_PREFIX, message) + }) +}) + +describe("method: log", () => { + test("logs a message", () => { + const consoleSpy = jest + .spyOn(console, "log") + .mockImplementation((message) => message) + const message = "Test log message" + + logger.log(message) + + expect(consoleSpy).toHaveBeenCalledWith(LOG_MESSAGE_PREFIX, message) + }) +}) + +describe("method: warn", () => { + test("logs a message", () => { + const consoleSpy = jest + .spyOn(console, "warn") + .mockImplementation((message) => message) + const message = "Test warn message" + + logger.warn(message) + + expect(consoleSpy).toHaveBeenCalledWith(WARN_MESSAGE_PREFIX, message) + }) +}) diff --git a/packages/next-drupal/tests/__mocks__/next.ts b/packages/next-drupal/tests/__mocks__/next.ts new file mode 100644 index 00000000..664b58ba --- /dev/null +++ b/packages/next-drupal/tests/__mocks__/next.ts @@ -0,0 +1,37 @@ +export const NextApiRequest = jest.fn(function () { + this.query = { + slug: "/example", + resourceVersion: "id:1", + plugin: "simple_oauth", + secret: "very-secret-key", + } + this.url = `https://example.com/?${new URLSearchParams(this.query)}` + this.headers = { + host: "https://example.com", + } +}) + +export const NextApiResponse = jest.fn(function () { + const headers = { + "Set-Cookie": ["mock-cookie-value"], + } + const response = { + statusCode: 200, + status: jest.fn((statusCode) => { + response.statusCode = statusCode + return response + }), + clearPreviewData: jest.fn(() => response), + setPreviewData: jest.fn(() => response), + setDraftMode: jest.fn(() => response), + getHeader: jest.fn((name) => headers[name]), + setHeader: jest.fn((name, value) => { + headers[name] = value + return response + }), + writeHead: jest.fn(() => response), + end: jest.fn(), + json: jest.fn(), + } + return response +}) diff --git a/packages/next-drupal/tests/__mocks__/next/headers.ts b/packages/next-drupal/tests/__mocks__/next/headers.ts new file mode 100644 index 00000000..ca2da914 --- /dev/null +++ b/packages/next-drupal/tests/__mocks__/next/headers.ts @@ -0,0 +1,86 @@ +import type { CookieListItem } from "next/dist/compiled/@edge-runtime/cookies" + +// Create nested mocks ahead of time instead of always creating new mocks when +// the cookies mock function is called. +export const cookies = jest.fn(() => cookiesObject) + +const cookieStore = {} +const cookiesObject = { + delete: jest.fn((name: string) => { + delete cookieStore[name] + return cookiesObject + }), + get: jest.fn((name: string) => + cookieStore[name] + ? ({ + ...cookieStore[name], + } as CookieListItem) + : undefined + ), + getAll: jest.fn( + () => + [ + ...Object.keys(cookieStore).map((name) => ({ + ...cookieStore[name], + })), + ] as CookieListItem[] + ), + has: jest.fn((name: string) => !!cookieStore[name]), + set: jest.fn( + ({ + name, + value, + expires, + sameSite, + secure, + path, + domain, + }: CookieListItem) => { + cookieStore[name] = { + name, + value, + expires, + sameSite, + secure, + path, + domain, + } + return cookiesObject + } + ), + toString: jest.fn(), +} + +// Create nested mocks ahead of time instead of always creating new mocks when +// the draftMode mock function is called. +export const draftMode = jest.fn(() => ({ + disable, + enable, + isEnabled: draftModeEnabled, +})) + +let draftModeEnabled = false +const disable = jest.fn(() => { + draftModeEnabled = false +}) +const enable = jest.fn(() => { + draftModeEnabled = true +}) + +export function resetNextHeaders() { + cookies.mockClear() + cookiesObject.delete.mockClear() + cookiesObject.get.mockClear() + cookiesObject.getAll.mockClear() + cookiesObject.has.mockClear() + cookiesObject.set.mockClear() + cookiesObject.toString.mockClear() + Object.keys(cookieStore).forEach((key) => { + delete cookieStore[key] + }) + + draftMode.mockClear() + disable.mockClear() + enable.mockClear() + draftModeEnabled = false +} diff --git a/packages/next-drupal/tests/client.test.ts b/packages/next-drupal/tests/client.test.ts deleted file mode 100644 index aeacea93..00000000 --- a/packages/next-drupal/tests/client.test.ts +++ /dev/null @@ -1,2647 +0,0 @@ -import { expect } from "@jest/globals" -import { GetStaticPropsContext } from "next" -import { DrupalClient } from "../src/client" -import type { - Serializer, - DrupalNode, - Logger, - JsonApiResourceWithPath, - JsonApiSearchApiResponse, -} from "../src/types" -import { BASE_URL } from "./utils" - -jest.setTimeout(10000) - -afterEach(() => { - jest.restoreAllMocks() -}) - -describe("DrupalClient", () => { - test("it properly constructs a DrupalClient", () => { - expect(new DrupalClient(BASE_URL)).toBeInstanceOf(DrupalClient) - }) - - test("it throws error for invalid baseUrl", () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - expect(() => new DrupalClient()).toThrow("The 'baseUrl' param is required.") - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - expect(() => new DrupalClient({})).toThrow( - "The 'baseUrl' param is required." - ) - }) - - test("it correctly formats apiPrefix", () => { - const client = new DrupalClient(BASE_URL) - expect(client.apiPrefix).toBe("/jsonapi") - - const client2 = new DrupalClient(BASE_URL, { - apiPrefix: "/api", - }) - expect(client2.apiPrefix).toBe("/api") - - const client3 = new DrupalClient(BASE_URL, {}) - client3.apiPrefix = "api" - expect(client3.apiPrefix).toBe("/api") - - const client4 = new DrupalClient(BASE_URL, {}) - expect(client4.apiPrefix).toBe("/jsonapi") - }) - - test("it has a debug mode", async () => { - const consoleSpy = jest.spyOn(console, "debug").mockImplementation() - - const client = new DrupalClient(BASE_URL, { - debug: true, - }) - - expect(consoleSpy).toHaveBeenCalledWith( - "[next-drupal][debug]:", - "Debug mode is on." - ) - expect(client.isDebugEnabled).toBe(true) - }) -}) - -describe("auth", () => { - test("it accepts username and password for auth", async () => { - const customFetch = jest.fn() - - const client = new DrupalClient(BASE_URL, { - auth: { - username: "admin", - password: "password", - }, - fetcher: customFetch, - }) - const url = client.buildUrl("/jsonapi").toString() - - await client.fetch(url, { withAuth: true }) - expect(customFetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - headers: { - "Content-Type": "application/vnd.api+json", - Accept: "application/vnd.api+json", - Authorization: "Basic YWRtaW46cGFzc3dvcmQ=", - }, - withAuth: true, - }) - ) - }) - - test("it accepts callback for auth", async () => { - const customAuth = jest - .fn() - .mockReturnValue("Basic YXJzaGFkQG5leHQtZHJ1cGFsLm9yZzphYmMxMjM=") - const customFetch = jest.fn() - - const client = new DrupalClient(BASE_URL, { - auth: customAuth, - fetcher: customFetch, - }) - const url = client.buildUrl("/jsonapi").toString() - - await client.fetch(url, { withAuth: true }) - expect(customFetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - headers: { - "Content-Type": "application/vnd.api+json", - Accept: "application/vnd.api+json", - Authorization: "Basic YXJzaGFkQG5leHQtZHJ1cGFsLm9yZzphYmMxMjM=", - }, - withAuth: true, - }) - ) - }) - - test("it accepts clientId and clientSecret for auth", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - - const basic = Buffer.from( - `7795065e-8ad0-45eb-a64d-73d9f3a5e943:d92Fm^ds` - ).toString("base64") - - await client.fetch("http://example.com", { withAuth: true }) - expect(fetchSpy).toHaveBeenNthCalledWith( - 1, - `${BASE_URL}/oauth/token`, - expect.objectContaining({ - headers: { - Accept: "application/json", - Authorization: `Basic ${basic}`, - "Content-Type": "application/x-www-form-urlencoded", - }, - }) - ) - }) - - test("it accepts custom auth url", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - url: "/custom/oauth", - }, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - - await client.fetch("http://example.com", { withAuth: true }) - expect(fetchSpy).toHaveBeenNthCalledWith( - 1, - `${BASE_URL}/custom/oauth`, - expect.anything() - ) - }) - - test("it throws an error if invalid auth is set", async () => { - expect( - () => - new DrupalClient(BASE_URL, { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - }, - }) - ).toThrow( - "'clientId' and 'clientSecret' are required for auth. See https://next-drupal.org/docs/client/auth" - ) - - expect(() => { - const client = new DrupalClient(BASE_URL) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - client.auth = { - clientSecret: "d92Fm^ds", - } - }).toThrow( - "'clientId' and 'clientSecret' are required for auth. See https://next-drupal.org/docs/client/auth" - ) - - expect( - () => - new DrupalClient(BASE_URL, { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - auth: { - username: "admin", - }, - }) - ).toThrow( - "'username' and 'password' are required for auth. See https://next-drupal.org/docs/client/auth" - ) - - expect( - () => - new DrupalClient(BASE_URL, { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - auth: { - password: "password", - }, - }) - ).toThrow( - "'username' and 'password' are required for auth. See https://next-drupal.org/docs/client/auth" - ) - }) -}) - -describe("getAccessToken", () => { - test("it fetches an access token", async () => { - jest.spyOn(global, "fetch").mockImplementation( - jest.fn(() => - Promise.resolve({ - ok: true, - json: () => - Promise.resolve({ - access_token: "ECYM594IlARGc3S8KgBHvTpki0rDtWx6", - token_type: "bearer", - expires_in: 3600, - }), - }) - ) as jest.Mock - ) - - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - - const token = await client.getAccessToken() - expect(token).toEqual({ - access_token: "ECYM594IlARGc3S8KgBHvTpki0rDtWx6", - token_type: "bearer", - expires_in: 3600, - }) - }) - - test("it re-uses access token", async () => { - jest.spyOn(global, "fetch").mockImplementation( - jest.fn(() => - Promise.resolve({ - ok: true, - json: () => - Promise.resolve({ - access_token: "ECYM594IlARGc3S8KgBHvTpki0rDtWx6" + Math.random(), - token_type: "bearer", - expires_in: 3600, - }), - }) - ) as jest.Mock - ) - - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - - const token1 = await client.getAccessToken() - const token2 = await client.getAccessToken() - expect(token1).toEqual(token2) - }) - - test("it accepts a long-lived accessToken", async () => { - const accessToken = { - token_type: "Bearer", - expires_in: 300, - access_token: - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImVlNDkyOTI4ZTZjNj", - } - - const client = new DrupalClient(BASE_URL, { - accessToken, - }) - - const token = await client.getAccessToken() - - expect(token).toEqual(accessToken) - }) -}) - -describe("headers", () => { - test("it allows setting custom headers", async () => { - const customFetch = jest.fn() - const client = new DrupalClient(BASE_URL, { - fetcher: customFetch, - }) - client.headers = { - foo: "bar", - } - - const url = "http://example.com" - - await client.fetch(url) - expect(customFetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - headers: { foo: "bar" }, - }) - ) - }) - - test("it allows setting custom headers with custom auth", async () => { - const customFetch = jest.fn() - const client = new DrupalClient(BASE_URL, { - fetcher: customFetch, - headers: { - foo: "bar", - }, - auth: jest - .fn() - .mockReturnValue("Basic YXJzaGFkQG5leHQtZHJ1cGFsLm9yZzphYmMxMjM="), - }) - - const url = "http://example.com" - - await client.fetch(url, { withAuth: true }) - - expect(customFetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - headers: { - foo: "bar", - Authorization: "Basic YXJzaGFkQG5leHQtZHJ1cGFsLm9yZzphYmMxMjM=", - }, - withAuth: true, - }) - ) - }) -}) - -describe("logger", () => { - test("it allows custom logger", () => { - const logger: Logger = { - log(message) { - console.log(message) - }, - warn(message) { - console.warn(message) - }, - error(message) { - console.error(message) - }, - debug(message) { - console.debug(message) - }, - } - const debugSpy = jest.spyOn(logger, "debug").mockImplementation() - - new DrupalClient(BASE_URL, { debug: true, logger }) - - expect(debugSpy).toHaveBeenCalled() - }) -}) - -describe("fetch", () => { - test("it allows fetching custom url", async () => { - const client = new DrupalClient(BASE_URL) - const url = client.buildUrl( - "/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053" - ) - - const response = await client.fetch(url.toString()) - expect(response.headers.get("content-type")).toEqual( - "application/vnd.api+json" - ) - const json = await response.json() - expect(json).toMatchSnapshot() - }) - - test("it allows authenticated requests", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - const url = client.buildUrl("/jsonapi") - - const getAccessTokenSpy = jest - .spyOn(client, "getAccessToken") - .mockImplementation() - - await client.fetch(url.toString(), { - withAuth: true, - }) - - expect(getAccessTokenSpy).toHaveBeenCalled() - }) - - test("it throws an error if withAuth is called when auth is not configured", async () => { - const client = new DrupalClient(BASE_URL) - - const url = client.buildUrl("/jsonapi") - - await expect( - client.fetch(url.toString(), { - withAuth: true, - }) - ).rejects.toThrow("auth is not configured.") - }) - - test("it allows for custom fetcher", async () => { - const customFetch = jest.fn() - - const client = new DrupalClient(BASE_URL, { - fetcher: customFetch, - }) - const url = client.buildUrl("/jsonapi").toString() - - await client.fetch(url) - expect(customFetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - headers: { - "Content-Type": "application/vnd.api+json", - Accept: "application/vnd.api+json", - }, - }) - ) - - await client.fetch(url, { - headers: { - foo: "bar", - }, - }) - expect(customFetch).toHaveBeenLastCalledWith( - url, - expect.objectContaining({ - headers: { - Accept: "application/vnd.api+json", - "Content-Type": "application/vnd.api+json", - foo: "bar", - }, - }) - ) - }) -}) - -describe("buildUrl", () => { - const client = new DrupalClient(BASE_URL) - - test("it builds a url", () => { - expect(client.buildUrl("http://example.com").toString()).toEqual( - "http://example.com/" - ) - }) - - test("it builds a relative url", () => { - expect(client.buildUrl("/foo").toString()).toEqual(`${BASE_URL}/foo`) - }) - - test("it builds a url with params", () => { - expect(client.buildUrl("/foo", { bar: "baz" }).toString()).toEqual( - `${BASE_URL}/foo?bar=baz` - ) - - expect( - client - .buildUrl("/jsonapi/node/article", { - sort: "-created", - "fields[node--article]": "title,path", - }) - .toString() - ).toEqual( - `${BASE_URL}/jsonapi/node/article?sort=-created&fields%5Bnode--article%5D=title%2Cpath` - ) - }) - - test("it builds a url from object (DrupalJsonApiParams)", () => { - const params = { - getQueryObject: () => ({ - sort: "-created", - "fields[node--article]": "title,path", - }), - } - - expect(client.buildUrl("/jsonapi/node/article", params).toString()).toEqual( - `${BASE_URL}/jsonapi/node/article?sort=-created&fields%5Bnode--article%5D=title%2Cpath` - ) - }) -}) - -describe("deserialize", () => { - test("it deserializes JSON:API resource", async () => { - const client = new DrupalClient(BASE_URL) - const url = client.buildUrl( - "/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053", - { - include: "field_tags", - } - ) - - const response = await client.fetch(url.toString()) - const json = await response.json() - const article = client.deserialize(json) as DrupalNode - - expect(article).toMatchSnapshot() - expect(article.id).toEqual("52837ad0-f218-46bd-a106-5710336b7053") - expect(article.field_tags).toHaveLength(3) - }) - - test("it deserializes JSON:API collection", async () => { - const client = new DrupalClient(BASE_URL) - const url = client.buildUrl("/jsonapi/node/article", { - getQueryObject: () => ({ - "fields[node--article]": "title", - }), - }) - - const response = await client.fetch(url.toString()) - const json = await response.json() - const articles = client.deserialize(json) as DrupalNode[] - - expect(articles).toMatchSnapshot() - }) - - test("it allows for custom data serializer", async () => { - const serializer: Serializer = { - deserialize: ( - body: { data: { id: string; attributes: { title: string } } }, - options: { pathPrefix: string } - ) => { - return { - id: body.data.id, - title: `${options.pathPrefix}: ${body.data.attributes.title}`, - } - }, - } - const client = new DrupalClient(BASE_URL, { - serializer, - }) - const url = client.buildUrl( - "/jsonapi/node/article/52837ad0-f218-46bd-a106-5710336b7053" - ) - - const response = await client.fetch(url.toString()) - const json = await response.json() - const article = client.deserialize(json, { - pathPrefix: "TITLE", - }) as DrupalNode - - expect(article).toMatchSnapshot() - expect(article.id).toEqual("52837ad0-f218-46bd-a106-5710336b7053") - expect(article.title).toEqual(`TITLE: ${json.data.attributes.title}`) - }) -}) - -describe("getPathFromContext", () => { - test("it returns a path from context", async () => { - const client = new DrupalClient(BASE_URL) - - expect( - client.getPathFromContext({ - params: { - slug: ["foo"], - }, - }) - ).toEqual("/foo") - - expect( - client.getPathFromContext({ - params: { - slug: ["foo", "bar"], - }, - }) - ).toEqual("/foo/bar") - - expect( - client.getPathFromContext({ - locale: "en", - defaultLocale: "es", - params: { - slug: ["foo", "bar"], - }, - }) - ).toEqual("/en/foo/bar") - - expect( - client.getPathFromContext({ - params: { - slug: [], - }, - }) - ).toEqual("/home") - - client.frontPage = "/front" - - expect( - client.getPathFromContext({ - params: { - slug: [], - }, - }) - ).toEqual("/front") - - expect( - client.getPathFromContext({ - locale: "es", - defaultLocale: "en", - params: { - slug: [], - }, - }) - ).toEqual("/es/front") - }) - - test("it returns a path from context with pathPrefix", () => { - const client = new DrupalClient(BASE_URL) - - expect( - client.getPathFromContext( - { - params: { - slug: ["bar", "baz"], - }, - }, - { - pathPrefix: "/foo", - } - ) - ).toEqual("/foo/bar/baz") - - expect( - client.getPathFromContext( - { - params: { - slug: ["bar", "baz"], - }, - }, - { - pathPrefix: "foo", - } - ) - ).toEqual("/foo/bar/baz") - - expect( - client.getPathFromContext( - { - locale: "en", - defaultLocale: "en", - params: { - slug: ["bar", "baz"], - }, - }, - { - pathPrefix: "foo", - } - ) - ).toEqual("/foo/bar/baz") - - expect( - client.getPathFromContext( - { - locale: "es", - defaultLocale: "en", - params: { - slug: ["bar", "baz"], - }, - }, - { - pathPrefix: "foo", - } - ) - ).toEqual("/es/foo/bar/baz") - - expect( - client.getPathFromContext( - { - locale: "es", - defaultLocale: "en", - params: { - slug: [], - }, - }, - { - pathPrefix: "/foo", - } - ) - ).toEqual("/es/foo/home") - - client.frontPage = "/baz" - - expect( - client.getPathFromContext( - { - locale: "en", - defaultLocale: "en", - params: { - slug: [], - }, - }, - { - pathPrefix: "foo", - } - ) - ).toEqual("/foo/baz") - - expect( - client.getPathFromContext( - { - params: { - slug: [], - }, - }, - { - pathPrefix: "/foo/bar", - } - ) - ).toEqual("/foo/bar/baz") - }) - - test("it encodes path with punctuation", async () => { - const client = new DrupalClient(BASE_URL) - - const path = client.getPathFromContext({ - params: { - slug: ["path&with^punc&in$path"], - }, - }) - - expect(path).toEqual("/path%26with%5Epunc%26in%24path") - - const translatedPath = await client.translatePath(path) - - expect(translatedPath).toMatchSnapshot() - }) -}) - -describe("getIndex", () => { - test("it fetches the JSON:API index", async () => { - const client = new DrupalClient(BASE_URL) - const index = await client.getIndex() - - expect(index).toMatchSnapshot() - }) - - test("it fetches the JSON:API index with locale", async () => { - const client = new DrupalClient(BASE_URL) - const index = await client.getIndex("es") - - expect(index).toMatchSnapshot() - }) - - test("it throws error for invalid base url", async () => { - const client = new DrupalClient("https://example.com") - - await expect(client.getIndex()).rejects.toThrow( - "Failed to fetch JSON:API index at https://example.com/jsonapi" - ) - }) -}) - -describe("getEntryForResourceType", () => { - test("it returns the JSON:API entry for a resource type", async () => { - const client = new DrupalClient(BASE_URL) - const getIndexSpy = jest.spyOn(client, "getIndex") - - const recipeEntry = await client.getEntryForResourceType("node--recipe") - expect(recipeEntry).toMatch(`${BASE_URL}/en/jsonapi/node/recipe`) - expect(getIndexSpy).toHaveBeenCalledTimes(1) - - const articleEntry = await client.getEntryForResourceType("node--article") - expect(articleEntry).toMatch(`${BASE_URL}/en/jsonapi/node/article`) - expect(getIndexSpy).toHaveBeenCalledTimes(2) - }) - - test("it assembles JSON:API entry without fetching index", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - }) - const getIndexSpy = jest.spyOn(client, "getIndex") - - const recipeEntry = await client.getEntryForResourceType("node--article") - expect(recipeEntry).toMatch(`${BASE_URL}/jsonapi/node/article`) - expect(getIndexSpy).toHaveBeenCalledTimes(0) - }) - - test("it throws an error if resource type does not exist", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getEntryForResourceType("RESOURCE-DOES-NOT-EXIST") - ).rejects.toThrow("Resource of type 'RESOURCE-DOES-NOT-EXIST' not found.") - }) -}) - -describe("getResource", () => { - test("it fetches a resource by uuid", async () => { - const client = new DrupalClient(BASE_URL) - const recipe = await client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f" - ) - - expect(recipe).toMatchSnapshot() - }) - - test("it fetches a resource by uuid with params", async () => { - const client = new DrupalClient(BASE_URL) - const recipe = await client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - params: { - "fields[node--recipe]": "title,field_cooking_time", - }, - } - ) - - expect(recipe).toMatchSnapshot() - }) - - test("it fetches a resource using locale", async () => { - const client = new DrupalClient(BASE_URL) - const recipe = await client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - locale: "es", - defaultLocale: "en", - params: { - "fields[node--recipe]": "title,field_cooking_time", - }, - } - ) - - expect(recipe).toMatchSnapshot() - }) - - test("it fetches raw data", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - deserialize: false, - } - ) - ).resolves.toMatchSnapshot() - }) - - test("it fetches a resource by revision", async () => { - const client = new DrupalClient(BASE_URL) - const recipe = await client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - params: { - "fields[node--recipe]": "drupal_internal__vid", - }, - } - ) - const latestRevision = await client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - params: { - resourceVersion: "rel:latest-version", - "fields[node--recipe]": "drupal_internal__vid", - }, - } - ) - - expect(recipe.drupal_internal__vid).toEqual( - latestRevision.drupal_internal__vid - ) - }) - - test("it throws an error for invalid revision", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - params: { - resourceVersion: "id:-11", - "fields[node--recipe]": "title", - }, - } - ) - ).rejects.toThrow( - "404 Not Found\nThe requested version, identified by `id:-11`, could not be found." - ) - }) - - test("it throws an error if revision access is forbidden", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - params: { - resourceVersion: "id:1", - "fields[node--recipe]": "title", - }, - } - ) - ).rejects.toThrow( - "401 Unauthorized\nNo authentication credentials provided." - ) - }) - - test("it throws an error for invalid resource type", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResource( - "RESOURCE-DOES-NOT-EXIST", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f" - ) - ).rejects.toThrow("Resource of type 'RESOURCE-DOES-NOT-EXIST' not found.") - }) - - test("it throws an error for invalid params", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - params: { - include: "invalid_relationship", - }, - } - ) - ).rejects.toThrow( - "400 Bad Request\n`invalid_relationship` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media_image, field_recipe_category, field_tags." - ) - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - await client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f" - ) - expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { - withAuth: false, - }) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - await client.getResource( - "node--recipe", - "71e04ead-4cc7-416c-b9ca-60b635fdc50f", - { - withAuth: true, - } - ) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) -}) - -describe("getResourceByPath", () => { - test("it fetches a resource by path", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceByPath("/recipes/deep-mediterranean-quiche") - ).resolves.toMatchSnapshot() - }) - - test("it fetches a resource by path with params", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceByPath("/recipes/deep-mediterranean-quiche", { - params: { - "fields[node--recipe]": "title,field_cooking_time", - }, - }) - ).resolves.toMatchSnapshot() - }) - - test("it fetches a resource by path using locale", async () => { - const client = new DrupalClient(BASE_URL) - const recipe = await client.getResourceByPath( - "/recipes/quiche-mediterráneo-profundo", - { - locale: "es", - defaultLocale: "en", - params: { - "fields[node--recipe]": "title,field_cooking_time", - }, - } - ) - - expect(recipe).toMatchSnapshot() - }) - - test("it fetches raw data", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceByPath("/recipes/deep-mediterranean-quiche", { - deserialize: false, - }) - ).resolves.toMatchSnapshot() - }) - - test("it fetches a resource by revision", async () => { - const client = new DrupalClient(BASE_URL) - const recipe = await client.getResourceByPath( - "/recipes/deep-mediterranean-quiche", - { - params: { - "fields[node--recipe]": "drupal_internal__vid", - }, - } - ) - const latestRevision = await client.getResourceByPath( - "/recipes/deep-mediterranean-quiche", - { - params: { - resourceVersion: "rel:latest-version", - "fields[node--recipe]": "drupal_internal__vid", - }, - } - ) - - expect(recipe.drupal_internal__vid).toEqual( - latestRevision.drupal_internal__vid - ) - }) - - test("it throws an error for invalid revision", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceByPath( - "/recipes/deep-mediterranean-quiche", - { - params: { - resourceVersion: "id:-11", - "fields[node--recipe]": "title", - }, - } - ) - ).rejects.toThrow( - "404 Not Found\nThe requested version, identified by `id:-11`, could not be found." - ) - }) - - test("it throws an error if revision access is forbidden", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceByPath( - "/recipes/deep-mediterranean-quiche", - { - params: { - resourceVersion: "id:1", - "fields[node--recipe]": "title", - }, - } - ) - ).rejects.toThrow( - "401 Unauthorized\nNo authentication credentials provided." - ) - }) - - test("it returns null for path not found", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceByPath("/path-do-not-exist") - ).rejects.toThrow("Unable to resolve path /path-do-not-exist.") - }) - - test("it throws an error for invalid params", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceByPath( - "/recipes/deep-mediterranean-quiche", - { - params: { - include: "invalid_relationship", - }, - } - ) - ).rejects.toThrow( - "400 Bad Request\n`invalid_relationship` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media_image, field_recipe_category, field_tags." - ) - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - const getAccessTokenSpy = jest.spyOn(client, "getAccessToken") - - await client.getResourceByPath( - "/recipes/deep-mediterranean-quiche" - ) - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.not.objectContaining({ - withAuth: true, - }) - ) - expect(getAccessTokenSpy).not.toHaveBeenCalled() - }) - - test("it makes authenticated requests with withAuth", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - const getAccessTokenSpy = jest.spyOn(client, "getAccessToken") - - await client.getResourceByPath( - "/recipes/deep-mediterranean-quiche", - { - withAuth: true, - } - ) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - expect(getAccessTokenSpy).toHaveBeenCalled() - }) -}) - -describe("getResourceFromContext", () => { - test("it fetches a resource from context", async () => { - const client = new DrupalClient(BASE_URL) - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - const recipe = await client.getResourceFromContext( - "node--recipe", - context - ) - - expect(recipe).toMatchSnapshot() - }) - - test("it fetches a resource from context with params", async () => { - const client = new DrupalClient(BASE_URL) - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - const recipe = await client.getResourceFromContext( - "node--recipe", - context, - { - params: { - "fields[node--recipe]": "title", - }, - } - ) - - expect(recipe).toMatchSnapshot() - }) - - test("it fetches a resource from context using locale", async () => { - const client = new DrupalClient(BASE_URL) - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "quiche-mediterráneo-profundo"], - }, - locale: "es", - defaultLocale: "en", - } - const recipe = await client.getResourceFromContext( - "node--recipe", - context, - { - params: { - "fields[node--recipe]": "title,field_cooking_time", - }, - } - ) - - expect(recipe).toMatchSnapshot() - }) - - test("it fetches raw data", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - const recipe = await client.getResourceFromContext( - "node--recipe", - context, - { - deserialize: false, - params: { - "fields[node--recipe]": "title", - }, - } - ) - - expect(recipe).toMatchSnapshot() - }) - - test("it fetches a resource from context by revision", async () => { - const client = new DrupalClient(BASE_URL) - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "quiche-mediterráneo-profundo"], - }, - locale: "es", - defaultLocale: "en", - } - const recipe = await client.getResourceFromContext( - "node--recipe", - context, - { - params: { - "fields[node--recipe]": "drupal_internal__vid", - }, - } - ) - - context.previewData = { resourceVersion: "rel:latest-version" } - - const latestRevision = await client.getResourceFromContext( - "node--recipe", - context, - { - params: { - "fields[node--recipe]": "drupal_internal__vid", - }, - } - ) - - expect(recipe.drupal_internal__vid).toEqual( - latestRevision.drupal_internal__vid - ) - }) - - test("it throws an error for invalid revision", async () => { - const client = new DrupalClient(BASE_URL) - const context: GetStaticPropsContext = { - previewData: { - resourceVersion: "id:-11", - }, - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - - await expect( - client.getResourceFromContext("node--recipe", context, { - params: { - "fields[node--recipe]": "drupal_internal__vid", - }, - }) - ).rejects.toThrow( - "404 Not Found\nThe requested version, identified by `id:-11`, could not be found." - ) - }) - - test("it throws an error if revision access is forbidden", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - previewData: { - resourceVersion: "id:1", - }, - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - - await expect( - client.getResourceFromContext("node--recipe", context, { - params: { - "fields[node--recipe]": "title", - }, - }) - ).rejects.toThrow( - "401 Unauthorized\nNo authentication credentials provided." - ) - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - - await client.getResourceFromContext("node--recipe", context) - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: false, - }) - ) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - - await client.getResourceFromContext("node--recipe", context, { - withAuth: true, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) - - test("it makes authenticated requests when preview is true", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - const context: GetStaticPropsContext = { - preview: true, - previewData: { - plugin: "simple_oauth", - scope: "editor", - }, - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - - await client.getResourceFromContext("node--recipe", context) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: `Bearer sample-token`, - }) - ) - }) - - test("it accepts a translated path", async () => { - const client = new DrupalClient(BASE_URL) - - const path = await client.translatePath("recipes/deep-mediterranean-quiche") - - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - - if (path) { - const recipe = await client.getResourceFromContext(path, context, { - params: { - "fields[node--recipe]": "title,path,status", - }, - }) - - await expect(recipe).toMatchSnapshot() - } - }) -}) - -describe("translatePath", () => { - test("it translates a path", async () => { - const client = new DrupalClient(BASE_URL) - - const path = await client.translatePath("recipes/deep-mediterranean-quiche") - - expect(path).toMatchSnapshot() - - const path2 = await client.translatePath( - "/recipes/deep-mediterranean-quiche" - ) - - expect(path).toEqual(path2) - }) - - test("it returns null for path not found", async () => { - const client = new DrupalClient(BASE_URL) - - const path = await client.translatePath("/path-not-found") - - expect(path).toBeNull() - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - await client.translatePath("recipes/deep-mediterranean-quiche") - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: false, - }) - ) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - await client.translatePath("recipes/deep-mediterranean-quiche", { - withAuth: true, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) -}) - -describe("translatePathFromContext", () => { - test("it translates a path", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - - const path = await client.translatePathFromContext(context) - - expect(path).toMatchSnapshot() - }) - - test("it returns null for path not found", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - params: { - slug: ["path-not-found"], - }, - } - - const path = await client.translatePathFromContext(context) - - expect(path).toBeNull() - }) - - test("it translates a path with pathPrefix", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - params: { - slug: ["deep-mediterranean-quiche"], - }, - } - - const path = await client.translatePathFromContext(context, { - pathPrefix: "recipes", - }) - - expect(path).toMatchSnapshot() - - const path2 = await client.translatePathFromContext(context, { - pathPrefix: "/recipes", - }) - - expect(path).toEqual(path2) - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - const context: GetStaticPropsContext = { - params: { - slug: ["recipes", "deep-mediterranean-quiche"], - }, - } - await client.translatePathFromContext(context) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: false, - }) - ) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - const context: GetStaticPropsContext = { - params: { - slug: ["deep-mediterranean-quiche"], - }, - } - await client.translatePathFromContext(context, { - pathPrefix: "recipes", - withAuth: true, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) -}) - -describe("getResourceCollection", () => { - test("it fetches a resource collection", async () => { - const client = new DrupalClient(BASE_URL) - - const articles = await client.getResourceCollection("node--article", { - params: { - "fields[node--article]": "title", - }, - }) - - expect(articles).toMatchSnapshot() - }) - - test("it fetches a resource collection using locale", async () => { - const client = new DrupalClient(BASE_URL) - - const articles = await client.getResourceCollection("node--article", { - locale: "es", - defaultLocale: "en", - params: { - "fields[node--article]": "title,langcode", - }, - }) - - expect(articles[0].langcode).toEqual("es") - - expect(articles).toMatchSnapshot() - }) - - test("it fetches raw data", async () => { - const client = new DrupalClient(BASE_URL) - - const recipes = await client.getResourceCollection("node--recipe", { - deserialize: false, - params: { - "fields[node--recipe]": "title", - "page[limit]": 2, - }, - }) - - expect(recipes).toMatchSnapshot() - }) - - test("it throws an error for invalid resource type", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceCollection("RESOURCE-DOES-NOT-EXIST") - ).rejects.toThrow("Resource of type 'RESOURCE-DOES-NOT-EXIST' not found.") - }) - - test("it throws an error for invalid params", async () => { - const client = new DrupalClient(BASE_URL) - - await expect( - client.getResourceCollection("node--recipe", { - params: { - include: "invalid_relationship", - }, - }) - ).rejects.toThrow( - "400 Bad Request\n`invalid_relationship` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media_image, field_recipe_category, field_tags." - ) - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - await client.getResourceCollection("node--recipe") - expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { - withAuth: false, - }) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - await client.getResourceCollection("node--recipe", { - withAuth: true, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) -}) - -describe("getResourceCollectionFromContext", () => { - test("it fetches a resource collection", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - locale: "en", - defaultLocale: "en", - } - - const articles = await client.getResourceCollectionFromContext( - "node--article", - context, - { - params: { - "fields[node--article]": "title", - }, - } - ) - - expect(articles).toMatchSnapshot() - }) - - test("it fetches a resource collection using locale", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - locale: "es", - defaultLocale: "en", - } - - const articles = await client.getResourceCollectionFromContext( - "node--article", - context, - { - params: { - "fields[node--article]": "title,langcode", - }, - } - ) - - expect(articles[0].langcode).toEqual("es") - - expect(articles).toMatchSnapshot() - }) - - test("it fetches raw data", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - locale: "en", - defaultLocale: "en", - } - - const recipes = await client.getResourceCollectionFromContext( - "node--recipe", - context, - { - deserialize: false, - params: { - "fields[node--recipe]": "title", - "page[limit]": 2, - }, - } - ) - - expect(recipes).toMatchSnapshot() - }) - - test("it throws an error for invalid resource type", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - locale: "en", - defaultLocale: "en", - } - - await expect( - client.getResourceCollectionFromContext( - "RESOURCE-DOES-NOT-EXIST", - context - ) - ).rejects.toThrow("Resource of type 'RESOURCE-DOES-NOT-EXIST' not found.") - }) - - test("it throws an error for invalid params", async () => { - const client = new DrupalClient(BASE_URL) - - const context: GetStaticPropsContext = { - locale: "en", - defaultLocale: "en", - } - - await expect( - client.getResourceCollectionFromContext( - "node--recipe", - context, - { - params: { - include: "invalid_relationship", - }, - } - ) - ).rejects.toThrow( - "400 Bad Request\n`invalid_relationship` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media_image, field_recipe_category, field_tags." - ) - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - const context: GetStaticPropsContext = { - locale: "en", - defaultLocale: "en", - } - - await client.getResourceCollectionFromContext("node--recipe", context) - expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { - withAuth: false, - }) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - const context: GetStaticPropsContext = { - locale: "en", - defaultLocale: "en", - } - await client.getResourceCollectionFromContext("node--recipe", context, { - withAuth: true, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) -}) - -describe("getStaticPathsFromContext", () => { - test("it returns static paths from context", async () => { - const client = new DrupalClient(BASE_URL) - - const paths = await client.getStaticPathsFromContext("node--article", {}) - - expect(paths).toMatchSnapshot() - }) - - test("it returns static paths from context with locale", async () => { - const client = new DrupalClient(BASE_URL) - - const paths = await client.getStaticPathsFromContext("node--article", { - locales: ["en", "es"], - defaultLocale: "en", - }) - - expect(paths).toMatchSnapshot() - }) - - test("it returns static paths for multiple resource types from context", async () => { - const client = new DrupalClient(BASE_URL) - - const paths = await client.getStaticPathsFromContext( - ["node--article", "node--recipe"], - { - locales: ["en", "es"], - defaultLocale: "en", - } - ) - - expect(paths).toMatchSnapshot() - }) - - test("it returns static paths from context with params", async () => { - const client = new DrupalClient(BASE_URL) - - const paths = await client.getStaticPathsFromContext( - "node--article", - {}, - { - params: { - "filter[promote]": 1, - }, - } - ) - - expect(paths).toMatchSnapshot() - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - await client.getStaticPathsFromContext("node--article", { - locales: ["en", "es"], - defaultLocale: "en", - }) - expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { - withAuth: false, - }) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - await client.getStaticPathsFromContext( - "node--article", - { - locales: ["en", "es"], - defaultLocale: "en", - }, - { - withAuth: true, - } - ) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) -}) - -describe("buildStaticPathsParamsFromPaths", () => { - test("it builds static paths from paths", () => { - const client = new DrupalClient(BASE_URL) - - const paths = ["/blog/post/one", "/blog/post/two", "/blog/post/three"] - - expect(client.buildStaticPathsParamsFromPaths(paths)).toMatchSnapshot() - - expect( - client.buildStaticPathsParamsFromPaths(paths, { locale: "en" }) - ).toMatchSnapshot() - }) - - test("it builds static paths from paths with pathPrefix", () => { - const client = new DrupalClient(BASE_URL) - - const paths = client.buildStaticPathsParamsFromPaths( - ["/blog/post/one", "/blog/post/two", "/blog/post"], - { pathPrefix: "blog" } - ) - - const paths2 = client.buildStaticPathsParamsFromPaths( - ["/blog/post/one", "/blog/post/two", "/blog/post"], - { pathPrefix: "/blog" } - ) - - const paths3 = client.buildStaticPathsParamsFromPaths( - ["blog/post/one", "blog/post/two", "blog/post"], - { pathPrefix: "/blog" } - ) - - const paths4 = client.buildStaticPathsParamsFromPaths( - ["blog/post/one", "blog/post/two", "blog/post"], - { pathPrefix: "blog" } - ) - - expect(paths).toMatchSnapshot() - - expect(paths).toEqual(paths2) - expect(paths).toEqual(paths3) - expect(paths).toEqual(paths4) - }) -}) - -describe("buildStaticPathsFromResources", () => { - test("it builds static paths from resources", () => { - const client = new DrupalClient(BASE_URL) - - const resources: Pick[] = [ - { - path: { - alias: "blog/post/one", - pid: 1, - langcode: "en", - }, - }, - { - path: { - alias: "blog/post/two", - pid: 2, - langcode: "en", - }, - }, - ] - - expect(client.buildStaticPathsFromResources(resources)).toMatchSnapshot() - - expect( - client.buildStaticPathsFromResources(resources, { locale: "es" }) - ).toMatchSnapshot() - }) - - test("it builds static paths from resources with pathPrefix", () => { - const client = new DrupalClient(BASE_URL) - - const resources: Pick[] = [ - { - path: { - alias: "blog/post/one", - pid: 1, - langcode: "en", - }, - }, - { - path: { - alias: "blog/post/two", - pid: 2, - langcode: "en", - }, - }, - ] - - const paths = client.buildStaticPathsFromResources(resources, { - pathPrefix: "blog", - }) - - const paths2 = client.buildStaticPathsFromResources(resources, { - pathPrefix: "/blog", - }) - - const paths3 = client.buildStaticPathsFromResources(resources, { - pathPrefix: "/blog/post", - locale: "es", - }) - - const paths4 = client.buildStaticPathsFromResources(resources, { - pathPrefix: "blog/post", - locale: "es", - }) - - expect(paths).toMatchSnapshot() - expect(paths3).toMatchSnapshot() - - expect(paths).toEqual(paths2) - expect(paths3).toEqual(paths4) - }) -}) - -describe("getMenu", () => { - test("it fetches menu items for a menu", async () => { - const client = new DrupalClient(BASE_URL) - - const menu = await client.getMenu("main") - - expect(menu).toMatchSnapshot() - }) - - test("it fetches menu items for a menu with locale", async () => { - const client = new DrupalClient(BASE_URL) - - const menu = await client.getMenu("main", { - locale: "es", - defaultLocale: "en", - }) - - expect(menu).toMatchSnapshot() - }) - - test("it fetches menu items for a menu with params", async () => { - const client = new DrupalClient(BASE_URL) - - const menu = await client.getMenu("main", { - params: { - "fields[menu_link_content--menu_link_content]": "title", - }, - }) - - expect(menu).toMatchSnapshot() - }) - - test("it throws an error for invalid menu name", async () => { - const client = new DrupalClient(BASE_URL) - - await expect(client.getMenu("INVALID")).rejects.toThrow( - '404 Not Found\nThe "menu" parameter was not converted for the path "/jsonapi/menu_items/{menu}" (route name: "jsonapi_menu_items.menu")' - ) - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - await client.getMenu("main") - expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { - withAuth: false, - }) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - await client.getMenu("main", { withAuth: true }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) -}) - -describe("getView", () => { - test("it fetches a view", async () => { - const client = new DrupalClient(BASE_URL) - - const view = await client.getView("featured_articles--page_1") - - expect(view).toMatchSnapshot() - }) - - test("it fetches a view with params", async () => { - const client = new DrupalClient(BASE_URL) - - const view = await client.getView("featured_articles--page_1", { - params: { - "fields[node--article]": "title", - }, - }) - - expect(view).toMatchSnapshot() - }) - - test("it fetches a view with locale", async () => { - const client = new DrupalClient(BASE_URL) - - const view = await client.getView("featured_articles--page_1", { - locale: "es", - defaultLocale: "en", - params: { - "fields[node--article]": "title", - }, - }) - - expect(view).toMatchSnapshot() - }) - - test("it fetches raw data", async () => { - const client = new DrupalClient(BASE_URL) - - const view = await client.getView("featured_articles--page_1", { - locale: "es", - defaultLocale: "en", - deserialize: false, - params: { - "fields[node--article]": "title", - }, - }) - - expect(view).toMatchSnapshot() - }) - - test("it throws an error for invalid view name", async () => { - const client = new DrupalClient(BASE_URL) - - await expect(client.getView("INVALID")).rejects.toThrow("Not Found") - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - await client.getView("featured_articles--page_1") - expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { - withAuth: false, - }) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - await client.getView("featured_articles--page_1", { withAuth: true }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) - - test("it fetches a view with links for pagination", async () => { - const client = new DrupalClient(BASE_URL) - const view = await client.getView("recipes--page_1") - - expect(view.links).toHaveProperty("next") - }) -}) - -describe("getSearchIndex", () => { - test("it fetches a search index", async () => { - const client = new DrupalClient(BASE_URL) - - const search = await client.getSearchIndex("recipes", { - params: { - "fields[node--recipe]": "title", - }, - }) - - expect(search).toMatchSnapshot() - }) - - test("it fetches a search index with locale", async () => { - const client = new DrupalClient(BASE_URL) - - const search = await client.getSearchIndex("recipes", { - locale: "es", - defaultLocale: "en", - params: { - "fields[node--recipe]": "title", - }, - }) - - expect(search).toMatchSnapshot() - }) - - test("it fetches a search index with facets filters", async () => { - const client = new DrupalClient(BASE_URL) - - const search = await client.getSearchIndex( - "recipes", - { - deserialize: false, - params: { - "filter[difficulty]": "easy", - "fields[node--recipe]": "title,field_difficulty", - }, - } - ) - - expect(search).toMatchSnapshot() - expect(search.meta.facets).not.toBeNull() - }) - - test("it fetches raw data from search index", async () => { - const client = new DrupalClient(BASE_URL) - - const search = await client.getSearchIndex("recipes", { - deserialize: false, - params: { - "filter[difficulty]": "easy", - "fields[node--recipe]": "title,field_difficulty", - }, - }) - - expect(search).toMatchSnapshot() - }) - - test("it makes un-authenticated requests by default", async () => { - const client = new DrupalClient(BASE_URL) - const fetchSpy = jest.spyOn(client, "fetch") - - await client.getSearchIndex("recipes") - - expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), { - withAuth: false, - }) - }) - - test("it throws an error for invalid index", async () => { - const client = new DrupalClient(BASE_URL) - - await expect(client.getSearchIndex("INVALID-INDEX")).rejects.toThrow( - "Not Found" - ) - }) - - test("it makes authenticated requests with withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - useDefaultResourceTypeEntry: true, - auth: `Bearer sample-token`, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - await client.getSearchIndex("recipes", { - withAuth: true, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) -}) - -describe("getAuthFromContextAndOptions", () => { - test("if NOT in preview and withAuth option is provided, it should use the withAuth option", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - jest.spyOn(client, "getAccessToken").mockImplementation() - - await client.getResourceFromContext( - "node--article", - { - preview: false, - }, - { - withAuth: true, - } - ) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - - await client.getResourceFromContext( - "node--article", - { - preview: false, - }, - { - withAuth: { - clientId: "foo", - clientSecret: "bar", - scope: "baz", - }, - } - ) - - expect(fetchSpy).toHaveBeenLastCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: { - clientId: "foo", - clientSecret: "bar", - scope: "baz", - }, - }) - ) - }) - - test("if NOT in preview and no withAuth option provided, it should fallback to the global auth", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - - await client.getResourceFromContext("node--article", { - preview: false, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: false, - }) - ) - - const client2 = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - withAuth: true, - }) - jest.spyOn(client2, "getAccessToken").mockImplementation() - - await client2.getResourceFromContext("node--article", { - preview: false, - }) - - expect(fetchSpy).toHaveBeenLastCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: true, - }) - ) - }) - - test("if in preview, it should NOT use the global auth", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - withAuth: true, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - - await client.getResourceFromContext("node--article", { - preview: true, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: null, - }) - ) - }) - - test("if in preview and using the simple_oauth plugin, it should use the scope from context", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - - await client.getResourceFromContext("node--article", { - preview: true, - previewData: { - plugin: "simple_oauth", - scope: "editor", - }, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - scope: "editor", - url: "/oauth/token", - }, - }) - ) - }) - - test("if in preview and using the simple_oauth plugin, tt should use the scope from context even with global withAuth", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - scope: "administrator", - }, - withAuth: true, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - - await client.getResourceFromContext("node--article", { - preview: true, - previewData: { - plugin: "simple_oauth", - scope: "editor", - }, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - scope: "editor", - url: "/oauth/token", - }, - }) - ) - }) - - test("if in preview and using the jwt plugin, it should use the access_token from context", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - }, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - - await client.getResourceFromContext("node--article", { - preview: true, - previewData: { - plugin: "jwt", - access_token: "example-token", - }, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: `Bearer example-token`, - }) - ) - }) - - test("if in preview and using the jwt plugin, it should use the access token from context even with global withAuth", async () => { - const client = new DrupalClient(BASE_URL, { - auth: { - clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", - clientSecret: "d92Fm^ds", - scope: "administrator", - }, - withAuth: true, - }) - const fetchSpy = jest - .spyOn(global, "fetch") - .mockImplementation( - jest.fn(() => - Promise.resolve({ ok: true, json: () => Promise.resolve({}) }) - ) as jest.Mock - ) - - await client.getResourceFromContext("node--article", { - preview: true, - previewData: { - plugin: "jwt", - access_token: "example-token", - }, - }) - - expect(fetchSpy).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - withAuth: `Bearer example-token`, - }) - ) - }) -}) diff --git a/packages/next-drupal/tests/draft/draft.test.ts b/packages/next-drupal/tests/draft/draft.test.ts new file mode 100644 index 00000000..10499087 --- /dev/null +++ b/packages/next-drupal/tests/draft/draft.test.ts @@ -0,0 +1,206 @@ +import { + afterEach, + beforeEach, + describe, + expect, + jest, + test, +} from "@jest/globals" +import { cookies, draftMode } from "next/headers" +import { redirect } from "next/navigation" +import { NextRequest } from "next/server" +import { + DRAFT_DATA_COOKIE_NAME, + DRAFT_MODE_COOKIE_NAME, + DrupalClient, +} from "../../src" +import { BASE_URL, spyOnFetch } from "../utils" +import { + disableDraftMode, + enableDraftMode, + getDraftData, +} from "../../src/draft" +import { resetNextHeaders } from "../__mocks__/next/headers" +import type { ResponseCookie } from "next/dist/compiled/@edge-runtime/cookies" + +jest.mock("next/headers") +jest.mock("next/navigation", () => ({ + redirect: jest.fn(), +})) + +beforeEach(() => { + resetNextHeaders() +}) + +afterEach(() => { + jest.restoreAllMocks() +}) + +describe("enableDraftMode()", () => { + const searchParams = new URLSearchParams({ + slug: "/example", + resourceVersion: "id:1", + plugin: "simple_oauth", + secret: "very-secret-key", + }) + const validationPayload = { + path: "/example", + maxAge: 30, + } + const request = new NextRequest( + `https://example.com/api/draft?${searchParams}` + ) + const client = new DrupalClient(BASE_URL) + const draftModeCookie: ResponseCookie = { + name: DRAFT_MODE_COOKIE_NAME, + value: "some-secret-key", + sameSite: "lax", + } + + test("does not enable draft mode if validation fails", async () => { + spyOnFetch({ responseBody: { message: "fail" }, status: 500 }) + + const response = await enableDraftMode(request, client) + + expect(draftMode().enable).not.toHaveBeenCalled() + expect(response).toBeInstanceOf(Response) + expect(response.status).toBe(500) + }) + + test("enables draft mode", async () => { + spyOnFetch({ responseBody: validationPayload }) + + await enableDraftMode(request, client) + + expect(draftMode().enable).toHaveBeenCalled() + }) + + test("updates draft mode cookie’s sameSite flag", async () => { + spyOnFetch({ responseBody: validationPayload }) + + // Our mock draftMode().enable does not set a cookie, so we set one. + cookies().set(draftModeCookie) + expect(cookies().get(DRAFT_MODE_COOKIE_NAME).sameSite).toBe("lax") + expect(cookies().get(DRAFT_MODE_COOKIE_NAME).secure).toBeFalsy() + + await enableDraftMode(request, client) + + expect(cookies().get(DRAFT_MODE_COOKIE_NAME).sameSite).toBe("none") + expect(cookies().get(DRAFT_MODE_COOKIE_NAME).secure).toBe(true) + }) + + test("sets a draft data cookie", async () => { + spyOnFetch({ responseBody: validationPayload }) + expect(cookies().get(DRAFT_DATA_COOKIE_NAME)).toBe(undefined) + + await enableDraftMode(request, client) + + const cookie = cookies().get(DRAFT_DATA_COOKIE_NAME) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { secret, plugin, ...data } = Object.fromEntries( + searchParams.entries() + ) + expect(cookie).toMatchObject({ + name: DRAFT_DATA_COOKIE_NAME, + sameSite: "none", + secure: true, + value: JSON.stringify(data), + }) + }) + + test("redirects to the slug path", async () => { + spyOnFetch({ responseBody: validationPayload }) + + await enableDraftMode(request, client) + + expect(redirect).toHaveBeenCalledWith(searchParams.get("slug")) + }) +}) + +describe("disableDraftMode()", () => { + test("draft data cookie was deleted", () => { + disableDraftMode() + + expect(cookies).toHaveBeenCalledTimes(1) + expect(cookies().delete).toHaveBeenCalledWith(DRAFT_DATA_COOKIE_NAME) + }) + + test("draft mode was disabled", () => { + // First ensure draft mode is enabled. + draftMode().enable() + expect(draftMode().isEnabled).toBe(true) + + disableDraftMode() + expect(draftMode().disable).toHaveBeenCalledTimes(1) + expect(draftMode().isEnabled).toBe(false) + }) + + test("returns a response object", async () => { + const response = disableDraftMode() + + expect(response).toBeInstanceOf(Response) + expect(response.ok).toBe(true) + expect(await response.text()).toBe("Draft mode is disabled") + }) +}) + +describe("getDraftData()", () => { + const draftData = { + slug: "/example", + resourceVersion: "id:1", + } + const draftDataCookie: ResponseCookie = { + name: DRAFT_DATA_COOKIE_NAME, + value: JSON.stringify(draftData), + sameSite: "none", + secure: true, + } + + test("returns empty object if draft mode disabled", () => { + cookies().set(draftDataCookie) + + const data = getDraftData() + expect(draftMode().isEnabled).toBe(false) + expect(cookies().has).toHaveBeenCalledTimes(0) + expect(cookies().get).toHaveBeenCalledTimes(0) + expect(data).toMatchObject({}) + }) + + test("returns empty object if no draft data cookie", () => { + draftMode().enable() + draftMode.mockClear() + + const data = getDraftData() + expect(draftMode).toHaveBeenCalledTimes(1) + expect(draftMode().isEnabled).toBe(true) + expect(cookies().has).toHaveBeenCalledWith(DRAFT_DATA_COOKIE_NAME) + expect(cookies().has).toHaveBeenCalledTimes(1) + expect(cookies().get).toHaveBeenCalledTimes(0) + expect(data).toMatchObject({}) + }) + + test("returns empty object if no draft data cookie value", () => { + cookies().set({ + ...draftDataCookie, + value: "", + }) + draftMode().enable() + draftMode.mockClear() + + const data = getDraftData() + expect(draftMode).toHaveBeenCalledTimes(1) + expect(draftMode().isEnabled).toBe(true) + expect(cookies().has).toHaveBeenCalledWith(DRAFT_DATA_COOKIE_NAME) + expect(cookies().has).toHaveBeenCalledTimes(1) + expect(cookies().get).toHaveBeenCalledWith(DRAFT_DATA_COOKIE_NAME) + expect(cookies().get).toHaveBeenCalledTimes(1) + expect(data).toMatchObject({}) + }) + + test("returns the JSON.parse()d data", () => { + cookies().set(draftDataCookie) + draftMode().enable() + + expect(getDraftData()).toMatchObject(draftData) + }) +}) diff --git a/packages/next-drupal/tests/utils/index.ts b/packages/next-drupal/tests/utils/index.ts new file mode 100644 index 00000000..a6dd3e49 --- /dev/null +++ b/packages/next-drupal/tests/utils/index.ts @@ -0,0 +1,2 @@ +export * from "./mocks" +export * from "./rpc" diff --git a/packages/next-drupal/tests/utils/mocks/data.ts b/packages/next-drupal/tests/utils/mocks/data.ts new file mode 100644 index 00000000..95ec1895 --- /dev/null +++ b/packages/next-drupal/tests/utils/mocks/data.ts @@ -0,0 +1,365 @@ +import type { + DrupalClientAuth, + DrupalClientAuthAccessToken, + DrupalClientAuthClientIdSecret, + DrupalClientAuthUsernamePassword, +} from "../../../src" + +// Run all tests against this env until we configure CI to setup a Drupal instance. +// TODO: Bootstrap and expose the /drupal env for testing. +export const BASE_URL = process.env["DRUPAL_BASE_URL"] as string + +const auth = { + basicAuth: { + username: "admin", + password: "example", + } as DrupalClientAuthUsernamePassword, + accessToken: { + access_token: "ECYM594IlARGc3S8KgBHvTpki0rDtWx6", + token_type: "bearer", + expires_in: 3600, + } as DrupalClientAuthAccessToken, + clientIdSecret: { + clientId: "7795065e-8ad0-45eb-a64d-73d9f3a5e943", + clientSecret: "d92Fm^ds", + } as DrupalClientAuthClientIdSecret, + function: function authFunction() { + return "custom Authentication header from authFunction" + } as DrupalClientAuth, + customAuthenticationHeader: + "custom Authentication header from string" as DrupalClientAuth, +} + +const resources = { + file: { + jsonapi: { + version: "1.0", + meta: { links: { self: { href: "http://jsonapi.org/format/1.0/" } } }, + }, + data: { + type: "file--file", + id: "641fc6a4-276d-43e9-abbd-1e51bc28ddf9", + links: { + self: { + href: "https://example.com/en/jsonapi/file/file/641fc6a4-276d-43e9-abbd-1e51bc28ddf9", + }, + }, + attributes: { + drupal_internal__fid: 1, + langcode: "en", + filename: "mediterranean-quiche-umami.jpg", + uri: { + value: "public://mediterranean-quiche-umami.jpg", + url: "/sites/default/files/mediterranean-quiche-umami.jpg", + }, + filemime: "image/jpeg", + filesize: 70160, + status: true, + created: "2022-03-21T10:52:42+00:00", + changed: "2022-03-21T10:52:42+00:00", + }, + relationships: { + uid: { + data: null, + links: { + related: { + href: "https://example.com/en/jsonapi/file/file/641fc6a4-276d-43e9-abbd-1e51bc28ddf9/uid", + }, + self: { + href: "https://example.com/en/jsonapi/file/file/641fc6a4-276d-43e9-abbd-1e51bc28ddf9/relationships/uid", + }, + }, + }, + }, + }, + links: { + self: { + href: "https://example.com/en/jsonapi/file/file/641fc6a4-276d-43e9-abbd-1e51bc28ddf9", + }, + }, + }, + mediaImage: { + jsonapi: { + version: "1.0", + meta: { links: { self: { href: "http://jsonapi.org/format/1.0/" } } }, + }, + data: { + type: "media--image", + id: "bbfe9d97-2da2-432b-a22c-0396c08e06ca", + links: { + self: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca?resourceVersion=id%3A1", + }, + }, + attributes: { + drupal_internal__mid: 1, + drupal_internal__vid: 1, + langcode: "en", + revision_created: "2022-03-21T10:52:42+00:00", + revision_log_message: null, + status: true, + name: "Deep mediterranean quiche", + created: "2022-03-21T10:52:42+00:00", + changed: "2022-03-21T10:52:42+00:00", + default_langcode: true, + revision_translation_affected: true, + path: { alias: null, pid: null, langcode: "en" }, + content_translation_source: "und", + content_translation_outdated: false, + }, + relationships: { + bundle: { + data: { + type: "media_type--media_type", + id: "afec21c2-d0a9-4e0e-8c3a-1cd6d5a8fc92", + meta: { drupal_internal__target_id: "image" }, + }, + links: { + related: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/bundle?resourceVersion=id%3A1", + }, + self: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/relationships/bundle?resourceVersion=id%3A1", + }, + }, + }, + revision_user: { + data: null, + links: { + related: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/revision_user?resourceVersion=id%3A1", + }, + self: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/relationships/revision_user?resourceVersion=id%3A1", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "256a133b-0bd7-4426-a823-b8ce81e0d778", + meta: { drupal_internal__target_id: 0 }, + }, + links: { + related: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/uid?resourceVersion=id%3A1", + }, + self: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/relationships/uid?resourceVersion=id%3A1", + }, + }, + }, + thumbnail: { + data: { + type: "file--file", + id: "641fc6a4-276d-43e9-abbd-1e51bc28ddf9", + meta: { + alt: "A delicious deep layered Mediterranean quiche with basil garnish", + title: null, + width: 768, + height: 511, + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/thumbnail?resourceVersion=id%3A1", + }, + self: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/relationships/thumbnail?resourceVersion=id%3A1", + }, + }, + }, + field_media_image: { + data: { + type: "file--file", + id: "641fc6a4-276d-43e9-abbd-1e51bc28ddf9", + meta: { + alt: "A delicious deep layered Mediterranean quiche with basil garnish", + title: null, + width: 768, + height: 511, + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/field_media_image?resourceVersion=id%3A1", + }, + self: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca/relationships/field_media_image?resourceVersion=id%3A1", + }, + }, + }, + }, + }, + included: [ + { + type: "file--file", + id: "641fc6a4-276d-43e9-abbd-1e51bc28ddf9", + links: { + self: { + href: "https://example.com/en/jsonapi/file/file/641fc6a4-276d-43e9-abbd-1e51bc28ddf9", + }, + }, + attributes: { + drupal_internal__fid: 1, + langcode: "en", + filename: "mediterranean-quiche-umami.jpg", + uri: { + value: "public://mediterranean-quiche-umami.jpg", + url: "/sites/default/files/mediterranean-quiche-umami.jpg", + }, + filemime: "image/jpeg", + filesize: 70160, + status: true, + created: "2022-03-21T10:52:42+00:00", + changed: "2022-03-21T10:52:42+00:00", + }, + relationships: { + uid: { + data: null, + links: { + related: { + href: "https://example.com/en/jsonapi/file/file/641fc6a4-276d-43e9-abbd-1e51bc28ddf9/uid", + }, + self: { + href: "https://example.com/en/jsonapi/file/file/641fc6a4-276d-43e9-abbd-1e51bc28ddf9/relationships/uid", + }, + }, + }, + }, + }, + ], + links: { + self: { + href: "https://example.com/en/jsonapi/media/image/bbfe9d97-2da2-432b-a22c-0396c08e06ca?include=field_media_image\u0026resourceVersion=id%3A1", + }, + }, + }, +} + +const menus = { + menuItems: { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + data: [ + { + type: "menu_link_content--menu_link_content", + id: "standard.front_page", + attributes: { + description: "", + enabled: true, + expanded: false, + menu_name: "main", + meta: [], + options: [], + parent: "", + provider: "demo_umami", + route: { + name: "", + parameters: [], + }, + title: "Home", + url: "/en", + weight: "0", + }, + }, + { + type: "menu_link_content--menu_link_content", + id: "views_view:views.featured_articles.page_1", + attributes: { + description: "", + enabled: true, + expanded: false, + menu_name: "main", + meta: { + view_id: "featured_articles", + display_id: "page_1", + }, + options: [], + parent: "", + provider: "views", + route: { + name: "view.featured_articles.page_1", + parameters: [], + }, + title: "Articles", + url: "/en/articles", + weight: "20", + }, + }, + { + type: "menu_link_content--menu_link_content", + id: "views_view:views.recipes.page_1", + attributes: { + description: "", + enabled: true, + expanded: false, + menu_name: "main", + meta: { + view_id: "recipes", + display_id: "page_1", + }, + options: [], + parent: "", + provider: "views", + route: { + name: "view.recipes.page_1", + parameters: [], + }, + title: "Recipes", + url: "/en/recipes", + weight: "30", + }, + }, + ], + links: { + self: { + href: "https://next-drupal-test.ddev.site/jsonapi/menu_items/main", + }, + }, + }, + invalidMenu: { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + errors: [ + { + title: "Not Found", + status: "404", + detail: + 'The "menu" parameter was not converted for the path "/jsonapi/menu_items/{menu}" (route name: "jsonapi_menu_items.menu")', + links: { + via: { + href: "https://next-drupal-test.ddev.site/jsonapi/menu_items/INVALID", + }, + info: { + href: "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5", + }, + }, + }, + ], + }, +} + +export const mocks = { + auth, + resources, + menus, +} diff --git a/packages/next-drupal/tests/utils/mocks/fetch.ts b/packages/next-drupal/tests/utils/mocks/fetch.ts new file mode 100644 index 00000000..b33122ca --- /dev/null +++ b/packages/next-drupal/tests/utils/mocks/fetch.ts @@ -0,0 +1,63 @@ +import { jest } from "@jest/globals" + +interface SpyOnFetchParams { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + responseBody?: any + throwErrorMessage?: string + status?: number + headers?: Record +} + +export function spyOnFetch({ + responseBody = null, + throwErrorMessage = null, + status = 200, + headers = {}, +}: SpyOnFetchParams = {}) { + return jest.spyOn(global, "fetch").mockImplementation( + fetchMockImplementation({ + responseBody, + throwErrorMessage, + status, + headers, + }) + ) +} + +export function spyOnFetchOnce({ + responseBody = null, + throwErrorMessage = null, + status = 200, + headers = {}, +}: SpyOnFetchParams) { + return jest.spyOn(global, "fetch").mockImplementationOnce( + fetchMockImplementation({ + responseBody, + throwErrorMessage, + status, + headers, + }) + ) +} + +function fetchMockImplementation({ + responseBody = null, + throwErrorMessage = null, + status = 200, + headers = {}, +}: SpyOnFetchParams) { + if (throwErrorMessage) { + return async () => { + throw new Error(throwErrorMessage) + } + } + + return async () => + new Response(JSON.stringify(responseBody || {}), { + status, + headers: { + "content-type": "application/vnd.api+json", + ...headers, + }, + }) +} diff --git a/packages/next-drupal/tests/utils/mocks/index.ts b/packages/next-drupal/tests/utils/mocks/index.ts new file mode 100644 index 00000000..96ddd33a --- /dev/null +++ b/packages/next-drupal/tests/utils/mocks/index.ts @@ -0,0 +1,3 @@ +export * from "./data" +export * from "./fetch" +export * from "./logger" diff --git a/packages/next-drupal/tests/utils/mocks/logger.ts b/packages/next-drupal/tests/utils/mocks/logger.ts new file mode 100644 index 00000000..bd696ee5 --- /dev/null +++ b/packages/next-drupal/tests/utils/mocks/logger.ts @@ -0,0 +1,10 @@ +import { Logger } from "../../../src" + +export function mockLogger(): Logger { + return { + log: jest.fn(), + debug: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + } +} diff --git a/packages/next-drupal/tests/utils.ts b/packages/next-drupal/tests/utils/rpc.ts similarity index 76% rename from packages/next-drupal/tests/utils.ts rename to packages/next-drupal/tests/utils/rpc.ts index 762eb6ba..1b4aae67 100644 --- a/packages/next-drupal/tests/utils.ts +++ b/packages/next-drupal/tests/utils/rpc.ts @@ -1,8 +1,5 @@ -import { DrupalClient } from "../src/client" - -// Run all tests against this env until we configure CI to setup a Drupal instance. -// TODO: Bootstrap and expose the /drupal env for testing. -export const BASE_URL = process.env["DRUPAL_BASE_URL"] as string +import { DrupalClient } from "../../src" +import { BASE_URL } from "./index" const client = new DrupalClient(BASE_URL, { auth: { diff --git a/yarn.lock b/yarn.lock index feb0d262..a151c177 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,109 +50,109 @@ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== -"@algolia/cache-browser-local-storage@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz#548e3f9524988bbe0c14b7fc7b2a66335520eeb7" - integrity sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ== - dependencies: - "@algolia/cache-common" "4.22.0" - -"@algolia/cache-common@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.22.0.tgz#83d6111caac74a71bebe5fc050a3b64f3e45d037" - integrity sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA== - -"@algolia/cache-in-memory@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz#ff86b08d8c80a9402f39e5c64cef2ba8299bbe1d" - integrity sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA== - dependencies: - "@algolia/cache-common" "4.22.0" - -"@algolia/client-account@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.22.0.tgz#d7fa001dc062dca446f0620281fc0cec7c850487" - integrity sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA== - dependencies: - "@algolia/client-common" "4.22.0" - "@algolia/client-search" "4.22.0" - "@algolia/transporter" "4.22.0" - -"@algolia/client-analytics@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.22.0.tgz#ea10e73d649aa1b9a1a25a786300d241fd4ad0d1" - integrity sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg== - dependencies: - "@algolia/client-common" "4.22.0" - "@algolia/client-search" "4.22.0" - "@algolia/requester-common" "4.22.0" - "@algolia/transporter" "4.22.0" - -"@algolia/client-common@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.22.0.tgz#4bf298acec78fa988a5b829748e6c488b8a6b570" - integrity sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag== - dependencies: - "@algolia/requester-common" "4.22.0" - "@algolia/transporter" "4.22.0" - -"@algolia/client-personalization@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.22.0.tgz#210c7d196b3c31da45e16db6ed98a7594fcf5e1c" - integrity sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow== - dependencies: - "@algolia/client-common" "4.22.0" - "@algolia/requester-common" "4.22.0" - "@algolia/transporter" "4.22.0" - -"@algolia/client-search@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.22.0.tgz#1113332cf973ce69067b741a17e8f798d71e07db" - integrity sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q== - dependencies: - "@algolia/client-common" "4.22.0" - "@algolia/requester-common" "4.22.0" - "@algolia/transporter" "4.22.0" - -"@algolia/logger-common@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.22.0.tgz#f9498729ca5b0e9c0bd1b8dd729edd91ddd02b5c" - integrity sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ== - -"@algolia/logger-console@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.22.0.tgz#52e62b98fc01b40d6677b0ddf656b342e89f13c2" - integrity sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ== - dependencies: - "@algolia/logger-common" "4.22.0" - -"@algolia/requester-browser-xhr@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz#ca16e4c6860458477a00b440a407c81591f14b8a" - integrity sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg== - dependencies: - "@algolia/requester-common" "4.22.0" - -"@algolia/requester-common@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.22.0.tgz#d7a8283f5b77550eeab353c571a6566adf552fa7" - integrity sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ== - -"@algolia/requester-node-http@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz#41d5e7d5dc7adb930e7fe8dcd9d39bfc378cc5f5" - integrity sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA== - dependencies: - "@algolia/requester-common" "4.22.0" - -"@algolia/transporter@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.22.0.tgz#733385f6457408228d2a4d7a4fe4e2b1599a5d33" - integrity sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA== - dependencies: - "@algolia/cache-common" "4.22.0" - "@algolia/logger-common" "4.22.0" - "@algolia/requester-common" "4.22.0" +"@algolia/cache-browser-local-storage@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz#14b6dc9abc9e3a304a5fffb063d15f30af1032d1" + integrity sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g== + dependencies: + "@algolia/cache-common" "4.22.1" + +"@algolia/cache-common@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.22.1.tgz#c625dff4bc2a74e79f9aed67b4e053b0ef1b3ec1" + integrity sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA== + +"@algolia/cache-in-memory@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz#858a3d887f521362e87d04f3943e2810226a0d71" + integrity sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw== + dependencies: + "@algolia/cache-common" "4.22.1" + +"@algolia/client-account@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.22.1.tgz#a7fb8b66b9a4f0a428e1426b2561144267d76d43" + integrity sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw== + dependencies: + "@algolia/client-common" "4.22.1" + "@algolia/client-search" "4.22.1" + "@algolia/transporter" "4.22.1" + +"@algolia/client-analytics@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.22.1.tgz#506558740b4d49b1b1e3393861f729a8ce921851" + integrity sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg== + dependencies: + "@algolia/client-common" "4.22.1" + "@algolia/client-search" "4.22.1" + "@algolia/requester-common" "4.22.1" + "@algolia/transporter" "4.22.1" + +"@algolia/client-common@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.22.1.tgz#042b19c1b6157c485fa1b551349ab313944d2b05" + integrity sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ== + dependencies: + "@algolia/requester-common" "4.22.1" + "@algolia/transporter" "4.22.1" + +"@algolia/client-personalization@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.22.1.tgz#ff088d797648224fb582e9fe5828f8087835fa3d" + integrity sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ== + dependencies: + "@algolia/client-common" "4.22.1" + "@algolia/requester-common" "4.22.1" + "@algolia/transporter" "4.22.1" + +"@algolia/client-search@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.22.1.tgz#508cc6ab3d1f4e9c02735a630d4dff6fbb8514a2" + integrity sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA== + dependencies: + "@algolia/client-common" "4.22.1" + "@algolia/requester-common" "4.22.1" + "@algolia/transporter" "4.22.1" + +"@algolia/logger-common@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.22.1.tgz#79cf4cd295de0377a94582c6aaac59b1ded731d9" + integrity sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg== + +"@algolia/logger-console@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.22.1.tgz#0355345f6940f67aaa78ae9b81c06e44e49f2336" + integrity sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA== + dependencies: + "@algolia/logger-common" "4.22.1" + +"@algolia/requester-browser-xhr@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz#f04df6fe9690a071b267c77d26b83a3be9280361" + integrity sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw== + dependencies: + "@algolia/requester-common" "4.22.1" + +"@algolia/requester-common@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.22.1.tgz#27be35f3718aafcb6b388ff9c3aa2defabd559ff" + integrity sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg== + +"@algolia/requester-node-http@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz#589a6fa828ad0f325e727a6fcaf4e1a2343cc62b" + integrity sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA== + dependencies: + "@algolia/requester-common" "4.22.1" + +"@algolia/transporter@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.22.1.tgz#8843841b857dc021668f31647aa557ff19cd9cb1" + integrity sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ== + dependencies: + "@algolia/cache-common" "4.22.1" + "@algolia/logger-common" "4.22.1" + "@algolia/requester-common" "4.22.1" "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -167,7 +167,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== @@ -202,31 +202,31 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.23.2", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" - integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== +"@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.6" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" - "@babel/types" "^7.23.6" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.22.15": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz#7bf0db1c53b54da0c8a12627373554a0828479ca" - integrity sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw== +"@babel/eslint-parser@^7.23.10": + version "7.23.10" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz#2d4164842d6db798873b40e0c4238827084667a2" + integrity sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -268,9 +268,9 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz#b04d915ce92ce363666f816a884cdcfc9be04953" - integrity sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw== + version "7.23.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz#25d55fafbaea31fd0e723820bb6cc3df72edf7ea" + integrity sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" @@ -291,10 +291,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" - integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== +"@babel/helper-define-polyfill-provider@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" + integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -427,14 +427,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.6.tgz#d03af2ee5fb34691eec0cda90f5ecbb4d4da145a" - integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA== +"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" - "@babel/types" "^7.23.6" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" "@babel/highlight@^7.23.4": version "7.23.4" @@ -445,10 +445,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" - integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": version "7.23.3" @@ -466,10 +466,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-transform-optional-chaining" "^7.23.3" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz#20c60d4639d18f7da8602548512e9d3a4c8d7098" - integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" + integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" @@ -565,7 +565,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.23.3": +"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.7.2": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== @@ -650,10 +650,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz#93ac8e3531f347fba519b4703f9ff2a75c6ae27a" - integrity sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw== +"@babel/plugin-transform-async-generator-functions@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" + integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" @@ -700,16 +700,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz#e7a75f815e0c534cc4c9a39c56636c84fc0d64f2" - integrity sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg== +"@babel/plugin-transform-classes@^7.23.8": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" + integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-replace-supers" "^7.22.20" "@babel/helper-split-export-declaration" "^7.22.6" @@ -833,10 +832,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" - integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== +"@babel/plugin-transform-modules-systemjs@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" + integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw== dependencies: "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-module-transforms" "^7.23.3" @@ -998,16 +997,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-runtime@^7.23.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.6.tgz#bf853cd0a675c16ee33e6ba2a63b536e75e5d754" - integrity sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg== +"@babel/plugin-transform-runtime@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz#2c64d0680fc8e09e1dfe8fd5c646fe72abd82004" + integrity sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ== dependencies: "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.23.3": @@ -1087,10 +1086,10 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.23.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.6.tgz#ad0ea799d5a3c07db5b9a172819bbd444092187a" - integrity sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ== +"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.9.tgz#beace3b7994560ed6bf78e4ae2073dff45387669" + integrity sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A== dependencies: "@babel/compat-data" "^7.23.5" "@babel/helper-compilation-targets" "^7.23.6" @@ -1098,7 +1097,7 @@ "@babel/helper-validator-option" "^7.23.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -1119,13 +1118,13 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.4" + "@babel/plugin-transform-async-generator-functions" "^7.23.9" "@babel/plugin-transform-async-to-generator" "^7.23.3" "@babel/plugin-transform-block-scoped-functions" "^7.23.3" "@babel/plugin-transform-block-scoping" "^7.23.4" "@babel/plugin-transform-class-properties" "^7.23.3" "@babel/plugin-transform-class-static-block" "^7.23.4" - "@babel/plugin-transform-classes" "^7.23.5" + "@babel/plugin-transform-classes" "^7.23.8" "@babel/plugin-transform-computed-properties" "^7.23.3" "@babel/plugin-transform-destructuring" "^7.23.3" "@babel/plugin-transform-dotall-regex" "^7.23.3" @@ -1141,7 +1140,7 @@ "@babel/plugin-transform-member-expression-literals" "^7.23.3" "@babel/plugin-transform-modules-amd" "^7.23.3" "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.9" "@babel/plugin-transform-modules-umd" "^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" "@babel/plugin-transform-new-target" "^7.23.3" @@ -1167,9 +1166,9 @@ "@babel/plugin-transform-unicode-regex" "^7.23.3" "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" core-js-compat "^3.31.0" semver "^6.3.1" @@ -1182,7 +1181,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.22.15": +"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== @@ -1211,25 +1210,25 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" - integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== +"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.23.6", "@babel/traverse@^7.7.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" - integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== +"@babel/traverse@^7.12.9", "@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -1237,15 +1236,15 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.7", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" - integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== +"@babel/types@^7.0.0", "@babel/types@^7.12.7", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -1261,89 +1260,90 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@commitlint/cli@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.6.0.tgz#f065e0514f3870b6dc9a3c608a78820806b46527" - integrity sha512-FiH23cr9QG8VdfbmvJJZmdfHGVMCouOOAzoXZ3Cd7czGC52RbycwNt8YCI7SA69pAl+t30vh8LMaO/N+kcel6w== +"@commitlint/cli@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.6.1.tgz#78bffdfa00d6f01425d53096954993d83f2b343d" + integrity sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw== dependencies: - "@commitlint/format" "^18.6.0" - "@commitlint/lint" "^18.6.0" - "@commitlint/load" "^18.6.0" - "@commitlint/read" "^18.6.0" - "@commitlint/types" "^18.6.0" + "@commitlint/format" "^18.6.1" + "@commitlint/lint" "^18.6.1" + "@commitlint/load" "^18.6.1" + "@commitlint/read" "^18.6.1" + "@commitlint/types" "^18.6.1" execa "^5.0.0" lodash.isfunction "^3.0.9" resolve-from "5.0.0" resolve-global "1.0.0" yargs "^17.0.0" -"@commitlint/config-conventional@^17.8.0": - version "17.8.1" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz#e5bcf0cfec8da7ac50bc04dc92e0a4ea74964ce0" - integrity sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg== +"@commitlint/config-conventional@^18.6.2": + version "18.6.2" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-18.6.2.tgz#617f3ee761578040cade530631058699642cbd78" + integrity sha512-PcgSYg1AKGQIwDQKbaHtJsfqYy4uJTC7crLVZ83lfjcPaec4Pry2vLeaWej7ao2KsT20l9dWoMPpEGg8LWdUuA== dependencies: - conventional-changelog-conventionalcommits "^6.1.0" + "@commitlint/types" "^18.6.1" + conventional-changelog-conventionalcommits "^7.0.2" -"@commitlint/config-validator@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-18.6.0.tgz#ea1e04e92829dd7b90cea444f245b0bdefa0a586" - integrity sha512-Ptfa865arNozlkjxrYG3qt6wT9AlhNUHeuDyKEZiTL/l0ftncFhK/KN0t/EAMV2tec+0Mwxo0FmhbESj/bI+1g== +"@commitlint/config-validator@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-18.6.1.tgz#e0d71a99c984a68586c7ae7afd3f52342022fae8" + integrity sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw== dependencies: - "@commitlint/types" "^18.6.0" + "@commitlint/types" "^18.6.1" ajv "^8.11.0" -"@commitlint/ensure@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-18.6.0.tgz#3f3dc09d99016eaab0da9423123effd820d11931" - integrity sha512-xY07NmOBJ7JuhX3tic021PaeLepZARIQyqpAQoNQZoml1keBFfB6MbA7XlWZv0ebbarUFE4yhKxOPw+WFv7/qw== +"@commitlint/ensure@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-18.6.1.tgz#17141e083200ca94d8480dc23b0e8f8b1fd37b7f" + integrity sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ== dependencies: - "@commitlint/types" "^18.6.0" + "@commitlint/types" "^18.6.1" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.snakecase "^4.1.1" lodash.startcase "^4.4.0" lodash.upperfirst "^4.3.1" -"@commitlint/execute-rule@^18.4.4": - version "18.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-18.4.4.tgz#ade986742c1944c8162a54288747e54a8c6146b5" - integrity sha512-a37Nd3bDQydtg9PCLLWM9ZC+GO7X5i4zJvrggJv5jBhaHsXeQ9ZWdO6ODYR+f0LxBXXNYK3geYXJrCWUCP8JEg== +"@commitlint/execute-rule@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-18.6.1.tgz#18175e043fe6fb5fceea7b8530316c644f93dfe6" + integrity sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg== -"@commitlint/format@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-18.6.0.tgz#e13ef8419cd8eb37be5825a2e84e73cabbfb56ad" - integrity sha512-8UNWfs2slPPSQiiVpLGJTnPHv7Jkd5KYxfbNXbmLL583bjom4RrylvyrCVnmZReA8nNad7pPXq6mDH4FNVj6xg== +"@commitlint/format@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-18.6.1.tgz#5f2b8b3ae4d8d80bd9239178e97df63e5b8d280a" + integrity sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg== dependencies: - "@commitlint/types" "^18.6.0" + "@commitlint/types" "^18.6.1" chalk "^4.1.0" -"@commitlint/is-ignored@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-18.6.0.tgz#d15ab04f547f7554cc3377d50f8e19178502b8af" - integrity sha512-Xjx/ZyyJ4FdLuz0FcOvqiqSFgiO2yYj3QN9XlvyrxqbXTxPVC7QFEXJYBVPulUSN/gR7WXH1Udw+HYYfD17xog== - dependencies: - "@commitlint/types" "^18.6.0" - semver "7.5.4" - -"@commitlint/lint@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-18.6.0.tgz#f54c856840a6238e0c2972588c2dc986317f1b7b" - integrity sha512-ycbuDWfyykPmslgiHzhz8dL6F0BJYltXLVfc+M49z0c+FNITM0v+r0Vd2+Tdtq06VTc894p2+YSmZhulY8Jn3Q== - dependencies: - "@commitlint/is-ignored" "^18.6.0" - "@commitlint/parse" "^18.6.0" - "@commitlint/rules" "^18.6.0" - "@commitlint/types" "^18.6.0" - -"@commitlint/load@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-18.6.0.tgz#98108294b9383aa2905781b192215df4718babb7" - integrity sha512-RRssj7TmzT0bowoEKlgwg8uQ7ORXWkw7lYLsZZBMi9aInsJuGNLNWcMxJxRZbwxG3jkCidGUg85WmqJvRjsaDA== - dependencies: - "@commitlint/config-validator" "^18.6.0" - "@commitlint/execute-rule" "^18.4.4" - "@commitlint/resolve-extends" "^18.6.0" - "@commitlint/types" "^18.6.0" +"@commitlint/is-ignored@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-18.6.1.tgz#4ee08ba91ff3defb06e0ef19259a9c6734a8d06e" + integrity sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA== + dependencies: + "@commitlint/types" "^18.6.1" + semver "7.6.0" + +"@commitlint/lint@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-18.6.1.tgz#fe3834636c99ee14534a8eb3832831ac362e9fd8" + integrity sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ== + dependencies: + "@commitlint/is-ignored" "^18.6.1" + "@commitlint/parse" "^18.6.1" + "@commitlint/rules" "^18.6.1" + "@commitlint/types" "^18.6.1" + +"@commitlint/load@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-18.6.1.tgz#fb79ed7ee8b5897a9b5c274c1e24eda9162df816" + integrity sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA== + dependencies: + "@commitlint/config-validator" "^18.6.1" + "@commitlint/execute-rule" "^18.6.1" + "@commitlint/resolve-extends" "^18.6.1" + "@commitlint/types" "^18.6.1" chalk "^4.1.0" cosmiconfig "^8.3.6" cosmiconfig-typescript-loader "^5.0.0" @@ -1352,69 +1352,69 @@ lodash.uniq "^4.5.0" resolve-from "^5.0.0" -"@commitlint/message@^18.4.4": - version "18.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-18.4.4.tgz#811682a0d147a24e5c467acdb52071434df2b9f5" - integrity sha512-lHF95mMDYgAI1LBXveJUyg4eLaMXyOqJccCK3v55ZOEUsMPrDi8upqDjd/NmzWmESYihaOMBTAnxm+6oD1WoDQ== +"@commitlint/message@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-18.6.1.tgz#107bd40923ad23d2de56c92a68b179ebfb7e314e" + integrity sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw== -"@commitlint/parse@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-18.6.0.tgz#ae19ff8ceb0c8ffab131158829b06b505b9921fd" - integrity sha512-Y/G++GJpATFw54O0jikc/h2ibyGHgghtPnwsOk3O/aU092ydJ5XEHYcd7xGNQYuLweLzQis2uEwRNk9AVIPbQQ== +"@commitlint/parse@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-18.6.1.tgz#2946b814125e907b9c4d63d3e71d0c1b54b30b62" + integrity sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ== dependencies: - "@commitlint/types" "^18.6.0" + "@commitlint/types" "^18.6.1" conventional-changelog-angular "^7.0.0" conventional-commits-parser "^5.0.0" -"@commitlint/read@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-18.6.0.tgz#324ea1fa625f88427780df23fffe4a92d383d665" - integrity sha512-w39ji8VfWhPKRquPhRHB3Yd8XIHwaNHgOh28YI1QEmZ59qVpuVUQo6h/NsVb+uoC6LbXZiofTZv2iFR084jKEA== +"@commitlint/read@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-18.6.1.tgz#8c138311ed9749427920c369f6276be136f2aa50" + integrity sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w== dependencies: - "@commitlint/top-level" "^18.4.4" - "@commitlint/types" "^18.6.0" + "@commitlint/top-level" "^18.6.1" + "@commitlint/types" "^18.6.1" git-raw-commits "^2.0.11" minimist "^1.2.6" -"@commitlint/resolve-extends@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-18.6.0.tgz#db55be2b32e12593bc98dc44c6d9a9d90941bab4" - integrity sha512-k2Xp+Fxeggki2i90vGrbiLDMefPius3zGSTFFlRAPKce/SWLbZtI+uqE9Mne23mHO5lmcSV8z5m6ziiJwGpOcg== +"@commitlint/resolve-extends@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-18.6.1.tgz#f0572c682fc24dbabe2e0f42873261e0fa42c91a" + integrity sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ== dependencies: - "@commitlint/config-validator" "^18.6.0" - "@commitlint/types" "^18.6.0" + "@commitlint/config-validator" "^18.6.1" + "@commitlint/types" "^18.6.1" import-fresh "^3.0.0" lodash.mergewith "^4.6.2" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-18.6.0.tgz#6d933e2de5639b75b4946120b3880e72e66a6051" - integrity sha512-pTalvCEvuCWrBWZA/YqO/3B3nZnY3Ncc+TmQsRajBdC1tkQIm5Iovdo4Ec7f2Dw1tVvpYMUUNAgcWqsY0WckWg== +"@commitlint/rules@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-18.6.1.tgz#da25aeffe6c0e1c7625e44f46089fb8860986caf" + integrity sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew== dependencies: - "@commitlint/ensure" "^18.6.0" - "@commitlint/message" "^18.4.4" - "@commitlint/to-lines" "^18.4.4" - "@commitlint/types" "^18.6.0" + "@commitlint/ensure" "^18.6.1" + "@commitlint/message" "^18.6.1" + "@commitlint/to-lines" "^18.6.1" + "@commitlint/types" "^18.6.1" execa "^5.0.0" -"@commitlint/to-lines@^18.4.4": - version "18.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-18.4.4.tgz#546cf8d985459f3526359b6a63d7a5b421e1ed60" - integrity sha512-mwe2Roa59NCz/krniAdCygFabg7+fQCkIhXqBHw00XQ8Y7lw4poZLLxeGI3p3bLpcEOXdqIDrEGLwHmG5lBdwQ== +"@commitlint/to-lines@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-18.6.1.tgz#d28827a4a540c98eea1aae31dafd66f80b2f1b9e" + integrity sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q== -"@commitlint/top-level@^18.4.4": - version "18.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-18.4.4.tgz#df69ffa49fdc4541d1f05e814352d575fb0f3b0d" - integrity sha512-PBwW1drgeavl9CadB7IPRUk6rkUP/O8jEkxjlC+ofuh3pw0bzJdAT+Kw7M1Yc9KtTb9xTaqUB8uvRtaybHa/tQ== +"@commitlint/top-level@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-18.6.1.tgz#429fcb985e3beaba9b17e05c0ae61926c647baf0" + integrity sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw== dependencies: find-up "^5.0.0" -"@commitlint/types@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-18.6.0.tgz#3d3493cb5910f60f3749a8eb56aca47dc2e1b662" - integrity sha512-oavoKLML/eJa2rJeyYSbyGAYzTxQ6voG5oeX3OrxpfrkRWhJfm4ACnhoRf5tgiybx2MZ+EVFqC1Lw3W8/uwpZA== +"@commitlint/types@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-18.6.1.tgz#7eb3ab2d799d9166fbb98b96b0744581e59a4ad4" + integrity sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg== dependencies: chalk "^4.1.0" @@ -1472,120 +1472,120 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@esbuild/aix-ppc64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz#fb3922a0183d27446de00cf60d4f7baaadf98d84" - integrity sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q== - -"@esbuild/android-arm64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz#ef31015416dd79398082409b77aaaa2ade4d531a" - integrity sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q== - -"@esbuild/android-arm@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.10.tgz#1c23c7e75473aae9fb323be5d9db225142f47f52" - integrity sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w== - -"@esbuild/android-x64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.10.tgz#df6a4e6d6eb8da5595cfce16d4e3f6bc24464707" - integrity sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw== - -"@esbuild/darwin-arm64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz#8462a55db07c1b2fad61c8244ce04469ef1043be" - integrity sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA== - -"@esbuild/darwin-x64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz#d1de20bfd41bb75b955ba86a6b1004539e8218c1" - integrity sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA== - -"@esbuild/freebsd-arm64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz#16904879e34c53a2e039d1284695d2db3e664d57" - integrity sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg== - -"@esbuild/freebsd-x64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz#8ad9e5ca9786ca3f1ef1411bfd10b08dcd9d4cef" - integrity sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag== - -"@esbuild/linux-arm64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz#d82cf2c590faece82d28bbf1cfbe36f22ae25bd2" - integrity sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ== - -"@esbuild/linux-arm@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz#477b8e7c7bcd34369717b04dd9ee6972c84f4029" - integrity sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg== - -"@esbuild/linux-ia32@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz#d55ff822cf5b0252a57112f86857ff23be6cab0e" - integrity sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg== - -"@esbuild/linux-loong64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz#a9ad057d7e48d6c9f62ff50f6f208e331c4543c7" - integrity sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA== - -"@esbuild/linux-mips64el@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz#b011a96924773d60ebab396fbd7a08de66668179" - integrity sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A== - -"@esbuild/linux-ppc64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz#5d8b59929c029811e473f2544790ea11d588d4dd" - integrity sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ== - -"@esbuild/linux-riscv64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz#292b06978375b271bd8bc0a554e0822957508d22" - integrity sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA== - -"@esbuild/linux-s390x@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz#d30af63530f8d4fa96930374c9dd0d62bf59e069" - integrity sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA== - -"@esbuild/linux-x64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz#898c72eeb74d9f2fb43acf316125b475548b75ce" - integrity sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA== - -"@esbuild/netbsd-x64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz#fd473a5ae261b43eab6dad4dbd5a3155906e6c91" - integrity sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q== - -"@esbuild/openbsd-x64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz#96eb8992e526717b5272321eaad3e21f3a608e46" - integrity sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg== - -"@esbuild/sunos-x64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz#c16ee1c167f903eaaa6acf7372bee42d5a89c9bc" - integrity sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA== - -"@esbuild/win32-arm64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz#7e417d1971dbc7e469b4eceb6a5d1d667b5e3dcc" - integrity sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw== - -"@esbuild/win32-ia32@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz#2b52dfec6cd061ecb36171c13bae554888b439e5" - integrity sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ== - -"@esbuild/win32-x64@0.19.10": - version "0.19.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz#bd123a74f243d2f3a1f046447bb9b363ee25d072" - integrity sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA== +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -1624,12 +1624,12 @@ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== -"@hapi/hoek@^9.0.0": +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== -"@hapi/topo@^5.0.0": +"@hapi/topo@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== @@ -1637,10 +1637,11 @@ "@hapi/hoek" "^9.0.0" "@headlessui/react@^1.6.4": - version "1.7.17" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.17.tgz#a0ec23af21b527c030967245fd99776aa7352bc6" - integrity sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow== + version "1.7.18" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.18.tgz#30af4634d2215b2ca1aa29d07f33d02bea82d9d7" + integrity sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ== dependencies: + "@tanstack/react-virtual" "^3.0.0-beta.60" client-only "^0.0.1" "@hookform/resolvers@^2.8.3": @@ -1649,12 +1650,12 @@ integrity sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ== "@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1662,10 +1663,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" @@ -1700,118 +1701,133 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.8.1" + ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - rimraf "^3.0.0" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^27.5.1" + jest-mock "^29.7.0" -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" - glob "^7.1.2" + glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" - source-map "^0.6.0" string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" "@jest/schemas@^29.6.3": version "29.6.3" @@ -1820,65 +1836,66 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: + "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" - source-map "^0.6.0" -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^27.5.1" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" + jest-haste-map "^29.7.0" + slash "^3.0.0" -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + write-file-atomic "^4.0.2" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^16.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": @@ -1891,9 +1908,9 @@ "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.0.1": version "1.1.2" @@ -1913,21 +1930,21 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@lerna/create@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-8.0.1.tgz#cc0ab19163c67269552292d95f23568468fa9921" - integrity sha512-PDYNUF8Nv5j7DbGvVbizEuYuQbNFZ0+wVOtRPvBQOkC2dMNryi3dJjktEd1QeDX6Wa/JkJWvZ5SMHyr+7H3Rtg== +"@lerna/create@8.1.2": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-8.1.2.tgz#4dc8b3f59c963275bfb8b390491068751101f477" + integrity sha512-GzScCIkAW3tg3+Yn/MKCH9963bzG+zpjGz2NdfYDlYWI7p0f/SH46v1dqpPpYmZ2E/m3JK8HjTNNNL8eIm8/YQ== dependencies: "@npmcli/run-script" "7.0.2" - "@nx/devkit" ">=17.1.2 < 18" + "@nx/devkit" ">=17.1.2 < 19" "@octokit/plugin-enterprise-rest" "6.0.1" "@octokit/rest" "19.0.11" byte-size "8.1.1" @@ -1964,7 +1981,7 @@ npm-packlist "5.1.1" npm-registry-fetch "^14.0.5" npmlog "^6.0.2" - nx ">=17.1.2 < 18" + nx ">=17.1.2 < 19" p-map "4.0.0" p-map-series "2.1.0" p-queue "6.6.2" @@ -2046,11 +2063,6 @@ resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.6.tgz#c1148e2e1aa166614f05161ee8f77ded467062bc" integrity sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw== -"@next/env@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.4.tgz#d5cda0c4a862d70ae760e58c0cd96a8899a2e49a" - integrity sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ== - "@next/env@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341" @@ -2063,12 +2075,12 @@ dependencies: glob "7.1.7" -"@next/eslint-plugin-next@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.4.tgz#474fd88d92209270021186043513fbdc4203f5ec" - integrity sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ== +"@next/eslint-plugin-next@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz#29b041233fac7417e22eefa4146432d5cd910820" + integrity sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q== dependencies: - glob "7.1.7" + glob "10.3.10" "@next/swc-android-arm-eabi@12.3.4": version "12.3.4" @@ -2090,11 +2102,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz#b15d139d8971360fca29be3bdd703c108c9a45fb" integrity sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA== -"@next/swc-darwin-arm64@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz#27b1854c2cd04eb1d5e75081a1a792ad91526618" - integrity sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg== - "@next/swc-darwin-arm64@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" @@ -2110,11 +2117,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz#9c72ee31cc356cb65ce6860b658d807ff39f1578" integrity sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA== -"@next/swc-darwin-x64@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz#9940c449e757d0ee50bb9e792d2600cc08a3eb3b" - integrity sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw== - "@next/swc-darwin-x64@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" @@ -2140,11 +2142,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz#59f5f66155e85380ffa26ee3d95b687a770cfeab" integrity sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg== -"@next/swc-linux-arm64-gnu@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz#0eafd27c8587f68ace7b4fa80695711a8434de21" - integrity sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w== - "@next/swc-linux-arm64-gnu@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" @@ -2160,11 +2157,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz#f012518228017052736a87d69bae73e587c76ce2" integrity sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q== -"@next/swc-linux-arm64-musl@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz#2b0072adb213f36dada5394ea67d6e82069ae7dd" - integrity sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ== - "@next/swc-linux-arm64-musl@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" @@ -2180,11 +2172,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz#339b867a7e9e7ee727a700b496b269033d820df4" integrity sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw== -"@next/swc-linux-x64-gnu@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz#68c67d20ebc8e3f6ced6ff23a4ba2a679dbcec32" - integrity sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A== - "@next/swc-linux-x64-gnu@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz#18967f100ec19938354332dcb0268393cbacf581" @@ -2200,11 +2187,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz#ae0ae84d058df758675830bcf70ca1846f1028f2" integrity sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ== -"@next/swc-linux-x64-musl@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz#67cd81b42fb2caf313f7992fcf6d978af55a1247" - integrity sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw== - "@next/swc-linux-x64-musl@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz#77077cd4ba8dda8f349dc7ceb6230e68ee3293cf" @@ -2220,11 +2202,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz#a5cc0c16920485a929a17495064671374fdbc661" integrity sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg== -"@next/swc-win32-arm64-msvc@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz#be06585906b195d755ceda28f33c633e1443f1a3" - integrity sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w== - "@next/swc-win32-arm64-msvc@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" @@ -2240,11 +2217,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz#6a2409b84a2cbf34bf92fe714896455efb4191e4" integrity sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg== -"@next/swc-win32-ia32-msvc@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz#e76cabefa9f2d891599c3d85928475bd8d3f6600" - integrity sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg== - "@next/swc-win32-ia32-msvc@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" @@ -2260,11 +2232,6 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz#4a3e2a206251abc729339ba85f60bc0433c2865d" integrity sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ== -"@next/swc-win32-x64-msvc@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz#e74892f1a9ccf41d3bf5979ad6d3d77c07b9cba1" - integrity sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A== - "@next/swc-win32-x64-msvc@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" @@ -2299,9 +2266,9 @@ fastq "^1.6.0" "@npmcli/agent@^2.0.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.0.tgz#e81f00fdb2a670750ff7731bbefb47ecbf0ccf44" - integrity sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.1.tgz#8aa677d0a4136d57524336a35d5679aedf2d56f7" + integrity sha512-H4FrOVtNyWC8MUwL3UfjOsAihHvT1Pe8POj3JvjXhSTJipsZMtgUALCT4mGyYZNxymkUfOw3PUj6dE4QPp6osQ== dependencies: agent-base "^7.1.0" http-proxy-agent "^7.0.0" @@ -2317,9 +2284,9 @@ semver "^7.3.5" "@npmcli/git@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.3.tgz#ad3ede0994bcf716ddb63d361f3ea16cb72d878c" - integrity sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw== + version "5.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.4.tgz#d18c50f99649e6e89e8b427318134f582498700c" + integrity sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ== dependencies: "@npmcli/promise-spawn" "^7.0.0" lru-cache "^10.0.1" @@ -2343,14 +2310,27 @@ resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== +"@npmcli/package-json@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.0.0.tgz#77d0f8b17096763ccbd8af03b7117ba6e34d6e91" + integrity sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g== + dependencies: + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^3.0.0" + semver "^7.5.3" + "@npmcli/promise-spawn@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz#fd1c64ed4ff2341e503e1f390c62640a6540df09" - integrity sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ== + version "7.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz#a836de2f42a2245d629cf6fbb8dd6c74c74c55af" + integrity sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg== dependencies: which "^4.0.0" -"@npmcli/run-script@7.0.2", "@npmcli/run-script@^7.0.0": +"@npmcli/run-script@7.0.2": version "7.0.2" resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-7.0.2.tgz#497e7f058799497889df65900c711312252276d3" integrity sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w== @@ -2361,83 +2341,95 @@ read-package-json-fast "^3.0.0" which "^4.0.0" -"@nrwl/devkit@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-17.2.6.tgz#ab283bc16fde0b3c4a73ce59c1364b89d9b73468" - integrity sha512-uZVqc2qhi+WdSqLV9aIcE+5ck+IUSQ47Cc5bslWrssQjBncqGavHYDuU4ZLuKK5HxCuZqlQjvo7TsF7LeOjNiA== +"@npmcli/run-script@^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-7.0.4.tgz#9f29aaf4bfcf57f7de2a9e28d1ef091d14b2e6eb" + integrity sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.0.0" + "@npmcli/promise-spawn" "^7.0.0" + node-gyp "^10.0.0" + which "^4.0.0" + +"@nrwl/devkit@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.0.4.tgz#5135f2f27218ca34d7b93f95f9967f75320ce75a" + integrity sha512-fKHnjg4/9MdFd2U4e8p6ja9fRa864DCyF70kB4YUB9NuUIgWLQ15Uj6wXC3xjdXmxQRyHDa7ORodVoFzdo4UCg== dependencies: - "@nx/devkit" "17.2.6" + "@nx/devkit" "18.0.4" -"@nrwl/tao@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-17.2.6.tgz#eab09ad1c5751e4310bb8c21796e25df1e8310b1" - integrity sha512-cgtUKTRSxDZ94S9IpC27/qYZJ1YttJDET+veKrtRYvwnHFgkq1peyeTTtnM25yJon7PRdm2lYrlIVdPm0vXupw== +"@nrwl/tao@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.0.4.tgz#a74933a4c7d1b7c6467a526e9ac524f3b8edd212" + integrity sha512-/PzGOJevlDQnp5RPXF3WDe+w1cdohGkY+mbJUgDVA4Q5JEPT1DtE10h9GgdHdzkPjVPNYsaI4Vs/53NUdlVHHA== dependencies: - nx "17.2.6" + nx "18.0.4" tslib "^2.3.0" -"@nx/devkit@17.2.6", "@nx/devkit@>=17.1.2 < 18": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-17.2.6.tgz#e65d8386ca7467d49de2193bc963a78561134623" - integrity sha512-a9GPw0KiLhvv2RBLPlWgaVDZRvgww4ANBwv7LuGvk8FNgxF5vkQMM5WyKpvxKJhmh1EZ+T9JsGWAFrK7skW9Bw== +"@nx/devkit@18.0.4", "@nx/devkit@>=17.1.2 < 19": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.0.4.tgz#fec28139ef5d078933c5f1b5a7e0a585672dbdd6" + integrity sha512-Vs1AXgOjMJyaWpKopD04dy0FwQ22n5ZR1bFf98Ab4Ht0WJwJE90IpUVAkwI03n5BYxAKOlQnFltsB4gu6Y8mZQ== dependencies: - "@nrwl/devkit" "17.2.6" + "@nrwl/devkit" "18.0.4" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" - semver "7.5.3" + semver "^7.5.3" tmp "~0.2.1" tslib "^2.3.0" + yargs-parser "21.1.1" -"@nx/nx-darwin-arm64@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.6.tgz#8f5a4cc579158388ec98e0bf26996d9c0457da00" - integrity sha512-ezU5u7hkEwI2xzsFSjyr53uNURBvga40LQlpEnS/CbqRifHHhTKisCy+r2+kRhiOwTeR+I+/2D3zPyIyN3aEHQ== - -"@nx/nx-darwin-x64@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.6.tgz#4ca7b4fb5ab03b786d8bcdfb9e5780abd1f31faf" - integrity sha512-wUIwbM/7LMxlFkEOlbxR/s2qaRuD69yXc70f2rtxsskwJ4GOF5kfc1jk2YaDs9qswI+FgQVgbeZu8pgF+slY7Q== - -"@nx/nx-freebsd-x64@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.6.tgz#59e0189d14f9b021644b123c16315ba1e09a808b" - integrity sha512-uBKEGqG4txVCpBirRzt1QwuOLzfA0s9dlUP7n5t4qJuaf9OXuVcDXay8g84WT1jx4PPtipyv/wyIFu3r7v8kZw== - -"@nx/nx-linux-arm-gnueabihf@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.6.tgz#e1bebfb4bf8e24b7d4f2072bde077de988317461" - integrity sha512-dSDVz2BktaPHMkrJojFCx+V+QFLDF0KzoHorESzZmHZTfumr0xtJ1COWCU+gYmLptc+8OgwCzCPWXHhcDgji/A== - -"@nx/nx-linux-arm64-gnu@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.6.tgz#b830f581ab5afc2ae30ec2f8bd27a750c1a66753" - integrity sha512-AD99Kk47Yxn3IJ89aCT1oVpNX1XNECAYay97yhqf2tiBsDv9hC43PppOdjI0dNP5VRBTrr6EsWdhvE0uNJ3RJw== - -"@nx/nx-linux-arm64-musl@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.6.tgz#c3865d4386097190f3c7fd1840999e3cc6fbb8cf" - integrity sha512-MOX/EJyzseEnzbFxY7V6es/xta6WQ0cDDrl6i6qjCRnoRTFFVMsL0Fb4dtVbv7fd75O41P+OBGpG70MYx2SOxw== - -"@nx/nx-linux-x64-gnu@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.6.tgz#3520364998256a628a861ad1427754504fc585a6" - integrity sha512-16xTSszGPY25INDUr4pzLXWcO3va1764iVFiHRTuJr5siDymY7zSj+DPKFmewzqF2358Y5m8AtMotY0FqKciYg== - -"@nx/nx-linux-x64-musl@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.6.tgz#f3c89d7d5c5336735bf31eb2ae0dd2e5ab6a9f25" - integrity sha512-F/nIq8bcZd2cNuBiQbyJwur7CpeRBCt0qKDF38HQ2l3HhQv+jwk4T6115LMQqwZb9e6kt6BAFsY+6O7I6t3pCw== - -"@nx/nx-win32-arm64-msvc@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.6.tgz#1e432cdbf55ba816d04fec776227e7d459dc4cc4" - integrity sha512-1lAKKKiH7eduzqcPDB03iPz38yNXn3Y4Q/3jULjaRc3EFAplfBsYVwJ9kGjXPZSrpt/AY7w5ATY55/r5B3gQnA== - -"@nx/nx-win32-x64-msvc@17.2.6": - version "17.2.6" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.6.tgz#07fde42a0fe1f8f103aa7afd1db83cb76a72951f" - integrity sha512-LrJySMWrO5oWMrP4VOWM1hr3c4rtxHGCcRy19VwqvaAPDrnsg0qfPjv4q1C9YyIU8sj+T3oJs1yZdnNntlN8ew== +"@nx/nx-darwin-arm64@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.0.4.tgz#c199b44ee21699acb14f6ecbada56ed19af936a3" + integrity sha512-9KJVONxUwdnFHHRNocsg7q5pliOTTfbjlr3rvhLuroV5HeTJFhUipKCQrVEhLy8e4auRdLuSz/HsgpJat3Z2cg== + +"@nx/nx-darwin-x64@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.0.4.tgz#859896881930d346afd6397b593f8d436722b80d" + integrity sha512-rFKHjeU0Ngz1R7UJAsbncpqwuFDjUdpcvI783r6s2eP7JoiiwtDBXvDcHiy8Odk0lPYmwDELaFZBhvdENqaDNA== + +"@nx/nx-freebsd-x64@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.0.4.tgz#2f295ff841e38f720aa9761e2c9eda90e372b380" + integrity sha512-jJx47wgRoUxVpQ+WG5+yLdxtJVuVgjphiTMRc0LOfUwKQaEHWyCA0hMK5fNmo0FAHIhGVCb/j2j9FxnCWTWpkg== + +"@nx/nx-linux-arm-gnueabihf@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.0.4.tgz#7ceb5531887996f4cf5e9ebda8dab34421d3a061" + integrity sha512-C3qWbFhEMIdTzvAHlIUHecZN3YBu7bx3S0p3gPNGmEMUMbYHP2zMlimBrZIbAxzntyGqWCqhXiFB21QhJ0t1Dw== + +"@nx/nx-linux-arm64-gnu@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.0.4.tgz#cfda70cedab2f3a7c5a9bb11ad4be180993b68c8" + integrity sha512-PxVMh9ikp8Q3hKagb66FAsek8O/08GcMF5dXBH7xc5AiQMaZ6Az/gAXOeHp274nmu3StQEpl9Il/YH6Z9f4V0w== + +"@nx/nx-linux-arm64-musl@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.0.4.tgz#1ce43e4803d3d5b3aeefa43ec54df7501b04a0b7" + integrity sha512-Iz7Z4h2/dXJJvBcyeRHa+d3Ncc4Qz+OiGm6iRDXv4zjFm5EyC1tkSZIFNlNiRjmTToNHFr4savrCjCh8wRYejw== + +"@nx/nx-linux-x64-gnu@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.0.4.tgz#0981787e067d6dd7e3f4f457eb3e24c9b12dccaa" + integrity sha512-BVLkegIwxHnEB64VBraBxyC01D3C3dVNxq2b4iNaqr4mpWNmos+G/mvcTU3NS7W8ZjpBjlXgdEkpgkl2hMKTEA== + +"@nx/nx-linux-x64-musl@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.0.4.tgz#d2857870922ee76ed9f50763ec8bd3c6244c998a" + integrity sha512-WgVy41psjCE9uxjFi4P62UrWyKQ1e2IN2FZaIuwXEB9h8OU/+g9PFpL1Cs1llNoEKnapKXX4+9b5FHF9i7EKQw== + +"@nx/nx-win32-arm64-msvc@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.0.4.tgz#92c76b7b0e1616c273a231afc0f23f1a5e68f655" + integrity sha512-YoxhOrVKnS+kcNTnCg9M61cbigzGErYgnlI8kdZzH2ArD7mhv8bfZnSZUInf5Y8oDBVpKusel7AkCSofzSwigA== + +"@nx/nx-win32-x64-msvc@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.0.4.tgz#c57cbb5e42b10322cb966270a32a2f7869634186" + integrity sha512-FdAdl5buvtUXp8hZVRkK0AZeiCu35l0u+yHsulNViYdh3OXRT1hYJ0CeqpxlLfvbHqB9JzDPtJtG0dpKHH/O0Q== "@octokit/auth-token@^3.0.0": version "3.0.4" @@ -2570,80 +2562,80 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@rollup/rollup-android-arm-eabi@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz#beaf518ee45a196448e294ad3f823d2d4576cf35" - integrity sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig== - -"@rollup/rollup-android-arm64@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.1.tgz#6f76cfa759c2d0fdb92122ffe28217181a1664eb" - integrity sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ== - -"@rollup/rollup-darwin-arm64@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.1.tgz#9aaefe33a5481d66322d1c62f368171c03eabe2b" - integrity sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA== - -"@rollup/rollup-darwin-x64@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.1.tgz#707dcaadcdc6bd3fd6c69f55d9456cd4446306a3" - integrity sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.1.tgz#7a4dbbd1dd98731d88a55aefcef0ec4c578fa9c7" - integrity sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q== - -"@rollup/rollup-linux-arm64-gnu@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz#967ba8e6f68a5f21bd00cd97773dcdd6107e94ed" - integrity sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q== - -"@rollup/rollup-linux-arm64-musl@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.1.tgz#d3a4e1c9f21eef3b9f4e4989f334a519a1341462" - integrity sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw== - -"@rollup/rollup-linux-riscv64-gnu@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz#415c0533bb752164effd05f5613858e8f6779bc9" - integrity sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw== - -"@rollup/rollup-linux-x64-gnu@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz#0983385dd753a2e0ecaddea7a81dd37fea5114f5" - integrity sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg== - -"@rollup/rollup-linux-x64-musl@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.1.tgz#eb7494ebc5199cbd2e5c38c2b8acbe2603f35e03" - integrity sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw== - -"@rollup/rollup-win32-arm64-msvc@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.1.tgz#5bebc66e3a7f82d4b9aa9ff448e7fc13a69656e9" - integrity sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g== - -"@rollup/rollup-win32-ia32-msvc@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.1.tgz#34156ebf8b4de3b20e6497260fe519a30263f8cf" - integrity sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg== - -"@rollup/rollup-win32-x64-msvc@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.1.tgz#d146db7a5949e10837b323ce933ed882ac878262" - integrity sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA== +"@rollup/rollup-android-arm-eabi@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz#38c3abd1955a3c21d492af6b1a1dca4bb1d894d6" + integrity sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w== + +"@rollup/rollup-android-arm64@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz#3822e929f415627609e53b11cec9a4be806de0e2" + integrity sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ== + +"@rollup/rollup-darwin-arm64@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz#6c082de71f481f57df6cfa3701ab2a7afde96f69" + integrity sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ== + +"@rollup/rollup-darwin-x64@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz#c34ca0d31f3c46a22c9afa0e944403eea0edcfd8" + integrity sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg== + +"@rollup/rollup-linux-arm-gnueabihf@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz#48e899c1e438629c072889b824a98787a7c2362d" + integrity sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA== + +"@rollup/rollup-linux-arm64-gnu@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz#788c2698a119dc229062d40da6ada8a090a73a68" + integrity sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA== + +"@rollup/rollup-linux-arm64-musl@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz#3882a4e3a564af9e55804beeb67076857b035ab7" + integrity sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ== + +"@rollup/rollup-linux-riscv64-gnu@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz#0c6ad792e1195c12bfae634425a3d2aa0fe93ab7" + integrity sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw== + +"@rollup/rollup-linux-x64-gnu@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz#9d62485ea0f18d8674033b57aa14fb758f6ec6e3" + integrity sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA== + +"@rollup/rollup-linux-x64-musl@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz#50e8167e28b33c977c1f813def2b2074d1435e05" + integrity sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw== + +"@rollup/rollup-win32-arm64-msvc@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz#68d233272a2004429124494121a42c4aebdc5b8e" + integrity sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw== + +"@rollup/rollup-win32-ia32-msvc@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz#366ca62221d1689e3b55a03f4ae12ae9ba595d40" + integrity sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA== + +"@rollup/rollup-win32-x64-msvc@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz#9ffdf9ed133a7464f4ae187eb9e1294413fab235" + integrity sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg== "@rushstack/eslint-patch@^1.1.3", "@rushstack/eslint-patch@^1.3.3": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz#9ab8f811930d7af3e3d549183a50884f9eb83f36" - integrity sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw== + version "1.7.2" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz#2d4260033e199b3032a08b41348ac10de21c47e9" + integrity sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA== -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== dependencies: "@hapi/hoek" "^9.0.0" @@ -2664,18 +2656,28 @@ dependencies: "@sigstore/protobuf-specs" "^0.2.0" -"@sigstore/bundle@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.1.0.tgz#c6140ca97b68815edf7c4fb7bdbf58d656525c39" - integrity sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng== +"@sigstore/bundle@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.2.0.tgz#e3f555a5c503fe176d8d1e0e829b00f842502e46" + integrity sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ== dependencies: - "@sigstore/protobuf-specs" "^0.2.1" + "@sigstore/protobuf-specs" "^0.3.0" -"@sigstore/protobuf-specs@^0.2.0", "@sigstore/protobuf-specs@^0.2.1": +"@sigstore/core@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-1.0.0.tgz#0fcdb32d191d4145a70cb837061185353b3b08e3" + integrity sha512-dW2qjbWLRKGu6MIDUTBuJwXCnR8zivcSpf5inUzk7y84zqy/dji0/uahppoIgMoKeR+6pUZucrwHfkQQtiG9Rw== + +"@sigstore/protobuf-specs@^0.2.0": version "0.2.1" resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== +"@sigstore/protobuf-specs@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.0.tgz#bdcc773671f625bb81591bca86ec5314d57297f3" + integrity sha512-zxiQ66JFOjVvP9hbhGj/F/qNdsZfkGb/dVXSanNRNuAzMlr4MC95voPUBX8//ZNnmv3uSYzdfR/JSkrgvZTGxA== + "@sigstore/sign@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" @@ -2685,13 +2687,14 @@ "@sigstore/protobuf-specs" "^0.2.0" make-fetch-happen "^11.0.1" -"@sigstore/sign@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.2.0.tgz#4918207d8356877ab42d85d360d5729e9b3ec65a" - integrity sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA== +"@sigstore/sign@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.2.3.tgz#f07bcd2cfee654fade867db44ae260f1a0142ba4" + integrity sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw== dependencies: - "@sigstore/bundle" "^2.1.0" - "@sigstore/protobuf-specs" "^0.2.1" + "@sigstore/bundle" "^2.2.0" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.0" make-fetch-happen "^13.0.0" "@sigstore/tuf@^1.0.3": @@ -2702,13 +2705,22 @@ "@sigstore/protobuf-specs" "^0.2.0" tuf-js "^1.1.7" -"@sigstore/tuf@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.2.0.tgz#ef636239687e41af3f2ce10667ab88f5ca6165b3" - integrity sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA== +"@sigstore/tuf@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.3.1.tgz#86ff3c3c907e271696c88de0108d9063a8cbcc45" + integrity sha512-9Iv40z652td/QbV0o5n/x25H9w6IYRt2pIGbTX55yFDYlApDQn/6YZomjz6+KBx69rXHLzHcbtTS586mDdFD+Q== dependencies: - "@sigstore/protobuf-specs" "^0.2.1" - tuf-js "^2.1.0" + "@sigstore/protobuf-specs" "^0.3.0" + tuf-js "^2.2.0" + +"@sigstore/verify@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-1.1.0.tgz#ab617c5dc0bc09ead7f101a848f4870af2d84374" + integrity sha512-1fTqnqyTBWvV7cftUUFtDcHPdSox0N3Ub7C0lRyReYx4zZUlNTZjCV+HPy4Lre+r45dV7Qx5JLKvqqsgxuyYfg== + dependencies: + "@sigstore/bundle" "^2.2.0" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.0" "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -2720,19 +2732,19 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^3.0.0" "@swc/helpers@0.4.11": version "0.4.11" @@ -2790,6 +2802,18 @@ "@tanstack/query-core" "4.36.1" use-sync-external-store "^1.2.0" +"@tanstack/react-virtual@^3.0.0-beta.60": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.1.2.tgz#eb62b73cc82e34860604cd3d682a17db590f3c45" + integrity sha512-qibmxtctgOZo2I+3Rw5GR9kXgaa15U5r3/idDY1ItUKW15UK7GhCfyIfE6qYuJ1fxQF6dJDsD8SbpPyuJgpxuA== + dependencies: + "@tanstack/virtual-core" "3.1.2" + +"@tanstack/virtual-core@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.1.2.tgz#ca76f28f826fbd3310f88c3cd355d9c4aba80abb" + integrity sha512-DATZJs8iejkIUqXZe6ruDAnjFo78BKnIIgqQZrc7CmEFqfLEN/TPD91n4hRfo6hpRB6xC00bwKxv7vdjFNEmOg== + "@testing-library/cypress@^8.0.7": version "8.0.7" resolved "https://registry.yarnpkg.com/@testing-library/cypress/-/cypress-8.0.7.tgz#18315eba3cf8852808afadf122e4858406384015" @@ -2812,11 +2836,6 @@ lz-string "^1.5.0" pretty-format "^27.0.2" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -2873,7 +2892,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": +"@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== @@ -2899,14 +2918,19 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" - integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: "@babel/types" "^7.20.7" -"@types/graceful-fs@^4.1.2": +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== @@ -2914,9 +2938,9 @@ "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.8" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.8.tgz#4ac5caf38b262b7bd5ca3202dda71f0271635660" - integrity sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ== + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: "@types/unist" "^2" @@ -2947,13 +2971,13 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^27.5.2": - version "27.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" - integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== +"@types/jest@^29.5.12": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" "@types/json-schema@^7.0.12": version "7.0.15" @@ -2987,10 +3011,10 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== -"@types/node@*", "@types/node@^20.10.0": - version "20.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" - integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== +"@types/node@*", "@types/node@^20.10.0", "@types/node@^20.11.19": + version "20.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" + integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== dependencies: undici-types "~5.26.4" @@ -2999,7 +3023,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== -"@types/node@^17.0.21", "@types/node@^17.0.23", "@types/node@^17.0.45": +"@types/node@^17.0.21", "@types/node@^17.0.23": version "17.0.45" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== @@ -3014,27 +3038,22 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== -"@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - "@types/prop-types@*": version "15.7.11" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== -"@types/react-dom@17.0.21", "@types/react-dom@^17.0.21", "@types/react-dom@^18.2.17": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.21.tgz#85d56965483ce4850f5f03f9234e54a1f47786e5" - integrity sha512-3rQEFUNUUz2MYiRwJJj6UekcW7rFLOtmK7ajQP7qJpjNdggInl3I/xM4I3Hq1yYPdCGVMgax1gZsB7BBTtayXg== +"@types/react-dom@17.0.25", "@types/react-dom@^17.0.25", "@types/react-dom@^18.2.17": + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.25.tgz#e0e5b3571e1069625b3a3da2b279379aa33a0cb5" + integrity sha512-urx7A7UxkZQmThYA4So0NelOVjx3V4rNFVJwp0WZlbIK5eM4rNJDiN3R/E9ix0MBh6kAEojk/9YL+Te6D9zHNA== dependencies: "@types/react" "^17" -"@types/react@*", "@types/react@17.0.68", "@types/react@^17", "@types/react@^17.0.0", "@types/react@^17.0.43", "@types/react@^17.0.68", "@types/react@^18.2.39": - version "17.0.68" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.68.tgz#99b17f567e258f5e7be855a281ac67b49a34f9f2" - integrity sha512-y8heXejd/Gi43S28GOqIFmr6BzhLa3anMlPojRu4rHh3MtRrrpB+BtLEcqP3XPO1urXByzBdkOLU7sodYWnpkA== +"@types/react@*", "@types/react@17.0.75", "@types/react@^17", "@types/react@^17.0.0", "@types/react@^17.0.43", "@types/react@^17.0.75", "@types/react@^18.2.39": + version "17.0.75" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.75.tgz#cffbc76840a12fcadaf5a3cf14878bb06efcf73d" + integrity sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3075,10 +3094,10 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== -"@types/yargs@^16.0.0": - version "16.0.9" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" - integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" @@ -3106,7 +3125,7 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^5.21.0", "@typescript-eslint/parser@^5.62.0": +"@typescript-eslint/parser@^5.21.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== @@ -3117,14 +3136,25 @@ debug "^4.3.4" "@typescript-eslint/parser@^5.4.2 || ^6.0.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.15.0.tgz#1af69741cfa314a13c1434d0bdd5a0c3096699d7" - integrity sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA== - dependencies: - "@typescript-eslint/scope-manager" "6.15.0" - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/typescript-estree" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/parser@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.0.2.tgz#95c31233d343db1ca1df8df7811b5b87ca7b1a68" + integrity sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q== + dependencies: + "@typescript-eslint/scope-manager" "7.0.2" + "@typescript-eslint/types" "7.0.2" + "@typescript-eslint/typescript-estree" "7.0.2" + "@typescript-eslint/visitor-keys" "7.0.2" debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": @@ -3135,13 +3165,13 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz#40e5214a3e9e048aca55ce33381bc61b6b51c32a" - integrity sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" "@typescript-eslint/scope-manager@7.0.2": version "7.0.2" @@ -3166,10 +3196,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.15.0.tgz#a9f7b006aee52b0948be6e03f521814bf435ddd5" - integrity sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== "@typescript-eslint/types@7.0.2": version "7.0.2" @@ -3189,16 +3219,17 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz#2f8a513df1ce5e6e1ba8e5c6aa52f392ae023fc5" - integrity sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" + minimatch "9.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" @@ -3237,12 +3268,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz#5baf97a7bfeec6f4894d400437055155a46b2330" - integrity sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w== +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== dependencies: - "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" "@typescript-eslint/visitor-keys@7.0.2": @@ -3291,48 +3322,25 @@ JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - abbrev@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - acorn-walk@^8.1.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" - integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== +acorn@^8.4.1, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== add-stream@^1.0.0: version "1.0.0" @@ -3389,24 +3397,24 @@ ajv@^8.11.0: uri-js "^4.2.2" algoliasearch@^4.19.1: - version "4.22.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.22.0.tgz#9ece4446b5ab0af941ef97553c18ddcd1b8040a5" - integrity sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg== - dependencies: - "@algolia/cache-browser-local-storage" "4.22.0" - "@algolia/cache-common" "4.22.0" - "@algolia/cache-in-memory" "4.22.0" - "@algolia/client-account" "4.22.0" - "@algolia/client-analytics" "4.22.0" - "@algolia/client-common" "4.22.0" - "@algolia/client-personalization" "4.22.0" - "@algolia/client-search" "4.22.0" - "@algolia/logger-common" "4.22.0" - "@algolia/logger-console" "4.22.0" - "@algolia/requester-browser-xhr" "4.22.0" - "@algolia/requester-common" "4.22.0" - "@algolia/requester-node-http" "4.22.0" - "@algolia/transporter" "4.22.0" + version "4.22.1" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.22.1.tgz#f10fbecdc7654639ec20d62f109c1b3a46bc6afc" + integrity sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg== + dependencies: + "@algolia/cache-browser-local-storage" "4.22.1" + "@algolia/cache-common" "4.22.1" + "@algolia/cache-in-memory" "4.22.1" + "@algolia/client-account" "4.22.1" + "@algolia/client-analytics" "4.22.1" + "@algolia/client-common" "4.22.1" + "@algolia/client-personalization" "4.22.1" + "@algolia/client-search" "4.22.1" + "@algolia/logger-common" "4.22.1" + "@algolia/logger-console" "4.22.1" + "@algolia/requester-browser-xhr" "4.22.1" + "@algolia/requester-common" "4.22.1" + "@algolia/requester-node-http" "4.22.1" + "@algolia/transporter" "4.22.1" ansi-align@^2.0.0: version "2.0.0" @@ -3562,13 +3570,13 @@ aria-query@^5.3.0: dependencies: dequal "^2.0.3" -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-differ@^3.0.0: version "3.0.0" @@ -3596,16 +3604,27 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== +array.prototype.filter@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e" + integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +array.prototype.findlastindex@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz#d1c50f0b3a9da191981ff8942a0aedd82794404f" + integrity sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.2" @@ -3628,27 +3647,28 @@ array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: es-shim-unscopables "^1.0.0" array.prototype.tosorted@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" - integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" arrify@^1.0.1: @@ -3711,21 +3731,23 @@ at-least-node@^1.0.0: integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== autoprefixer@^10.4.16, autoprefixer@^10.4.2, autoprefixer@^10.4.4, autoprefixer@^10.4.7: - version "10.4.16" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" - integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== + version "10.4.17" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.17.tgz#35cd5695cbbe82f536a50fa025d561b01fdec8be" + integrity sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg== dependencies: - browserslist "^4.21.10" - caniuse-lite "^1.0.30001538" - fraction.js "^4.3.6" + browserslist "^4.22.2" + caniuse-lite "^1.0.30001578" + fraction.js "^4.3.7" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.6, available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" aws-sign2@~0.7.0: version "0.7.0" @@ -3750,12 +3772,12 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -axios@^1.5.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== +axios@^1.6.0: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.4" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -3775,16 +3797,15 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -3815,39 +3836,39 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" + "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.6: - version "0.4.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c" - integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ== +babel-plugin-polyfill-corejs2@^0.4.8: + version "0.4.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" + integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.4" + "@babel/helper-define-polyfill-provider" "^0.5.0" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.5: - version "0.8.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" - integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== +babel-plugin-polyfill-corejs3@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" + integrity sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.4" - core-js-compat "^3.33.1" + "@babel/helper-define-polyfill-provider" "^0.5.0" + core-js-compat "^3.34.0" -babel-plugin-polyfill-regenerator@^0.5.3: - version "0.5.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4" - integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg== +babel-plugin-polyfill-regenerator@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" + integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.4" + "@babel/helper-define-polyfill-provider" "^0.5.0" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3867,12 +3888,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: - babel-plugin-jest-hoist "^27.5.1" + babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" bail@^1.0.0: @@ -3975,18 +3996,13 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.21.10, browserslist@^4.22.2: - version "4.22.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" - integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== +browserslist@^4.22.2, browserslist@^4.22.3: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001565" - electron-to-chromium "^1.4.601" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" node-releases "^2.0.14" update-browserslist-db "^1.0.13" @@ -4077,9 +4093,9 @@ cacache@^17.0.0: unique-filename "^3.0.0" cacache@^18.0.0: - version "18.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.1.tgz#b026d56ad569e4f73cc07c813b3c66707d0fb142" - integrity sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ== + version "18.0.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.2.tgz#fd527ea0f03a603be5c0da5805635f8eef00c60c" + integrity sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw== dependencies: "@npmcli/fs" "^3.1.0" fs-minipass "^3.0.0" @@ -4112,14 +4128,16 @@ cachedir@^2.3.0: resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -4155,15 +4173,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565: - version "1.0.30001570" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz#b4e5c1fa786f733ab78fc70f592df6b3f23244ca" - integrity sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw== - -caniuse-lite@^1.0.30001579: - version "1.0.30001580" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz#e3c76bc6fe020d9007647044278954ff8cd17d1e" - integrity sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA== +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001578, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587: + version "1.0.30001588" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz#07f16b65a7f95dba82377096923947fb25bce6e3" + integrity sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ== capture-stack-trace@^1.0.0: version "1.0.2" @@ -4260,9 +4273,9 @@ check-more-types@2.24.0, check-more-types@^2.24.0: integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== chokidar@^3.5.1, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -4305,9 +4318,9 @@ cjs-module-lexer@^1.0.0: integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clean-stack@^2.0.0: version "2.2.0" @@ -4630,10 +4643,10 @@ conventional-changelog-angular@7.0.0, conventional-changelog-angular@^7.0.0: dependencies: compare-func "^2.0.0" -conventional-changelog-conventionalcommits@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz#3bad05f4eea64e423d3d90fc50c17d2c8cf17652" - integrity sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw== +conventional-changelog-conventionalcommits@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" + integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== dependencies: compare-func "^2.0.0" @@ -4713,7 +4726,7 @@ conventional-recommended-bump@7.0.1: git-semver-tags "^5.0.0" meow "^8.1.2" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== @@ -4735,17 +4748,17 @@ copy-to-clipboard@^3.3.1: dependencies: toggle-selection "^1.0.6" -core-js-compat@^3.31.0, core-js-compat@^3.33.1: - version "3.34.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.34.0.tgz#61a4931a13c52f8f08d924522bba65f8c94a5f17" - integrity sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA== +core-js-compat@^3.31.0, core-js-compat@^3.34.0: + version "3.36.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.0.tgz#087679119bc2fdbdefad0d45d8e5d307d45ba190" + integrity sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw== dependencies: - browserslist "^4.22.2" + browserslist "^4.22.3" core-js@^3: - version "3.34.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.34.0.tgz#5705e6ad5982678612e96987d05b27c6c7c274a5" - integrity sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag== + version "3.36.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.36.0.tgz#e752fa0b0b462a0787d56e9d73f80b0f7c0dde68" + integrity sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw== core-util-is@1.0.2: version "1.0.2" @@ -4781,6 +4794,19 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -4826,23 +4852,6 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -4913,15 +4922,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -4959,11 +4959,6 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.2.1: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -4978,11 +4973,16 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -dedent@0.7.0, dedent@^0.7.0: +dedent@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + deep-equal@^2.0.5: version "2.2.3" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" @@ -5034,14 +5034,14 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" define-lazy-prop@^2.0.0: version "2.0.0" @@ -5122,11 +5122,6 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -5182,13 +5177,6 @@ domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - domhandler@5.0.3, domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" @@ -5230,9 +5218,9 @@ dotenv@^5.0.1: integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== dotenv@~16.3.1: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + version "16.3.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f" + integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ== drupal-jsonapi-params@^1.2.2: version "1.2.3" @@ -5288,15 +5276,15 @@ ejs@^3.1.7: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.601: - version "1.4.615" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz#b1c41839962d2e4e63dca05519da9040e34848c2" - integrity sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng== +electron-to-chromium@^1.4.668: + version "1.4.677" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.677.tgz#49ee77713516740bdde32ac2d1443c444f0dafe7" + integrity sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q== -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^10.3.0: version "10.3.0" @@ -5382,50 +5370,69 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4: + version "1.22.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.4.tgz#26eb2e7538c3271141f5754d31aabfdb215f27bf" + integrity sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.6" + call-bind "^1.0.7" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.2" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" has-proto "^1.0.1" has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.1" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.12" + is-typed-array "^1.1.13" is-weakref "^1.0.2" object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.0" + safe-regex-test "^1.0.3" string.prototype.trim "^1.2.8" string.prototype.trimend "^1.0.7" string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" + typed-array-buffer "^1.0.1" typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" + which-typed-array "^1.1.14" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.0.0, es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-get-iterator@^1.1.3: version "1.1.3" @@ -5443,35 +5450,36 @@ es-get-iterator@^1.1.3: stop-iteration-iterator "^1.0.0" es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" - integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + version "1.0.17" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz#123d1315780df15b34eb181022da43e734388bb8" + integrity sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ== dependencies: asynciterator.prototype "^1.0.0" - call-bind "^1.0.2" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.1" - es-set-tostringtag "^2.0.1" - function-bind "^1.1.1" - get-intrinsic "^1.2.1" + es-abstract "^1.22.4" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" globalthis "^1.0.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.5" + internal-slot "^1.0.7" iterator.prototype "^1.1.2" - safe-array-concat "^1.0.1" + safe-array-concat "^1.1.0" -es-set-tostringtag@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== +es-set-tostringtag@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" -es-shim-unscopables@^1.0.0: +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== @@ -5488,38 +5496,38 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" esbuild@^0.19.2: - version "0.19.10" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.10.tgz#55e83e4a6b702e3498b9f872d84bfb4ebcb6d16e" - integrity sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA== + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== optionalDependencies: - "@esbuild/aix-ppc64" "0.19.10" - "@esbuild/android-arm" "0.19.10" - "@esbuild/android-arm64" "0.19.10" - "@esbuild/android-x64" "0.19.10" - "@esbuild/darwin-arm64" "0.19.10" - "@esbuild/darwin-x64" "0.19.10" - "@esbuild/freebsd-arm64" "0.19.10" - "@esbuild/freebsd-x64" "0.19.10" - "@esbuild/linux-arm" "0.19.10" - "@esbuild/linux-arm64" "0.19.10" - "@esbuild/linux-ia32" "0.19.10" - "@esbuild/linux-loong64" "0.19.10" - "@esbuild/linux-mips64el" "0.19.10" - "@esbuild/linux-ppc64" "0.19.10" - "@esbuild/linux-riscv64" "0.19.10" - "@esbuild/linux-s390x" "0.19.10" - "@esbuild/linux-x64" "0.19.10" - "@esbuild/netbsd-x64" "0.19.10" - "@esbuild/openbsd-x64" "0.19.10" - "@esbuild/sunos-x64" "0.19.10" - "@esbuild/win32-arm64" "0.19.10" - "@esbuild/win32-ia32" "0.19.10" - "@esbuild/win32-x64" "0.19.10" + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-goat@^2.0.0: version "2.1.1" @@ -5541,17 +5549,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - eslint-config-next@^12.0.10, eslint-config-next@^12.1.4: version "12.3.4" resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.3.4.tgz#3d4d9e74b919b879c4cc79c61bdc388fb2b964ee" @@ -5568,11 +5565,11 @@ eslint-config-next@^12.0.10, eslint-config-next@^12.1.4: eslint-plugin-react-hooks "^4.5.0" eslint-config-next@^14.0.3: - version "14.0.4" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.4.tgz#7cd2c0a3b310203d41cf0dbf9d31f9b0a6235b4a" - integrity sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ== + version "14.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.0.tgz#7e309d426b8afacaba3b32fdbb02ba220b6d0a97" + integrity sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg== dependencies: - "@next/eslint-plugin-next" "14.0.4" + "@next/eslint-plugin-next" "14.1.0" "@rushstack/eslint-patch" "^1.3.3" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" eslint-import-resolver-node "^0.3.6" @@ -5582,7 +5579,7 @@ eslint-config-next@^14.0.3: eslint-plugin-react "^7.33.2" eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" -eslint-config-prettier@^9.0.0: +eslint-config-prettier@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== @@ -5679,7 +5676,7 @@ eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: object.entries "^1.1.7" object.fromentries "^2.0.7" -eslint-plugin-prettier@^5.0.1: +eslint-plugin-prettier@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== @@ -5740,7 +5737,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.12.0, eslint@^8.51.0, eslint@^8.54.0: +eslint@^8.12.0, eslint@^8.54.0, eslint@^8.56.0: version "8.56.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== @@ -5945,15 +5942,16 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" exponential-backoff@^3.1.1: version "3.1.1" @@ -6028,7 +6026,7 @@ fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -6039,9 +6037,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" - integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -6132,14 +6130,14 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.0.tgz#5fdca2b5e671cd38d1537427a10e02a2caa8257e" + integrity sha512-noqGuLw158+DuD9UPRKHpJ2hGxpFyDlYYrfM0mWt4XhT4n0lwzTLh70Tkdyy4kyTmyTT9Bv7bWAJqw7cgkEXDg== -follow-redirects@^1.14.9, follow-redirects@^1.15.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.14.9, follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== for-each@^0.3.3: version "0.3.3" @@ -6161,15 +6159,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -6197,7 +6186,7 @@ formidable@^3.2.4: hexoid "^1.0.0" once "^1.4.0" -fraction.js@^4.3.6: +fraction.js@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== @@ -6269,7 +6258,7 @@ fsevents@^2.3.2, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1, function-bind@^1.1.2: +function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== @@ -6318,11 +6307,12 @@ get-east-asian-width@^1.0.0: resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== +get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" @@ -6382,13 +6372,14 @@ get-stream@^8.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" get-tsconfig@^4.5.0: version "4.7.2" @@ -6515,29 +6506,16 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@10.3.10, glob@^10.2.2, glob@^10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" glob@7.1.7: version "7.1.7" @@ -6551,18 +6529,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^10.2.2, glob@^10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -6752,29 +6719,29 @@ has-own-prop@^2.0.0: resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== -has-property-descriptors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.2.2" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.1, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" has-unicode@2.0.1, has-unicode@^2.0.1: version "2.0.1" @@ -6794,10 +6761,10 @@ hasha@^5.2.2: is-stream "^2.0.0" type-fest "^0.8.0" -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.0, hasown@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" + integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== dependencies: function-bind "^1.1.2" @@ -6939,13 +6906,6 @@ html-dom-parser@5.0.3: domhandler "5.0.3" htmlparser2 "9.0.0" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -6988,15 +6948,6 @@ http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" @@ -7007,9 +6958,9 @@ http-proxy-agent@^5.0.0: debug "4" http-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" - integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" debug "^4.3.4" @@ -7032,9 +6983,9 @@ https-proxy-agent@^5.0.0: debug "4" https-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" - integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== dependencies: agent-base "^7.0.2" debug "4" @@ -7078,7 +7029,7 @@ i18next@^22.4.10: dependencies: "@babel/runtime" "^7.20.6" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -7243,12 +7194,12 @@ inquirer@^8.2.4: through "^2.3.6" wrap-ansi "^6.0.1" -internal-slot@^1.0.4, internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== +internal-slot@^1.0.4, internal-slot@^1.0.5, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.2" + es-errors "^1.3.0" hasown "^2.0.0" side-channel "^1.0.4" @@ -7267,10 +7218,13 @@ ioredis@^5.0.4: redis-parser "^3.0.0" standard-as-callback "^2.1.0" -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" is-alphabetical@1.0.4, is-alphabetical@^1.0.0: version "1.0.4" @@ -7293,14 +7247,13 @@ is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" @@ -7504,9 +7457,9 @@ is-map@^2.0.1, is-map@^2.0.2: integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-npm@^1.0.0: version "1.0.0" @@ -7574,11 +7527,6 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -7603,11 +7551,11 @@ is-set@^2.0.1, is-set@^2.0.2: integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-ssh@^1.4.0: version "1.4.0" @@ -7664,12 +7612,12 @@ is-text-path@^2.0.0: dependencies: text-extensions "^2.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -7766,7 +7714,7 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: +istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -7777,6 +7725,17 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" @@ -7796,9 +7755,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -7833,89 +7792,87 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: - "@jest/types" "^27.5.1" execa "^5.0.0" - throat "^6.0.1" + jest-util "^29.7.0" + p-limit "^3.1.0" -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" + dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" - throat "^6.0.1" -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" - glob "^7.1.1" + glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^27.5.1" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1: +"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1, jest-diff@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== @@ -7925,333 +7882,273 @@ jest-config@^27.5.1: jest-get-type "^29.6.3" pretty-format "^29.7.0" -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + jest-mock "^29.7.0" + jest-util "^29.7.0" jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^27.5.1" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" "@types/node" "*" + jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: - "@jest/types" "^27.5.1" chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - emittery "^0.8.1" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: - "@babel/core" "^7.7.2" + "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.5.1" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" + pretty-format "^29.7.0" + semver "^7.5.3" -jest-util@^27.0.0, jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^27.5.1" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^27.5.1" + pretty-format "^29.7.0" -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^27.5.1" + emittery "^0.13.1" + jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - "@jest/core" "^27.5.1" + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^27.5.1" + jest-cli "^29.7.0" jiti@^1.19.1: version "1.21.0" @@ -8259,17 +8156,17 @@ jiti@^1.19.1: integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== joi@^17.7.0: - version "17.11.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" - integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== + version "17.12.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.12.1.tgz#3347ecf4cd3301962d42191c021b165eef1f395b" + integrity sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ== dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" -jose@^4.11.4, jose@^4.15.1: +jose@^4.11.4, jose@^4.15.4: version "4.15.4" resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.4.tgz#02a9a763803e3872cf55f29ecef0dfdcc218cc03" integrity sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ== @@ -8304,44 +8201,16 @@ js-yaml@^3.10.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -8402,11 +8271,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@2.x, json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -8414,6 +8278,11 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" +json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsona@^1.12.1, jsona@^1.9.7: version "1.12.1" resolved "https://registry.yarnpkg.com/jsona/-/jsona-1.12.1.tgz#213f8c55a3460d94179824ac83d1dfdbfa265238" @@ -8429,11 +8298,16 @@ jsonapi-serializer@^3.6.7: inflected "^1.1.6" lodash "^4.16.3" -jsonc-parser@3.2.0, jsonc-parser@^3.0.0: +jsonc-parser@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== +jsonc-parser@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -8535,14 +8409,14 @@ lazy-ass@1.6.0, lazy-ass@^1.6.0: resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== -lerna@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-8.0.1.tgz#cc705467c5507c38c76ae293fe976e5d438aa876" - integrity sha512-ZxFMmOqwkP4e+q6BrMzxkAhixi6n0GVD2jAAnAfDkIFnwumB4/7X5/If6fqTlXXshtB2dQtN5OAtzafqVq8cwA== +lerna@^8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-8.1.2.tgz#441e8078d0b68557b4ef5b33202a16a6bc2a50d3" + integrity sha512-RCyBAn3XsqqvHbz3TxLfD7ylqzCi1A2UJnFEZmhURgx589vM3qYWQa/uOMeEEf565q6cAdtmulITciX1wgkAtw== dependencies: - "@lerna/create" "8.0.1" + "@lerna/create" "8.1.2" "@npmcli/run-script" "7.0.2" - "@nx/devkit" ">=17.1.2 < 18" + "@nx/devkit" ">=17.1.2 < 19" "@octokit/plugin-enterprise-rest" "6.0.1" "@octokit/rest" "19.0.11" byte-size "8.1.1" @@ -8585,7 +8459,7 @@ lerna@^8.0.1: npm-packlist "5.1.1" npm-registry-fetch "^14.0.5" npmlog "^6.0.2" - nx ">=17.1.2 < 18" + nx ">=17.1.2 < 19" p-map "4.0.0" p-map-series "2.1.0" p-pipe "3.1.0" @@ -8664,7 +8538,7 @@ libnpx@^10.2.4: y18n "^4.0.0" yargs "^14.2.3" -lilconfig@3.0.0, lilconfig@^3.0.0: +lilconfig@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== @@ -8674,6 +8548,11 @@ lilconfig@^2.1.0: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -8684,17 +8563,17 @@ lines-and-columns@~2.0.3: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== -lint-staged@^15.0.2: - version "15.2.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.0.tgz#3111534ca58096a3c8f70b044b6e7fe21b36f859" - integrity sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ== +lint-staged@^15.2.2: + version "15.2.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.2.tgz#ad7cbb5b3ab70e043fa05bff82a09ed286bc4c5f" + integrity sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw== dependencies: chalk "5.3.0" commander "11.1.0" debug "4.3.4" execa "8.0.1" lilconfig "3.0.0" - listr2 "8.0.0" + listr2 "8.0.1" micromatch "4.0.5" pidtree "0.6.0" string-argv "0.3.2" @@ -8705,10 +8584,10 @@ listify@^1.0.0: resolved "https://registry.yarnpkg.com/listify/-/listify-1.0.3.tgz#a9335ac351c3d1aea515494ed746976eeb92248b" integrity sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg== -listr2@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.0.tgz#aa7c230995f8ce378585f7c96c0c6d1cefa4700d" - integrity sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg== +listr2@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.1.tgz#4d3f50ae6cec3c62bdf0e94f5c2c9edebd4b9c34" + integrity sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA== dependencies: cli-truncate "^4.0.0" colorette "^2.0.20" @@ -8881,7 +8760,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.16.3, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.16.3, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8943,9 +8822,9 @@ lowercase-keys@^2.0.0: integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" - integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== lru-cache@^4.0.1, lru-cache@^4.1.5: version "4.1.5" @@ -9527,9 +9406,9 @@ neo-async@^2.6.2: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-auth@^4.22.1: - version "4.24.5" - resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.24.5.tgz#1fd1bfc0603c61fd2ba6fd81b976af690edbf07e" - integrity sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og== + version "4.24.6" + resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.24.6.tgz#8cb1848197fdb2479eac2f10e4efa1f1b6b0daaa" + integrity sha512-djQt3ZEaWEIxcsuh3HTW2uuzLfXMRjHH+ugAsichlQSbH4iA5MRcgMA2HvTNvsDTDLh44tyU72+/gWsxgTbAKg== dependencies: "@babel/runtime" "^7.20.13" "@panva/hkdf" "^1.0.2" @@ -9662,31 +9541,7 @@ next@^12.2.3: "@next/swc-win32-ia32-msvc" "12.3.4" "@next/swc-win32-x64-msvc" "12.3.4" -"next@^12.2.3 || ^13 || ^14", next@^14: - version "14.0.4" - resolved "https://registry.yarnpkg.com/next/-/next-14.0.4.tgz#bf00b6f835b20d10a5057838fa2dfced1d0d84dc" - integrity sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA== - dependencies: - "@next/env" "14.0.4" - "@swc/helpers" "0.5.2" - busboy "1.6.0" - caniuse-lite "^1.0.30001406" - graceful-fs "^4.2.11" - postcss "8.4.31" - styled-jsx "5.1.1" - watchpack "2.4.0" - optionalDependencies: - "@next/swc-darwin-arm64" "14.0.4" - "@next/swc-darwin-x64" "14.0.4" - "@next/swc-linux-arm64-gnu" "14.0.4" - "@next/swc-linux-arm64-musl" "14.0.4" - "@next/swc-linux-x64-gnu" "14.0.4" - "@next/swc-linux-x64-musl" "14.0.4" - "@next/swc-win32-arm64-msvc" "14.0.4" - "@next/swc-win32-ia32-msvc" "14.0.4" - "@next/swc-win32-x64-msvc" "14.0.4" - -"next@^13.4 || ^14": +"next@^12.2.3 || ^13 || ^14", "next@^13.4 || ^14", next@^14: version "14.1.0" resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69" integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== @@ -9710,9 +9565,9 @@ next@^12.2.3: "@next/swc-win32-x64-msvc" "14.1.0" node-abi@^3.3.0: - version "3.52.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.52.0.tgz#ffba0a85f54e552547e5849015f40f9514d5ba7c" - integrity sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ== + version "3.55.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.55.0.tgz#57bc713082a48d4c7c7d3104d3d0cbb1a0e12ed9" + integrity sha512-uPEjtyh2tFEvWYt4Jw7McOD5FPcHkcxm/tHZc5PWaDB3JYq0rGFUbgaAK+CT5pYpQddBfsZVWI08OwoRfdfbcQ== dependencies: semver "^7.3.5" @@ -9916,9 +9771,9 @@ npm-packlist@5.1.1: npm-normalize-package-bin "^1.0.1" npm-packlist@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.1.tgz#97d1eb2a9a90e10ce1b028d058da3740c91b89ab" - integrity sha512-MQpL27ZrsJQ2kiAuQPpZb5LtJwydNRnI15QWXsf3WHERu4rzjRj6Zju/My2fov7tLuu3Gle/uoIX/DDZ3u4O4Q== + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.2.tgz#5b8d1d906d96d21c85ebbeed2cf54147477c8478" + integrity sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== dependencies: ignore-walk "^6.0.4" @@ -9973,9 +9828,9 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: path-key "^3.0.0" npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + version "5.2.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.2.0.tgz#224cdd22c755560253dd71b83a1ef2f758b2e955" + integrity sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg== dependencies: path-key "^4.0.0" @@ -9994,21 +9849,16 @@ nprogress@^0.2.0: resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== -nwsapi@^2.2.0: - version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== - -nx@17.2.6, "nx@>=17.1.2 < 18": - version "17.2.6" - resolved "https://registry.yarnpkg.com/nx/-/nx-17.2.6.tgz#717297e0757237aa010f2e07aa8fdf68e77ea104" - integrity sha512-lBHp0e0AMBwYwpT44a8b0j29szspmYUhY1okqNctz/3ifuonNFG9WGfbzRO4YKOrVkfNsuaomHVAE6gtqo55ng== +nx@18.0.4, "nx@>=17.1.2 < 19": + version "18.0.4" + resolved "https://registry.yarnpkg.com/nx/-/nx-18.0.4.tgz#3a77de6b51869449d849dccab7db74b35ec32a6b" + integrity sha512-Njb1fGppOw/wM7nOA1hYlLduV2aL4PdXSv5QS5cVYicHT5tw5RnG/0z4j9e6QfFj2EydxVeDUtlGR98diZ3/Yw== dependencies: - "@nrwl/tao" "17.2.6" + "@nrwl/tao" "18.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" - axios "^1.5.1" + axios "^1.6.0" chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" @@ -10019,17 +9869,17 @@ nx@17.2.6, "nx@>=17.1.2 < 18": figures "3.2.0" flat "^5.0.2" fs-extra "^11.1.0" - glob "7.1.4" ignore "^5.0.4" jest-diff "^29.4.1" js-yaml "4.1.0" jsonc-parser "3.2.0" lines-and-columns "~2.0.3" - minimatch "3.0.5" + minimatch "9.0.3" node-machine-id "1.1.12" npm-run-path "^4.0.1" open "^8.4.0" - semver "7.5.3" + ora "5.3.0" + semver "^7.5.3" string-width "^4.2.3" strong-log-transformer "^2.1.0" tar-stream "~2.2.0" @@ -10039,16 +9889,16 @@ nx@17.2.6, "nx@>=17.1.2 < 18": yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "17.2.6" - "@nx/nx-darwin-x64" "17.2.6" - "@nx/nx-freebsd-x64" "17.2.6" - "@nx/nx-linux-arm-gnueabihf" "17.2.6" - "@nx/nx-linux-arm64-gnu" "17.2.6" - "@nx/nx-linux-arm64-musl" "17.2.6" - "@nx/nx-linux-x64-gnu" "17.2.6" - "@nx/nx-linux-x64-musl" "17.2.6" - "@nx/nx-win32-arm64-msvc" "17.2.6" - "@nx/nx-win32-x64-msvc" "17.2.6" + "@nx/nx-darwin-arm64" "18.0.4" + "@nx/nx-darwin-x64" "18.0.4" + "@nx/nx-freebsd-x64" "18.0.4" + "@nx/nx-linux-arm-gnueabihf" "18.0.4" + "@nx/nx-linux-arm64-gnu" "18.0.4" + "@nx/nx-linux-arm64-musl" "18.0.4" + "@nx/nx-linux-x64-gnu" "18.0.4" + "@nx/nx-linux-x64-musl" "18.0.4" + "@nx/nx-win32-arm64-msvc" "18.0.4" + "@nx/nx-win32-x64-msvc" "18.0.4" oauth@^0.9.15: version "0.9.15" @@ -10070,7 +9920,7 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.13.1, object-inspect@^1.9.0: +object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== @@ -10088,7 +9938,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: +object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== @@ -10117,14 +9967,15 @@ object.fromentries@^2.0.6, object.fromentries@^2.0.7: es-abstract "^1.22.1" object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + version "1.0.2" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.2.tgz#494800ff5bab78fd0eff2835ec859066e00192ec" + integrity sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + array.prototype.filter "^1.0.3" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" object.hasown@^1.1.2: version "1.1.3" @@ -10179,11 +10030,11 @@ open@^8.4.0: is-wsl "^2.2.0" openid-client@^5.4.0: - version "5.6.1" - resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.6.1.tgz#8f7526a50c290a5e28a7fe21b3ece3107511bc73" - integrity sha512-PtrWsY+dXg6y8mtMPyL/namZSYVz8pjXz3yJiBNZsEdCnu9miHLB4ELVC85WvneMKo2Rg62Ay7NkuCpM0bgiLQ== + version "5.6.4" + resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.6.4.tgz#b2c25e6d5338ba3ce00e04341bb286798a196177" + integrity sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA== dependencies: - jose "^4.15.1" + jose "^4.15.4" lru-cache "^6.0.0" object-hash "^2.2.0" oidc-token-hash "^5.0.3" @@ -10200,6 +10051,20 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" +ora@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" + integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== + dependencies: + bl "^4.0.3" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + log-symbols "^4.0.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -10262,7 +10127,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -10372,9 +10237,9 @@ package-json@^6.3.0: semver "^6.2.0" pacote@^17.0.5: - version "17.0.5" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.5.tgz#e9854edee7a073635cdd36b0c07cd4f2ab1757b6" - integrity sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA== + version "17.0.6" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.6.tgz#874bb59cda5d44ab784d0b6530fcb4a7d9b76a60" + integrity sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ== dependencies: "@npmcli/git" "^5.0.0" "@npmcli/installed-package-contents" "^2.0.1" @@ -10391,7 +10256,7 @@ pacote@^17.0.5: promise-retry "^2.0.1" read-package-json "^7.0.0" read-package-json-fast "^3.0.0" - sigstore "^2.0.0" + sigstore "^2.2.0" ssri "^10.0.0" tar "^6.1.11" @@ -10471,7 +10336,7 @@ parse-url@^8.1.0: dependencies: parse-path "^7.0.0" -parse5@6.0.1, parse5@^6.0.0: +parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -10600,6 +10465,11 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-import@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" @@ -10640,9 +10510,9 @@ postcss-selector-parser@6.0.10: util-deprecate "^1.0.2" postcss-selector-parser@^6.0.11: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -10671,9 +10541,9 @@ postcss@8.4.31: source-map-js "^1.0.2" postcss@^8.4.12, postcss@^8.4.14, postcss@^8.4.23, postcss@^8.4.31, postcss@^8.4.5: - version "8.4.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" @@ -10687,9 +10557,9 @@ preact-render-to-string@^5.1.19: pretty-format "^3.8.0" preact@^10.6.3: - version "10.19.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" - integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== + version "10.19.5" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.5.tgz#ed220be0d3273102b5c97dd0163468164064d9f1" + integrity sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ== prebuild-install@^7.1.1: version "7.1.1" @@ -10731,17 +10601,17 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^3.0.3, prettier@^3.1.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283" - integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ== +prettier@^3.1.0, prettier@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: +pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -10750,7 +10620,7 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.7.0: +pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== @@ -10892,6 +10762,11 @@ pupa@^2.0.1: dependencies: escape-goat "^2.0.0" +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + qs@^6.10.0, qs@^6.10.3, qs@^6.11.2: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" @@ -10958,9 +10833,9 @@ react-highlight-words@^0.18.0: prop-types "^15.5.8" react-hook-form@^7.25.3, react-hook-form@^7.8.6: - version "7.49.2" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.49.2.tgz#6fb2742e1308020f26cb1915c7012b6c07b11ade" - integrity sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA== + version "7.50.1" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.50.1.tgz#f6aeb17a863327e5a0252de8b35b4fc8990377ed" + integrity sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ== react-i18next@^12.1.5: version "12.3.1" @@ -11145,14 +11020,15 @@ redis-parser@^3.0.0: redis-errors "^1.0.0" reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz#e0bd28b597518f16edaf9c0e292c631eb13e0674" + integrity sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" + get-intrinsic "^1.2.3" globalthis "^1.0.3" which-builtin-type "^1.1.3" @@ -11189,14 +11065,15 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpu-core@^5.3.1: version "5.3.2" @@ -11411,10 +11288,10 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve.exports@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" - integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.3.2: version "1.22.8" @@ -11468,9 +11345,9 @@ reusify@^1.0.4: integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== rimraf@^2.6.2: version "2.7.1" @@ -11494,23 +11371,25 @@ rimraf@^4.4.1: glob "^9.2.0" rollup@^4.0.2: - version "4.9.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.1.tgz#351d6c03e4e6bcd7a0339df3618d2aeeb108b507" - integrity sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw== + version "4.12.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.12.0.tgz#0b6d1e5f3d46bbcf244deec41a7421dc54cc45b5" + integrity sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q== + dependencies: + "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.1" - "@rollup/rollup-android-arm64" "4.9.1" - "@rollup/rollup-darwin-arm64" "4.9.1" - "@rollup/rollup-darwin-x64" "4.9.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.1" - "@rollup/rollup-linux-arm64-gnu" "4.9.1" - "@rollup/rollup-linux-arm64-musl" "4.9.1" - "@rollup/rollup-linux-riscv64-gnu" "4.9.1" - "@rollup/rollup-linux-x64-gnu" "4.9.1" - "@rollup/rollup-linux-x64-musl" "4.9.1" - "@rollup/rollup-win32-arm64-msvc" "4.9.1" - "@rollup/rollup-win32-ia32-msvc" "4.9.1" - "@rollup/rollup-win32-x64-msvc" "4.9.1" + "@rollup/rollup-android-arm-eabi" "4.12.0" + "@rollup/rollup-android-arm64" "4.12.0" + "@rollup/rollup-darwin-arm64" "4.12.0" + "@rollup/rollup-darwin-x64" "4.12.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.12.0" + "@rollup/rollup-linux-arm64-gnu" "4.12.0" + "@rollup/rollup-linux-arm64-musl" "4.12.0" + "@rollup/rollup-linux-riscv64-gnu" "4.12.0" + "@rollup/rollup-linux-x64-gnu" "4.12.0" + "@rollup/rollup-linux-x64-musl" "4.12.0" + "@rollup/rollup-win32-arm64-msvc" "4.12.0" + "@rollup/rollup-win32-ia32-msvc" "4.12.0" + "@rollup/rollup-win32-x64-msvc" "4.12.0" fsevents "~2.3.2" run-async@^2.4.0: @@ -11539,13 +11418,13 @@ rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.8.0: dependencies: tslib "^2.1.0" -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +safe-array-concat@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.5" + get-intrinsic "^1.2.2" has-symbols "^1.0.3" isarray "^2.0.5" @@ -11559,13 +11438,13 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: @@ -11573,13 +11452,6 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -11627,17 +11499,10 @@ semver-utils@^1.1.4: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== - dependencies: - lru-cache "^6.0.0" - -semver@7.5.4, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@7.6.0, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" @@ -11651,24 +11516,27 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== +set-function-length@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + define-data-property "^1.1.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.1" set-function-name@^2.0.0, set-function-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" shallow-clone@^3.0.0: version "3.0.1" @@ -11725,13 +11593,14 @@ shiki@^0.11.1: vscode-textmate "^6.0.0" side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" + integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.6" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" sigmund@^1.0.1: version "1.0.1" @@ -11759,15 +11628,17 @@ sigstore@^1.4.0: "@sigstore/tuf" "^1.0.3" make-fetch-happen "^11.0.1" -sigstore@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.1.0.tgz#c577b596642b3f360dc4135d476466e6edeb2364" - integrity sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw== +sigstore@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.2.2.tgz#5e4ff39febeae9e0679bafa22180cb0f445a7e35" + integrity sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg== dependencies: - "@sigstore/bundle" "^2.1.0" - "@sigstore/protobuf-specs" "^0.2.1" - "@sigstore/sign" "^2.1.0" - "@sigstore/tuf" "^2.1.0" + "@sigstore/bundle" "^2.2.0" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.0" + "@sigstore/sign" "^2.2.3" + "@sigstore/tuf" "^2.3.1" + "@sigstore/verify" "^1.1.0" simple-concat@^1.0.0: version "1.0.1" @@ -11865,11 +11736,11 @@ socks-proxy-agent@^8.0.1: socks "^2.7.1" socks@^2.6.2, socks@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + version "2.7.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.3.tgz#7d8a75d7ce845c0a96f710917174dba0d543a785" + integrity sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" sort-keys@^2.0.0: @@ -11884,10 +11755,10 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@^0.5.6: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -11904,16 +11775,11 @@ source-map@^0.5.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - space-separated-tokens@^1.0.0: version "1.1.5" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" @@ -11928,9 +11794,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -11941,9 +11807,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== split-lines@^2.0.0: version "2.1.0" @@ -11976,6 +11842,11 @@ split@^1.0.1: dependencies: through "2" +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -12109,9 +11980,9 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" string-width@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.0.0.tgz#14aa1b7aaa126d5b64fa79d3c894da8a9650ba06" - integrity sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" + integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== dependencies: emoji-regex "^10.3.0" get-east-asian-width "^1.0.0" @@ -12298,13 +12169,13 @@ styled-jsx@5.1.1: client-only "0.0.1" sucrase@^3.20.3, sucrase@^3.32.0: - version "3.34.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" - integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" commander "^4.0.0" - glob "7.1.6" + glob "^10.3.10" lines-and-columns "^1.1.6" mz "^2.7.0" pirates "^4.0.1" @@ -12322,7 +12193,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -12336,14 +12207,6 @@ supports-color@^8.0.0, supports-color@^8.1.1: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -12354,11 +12217,6 @@ swr@^1.3.0: resolved "https://registry.yarnpkg.com/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8" integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw== -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - synckit@^0.8.6: version "0.8.8" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" @@ -12462,14 +12320,6 @@ term-size@^2.1.0: resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -12508,11 +12358,6 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -throat@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" - integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== - throttleit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" @@ -12589,7 +12434,7 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== -tough-cookie@^4.0.0, tough-cookie@^4.1.3: +tough-cookie@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== @@ -12606,13 +12451,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -12644,30 +12482,30 @@ trough@^1.0.0: integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== ts-api-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" - integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.2.1.tgz#f716c7e027494629485b21c0df6180f4d08f5e8b" + integrity sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA== ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-jest@^27.1.5: - version "27.1.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" - integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== +ts-jest@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.2.tgz#7613d8c81c43c8cb312c6904027257e814c40e09" + integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" - semver "7.x" - yargs-parser "20.x" + semver "^7.5.3" + yargs-parser "^21.0.1" -ts-node@^10.9.1: +ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -12715,10 +12553,10 @@ tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.6.2: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsup@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/tsup/-/tsup-7.3.0.tgz#c7776e08c7ef55ed69def2c6e7ba4719005f5abd" - integrity sha512-Ja1eaSRrE+QarmATlNO5fse2aOACYMBX+IZRKy1T+gpyH+jXgRrl5l4nHIQJQ1DoDgEjHDTw8cpE085UdBZuWQ== +tsup@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.0.2.tgz#c63192a08386515103e2c44ac5a23bdff75c5fa1" + integrity sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ== dependencies: bundle-require "^4.0.0" cac "^6.7.12" @@ -12751,10 +12589,10 @@ tuf-js@^1.1.7: debug "^4.3.4" make-fetch-happen "^11.1.1" -tuf-js@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.1.0.tgz#87aa36d5a166e7522f1e2050eb502a3a9b0bde72" - integrity sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA== +tuf-js@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.0.tgz#4daaa8620ba7545501d04dfa933c98abbcc959b9" + integrity sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg== dependencies: "@tufjs/models" "2.0.0" debug "^4.3.4" @@ -12772,47 +12610,47 @@ tunnel@^0.0.6: resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== -turbo-darwin-64@1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.11.2.tgz#fc3d4d74b325a27aef11b6a52a61f07d466846b9" - integrity sha512-toFmRG/adriZY3hOps7nYCfqHAS+Ci6xqgX3fbo82kkLpC6OBzcXnleSwuPqjHVAaRNhVoB83L5njcE9Qwi2og== - -turbo-darwin-arm64@1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.11.2.tgz#583a4d0025bc3f953a9eeb7065cb173f481a9965" - integrity sha512-FCsEDZ8BUSFYEOSC3rrARQrj7x2VOrmVcfrMUIhexTxproRh4QyMxLfr6LALk4ymx6jbDCxWa6Szal8ckldFbA== - -turbo-linux-64@1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.11.2.tgz#55ef996d856cb397b9fb2855a554ccef1cee9dd7" - integrity sha512-Vzda/o/QyEske5CxLf0wcu7UUS+7zB90GgHZV4tyN+WZtoouTvbwuvZ3V6b5Wgd3OJ/JwWR0CXDK7Sf4VEMr7A== - -turbo-linux-arm64@1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.11.2.tgz#64d6093c9a2f32f410624564fd10685c847d947e" - integrity sha512-bRLwovQRz0yxDZrM4tQEAYV0fBHEaTzUF0JZ8RG1UmZt/CqtpnUrJpYb1VK8hj1z46z9YehARpYCwQ2K0qU4yw== - -turbo-windows-64@1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.11.2.tgz#f4164be9c42796c86ca3929e27f1992a4310b9ed" - integrity sha512-LgTWqkHAKgyVuLYcEPxZVGPInTjjeCnN5KQMdJ4uQZ+xMDROvMFS2rM93iQl4ieDJgidwHCxxCxaU9u8c3d/Kg== - -turbo-windows-arm64@1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.11.2.tgz#ca1b4d7ac6fe8c931baef1a270ac07bbd924277b" - integrity sha512-829aVBU7IX0c/B4G7g1VI8KniAGutHhIupkYMgF6xPkYVev2G3MYe6DMS/vsLt9GGM9ulDtdWxWrH5P2ngK8IQ== - -turbo@^1.10.15: - version "1.11.2" - resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.11.2.tgz#7bae6df12c210e9b12973aad8f0e7b077039d4ce" - integrity sha512-jPC7LVQJzebs5gWf8FmEvsvXGNyKbN+O9qpvv98xpNaM59aS0/Irhd0H0KbcqnXfsz7ETlzOC3R+xFWthC4Z8A== +turbo-darwin-64@1.12.4: + version "1.12.4" + resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.12.4.tgz#c03061dcf3e9fb6e530b7c5be035e44627015af7" + integrity sha512-dBwFxhp9isTa9RS/fz2gDVk5wWhKQsPQMozYhjM7TT4jTrnYn0ZJMzr7V3B/M/T8QF65TbniW7w1gtgxQgX5Zg== + +turbo-darwin-arm64@1.12.4: + version "1.12.4" + resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.12.4.tgz#5a10367004077fb7874717f4ddc47b2f66f74cfb" + integrity sha512-1Uo5iI6xsJ1j9ObsqxYRsa3W26mEbUe6fnj4rQYV6kDaqYD54oAMJ6hM53q9rB8JvFxwdrUXGp3PwTw9A0qqkA== + +turbo-linux-64@1.12.4: + version "1.12.4" + resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.12.4.tgz#22af551b152634a162a13c4a14af28816b383fc9" + integrity sha512-ONg2aSqKP7LAQOg7ysmU5WpEQp4DGNxSlAiR7um+LKtbmC/UxogbR5+T+Uuq6zGuQ5kJyKjWJ4NhtvUswOqBsA== + +turbo-linux-arm64@1.12.4: + version "1.12.4" + resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.12.4.tgz#f13fb4da0e9fd968ccc0b807df643913ee8fab50" + integrity sha512-9FPufkwdgfIKg/9jj87Cdtftw8o36y27/S2vLN7FTR2pp9c0MQiTBOLVYadUr1FlShupddmaMbTkXEhyt9SdrA== + +turbo-windows-64@1.12.4: + version "1.12.4" + resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.12.4.tgz#9b72a5082f6db8f995f409226220982ee90661f7" + integrity sha512-2mOtxHW5Vjh/5rDVu/aFwsMzI+chs8XcEuJHlY1sYOpEymYTz+u6AXbnzRvwZFMrLKr7J7fQOGl+v96sLKbNdA== + +turbo-windows-arm64@1.12.4: + version "1.12.4" + resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.12.4.tgz#e7058885e18705c625436acebcd66fda3dd506d5" + integrity sha512-nOY5wae9qnxPOpT1fRuYO0ks6dTwpKMPV6++VkDkamFDLFHUDVM/9kmD2UTeh1yyrKnrZksbb9zmShhmfj1wog== + +turbo@^1.12.4: + version "1.12.4" + resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.12.4.tgz#c3ba81871eba9ec87ac86af9e6270857726da9cb" + integrity sha512-yUJ7elEUSToiGwFZogXpYKJpQ0BvaMbkEuQECIWtkBLcmWzlMOt6bActsIm29oN83mRU0WbzGt4e8H1KHWedhg== optionalDependencies: - turbo-darwin-64 "1.11.2" - turbo-darwin-arm64 "1.11.2" - turbo-linux-64 "1.11.2" - turbo-linux-arm64 "1.11.2" - turbo-windows-64 "1.11.2" - turbo-windows-arm64 "1.11.2" + turbo-darwin-64 "1.12.4" + turbo-darwin-arm64 "1.12.4" + turbo-linux-64 "1.12.4" + turbo-linux-arm64 "1.12.4" + turbo-windows-64 "1.12.4" + turbo-windows-arm64 "1.12.4" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" @@ -12872,48 +12710,53 @@ type-fest@^3.0.0: integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-fest@^4.8.1: - version "4.8.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.8.3.tgz#6db08d9f44d596cd953f83020c7c56310c368d1c" - integrity sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw== + version "4.10.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.10.2.tgz#3abdb144d93c5750432aac0d73d3e85fcab45738" + integrity sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw== -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + version "1.0.5" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5" + integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -12927,7 +12770,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -"typescript@>=3 < 6", typescript@^5.2.2, typescript@^5.3.2: +"typescript@>=3 < 6", typescript@^5.2.2, typescript@^5.3.2, typescript@^5.3.3: version "5.3.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== @@ -12953,9 +12796,9 @@ undici-types@~5.26.4: integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici@^5.25.4: - version "5.28.2" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" - integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== + version "5.28.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" + integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== dependencies: "@fastify/busboy" "^2.0.0" @@ -13258,14 +13101,14 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== dependencies: + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" + convert-source-map "^2.0.0" validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" @@ -13336,20 +13179,6 @@ vscode-textmate@^6.0.0: resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210" integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ== -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - wait-on@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.0.1.tgz#5cff9f8427e94f4deacbc2762e6b0a489b19eae9" @@ -13361,7 +13190,7 @@ wait-on@7.0.1: minimist "^1.2.7" rxjs "^7.8.0" -walker@^1.0.7: +walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -13398,16 +13227,6 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - webpack-merge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" @@ -13415,23 +13234,11 @@ webpack-merge@^4.2.2: dependencies: lodash "^4.17.15" -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - whatwg-fetch@^3.4.1: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -13449,15 +13256,6 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -13502,16 +13300,16 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" + integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" + available-typed-arrays "^1.0.6" + call-bind "^1.0.5" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.1" which@^1.2.9, which@^1.3.0: version "1.3.1" @@ -13637,6 +13435,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + write-json-file@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" @@ -13658,11 +13464,6 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -13673,16 +13474,6 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -13713,17 +13504,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@2.3.4, yaml@^2.0.0-1, yaml@^2.3.3, yaml@^2.3.4: +yaml@2.3.4, yaml@^2.0.0-1, yaml@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== -yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@21.1.1, yargs-parser@^21.1.1: +yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== @@ -13736,7 +13522,12 @@ yargs-parser@^15.0.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@17.7.2, yargs@^17.0.0, yargs@^17.6.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@17.7.2, yargs@^17.0.0, yargs@^17.3.1, yargs@^17.6.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==