From c4248e106bbe3a8be14c722ad5d16d446e6b7d88 Mon Sep 17 00:00:00 2001 From: Benjamin Bock Date: Thu, 12 Nov 2020 16:18:59 +0100 Subject: [PATCH 01/12] Convert project to TypeScript --- .eslintignore | 4 +- .eslintrc.js | 52 ++++++- jest.config.js | 2 + package.json | 18 ++- rollup.config.js | 23 ++- scripts/build.js | 65 ++++++++ src/{format.js => format.ts} | 42 +++--- src/{index.js => index.ts} | 120 +++++++++++++-- src/utils.js | 14 -- src/utils.ts | 19 +++ tests/{base.test.js => base.test.ts} | 0 tsconfig.eslint.json | 13 ++ tsconfig.json | 19 +++ yarn.lock | 218 ++++++++++++++++++++++++--- 14 files changed, 528 insertions(+), 81 deletions(-) create mode 100644 scripts/build.js rename src/{format.js => format.ts} (76%) rename src/{index.js => index.ts} (54%) delete mode 100644 src/utils.js create mode 100644 src/utils.ts rename tests/{base.test.js => base.test.ts} (100%) create mode 100644 tsconfig.eslint.json create mode 100644 tsconfig.json diff --git a/.eslintignore b/.eslintignore index 63520da7..e8e65946 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,5 @@ node_modules dist -build +examples +scripts +tests/env diff --git a/.eslintrc.js b/.eslintrc.js index 69de8773..7c781fca 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,11 +10,55 @@ module.exports = { context: true, // for jest/puppeteer tests in examples/express jestPuppeteer: true, // for jest/puppeteer tests in examples/express }, - extends: ['standard', 'plugin:prettier/recommended'], - plugins: ['jest'], + extends: [ + 'standard', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:prettier/recommended', + 'prettier/@typescript-eslint', + ], + parser: '@typescript-eslint/parser', parserOptions: { - ecmaVersion: 11, + ecmaVersion: 2019, sourceType: 'module', + project: ['tsconfig.eslint.json'], + projectFolderIgnoreList: ['dist'], + }, + plugins: ['jsdoc', '@typescript-eslint', 'prettier', 'jest'], + rules: { + 'no-dupe-class-members': 'off', // Off due to conflict with typescript overload functions + 'prettier/prettier': ['error', {}, { usePrettierrc: true }], + '@typescript-eslint/array-type': ['warn', { default: 'array-simple' }], + '@typescript-eslint/return-await': 'off', + 'jsdoc/check-alignment': 'error', + 'jsdoc/check-indentation': 'error', + '@typescript-eslint/space-before-function-paren': 0, + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-throw-literal': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-module-boundary-types': 'off', + '@typescript-eslint/prefer-regexp-exec': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/member-delimiter-style': [ + 'error', + { + multiline: { + delimiter: 'none', // 'none' or 'semi' or 'comma' + requireLast: true, + }, + singleline: { + delimiter: 'semi', // 'semi' or 'comma' + requireLast: false, + }, + }, + ], + 'comma-dangle': 'off', }, - rules: {}, } diff --git a/jest.config.js b/jest.config.js index 845548de..2ba739c7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,6 @@ module.exports = { verbose: true, modulePathIgnorePatterns: ['/examples'], + testMatch: ['/tests/**/*.ts?(x)'], + preset: 'ts-jest', } diff --git a/package.json b/package.json index 70e2d129..016bc082 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": false, "description": "The search client to use MeiliSearch with InstantSearch.", "scripts": { + "cleanup": "shx rm -rf dist/", "test": "jest", "test:demo": "yarn build && yarn test:demo:browser && yarn test:demo:nodejs && yarn test:demo:esm", "test:demo:browser": "yarn --cwd examples/express && yarn --cwd examples/express test", @@ -14,14 +15,23 @@ "test:all": "yarn test && yarn test:demo", "lint": "eslint --ext .js,.ts,.tsx,.vue .", "lint:fix": "eslint --ext .js,.ts,.tsx,.vue --fix .", - "build": "rollup -c rollup.config.js && rollup --environment NODE_ENV:production -c rollup.config.js ", + "build": "yarn cleanup && rollup -c rollup.config.js && rollup --environment NODE_ENV:production -c rollup.config.js ", + "postbuild": "yarn typingsheader", "playground:vue": "yarn --cwd ./playgrounds/vue && yarn --cwd ./playgrounds/vue serve", - "playground:react": "yarn --cwd ./playgrounds/react && yarn --cwd ./playgrounds/react start" + "playground:react": "yarn --cwd ./playgrounds/react && yarn --cwd ./playgrounds/react start", + "typingsheader": "node scripts/build.js" }, "main": "./dist/instant-meilisearch.umd.js", "module": "./dist/instant-meilisearch.esm.js", "browser": "./dist/instant-meilisearch.umd.js", "cjs": "./dist/instant-meilisearch.cjs.js", + "source": "src/index.ts", + "typings": "./dist/types/index.d.ts", + "types": "./dist/types/index.d.ts", + "sideEffects": false, + "bugs": { + "url": "https://github.com/meilisearch/instant-meilisearch/issues" + }, "files": [ "dist", "src" @@ -57,6 +67,7 @@ "eslint-plugin-flowtype": "^5.2.0", "eslint-plugin-import": "^2.22.0", "eslint-plugin-jest": "^24.0.0", + "eslint-plugin-jsdoc": "^30.7.7", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^3.1.4", @@ -72,6 +83,9 @@ "rollup": "^2.23.0", "rollup-plugin-babel": "^4.4.0", "rollup-plugin-terser": "^7.0.0", + "rollup-plugin-typescript2": "^0.29.0", + "shx": "^0.3.3", + "ts-jest": "^26.4.4", "typescript": "^4.0.0" } } diff --git a/rollup.config.js b/rollup.config.js index c7e2833d..7a205e91 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,9 +1,11 @@ +import commonjs from '@rollup/plugin-commonjs' import nodeResolve from '@rollup/plugin-node-resolve' import { resolve } from 'path' -import commonjs from '@rollup/plugin-commonjs' import babel from 'rollup-plugin-babel' -import pkg from './package.json' import { terser } from 'rollup-plugin-terser' +import typescript from 'rollup-plugin-typescript2' + +import pkg from './package.json' function getOutputFileName(fileName, isProd = false) { return isProd ? fileName.replace(/\.js$/, '.min.js') : fileName @@ -13,10 +15,21 @@ const env = process.env.NODE_ENV || 'development' const LIB_NAME = 'instantMeiliSearch' const ROOT = resolve(__dirname, '.') +const PLUGINS = [ + typescript({ + useTsconfigDeclarationDir: true, + tsconfigOverride: { + allowJs: false, + includes: ['src'], + exclude: ['tests', 'examples', '*.js', 'scripts'], + esModuleInterop: true, + }, + }), +] module.exports = [ // browser-friendly IIFE build { - input: 'src/index.js', // directory to transpilation of typescript + input: 'src/index.ts', // directory to transpilation of typescript output: { name: LIB_NAME, file: getOutputFileName( @@ -31,6 +44,7 @@ module.exports = [ }, }, plugins: [ + ...PLUGINS, nodeResolve({ mainFields: ['jsnext', 'browser', 'main'], preferBuiltins: true, @@ -43,7 +57,7 @@ module.exports = [ ], }, { - input: 'src/index.js', + input: 'src/index.ts', external: ['meilisearch'], output: [ { @@ -68,6 +82,7 @@ module.exports = [ ], plugins: [ env === 'production' ? terser() : {}, // will minify the file in production mode + ...PLUGINS, ], }, ] diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 00000000..ae50a4b8 --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,65 @@ +/** + * This file only purpose is to execute any build related tasks + */ + +const { resolve, normalize } = require('path') +const { readFileSync, writeFileSync } = require('fs') +const pkg = require('../package.json') + +const ROOT = resolve(__dirname, '..') +const TYPES_ROOT_FILE = resolve(ROOT, normalize(pkg.typings)) + +main() + +function main() { + writeDtsHeader() +} + +function writeDtsHeader() { + const dtsHeader = getDtsHeader( + pkg.name, + pkg.version, + pkg.author, + pkg.repository.url, + pkg.devDependencies.typescript + ) + + prependFileSync(TYPES_ROOT_FILE, dtsHeader) +} + +/** + * + * @param {string} pkgName + * @param {string} version + * @param {string} author + * @param {string} repoUrl + * @param {string} tsVersion + */ +function getDtsHeader(pkgName, version, author, repoUrl, tsVersion) { + const extractUserName = repoUrl.match(/\.com\/([\w-]+)\/\w+/i) + const githubUserUrl = extractUserName ? extractUserName[1] : 'Unknown' + + return ` +// Type definitions for ${pkgName} ${version} +// Project: ${repoUrl} +// Definitions by: ${author} +// Definitions: ${repoUrl} +// TypeScript Version: ${tsVersion} +`.replace(/^\s+/gm, '') +} + +/** + * + * @param {string} path + * @param {string | Blob} data + */ +function prependFileSync(path, data) { + const existingFileContent = readFileSync(path, { + encoding: 'utf8', + }) + const newFileContent = [data, existingFileContent].join('\n') + writeFileSync(path, newFileContent, { + flag: 'w+', + encoding: 'utf8', + }) +} diff --git a/src/format.js b/src/format.ts similarity index 76% rename from src/format.js rename to src/format.ts index 18d2ca3a..a47cf05f 100644 --- a/src/format.js +++ b/src/format.ts @@ -1,6 +1,11 @@ -import { isString } from './utils.js' +import { Params } from '.' +import { isString } from './utils' -function replaceHighlightTags(value, highlightPreTag, highlightPostTag) { +function replaceHighlightTags( + value: string, + highlightPreTag?: string, + highlightPostTag?: string +) { let newHighlightValue = value || '' // If the value of the attribute is a string, // the highlight is applied by MeiliSearch ( tags) @@ -15,15 +20,15 @@ function replaceHighlightTags(value, highlightPreTag, highlightPostTag) { return newHighlightValue.toString() } -function createHighlighResult({ +function createHighlighResult>({ formattedHit, highlightPreTag, highlightPostTag, -}) { +}: { formattedHit: T } & Params) { // formattedHit is the `_formatted` object returned by MeiliSearch. // It contains all the highlighted and croped attributes return Object.keys(formattedHit).reduce((result, key) => { - result[key] = { + ;(result[key] as any) = { value: replaceHighlightTags( formattedHit[key], highlightPreTag, @@ -31,14 +36,14 @@ function createHighlighResult({ ), } return result - }, {}) + }, {} as T) } function snippetFinalValue( - value, - snippetEllipsisText, - highlightPreTag, - highlightPostTag + value: string, + snippetEllipsisText?: string, + highlightPreTag?: string, + highlightPostTag?: string ) { let newValue = value // manage a kind of `...` for the crop until this issue is solved: https://github.com/meilisearch/MeiliSearch/issues/923 @@ -58,24 +63,27 @@ function snippetFinalValue( return replaceHighlightTags(newValue, highlightPreTag, highlightPostTag) } -function createSnippetResult({ +function createSnippetResult< + T extends Record, + K extends keyof T & string +>({ formattedHit, attributesToSnippet, snippetEllipsisText, highlightPreTag, highlightPostTag, -}) { +}: { formattedHit: T } & Params) { if (attributesToSnippet === undefined) { return null } attributesToSnippet = attributesToSnippet.map( (attribute) => attribute.split(':')[0] - ) + ) as K[] // formattedHit is the `_formatted` object returned by MeiliSearch. // It contains all the highlighted and croped attributes - return Object.keys(formattedHit).reduce((result, key) => { - if (attributesToSnippet.includes(key)) { - result[key] = { + return (Object.keys(formattedHit) as K[]).reduce((result, key) => { + if (attributesToSnippet!.includes(key)) { + ;(result[key] as any) = { value: snippetFinalValue( formattedHit[key], snippetEllipsisText, @@ -85,7 +93,7 @@ function createSnippetResult({ } } return result - }, {}) + }, {} as T) } export { createHighlighResult, createSnippetResult } diff --git a/src/index.js b/src/index.ts similarity index 54% rename from src/index.js rename to src/index.ts index 7abd618d..9988056f 100644 --- a/src/index.js +++ b/src/index.ts @@ -1,18 +1,103 @@ -import MeiliSearch from 'meilisearch' -import { removeUndefinedFromObject } from './utils.js' -import { createHighlighResult, createSnippetResult } from './format.js' +import MeiliSearch, { SearchResponse } from 'meilisearch' -export default function instantMeiliSearch(hostUrl, apiKey, options = {}) { +import { createHighlighResult, createSnippetResult } from './format' +import { removeUndefinedFromObject } from './utils' + +export type Params = { + page?: number + hitsPerPage?: number + highlightPreTag?: string + highlightPostTag?: string + snippetEllipsisText?: string + attributesToSnippet?: string[] + query: string + facets: string // TODO + filters: string // TODO + facetFilters: string // TODO +} + +type Request = { + params: Params + indexName: string +} +type Requests = { + 0: Request +} +type InstantMeiliSearchOptions = { + paginationTotalHits?: number + placeholderSearch?: boolean +} + +type InstantMeiliSearchInstance = { + pagination?: boolean + paginationTotalHits: number + hitsPerPage?: number + client: MeiliSearch + attributesToHighlight: string[] + placeholderSearch: boolean + parseMeiliSearchResponse: ( + indexUid: string, + meiliSearchResponse: SearchResponse, + params: Params + ) => { + results: Array<{ + hits: any + index: string + hitsPerPage: number + facets: object | undefined + exhaustiveFacetsCount?: boolean + processingTimeMs: number + exhaustiveNbHits: boolean + }> + } + + transformToMeiliSearchParams: ( + params: Params + ) => { + q: any + facetsDistribution: any + facetFilters: any + attributesToHighlight: string[] + attributesToCrop: string[] | undefined + filters: any + limit: number + } + parseHits: (meiliSearchHits: any, params: Params) => any + paginationParams: ( + hitsLength: number, + params: Params + ) => { nbPages: number; page: number | undefined } | undefined + + search: ( + requests: Requests + ) => Promise<{ + results: Array<{ + hits: any + index: string + hitsPerPage: number + facets: object | undefined + exhaustiveFacetsCount?: boolean | undefined + processingTimeMs: number + exhaustiveNbHits: boolean + }> + }> +} + +export default function instantMeiliSearch( + hostUrl: string, + apiKey: string, + options: InstantMeiliSearchOptions = {} +): InstantMeiliSearchInstance { return { client: new MeiliSearch({ host: hostUrl, apiKey: apiKey }), attributesToHighlight: ['*'], paginationTotalHits: options.paginationTotalHits || 200, placeholderSearch: options.placeholderSearch !== false, // true by default - transformToMeiliSearchParams: function (params) { + transformToMeiliSearchParams: function (params: Params) { const limit = this.pagination // if pagination widget is set, use paginationTotalHits as limit ? this.paginationTotalHits - : this.hitsPerPage + : this.hitsPerPage! const { query, facets, @@ -34,13 +119,14 @@ export default function instantMeiliSearch(hostUrl, apiKey, options = {}) { return removeUndefinedFromObject(searchInput) }, - parseHits: function (meiliSearchHits, params) { + parseHits: function (meiliSearchHits, params: Params) { if (this.pagination) { - const start = params.page * this.hitsPerPage + params.page ||= 0 + const start = params.page * this.hitsPerPage! meiliSearchHits = meiliSearchHits.splice(start, this.hitsPerPage) } - return meiliSearchHits.map((hit) => { + return meiliSearchHits.map((hit: any) => { const formattedHit = hit._formatted delete hit._formatted return { @@ -51,10 +137,10 @@ export default function instantMeiliSearch(hostUrl, apiKey, options = {}) { }) }, - paginationParams: function (hitsLength, params) { + paginationParams: function (hitsLength: number, params: Params) { if (this.pagination) { - const adjust = hitsLength % this.hitsPerPage === 0 ? 0 : 1 - const nbPages = Math.floor(hitsLength / this.hitsPerPage) + adjust + const adjust = hitsLength % this.hitsPerPage! === 0 ? 0 : 1 + const nbPages = Math.floor(hitsLength / this.hitsPerPage!) + adjust return { nbPages: nbPages, // total number of pages page: params.page, // the current page, information sent by InstantSearch @@ -62,7 +148,11 @@ export default function instantMeiliSearch(hostUrl, apiKey, options = {}) { } }, - parseMeiliSearchResponse: function (indexUid, meiliSearchResponse, params) { + parseMeiliSearchResponse: function ( + indexUid: string, + meiliSearchResponse: SearchResponse, + params: Params + ) { const { exhaustiveFacetsCount, exhaustiveNbHits, @@ -75,7 +165,7 @@ export default function instantMeiliSearch(hostUrl, apiKey, options = {}) { const parsedResponse = { index: indexUid, - hitsPerPage: this.hitsPerPage, + hitsPerPage: this.hitsPerPage!, facets, exhaustiveFacetsCount, exhaustiveNbHits, @@ -91,7 +181,7 @@ export default function instantMeiliSearch(hostUrl, apiKey, options = {}) { } }, - search: async function (requests) { + search: async function (requests: Requests) { // Params got from InstantSearch const params = requests[0].params this.pagination = params.page !== undefined // If the pagination widget has been set diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index a1b0aee1..00000000 --- a/src/utils.js +++ /dev/null @@ -1,14 +0,0 @@ -function removeUndefinedFromObject(object) { - return Object.keys(object).reduce((result, key) => { - if (object[key] !== undefined) { - result[key] = object[key] - } - return result - }, {}) -} - -function isString(str) { - return typeof str === 'string' || str instanceof String -} - -export { isString, removeUndefinedFromObject } diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..03f506ac --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,19 @@ +type NoUndefined = { + [P in keyof T]-?: Exclude +} + +export function removeUndefinedFromObject< + T extends Record, + K extends keyof T & string +>(object: T) { + return (Object.keys(object) as K[]).reduce((result, key) => { + if (object[key] !== undefined) { + result[key] = object[key] + } + return result + }, {} as NoUndefined) +} + +export function isString(str: any) { + return typeof str === 'string' || str instanceof String +} diff --git a/tests/base.test.js b/tests/base.test.ts similarity index 100% rename from tests/base.test.js rename to tests/base.test.ts diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 00000000..a236ea6b --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,13 @@ +{ + // extend your base config so you don't have to redefine your compilerOptions + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": false + }, + "include": [ + "tests/**/*.ts", + "jest.config.js", + "rollup.config.js", + ".eslintrc.js" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..62d8e55f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "esnext", + "noEmit": true, + "allowJs": false, + "removeComments": false, + "strict": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true, + "declarationDir": "./dist/types", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "moduleResolution": "node", + "noImplicitAny": true, + "lib": ["ES2015", "ESNext", "dom"] + }, + "include": ["src"] // files to include during transpilation +} diff --git a/yarn.lock b/yarn.lock index 3ef7122a..0f984412 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1224,6 +1224,14 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@26.x": + version "26.0.15" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.15.tgz#12e02c0372ad0548e07b9f4e19132b834cb1effe" + integrity sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + "@types/json-schema@^7.0.3": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" @@ -1729,6 +1737,13 @@ browserslist@^4.14.5, browserslist@^4.14.6: escalade "^3.1.1" node-releases "^1.1.65" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1736,7 +1751,7 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-from@^1.0.0: +buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -1945,6 +1960,11 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +comment-parser@^0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.7.6.tgz#0e743a53c8e646c899a1323db31f6cd337b10f12" + integrity sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2072,7 +2092,7 @@ debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== @@ -2386,6 +2406,19 @@ eslint-plugin-jest@^24.0.0: dependencies: "@typescript-eslint/experimental-utils" "^4.0.1" +eslint-plugin-jsdoc@^30.7.7: + version "30.7.7" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.7.tgz#2af2c68e5adaf8a59fc3c72081a4b137098268bb" + integrity sha512-DmVMJC2AbpYX7X1KhnVT1a9ex1AUvG+q9G8i6hzjp3cpjW8vmKQTUmZnRS0//W+7HvMqeb+eXPANdCOzGVVZBQ== + dependencies: + comment-parser "^0.7.6" + debug "^4.2.0" + jsdoctypeparser "^9.0.0" + lodash "^4.17.20" + regextras "^0.7.1" + semver "^7.3.2" + spdx-expression-parse "^3.0.1" + eslint-plugin-jsx-a11y@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" @@ -2728,7 +2761,7 @@ fast-glob@^3.1.1: micromatch "^4.0.2" picomatch "^2.2.1" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.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== @@ -2781,6 +2814,15 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -2836,6 +2878,15 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -2980,7 +3031,7 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== @@ -3147,6 +3198,11 @@ internal-slot@^1.0.2: has "^1.0.3" side-channel "^1.0.2" +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -3202,7 +3258,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.0.0: +is-core-module@^2.0.0, is-core-module@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== @@ -3504,7 +3560,7 @@ jest-config@^26.6.3: micromatch "^4.0.2" pretty-format "^26.6.2" -jest-diff@^26.6.2: +jest-diff@^26.0.0, jest-diff@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== @@ -3770,7 +3826,7 @@ jest-snapshot@^26.6.2: pretty-format "^26.6.2" semver "^7.3.2" -jest-util@^26.6.2: +jest-util@^26.1.0, jest-util@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== @@ -3856,6 +3912,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdoctypeparser@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz#8c97e2fb69315eb274b0f01377eaa5c940bd7b26" + integrity sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw== + jsdom@^16.4.0: version "16.4.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" @@ -3923,6 +3984,13 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@2.x, json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -3930,12 +3998,12 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" jsprim@^1.2.2: version "1.4.1" @@ -4047,12 +4115,17 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -4079,13 +4152,18 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -4173,7 +4251,7 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -4186,6 +4264,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp@1.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -4591,7 +4674,7 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" -pkg-dir@^4.2.0: +pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -4625,7 +4708,7 @@ prettier@^2.0.0: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== -pretty-format@^26.6.2: +pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== @@ -4767,6 +4850,13 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -4824,6 +4914,11 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" +regextras@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2" + integrity sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w== + regjsgen@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" @@ -4925,6 +5020,21 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2: version "1.18.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" @@ -4975,6 +5085,17 @@ rollup-plugin-terser@^7.0.0: serialize-javascript "^4.0.0" terser "^5.0.0" +rollup-plugin-typescript2@^0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.29.0.tgz#b7ad83f5241dbc5bdf1e98d9c3fca005ffe39e1a" + integrity sha512-YytahBSZCIjn/elFugEGQR5qTsVhxhUwGZIsA9TmrSsC88qroGo65O5HZP/TTArH2dm0vUmYWhKchhwi2wL9bw== + dependencies: + "@rollup/pluginutils" "^3.1.0" + find-cache-dir "^3.3.1" + fs-extra "8.1.0" + resolve "1.17.0" + tslib "2.0.1" + rollup-pluginutils@^2.8.1: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" @@ -5053,16 +5174,16 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@7.x, semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -5109,11 +5230,28 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shelljs@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shx@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.3.tgz#681a88c7c10db15abe18525349ed474f0f1e7b9f" + integrity sha512-nZJ3HFWVoTSyyB+evEKjJ1STiixGztlqwKLTUNV5KqMWtGey9fTd4KU1gdZ1X9BV6215pswQ/Jew9NsuS/fNDA== + dependencies: + minimist "^1.2.3" + shelljs "^0.8.4" + side-channel@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" @@ -5238,7 +5376,7 @@ spdx-exceptions@^2.1.0: resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== -spdx-expression-parse@^3.0.0: +spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== @@ -5542,6 +5680,23 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" +ts-jest@^26.4.4: + version "26.4.4" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.4.4.tgz#61f13fb21ab400853c532270e52cc0ed7e502c49" + integrity sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg== + dependencies: + "@types/jest" "26.x" + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + jest-util "^26.1.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + mkdirp "1.x" + semver "7.x" + yargs-parser "20.x" + tsconfig-paths@^3.9.0: version "3.9.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" @@ -5552,6 +5707,11 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" +tslib@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -5655,6 +5815,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -5870,6 +6035,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +yargs-parser@20.x: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" From b33ed8f78b1fe8046b6a9d3aa3c984ab69572648 Mon Sep 17 00:00:00 2001 From: Benjamin Bock Date: Thu, 12 Nov 2020 16:39:10 +0100 Subject: [PATCH 02/12] Fix vue playground --- playgrounds/vue/src/App.vue | 54 ++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/playgrounds/vue/src/App.vue b/playgrounds/vue/src/App.vue index 27183b4e..12c1e13e 100644 --- a/playgrounds/vue/src/App.vue +++ b/playgrounds/vue/src/App.vue @@ -5,40 +5,43 @@

Search in Steam video games 🎮

- This is not the official Steam dataset but only for demo purpose. - Enjoy searching with MeiliSearch! + This is not the official Steam dataset but only for demo purpose. Enjoy + searching with MeiliSearch!

- +
Clear all filters

Genres

- +

Players

- +

Platforms

- +

Misc

- +
- + @@ -57,19 +60,19 @@