UNPKG

meilisearch

Version:

The Meilisearch JS client for Node.js and the browser.

1,279 lines (1,025 loc) 40.9 kB
// Type definitions for meilisearch // Project: https://github.com/meilisearch/meilisearch-js // Definitions by: qdequele <quentin@meilisearch.com> <https://github.com/meilisearch> // Definitions: https://github.com/meilisearch/meilisearch-js // TypeScript Version: ^3.8.3 import { Task } from "./task.js"; import { Batch } from "./batch.js"; export type Config = { host: string; apiKey?: string; clientAgents?: string[]; requestConfig?: Partial<Omit<RequestInit, "body" | "method">>; httpClient?: (input: string, init?: RequestInit) => Promise<any>; timeout?: number; }; /// /// Resources /// export type Pagination = { offset?: number; limit?: number; }; export type ResourceQuery = Pagination & {}; export type ResourceResults<T> = Pagination & { results: T; total: number; }; /// /// Indexes /// export type IndexOptions = { primaryKey?: string; }; export type IndexObject = { uid: string; primaryKey?: string; createdAt: Date; updatedAt: Date; }; export type IndexesQuery = ResourceQuery & {}; export type IndexesResults<T> = ResourceResults<T> & {}; /* * SEARCH PARAMETERS */ export const MatchingStrategies = { ALL: "all", LAST: "last", FREQUENCY: "frequency", } as const; export type MatchingStrategies = (typeof MatchingStrategies)[keyof typeof MatchingStrategies]; export type Filter = string | Array<string | string[]>; export type Query = { q?: string | null; }; export type Highlight = { attributesToHighlight?: string[]; highlightPreTag?: string; highlightPostTag?: string; }; export type Crop = { attributesToCrop?: string[]; cropLength?: number; cropMarker?: string; }; // `facetName` becomes mandatory when using `searchForFacetValues` export type SearchForFacetValuesParams = Omit<SearchParams, "facetName"> & { facetName: string; }; export type FacetHit = { value: string; count: number; }; export type SearchForFacetValuesResponse = { facetHits: FacetHit[]; facetQuery: string | null; processingTimeMs: number; }; export type HybridSearch = { embedder: string; semanticRatio?: number; }; // https://www.meilisearch.com/docs/reference/api/settings#localized-attributes export type Locale = string; export type SearchParams = Query & Pagination & Highlight & Crop & { filter?: Filter; sort?: string[]; facets?: string[]; attributesToRetrieve?: string[]; showMatchesPosition?: boolean; matchingStrategy?: MatchingStrategies; hitsPerPage?: number; page?: number; facetName?: string; facetQuery?: string; vector?: number[] | null; showRankingScore?: boolean; showRankingScoreDetails?: boolean; rankingScoreThreshold?: number; attributesToSearchOn?: string[] | null; hybrid?: HybridSearch; distinct?: string; retrieveVectors?: boolean; locales?: Locale[]; }; // Search parameters for searches made with the GET method // Are different than the parameters for the POST method export type SearchRequestGET = Pagination & Query & Omit<Highlight, "attributesToHighlight"> & Omit<Crop, "attributesToCrop"> & { filter?: string; sort?: string; facets?: string; attributesToRetrieve?: string; attributesToHighlight?: string; attributesToCrop?: string; showMatchesPosition?: boolean; vector?: string | null; attributesToSearchOn?: string | null; hybridEmbedder?: string; hybridSemanticRatio?: number; rankingScoreThreshold?: number; distinct?: string; retrieveVectors?: boolean; locales?: Locale[]; }; export type MergeFacets = { maxValuesPerFacet?: number | null; }; export type FederationOptions = { weight: number }; export type MultiSearchFederation = { limit?: number; offset?: number; facetsByIndex?: Record<string, string[]>; mergeFacets?: MergeFacets | null; }; export type MultiSearchQuery = SearchParams & { indexUid: string }; export type MultiSearchQueryWithFederation = MultiSearchQuery & { federationOptions?: FederationOptions; }; export type MultiSearchParams = { queries: MultiSearchQuery[]; }; export type FederatedMultiSearchParams = { federation: MultiSearchFederation; queries: MultiSearchQueryWithFederation[]; }; export type CategoriesDistribution = { [category: string]: number; }; export type Facet = string; export type FacetDistribution = Record<Facet, CategoriesDistribution>; export type MatchesPosition<T> = Partial< Record<keyof T, Array<{ start: number; length: number; indices?: number[] }>> >; export type RankingScoreDetails = { words?: { order: number; matchingWords: number; maxMatchingWords: number; score: number; }; typo?: { order: number; typoCount: number; maxTypoCount: number; score: number; }; proximity?: { order: number; score: number; }; attribute?: { order: number; attributes_ranking_order: number; attributes_query_word_order: number; score: number; }; exactness?: { order: number; matchType: string; score: number; }; [key: string]: Record<string, any> | undefined; }; export type FederationDetails = { indexUid: string; queriesPosition: number; weightedRankingScore: number; }; export type Hit<T = Record<string, any>> = T & { _formatted?: Partial<T>; _matchesPosition?: MatchesPosition<T>; _rankingScore?: number; _rankingScoreDetails?: RankingScoreDetails; _federation?: FederationDetails; }; export type Hits<T = Record<string, any>> = Array<Hit<T>>; export type FacetStat = { min: number; max: number }; export type FacetStats = Record<string, FacetStat>; export type FacetsByIndex = Record< string, { distribution: FacetDistribution; stats: FacetStats; } >; export type SearchResponse< T = Record<string, any>, S extends SearchParams | undefined = undefined, > = { hits: Hits<T>; processingTimeMs: number; query: string; facetDistribution?: FacetDistribution; facetStats?: FacetStats; facetsByIndex?: FacetsByIndex; } & (undefined extends S ? Partial<FinitePagination & InfinitePagination> : true extends IsFinitePagination<NonNullable<S>> ? FinitePagination : InfinitePagination); type FinitePagination = { totalHits: number; hitsPerPage: number; page: number; totalPages: number; }; type InfinitePagination = { offset: number; limit: number; estimatedTotalHits: number; }; type IsFinitePagination<S extends SearchParams> = Or< HasHitsPerPage<S>, HasPage<S> >; type Or<A extends boolean, B extends boolean> = true extends A ? true : true extends B ? true : false; type HasHitsPerPage<S extends SearchParams> = undefined extends S["hitsPerPage"] ? false : true; type HasPage<S extends SearchParams> = undefined extends S["page"] ? false : true; export type MultiSearchResult<T> = SearchResponse<T> & { indexUid: string }; export type MultiSearchResponse<T = Record<string, any>> = { results: Array<MultiSearchResult<T>>; }; export type MultiSearchResponseOrSearchResponse< T1 extends FederatedMultiSearchParams | MultiSearchParams, T2 extends Record<string, unknown> = Record<string, any>, > = T1 extends FederatedMultiSearchParams ? SearchResponse<T2> : MultiSearchResponse<T2>; export type FieldDistribution = { [field: string]: number; }; export type SearchSimilarDocumentsParams = { id: string | number; offset?: number; limit?: number; filter?: Filter; embedder?: string; attributesToRetrieve?: string[]; showRankingScore?: boolean; showRankingScoreDetails?: boolean; rankingScoreThreshold?: number; }; /* ** Documents */ type Fields<T = Record<string, any>> = | Array<Extract<keyof T, string>> | Extract<keyof T, string>; export type DocumentOptions = { primaryKey?: string; }; export const ContentTypeEnum: Readonly<Record<string, ContentType>> = { JSON: "application/json", CSV: "text/csv", NDJSON: "application/x-ndjson", }; export type ContentType = | "text/csv" | "application/x-ndjson" | "application/json"; export type RawDocumentAdditionOptions = DocumentOptions & { csvDelimiter?: string; }; export type DocumentsQuery<T = Record<string, any>> = ResourceQuery & { fields?: Fields<T>; filter?: Filter; limit?: number; offset?: number; retrieveVectors?: boolean; }; export type DocumentQuery<T = Record<string, any>> = { fields?: Fields<T>; }; export type DocumentsDeletionQuery = { filter: Filter; }; export type DocumentsIds = string[] | number[]; export type UpdateDocumentsByFunctionOptions = { function: string; filter?: string | string[]; context?: Record<string, any>; }; /* ** Settings */ export type FilterableAttributes = string[] | null; export type DistinctAttribute = string | null; export type SearchableAttributes = string[] | null; export type SortableAttributes = string[] | null; export type DisplayedAttributes = string[] | null; export type RankingRules = string[] | null; export type StopWords = string[] | null; export type Synonyms = { [field: string]: string[]; } | null; export type TypoTolerance = { enabled?: boolean | null; disableOnAttributes?: string[] | null; disableOnWords?: string[] | null; minWordSizeForTypos?: { oneTypo?: number | null; twoTypos?: number | null; }; } | null; export type SeparatorTokens = string[] | null; export type NonSeparatorTokens = string[] | null; export type Dictionary = string[] | null; export type ProximityPrecision = "byWord" | "byAttribute"; export type Distribution = { mean: number; sigma: number; }; export type OpenAiEmbedder = { source: "openAi"; model?: string; apiKey?: string; documentTemplate?: string; dimensions?: number; distribution?: Distribution; url?: string; documentTemplateMaxBytes?: number; binaryQuantized?: boolean; }; export type HuggingFaceEmbedder = { source: "huggingFace"; model?: string; revision?: string; documentTemplate?: string; distribution?: Distribution; documentTemplateMaxBytes?: number; binaryQuantized?: boolean; }; export type UserProvidedEmbedder = { source: "userProvided"; dimensions: number; distribution?: Distribution; binaryQuantized?: boolean; }; export type RestEmbedder = { source: "rest"; url: string; apiKey?: string; dimensions?: number; documentTemplate?: string; distribution?: Distribution; request: Record<string, any>; response: Record<string, any>; headers?: Record<string, string>; documentTemplateMaxBytes?: number; binaryQuantized?: boolean; }; export type OllamaEmbedder = { source: "ollama"; url?: string; apiKey?: string; model?: string; documentTemplate?: string; distribution?: Distribution; dimensions?: number; documentTemplateMaxBytes?: number; binaryQuantized?: boolean; }; export type Embedder = | OpenAiEmbedder | HuggingFaceEmbedder | UserProvidedEmbedder | RestEmbedder | OllamaEmbedder | null; export type Embedders = Record<string, Embedder> | null; export type FacetOrder = "alpha" | "count"; export type Faceting = { maxValuesPerFacet?: number | null; sortFacetValuesBy?: Record<string, FacetOrder> | null; }; export type PaginationSettings = { maxTotalHits?: number | null; }; export type SearchCutoffMs = number | null; export type LocalizedAttribute = { attributePatterns: string[]; locales: Locale[]; }; export type LocalizedAttributes = LocalizedAttribute[] | null; export type PrefixSearch = "indexingTime" | "disabled"; export type Settings = { filterableAttributes?: FilterableAttributes; distinctAttribute?: DistinctAttribute; sortableAttributes?: SortableAttributes; searchableAttributes?: SearchableAttributes; displayedAttributes?: DisplayedAttributes; rankingRules?: RankingRules; stopWords?: StopWords; synonyms?: Synonyms; typoTolerance?: TypoTolerance; faceting?: Faceting; pagination?: PaginationSettings; separatorTokens?: SeparatorTokens; nonSeparatorTokens?: NonSeparatorTokens; dictionary?: Dictionary; proximityPrecision?: ProximityPrecision; embedders?: Embedders; searchCutoffMs?: SearchCutoffMs; localizedAttributes?: LocalizedAttributes; /** * Enable facet searching on all the filters of an index (requires Meilisearch * 1.12.0 or later) */ facetSearch?: boolean; /** * Enable the ability to search a word by prefix on an index (requires * Meilisearch 1.12.0 or later) */ prefixSearch?: "indexingTime" | "disabled"; }; /* ** TASKS */ export const TaskStatus = { TASK_SUCCEEDED: "succeeded", TASK_PROCESSING: "processing", TASK_FAILED: "failed", TASK_ENQUEUED: "enqueued", TASK_CANCELED: "canceled", } as const; export type TaskStatus = (typeof TaskStatus)[keyof typeof TaskStatus]; export const TaskTypes = { DOCUMENTS_ADDITION_OR_UPDATE: "documentAdditionOrUpdate", DOCUMENT_DELETION: "documentDeletion", DUMP_CREATION: "dumpCreation", INDEX_CREATION: "indexCreation", INDEX_DELETION: "indexDeletion", INDEXES_SWAP: "indexSwap", INDEX_UPDATE: "indexUpdate", SETTINGS_UPDATE: "settingsUpdate", SNAPSHOT_CREATION: "snapshotCreation", TASK_CANCELATION: "taskCancelation", TASK_DELETION: "taskDeletion", } as const; export type TaskTypes = (typeof TaskTypes)[keyof typeof TaskTypes]; export type TasksQuery = { indexUids?: string[]; uids?: number[]; types?: TaskTypes[]; statuses?: TaskStatus[]; canceledBy?: number[]; beforeEnqueuedAt?: Date; afterEnqueuedAt?: Date; beforeStartedAt?: Date; afterStartedAt?: Date; beforeFinishedAt?: Date; afterFinishedAt?: Date; limit?: number; from?: number; /** * If true, the tasks are returned in reverse order (requires Meilisearch * 1.12.0 or later) */ reverse?: boolean; }; export type CancelTasksQuery = Omit<TasksQuery, "limit" | "from"> & {}; export type DeleteTasksQuery = Omit<TasksQuery, "limit" | "from"> & {}; export type EnqueuedTaskObject = { taskUid: number; indexUid?: string; status: TaskStatus; type: TaskTypes; enqueuedAt: string; canceledBy: number; }; export type TaskObject = Omit<EnqueuedTaskObject, "taskUid"> & { uid: number; /** The UID of the batch that the task belongs to (`null` for enqueued tasks) */ batchUid: number | null; details: { // Number of documents sent receivedDocuments?: number; // Number of documents successfully indexed/updated in Meilisearch indexedDocuments?: number; // Number of deleted documents deletedDocuments?: number; // Number of documents found on a batch-delete providedIds?: number; // Primary key on index creation primaryKey?: string; // Ranking rules on settings actions rankingRules?: RankingRules; // Searchable attributes on settings actions searchableAttributes?: SearchableAttributes; // Displayed attributes on settings actions displayedAttributes?: DisplayedAttributes; // Filterable attributes on settings actions filterableAttributes?: FilterableAttributes; // Sortable attributes on settings actions sortableAttributes?: SortableAttributes; // Stop words on settings actions stopWords?: StopWords; // Stop words on settings actions synonyms?: Synonyms; // Distinct attribute on settings actions distinctAttribute?: DistinctAttribute; // Object containing the payload originating the `indexSwap` task creation swaps?: SwapIndexesParams; // Number of tasks that matched the originalQuery filter matchedTasks?: number; // Number of tasks that were canceled canceledTasks?: number; // Number of tasks that were deleted deletedTasks?: number; // Query parameters used to filter the tasks originalFilter?: string; }; error: MeiliSearchErrorResponse | null; duration: string; startedAt: string; finishedAt: string; }; export type SwapIndexesParams = Array<{ indexes: string[]; }>; type CursorResults<T> = { results: T[]; limit: number; from: number; next: number; total: number; }; export type TasksResults = CursorResults<Task>; export type TasksResultsObject = CursorResults<TaskObject>; export type WaitOptions = { timeOutMs?: number; intervalMs?: number; }; /* ** BATCHES */ /** * Represents a batch operation object containing information about tasks * processing */ export type BatchObject = { /** Unique identifier for the batch */ uid: number; /** Details about document processing */ details: { /** Number of documents received in the batch */ receivedDocuments?: number; /** Number of documents successfully indexed */ indexedDocuments?: number; /** Number of documents deleted in the batch */ deletedDocuments?: number; }; /** Progress and indexing step of the batch, null if the batch is finished */ progress: null | { /** An array of all the steps currently being processed */ steps: Array<{ /** * A string representing the name of the current step NOT stable. Only use * for debugging purposes. */ currentStep: string; /** Number of finished tasks */ finished: number; /** Total number of tasks to finish before moving to the next step */ total: number; }>; /** Percentage of progression of all steps currently being processed */ percentage: number; }; /** Statistics about tasks within the batch */ stats: { /** Total number of tasks in the batch */ totalNbTasks: number; /** Count of tasks in each status */ status: { /** Number of successfully completed tasks */ succeeded: number; /** Number of failed tasks */ failed: number; /** Number of canceled tasks */ canceled: number; /** Number of tasks currently processing */ processing: number; /** Number of tasks waiting to be processed */ enqueued: number; }; /** Count of tasks by type */ types: Record<TaskTypes, number>; /** Count of tasks by index UID */ indexUids: Record<string, number>; }; /** Timestamp when the batch started processing (rfc3339 format) */ startedAt: string; /** Timestamp when the batch finished processing (rfc3339 format) */ finishedAt: string; /** Duration of batch processing */ duration: string; }; export type BatchesQuery = { /** The batch should contain the specified task UIDs */ uids?: number[]; batchUids?: number[]; types?: TaskTypes[]; statuses?: TaskStatus[]; indexUids?: string[]; canceledBy?: number[]; beforeEnqueuedAt?: Date; afterEnqueuedAt?: Date; beforeStartedAt?: Date; afterStartedAt?: Date; beforeFinishedAt?: Date; afterFinishedAt?: Date; limit?: number; from?: number; }; export type BatchesResults = CursorResults<Batch>; export type BatchesResultsObject = CursorResults<BatchObject>; /* *** HEALTH */ export type Health = { status: "available"; }; /* *** STATS */ export type IndexStats = { numberOfDocuments: number; isIndexing: boolean; fieldDistribution: FieldDistribution; }; export type Stats = { databaseSize: number; lastUpdate: string; indexes: { [index: string]: IndexStats; }; }; /* ** Keys */ export type Key = { uid: string; description: string; name: string | null; key: string; actions: string[]; indexes: string[]; expiresAt: Date; createdAt: Date; updatedAt: Date; }; export type KeyCreation = { uid?: string; name?: string; description?: string; actions: string[]; indexes: string[]; expiresAt: Date | null; }; export type KeyUpdate = { name?: string; description?: string; }; export type KeysQuery = ResourceQuery & {}; export type KeysResults = ResourceResults<Key[]> & {}; /* ** version */ export type Version = { commitSha: string; commitDate: string; pkgVersion: string; }; /* ** ERROR HANDLER */ export interface FetchError extends Error { type: string; errno: string; code: string; } export type MeiliSearchErrorResponse = { message: string; // https://www.meilisearch.com/docs/reference/errors/error_codes code: string; // https://www.meilisearch.com/docs/reference/errors/overview#errors type: string; link: string; }; // @TODO: This doesn't seem to be up to date, and its usefullness comes into question. export const ErrorStatusCode = { /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#index_creation_failed */ INDEX_CREATION_FAILED: "index_creation_failed", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_index_uid */ MISSING_INDEX_UID: "missing_index_uid", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#index_already_exists */ INDEX_ALREADY_EXISTS: "index_already_exists", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#index_not_found */ INDEX_NOT_FOUND: "index_not_found", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_index_uid */ INVALID_INDEX_UID: "invalid_index_uid", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#index_not_accessible */ INDEX_NOT_ACCESSIBLE: "index_not_accessible", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_index_offset */ INVALID_INDEX_OFFSET: "invalid_index_offset", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_index_limit */ INVALID_INDEX_LIMIT: "invalid_index_limit", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_state */ INVALID_STATE: "invalid_state", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#primary_key_inference_failed */ PRIMARY_KEY_INFERENCE_FAILED: "primary_key_inference_failed", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#index_primary_key_already_exists */ INDEX_PRIMARY_KEY_ALREADY_EXISTS: "index_primary_key_already_exists", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_index_primary_key */ INVALID_INDEX_PRIMARY_KEY: "invalid_index_primary_key", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#max_fields_limit_exceeded */ DOCUMENTS_FIELDS_LIMIT_REACHED: "document_fields_limit_reached", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_document_id */ MISSING_DOCUMENT_ID: "missing_document_id", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_document_id */ INVALID_DOCUMENT_ID: "invalid_document_id", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_content_type */ INVALID_CONTENT_TYPE: "invalid_content_type", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_content_type */ MISSING_CONTENT_TYPE: "missing_content_type", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_document_fields */ INVALID_DOCUMENT_FIELDS: "invalid_document_fields", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_document_limit */ INVALID_DOCUMENT_LIMIT: "invalid_document_limit", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_document_offset */ INVALID_DOCUMENT_OFFSET: "invalid_document_offset", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_document_filter */ INVALID_DOCUMENT_FILTER: "invalid_document_filter", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_document_filter */ MISSING_DOCUMENT_FILTER: "missing_document_filter", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_document_vectors_field */ INVALID_DOCUMENT_VECTORS_FIELD: "invalid_document_vectors_field", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#payload_too_large */ PAYLOAD_TOO_LARGE: "payload_too_large", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_payload */ MISSING_PAYLOAD: "missing_payload", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#malformed_payload */ MALFORMED_PAYLOAD: "malformed_payload", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#no_space_left_on_device */ NO_SPACE_LEFT_ON_DEVICE: "no_space_left_on_device", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_store_file */ INVALID_STORE_FILE: "invalid_store_file", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_ranking_rules */ INVALID_RANKING_RULES: "missing_document_id", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_request */ INVALID_REQUEST: "invalid_request", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_document_geo_field */ INVALID_DOCUMENT_GEO_FIELD: "invalid_document_geo_field", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_q */ INVALID_SEARCH_Q: "invalid_search_q", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_offset */ INVALID_SEARCH_OFFSET: "invalid_search_offset", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_limit */ INVALID_SEARCH_LIMIT: "invalid_search_limit", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_page */ INVALID_SEARCH_PAGE: "invalid_search_page", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_hits_per_page */ INVALID_SEARCH_HITS_PER_PAGE: "invalid_search_hits_per_page", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_attributes_to_retrieve */ INVALID_SEARCH_ATTRIBUTES_TO_RETRIEVE: "invalid_search_attributes_to_retrieve", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_attributes_to_crop */ INVALID_SEARCH_ATTRIBUTES_TO_CROP: "invalid_search_attributes_to_crop", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_crop_length */ INVALID_SEARCH_CROP_LENGTH: "invalid_search_crop_length", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_attributes_to_highlight */ INVALID_SEARCH_ATTRIBUTES_TO_HIGHLIGHT: "invalid_search_attributes_to_highlight", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_show_matches_position */ INVALID_SEARCH_SHOW_MATCHES_POSITION: "invalid_search_show_matches_position", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_filter */ INVALID_SEARCH_FILTER: "invalid_search_filter", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_sort */ INVALID_SEARCH_SORT: "invalid_search_sort", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_facets */ INVALID_SEARCH_FACETS: "invalid_search_facets", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_highlight_pre_tag */ INVALID_SEARCH_HIGHLIGHT_PRE_TAG: "invalid_search_highlight_pre_tag", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_highlight_post_tag */ INVALID_SEARCH_HIGHLIGHT_POST_TAG: "invalid_search_highlight_post_tag", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_crop_marker */ INVALID_SEARCH_CROP_MARKER: "invalid_search_crop_marker", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_matching_strategy */ INVALID_SEARCH_MATCHING_STRATEGY: "invalid_search_matching_strategy", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_vector */ INVALID_SEARCH_VECTOR: "invalid_search_vector", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_attributes_to_search_on */ INVALID_SEARCH_ATTRIBUTES_TO_SEARCH_ON: "invalid_search_attributes_to_search_on", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#bad_request */ BAD_REQUEST: "bad_request", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#document_not_found */ DOCUMENT_NOT_FOUND: "document_not_found", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#internal */ INTERNAL: "internal", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_api_key */ INVALID_API_KEY: "invalid_api_key", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_api_key_description */ INVALID_API_KEY_DESCRIPTION: "invalid_api_key_description", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_api_key_actions */ INVALID_API_KEY_ACTIONS: "invalid_api_key_actions", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_api_key_indexes */ INVALID_API_KEY_INDEXES: "invalid_api_key_indexes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_api_key_expires_at */ INVALID_API_KEY_EXPIRES_AT: "invalid_api_key_expires_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#api_key_not_found */ API_KEY_NOT_FOUND: "api_key_not_found", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_api_key_uid */ IMMUTABLE_API_KEY_UID: "immutable_api_key_uid", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_api_key_actions */ IMMUTABLE_API_KEY_ACTIONS: "immutable_api_key_actions", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_api_key_indexes */ IMMUTABLE_API_KEY_INDEXES: "immutable_api_key_indexes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_api_key_expires_at */ IMMUTABLE_API_KEY_EXPIRES_AT: "immutable_api_key_expires_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_api_key_created_at */ IMMUTABLE_API_KEY_CREATED_AT: "immutable_api_key_created_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_api_key_updated_at */ IMMUTABLE_API_KEY_UPDATED_AT: "immutable_api_key_updated_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_authorization_header */ MISSING_AUTHORIZATION_HEADER: "missing_authorization_header", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#unretrievable_document */ UNRETRIEVABLE_DOCUMENT: "unretrievable_document", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#database_size_limit_reached */ MAX_DATABASE_SIZE_LIMIT_REACHED: "database_size_limit_reached", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#task_not_found */ TASK_NOT_FOUND: "task_not_found", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#dump_process_failed */ DUMP_PROCESS_FAILED: "dump_process_failed", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#dump_not_found */ DUMP_NOT_FOUND: "dump_not_found", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_swap_duplicate_index_found */ INVALID_SWAP_DUPLICATE_INDEX_FOUND: "invalid_swap_duplicate_index_found", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_swap_indexes */ INVALID_SWAP_INDEXES: "invalid_swap_indexes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_swap_indexes */ MISSING_SWAP_INDEXES: "missing_swap_indexes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_master_key */ MISSING_MASTER_KEY: "missing_master_key", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_types */ INVALID_TASK_TYPES: "invalid_task_types", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_uids */ INVALID_TASK_UIDS: "invalid_task_uids", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_statuses */ INVALID_TASK_STATUSES: "invalid_task_statuses", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_limit */ INVALID_TASK_LIMIT: "invalid_task_limit", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_from */ INVALID_TASK_FROM: "invalid_task_from", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_canceled_by */ INVALID_TASK_CANCELED_BY: "invalid_task_canceled_by", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_task_filters */ MISSING_TASK_FILTERS: "missing_task_filters", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#too_many_open_files */ TOO_MANY_OPEN_FILES: "too_many_open_files", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#io_error */ IO_ERROR: "io_error", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_index_uids */ INVALID_TASK_INDEX_UIDS: "invalid_task_index_uids", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_index_uid */ IMMUTABLE_INDEX_UID: "immutable_index_uid", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_index_created_at */ IMMUTABLE_INDEX_CREATED_AT: "immutable_index_created_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#immutable_index_updated_at */ IMMUTABLE_INDEX_UPDATED_AT: "immutable_index_updated_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_displayed_attributes */ INVALID_SETTINGS_DISPLAYED_ATTRIBUTES: "invalid_settings_displayed_attributes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_searchable_attributes */ INVALID_SETTINGS_SEARCHABLE_ATTRIBUTES: "invalid_settings_searchable_attributes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_filterable_attributes */ INVALID_SETTINGS_FILTERABLE_ATTRIBUTES: "invalid_settings_filterable_attributes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_sortable_attributes */ INVALID_SETTINGS_SORTABLE_ATTRIBUTES: "invalid_settings_sortable_attributes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_ranking_rules */ INVALID_SETTINGS_RANKING_RULES: "invalid_settings_ranking_rules", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_stop_words */ INVALID_SETTINGS_STOP_WORDS: "invalid_settings_stop_words", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_synonyms */ INVALID_SETTINGS_SYNONYMS: "invalid_settings_synonyms", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_distinct_attribute */ INVALID_SETTINGS_DISTINCT_ATTRIBUTE: "invalid_settings_distinct_attribute", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_typo_tolerance */ INVALID_SETTINGS_TYPO_TOLERANCE: "invalid_settings_typo_tolerance", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_faceting */ INVALID_SETTINGS_FACETING: "invalid_settings_faceting", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_pagination */ INVALID_SETTINGS_PAGINATION: "invalid_settings_pagination", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_search_cutoff_ms */ INVALID_SETTINGS_SEARCH_CUTOFF_MS: "invalid_settings_search_cutoff_ms", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_settings_search_cutoff_ms */ INVALID_SETTINGS_LOCALIZED_ATTRIBUTES: "invalid_settings_localized_attributes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_before_enqueued_at */ INVALID_TASK_BEFORE_ENQUEUED_AT: "invalid_task_before_enqueued_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_after_enqueued_at */ INVALID_TASK_AFTER_ENQUEUED_AT: "invalid_task_after_enqueued_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_before_started_at */ INVALID_TASK_BEFORE_STARTED_AT: "invalid_task_before_started_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_after_started_at */ INVALID_TASK_AFTER_STARTED_AT: "invalid_task_after_started_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_before_finished_at */ INVALID_TASK_BEFORE_FINISHED_AT: "invalid_task_before_finished_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_task_after_finished_at */ INVALID_TASK_AFTER_FINISHED_AT: "invalid_task_after_finished_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_api_key_actions */ MISSING_API_KEY_ACTIONS: "missing_api_key_actions", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_api_key_indexes */ MISSING_API_KEY_INDEXES: "missing_api_key_indexes", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_api_key_expires_at */ MISSING_API_KEY_EXPIRES_AT: "missing_api_key_expires_at", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_api_key_limit */ INVALID_API_KEY_LIMIT: "invalid_api_key_limit", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_api_key_offset */ INVALID_API_KEY_OFFSET: "invalid_api_key_offset", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_facet_search_facet_name */ INVALID_FACET_SEARCH_FACET_NAME: "invalid_facet_search_facet_name", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#missing_facet_search_facet_name */ MISSING_FACET_SEARCH_FACET_NAME: "missing_facet_search_facet_name", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_facet_search_facet_query */ INVALID_FACET_SEARCH_FACET_QUERY: "invalid_facet_search_facet_query", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_search_ranking_score_threshold */ INVALID_SEARCH_RANKING_SCORE_THRESHOLD: "invalid_search_ranking_score_threshold", /** @see https://www.meilisearch.com/docs/reference/errors/error_codes#invalid_similar_ranking_score_threshold */ INVALID_SIMILAR_RANKING_SCORE_THRESHOLD: "invalid_similar_ranking_score_threshold", }; export type ErrorStatusCode = (typeof ErrorStatusCode)[keyof typeof ErrorStatusCode]; /** @see {@link TokenSearchRules} */ export type TokenIndexRules = { filter?: Filter }; /** * {@link https://www.meilisearch.com/docs/learn/security/tenant_token_reference#search-rules} * * @remarks * Not well documented. * @see {@link https://github.com/meilisearch/meilisearch/blob/b21d7aedf9096539041362d438e973a18170f3fc/crates/meilisearch-auth/src/lib.rs#L271-L277 | GitHub source code} */ export type TokenSearchRules = | Record<string, TokenIndexRules | null> | string[]; /** Options object for tenant token generation. */ export type TenantTokenGeneratorOptions = { /** API key used to sign the token. */ apiKey: string; /** * The uid of the api key used as issuer of the token. * * @see {@link https://www.meilisearch.com/docs/learn/security/tenant_token_reference#api-key-uid} */ apiKeyUid: string; /** * Search rules that are applied to every search. * * @defaultValue `["*"]` */ searchRules?: TokenSearchRules; /** * {@link https://en.wikipedia.org/wiki/Unix_time | UNIX timestamp} or * {@link Date} object at which the token expires. * * @see {@link https://www.meilisearch.com/docs/learn/security/tenant_token_reference#expiry-date} */ expiresAt?: number | Date; /** * Encryption algorithm used to sign the JWT. Supported values by Meilisearch * are HS256, HS384, HS512. (HS[number] means HMAC using SHA-[number]) * * @defaultValue `"HS256"` * @see {@link https://www.meilisearch.com/docs/learn/security/generate_tenant_token_scratch#prepare-token-header} */ algorithm?: `HS${256 | 384 | 512}`; /** * By default if a non-safe environment is detected, an error is thrown. * Setting this to `true` skips environment detection. This is intended for * server-side environments where detection fails or usage in a browser is * intentional (Use at your own risk). * * @defaultValue `false` */ force?: boolean; };