Showing preview only (6,540K chars total). Download the full file or copy to clipboard to get everything.
Repository: WebDevStudios/wp-search-with-algolia
Branch: main
Commit: fc21bb652574
Files: 1011
Total size: 6.0 MB
Directory structure:
gitextract_z0wy0_zz/
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── LICENSE.md
│ └── MIT-LICENSE.md
├── .gitignore
├── .nvmrc
├── CHANGELOG.md
├── README.txt
├── algolia.php
├── classmap.php
├── composer.json
├── css/
│ ├── algolia-autocomplete.css
│ ├── algolia-instantsearch.css
│ └── index.php
├── includes/
│ ├── admin/
│ │ ├── class-algolia-admin-page-autocomplete.php
│ │ ├── class-algolia-admin-page-native-search.php
│ │ ├── class-algolia-admin-page-premium-support.php
│ │ ├── class-algolia-admin-page-seo.php
│ │ ├── class-algolia-admin-page-settings.php
│ │ ├── class-algolia-admin-page-woocommerce.php
│ │ ├── class-algolia-admin-template-notices.php
│ │ ├── class-algolia-admin.php
│ │ ├── css/
│ │ │ ├── algolia-admin.css
│ │ │ └── index.php
│ │ ├── fonts/
│ │ │ └── index.php
│ │ ├── img/
│ │ │ └── index.php
│ │ ├── index.php
│ │ ├── js/
│ │ │ ├── algolia-admin.js
│ │ │ ├── index.php
│ │ │ ├── push-settings-button.js
│ │ │ └── reindex-button.js
│ │ └── partials/
│ │ ├── form-options-premium-support.php
│ │ ├── form-options-seo.php
│ │ ├── form-options-woocommerce.php
│ │ ├── form-options.php
│ │ ├── form-override-search-option.php
│ │ ├── form-override-search-version-option.php
│ │ ├── index.php
│ │ ├── page-autocomplete-config.php
│ │ ├── page-autocomplete.php
│ │ └── page-search.php
│ ├── class-algolia-api.php
│ ├── class-algolia-autocomplete-config.php
│ ├── class-algolia-cli.php
│ ├── class-algolia-compatibility.php
│ ├── class-algolia-plugin.php
│ ├── class-algolia-scripts.php
│ ├── class-algolia-search.php
│ ├── class-algolia-settings.php
│ ├── class-algolia-styles.php
│ ├── class-algolia-template-loader.php
│ ├── class-algolia-utils.php
│ ├── factories/
│ │ ├── class-algolia-http-client-interface-factory.php
│ │ ├── class-algolia-plugin-factory.php
│ │ └── class-algolia-search-client-factory.php
│ ├── index.php
│ ├── indices/
│ │ ├── class-algolia-index-replica.php
│ │ ├── class-algolia-index.php
│ │ ├── class-algolia-posts-index.php
│ │ ├── class-algolia-searchable-posts-index.php
│ │ ├── class-algolia-terms-index.php
│ │ ├── class-algolia-users-index.php
│ │ └── index.php
│ ├── utilities/
│ │ ├── class-algolia-health-panel.php
│ │ ├── class-algolia-template-utils.php
│ │ ├── class-algolia-update-messages.php
│ │ └── class-algolia-version-utils.php
│ └── watchers/
│ ├── class-algolia-changes-watcher.php
│ ├── class-algolia-post-changes-watcher.php
│ ├── class-algolia-term-changes-watcher.php
│ ├── class-algolia-user-changes-watcher.php
│ └── index.php
├── index.php
├── js/
│ ├── algoliasearch/
│ │ ├── README.md
│ │ ├── dist/
│ │ │ ├── algoliasearch-lite.d.ts
│ │ │ ├── algoliasearch-lite.esm.browser.js
│ │ │ ├── algoliasearch-lite.umd.js
│ │ │ ├── algoliasearch.cjs.js
│ │ │ ├── algoliasearch.d.ts
│ │ │ ├── algoliasearch.esm.browser.js
│ │ │ └── algoliasearch.umd.js
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── lite.d.ts
│ │ ├── lite.js
│ │ └── package.json
│ ├── autocomplete-noconflict.js
│ ├── autocomplete.js/
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── Gruntfile.js
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── bower.json
│ │ ├── dist/
│ │ │ ├── autocomplete.angular.js
│ │ │ ├── autocomplete.jquery.js
│ │ │ └── autocomplete.js
│ │ ├── examples/
│ │ │ ├── basic.html
│ │ │ ├── basic_angular.html
│ │ │ ├── basic_jquery.html
│ │ │ └── index.html
│ │ ├── index.js
│ │ ├── index_angular.js
│ │ ├── index_jquery.js
│ │ ├── karma.conf.js
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── netlify-deploy.js
│ │ │ └── release.sh
│ │ ├── src/
│ │ │ ├── angular/
│ │ │ │ └── directive.js
│ │ │ ├── autocomplete/
│ │ │ │ ├── css.js
│ │ │ │ ├── dataset.js
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── event_bus.js
│ │ │ │ ├── event_emitter.js
│ │ │ │ ├── html.js
│ │ │ │ ├── input.js
│ │ │ │ └── typeahead.js
│ │ │ ├── common/
│ │ │ │ ├── dom.js
│ │ │ │ ├── parseAlgoliaClientVersion.js
│ │ │ │ └── utils.js
│ │ │ ├── jquery/
│ │ │ │ └── plugin.js
│ │ │ ├── sources/
│ │ │ │ ├── hits.js
│ │ │ │ ├── index.js
│ │ │ │ └── popularIn.js
│ │ │ └── standalone/
│ │ │ └── index.js
│ │ ├── test/
│ │ │ ├── ci.sh
│ │ │ ├── fixtures.js
│ │ │ ├── helpers/
│ │ │ │ ├── mocks.js
│ │ │ │ └── waits_for.js
│ │ │ ├── integration/
│ │ │ │ ├── test.html
│ │ │ │ └── test.js
│ │ │ ├── playground.css
│ │ │ ├── playground.html
│ │ │ ├── playground_angular.html
│ │ │ ├── playground_jquery.html
│ │ │ ├── test.bundle.js
│ │ │ └── unit/
│ │ │ ├── angular_spec.js
│ │ │ ├── dataset_spec.js
│ │ │ ├── dropdown_spec.js
│ │ │ ├── event_emitter_spec.js
│ │ │ ├── hits_spec.js
│ │ │ ├── input_spec.js
│ │ │ ├── jquery_spec.js
│ │ │ ├── parseAlgoliaClientVersion_spec.js
│ │ │ ├── popularIn_spec.js
│ │ │ ├── standalone_spec.js
│ │ │ ├── typeahead_spec.js
│ │ │ └── utils_spec.js
│ │ ├── version.js
│ │ └── zepto.js
│ └── instantsearch.js/
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── cjs/
│ │ ├── components/
│ │ │ ├── Answers/
│ │ │ │ └── Answers.js
│ │ │ ├── Breadcrumb/
│ │ │ │ └── Breadcrumb.js
│ │ │ ├── ClearRefinements/
│ │ │ │ └── ClearRefinements.js
│ │ │ ├── CurrentRefinements/
│ │ │ │ └── CurrentRefinements.js
│ │ │ ├── GeoSearchControls/
│ │ │ │ ├── GeoSearchButton.js
│ │ │ │ ├── GeoSearchControls.js
│ │ │ │ └── GeoSearchToggle.js
│ │ │ ├── Highlight/
│ │ │ │ └── Highlight.js
│ │ │ ├── Hits/
│ │ │ │ └── Hits.js
│ │ │ ├── InfiniteHits/
│ │ │ │ └── InfiniteHits.js
│ │ │ ├── InternalHighlight/
│ │ │ │ └── InternalHighlight.js
│ │ │ ├── MenuSelect/
│ │ │ │ └── MenuSelect.js
│ │ │ ├── Pagination/
│ │ │ │ ├── Pagination.js
│ │ │ │ └── PaginationLink.js
│ │ │ ├── Panel/
│ │ │ │ └── Panel.js
│ │ │ ├── PoweredBy/
│ │ │ │ └── PoweredBy.js
│ │ │ ├── QueryRuleCustomData/
│ │ │ │ └── QueryRuleCustomData.js
│ │ │ ├── RangeInput/
│ │ │ │ └── RangeInput.js
│ │ │ ├── RefinementList/
│ │ │ │ ├── RefinementList.js
│ │ │ │ └── RefinementListItem.js
│ │ │ ├── RelevantSort/
│ │ │ │ └── RelevantSort.js
│ │ │ ├── ReverseHighlight/
│ │ │ │ └── ReverseHighlight.js
│ │ │ ├── ReverseSnippet/
│ │ │ │ └── ReverseSnippet.js
│ │ │ ├── SearchBox/
│ │ │ │ └── SearchBox.js
│ │ │ ├── Selector/
│ │ │ │ └── Selector.js
│ │ │ ├── Slider/
│ │ │ │ ├── Pit.js
│ │ │ │ ├── Rheostat.js
│ │ │ │ └── Slider.js
│ │ │ ├── Snippet/
│ │ │ │ └── Snippet.js
│ │ │ ├── Stats/
│ │ │ │ └── Stats.js
│ │ │ ├── Template/
│ │ │ │ └── Template.js
│ │ │ ├── ToggleRefinement/
│ │ │ │ └── ToggleRefinement.js
│ │ │ └── VoiceSearch/
│ │ │ └── VoiceSearch.js
│ │ ├── connectors/
│ │ │ ├── answers/
│ │ │ │ └── connectAnswers.js
│ │ │ ├── autocomplete/
│ │ │ │ └── connectAutocomplete.js
│ │ │ ├── breadcrumb/
│ │ │ │ └── connectBreadcrumb.js
│ │ │ ├── clear-refinements/
│ │ │ │ └── connectClearRefinements.js
│ │ │ ├── configure/
│ │ │ │ └── connectConfigure.js
│ │ │ ├── configure-related-items/
│ │ │ │ └── connectConfigureRelatedItems.js
│ │ │ ├── current-refinements/
│ │ │ │ └── connectCurrentRefinements.js
│ │ │ ├── dynamic-widgets/
│ │ │ │ └── connectDynamicWidgets.js
│ │ │ ├── frequently-bought-together/
│ │ │ │ └── connectFrequentlyBoughtTogether.js
│ │ │ ├── geo-search/
│ │ │ │ └── connectGeoSearch.js
│ │ │ ├── hierarchical-menu/
│ │ │ │ └── connectHierarchicalMenu.js
│ │ │ ├── hits/
│ │ │ │ ├── connectHits.js
│ │ │ │ └── connectHitsWithInsights.js
│ │ │ ├── hits-per-page/
│ │ │ │ └── connectHitsPerPage.js
│ │ │ ├── index.js
│ │ │ ├── infinite-hits/
│ │ │ │ ├── connectInfiniteHits.js
│ │ │ │ └── connectInfiniteHitsWithInsights.js
│ │ │ ├── looking-similar/
│ │ │ │ └── connectLookingSimilar.js
│ │ │ ├── menu/
│ │ │ │ └── connectMenu.js
│ │ │ ├── numeric-menu/
│ │ │ │ └── connectNumericMenu.js
│ │ │ ├── pagination/
│ │ │ │ ├── Paginator.js
│ │ │ │ └── connectPagination.js
│ │ │ ├── powered-by/
│ │ │ │ └── connectPoweredBy.js
│ │ │ ├── query-rules/
│ │ │ │ └── connectQueryRules.js
│ │ │ ├── range/
│ │ │ │ └── connectRange.js
│ │ │ ├── rating-menu/
│ │ │ │ └── connectRatingMenu.js
│ │ │ ├── refinement-list/
│ │ │ │ └── connectRefinementList.js
│ │ │ ├── related-products/
│ │ │ │ └── connectRelatedProducts.js
│ │ │ ├── relevant-sort/
│ │ │ │ └── connectRelevantSort.js
│ │ │ ├── search-box/
│ │ │ │ └── connectSearchBox.js
│ │ │ ├── sort-by/
│ │ │ │ └── connectSortBy.js
│ │ │ ├── stats/
│ │ │ │ └── connectStats.js
│ │ │ ├── toggle-refinement/
│ │ │ │ ├── connectToggleRefinement.js
│ │ │ │ └── types.js
│ │ │ ├── trending-items/
│ │ │ │ └── connectTrendingItems.js
│ │ │ └── voice-search/
│ │ │ └── connectVoiceSearch.js
│ │ ├── helpers/
│ │ │ ├── components/
│ │ │ │ ├── Highlight.js
│ │ │ │ ├── ReverseHighlight.js
│ │ │ │ ├── ReverseSnippet.js
│ │ │ │ ├── Snippet.js
│ │ │ │ └── index.js
│ │ │ ├── get-insights-anonymous-user-token.js
│ │ │ ├── highlight.js
│ │ │ ├── index.js
│ │ │ ├── insights.js
│ │ │ ├── reverseHighlight.js
│ │ │ ├── reverseSnippet.js
│ │ │ └── snippet.js
│ │ ├── index.js
│ │ ├── lib/
│ │ │ ├── InstantSearch.js
│ │ │ ├── createHelpers.js
│ │ │ ├── formatNumber.js
│ │ │ ├── infiniteHitsCache/
│ │ │ │ ├── index.js
│ │ │ │ └── sessionStorage.js
│ │ │ ├── insights/
│ │ │ │ ├── client.js
│ │ │ │ ├── index.js
│ │ │ │ └── listener.js
│ │ │ ├── main.js
│ │ │ ├── routers/
│ │ │ │ ├── history.js
│ │ │ │ └── index.js
│ │ │ ├── server.js
│ │ │ ├── stateMappings/
│ │ │ │ ├── index.js
│ │ │ │ ├── simple.js
│ │ │ │ └── singleIndex.js
│ │ │ ├── suit.js
│ │ │ ├── templating/
│ │ │ │ ├── index.js
│ │ │ │ ├── prepareTemplateProps.js
│ │ │ │ └── renderTemplate.js
│ │ │ ├── utils/
│ │ │ │ ├── addWidgetId.js
│ │ │ │ ├── capitalize.js
│ │ │ │ ├── checkIndexUiState.js
│ │ │ │ ├── checkRendering.js
│ │ │ │ ├── clearRefinements.js
│ │ │ │ ├── concatHighlightedParts.js
│ │ │ │ ├── convertNumericRefinementsToFilters.js
│ │ │ │ ├── createConcurrentSafePromise.js
│ │ │ │ ├── createSendEventForFacet.js
│ │ │ │ ├── createSendEventForHits.js
│ │ │ │ ├── cx.js
│ │ │ │ ├── debounce.js
│ │ │ │ ├── defer.js
│ │ │ │ ├── detect-insights-client.js
│ │ │ │ ├── documentation.js
│ │ │ │ ├── escape-highlight.js
│ │ │ │ ├── escape-html.js
│ │ │ │ ├── escape.js
│ │ │ │ ├── escapeFacetValue.js
│ │ │ │ ├── escapeRefinement.js
│ │ │ │ ├── find.js
│ │ │ │ ├── findIndex.js
│ │ │ │ ├── geo-search.js
│ │ │ │ ├── getAppIdAndApiKey.js
│ │ │ │ ├── getContainerNode.js
│ │ │ │ ├── getHighlightFromSiblings.js
│ │ │ │ ├── getHighlightedParts.js
│ │ │ │ ├── getObjectType.js
│ │ │ │ ├── getPropertyByPath.js
│ │ │ │ ├── getRefinements.js
│ │ │ │ ├── getWidgetAttribute.js
│ │ │ │ ├── hits-absolute-position.js
│ │ │ │ ├── hits-query-id.js
│ │ │ │ ├── hydrateRecommendCache.js
│ │ │ │ ├── hydrateSearchClient.js
│ │ │ │ ├── index.js
│ │ │ │ ├── isDomElement.js
│ │ │ │ ├── isEqual.js
│ │ │ │ ├── isFacetRefined.js
│ │ │ │ ├── isFiniteNumber.js
│ │ │ │ ├── isIndexWidget.js
│ │ │ │ ├── isPlainObject.js
│ │ │ │ ├── isSpecialClick.js
│ │ │ │ ├── logger.js
│ │ │ │ ├── mergeSearchParameters.js
│ │ │ │ ├── noop.js
│ │ │ │ ├── omit.js
│ │ │ │ ├── prepareTemplateProps.js
│ │ │ │ ├── range.js
│ │ │ │ ├── render-args.js
│ │ │ │ ├── renderTemplate.js
│ │ │ │ ├── resolveSearchParameters.js
│ │ │ │ ├── reverseHighlightedParts.js
│ │ │ │ ├── safelyRunOnBrowser.js
│ │ │ │ ├── serializer.js
│ │ │ │ ├── setIndexHelperState.js
│ │ │ │ ├── toArray.js
│ │ │ │ ├── typedObject.js
│ │ │ │ ├── unescape.js
│ │ │ │ ├── unescapeRefinement.js
│ │ │ │ ├── uniq.js
│ │ │ │ ├── uuid.js
│ │ │ │ └── walkIndex.js
│ │ │ ├── version.js
│ │ │ └── voiceSearchHelper/
│ │ │ ├── index.js
│ │ │ └── types.js
│ │ ├── middlewares/
│ │ │ ├── createInsightsMiddleware.js
│ │ │ ├── createMetadataMiddleware.js
│ │ │ ├── createRouterMiddleware.js
│ │ │ └── index.js
│ │ ├── templates/
│ │ │ ├── carousel/
│ │ │ │ └── carousel.js
│ │ │ └── index.js
│ │ ├── types/
│ │ │ ├── algoliasearch.js
│ │ │ ├── component.js
│ │ │ ├── connector.js
│ │ │ ├── index.js
│ │ │ ├── insights.js
│ │ │ ├── instantsearch.js
│ │ │ ├── middleware.js
│ │ │ ├── render-state.js
│ │ │ ├── results.js
│ │ │ ├── router.js
│ │ │ ├── templates.js
│ │ │ ├── ui-state.js
│ │ │ ├── utils.js
│ │ │ ├── widget-factory.js
│ │ │ └── widget.js
│ │ └── widgets/
│ │ ├── analytics/
│ │ │ └── analytics.js
│ │ ├── answers/
│ │ │ ├── answers.js
│ │ │ └── defaultTemplates.js
│ │ ├── breadcrumb/
│ │ │ ├── breadcrumb.js
│ │ │ └── defaultTemplates.js
│ │ ├── clear-refinements/
│ │ │ ├── clear-refinements.js
│ │ │ └── defaultTemplates.js
│ │ ├── configure/
│ │ │ └── configure.js
│ │ ├── configure-related-items/
│ │ │ └── configure-related-items.js
│ │ ├── current-refinements/
│ │ │ └── current-refinements.js
│ │ ├── dynamic-widgets/
│ │ │ └── dynamic-widgets.js
│ │ ├── frequently-bought-together/
│ │ │ └── frequently-bought-together.js
│ │ ├── geo-search/
│ │ │ ├── GeoSearchRenderer.d.js
│ │ │ ├── GeoSearchRenderer.js
│ │ │ ├── createHTMLMarker.js
│ │ │ ├── defaultTemplates.js
│ │ │ └── geo-search.js
│ │ ├── hierarchical-menu/
│ │ │ ├── defaultTemplates.js
│ │ │ └── hierarchical-menu.js
│ │ ├── hits/
│ │ │ ├── defaultTemplates.js
│ │ │ └── hits.js
│ │ ├── hits-per-page/
│ │ │ └── hits-per-page.js
│ │ ├── index/
│ │ │ └── index.js
│ │ ├── index.js
│ │ ├── infinite-hits/
│ │ │ ├── defaultTemplates.js
│ │ │ └── infinite-hits.js
│ │ ├── looking-similar/
│ │ │ └── looking-similar.js
│ │ ├── menu/
│ │ │ ├── defaultTemplates.js
│ │ │ └── menu.js
│ │ ├── menu-select/
│ │ │ ├── defaultTemplates.js
│ │ │ └── menu-select.js
│ │ ├── numeric-menu/
│ │ │ ├── defaultTemplates.js
│ │ │ └── numeric-menu.js
│ │ ├── pagination/
│ │ │ └── pagination.js
│ │ ├── panel/
│ │ │ └── panel.js
│ │ ├── places/
│ │ │ └── places.js
│ │ ├── powered-by/
│ │ │ └── powered-by.js
│ │ ├── query-rule-context/
│ │ │ └── query-rule-context.js
│ │ ├── query-rule-custom-data/
│ │ │ └── query-rule-custom-data.js
│ │ ├── range-input/
│ │ │ └── range-input.js
│ │ ├── range-slider/
│ │ │ └── range-slider.js
│ │ ├── rating-menu/
│ │ │ ├── defaultTemplates.js
│ │ │ └── rating-menu.js
│ │ ├── refinement-list/
│ │ │ ├── defaultTemplates.js
│ │ │ └── refinement-list.js
│ │ ├── related-products/
│ │ │ └── related-products.js
│ │ ├── relevant-sort/
│ │ │ ├── defaultTemplates.js
│ │ │ └── relevant-sort.js
│ │ ├── search-box/
│ │ │ ├── defaultTemplates.js
│ │ │ └── search-box.js
│ │ ├── sort-by/
│ │ │ └── sort-by.js
│ │ ├── stats/
│ │ │ ├── defaultTemplates.js
│ │ │ └── stats.js
│ │ ├── toggle-refinement/
│ │ │ ├── defaultTemplates.js
│ │ │ └── toggle-refinement.js
│ │ ├── trending-items/
│ │ │ └── trending-items.js
│ │ └── voice-search/
│ │ ├── defaultTemplates.js
│ │ └── voice-search.js
│ ├── dist/
│ │ ├── instantsearch.development.d.ts
│ │ ├── instantsearch.development.js
│ │ ├── instantsearch.production.d.ts
│ │ └── instantsearch.production.min.d.ts
│ ├── es/
│ │ ├── components/
│ │ │ ├── Answers/
│ │ │ │ ├── Answers.d.ts
│ │ │ │ └── Answers.js
│ │ │ ├── Breadcrumb/
│ │ │ │ ├── Breadcrumb.d.ts
│ │ │ │ └── Breadcrumb.js
│ │ │ ├── ClearRefinements/
│ │ │ │ ├── ClearRefinements.d.ts
│ │ │ │ └── ClearRefinements.js
│ │ │ ├── CurrentRefinements/
│ │ │ │ ├── CurrentRefinements.d.ts
│ │ │ │ └── CurrentRefinements.js
│ │ │ ├── GeoSearchControls/
│ │ │ │ ├── GeoSearchButton.d.ts
│ │ │ │ ├── GeoSearchButton.js
│ │ │ │ ├── GeoSearchControls.d.ts
│ │ │ │ ├── GeoSearchControls.js
│ │ │ │ ├── GeoSearchToggle.d.ts
│ │ │ │ └── GeoSearchToggle.js
│ │ │ ├── Highlight/
│ │ │ │ ├── Highlight.d.ts
│ │ │ │ └── Highlight.js
│ │ │ ├── Hits/
│ │ │ │ ├── Hits.d.ts
│ │ │ │ └── Hits.js
│ │ │ ├── InfiniteHits/
│ │ │ │ ├── InfiniteHits.d.ts
│ │ │ │ └── InfiniteHits.js
│ │ │ ├── InternalHighlight/
│ │ │ │ ├── InternalHighlight.d.ts
│ │ │ │ └── InternalHighlight.js
│ │ │ ├── MenuSelect/
│ │ │ │ ├── MenuSelect.d.ts
│ │ │ │ └── MenuSelect.js
│ │ │ ├── Pagination/
│ │ │ │ ├── Pagination.d.ts
│ │ │ │ ├── Pagination.js
│ │ │ │ └── PaginationLink.js
│ │ │ ├── Panel/
│ │ │ │ ├── Panel.d.ts
│ │ │ │ └── Panel.js
│ │ │ ├── PoweredBy/
│ │ │ │ ├── PoweredBy.d.ts
│ │ │ │ └── PoweredBy.js
│ │ │ ├── QueryRuleCustomData/
│ │ │ │ ├── QueryRuleCustomData.d.ts
│ │ │ │ └── QueryRuleCustomData.js
│ │ │ ├── RangeInput/
│ │ │ │ ├── RangeInput.d.ts
│ │ │ │ └── RangeInput.js
│ │ │ ├── RefinementList/
│ │ │ │ ├── RefinementList.d.ts
│ │ │ │ ├── RefinementList.js
│ │ │ │ ├── RefinementListItem.d.ts
│ │ │ │ └── RefinementListItem.js
│ │ │ ├── RelevantSort/
│ │ │ │ ├── RelevantSort.d.ts
│ │ │ │ └── RelevantSort.js
│ │ │ ├── ReverseHighlight/
│ │ │ │ ├── ReverseHighlight.d.ts
│ │ │ │ └── ReverseHighlight.js
│ │ │ ├── ReverseSnippet/
│ │ │ │ ├── ReverseSnippet.d.ts
│ │ │ │ └── ReverseSnippet.js
│ │ │ ├── SearchBox/
│ │ │ │ ├── SearchBox.d.ts
│ │ │ │ └── SearchBox.js
│ │ │ ├── Selector/
│ │ │ │ ├── Selector.d.ts
│ │ │ │ └── Selector.js
│ │ │ ├── Slider/
│ │ │ │ ├── Pit.d.ts
│ │ │ │ ├── Pit.js
│ │ │ │ ├── Rheostat.d.ts
│ │ │ │ ├── Rheostat.js
│ │ │ │ ├── Slider.d.ts
│ │ │ │ └── Slider.js
│ │ │ ├── Snippet/
│ │ │ │ ├── Snippet.d.ts
│ │ │ │ └── Snippet.js
│ │ │ ├── Stats/
│ │ │ │ ├── Stats.d.ts
│ │ │ │ └── Stats.js
│ │ │ ├── Template/
│ │ │ │ ├── Template.d.ts
│ │ │ │ └── Template.js
│ │ │ ├── ToggleRefinement/
│ │ │ │ ├── ToggleRefinement.d.ts
│ │ │ │ └── ToggleRefinement.js
│ │ │ └── VoiceSearch/
│ │ │ ├── VoiceSearch.d.ts
│ │ │ └── VoiceSearch.js
│ │ ├── connectors/
│ │ │ ├── answers/
│ │ │ │ ├── connectAnswers.d.ts
│ │ │ │ └── connectAnswers.js
│ │ │ ├── autocomplete/
│ │ │ │ ├── connectAutocomplete.d.ts
│ │ │ │ └── connectAutocomplete.js
│ │ │ ├── breadcrumb/
│ │ │ │ ├── connectBreadcrumb.d.ts
│ │ │ │ └── connectBreadcrumb.js
│ │ │ ├── clear-refinements/
│ │ │ │ ├── connectClearRefinements.d.ts
│ │ │ │ └── connectClearRefinements.js
│ │ │ ├── configure/
│ │ │ │ ├── connectConfigure.d.ts
│ │ │ │ └── connectConfigure.js
│ │ │ ├── configure-related-items/
│ │ │ │ ├── connectConfigureRelatedItems.d.ts
│ │ │ │ └── connectConfigureRelatedItems.js
│ │ │ ├── current-refinements/
│ │ │ │ ├── connectCurrentRefinements.d.ts
│ │ │ │ └── connectCurrentRefinements.js
│ │ │ ├── dynamic-widgets/
│ │ │ │ ├── connectDynamicWidgets.d.ts
│ │ │ │ └── connectDynamicWidgets.js
│ │ │ ├── frequently-bought-together/
│ │ │ │ ├── connectFrequentlyBoughtTogether.d.ts
│ │ │ │ └── connectFrequentlyBoughtTogether.js
│ │ │ ├── geo-search/
│ │ │ │ ├── connectGeoSearch.d.ts
│ │ │ │ └── connectGeoSearch.js
│ │ │ ├── hierarchical-menu/
│ │ │ │ ├── connectHierarchicalMenu.d.ts
│ │ │ │ └── connectHierarchicalMenu.js
│ │ │ ├── hits/
│ │ │ │ ├── connectHits.d.ts
│ │ │ │ ├── connectHits.js
│ │ │ │ ├── connectHitsWithInsights.d.ts
│ │ │ │ └── connectHitsWithInsights.js
│ │ │ ├── hits-per-page/
│ │ │ │ ├── connectHitsPerPage.d.ts
│ │ │ │ └── connectHitsPerPage.js
│ │ │ ├── index.d.ts
│ │ │ ├── index.js
│ │ │ ├── infinite-hits/
│ │ │ │ ├── connectInfiniteHits.d.ts
│ │ │ │ ├── connectInfiniteHits.js
│ │ │ │ ├── connectInfiniteHitsWithInsights.d.ts
│ │ │ │ └── connectInfiniteHitsWithInsights.js
│ │ │ ├── looking-similar/
│ │ │ │ ├── connectLookingSimilar.d.ts
│ │ │ │ └── connectLookingSimilar.js
│ │ │ ├── menu/
│ │ │ │ ├── connectMenu.d.ts
│ │ │ │ └── connectMenu.js
│ │ │ ├── numeric-menu/
│ │ │ │ ├── connectNumericMenu.d.ts
│ │ │ │ └── connectNumericMenu.js
│ │ │ ├── pagination/
│ │ │ │ ├── Paginator.d.ts
│ │ │ │ ├── Paginator.js
│ │ │ │ ├── connectPagination.d.ts
│ │ │ │ └── connectPagination.js
│ │ │ ├── powered-by/
│ │ │ │ ├── connectPoweredBy.d.ts
│ │ │ │ └── connectPoweredBy.js
│ │ │ ├── query-rules/
│ │ │ │ ├── connectQueryRules.d.ts
│ │ │ │ └── connectQueryRules.js
│ │ │ ├── range/
│ │ │ │ ├── connectRange.d.ts
│ │ │ │ └── connectRange.js
│ │ │ ├── rating-menu/
│ │ │ │ ├── connectRatingMenu.d.ts
│ │ │ │ └── connectRatingMenu.js
│ │ │ ├── refinement-list/
│ │ │ │ ├── connectRefinementList.d.ts
│ │ │ │ └── connectRefinementList.js
│ │ │ ├── related-products/
│ │ │ │ ├── connectRelatedProducts.d.ts
│ │ │ │ └── connectRelatedProducts.js
│ │ │ ├── relevant-sort/
│ │ │ │ ├── connectRelevantSort.d.ts
│ │ │ │ └── connectRelevantSort.js
│ │ │ ├── search-box/
│ │ │ │ ├── connectSearchBox.d.ts
│ │ │ │ └── connectSearchBox.js
│ │ │ ├── sort-by/
│ │ │ │ ├── connectSortBy.d.ts
│ │ │ │ └── connectSortBy.js
│ │ │ ├── stats/
│ │ │ │ ├── connectStats.d.ts
│ │ │ │ └── connectStats.js
│ │ │ ├── toggle-refinement/
│ │ │ │ ├── connectToggleRefinement.d.ts
│ │ │ │ ├── connectToggleRefinement.js
│ │ │ │ ├── types.d.ts
│ │ │ │ └── types.js
│ │ │ ├── trending-items/
│ │ │ │ ├── connectTrendingItems.d.ts
│ │ │ │ └── connectTrendingItems.js
│ │ │ └── voice-search/
│ │ │ ├── connectVoiceSearch.d.ts
│ │ │ └── connectVoiceSearch.js
│ │ ├── helpers/
│ │ │ ├── components/
│ │ │ │ ├── Highlight.d.ts
│ │ │ │ ├── Highlight.js
│ │ │ │ ├── ReverseHighlight.d.ts
│ │ │ │ ├── ReverseHighlight.js
│ │ │ │ ├── ReverseSnippet.d.ts
│ │ │ │ ├── ReverseSnippet.js
│ │ │ │ ├── Snippet.d.ts
│ │ │ │ ├── Snippet.js
│ │ │ │ ├── index.d.ts
│ │ │ │ └── index.js
│ │ │ ├── get-insights-anonymous-user-token.d.ts
│ │ │ ├── get-insights-anonymous-user-token.js
│ │ │ ├── highlight.d.ts
│ │ │ ├── highlight.js
│ │ │ ├── index.d.ts
│ │ │ ├── index.js
│ │ │ ├── insights.d.ts
│ │ │ ├── insights.js
│ │ │ ├── reverseHighlight.d.ts
│ │ │ ├── reverseHighlight.js
│ │ │ ├── reverseSnippet.d.ts
│ │ │ ├── reverseSnippet.js
│ │ │ ├── snippet.d.ts
│ │ │ └── snippet.js
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── lib/
│ │ │ ├── InstantSearch.d.ts
│ │ │ ├── InstantSearch.js
│ │ │ ├── createHelpers.d.ts
│ │ │ ├── createHelpers.js
│ │ │ ├── formatNumber.d.ts
│ │ │ ├── formatNumber.js
│ │ │ ├── infiniteHitsCache/
│ │ │ │ ├── index.d.ts
│ │ │ │ ├── index.js
│ │ │ │ ├── sessionStorage.d.ts
│ │ │ │ └── sessionStorage.js
│ │ │ ├── insights/
│ │ │ │ ├── client.d.ts
│ │ │ │ ├── client.js
│ │ │ │ ├── index.d.ts
│ │ │ │ ├── index.js
│ │ │ │ ├── listener.d.ts
│ │ │ │ └── listener.js
│ │ │ ├── main.js
│ │ │ ├── routers/
│ │ │ │ ├── history.d.ts
│ │ │ │ ├── history.js
│ │ │ │ ├── index.d.ts
│ │ │ │ └── index.js
│ │ │ ├── server.d.ts
│ │ │ ├── server.js
│ │ │ ├── stateMappings/
│ │ │ │ ├── index.d.ts
│ │ │ │ ├── index.js
│ │ │ │ ├── simple.d.ts
│ │ │ │ ├── simple.js
│ │ │ │ ├── singleIndex.d.ts
│ │ │ │ └── singleIndex.js
│ │ │ ├── suit.d.ts
│ │ │ ├── suit.js
│ │ │ ├── templating/
│ │ │ │ ├── index.d.ts
│ │ │ │ ├── index.js
│ │ │ │ ├── prepareTemplateProps.d.ts
│ │ │ │ ├── prepareTemplateProps.js
│ │ │ │ ├── renderTemplate.d.ts
│ │ │ │ └── renderTemplate.js
│ │ │ ├── utils/
│ │ │ │ ├── addWidgetId.d.ts
│ │ │ │ ├── addWidgetId.js
│ │ │ │ ├── capitalize.d.ts
│ │ │ │ ├── capitalize.js
│ │ │ │ ├── checkIndexUiState.d.ts
│ │ │ │ ├── checkIndexUiState.js
│ │ │ │ ├── checkRendering.d.ts
│ │ │ │ ├── checkRendering.js
│ │ │ │ ├── clearRefinements.d.ts
│ │ │ │ ├── clearRefinements.js
│ │ │ │ ├── concatHighlightedParts.d.ts
│ │ │ │ ├── concatHighlightedParts.js
│ │ │ │ ├── convertNumericRefinementsToFilters.d.ts
│ │ │ │ ├── convertNumericRefinementsToFilters.js
│ │ │ │ ├── createConcurrentSafePromise.d.ts
│ │ │ │ ├── createConcurrentSafePromise.js
│ │ │ │ ├── createSendEventForFacet.d.ts
│ │ │ │ ├── createSendEventForFacet.js
│ │ │ │ ├── createSendEventForHits.d.ts
│ │ │ │ ├── createSendEventForHits.js
│ │ │ │ ├── cx.d.ts
│ │ │ │ ├── cx.js
│ │ │ │ ├── debounce.d.ts
│ │ │ │ ├── debounce.js
│ │ │ │ ├── defer.d.ts
│ │ │ │ ├── defer.js
│ │ │ │ ├── detect-insights-client.d.ts
│ │ │ │ ├── detect-insights-client.js
│ │ │ │ ├── documentation.d.ts
│ │ │ │ ├── documentation.js
│ │ │ │ ├── escape-highlight.d.ts
│ │ │ │ ├── escape-highlight.js
│ │ │ │ ├── escape-html.d.ts
│ │ │ │ ├── escape-html.js
│ │ │ │ ├── escape.d.ts
│ │ │ │ ├── escape.js
│ │ │ │ ├── escapeFacetValue.d.ts
│ │ │ │ ├── escapeFacetValue.js
│ │ │ │ ├── escapeRefinement.js
│ │ │ │ ├── find.d.ts
│ │ │ │ ├── find.js
│ │ │ │ ├── findIndex.d.ts
│ │ │ │ ├── findIndex.js
│ │ │ │ ├── geo-search.d.ts
│ │ │ │ ├── geo-search.js
│ │ │ │ ├── getAppIdAndApiKey.d.ts
│ │ │ │ ├── getAppIdAndApiKey.js
│ │ │ │ ├── getContainerNode.d.ts
│ │ │ │ ├── getContainerNode.js
│ │ │ │ ├── getHighlightFromSiblings.d.ts
│ │ │ │ ├── getHighlightFromSiblings.js
│ │ │ │ ├── getHighlightedParts.d.ts
│ │ │ │ ├── getHighlightedParts.js
│ │ │ │ ├── getObjectType.d.ts
│ │ │ │ ├── getObjectType.js
│ │ │ │ ├── getPropertyByPath.d.ts
│ │ │ │ ├── getPropertyByPath.js
│ │ │ │ ├── getRefinements.d.ts
│ │ │ │ ├── getRefinements.js
│ │ │ │ ├── getWidgetAttribute.d.ts
│ │ │ │ ├── getWidgetAttribute.js
│ │ │ │ ├── hits-absolute-position.d.ts
│ │ │ │ ├── hits-absolute-position.js
│ │ │ │ ├── hits-query-id.d.ts
│ │ │ │ ├── hits-query-id.js
│ │ │ │ ├── hydrateRecommendCache.d.ts
│ │ │ │ ├── hydrateRecommendCache.js
│ │ │ │ ├── hydrateSearchClient.d.ts
│ │ │ │ ├── hydrateSearchClient.js
│ │ │ │ ├── index.d.ts
│ │ │ │ ├── index.js
│ │ │ │ ├── isDomElement.d.ts
│ │ │ │ ├── isDomElement.js
│ │ │ │ ├── isEqual.d.ts
│ │ │ │ ├── isEqual.js
│ │ │ │ ├── isFacetRefined.d.ts
│ │ │ │ ├── isFacetRefined.js
│ │ │ │ ├── isFiniteNumber.d.ts
│ │ │ │ ├── isFiniteNumber.js
│ │ │ │ ├── isIndexWidget.d.ts
│ │ │ │ ├── isIndexWidget.js
│ │ │ │ ├── isPlainObject.d.ts
│ │ │ │ ├── isPlainObject.js
│ │ │ │ ├── isSpecialClick.d.ts
│ │ │ │ ├── isSpecialClick.js
│ │ │ │ ├── logger.d.ts
│ │ │ │ ├── logger.js
│ │ │ │ ├── mergeSearchParameters.d.ts
│ │ │ │ ├── mergeSearchParameters.js
│ │ │ │ ├── noop.d.ts
│ │ │ │ ├── noop.js
│ │ │ │ ├── omit.d.ts
│ │ │ │ ├── omit.js
│ │ │ │ ├── prepareTemplateProps.d.ts
│ │ │ │ ├── prepareTemplateProps.js
│ │ │ │ ├── range.d.ts
│ │ │ │ ├── range.js
│ │ │ │ ├── render-args.d.ts
│ │ │ │ ├── render-args.js
│ │ │ │ ├── renderTemplate.d.ts
│ │ │ │ ├── renderTemplate.js
│ │ │ │ ├── resolveSearchParameters.d.ts
│ │ │ │ ├── resolveSearchParameters.js
│ │ │ │ ├── reverseHighlightedParts.d.ts
│ │ │ │ ├── reverseHighlightedParts.js
│ │ │ │ ├── safelyRunOnBrowser.d.ts
│ │ │ │ ├── safelyRunOnBrowser.js
│ │ │ │ ├── serializer.d.ts
│ │ │ │ ├── serializer.js
│ │ │ │ ├── setIndexHelperState.d.ts
│ │ │ │ ├── setIndexHelperState.js
│ │ │ │ ├── toArray.d.ts
│ │ │ │ ├── toArray.js
│ │ │ │ ├── typedObject.d.ts
│ │ │ │ ├── typedObject.js
│ │ │ │ ├── unescape.d.ts
│ │ │ │ ├── unescape.js
│ │ │ │ ├── unescapeRefinement.js
│ │ │ │ ├── uniq.d.ts
│ │ │ │ ├── uniq.js
│ │ │ │ ├── uuid.d.ts
│ │ │ │ ├── uuid.js
│ │ │ │ ├── walkIndex.d.ts
│ │ │ │ └── walkIndex.js
│ │ │ ├── version.d.ts
│ │ │ ├── version.js
│ │ │ └── voiceSearchHelper/
│ │ │ ├── index.d.ts
│ │ │ ├── index.js
│ │ │ ├── types.d.ts
│ │ │ └── types.js
│ │ ├── middlewares/
│ │ │ ├── createInsightsMiddleware.d.ts
│ │ │ ├── createInsightsMiddleware.js
│ │ │ ├── createMetadataMiddleware.d.ts
│ │ │ ├── createMetadataMiddleware.js
│ │ │ ├── createRouterMiddleware.d.ts
│ │ │ ├── createRouterMiddleware.js
│ │ │ ├── index.d.ts
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── templates/
│ │ │ ├── carousel/
│ │ │ │ ├── carousel.d.ts
│ │ │ │ └── carousel.js
│ │ │ ├── index.d.ts
│ │ │ └── index.js
│ │ ├── types/
│ │ │ ├── algoliasearch.d.ts
│ │ │ ├── algoliasearch.js
│ │ │ ├── component.d.ts
│ │ │ ├── component.js
│ │ │ ├── connector.d.ts
│ │ │ ├── connector.js
│ │ │ ├── index.d.ts
│ │ │ ├── index.js
│ │ │ ├── insights.d.ts
│ │ │ ├── insights.js
│ │ │ ├── instantsearch.d.ts
│ │ │ ├── instantsearch.js
│ │ │ ├── middleware.d.ts
│ │ │ ├── middleware.js
│ │ │ ├── render-state.d.ts
│ │ │ ├── render-state.js
│ │ │ ├── results.d.ts
│ │ │ ├── results.js
│ │ │ ├── router.d.ts
│ │ │ ├── router.js
│ │ │ ├── templates.d.ts
│ │ │ ├── templates.js
│ │ │ ├── ui-state.d.ts
│ │ │ ├── ui-state.js
│ │ │ ├── utils.d.ts
│ │ │ ├── utils.js
│ │ │ ├── widget-factory.d.ts
│ │ │ ├── widget-factory.js
│ │ │ ├── widget.d.ts
│ │ │ └── widget.js
│ │ └── widgets/
│ │ ├── analytics/
│ │ │ ├── analytics.d.ts
│ │ │ └── analytics.js
│ │ ├── answers/
│ │ │ ├── answers.d.ts
│ │ │ ├── answers.js
│ │ │ ├── defaultTemplates.d.ts
│ │ │ └── defaultTemplates.js
│ │ ├── breadcrumb/
│ │ │ ├── breadcrumb.d.ts
│ │ │ ├── breadcrumb.js
│ │ │ ├── defaultTemplates.d.ts
│ │ │ └── defaultTemplates.js
│ │ ├── clear-refinements/
│ │ │ ├── clear-refinements.d.ts
│ │ │ ├── clear-refinements.js
│ │ │ ├── defaultTemplates.d.ts
│ │ │ └── defaultTemplates.js
│ │ ├── configure/
│ │ │ ├── configure.d.ts
│ │ │ └── configure.js
│ │ ├── configure-related-items/
│ │ │ ├── configure-related-items.d.ts
│ │ │ └── configure-related-items.js
│ │ ├── current-refinements/
│ │ │ ├── current-refinements.d.ts
│ │ │ └── current-refinements.js
│ │ ├── dynamic-widgets/
│ │ │ ├── dynamic-widgets.d.ts
│ │ │ └── dynamic-widgets.js
│ │ ├── frequently-bought-together/
│ │ │ ├── frequently-bought-together.d.ts
│ │ │ └── frequently-bought-together.js
│ │ ├── geo-search/
│ │ │ ├── GeoSearchRenderer.d.js
│ │ │ ├── GeoSearchRenderer.d.ts
│ │ │ ├── GeoSearchRenderer.js
│ │ │ ├── createHTMLMarker.d.ts
│ │ │ ├── createHTMLMarker.js
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── geo-search.d.ts
│ │ │ └── geo-search.js
│ │ ├── hierarchical-menu/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── hierarchical-menu.d.ts
│ │ │ └── hierarchical-menu.js
│ │ ├── hits/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── hits.d.ts
│ │ │ └── hits.js
│ │ ├── hits-per-page/
│ │ │ ├── hits-per-page.d.ts
│ │ │ └── hits-per-page.js
│ │ ├── index/
│ │ │ ├── index.d.ts
│ │ │ └── index.js
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── infinite-hits/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── infinite-hits.d.ts
│ │ │ └── infinite-hits.js
│ │ ├── looking-similar/
│ │ │ ├── looking-similar.d.ts
│ │ │ └── looking-similar.js
│ │ ├── menu/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── menu.d.ts
│ │ │ └── menu.js
│ │ ├── menu-select/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── menu-select.d.ts
│ │ │ └── menu-select.js
│ │ ├── numeric-menu/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── numeric-menu.d.ts
│ │ │ └── numeric-menu.js
│ │ ├── pagination/
│ │ │ ├── pagination.d.ts
│ │ │ └── pagination.js
│ │ ├── panel/
│ │ │ ├── panel.d.ts
│ │ │ └── panel.js
│ │ ├── places/
│ │ │ ├── places.d.ts
│ │ │ └── places.js
│ │ ├── powered-by/
│ │ │ ├── powered-by.d.ts
│ │ │ └── powered-by.js
│ │ ├── query-rule-context/
│ │ │ ├── query-rule-context.d.ts
│ │ │ └── query-rule-context.js
│ │ ├── query-rule-custom-data/
│ │ │ ├── query-rule-custom-data.d.ts
│ │ │ └── query-rule-custom-data.js
│ │ ├── range-input/
│ │ │ ├── range-input.d.ts
│ │ │ └── range-input.js
│ │ ├── range-slider/
│ │ │ ├── range-slider.d.ts
│ │ │ └── range-slider.js
│ │ ├── rating-menu/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── rating-menu.d.ts
│ │ │ └── rating-menu.js
│ │ ├── refinement-list/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── refinement-list.d.ts
│ │ │ └── refinement-list.js
│ │ ├── related-products/
│ │ │ ├── related-products.d.ts
│ │ │ └── related-products.js
│ │ ├── relevant-sort/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── relevant-sort.d.ts
│ │ │ └── relevant-sort.js
│ │ ├── search-box/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── search-box.d.ts
│ │ │ └── search-box.js
│ │ ├── sort-by/
│ │ │ ├── sort-by.d.ts
│ │ │ └── sort-by.js
│ │ ├── stats/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── stats.d.ts
│ │ │ └── stats.js
│ │ ├── toggle-refinement/
│ │ │ ├── defaultTemplates.d.ts
│ │ │ ├── defaultTemplates.js
│ │ │ ├── toggle-refinement.d.ts
│ │ │ └── toggle-refinement.js
│ │ ├── trending-items/
│ │ │ ├── trending-items.d.ts
│ │ │ └── trending-items.js
│ │ └── voice-search/
│ │ ├── defaultTemplates.d.ts
│ │ ├── defaultTemplates.js
│ │ ├── voice-search.d.ts
│ │ └── voice-search.js
│ ├── package.json
│ └── scripts/
│ └── transforms/
│ ├── README.md
│ ├── __testfixtures__/
│ │ └── addWidget-to-addWidgets/
│ │ ├── global.input.js
│ │ ├── global.output.js
│ │ ├── imported.input.js
│ │ ├── imported.output.js
│ │ ├── mixed.input.js
│ │ ├── mixed.output.js
│ │ ├── remove.input.js
│ │ └── remove.output.js
│ ├── __tests__/
│ │ └── addWidget-to-addWidgets.test.js
│ └── addWidget-to-addWidgets.js
├── languages/
│ ├── index.php
│ ├── wp-search-with-algolia-it_IT.mo
│ ├── wp-search-with-algolia-it_IT.po
│ └── wp-search-with-algolia.pot
├── package.json
├── phpcs.xml
├── templates/
│ ├── autocomplete.php
│ ├── instantsearch-modern.php
│ └── instantsearch.php
├── uninstall.php
├── vendor_prefixed/
│ ├── .gitignore
│ ├── algolia/
│ │ └── algoliasearch-client-php/
│ │ ├── LICENSE
│ │ └── src/
│ │ ├── AccountClient.php
│ │ ├── Algolia.php
│ │ ├── AnalyticsClient.php
│ │ ├── Cache/
│ │ │ ├── FileCacheDriver.php
│ │ │ └── NullCacheDriver.php
│ │ ├── Config/
│ │ │ ├── AbstractConfig.php
│ │ │ ├── AnalyticsConfig.php
│ │ │ ├── InsightsConfig.php
│ │ │ ├── PersonalizationConfig.php
│ │ │ ├── PlacesConfig.php
│ │ │ ├── RecommendConfig.php
│ │ │ ├── RecommendationConfig.php
│ │ │ └── SearchConfig.php
│ │ ├── Exceptions/
│ │ │ ├── AlgoliaException.php
│ │ │ ├── BadRequestException.php
│ │ │ ├── CannotWaitException.php
│ │ │ ├── MissingObjectId.php
│ │ │ ├── NotFoundException.php
│ │ │ ├── ObjectNotFoundException.php
│ │ │ ├── RequestException.php
│ │ │ ├── RetriableException.php
│ │ │ ├── UnreachableException.php
│ │ │ └── ValidUntilNotFoundException.php
│ │ ├── Http/
│ │ │ ├── CurlHttpClient.php
│ │ │ ├── GuzzleHttpClient.php
│ │ │ ├── HttpClientInterface.php
│ │ │ └── Psr7/
│ │ │ ├── BufferStream.php
│ │ │ ├── PumpStream.php
│ │ │ ├── Request.php
│ │ │ ├── Response.php
│ │ │ ├── Stream.php
│ │ │ ├── Uri.php
│ │ │ ├── UriResolver.php
│ │ │ └── functions.php
│ │ ├── Insights/
│ │ │ └── UserInsightsClient.php
│ │ ├── InsightsClient.php
│ │ ├── Iterators/
│ │ │ ├── AbstractAlgoliaIterator.php
│ │ │ ├── ObjectIterator.php
│ │ │ ├── RuleIterator.php
│ │ │ └── SynonymIterator.php
│ │ ├── Log/
│ │ │ └── DebugLogger.php
│ │ ├── PersonalizationClient.php
│ │ ├── PlacesClient.php
│ │ ├── RecommendClient.php
│ │ ├── RecommendationClient.php
│ │ ├── RequestOptions/
│ │ │ ├── RequestOptions.php
│ │ │ └── RequestOptionsFactory.php
│ │ ├── Response/
│ │ │ ├── AbstractResponse.php
│ │ │ ├── AddApiKeyResponse.php
│ │ │ ├── BatchIndexingResponse.php
│ │ │ ├── DeleteApiKeyResponse.php
│ │ │ ├── DictionaryResponse.php
│ │ │ ├── IndexingResponse.php
│ │ │ ├── MultiResponse.php
│ │ │ ├── MultipleIndexBatchIndexingResponse.php
│ │ │ ├── NullResponse.php
│ │ │ ├── RestoreApiKeyResponse.php
│ │ │ └── UpdateApiKeyResponse.php
│ │ ├── RetryStrategy/
│ │ │ ├── ApiWrapper.php
│ │ │ ├── ApiWrapperInterface.php
│ │ │ ├── ClusterHosts.php
│ │ │ ├── Host.php
│ │ │ └── HostCollection.php
│ │ ├── SearchClient.php
│ │ ├── SearchIndex.php
│ │ ├── Support/
│ │ │ ├── Helpers.php
│ │ │ └── UserAgent.php
│ │ └── functions.php
│ ├── autoload-classmap.php
│ ├── autoload-files.php
│ ├── autoload.php
│ └── psr/
│ ├── http-message/
│ │ ├── LICENSE
│ │ └── src/
│ │ ├── MessageInterface.php
│ │ ├── RequestInterface.php
│ │ ├── ResponseInterface.php
│ │ ├── ServerRequestInterface.php
│ │ ├── StreamInterface.php
│ │ ├── UploadedFileInterface.php
│ │ └── UriInterface.php
│ ├── log/
│ │ ├── LICENSE
│ │ └── Psr/
│ │ └── Log/
│ │ ├── AbstractLogger.php
│ │ ├── InvalidArgumentException.php
│ │ ├── LogLevel.php
│ │ ├── LoggerAwareInterface.php
│ │ ├── LoggerAwareTrait.php
│ │ ├── LoggerInterface.php
│ │ ├── LoggerTrait.php
│ │ ├── NullLogger.php
│ │ └── Test/
│ │ ├── DummyTest.php
│ │ ├── LoggerInterfaceTest.php
│ │ └── TestLogger.php
│ └── simple-cache/
│ ├── LICENSE.md
│ └── src/
│ ├── CacheException.php
│ ├── CacheInterface.php
│ └── InvalidArgumentException.php
└── wordfence-vendor.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# A set of files you probably don't want in your WordPress.org distribution
.babelrc export-ignore
.circleci/config.yml export-ignore
.deployignore export-ignore
.distignore export-ignore
.DS_Store export-ignore
.editorconfig export-ignore
.eslintignore export-ignore
.eslintrc export-ignore
.git export-ignore
.gitattributes export-ignore
.github export-ignore
.gitignore export-ignore
.gitlab-ci.yml export-ignore
.phpcs.xml export-ignore
.phpcs.xml.dist export-ignore
.travis.yml export-ignore
*.sql export-ignore
*.tar.gz export-ignore
*.zip export-ignore
behat.yml export-ignore
bin export-ignore
bitbucket-pipelines.yml export-ignore
composer.json export-ignore
composer.lock export-ignore
dependencies.yml export-ignore
Gruntfile.js export-ignore
multisite.xml export-ignore
multisite.xml.dist export-ignore
node_modules export-ignore
package-lock.json export-ignore
package.json export-ignore
phpcs.xml export-ignore
phpcs.xml.dist export-ignore
phpunit.xml export-ignore
phpunit.xml.dist export-ignore
README.md export-ignore
tests export-ignore
Thumbs.db export-ignore
webpack.config.js export-ignore
wp-cli.local.yml export-ignore
yarn.lock export-ignore
/assets export-ignore
/vendor export-ignore
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/LICENSE.md
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
================================================
FILE: .github/MIT-LICENSE.md
================================================
The MIT License (MIT)
Copyright (c) 2016 Algolia
http://www.algolia.com/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: .gitignore
================================================
*.sql
*.tar.gz
*.zip
.DS_Store
.editorconfig
Thumbs.db
bin
public
node_modules
tests
tmp
/vendor
================================================
FILE: .nvmrc
================================================
lts/erbium
================================================
FILE: CHANGELOG.md
================================================
## 2.11.3
* Fixed: minimum requirement discrepancies in readme and defined constant.
* Updated: cleaned out some unused CSS selectors from really old functionality.
* Updated: make use of `.card` class from WP core for more consistant styling.
* Updated: Admin notice around term updating when term is assigned to many posts.
## 2.11.2
* Fixed: Valid Search key checks for new applications.
## 2.11.1
* Fixed: Fatal error if not able to retreive searchable posts index object.
* Fixed: Fatal error potential for non-set debounce array index.
## 2.11.0
* Updated: Algolia PHP client (addresses PHP 8.4 compatibility notices)
* Updated: UI wording to match Algolia references and Instantsearch notes.
* Fixed: Return JSON error instead of echo exception message and continue to throw exception.
* Added: Inline documentation for various custom filters and actions.
* Added: Output custom debounce values in Autocomplete settings UI.
## 2.10.4
* Fixed: revised asset loading for InstantSearch with Full Site Editing enabled.
* Added: Striping styles for Autocomplete table list.
## 2.10.3
* Added: Filter to still output frontend config data when using Instantsearch and FSE Theme.
* Added: Filtering of new filter to attempt auto-detection of a FSE theme being in use.
## 2.10.2
* Added: Checkbox option to enable insights in Instantsearch templates. Please review changes to those.
## 2.10.1
* Fixed: Issues around admin notifications on the Autocomplete settings page, introduced in 2.10.0
## 2.10.0
* Added an option to set the debounce timeout value which applies to all indexes by default, but can be customized for
each index with a filter:
Dynamic filter name: `algolia_autocomplete_debounce_{$index_name}_{$index_type}`
Where `$index_name` is defined by the Index name prefix set on the WP Search with Algolia settings page and
`$index_type` is the type of index.
Assuming `wp_` is the Index name prefix, the debounce timeout filters would be:
```
algolia_autocomplete_debounce_wp_searchable_posts
algolia_autocomplete_debounce_wp_post
algolia_autocomplete_debounce_wp_page
algolia_autocomplete_debounce_wp_my_custom_post_type
algolia_autocomplete_debounce_wp_users
algolia_autocomplete_debounce_wp_terms_category
algolia_autocomplete_debounce_wp_terms_post_tag
algolia_autocomplete_debounce_wp_terms_my_custom_taxonomy
```
Note that the Algolia Autocomplete settings must be saved after creating one of the above filters.
## 2.9.0
* Added: Instantsearch Template options. Choose between “Legacy” hogan.js/WP Utils templates and “Modern” Javascript string literals. “Modern” is more in line with Algolia Documentation.
* Added: ability to customize default Headers for Algolia Search Client configuration.
* Added: Initial support for programmatic Secured API key creation.
* Updated: Sync’d up get_items() methods to allow for specifying specific IDs for posts, terms, and users.
* Updated: Instantsearch templates use “Posts per page” amount by default, from WordPress Reading settings.
* Updated: Amended Autocomplete settings page to remove more builtin post types that don’t need to be available.
## 2.8.3
* Fixed: "Function _load_textdomain_just_in_time was called incorrectly" notices.
## 2.8.2
* Updated: Wording and UI details around the settings pages for better and more accurate reflection.
* Updated: Confirmed compatibility with WP 6.7.x
* Added: New page regarding Premium support from WebDevStudios. Let's work together.
## 2.8.1
* Updated: WP Search with Algolia Pro features list for version 1.4.0
## 2.8.0
* Added: Filter to customize Algolia SearchClient configuration with connect/read/write timeouts.
* Updated: Prevent table content from being concatenated. Thanks @rodrigo-arias
* Updated: Pass `$post_id` to `algolia_get_post_images` filter.
* Updated: Confirmed compatibility with WP 6.5
## 2.7.1
* Fixed: Instantsearch.php template file. "Powered By Algolia" Instantsearch widget wrapped in a check for if the "Remove powered by" option is checked. This should match already working behavior with Autocomplete dropdown.
## 2.7.0
* Updated: Moved post sync action from `save_post` to `wp_after_insert_post`. This allows for the sync to wait until after post meta and terms have been updated. Removes need to click save twice to sync everything.
* Updated: WP Search with Algolia feature list.
## 2.6.2
* Fixed: More performance updates and resolutions around WP All Import.
## 2.6.1
* Fixed: Performance issues related to delete operations.
* Fixed: Performance issues around WP All Import.
## 2.6.0
* Added: Support for syncing imported items when "fast mode" from WP All Import enabled.
* Added: Support for updating child posts if parent post's slug has been updated.
* Added: Support for updating posts when an associated term has been updatd.
* Added: Wait for delete operations to complete before moving to updates.
* Updated: Algolia Search library to 4.18.x
* Updated: InstantSearch library to 4.56.x
## 2.5.4
* Updated: Ensure reindexing completes when using the from_batch flag with CLI.
* Updated: Assigned Algolia_Admin instance to a property for access elsewhere.
## 2.5.3
* Updated: Autocomplete template file with user link fix when cmd/ctrl clicking.
* Updated: Class method visibility from protected to public.
## 2.5.2
* Updated: Fixed hits per page configuration for instantsearch
* Added: Custom hook for settings page override.
## 2.5.1
* Updated readme.txt with more plugin information.
* Repositioned help info on settings screens.
## 2.5.0
* Introduction of WP Search with Algolia Pro availability.
* Added `algolia_custom_template_location` filter to allow specifying custom template locations besides just your active
theme.
* Templates: added action hooks at the end of Autocomplete and Instantsearch hit template blocks.
* Updated `algolia_changes_watchers` filter to also receive the current indices.
* Added watcher support for term and user meta updates.
* Updated bundled CSS to better match selectors for default used widgets in the templates.
* Clarified some details around Autocomplete settings and what can be done in each setting state.
* Updated admin menu icon to use Algolia logo when no settings configured.
## 2.4.0
* Increase minimum PHP version to PHP 7.4
* Fixed PHP8 compatibility issues
* Prefixed Algolia library to avoid potential conflicts with other code using the same libraries.
* Revised copy and wording around the plugin for better clarity.
* Deprecate the `algolia_should_require_search_client` filter in favor of prefixed Algolia PHP Client namespace
## 2.3.1
* Update autocomplete template to use addEventListener instead of onload function
* Update Algolia InstantSearch.js to 4.49.1
## 2.3.0
* Add algolia_should_override_autocomplete filter to override enable/disable status of Autocomplete
* Add from_batch argument to the re-index WP-CLI command
* Update excluded custom post types and taxonomies to include Core WordPress' internal CPTs and taxonomies
* Update Algolia logos to match the latest version
* Remove jQuery usage and dependency from templates
* Update Algolia JavaScript API Client to 4.14.2
* Update Algolia InstantSearch.js to 4.49.0
* Update Algolia PHP API Client to 3.3.2
## 2.2.0
* Add alert to Push Settings button on the Search Page.
* Replace attributesToIndex index setting with searchableAttributes.
* Replace outdated Instant Search widget class.
* Improve drag and drop column description text on the Autocomplete page.
* Remove inline CSS for Max. Suggestions input.
* Update Algolia JavaScript API Client to 4.13.0
* Update Algolia InstantSearch.js to 4.40.5
* Update Algolia Autocomplete.js to 0.38.1
* Update Algolia PHP API Client to 3.2.0
## 2.1.0
* Add algolia_update_records filter to allow inspection and filtering records during update operation.
* Add algolia_re_index_records filter to allow inspection and filtering records during re-index operation.
* Catch some Aloglia PHP Client exceptions that were previously uncaught during record updating and re-indexing.
* Fix an issue where SearchIndex::saveObjects was called twice during re-index operations.
* Update Algolia PHP API Client to 3.1.0
## 2.0.1
* Fix for users that enable intstantsearch but not autocomplete by adding algoliasearch client as direct dependency of
both
## 2.0.0
* Breaking changes for users with customized autocomplete.php / instantsearch.php template in their theme.
* Update autocomplete.php and instantsearch.php templates for compatibility with new JS libs.
* Update Algolia JavaScript API Client to 4.10.3
* Update Algolia InstantSearch.js to 4.25.2
* Update Algolia Autocomplete.js to 0.38.0
* Update Algolia PHP API Client to 3.0.2
## 1.8.0
* Focus on template versioning and update messaging
* Add Algolia_Template_Utils class
* Deprecate Algolia_Template_Loader::locate_template method
* Deprecate Algolia_Plugin::get_templates_path method
* Deprecate algolia_templates_path filter
* Add Algolia_Update_Messages class
* Add Algolia_Admin_Template_Notices class
* Add Algolia_Version_Utils class
## 1.7.0
* Remove 'screen' media attribute from enqueued CSS
* Update Algolia PHP Search Client to version 2.7.3.
* Add "exclude" methods and filters
* Deprecate "blacklist" methods and filters
* Fix replica RequestOptions error
* Fix PHP 8 usort deprecation warning
* Fix JQMIGRATE event shorthand is deprecated warnings in instantsearch.php and autocomplete.php templates
* Add "@version" to template file headers
## 1.6.0
* Fix deletion of post records created before indexing was enabled
* Update Algolia PHP Search Client to version 2.7.1.
* Add Algolia_Plugin_Factory to create and return a shared Algolia_Plugin instance
* Add Algolia_Search_Client_Factory to return a new Algolia\AlgoliaSearch\SearchClient instance
* Add Algolia_Http_Client_Interface_Factory to create and return a shared Php53HttpClient instance
* Add algolia_php_53_http_client_options filter to supply cURL options to Php53HttpClient instance
* Deprecate Algolia_Plugin:get_instance() which will be removed in an upcoming release
## 1.5.0
* Fix an issue where Pinterest follows a link to the Algolia domain to source text and/or images
* Move Algolia scripts to footer by default
* Changes algolia_load_scripts_in_footer filter default argument to "true"
* Move autocomplete.php template output to footer by default
## 1.4.0
* Update Algolia PHP Search Client version 2.7.0.
* Update Algolia JS libraries to most recent compatible (non-breaking) versions
* Updates autocomplete.js to 0.37.1 (current release as of 2020-01-27)
* Updates algoliasearch to 3.35.1 (last of the 3.x series)
* Updates instantsearch.js to 1.12.1 (last of the 1.x series)
## 1.3.0
* Fix an issue where, under some circumstances, when a post with a featured image was deleted, the post might be
accidentally re-indexed
* Fix bug that prevented reindex display notices
* Add algolia_load_scripts_in_footer filter to allow enqueueing the scripts in the footer instead of in the head
* Add new filters for multisite developers
## 1.2.0
* Use filtered value of 'hitsPerPage' as 'posts_per_page' query param
* Fix broken SVG
* Add highlighting to backend search results - props @philipnewcomer
## 1.1.0
* Minimum PHP version requirement is now PHP 7.2
* Minimum WordPress version requirement is now WP 5.0
* Internationalization/localization improvements, textdomain matches plugin slug
* Addressed a potential WSOD if minimum PHP and WP version requirements were not met
* Tested on WP 5.3
## 1.0.0
* Initial release.
================================================
FILE: README.txt
================================================
=== WP Search with Algolia ===
Contributors: WebDevStudios, williamsba1, tw2113, mrasharirfan, scottbasgaard, gregrickaby, richaber, daveromsey
Tags: algolia, autocomplete, instantsearch, relevance search, ai search
Requires at least: 6.7.2
Tested up to: 6.9
Requires PHP: 7.4
Stable tag: 2.11.3
License: GNU General Public License v2.0, MIT License
Use the power of Algolia AI Search & Discovery to enhance your website's search. Enable AI-powered Autocomplete and InstantSearch for fast, accurate results and relevance.
== Description ==
Easily integrate the powerful search tool Algolia AI Search & Discovery directly into your WordPress website. Quickly index all of your website’s content and provide lightning fast and accurate search results within minutes!
Built and supported by WebDevStudios, the website agency behind Custom Post Type UI, WP Search with Algolia immediately improves search on your website. Your users will be impressed!
Enable Autocomplete and Instantsearch to immediately provide a more robust search experience to your visitors. Plus, you receive full control over the look, feel, and relevance of your users' search experience.
= Features =
* One-click indexing of all content in WordPress
* Relevant, faceted ready search results in milliseconds with native typo-tolerance from Algolia AI Search & Discovery
* Super granular control on search content relevancy and content positioning
* Language-agnostic
* WordPress hooks and filters available for easy customization of indexed content.
This plugin requires API keys from [Algolia](https://www.algolia.com/). API keys are free for small personal projects and non-commercial use. Learn more about [commercial use pricing](https://www.algolia.com/pricing/).
=== WP Search with Algolia Pro ===
Introducing **WP Search with Algolia Pro**, our new premium version of WP Search with Algolia! Pro features include:
* Multisite Network-wide support!
* Create a global search for content across all the sites in your network all in one Algolia index.
* WooCommerce support
* Indexing Product data including SKU, pricing (standard and variable), short descriptions, dimensions, and more.
* Total sales and total ratings indexed for popularity
* Advanced SEO support with Yoast SEO, All in One SEO, Rank Math SEO, SEOPress, and The SEO Framework.
* Content level settings to exclude individual content from the search index
* Set Algolia’s indexing to match with existing search engine “noindex” settings
Are you ready to go Pro? Check out [WP Search with Algolia Pro on Pluginize](https://pluginize.com/plugins/wp-search-with-algolia-pro/)!
= Links =
* [WebDevStudios](https://webdevstudios.com)
* [Algolia](https://algolia.com)
* [Documentation](https://github.com/WebDevStudios/wp-search-with-algolia/wiki)
* [Support](https://wordpress.org/support/plugin/wp-search-with-algolia/)
* [Feature requests and bugs](https://github.com/WebDevStudios/wp-search-with-algolia/issues)
* [WP Search with Algolia Snippet Library](https://github.com/WebDevStudios/algolia-snippet-library)
*This plugin is a derivative work of the code from the [Search by Algolia – Instant & Relevant results](https://wordpress.org/plugins/search-by-algolia-instant-relevant-results/) plugin for WordPress, which is licensed under the GPLv2.*
== Installation ==
From your WordPress dashboard:
1. **Visit** Plugins > Add New
2. **Search** for "WP Search with Algolia"
3. **Activate** WP Search with Algolia from your Plugins page
4. **Click** on the new menu item "Algolia Search" and enter your API keys
5. **Read** the step by step [configuration guide](https://github.com/WebDevStudios/wp-search-with-algolia/wiki/Getting-Started)
== Frequently Asked Questions ==
= I see you now have a Pro addon, what features are available with it? =
When you purchase a copy of [WP Search with Algolia Pro](https://pluginize.com/plugins/wp-search-with-algolia-pro/) you are getting access to the start of WooCommerce integration as well as Search Engine Optimization mirroring.
With WooCommerce, you'll be able to manage settings to start including product information as part of indexed products, including out of box display with both Autocomplete and Instantsearch hit templates. You can also include details like product SKU values, total sales, and ratings to help with index ranking and relevance.
With SEO settings, you can configure your content to manage itself in your Algolia indexes based on your "noindex" settings from your dedicated SEO plugins.
We intend to continue adding and evolving all the extra features in WP Search with Algolia Pro
= Is this plugin a fork? =
Yes. The Algolia Team **[no longer supports their original plugin](https://community.algolia.com/wordpress/)**. The engineering team at WebDevStudios has forked the original plugin, and is now maintaining it.
= Should I switch to this plugin? =
Yes. Because Algolia no longer supports their plugin, you will no longer receive updates. WebDevStudios uses Algolia on many of its projects, and is committed to maintaining this plugin.
= What are the minimum requirements? =
* Requires WordPress 5.3+
* PHP version 7.4 or greater
* MySQL version 5.0 or greater (MySQL 5.6 or greater is recommended)
* cURL PHP extension
* mbstring PHP extension
* OpenSSL greater than 1.0.1
* Some payment gateways require fsockopen support (for IPN access)
Visit the [WP Search with Algolia server requirements documentation](https://github.com/WebDevStudios/wp-search-with-algolia/wiki/WP-Search-with-Algolia-plugin-Installation) for a detailed list of server requirements.
= Where can I find WP Search with Algolia documentation and user guides? =
- For help setting up and configuring WP Search with Algolia please refer to the [user guide](https://github.com/WebDevStudios/wp-search-with-algolia/wiki/WP-Search-with-Algolia-plugin-Installation).
- For extending or theming the Autocomplete dropdown, see the [Autocomplete Customization guide](https://github.com/WebDevStudios/wp-search-with-algolia/wiki/Customize-the-Autocomplete-dropdown).
- For extending or theming the Instant Search results page, see the [Search Page Customization guide](https://github.com/WebDevStudios/wp-search-with-algolia/wiki/Customize-your-search-page).
= Will it work with my theme? =
Yes. This plugin should work with most themes that do not override the default WordPress search behavior. Instant Search results page may require some styling to make it match nicely. See the [Search Page Customization](https://github.com/WebDevStudios/wp-search-with-algolia/wiki/Customize-your-search-page).
= Where can I report bugs, request features, or contribute to the project? =
All development is handled on [GitHub](https://github.com/WebDevStudios/wp-search-with-algolia/issues).
== Screenshots ==
1. Algolia Settings
2. Search Page Settings
3. Autocomplete Settings
4. InstantSearch Dropdown
5. Search Results
== Changelog ==
Follow along with the changelog on [Github](https://github.com/WebDevStudios/wp-search-with-algolia/releases).
= 2.11.3 =
* Fixed: minimum requirement discrepancies in readme and defined constant.
* Updated: cleaned out some unused CSS selectors from really old functionality.
* Updated: make use of `.card` class from WP core for more consistant styling.
* Updated: Admin notice around term updating when term is assigned to many posts.
= 2.11.2 =
* Fixed: Valid Search key checks for new applications.
= 2.11.1 =
* Fixed: Fatal error if not able to retreive searchable posts index object.
* Fixed: Fatal error potential for non-set debounce array index.
= 2.11.0 =
* Updated: Algolia PHP client (addresses PHP 8.4 compatibility notices)
* Updated: UI wording to match Algolia references and Instantsearch notes.
* Fixed: Return JSON error instead of echo exception message and continue to throw exception.
* Added: Inline documentation for various custom filters and actions.
* Added: Output custom debounce values in Autocomplete settings UI.
= 2.10.4 =
* Fixed: revised asset loading for InstantSearch with Full Site Editing enabled.
* Added: Striping styles for Autocomplete table list.
= 2.10.3 =
* Added: Filter to still output frontend config data when using Instantsearch and FSE Theme.
* Added: Filtering of new filter to attempt auto-detection of a FSE theme being in use.
= 2.10.2 =
* Added: Checkbox option to enable insights in Instantsearch templates. Please review changes to those.
= 2.10.1 =
* Fixed: Issues around admin notifications on the Autocomplete settings page, introduced in 2.10.0
= 2.10.0 =
* Added: Debounce option for Autocomplete.
* Added: Initial integration with Health Panel.
* Updated: Instantsearch to version 4.78.3
* Updated: Prevent loading of API credentials on frontend when not using Autocomplete or Instantsearch.
* Updated: Removed WooCommerce internal post types and taxonomies from Autocomplete list.
* Updated: Prevent errors with Yoast SEO function checks.
* Updated: Sync'd up internal code for `get_re_index_items_count()`
= 2.9.0 =
* Added: Instantsearch Template options. Choose between "Legacy" hogan.js/WP Utils templates and "Modern" Javascript string literals. "Modern" is more in line with Algolia Documentation.
* Added: ability to customize default Headers for Algolia Search Client configuration.
* Added: Initial support for programmatic Secured API key creation.
* Updated: Sync'd up `get_items()` methods to allow for specifying specific IDs for posts, terms, and users.
* Updated: Instantsearch templates use "Posts per page" amount by default, from WordPress Reading settings.
* Updated: Amended Autocomplete settings page to remove more builtin post types that don't need to be available.
= 2.8.3 =
* Fixed: "Function _load_textdomain_just_in_time was called incorrectly" notices.
= 2.8.2 =
* Updated: Wording and UI details around the settings pages for better and more accurate reflection.
* Updated: Confirmed compatibility with WP 6.7.x
* Added: New page regarding Premium support from WebDevStudios. Let's work together.
= 2.8.1 =
* Updated: WP Search with Algolia Pro features list for version 1.4.0
= 2.8.0 =
* Added: Filter to customize Algolia SearchClient configuration with connect/read/write timeouts.
* Updated: Prevent table content from being concatenated. Thanks @rodrigo-arias
* Updated: Pass `$post_id` to `algolia_get_post_images` filter.
* Updated: Confirmed compatibility with WP 6.5
= 2.7.1 =
* Fixed: Instantsearch.php template file. "Powered By Algolia" Instantsearch widget wrapped in a check for if the "Remove powered by" option is checked. This should match already working behavior with Autocomplete dropdown.
= 2.7.0 =
* Updated: Moved post sync action from `save_post` to `wp_after_insert_post`. This allows for the sync to wait until after post meta and terms have been updated. Removes need to click save twice to sync everything.
* Updated: WP Search with Algolia feature list.
= 2.6.2 =
* Fixed: More performance updates and resolutions around WP All Import.
= 2.6.1 =
* Fixed: Performance issues related to delete operations.
* Fixed: Performance issues around WP All Import.
= 2.6.0 =
* Added: Support for syncing imported items when "fast mode" from WP All Import enabled.
* Added: Support for updating child posts if parent post's slug has been updated.
* Added: Support for updating posts when an associated term has been updatd.
* Added: Wait for delete operations to complete before moving to updates.
* Updated: Algolia Search library to 4.18.x
* Updated: InstantSearch library to 4.56.x
= 2.5.4 =
* Updated: Ensure reindexing completes when using the from_batch flag with CLI.
* Updated: Assigned Algolia_Admin instance to a property for access elsewhere.
= 2.5.3 =
* Updated: Autocomplete template file with user link fix when cmd/ctrl clicking.
* Updated: Class method visibility from protected to public.
= 2.5.2 =
* Updated: Fixed hits per page configuration for instantsearch
* Added: Custom hook for settings page override.
= 2.5.1 =
* Updated readme.txt with more plugin information.
* Repositioned help info on settings screens.
= 2.5.0 =
* Introduction of WP Search with Algolia Pro availability.
* Added `algolia_custom_template_location` filter to allow specifying custom template locations besides just your active theme.
* Templates: added action hooks at the end of Autocomplete and Instantsearch hit template blocks.
* Updated `algolia_changes_watchers` filter to also receive the current indices.
* Added watcher support for term and user meta updates.
* Updated bundled CSS to better match selectors for default used widgets in the templates.
* Clarified some details around Autocomplete settings and what can be done in each setting state.
* Updated admin menu icon to use Algolia logo when no settings configured.
================================================
FILE: algolia.php
================================================
<?php
/**
* Plugin Name: WP Search with Algolia
* Plugin URI: https://github.com/WebDevStudios/wp-search-with-algolia
* Description: Integrate the powerful Algolia search service with WordPress
* Version: 2.11.3
* Requires at least: 6.7.2
* Requires PHP: 7.4
* Author: WebDevStudios
* Author URI: https://webdevstudios.com
* License: GNU General Public License v2.0 / MIT License
* Text Domain: wp-search-with-algolia
* Domain Path: /languages
*
* @since 1.0.0
* @package WebDevStudios\WPSWA
*/
// The following code is a derivative work of the code from the
// Algolia Search plugin for WordPress, which is licensed GPLv2.
// This code therefore is also licensed under the terms of the GNU Public License v2.0.
// Nothing to see here if not loaded in WP context.
if ( ! defined( 'WPINC' ) ) {
die;
}
// The Algolia Search plugin version.
define( 'ALGOLIA_VERSION', '2.11.3' );
// The minmum required PHP version.
define( 'ALGOLIA_MIN_PHP_VERSION', '7.4' );
// The minimum required WordPress version.
define( 'ALGOLIA_MIN_WP_VERSION', '6.7.2' );
define( 'ALGOLIA_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
define( 'ALGOLIA_PLUGIN_URL', plugins_url( '/', __FILE__ ) );
if ( ! defined( 'ALGOLIA_PATH' ) ) {
define( 'ALGOLIA_PATH', __DIR__ . '/' );
}
/**
* Check for required PHP version.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.1.0
*
* @return bool
*/
function algolia_php_version_check() {
if ( version_compare( PHP_VERSION, ALGOLIA_MIN_PHP_VERSION, '<' ) ) {
return false;
}
return true;
}
/**
* Check for required WordPress version.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.1.0
*
* @return bool
*/
function algolia_wp_version_check() {
if ( version_compare( $GLOBALS['wp_version'], ALGOLIA_MIN_WP_VERSION, '<' ) ) {
return false;
}
return true;
}
/**
* Check if WP Search with Algolia Pro is active.
*
* @author Webdevstudios <contact@webdevstudios.com>
* @since 2.5.0
*
* @return bool
*/
function algolia_is_pro_active() {
if ( ! defined( 'WPSWA_PRO_VERSION' ) ) {
return false;
}
return true;
}
/**
* Admin notices if requirements aren't met.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.1.0
*/
function algolia_requirements_error_notice() {
$notices = [];
if ( ! algolia_php_version_check() ) {
$notices[] = sprintf(
// translators: placeholder 1 is minimum required PHP version, placeholder 2 is installed PHP version.
esc_html__( 'Algolia plugin requires PHP %1$s or higher. You’re still on %2$s.', 'wp-search-with-algolia' ),
esc_html( ALGOLIA_MIN_PHP_VERSION ),
esc_html( PHP_VERSION )
);
}
if ( ! algolia_wp_version_check() ) {
$notices[] = sprintf(
// translators: placeholder 1 is minimum required WordPress version, placeholder 2 is installed WordPress version.
esc_html__( 'Algolia plugin requires at least WordPress in version %1$s, You are on %2$s.', 'wp-search-with-algolia' ),
esc_html( ALGOLIA_MIN_WP_VERSION ),
esc_html( $GLOBALS['wp_version'] )
);
}
foreach ( $notices as $notice ) {
echo '<div class="notice notice-error"><p>' . esc_html( $notice ) . '</p></div>';
}
}
/**
* I18n.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
function algolia_load_textdomain() {
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- This is a legitimate use of a global filter.
$locale = apply_filters( 'plugin_locale', get_locale(), 'wp-search-with-algolia' );
load_textdomain( 'wp-search-with-algolia', WP_LANG_DIR . '/wp-search-with-algolia/wp-search-with-algolia-' . $locale . '.mo' );
load_plugin_textdomain( 'wp-search-with-algolia', false, plugin_basename( dirname( __FILE__ ) ) . '/languages/' );
}
add_action( 'init', 'algolia_load_textdomain' );
if ( algolia_php_version_check() && algolia_wp_version_check() ) {
require_once ALGOLIA_PATH . 'classmap.php';
$algolia = Algolia_Plugin_Factory::create();
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::add_command( 'algolia', new Algolia_CLI() );
}
} else {
add_action( 'admin_notices', 'algolia_requirements_error_notice' );
}
================================================
FILE: classmap.php
================================================
<?php
/**
* WP Search With Algolia "Classmap" file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
if ( ! defined( 'ALGOLIA_PATH' ) ) {
exit();
}
/**
* Filters whether to include the Algolia PHP API Client library.
*
* @since 1.0.0
* @deprecated 2.3.2 No longer necessary as the Algolia PHP API Client library is now prefixed.
*
* @param bool $true Include the Algolia PHP API Client library.
*/
apply_filters_deprecated(
'algolia_should_require_search_client',
[ true ],
'2.3.2',
'',
'The "algolia_should_require_search_client" filter is deprecated and no longer has any effect.',
);
// Autoload vendor dependencies, that have been prefixed to prevent namespace collision.
require_once ALGOLIA_PATH . 'vendor_prefixed/autoload.php';
require_once ALGOLIA_PATH . 'includes/factories/class-algolia-http-client-interface-factory.php';
require_once ALGOLIA_PATH . 'includes/factories/class-algolia-search-client-factory.php';
require_once ALGOLIA_PATH . 'includes/factories/class-algolia-plugin-factory.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-api.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-autocomplete-config.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-cli.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-compatibility.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-plugin.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-search.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-settings.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-template-loader.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-utils.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-styles.php';
require_once ALGOLIA_PATH . 'includes/class-algolia-scripts.php';
require_once ALGOLIA_PATH . 'includes/indices/class-algolia-index.php';
require_once ALGOLIA_PATH . 'includes/indices/class-algolia-index-replica.php';
require_once ALGOLIA_PATH . 'includes/indices/class-algolia-searchable-posts-index.php';
require_once ALGOLIA_PATH . 'includes/indices/class-algolia-posts-index.php';
require_once ALGOLIA_PATH . 'includes/indices/class-algolia-terms-index.php';
require_once ALGOLIA_PATH . 'includes/indices/class-algolia-users-index.php';
require_once ALGOLIA_PATH . 'includes/watchers/class-algolia-changes-watcher.php';
require_once ALGOLIA_PATH . 'includes/watchers/class-algolia-post-changes-watcher.php';
require_once ALGOLIA_PATH . 'includes/watchers/class-algolia-term-changes-watcher.php';
require_once ALGOLIA_PATH . 'includes/watchers/class-algolia-user-changes-watcher.php';
require_once ALGOLIA_PATH . 'includes/utilities/class-algolia-health-panel.php';
require_once ALGOLIA_PATH . 'includes/utilities/class-algolia-template-utils.php';
require_once ALGOLIA_PATH . 'includes/utilities/class-algolia-version-utils.php';
require_once ALGOLIA_PATH . 'includes/utilities/class-algolia-update-messages.php';
if ( is_admin() ) {
require_once ALGOLIA_PATH . 'includes/admin/class-algolia-admin.php';
require_once ALGOLIA_PATH . 'includes/admin/class-algolia-admin-page-settings.php';
require_once ALGOLIA_PATH . 'includes/admin/class-algolia-admin-page-autocomplete.php';
require_once ALGOLIA_PATH . 'includes/admin/class-algolia-admin-page-native-search.php';
require_once ALGOLIA_PATH . 'includes/admin/class-algolia-admin-page-woocommerce.php';
require_once ALGOLIA_PATH . 'includes/admin/class-algolia-admin-page-premium-support.php';
require_once ALGOLIA_PATH . 'includes/admin/class-algolia-admin-page-seo.php';
require_once ALGOLIA_PATH . 'includes/admin/class-algolia-admin-template-notices.php';
}
================================================
FILE: composer.json
================================================
{
"name": "webdevstudios/wp-search-with-algolia",
"version": "2.11.3",
"description": "Integrate the powerful Algolia search service with WordPress.",
"authors": [
{
"name": "WebDevStudios",
"email": "contact@webdevstudios.com"
}
],
"license": "GPL-3.0",
"keywords": [
"algolia"
],
"homepage": "https://github.com/WebDevStudios/wp-search-with-algolia",
"type": "wordpress-plugin",
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"php": ">=7.4",
"composer/installers": "~1.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
"phpcompatibility/phpcompatibility-wp": "^2.1.2",
"wp-coding-standards/wpcs": "^2.3.0",
"psr/http-message": "^1.0",
"psr/log": "^1.1",
"psr/simple-cache": "^1.0",
"brianhenryie/strauss": "^0.11.1",
"php-stubs/wp-cli-stubs": "^2.7",
"php-stubs/wordpress-stubs": "^6.1",
"algolia/algoliasearch-client-php": "3.4.2"
},
"extra": {
"installer-name": "wp-search-with-algolia",
"strauss": {
"target_directory": "vendor_prefixed",
"namespace_prefix": "WebDevStudios\\WPSWA\\",
"classmap_prefix": "WDS_WPSWA_",
"constant_prefix": "WDS_WPSWA_",
"packages": [
"algolia/algoliasearch-client-php",
"psr/http-message",
"psr/log",
"psr/simple-cache"
],
"override_autoload": {
},
"exclude_from_copy": {
"packages": [
],
"namespaces": [
],
"file_patterns": [
]
},
"exclude_from_prefix": {
"packages": [
],
"namespaces": [
],
"file_patterns": [
]
},
"namespace_replacement_patterns" : {
},
"delete_vendor_files": false
},
"copy-file": {
},
"copy-file-dev": {
}
},
"scripts": {
"lint": "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs --standard=phpcs.xml --extensions=php .",
"lint:fix": "@php ./vendor/squizlabs/php_codesniffer/bin/phpcbf --standard=phpcs.xml --extensions=php .",
"post-install-cmd": [
"@php ./vendor/bin/strauss"
],
"post-update-cmd": [
"@php ./vendor/bin/strauss"
]
},
"config": {
"allow-plugins": {
"composer/installers": true,
"dealerdirect/phpcodesniffer-composer-installer": true
}
}
}
================================================
FILE: css/algolia-autocomplete.css
================================================
.algolia-autocomplete {
z-index: 999999 !important;
}
.aa-dropdown-menu {
/* we set the width in JS */
font-family: sans-serif;
background-color: #fff;
border-top: none;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
box-shadow: 0 1px 2px rgba(0,0,0,.25),0 0 1px rgba(0,0,0,.35);
}
.aa-dropdown-menu:after {
content: " ";
display: block;
clear: both;
}
.aa-dropdown-menu .aa-input, .aa-dropdown-menu .aa-hint {
width: 100%;
}
.aa-dropdown-menu .aa-hint {
color: #999;
}
/* Font */
.aa-dropdown-menu {
color: #1a1a1a;
font-size: 12px;
}
.aa-dropdown-menu a {
font-size: 12px;
color: #1a1a1a;
font-weight: normal;
text-decoration: none;
}
.aa-dropdown-menu a:hover {
text-decoration: none;
}
/* Header */
.aa-dropdown-menu .autocomplete-header {
margin: 0 14px;
line-height: 3em;
border-bottom: 1px solid rgba(0,0,0,.05);
}
.aa-dropdown-menu .autocomplete-header-title,
.aa-dropdown-menu .autocomplete-header-more
{
letter-spacing: 1px;
text-transform: uppercase;
font-weight: bold;
}
.aa-dropdown-menu .autocomplete-header-title {
float: left;
}
.aa-dropdown-menu .autocomplete-header-more {
float: right;
}
.aa-dropdown-menu .autocomplete-header-more a {
color: rgba(0,0,0,.3);
font-weight: bold;
}
.aa-dropdown-menu .autocomplete-header-more a:hover {
color: rgba(0,0,0,.4);
}
/* Suggestion */
.aa-dropdown-menu .aa-suggestion {
padding: 5px 0;
}
.aa-dropdown-menu .aa-suggestion:after {
visibility: hidden;
display: block;
font-size: 0;
content: " ";
clear: both;
height: 0;
}
.aa-dropdown-menu .aa-suggestion em {
color: #174d8c;
background: rgba(143,187,237,.1);
font-style: normal;
}
.aa-dropdown-menu .aa-suggestion .suggestion-post-title {
font-weight: bold;
display: block;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.aa-dropdown-menu .aa-suggestion .suggestion-post-content {
color: #63676d;
display: block;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.aa-dropdown-menu .aa-suggestion .suggestion-post-content em {
padding: 0 0 1px;
background: inherit;
box-shadow: inset 0 -2px 0 0 rgba(69,142,225,.8);
color: inherit;
}
.aa-dropdown-menu .aa-suggestion.aa-cursor {
background-color: #f9f9f9;
}
.aa-dropdown-menu a.suggestion-link {
display: block;
padding: 0 14px;
}
.aa-dropdown-menu a.suggestion-link.user-suggestion-link {
line-height: 32px;
}
.aa-dropdown-menu a.suggestion-link svg {
vertical-align: middle;
fill: rgba(0,0,0,.3);
float: left;
}
.aa-dropdown-menu .suggestion-post-thumbnail {
float: left;
margin-right: 5px;
margin-bottom: 5px;
border-radius: 3px;
width: 32px;
height: 32px;
}
.aa-dropdown-menu .suggestion-user-thumbnail {
float: left;
margin-right: 5px;
margin-bottom: 5px;
border-radius: 16px;
width: 32px;
height: 32px;
}
/* Footer */
.aa-dropdown-menu .autocomplete-footer-branding {
padding: 15px 14px 0px;
float: right;
color: rgba(0,0,0,.3);
margin-bottom: 7px;
}
/* Clearfix */
.aa-dropdown-menu .clear {
clear: both;
}
/* Empty */
.autocomplete-empty {
clear: both;
padding: 15px;
}
.autocomplete-empty .empty-query {
font-weight: bold;
}
================================================
FILE: css/algolia-instantsearch.css
================================================
#ais-wrapper {
display: flex;
}
#ais-main {
padding: 1rem;
width: 100%;
}
#ais-facets {
width: 40%;
padding: 1rem;
}
.ais-facets {
margin-bottom: 2rem;
padding: 0;
}
.ais-facets ul {
list-style: none;
padding-left: 0;
margin-left: 0;
}
.ais-facets li {
margin-left: 0;
}
.ais-clearfix {
clear: both;
}
.algolia-search-box-wrapper {
position: relative;
}
.algolia-search-box-wrapper .search-icon {
position: absolute;
left: 0px;
top: 14px;
fill: #21a4d7;
}
#algolia-search-box {
margin-bottom: 3rem;
}
#algolia-search-box input {
border: none;
border-bottom: 2px solid #21a4d7;
background: transparent;
width: 100%;
line-height: 30px;
font-size: 22px;
padding: 10px 0 10px 30px;
font-weight: 200;
box-sizing: border-box;
outline: none;
box-shadow: none;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
-ms-appearance: none;
}
.ais-SearchBox-form {
display: block;
position: relative;
}
.ais-SearchBox-submit[hidden],
.ais-SearchBox-reset[hidden],
.ais-SearchBox-loadingIndicator[hidden] {
display: none;
}
#algolia-powered-by {
position: absolute;
top: 60px;
right: 0;
font-size: 14px;
text-align: right;
}
.ais-Stats {
position: absolute;
top: 60px;
font-size: 14px;
}
.ais-Hits-list {
list-style: none;
padding-left: 0;
margin-left: 0;
}
.ais-Hits-item {
/* hit item */
margin: 0 0 2rem 0;
}
.ais-Hits-item h2 {
margin: 0;
}
.ais-Hits-item em, .ais-Hits-item a em,
.ais-Hits-item mark, .ais-Hits-item a mark {
font-style: normal;
background: #fffbcc;
border-radius: 2px;
}
.ais-hits--thumbnail {
float: left;
margin-right: 2rem;
}
.ais-hits--content {
overflow: hidden;
}
.ais-hits--thumbnail img {
border-radius: 3px;
}
.ais-Pagination {
margin: 0;
}
.ais-Pagination-list {
margin-left: 0;
}
.ais-Pagination-item {
/* Pagination item */
display: inline-block;
padding: 3px;
}
.ais-Pagination-item--disabled {
/* disabled Pagination item */
display: none;
}
.ais-Pagination-item--selected {
font-weight: bold;
}
.ais-Menu-item--selected {
/* active list item */
font-weight: bold;
}
.ais-HierarchicalMenu-item--selected {
/* Hierarchical Menu: Categories */
font-weight: bold;
}
.ais-Menu-count,
.ais-HierarchicalMenu-count,
.ais-RefinementList-count {
margin-left: 5px;
}
.ais-HierarchicalMenu-list--child {
/* item list level 1 */
margin-left: 10px;
}
.ais-RangeSlider .rheostat {
overflow: visible;
margin-top: 40px;
margin-bottom: 40px;
}
.ais-RangeSlider .rheostat-background {
height: 6px;
top: 0px;
width: 100%;
}
.ais-RangeSlider .rheostat-handle {
margin-left: -12px;
top: -7px;
}
.ais-RangeSlider .rheostat-background {
position: relative;
background-color: #fff;
border: 1px solid #003dff;
}
.ais-RangeSlider .rheostat-progress {
position: absolute;
top: 1px;
height: 4px;
background-color: #333;
}
.rheostat-handle {
position: relative;
z-index: 1;
width: 20px;
height: 20px;
background-color: #fff;
border: 1px solid #333;
border-radius: 50%;
cursor: -webkit-grab;
cursor: grab;
}
.rheostat-marker {
margin-left: -1px;
position: absolute;
width: 1px;
height: 5px;
background-color: #aaa;
}
.rheostat-marker--large {
height: 9px;
}
.rheostat-value {
margin-left: 50%;
padding-top: 15px;
position: absolute;
text-align: center;
-webkit-transform: translateX(-50%);
transform: translateX(-50%);
}
.rheostat-tooltip {
margin-left: 50%;
position: absolute;
top: -22px;
text-align: center;
-webkit-transform: translateX(-50%);
transform: translateX(-50%);
}
.ais-RatingMenu-item {
/* list item */
vertical-align: middle;
}
.ais-RatingMenu-item--selected {
/* active list item */
font-weight: bold;
}
.ais-RatingMenu-starIcon {
/* item star */
display: inline-block;
width: 1em;
height: 1em;
}
.ais-RatingMenu-starIcon:before {
content: '\2605';
color: #fbae00;
}
.ais-RatingMenu-starIcon--empty {
/* empty star */
display: inline-block;
width: 1em;
height: 1em;
}
.ais-RatingMenu-starIcon--empty:before {
content: '\2606';
color: #fbae00;
}
.ais-RatingMenu-item--disabled .ais-star-rating--star:before {
color: #c9c9c9;
}
.ais-RatingMenu-item--disabled .ais-star-rating--star__empty:before {
color: #c9c9c9;
}
.ais-root__collapsible .ais-header {
cursor: pointer;
}
.ais-root__collapsed .ais-body, .ais-root__collapsed .ais-footer {
display: none;
}
/* Responsive */
@media only screen and (max-width: 1000px) {
#ais-facets {
display: none;
}
.ais-hits--thumbnail img {
width: 100% !important;
}
.ais-Hits-item {
border-bottom: 1px solid gainsboro;
padding-bottom: 23px;
}
}
@media only screen and (max-width: 500px) {
.ais-hits--thumbnail {
margin-right: 0 !important;
margin-bottom: 10px;
float: none !important;
}
}
================================================
FILE: css/index.php
================================================
<?php // Silence is golden
================================================
FILE: includes/admin/class-algolia-admin-page-autocomplete.php
================================================
<?php
/**
* Algolia_Admin_Page_Autocomplete class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Admin_Page_Autocomplete
*
* @since 1.0.0
*/
class Algolia_Admin_Page_Autocomplete {
/**
* Admin page slug.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $slug = 'algolia';
/**
* Admin page capabilities.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $capability = 'manage_options';
/**
* Admin page section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $section = 'algolia_section_autocomplete';
/**
* Admin page option group.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $option_group = 'algolia_autocomplete';
/**
* The Algolia_Settings object.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Settings
*/
private $settings;
/**
* The Algolia_Autocomplete_Config object.
*
* @since 1.0.0
*
* @var Algolia_Autocomplete_Config
*/
private $autocomplete_config;
/**
* Algolia_Admin_Page_Autocomplete constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param Algolia_Settings $settings The Algolia_Settings object.
* @param Algolia_Autocomplete_Config $autocomplete_config The Algolia_Autocomplete_Config object.
*/
public function __construct( Algolia_Settings $settings, Algolia_Autocomplete_Config $autocomplete_config ) {
$this->settings = $settings;
$this->autocomplete_config = $autocomplete_config;
add_action( 'admin_menu', array( $this, 'add_page' ) );
add_action( 'admin_init', array( $this, 'add_settings' ) );
add_action( 'admin_notices', array( $this, 'display_errors' ) );
// @todo: Listen for de-index to remove from autocomplete.
}
/**
* Add menu pages.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function add_page() {
add_menu_page(
esc_html__( 'Algolia Search', 'wp-search-with-algolia' ),
esc_html__( 'Algolia Search', 'wp-search-with-algolia' ),
'manage_options',
'algolia',
array( $this, 'display_page' ),
'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MDAgNTAwLjM0Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6IzAwM2RmZjt9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjUwLDBDMTEzLjM4LDAsMiwxMTAuMTYsLjAzLDI0Ni4zMmMtMiwxMzguMjksMTEwLjE5LDI1Mi44NywyNDguNDksMjUzLjY3LDQyLjcxLC4yNSw4My44NS0xMC4yLDEyMC4zOC0zMC4wNSwzLjU2LTEuOTMsNC4xMS02LjgzLDEuMDgtOS41MmwtMjMuMzktMjAuNzRjLTQuNzUtNC4yMi0xMS41Mi01LjQxLTE3LjM3LTIuOTItMjUuNSwxMC44NS01My4yMSwxNi4zOS04MS43NiwxNi4wNC0xMTEuNzUtMS4zNy0yMDIuMDQtOTQuMzUtMjAwLjI2LTIwNi4xLDEuNzYtMTEwLjMzLDkyLjA2LTE5OS41NSwyMDIuOC0xOTkuNTVoMjAyLjgzVjQwNy42OGwtMTE1LjA4LTEwMi4yNWMtMy43Mi0zLjMxLTkuNDMtMi42Ni0xMi40MywxLjMxLTE4LjQ3LDI0LjQ2LTQ4LjU2LDM5LjY3LTgxLjk4LDM3LjM2LTQ2LjM2LTMuMi04My45Mi00MC41Mi04Ny40LTg2Ljg2LTQuMTUtNTUuMjgsMzkuNjUtMTAxLjU4LDk0LjA3LTEwMS41OCw0OS4yMSwwLDg5Ljc0LDM3Ljg4LDkzLjk3LDg2LjAxLC4zOCw0LjI4LDIuMzEsOC4yOCw1LjUzLDExLjEzbDI5Ljk3LDI2LjU3YzMuNCwzLjAxLDguOCwxLjE3LDkuNjMtMy4zLDIuMTYtMTEuNTUsMi45Mi0yMy42LDIuMDctMzUuOTUtNC44My03MC4zOS02MS44NC0xMjcuMDEtMTMyLjI2LTEzMS4zNS04MC43My00Ljk4LTE0OC4yMyw1OC4xOC0xNTAuMzcsMTM3LjM1LTIuMDksNzcuMTUsNjEuMTIsMTQzLjY2LDEzOC4yOCwxNDUuMzYsMzIuMjEsLjcxLDYyLjA3LTkuNDIsODYuMi0yNi45N2wxNTAuMzYsMTMzLjI5YzYuNDUsNS43MSwxNi42MiwxLjE0LDE2LjYyLTcuNDhWOS40OUM1MDAsNC4yNSw0OTUuNzUsMCw0OTAuNTEsMEgyNTBaIi8+PC9zdmc+'
);
add_submenu_page(
'algolia',
esc_html__( 'Autocomplete', 'wp-search-with-algolia' ),
esc_html__( 'Autocomplete', 'wp-search-with-algolia' ),
$this->capability,
$this->slug,
array( $this, 'display_page' )
);
}
/**
* Add and register settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function add_settings() {
add_settings_section(
$this->section,
null,
array( $this, 'print_section_settings' ),
$this->slug
);
add_settings_field(
'algolia_autocomplete_enabled',
esc_html__( 'Enable Autocomplete', 'wp-search-with-algolia' ),
array( $this, 'autocomplete_enabled_callback' ),
$this->slug,
$this->section
);
add_settings_field(
'algolia_autocomplete_debounce',
esc_html__( 'Autocomplete Debounce', 'wp-search-with-algolia' ),
array( $this, 'autocomplete_debounce_callback' ),
$this->slug,
$this->section
);
add_settings_field(
'algolia_autocomplete_config',
esc_html__( 'Autocomplete Config', 'wp-search-with-algolia' ),
array( $this, 'autocomplete_config_callback' ),
$this->slug,
$this->section
);
register_setting( $this->option_group, 'algolia_autocomplete_enabled', array( $this, 'sanitize_autocomplete_enabled' ) );
register_setting( $this->option_group, 'algolia_autocomplete_debounce', array( $this, 'sanitize_autocomplete_debounce' ) );
register_setting( $this->option_group, 'algolia_autocomplete_config', array( $this, 'sanitize_autocomplete_config' ) );
}
/**
* Callback to print the autocomplete enabled checkbox.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function autocomplete_enabled_callback() {
$value = $this->settings->get_autocomplete_enabled();
$indices = $this->autocomplete_config->get_form_data();
$checked = 'yes' === $value ? 'checked ' : '';
$disabled = empty( $indices ) ? 'disabled ' : '';
?>
<input type='checkbox' name='algolia_autocomplete_enabled' value='yes' <?php echo esc_html( $checked . ' ' . $disabled ); ?>/>
<?php
}
/**
* Callback to print the autocomplete debounce value.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.10.0
*/
public function autocomplete_debounce_callback() {
$value = $this->settings->get_autocomplete_debounce();
$indices = $this->autocomplete_config->get_form_data();
?>
<input type="number" name="algolia_autocomplete_debounce" class="small-text" min="0" value="<?php echo esc_attr( $value ); ?>" <?php disabled( empty( $indices ) ); ?>/>
<p class="description" id="home-description">
<?php esc_html_e( 'Enter the debounce timeout value in milliseconds. Use 0 (default) to disable debounce.', 'wp-search-with-algolia' ); ?>
<a href="https://www.algolia.com/doc/ui-libraries/autocomplete/guides/debouncing-sources/" target="_blank"><?php esc_html_e( 'Debouncing sources documentation', 'wp-search-with-algolia' ); ?></a>
</p>
<?php
}
/**
* Sanitize the Autocomplete enabled setting.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $value The original value.
*
* @return string
*/
public function sanitize_autocomplete_enabled( $value ) {
add_settings_error(
$this->option_group,
'autocomplete_enabled',
esc_html__( 'Autocomplete configuration has been saved. Make sure to hit the "re-index" buttons of the different indices that are not indexed yet.', 'wp-search-with-algolia' ),
'updated'
);
return 'yes' === $value ? 'yes' : 'no';
}
/**
* Sanitize the Autocomplete debounce setting.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.10.0
*
* @param int $value The original value.
*
* @return int The sanitized value.
*/
public function sanitize_autocomplete_debounce( $value ) {
return intval( $value );
}
/**
* Autocomplete Config Callback.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function autocomplete_config_callback() {
$indices = $this->autocomplete_config->get_form_data();
require_once dirname( __FILE__ ) . '/partials/page-autocomplete-config.php';
}
/**
* Sanitize Autocomplete Config.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param array $values Array of autocomplete config values.
*
* @return array|mixed
*/
public function sanitize_autocomplete_config( $values ) {
return $this->autocomplete_config->sanitize_form_data( $values );
}
/**
* Display the page.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function display_page() {
require_once dirname( __FILE__ ) . '/partials/page-autocomplete.php';
}
/**
* Display the errors.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return void
*/
public function display_errors() {
settings_errors( $this->option_group );
if ( defined( 'ALGOLIA_HIDE_HELP_NOTICES' ) && ALGOLIA_HIDE_HELP_NOTICES ) {
return;
}
$is_enabled = 'yes' === $this->settings->get_autocomplete_enabled();
$indices = $this->autocomplete_config->get_config();
if ( true === $is_enabled && empty( $indices ) ) {
// translators: placeholder contains the URL to the autocomplete configuration page.
$message = sprintf( __( 'Please select one or multiple indices on the <a href="%s">Algolia: Autocomplete configuration page</a>.', 'wp-search-with-algolia' ), esc_url( admin_url( 'admin.php?page=' . $this->slug ) ) );
echo '<div class="error notice">
<p>' . esc_html__( 'You have enabled the Algolia Autocomplete feature but did not choose any index to search in.', 'wp-search-with-algolia' ) . '</p>
<p>' . wp_kses_post( $message ) . '</p>
</div>';
}
}
/**
* Prints the section text.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function print_section_settings() {
echo '<p>' . esc_html__( 'Autocomplete adds a search-as-you-type dropdown to your search field(s).', 'wp-search-with-algolia' ) . '</p>';
echo '<p>' . esc_html__( 'Enabling Autocomplete adds the functionality to your site\'s frontend search. Indexing and settings pushes can be done regardless of enabled status.', 'wp-search-with-algolia' ) . '</p>';
}
}
================================================
FILE: includes/admin/class-algolia-admin-page-native-search.php
================================================
<?php
/**
* Algolia_Admin_Page_Native_Search class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Admin_Page_Native_Search
*
* @since 1.0.0
*/
class Algolia_Admin_Page_Native_Search {
/**
* Admin page slug.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $slug = 'algolia-search-page';
/**
* Admin page capabilities.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $capability = 'manage_options';
/**
* Admin page section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $section = 'algolia_section_native_search';
/**
* Admin page option group.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $option_group = 'algolia_native_search';
/**
* The Algolia_Plugin instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Plugin
*/
private $plugin;
/**
* Algolia_Admin_Page_Native_Search constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param Algolia_Plugin $plugin The Algolia_Plugin instance.
*/
public function __construct( Algolia_Plugin $plugin ) {
$this->plugin = $plugin;
add_action( 'admin_menu', array( $this, 'add_page' ) );
add_action( 'admin_init', array( $this, 'add_settings' ) );
add_action( 'admin_notices', array( $this, 'display_errors' ) );
}
/**
* Add submenu page.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function add_page() {
add_submenu_page(
'algolia',
esc_html__( 'Search Page', 'wp-search-with-algolia' ),
esc_html__( 'Search Page', 'wp-search-with-algolia' ),
$this->capability,
$this->slug,
array( $this, 'display_page' ),
0
);
}
/**
* Add settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function add_settings() {
add_settings_section(
$this->section,
null,
array( $this, 'print_section_settings' ),
$this->slug
);
add_settings_field(
'algolia_override_native_search',
esc_html__( 'Search results', 'wp-search-with-algolia' ),
array( $this, 'override_native_search_callback' ),
$this->slug,
$this->section
);
add_settings_field(
'algolia_instantsearch_template_version',
esc_html__( 'Instantsearch Template version', 'wp-search-with-algolia' ),
[ $this, 'instantsearch_template_version' ],
$this->slug,
$this->section
);
register_setting( $this->option_group, 'algolia_override_native_search', array( $this, 'sanitize_override_native_search' ) );
register_setting(
$this->option_group,
'algolia_instantsearch_template_version',
[
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field',
'default' => 'legacy',
]
);
}
/**
* Override native search callback.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function override_native_search_callback() {
$value = $this->plugin->get_settings()->get_override_native_search();
require_once dirname( __FILE__ ) . '/partials/form-override-search-option.php';
}
/**
* Get Instantsearch template version
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.9.0
*/
public function instantsearch_template_version() {
$value = $this->plugin->get_settings()->get_instantsearch_template_version();
require_once dirname( __FILE__ ) . '/partials/form-override-search-version-option.php';
}
/**
* Sanitize override native search.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $value The value to sanitize.
*
* @return array
*/
public function sanitize_override_native_search( $value ) {
if ( 'backend' === $value ) {
add_settings_error(
$this->option_group,
'native_search_enabled',
esc_html__( 'WordPress search is now based on Algolia!', 'wp-search-with-algolia' ),
'updated'
);
} elseif ( 'instantsearch' === $value ) {
add_settings_error(
$this->option_group,
'native_search_enabled',
esc_html__( 'WordPress search is now based on Algolia instantsearch.js!', 'wp-search-with-algolia' ),
'updated'
);
} else {
$value = 'native';
add_settings_error(
$this->option_group,
'native_search_disabled',
esc_html__( 'You chose to keep the WordPress native search instead of Algolia. If you are using the autocomplete feature of the plugin we highly recommend you turn Algolia search on instead of the WordPress native search.', 'wp-search-with-algolia' ),
'updated'
);
}
return $value;
}
/**
* Display the page.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function display_page() {
require_once dirname( __FILE__ ) . '/partials/page-search.php';
}
/**
* Display the errors.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return void
*/
public function display_errors() {
settings_errors( $this->option_group );
if ( defined( 'ALGOLIA_HIDE_HELP_NOTICES' ) && ALGOLIA_HIDE_HELP_NOTICES ) {
return;
}
$settings = $this->plugin->get_settings();
if ( ! $settings->should_override_search_in_backend() && ! $settings->should_override_search_with_instantsearch() ) {
return;
}
$maybe_get_page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_SPECIAL_CHARS );
$searchable_posts_index = $this->plugin->get_index( 'searchable_posts' );
if ( empty( $searchable_posts_index ) ) {
return;
}
if ( false === $searchable_posts_index->is_enabled() && ( ! empty( $maybe_get_page ) ) && $maybe_get_page === $this->slug ) {
// translators: placeholder contains the link to the indexing page.
$message = sprintf( __( 'Searchable posts index needs to be checked on the <a href="%s">Algolia: Indexing page</a> for the search results to be powered by Algolia.', 'wp-search-with-algolia' ), esc_url( admin_url( 'admin.php?page=algolia-indexing' ) ) );
echo '<div class="error notice">
<p>' . wp_kses_post( $message ) . '</p>
</div>';
}
}
/**
* Prints the section text.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function print_section_settings() {
echo '<p>' . esc_html__( 'By enabling these settings to override the native WordPress search, your search results will be powered by Algolia\'s typo-tolerant & relevant search algorithms.', 'wp-search-with-algolia' ) . '</p>';
echo '<p>' . sprintf(
'<strong>%1$s</strong> - %2$s',
esc_html__( 'Re-index All Content', 'wp-search-with-algolia' ),
esc_html__( 'Resubmit all of your content to the Algolia search API. Search results will be updated once the re-index has completed.', 'wp-search-with-algolia' )
) . '</p>';
echo '<p>' . sprintf(
'<strong>%1$s</strong> - %2$s <strong>%3$s</strong>',
esc_html__( 'Push Settings', 'wp-search-with-algolia' ),
esc_html__( 'Sync your search index settings to code-based overrides and plugin defaults.', 'wp-search-with-algolia' ),
esc_html__( 'WARNING this will override or reset configuration changes originally made within your Algolia dashboard.', 'wp-search-with-algolia' )
) . '</p>';
// @Todo: replace this with a check on the searchable_posts_index.
$indices = $this->plugin->get_indices(
array(
'enabled' => true,
'contains' => 'posts',
)
);
if ( empty( $indices ) ) {
echo '<div class="error-message"><p>' .
esc_html( __( 'You have no index containing only posts yet. Please index some content with the "Re-index All Content" button above.', 'wp-search-with-algolia' ) ) .
'</p></div>';
}
}
}
================================================
FILE: includes/admin/class-algolia-admin-page-premium-support.php
================================================
<?php
/**
* Algolia_Admin_Page_Premiun_Support class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Admin_Page_Premium_Support
*
* @since 2.8.2
*/
class Algolia_Admin_Page_Premium_Support {
/**
* Admin page slug.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
* @var string
*/
private $slug = 'algolia-account-premium-support';
/**
* Admin page capabilities.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
* @var string
*/
private $capability = 'manage_options';
/**
* Admin page section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
* @var string
*/
private $section = 'algolia_section_premium_support';
/**
* Admin page option group.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
* @var string
*/
private $option_group = 'algolia_settings';
/**
* The Algolia_Plugin instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
* @var Algolia_Plugin
*/
private $plugin;
/**
* Algolia_Admin_Page_Premium_Support constructor.
*
* @param Algolia_Plugin $plugin The Algolia_Plugin instance.
*
* @since 2.8.2
* @author WebDevStudios <contact@webdevstudios.com>
*/
public function __construct( Algolia_Plugin $plugin ) {
$this->plugin = $plugin;
add_action( 'admin_menu', [ $this, 'add_page' ] );
add_action( 'admin_init', [ $this, 'add_settings' ] );
}
/**
* Add admin menu page.
*
* @since 2.8.2
*
* @author WebDevStudios <contact@webdevstudios.com>
*
* @return string|void The resulting page's hook_suffix.
*/
public function add_page() {
$api = $this->plugin->get_api();
$parent_slug = ! $api->is_reachable() ? 'algolia-account-settings' : 'algolia';
add_submenu_page(
$parent_slug,
esc_html__( 'Premium Support from WebDevStudios', 'wp-search-with-algolia' ),
esc_html__( 'Premium Support', 'wp-search-with-algolia' ),
$this->capability,
$this->slug,
[ $this, 'display_page' ]
);
}
/**
* Add settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
*/
public function add_settings() {
add_settings_section(
$this->section,
null,
[ $this, 'print_section_settings' ],
$this->slug
);
}
/**
* Display the page.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
*/
public function display_page() {
require_once dirname( __FILE__ ) . '/partials/form-options-premium-support.php';
}
/**
* Print the settings section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.8.2
*/
public function print_section_settings() {
}
}
================================================
FILE: includes/admin/class-algolia-admin-page-seo.php
================================================
<?php
/**
* Algolia_Admin_Page_SEO class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Admin_Page_SEO
*
* @since 2.5.0
*/
class Algolia_Admin_Page_SEO {
/**
* Admin page slug.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var string
*/
private $slug = 'algolia-account-seo';
/**
* Admin page capabilities.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var string
*/
private $capability = 'manage_options';
/**
* Admin page section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var string
*/
private $section = 'algolia_section_seo';
/**
* Admin page option group.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var string
*/
private $option_group = 'algolia_settings';
/**
* The Algolia_Plugin instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var Algolia_Plugin
*/
private $plugin;
/**
* Algolia_Admin_Page_SEO constructor.
*
* @param Algolia_Plugin $plugin The Algolia_Plugin instance.
*
* @since 2.5.0
* @author WebDevStudios <contact@webdevstudios.com>
*/
public function __construct( Algolia_Plugin $plugin ) {
$this->plugin = $plugin;
add_action( 'admin_menu', [ $this, 'add_page' ] );
add_action( 'admin_init', [ $this, 'add_settings' ] );
}
/**
* Add admin menu page.
*
* @return string|void The resulting page's hook_suffix.
* @since 2.5.0
* @author WebDevStudios <contact@webdevstudios.com>
*/
public function add_page() {
$api = $this->plugin->get_api();
if ( ! $api->is_reachable() ) {
return;
}
add_submenu_page(
'algolia',
esc_html__( 'SEO', 'wp-search-with-algolia' ),
sprintf(
// translators: Placeholders are just for HTML markup that doesn't need translated.
esc_html__( 'SEO %s', 'wp-search-with-algolia' ),
sprintf(
'<span class="algolia-pro-indicator">%s</span>',
esc_html__( 'Pro', 'wp-search-with-algolia' )
)
),
$this->capability,
$this->slug,
[ $this, 'display_page' ]
);
}
/**
* Add settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
*/
public function add_settings() {
add_settings_section(
$this->section,
null,
[ $this, 'print_section_settings' ],
$this->slug
);
}
/**
* Display the page.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
*/
public function display_page() {
require_once dirname( __FILE__ ) . '/partials/form-options-seo.php';
}
/**
* Print the settings section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
*/
public function print_section_settings() {
}
}
================================================
FILE: includes/admin/class-algolia-admin-page-settings.php
================================================
<?php
/**
* Algolia_Admin_Page_Settings class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Admin_Page_Settings
*
* @since 1.0.0
*/
class Algolia_Admin_Page_Settings {
/**
* Admin page slug.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $slug = 'algolia-account-settings';
/**
* Admin page capabilities.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $capability = 'manage_options';
/**
* Admin page section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $section = 'algolia_section_settings';
/**
* Admin page option group.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string
*/
private $option_group = 'algolia_settings';
/**
* The Algolia_Plugin instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Plugin
*/
private $plugin;
/**
* Algolia_Admin_Page_Settings constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param Algolia_Plugin $plugin The Algolia_Plugin instance.
*/
public function __construct( Algolia_Plugin $plugin ) {
$this->plugin = $plugin;
add_action( 'admin_menu', array( $this, 'add_page' ) );
add_action( 'admin_init', array( $this, 'add_settings' ) );
add_action( 'admin_notices', array( $this, 'display_errors' ) );
// Display a link to this page from the plugins page.
add_filter( 'plugin_action_links_' . ALGOLIA_PLUGIN_BASENAME, array( $this, 'add_action_links' ) );
}
/**
* Add action links.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param array $links Array of action links.
*
* @return array
*/
public function add_action_links( array $links ) {
return array_merge(
$links,
array(
'<a href="' . esc_url( admin_url( 'admin.php?page=' . $this->slug ) ) . '">' . esc_html__( 'Settings', 'wp-search-with-algolia' ) . '</a>',
)
);
}
/**
* Add admin menu page.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return string|void The resulting page's hook_suffix.
*/
public function add_page() {
$api = $this->plugin->get_api();
if ( ! $api->is_reachable() ) {
// Means this is the only reachable admin page, so make it the default one!
return add_menu_page(
'WP Search with Algolia',
esc_html__( 'Algolia Search', 'wp-search-with-algolia' ),
'manage_options',
$this->slug,
array( $this, 'display_page' ),
'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MDAgNTAwLjM0Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6IzAwM2RmZjt9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjUwLDBDMTEzLjM4LDAsMiwxMTAuMTYsLjAzLDI0Ni4zMmMtMiwxMzguMjksMTEwLjE5LDI1Mi44NywyNDguNDksMjUzLjY3LDQyLjcxLC4yNSw4My44NS0xMC4yLDEyMC4zOC0zMC4wNSwzLjU2LTEuOTMsNC4xMS02LjgzLDEuMDgtOS41MmwtMjMuMzktMjAuNzRjLTQuNzUtNC4yMi0xMS41Mi01LjQxLTE3LjM3LTIuOTItMjUuNSwxMC44NS01My4yMSwxNi4zOS04MS43NiwxNi4wNC0xMTEuNzUtMS4zNy0yMDIuMDQtOTQuMzUtMjAwLjI2LTIwNi4xLDEuNzYtMTEwLjMzLDkyLjA2LTE5OS41NSwyMDIuOC0xOTkuNTVoMjAyLjgzVjQwNy42OGwtMTE1LjA4LTEwMi4yNWMtMy43Mi0zLjMxLTkuNDMtMi42Ni0xMi40MywxLjMxLTE4LjQ3LDI0LjQ2LTQ4LjU2LDM5LjY3LTgxLjk4LDM3LjM2LTQ2LjM2LTMuMi04My45Mi00MC41Mi04Ny40LTg2Ljg2LTQuMTUtNTUuMjgsMzkuNjUtMTAxLjU4LDk0LjA3LTEwMS41OCw0OS4yMSwwLDg5Ljc0LDM3Ljg4LDkzLjk3LDg2LjAxLC4zOCw0LjI4LDIuMzEsOC4yOCw1LjUzLDExLjEzbDI5Ljk3LDI2LjU3YzMuNCwzLjAxLDguOCwxLjE3LDkuNjMtMy4zLDIuMTYtMTEuNTUsMi45Mi0yMy42LDIuMDctMzUuOTUtNC44My03MC4zOS02MS44NC0xMjcuMDEtMTMyLjI2LTEzMS4zNS04MC43My00Ljk4LTE0OC4yMyw1OC4xOC0xNTAuMzcsMTM3LjM1LTIuMDksNzcuMTUsNjEuMTIsMTQzLjY2LDEzOC4yOCwxNDUuMzYsMzIuMjEsLjcxLDYyLjA3LTkuNDIsODYuMi0yNi45N2wxNTAuMzYsMTMzLjI5YzYuNDUsNS43MSwxNi42MiwxLjE0LDE2LjYyLTcuNDhWOS40OUM1MDAsNC4yNSw0OTUuNzUsMCw0OTAuNTEsMEgyNTBaIi8+PC9zdmc+'
);
}
add_submenu_page(
'algolia',
esc_html__( 'WP Search with Algolia Settings', 'wp-search-with-algolia' ),
esc_html__( 'Settings', 'wp-search-with-algolia' ),
$this->capability,
$this->slug,
array( $this, 'display_page' ),
0
);
}
/**
* Add settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function add_settings() {
add_settings_section(
$this->section,
null,
array( $this, 'print_section_settings' ),
$this->slug
);
add_settings_field(
'algolia_application_id',
esc_html__( 'Application ID', 'wp-search-with-algolia' ),
array( $this, 'application_id_callback' ),
$this->slug,
$this->section
);
add_settings_field(
'algolia_search_api_key',
esc_html__( 'Search API key', 'wp-search-with-algolia' ),
array( $this, 'search_api_key_callback' ),
$this->slug,
$this->section
);
add_settings_field(
'algolia_api_key',
esc_html__( 'Admin API key', 'wp-search-with-algolia' ),
array( $this, 'api_key_callback' ),
$this->slug,
$this->section
);
add_settings_field(
'algolia_index_name_prefix',
esc_html__( 'Index name prefix', 'wp-search-with-algolia' ),
array( $this, 'index_name_prefix_callback' ),
$this->slug,
$this->section
);
add_settings_field(
'algolia_powered_by_enabled',
esc_html__( 'Remove Algolia powered by logo', 'wp-search-with-algolia' ),
array( $this, 'powered_by_enabled_callback' ),
$this->slug,
$this->section
);
add_settings_field(
'algolia_insights_enabled',
esc_html__( 'Enable Insight events', 'wp-search-with-algolia' ),
array( $this, 'insights_enabled_callback' ),
$this->slug,
$this->section
);
register_setting( $this->option_group, 'algolia_application_id', array( $this, 'sanitize_application_id' ) );
register_setting( $this->option_group, 'algolia_search_api_key', array( $this, 'sanitize_search_api_key' ) );
register_setting( $this->option_group, 'algolia_api_key', array( $this, 'sanitize_api_key' ) );
register_setting( $this->option_group, 'algolia_index_name_prefix', array( $this, 'sanitize_index_name_prefix' ) );
register_setting( $this->option_group, 'algolia_powered_by_enabled', array( $this, 'sanitize_powered_by_enabled' ) );
register_setting( $this->option_group, 'algolia_insights_enabled', array( $this, 'sanitize_insights_enabled' ) );
}
/**
* Application ID callback.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function application_id_callback() {
$settings = $this->plugin->get_settings();
$setting = $settings->get_application_id();
$disabled_html = $settings->is_application_id_in_config() ? ' disabled' : '';
?>
<input type="text" name="algolia_application_id" class="regular-text" value="<?php echo esc_attr( $setting ); ?>" <?php echo esc_html( $disabled_html ); ?>/>
<p class="description" id="home-description">
<?php esc_html_e( 'Your Algolia Application ID.', 'wp-search-with-algolia' ); ?>
</p>
<?php
}
/**
* Search API key callback.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function search_api_key_callback() {
$settings = $this->plugin->get_settings();
$setting = $settings->get_search_api_key();
$disabled_html = $settings->is_search_api_key_in_config() ? ' disabled' : '';
?>
<input type="text" name="algolia_search_api_key" class="regular-text" value="<?php echo esc_attr( $setting ); ?>" <?php echo esc_html( $disabled_html ); ?>/>
<p class="description" id="home-description">
<?php esc_html_e( 'Your Algolia Search API key (public).', 'wp-search-with-algolia' ); ?>
</p>
<?php
}
/**
* Admin API key callback.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function api_key_callback() {
$settings = $this->plugin->get_settings();
$setting = $settings->get_api_key();
$disabled_html = $settings->is_api_key_in_config() ? ' disabled' : '';
?>
<input type="password" name="algolia_api_key" class="regular-text" value="<?php echo esc_attr( $setting ); ?>" <?php echo esc_html( $disabled_html ); ?>/>
<p class="description" id="home-description">
<?php esc_html_e( 'Your Algolia ADMIN API key (kept private).', 'wp-search-with-algolia' ); ?>
</p>
<?php
}
/**
* Index name prefix callback.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function index_name_prefix_callback() {
$settings = $this->plugin->get_settings();
$index_name_prefix = $settings->get_index_name_prefix();
$disabled_html = $settings->is_index_name_prefix_in_config() ? ' disabled' : '';
?>
<input type="text" name="algolia_index_name_prefix" value="<?php echo esc_attr( $index_name_prefix ); ?>" <?php echo esc_html( $disabled_html ); ?>/>
<p class="description" id="home-description"><?php esc_html_e( 'This prefix will be prepended to your index names.', 'wp-search-with-algolia' ); ?></p>
<?php
}
/**
* Powered by enabled callback.
*
* @author Richard Aber <richard.aber@webdevstudios.com>
* @since 2020-07-24
*/
public function powered_by_enabled_callback() {
$powered_by_enabled = $this->plugin->get_settings()->is_powered_by_enabled();
$checked = '';
if ( ! $powered_by_enabled ) {
$checked = ' checked';
}
echo "<input type='checkbox' name='algolia_powered_by_enabled' value='no' " . esc_html( $checked ) . ' />' .
'<p class="description" id="home-description">' . esc_html( __( 'This will remove the Algolia logo from the autocomplete and the search page. Algolia requires that you keep the logo if you are using a free plan.', 'wp-search-with-algolia' ) ) . '</p>';
}
/**
* Insights enabled callback.
*
* @since 2.10.2
*/
public function insights_enabled_callback() {
$insights_enabled = $this->plugin->get_settings()->is_insights_enabled();
$checked = '';
if ( $insights_enabled ) {
$checked = ' checked';
}
echo "<input type='checkbox' name='algolia_insights_enabled' value='yes' " . esc_html( $checked ) . ' />' .
'<p class="description" id="home-description">' . esc_html( __( 'This will enable insights and events tracking to help boost your Algolia results.', 'wp-search-with-algolia' ) ) . '</p>';
}
/**
* Sanitize application ID.
*
* @author Richard Aber <richard.aber@webdevstudios.com>
* @since 2020-07-24
*
* @param string $value The value to sanitize.
*
* @return string
*/
public function sanitize_application_id( $value ) {
if ( $this->plugin->get_settings()->is_application_id_in_config() ) {
$value = $this->plugin->get_settings()->get_application_id();
}
$value = sanitize_text_field( $value );
if ( empty( $value ) ) {
add_settings_error(
$this->option_group,
'empty',
esc_html__( 'Application ID should not be empty.', 'wp-search-with-algolia' )
);
}
return $value;
}
/**
* Sanitize search API key.
*
* @author Richard Aber <richard.aber@webdevstudios.com>
* @since 2020-07-24
*
* @param string $value The value to sanitize.
*
* @return string
*/
public function sanitize_search_api_key( $value ) {
if ( $this->plugin->get_settings()->is_search_api_key_in_config() ) {
$value = $this->plugin->get_settings()->get_search_api_key();
}
$value = sanitize_text_field( $value );
if ( empty( $value ) ) {
add_settings_error(
$this->option_group,
'empty',
esc_html__( 'Search API key should not be empty.', 'wp-search-with-algolia' )
);
}
return $value;
}
/**
* Sanitize Admin API key.
*
* @author Richard Aber <richard.aber@webdevstudios.com>
* @since 2020-07-24
*
* @param string $value The value to sanitize.
*
* @return string
*/
public function sanitize_api_key( $value ) {
if ( $this->plugin->get_settings()->is_api_key_in_config() ) {
$value = $this->plugin->get_settings()->get_api_key();
}
$value = sanitize_text_field( $value );
if ( empty( $value ) ) {
add_settings_error(
$this->option_group,
'empty',
esc_html__( 'API key should not be empty', 'wp-search-with-algolia' )
);
}
$errors = get_settings_errors( $this->option_group );
// @todo Not 100% clear why this is returning here.
if ( ! empty( $errors ) ) {
return $value;
}
$settings = $this->plugin->get_settings();
$valid_credentials = true;
try {
Algolia_API::assert_valid_credentials( $settings->get_application_id(), $value );
} catch ( Exception $exception ) {
$valid_credentials = false;
add_settings_error(
$this->option_group,
'login_exception',
$exception->getMessage()
);
}
if ( ! $valid_credentials ) {
add_settings_error(
$this->option_group,
'no_connection',
esc_html__(
'We were unable to authenticate you against the Algolia servers with the provided information. Please ensure that you used a valid Application ID and Admin API key.',
'wp-search-with-algolia'
)
);
$settings->set_api_is_reachable( false );
} else {
if ( ! Algolia_API::is_valid_search_api_key( $settings->get_application_id(), $settings->get_search_api_key() ) ) {
add_settings_error(
$this->option_group,
'wrong_search_API_key',
esc_html__(
'It looks like your search API key is wrong. Ensure that the key you entered has only the search capability and nothing else. Also ensure that the key has no limited time validity.',
'wp-search-with-algolia'
)
);
$settings->set_api_is_reachable( false );
} else {
add_settings_error(
$this->option_group,
'connection_success',
esc_html__( 'Connection to the Algolia servers was succesful! Configure your Search Page to start using Algolia!', 'wp-search-with-algolia' ),
'updated'
);
$settings->set_api_is_reachable( true );
}
}
return $value;
}
/**
* Determine if the index name prefix is valid.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $index_name_prefix The index name prefix.
*
* @return bool
*/
public function is_valid_index_name_prefix( $index_name_prefix ) {
$to_validate = str_replace( '_', '', $index_name_prefix );
return ctype_alnum( $to_validate );
}
/**
* Sanitize the index name prefix.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $value The value to sanitize.
*
* @return bool|mixed|string|void
*/
public function sanitize_index_name_prefix( $value ) {
if ( $this->plugin->get_settings()->is_index_name_prefix_in_config() ) {
$value = $this->plugin->get_settings()->get_index_name_prefix();
}
if ( $this->is_valid_index_name_prefix( $value ) ) {
return $value;
}
add_settings_error(
$this->option_group,
'wrong_prefix',
esc_html__( 'Indices prefix can only contain alphanumeric characters and underscores.', 'wp-search-with-algolia' )
);
$value = get_option( 'algolia_index_name_prefix' );
return $this->is_valid_index_name_prefix( $value ) ? $value : 'wp_';
}
/**
* Sanitize the powered by enabled setting.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $value The value to sanitize.
*
* @return string
*/
public function sanitize_powered_by_enabled( $value ) {
return 'no' === $value ? 'no' : 'yes';
}
/**
* Sanitize the insights enabled setting.
*
* @since 2.10.2
*
* @param string $value The value to sanitize.
*
* @return string
*/
public function sanitize_insights_enabled( $value ) {
return 'yes' === $value ? 'yes' : 'no';
}
/**
* Display the page.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function display_page() {
require_once dirname( __FILE__ ) . '/partials/form-options.php';
}
/**
* Display errors.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function display_errors() {
settings_errors( $this->option_group );
}
/**
* Print the settings section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function print_section_settings() {
echo '<p>' .
wp_kses(
sprintf(
// translators: URL to API keys section in Algolia dashboard.
__( 'Configure your Algolia account credentials. You can find them in the <a href="%s" target="_blank">API Keys</a> section of your Algolia dashboard.', 'wp-search-with-algolia' ),
'https://dashboard.algolia.com/account/api-keys/all'
),
[
'a' => [
'href' => [],
'target' => [],
],
]
) . '</p>';
// translators: the placeholder contains the URL to Algolia's website.
echo '<p>' . wp_kses_post( sprintf( __( 'No Algolia account yet? <a href="%s">Follow this link</a> to create one for free in a couple of minutes!', 'wp-search-with-algolia' ), 'https://dashboard.algolia.com/users/sign_up' ) ) . '</p>';
echo '<p>' . esc_html__( 'Once you provide your Algolia Application ID and API key, this plugin will be able to securely communicate with Algolia servers.', 'wp-search-with-algolia' ) . '<br/>' . esc_html__( 'We ensure your information is correct by testing them against the Algolia servers upon save.', 'wp-search-with-algolia' ) . '</p>';
?>
<a href="https://dashboard.algolia.com/account/api-keys/all" target="_blank"><?php esc_html_e( 'Manage your Algolia API Keys', 'wp-search-with-algolia' ); ?></a>
<?php
}
}
================================================
FILE: includes/admin/class-algolia-admin-page-woocommerce.php
================================================
<?php
/**
* Algolia_Admin_Page_WooCommerce class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Admin_Page_WooCommerce
*
* @since 2.5.0
*/
class Algolia_Admin_Page_WooCommerce {
/**
* Admin page slug.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var string
*/
private $slug = 'algolia-account-woocommerce';
/**
* Admin page capabilities.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var string
*/
private $capability = 'manage_options';
/**
* Admin page section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var string
*/
private $section = 'algolia_section_woocommerce';
/**
* Admin page option group.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var string
*/
private $option_group = 'algolia_settings';
/**
* The Algolia_Plugin instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @var Algolia_Plugin
*/
private $plugin;
/**
* Algolia_Admin_Page_WooCommerce constructor.
*
* @param Algolia_Plugin $plugin The Algolia_Plugin instance.
*
* @since 2.5.0
* @author WebDevStudios <contact@webdevstudios.com>
*/
public function __construct( Algolia_Plugin $plugin ) {
$this->plugin = $plugin;
add_action( 'admin_menu', [ $this, 'add_page' ] );
add_action( 'admin_init', [ $this, 'add_settings' ] );
}
/**
* Add admin menu page.
*
* @return string|void The resulting page's hook_suffix.
* @since 2.5.0
* @author WebDevStudios <contact@webdevstudios.com>
*/
public function add_page() {
$api = $this->plugin->get_api();
if ( ! $api->is_reachable() ) {
return;
}
add_submenu_page(
'algolia',
esc_html__( 'WooCommerce', 'wp-search-with-algolia' ),
sprintf(
// translators: Placeholders are just for HTML markup that doesn't need translated.
esc_html__( 'WooCommerce %s', 'wp-search-with-algolia' ),
sprintf(
'<span class="algolia-pro-indicator">%s</span>',
esc_html__( 'Pro', 'wp-search-with-algolia' )
)
),
$this->capability,
$this->slug,
[ $this, 'display_page' ]
);
}
/**
* Add settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
*/
public function add_settings() {
add_settings_section(
$this->section,
null,
[ $this, 'print_section_settings' ],
$this->slug
);
}
/**
* Display the page.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
*/
public function display_page() {
require_once dirname( __FILE__ ) . '/partials/form-options-woocommerce.php';
}
/**
* Print the settings section.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
*/
public function print_section_settings() {
}
}
================================================
FILE: includes/admin/class-algolia-admin-template-notices.php
================================================
<?php
/**
* Algolia_Admin_Template_Notices class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.8.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Admin_Template_Notices
*
* @since 1.8.0
*/
class Algolia_Admin_Template_Notices {
/**
* Algolia_Admin_Template_Notices constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.8.0
*/
public function __construct() {
add_action( 'admin_notices', [ $this, 'template_version_notices' ] );
}
/**
* Display template version discrepencany notices.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.8.0
*
* @return void
*/
public function template_version_notices() {
$core_template_paths = Algolia_Template_Utils::get_core_template_paths();
$custom_template_paths = Algolia_Template_Utils::get_custom_template_paths();
if ( empty( $custom_template_paths ) ) {
return;
}
$core_template_versions = [];
$custom_template_versions = [];
foreach ( $custom_template_paths as $filename => $file_path ) {
$core_template_versions[ $filename ] = Algolia_Template_Utils::get_template_version(
$core_template_paths[ $filename ]
);
$custom_template_versions[ $filename ] = Algolia_Template_Utils::get_template_version(
$file_path
);
}
foreach ( $custom_template_versions as $filename => $file_version ) {
// Error if versions do not match, or custom template version unknown.
if ( version_compare( $file_version, $core_template_versions[ $filename ], '!=' ) ) {
$error_notices[] = sprintf(
// translators: placeholder 1 is template filename, placeholder 2 is custom template version, placeholder 3 is core template version.
esc_html__(
'Your custom WP Search With Algolia template file, %1$s, version %2$s is out of date. The core version is %3$s',
'wp-search-with-algolia'
),
$filename,
! empty( $file_version ) ? $file_version : __( 'unknown', 'wp-search-with-algolia' ),
$core_template_versions[ $filename ]
);
}
}
if ( empty( $error_notices ) ) {
return;
}
foreach ( $error_notices as $error_notice ) {
echo '<div class="notice notice-error"><p>' . esc_html( $error_notice ) . '</p></div>';
}
}
}
================================================
FILE: includes/admin/class-algolia-admin.php
================================================
<?php
/**
* Algolia_Admin class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
// phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- We're using RuntimeException.
/**
* Class Algolia_Admin
*
* @since 1.0.0
*/
class Algolia_Admin {
/**
* The Algolia Plugin.
*
* @since 1.0.0
*
* @var Algolia_Plugin
*/
private $plugin;
/**
* Algolia_Admin constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param Algolia_Plugin $plugin The Algolia Plugin.
*/
public function __construct( Algolia_Plugin $plugin ) {
$this->plugin = $plugin;
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'localize_scripts' ) );
$api = $plugin->get_api();
if ( $api->is_reachable() ) {
new Algolia_Admin_Page_Autocomplete( $plugin->get_settings(), $this->plugin->get_autocomplete_config() );
new Algolia_Admin_Page_Native_Search( $plugin );
add_action( 'wp_ajax_algolia_re_index', array( $this, 're_index' ) );
add_action( 'wp_ajax_algolia_push_settings', array( $this, 'push_settings' ) );
$maybe_get_page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_SPECIAL_CHARS );
if ( ! empty( $maybe_get_page ) && 'algolia' === substr( $maybe_get_page, 0, 7 ) ) {
add_action( 'admin_notices', array( $this, 'display_reindexing_notices' ) );
}
}
new Algolia_Admin_Template_Notices();
new Algolia_Admin_Page_Settings( $plugin );
new Algolia_Admin_Page_WooCommerce( $plugin );
new Algolia_Admin_Page_SEO( $plugin );
new Algolia_Admin_Page_Premium_Support( $plugin );
add_action( 'admin_notices', array( $this, 'display_unmet_requirements_notices' ) );
add_filter( 'admin_footer_text', array( $this, 'algolia_footer' ) );
add_action( 'admin_menu', [ $this, 'add_pro_menu_item' ], 1000 );
add_action( 'admin_init', [ $this, 'handle_pro_redirect' ] );
}
/**
* Enqueue styles.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function enqueue_styles() {
wp_enqueue_style( 'algolia-admin', plugin_dir_url( __FILE__ ) . 'css/algolia-admin.css', array(), ALGOLIA_VERSION );
}
/**
* Enqueue scripts.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function enqueue_scripts() {
wp_enqueue_script(
'algolia-admin',
plugin_dir_url( __FILE__ ) . 'js/algolia-admin.js',
array( 'jquery', 'jquery-ui-sortable' ),
ALGOLIA_VERSION,
false
);
wp_enqueue_script(
'algolia-admin-reindex-button',
plugin_dir_url( __FILE__ ) . 'js/reindex-button.js',
array( 'jquery' ),
ALGOLIA_VERSION,
false
);
wp_enqueue_script(
'algolia-admin-push-settings-button',
plugin_dir_url( __FILE__ ) . 'js/push-settings-button.js',
array( 'jquery' ),
ALGOLIA_VERSION,
false
);
}
/**
* Add localize strings to scripts.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.2.0
*/
public function localize_scripts() {
wp_localize_script(
'algolia-admin-push-settings-button',
'algoliaPushSettingsButton',
array(
'pushBtnAlert' => esc_html__( 'Warning: Pushing settings will override the settings in the Algolia dashboard. Do you want to continue?', 'wp-search-with-algolia' ),
)
);
}
/**
* Displays an error notice for every unmet requirement.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return void
*/
public function display_unmet_requirements_notices() {
if ( ! extension_loaded( 'mbstring' ) ) {
echo '<div class="error notice">
<p>' . esc_html__( 'Algolia Search requires the "mbstring" PHP extension to be enabled. Please contact your hosting provider.', 'wp-search-with-algolia' ) . '</p>
</div>';
} elseif ( ! function_exists( 'mb_ereg_replace' ) ) {
echo '<div class="error notice">
<p>' . esc_html__( 'Algolia needs "mbregex" NOT to be disabled. Please contact your hosting provider.', 'wp-search-with-algolia' ) . '</p>
</div>';
}
if ( ! extension_loaded( 'curl' ) ) {
echo '<div class="error notice">
<p>' . esc_html__( 'Algolia Search requires the "cURL" PHP extension to be enabled. Please contact your hosting provider.', 'wp-search-with-algolia' ) . '</p>
</div>';
return;
}
$this->w3tc_notice();
}
/**
* Display notice to help users adding 'algolia_' as an ignored query string to the db caching configuration.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return void
*/
public function w3tc_notice() {
if ( ! function_exists( 'w3tc_pgcache_flush' ) || ! function_exists( 'w3_instance' ) ) {
return;
}
$config = w3_instance( 'W3_Config' );
$enabled = $config->get_integer( 'dbcache.enabled' );
$settings = array_map( 'trim', $config->get_array( 'dbcache.reject.sql' ) );
if ( $enabled && ! in_array( 'algolia_', $settings, true ) ) {
// translators: placeholder contains the URL to the caching plugin's config page.
$message = sprintf( __( 'In order for <strong>database caching</strong> to work with Algolia you must add <code>algolia_</code> to the "Ignored Query Stems" option in W3 Total Cache settings <a href="%s">here</a>.', 'wp-search-with-algolia' ), esc_url( admin_url( 'admin.php?page=w3tc_dbcache' ) ) );
?>
<div class="error">
<p><?php echo wp_kses_post( $message ); ?></p>
</div>
<?php
}
}
/**
* Display reindexing notices.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function display_reindexing_notices() {
$indices = $this->plugin->get_indices(
array(
'enabled' => true,
)
);
$allowed_html = array(
'strong' => array(),
);
foreach ( $indices as $index ) {
if ( $index->exists() ) {
continue;
}
?>
<div class="error">
<p>
<?php
echo wp_kses(
sprintf(
// translators: placeholder is an Algolia index name.
__( 'For Algolia search to work properly, you need to index: <strong>%1$s</strong>', 'wp-search-with-algolia' ),
esc_html( $index->get_admin_name() )
),
$allowed_html
);
?>
</p>
<p>
<button class="algolia-reindex-button button button-primary" data-index="<?php echo esc_attr( $index->get_id() ); ?>">
<?php esc_html_e( 'Index now', 'wp-search-with-algolia' ); ?>
</button>
</p>
</div>
<?php
}
}
/**
* Re index.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @throws RuntimeException If index ID or page are not provided, or index name dies not exist.
* @throws Exception If index ID or page are not provided, or index name dies not exist.
*/
public function re_index() {
$index_id = filter_input( INPUT_POST, 'index_id', FILTER_SANITIZE_SPECIAL_CHARS );
$page = filter_input( INPUT_POST, 'p', FILTER_SANITIZE_SPECIAL_CHARS );
try {
if ( empty( $index_id ) ) {
throw new RuntimeException( 'Index ID should be provided.' );
}
if ( ! ctype_digit( $page ) ) {
throw new RuntimeException( 'Page should be provided.' );
}
$page = (int) $page;
$index = $this->plugin->get_index( $index_id );
if ( null === $index ) {
throw new RuntimeException( sprintf( 'Index named %s does not exist.', $index_id ) );
}
$total_pages = $index->get_re_index_max_num_pages();
ob_start();
if ( $page <= $total_pages || 0 === $total_pages ) {
$index->re_index( $page );
}
ob_end_clean();
$response = array(
'totalPagesCount' => $total_pages,
'finished' => $page >= $total_pages,
);
wp_send_json( $response );
} catch ( Exception $exception ) {
wp_send_json_error( array( 'message' => $exception->getMessage() ) );
}
}
/**
* Push settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @throws RuntimeException If index_id is not provided or if the corresponding index is null.
* @throws Exception If index_id is not provided or if the corresponding index is null.
*/
public function push_settings() {
$index_id = filter_input( INPUT_POST, 'index_id', FILTER_SANITIZE_SPECIAL_CHARS );
try {
if ( empty( $index_id ) ) {
throw new RuntimeException( 'index_id should be provided.' );
}
$index = $this->plugin->get_index( $index_id );
if ( null === $index ) {
throw new RuntimeException( sprintf( 'Index named %s does not exist.', $index_id ) );
}
$index->push_settings();
$response = array(
'success' => true,
);
wp_send_json( $response );
} catch ( Exception $exception ) {
wp_send_json_error( array( 'message' => $exception->getMessage() ) );
}
}
/**
* Display footer links and plugin credits.
*
* @since 0.3.0
*
* @internal
*
* @param string $original Original footer content. Optional. Default empty string.
* @return string $value HTML for footer.
*/
public function algolia_footer( $original = '' ) {
$screen = get_current_screen();
if ( ! is_object( $screen ) || 'algolia' !== $screen->parent_base ) {
return $original;
}
return sprintf(
// translators: Placeholder will hold the name of the plugin, version of the plugin and a link to WebdevStudios.
esc_attr__( '%1$s version %2$s by %3$s', 'wp-search-with-algolia' ),
esc_attr__( 'WP Search with Algolia', 'wp-search-with-algolia' ),
ALGOLIA_VERSION,
'<a href="https://webdevstudios.com" target="_blank" rel="noopener">WebDevStudios</a>'
) . ' - ' .
sprintf(
// translators: Placeholders are just for HTML markup that doesn't need translated.
'<a href="https://wordpress.org/support/plugin/wp-search-with-algolia/" target="_blank" rel="noopener">%s</a>',
esc_attr__( 'Support', 'wp-search-with-algolia' )
) . ' - ' .
sprintf(
// translators: Placeholders are just for HTML markup that doesn't need translated.
'<a href="https://wordpress.org/plugins/wp-search-with-algolia/#reviews" target="_blank" rel="noopener">%s</a>',
esc_attr__( 'Review', 'wp-search-with-algolia' )
) . ' - ' .
sprintf(
// translators: Placeholders are just for HTML markup that doesn't need translated.
'<a href="https://pluginize.com/plugins/wp-search-with-algolia-pro/" target="_blank" rel="noopener"><strong>%s</strong></a>',
esc_attr__( 'Go Pro', 'wp-search-with-algolia' )
) . ' - ' .
esc_attr__( 'Follow on X:', 'wp-search-with-algolia' ) .
sprintf(
// translators: Placeholders are just for HTML markup that doesn't need translated.
' %s',
'<a href="https://x.com/webdevstudios" target="_blank" rel="noopener">WebDevStudios</a>'
);
}
/**
* Add an "Upgrade to Pro" submenu link.
*
* @internal
*
* @since 2.5.0
*/
public function add_pro_menu_item() {
global $submenu;
$submenu['algolia'][] = [ // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Only real way to modify in this way.
'<span class="algolia-menu-highlight">' . esc_html__( 'Upgrade to Pro', 'wp-search-with-algolia' ) . '</span>',
'manage_options',
wp_nonce_url(
add_query_arg(
[
'page' => 'algolia-account-settings',
'algolia-pro-upgrade' => wp_create_nonce( 'algolia-pro-nonce' ),
],
admin_url(
'admin.php'
)
)
),
];
}
/**
* Handle redirect to purchase WP Search with Algolia Pro link click.
*
* @since 2.5.0
*/
public function handle_pro_redirect() {
if ( isset( $_GET['algolia-pro-upgrade'] ) && wp_verify_nonce( $_GET['algolia-pro-upgrade'], 'algolia-pro-nonce' ) ) {
wp_redirect( 'https://pluginize.com/plugins/wp-search-with-algolia-pro/' ); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect
exit();
}
}
}
// phpcs:enable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- We're using RuntimeException.
================================================
FILE: includes/admin/css/algolia-admin.css
================================================
/**
* All of the CSS for your admin-specific functionality should be
* included in this file.
*/
/*
* https://algolia.frontify.com/document/1?#/basics/colors
*/
:root {
--algolia-white: #fff;
--algolia-gray: #f5f5fa;
--algolia-blue: #003dff;
--algolia-blue-lighten: #07f;
--algolia-dark-blue: #003;
--algolia-neon: #ceff00;
}
.form-table .table-autocomplete th {
padding: 8px 10px !important;
}
.form-table .table-autocomplete {
width: auto;
}
.table-autocomplete .dashicons-move {
cursor: pointer;
}
/* Native search page */
form .input-radio label {
font-weight: bold;
}
form .radio-info {
margin-bottom: 15px;
padding-left: 25px;
}
#toplevel_page_algolia .algolia-pro-indicator {
background-color: var(--algolia-blue);
border-radius: 3px;
color: var(--algolia-white);
font-size: 10px;
padding: 2px 3px;
vertical-align: text-top;
}
.algolia-menu-highlight {
color: var(--algolia-white);
}
#toplevel_page_algolia .algolia-submenu-highlight {
background-color: var(--algolia-blue);
font-weight: bold;
}
.algolia-pro-cta {
background-color: var(--algolia-white);
left: 50%;
margin-top: 0;
max-width: 850px;
padding: 30px 20px 40px;
position: absolute;
text-align: center;
top: 50px;
transform: translate(-50%) translateY(0);
width: 100%;
}
.algolia-pro-cta .algolia-pro-title {
color: #41495b;
font-size: 46px;
font-weight: 800;
line-height: 58px;
margin: 0 auto;
max-width: 600px;
}
.algolia-pro-cta .algolia-pro-desc {
color: #41495b;
font-size: 22px;
font-weight: 500;
line-height: 27px;
margin: 20px auto 20px;
max-width: 560px;
}
.algolia-pro-cta .algolia-pro-button {
background-color: var(--algolia-blue);
border-bottom: 0;
border-radius: 4px;
color: var(--algolia-white);
cursor: pointer;
display: inline-block;
font-size: 24px;
font-weight: 700;
line-height: 26px;
padding: 15px 40px;
text-decoration: none;
}
.algolia-pro-cta .algolia-pro-button:hover {
background-color: var(--algolia-blue-lighten);
}
.algolia-pro-cta .algolia-pro-more {
display: block;
font-size: 14px;
margin-top: 15px;
position: relative;
text-align: center;
}
.algolia-pro-cta .algolia-pro-more a {
color: var(--algolia-blue);
display: inline-block;
font-size: 14px;
font-style: italic;
outline: none;
text-decoration: none;
}
.algolia-pro-cta .algolia-pro-more a:hover {
color: var(--algolia-blue-lighten);
}
.algolia-pro-cta .algolia-pro-features {
display: flex;
gap: 40px;
justify-content: center;
margin: 20px auto 40px;
text-align: left;
}
.algolia-pro-cta .algolia-pro-features h4 {
font-size: 18px;
margin: 12px;
}
.algolia-pro-cta .algolia-pro-feature {
align-items: center;
display: flex;
}
.algolia-pro-cta .algolia-pro-feature svg {
padding-right: 4px;
}
.algolia-premium-wrap-block {
display: flex;
flex-direction: column;
gap: 20px;
justify-content: space-between;
}
.algolia-premium-support-block {
text-align: center;
}
.algolia-premium-support-block.algolia-pro-block {
text-align: left;
}
.wds-premium {
background: var(--algolia-blue);
color: var(--algolia-white);
padding: 10px;
border-radius: 9999px;
text-decoration: none;
}
.wds-premium:hover {
color: var(--algolia-white);
}
.algolia-flex {
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.algolia-flex-item {
padding: 5px 10px;
}
.algolia-pro-flex-wrap {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-content: space-between;
gap: 10px;
}
.algolia-pro-flex-item {
border-color: var(--algolia-blue);
border-radius: 15px;
flex: 1;
width: 33%;
}
.algolia-pro-features {
padding-left: 15px;
}
.algolia-pro-features li {
list-style: disc;
}
================================================
FILE: includes/admin/css/index.php
================================================
<?php // Silence is golden
================================================
FILE: includes/admin/fonts/index.php
================================================
<?php // Silence is golden
================================================
FILE: includes/admin/img/index.php
================================================
<?php // Silence is golden
================================================
FILE: includes/admin/index.php
================================================
<?php // Silence is golden
================================================
FILE: includes/admin/js/algolia-admin.js
================================================
(function( $ ) {
'use strict';
$(
function() {
function updateAutocompletePositions () {
$( '.table-autocomplete .position-input' ).each(
function(index, value) {
$( value ).val( index );
}
);
}
$( '.table-autocomplete tbody' ).sortable(
{
update: function() {
updateAutocompletePositions();
}
}
);
function submenuHighlight () {
let menu = document.querySelector('#toplevel_page_algolia')
if (!menu) {
return
}
let children = menu.querySelectorAll('.wp-submenu li')
children.forEach(child => {
let link = child.querySelector('a')
if (!link) {
return
}
let linkChild = link.querySelector('.algolia-menu-highlight')
if (linkChild) {
child.classList.add('algolia-submenu-highlight')
let link = child.querySelector('a')
if (link) {
link.setAttribute('target', '_blank')
}
}
})
}
submenuHighlight();
}
);
})( jQuery );
================================================
FILE: includes/admin/js/index.php
================================================
<?php // Silence is golden
================================================
FILE: includes/admin/js/push-settings-button.js
================================================
(function($) {
/* global algoliaPushSettingsButton */
$(
function() {
var $buttons = $( '.algolia-push-settings-button' );
$buttons.on( 'click', handleButtonClick );
}
);
function handleButtonClick(e) {
$clickedButton = $( e.currentTarget );
var index = $clickedButton.data( 'index' );
if ( ! index) {
throw new Error( 'Clicked button has no "data-index" set.' );
}
if ( ! window.confirm( algoliaPushSettingsButton.pushBtnAlert ) ) {
return;
}
disableButton( $clickedButton );
pushSettings( $clickedButton, index );
}
function disableButton($button) {
$button.prop( 'disabled', true );
}
function enableButton($button) {
$button.prop( 'disabled', false );
}
function pushSettings($clickedButton, index) {
var data = {
'action': 'algolia_push_settings',
'index_id': index
};
$.post(
ajaxurl, data, function(response) {
if (typeof response.success === 'undefined') {
alert( 'An error occurred' );
enableButton( $clickedButton );
return;
}
alert( 'Settings correctly pushed for index: ' + index );
enableButton( $clickedButton );
}
).fail(
function(response) {
alert( 'An error occurred: ' + response.responseText );
enableButton( $clickedButton );
}
);
}
})( jQuery );
================================================
FILE: includes/admin/js/reindex-button.js
================================================
(function($) {
$(
function() {
var $reindexButtons = $( '.algolia-reindex-button' );
$reindexButtons.on( 'click', handleReindexButtonClick );
}
);
var ongoing = 0;
$( window ).on(
'beforeunload', function() {
if (ongoing > 0) {
return 'If you leave now, re-indexing tasks in progress will be aborted';
}
}
);
function handleReindexButtonClick(e) {
$clickedButton = $( e.currentTarget );
var index = $clickedButton.data( 'index' );
if ( ! index) {
throw new Error( 'Clicked button has no "data-index" set.' );
}
ongoing++;
$clickedButton.attr( 'disabled', 'disabled' );
$clickedButton.data( 'originalText', $clickedButton.text() );
updateIndexingPourcentage( $clickedButton, 0 );
reIndex( $clickedButton, index );
}
function updateIndexingPourcentage($clickedButton, amount) {
$clickedButton.text( 'Processing, please be patient ... ' + amount + '%' );
}
function reIndex($clickedButton, index, currentPage) {
if ( ! currentPage) {
currentPage = 1;
}
var data = {
'action': 'algolia_re_index',
'index_id': index,
'p': currentPage
};
$.post(
ajaxurl, data, function(response) {
if (typeof response.totalPagesCount === 'undefined') {
alert( 'An error occurred' );
resetButton( $clickedButton );
return;
}
if (response.totalPagesCount === 0) {
$clickedButton.parents( '.error' ).fadeOut();
resetButton( $clickedButton );
return;
}
progress = Math.round( (currentPage / response.totalPagesCount) * 100 );
updateIndexingPourcentage( $clickedButton, progress );
if (response.finished !== true) {
reIndex( $clickedButton, index, ++currentPage );
} else {
$clickedButton.parents( '.error' ).fadeOut();
resetButton( $clickedButton );
}
}
).fail(
function(response) {
alert( 'An error occurred: ' + response.responseText );
resetButton( $clickedButton );
}
);
}
function resetButton($clickedButton) {
ongoing--;
$clickedButton.text( $clickedButton.data( 'originalText' ) );
$clickedButton.removeAttr( 'disabled' );
$clickedButton.data( 'currentPage', 1 );
}
})( jQuery );
================================================
FILE: includes/admin/partials/form-options-premium-support.php
================================================
<?php
/**
* Form options admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @package WebDevStudios\WPSWA
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<div class="wrap about-wrap">
<h1>
<?php echo esc_html( get_admin_page_title() ); ?>
</h1>
<div class="algolia-premium-wrap-block">
<div class="algolia-premium-support-block">
<p>
<?php esc_html_e( 'Thank you for using WP Search with Algolia to enhance your website\'s search experience. We are happy to have you as a user.', 'wp-search-with-algolia' ); ?>
</p>
</div>
<div class="algolia-premium-support-block">
<h2><?php esc_html_e( 'Seeking help?', 'wp-search-with-algolia' ); ?></h2>
<p>
<?php esc_html_e( 'Our premium support and integration services ensure a seamless implementation of Algolia into your WordPress site. Whether you’re running a blog, eCommerce platform, or enterprise-level application, we’ll handle every detail—from setup and configuration to advanced customizations that match your unique needs.', 'wp-search-with-algolia' ); ?>
</p>
<p>
<?php esc_html_e( 'At WebDevStudios, we’re not just delivering tools—we’re empowering you with a scalable, high-performing search experience. Ready to elevate your WordPress website? Let’s make it happen!', 'wp-search-with-algolia' ); ?>
</p>
</div>
<div class="algolia-premium-support-block">
<h2><?php esc_html_e( 'Ready to work with us?', 'wp-search-with-algolia' ); ?></h2>
<div class="algolia-flex">
<div class="algolia-flex-item">
<p><a class="wds-premium" href="https://webdevstudios.com/contact/" target="_blank" rel="noopener"><?php esc_html_e( 'Contact WebDevStudios', 'wp-search-with-algolia' ); ?></a>
</p>
</div>
</div>
</div>
<div class="algolia-premium-support-block algolia-pro-block">
<h2><a href="https://pluginize.com/plugins/wp-search-with-algolia-pro/" target="_blank"><?php esc_html_e( 'WP Search with Algolia Pro', 'wp-search-with-algolia' ); ?></a></h2>
<div class="algolia-pro-flex-wrap">
<div class="algolia-pro-flex-item card">
<h3><?php esc_html_e( 'Multisite Indexing', 'wp-search-with-algolia' ); ?></h3>
<ul class="algolia-pro-features">
<li><?php esc_html_e( 'Multisite network indexing into a single search index to provide a global Algolia-powered search experience.', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'Easily search all sites in your Multisite network with a single search experience!', 'wp-search-with-algolia' ); ?></li>
</ul>
</div>
<div class="algolia-pro-flex-item card">
<h3><?php esc_html_e( 'WooCommerce Support', 'wp-search-with-algolia' ); ?></h3>
<ul class="algolia-pro-features">
<li><?php esc_html_e( 'Index product SKUs, prices, short descriptions and product dimensions/weight for display.', 'wp-search-with-algolia' ); ?>'</li>
<li><?php esc_html_e( 'Index product total sales ratings for relevance.', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'Index product total and average ratings for relevance.', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'Control whether or not sold out products are indexed.', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'Control whether or not "shop only" or "hidden" products are indexed.', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'Amend indexing to only include WooCommerce products.', 'wp-search-with-algolia' ); ?></li>
</ul>
</div>
<div class="algolia-pro-flex-item card">
<h3><?php esc_html_e( 'Search Engine Optimization', 'wp-search-with-algolia' ); ?></h3>
<ul class="algolia-pro-features">
<li><?php esc_html_e( 'Fine tune indexing on selected pieces of content', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'Yoast SEO', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'All in One SEO', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'Rank Math SEO', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'SEOPress', 'wp-search-with-algolia' ); ?></li>
<li><?php esc_html_e( 'The SEO Framework Support', 'wp-search-with-algolia' ); ?></li>
</ul>
</div>
</div>
</div>
</div>
</div>
================================================
FILE: includes/admin/partials/form-options-seo.php
================================================
<?php
/**
* Form options admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @package WebDevStudios\WPSWA
*/
?>
<div class="wrap">
<h1>
<?php esc_html_e( 'WP Search with Algolia and Search Engine Optimization', 'wp-search-with-algolia' ); ?>
</h1>
<img style="max-width: 100%;" src="<?php echo esc_url( ALGOLIA_PLUGIN_URL . 'includes/admin/img/algolia-pro-seo.jpg' ); ?>" alt="<?php esc_attr_e( 'Blurry representiation of features available with WP Search with Algolia Pro.', 'wp-search-with-algolia' ); ?>" />
<?php echo Algolia_Utils::pro_cta_content(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
================================================
FILE: includes/admin/partials/form-options-woocommerce.php
================================================
<?php
/**
* Form options admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.0
* @package WebDevStudios\WPSWA
*/
?>
<div class="wrap">
<h1>
<?php esc_html_e( 'WP Search with Algolia and WooCommerce', 'wp-search-with-algolia' ); ?>
</h1>
<img style="max-width: 100%;" src="<?php echo esc_url( ALGOLIA_PLUGIN_URL . 'includes/admin/img/algolia-pro-woocommerce.jpg' ); ?>" alt="<?php esc_attr_e( 'Blurry representiation of features available with WP Search with Algolia Pro.', 'wp-search-with-algolia' ); ?>" />
<?php echo Algolia_Utils::pro_cta_content(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
================================================
FILE: includes/admin/partials/form-options.php
================================================
<?php
/**
* Form options admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
?>
<div class="wrap">
<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
<?php if ( ! has_action( 'wpswa_pro_override_settings_output' ) ) : ?>
<form method="post" action="options.php">
<?php
settings_fields( $this->option_group );
do_settings_sections( $this->slug );
submit_button();
?>
</form>
<?php else : ?>
<?php
/**
* Allows for custom output of settings page content.
*
* Most specifically used for WP Search with Algolia Pro
*
* @since 2.5.2
*/
do_action( 'wpswa_pro_override_settings_output' ); ?>
<?php endif; ?>
</div>
================================================
FILE: includes/admin/partials/form-override-search-option.php
================================================
<?php
/**
* Form override search option admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
?>
<div class="input-radio">
<label>
<input type="radio" value="native"
name="algolia_override_native_search" <?php checked( $value, 'native' ); ?>>
<?php esc_html_e( 'Do not use Algolia', 'wp-search-with-algolia' ); ?>
</label>
<div class="radio-info">
<?php
echo wp_kses(
__(
'Do not use Algolia for any search. This option disables the search integration completely.',
'wp-search-with-algolia'
),
[
'br' => [],
]
);
?>
</div>
<label>
<input type="radio" value="backend"
name="algolia_override_native_search" <?php checked( $value, 'backend' ); ?>>
<?php esc_html_e( 'Use Algolia with the native WordPress search template', 'wp-search-with-algolia' ); ?>
</label>
<div class="radio-info">
<?php
echo wp_kses(
__(
'Search results will be powered by Algolia and will use the standard WordPress search template for displaying the results.<br/>This option has the advantage to play nicely with any theme but does not support filtering and displaying InstantSearch results.',
'wp-search-with-algolia'
),
[
'br' => [],
'b' => [],
]
);
?>
</div>
<label>
<input type="radio" value="instantsearch"
name="algolia_override_native_search" <?php checked( $value, 'instantsearch' ); ?>>
<?php esc_html_e( 'Use Algolia with Instantsearch.js', 'wp-search-with-algolia' ); ?>
</label>
<div class="radio-info">
<?php
echo wp_kses(
__(
'This will replace the WordPress search page with an InstantSearch experience powered by Algolia.<br/>By default you will be able to filter by post type, categories, tags and authors.',
'wp-search-with-algolia'
),
[
'br' => [],
]
);
?>
</div>
</div>
================================================
FILE: includes/admin/partials/form-override-search-version-option.php
================================================
<?php
/**
* Form override search option admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.9.0
*
* @package WebDevStudios\WPSWA
*/
?>
<div class="input-radio">
<label>
<input type="radio" value="legacy"
name="algolia_instantsearch_template_version" <?php checked( $value, 'legacy' ); ?>>
<?php esc_html_e( 'Legacy (instantsearch.php)', 'wp-search-with-algolia' ); ?>
</label>
<div class="radio-info">
<?php
echo wp_kses(
__(
'Utilizes WP Utils library.',
'wp-search-with-algolia'
),
[
'br' => [],
]
);
?>
</div>
<label>
<input type="radio" value="modern"
name="algolia_instantsearch_template_version" <?php checked( $value, 'modern' ); ?>>
<?php esc_html_e( 'Modern (instantsearch-modern.php)', 'wp-search-with-algolia' ); ?>
</label>
<div class="radio-info">
<?php
echo wp_kses(
__(
'Uses Javascript template string literals and is more in line with Algolia documentation.',
'wp-search-with-algolia'
),
[
'br' => [],
]
);
?>
</div>
<p><strong><?php esc_html_e( 'Leave on current setting if you have InstantSearch customized via files in your active theme.', 'wp-search-with-algolia' ); ?></strong></p>
</div>
================================================
FILE: includes/admin/partials/index.php
================================================
<?php // Silence is golden
================================================
FILE: includes/admin/partials/page-autocomplete-config.php
================================================
<?php
/**
* Autocomplete config admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
?>
<p class="description" id="home-description">
<?php esc_html_e( 'Configure the indices you want to display in the autocomplete search dropdown menu.', 'wp-search-with-algolia' ); ?>
<br />
<?php esc_html_e( 'Use the `Max. Suggestions` column to configure the number of results displayed by section.', 'wp-search-with-algolia' ); ?>
<br />
<?php esc_html_e( 'Use drag and drop to control the order of the sections in the autocomplete search dropdown menu.', 'wp-search-with-algolia' ); ?>
</p>
<table class="widefat table-autocomplete striped">
<thead>
<tr>
<th style="width: 20px;"></th>
<th style="width: 75px;"><?php esc_html_e( 'Enable', 'wp-search-with-algolia' ); ?></th>
<th><?php esc_html_e( 'Index', 'wp-search-with-algolia' ); ?></th>
<th><?php esc_html_e( 'Label', 'wp-search-with-algolia' ); ?></th>
<th style="width: 75px;"><?php esc_html_e( 'Max. Suggestions', 'wp-search-with-algolia' ); ?></th>
<th><?php esc_html_e( 'Actions', 'wp-search-with-algolia' ); ?></th>
</tr>
</thead>
<tbody>
<?php
$prefix = $this->settings->get_index_name_prefix(); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound
foreach ( $indices as $index ) : // phpcs:ignore -- This is an admin partial. ?>
<tr>
<td>
<span class="dashicons dashicons-move"></span>
<input type="hidden" class="position-input" name="algolia_autocomplete_config[<?php echo esc_attr( $index['index_id'] ); ?>][position]" value="<?php echo (int) $index['position']; ?>" />
</td>
<td>
<input type="checkbox" name="algolia_autocomplete_config[<?php echo esc_attr( $index['index_id'] ); ?>][enabled]" <?php echo $index['enabled'] ? 'checked="checked"' : ''; ?>/>
</td>
<td>
<?php echo esc_html( $index['admin_name'] ); ?><br>
<small>
<?php
printf(
// translators: placeholder is the name of an Algolia search index.
esc_html__( 'Index name: %s', 'wp-search-with-algolia' ),
esc_html( $index['index_id'] )
);
?>
</small><br/>
<small>
<?php
printf(
// translators: placeholder is the name of an Algolia search index.
esc_html__( 'Prefixed: %1$s%2$s', 'wp-search-with-algolia' ),
esc_html( $prefix ),
esc_html( $index['index_id'] )
);
?>
</small>
<?php if ( ! empty( $index['debounce'] ) && $index['debounce'] > 0 ) : ?>
<br /><small>
<?php
printf(
// translators: placeholder is the custom debounce value.
esc_html__( 'Custom debounce timing: %s ms', 'wp-search-with-algolia' ),
esc_html( $index['debounce'] )
);
?>
</small>
<?php endif; ?>
</td>
<td>
<input type="text" name="algolia_autocomplete_config[<?php echo esc_attr( $index['index_id'] ); ?>][label]" value="<?php echo esc_attr( $index['label'] ); ?>" />
</td>
<td>
<input type="number" class="small-text" name="algolia_autocomplete_config[<?php echo esc_attr( $index['index_id'] ); ?>][max_suggestions]" value="<?php echo (int) $index['max_suggestions']; ?>" />
</td>
<td>
<button type="button" class="algolia-reindex-button button button-primary" data-index="<?php echo esc_attr( $index['index_id'] ); ?>"><?php esc_html_e( 'Re-index', 'wp-search-with-algolia' ); ?></button>
<button type="button" class="algolia-push-settings-button button" data-index="<?php echo esc_attr( $index['index_id'] ); ?>"><?php esc_html_e( 'Push Settings', 'wp-search-with-algolia' ); ?></button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<p class="description" id="home-description">
<?php esc_html_e( 'Configure the indices you want to display in the autocomplete search dropdown menu.', 'wp-search-with-algolia' ); ?>
<br />
<?php esc_html_e( 'Use the `Max. Suggestions` column to configure the number of results displayed by section.', 'wp-search-with-algolia' ); ?>
<br />
<?php esc_html_e( 'Use drag and drop to control the order of the sections in the autocomplete search dropdown menu.', 'wp-search-with-algolia' ); ?>
</p>
================================================
FILE: includes/admin/partials/page-autocomplete.php
================================================
<?php
/**
* Autocomplete admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
?>
<div class="wrap">
<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
<form method="post" action="options.php">
<?php
settings_fields( $this->option_group );
do_settings_sections( $this->slug );
submit_button();
?>
</form>
</div>
================================================
FILE: includes/admin/partials/page-search.php
================================================
<?php
/**
* Search admin template partial.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
?>
<div class="wrap">
<h1>
<?php echo esc_html( get_admin_page_title() ); ?>
<button type="button" class="algolia-reindex-button button button-primary" data-index="searchable_posts">
<?php esc_html_e( 'Re-index All Content', 'wp-search-with-algolia' ); ?>
</button>
<button type="button" class="algolia-push-settings-button button" data-index="searchable_posts">
<?php esc_html_e( 'Push Settings', 'wp-search-with-algolia' ); ?>
</button>
</h1>
<form method="post" action="options.php">
<?php
settings_fields( $this->option_group );
do_settings_sections( $this->slug );
submit_button();
?>
</form>
</div>
================================================
FILE: includes/class-algolia-api.php
================================================
<?php
/**
* Algolia_API class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
use WebDevStudios\WPSWA\Algolia\AlgoliaSearch\Exceptions\AlgoliaException;
use WebDevStudios\WPSWA\Algolia\AlgoliaSearch\SearchClient;
/**
* Class Algolia_API
*
* @since 1.0.0
*/
class Algolia_API {
/**
* The SearchClient instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var SearchClient
*/
private $client;
/**
* The Algolia_Settings instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Settings
*/
private $settings;
/**
* Algolia_API constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param Algolia_Settings $settings The Algolia_Settings instance.
*/
public function __construct( Algolia_Settings $settings ) {
$this->settings = $settings;
}
/**
* Check if the Aloglia API is reachable.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return bool
*/
public function is_reachable() {
if ( ! $this->settings->get_api_is_reachable() ) {
return false;
}
try {
// Here we check that all requirements for the PHP API SearchClient are met.
// If they are not, instantiating the client will throw exceptions.
$client = $this->get_client();
} catch ( Exception $e ) {
return false;
}
return null !== $client;
}
/**
* Get the SearchClient.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return SearchClient|null
*/
public function get_client(): ?SearchClient {
$application_id = $this->settings->get_application_id();
$api_key = $this->settings->get_api_key();
if (
empty( $application_id ) ||
empty( $api_key )
) {
return null;
}
if ( null === $this->client ) {
$this->client = Algolia_Search_Client_Factory::create(
(string) $this->settings->get_application_id(),
(string) $this->settings->get_api_key()
);
}
return $this->client;
}
/**
* Assert that the credentials are valid.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $application_id The Algolia Application ID.
* @param string $api_key The Algolia Admin API Key.
*
* @return void
*
* @throws Exception If the Algolia Admin API Key does not have correct ACLs.
*/
public static function assert_valid_credentials( $application_id, $api_key ) {
$client = Algolia_Search_Client_Factory::create(
(string) $application_id,
(string) $api_key
);
// This checks if the API Key is an Admin API key.
// Admin API keys have no scopes so we need a separate check here.
try {
$client->listApiKeys();
return;
} catch ( Exception $exception ) { // phpcs:ignore --- intentionally empty catch.
}
// If this call does not succeed, then the application_ID or API_key is/are wrong.
// This will raise an exception.
$key = $client->getApiKey( (string) $api_key );
$required_acls = array(
'addObject',
'deleteObject',
'listIndexes',
'deleteIndex',
'settings',
'editSettings',
);
$missing_acls = array();
foreach ( $required_acls as $required_acl ) {
if ( ! in_array( $required_acl, $key['acl'], true ) ) {
$missing_acls[] = $required_acl;
}
}
if ( ! empty( $missing_acls ) ) {
throw new Exception(
'Your admin API key is missing the following ACLs: ' . implode( ', ', $missing_acls )
);
}
}
/**
* Check if the credentials are valid.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $application_id The Algolia Application ID.
* @param string $api_key The Algolia Admin API Key.
*
* @return bool
*/
public static function is_valid_credentials( $application_id, $api_key ) {
try {
self::assert_valid_credentials( $application_id, $api_key );
} catch ( Exception $e ) {
return false;
}
return true;
}
/**
* Check if the Search API Key is valid.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $application_id The Algolia Application ID.
* @param string $search_api_key The Algolia Search API Key.
*
* @return bool
*/
public static function is_valid_search_api_key( $application_id, $search_api_key ) {
$client = Algolia_Search_Client_Factory::create(
(string) $application_id,
(string) $search_api_key
);
// If this call does not succeed, the application_ID and/or API_key are wrong.
try {
$acl = $client->getApiKey( $search_api_key );
} catch ( AlgoliaException $e ) {
return false;
}
// We expect a search only key for security reasons. Will be used in front.
$scopes = array_flip( $acl['acl'] );
if ( ! isset( $scopes['search'] ) ) {
return false;
}
unset( $scopes['search'] );
if ( isset( $scopes['settings'] ) ) {
unset( $scopes['settings'] );
}
if ( isset( $scopes['listIndexes'] ) ) {
unset( $scopes['listIndexes'] );
}
if ( isset( $scopes['browse'] ) ) {
unset( $scopes['browse'] );
}
// Short circuit ACL checks for local development.
if ( defined( 'WP_LOCAL_DEV' ) && WP_LOCAL_DEV ) {
return true;
}
if ( ! empty( $scopes ) ) {
// The API key has more permissions than allowed.
return false;
}
// We do expect a search key without unlimited TTL.
if ( 0 !== $acl['validity'] ) {
return false;
}
return true;
}
}
================================================
FILE: includes/class-algolia-autocomplete-config.php
================================================
<?php
/**
* Algolia_Autocomplete_Config class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Autocomplete_Config
*
* @since 1.0.0
*/
class Algolia_Autocomplete_Config {
/**
* The Algolia_Plugin instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Plugin
*/
private $plugin;
/**
* Algolia_Autocomplete_Config constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param Algolia_Plugin $plugin The Algolia_Plugin instance.
*/
public function __construct( Algolia_Plugin $plugin ) {
$this->plugin = $plugin;
}
/**
* Get form data.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return array
*/
public function get_form_data() {
$indices = $this->plugin->get_indices();
$config = array();
$existing_config = $this->get_config();
/**
* Loop over the indices.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Index $index
*/
foreach ( $indices as $index ) {
$index_config = $this->extract_index_config( $existing_config, $index->get_id() );
if ( $index_config ) {
// If there is an existing configuration, add it.
$config[] = $index_config;
continue;
}
$default_config = $index->get_default_autocomplete_config();
$default_config['enabled'] = false;
$config[] = $default_config;
}
usort(
$config,
function( $a, $b ):int {
return $a['position'] <=> $b['position'];
}
);
return $config;
}
/**
* Sanitize form data.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param array $data The data to sanitize.
*
* @return mixed
*/
public function sanitize_form_data( $data ) {
if ( ! is_array( $data ) ) {
return array();
}
$sanitized = array();
foreach ( $data as $index_id => $config ) {
$index = $this->plugin->get_index( $index_id );
// Remove disabled indices.
if ( ! isset( $config['enabled'] ) ) {
continue;
}
$merged_config = array_merge(
$index->get_default_autocomplete_config(),
array(
'position' => (int) $config['position'],
'max_suggestions' => (int) $config['max_suggestions'],
)
);
if ( isset( $config['label'] ) && ! empty( $config['label'] ) ) {
$merged_config['label'] = $config['label'];
}
$sanitized[] = $merged_config;
}
return $sanitized;
}
/**
* Extract index config.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param array $config The config.
* @param string $index_id The index id.
*
* @return mixed|void
*/
private function extract_index_config( array $config, $index_id ) {
foreach ( $config as $entry ) {
if ( $index_id === $entry['index_id'] ) {
return $entry;
}
}
}
/**
* Get config.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return array
*/
public function get_config() {
$settings = $this->plugin->get_settings();
$config = $settings->get_autocomplete_config();
foreach ( $config as $key => &$entry ) {
if ( ! isset( $entry['index_id'] ) ) {
unset( $config[ $key ] );
continue;
}
$index = $this->plugin->get_index( $entry['index_id'] );
if ( null === $index ) {
unset( $config[ $key ] );
continue;
}
$entry['index_name'] = $index->get_name();
$entry['enabled'] = true;
}
/**
* Filters the configuration settings for Autocomplete.
*
* @since 1.0.0
*
* @param array $config Array of configuration options to be used with Autocomplete javascript configuration.
*/
$config = (array) apply_filters( 'algolia_autocomplete_config', $config );
// Remove manually disabled indices.
$config = array_filter(
$config,
function( $item ) {
return (bool) $item['enabled'];
}
);
// Sort the indices.
usort(
$config,
function( $a, $b ):int {
return $a['position'] <=> $b['position'];
}
);
return $config;
}
}
================================================
FILE: includes/class-algolia-cli.php
================================================
<?php
/**
* Algolia_CLI class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_CLI
*
* Push and re-index records into Algolia indices.
*
* @since 1.0.0
*/
class Algolia_CLI {
/**
* The Algolia_Plugin instance.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Plugin
*/
private $plugin;
/**
* Algolia_CLI constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function __construct() {
$this->plugin = Algolia_Plugin_Factory::create();
}
/**
* Push all records to Algolia for a given index.
*
* ## OPTIONS
*
* [<indexName>]
* : The id of the index without the prefix.
*
* [--clear]
* : Clear all existing records prior to pushing the records.
*
* [--all]
* : Re-indexes all the enabled indices.
*
* [--from_batch=<from_batch>]
* : Re-index starting from the provided batch (instead of the first page).
*
* ## EXAMPLES
*
* wp algolia re-index
*
* @alias re-index
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param array $args Positional arguments.
* @param array $assoc_args Associative arguments.
*/
public function reindex( $args, $assoc_args ) {
if ( ! $this->plugin->get_api()->is_reachable() ) {
WP_CLI::error( 'The configuration for this website does not allow to contact the Algolia API.' );
}
$index_id = isset( $args[0] ) ? $args[0] : null;
$clear = WP_CLI\Utils\get_flag_value( $assoc_args, 'clear' );
$all = WP_CLI\Utils\get_flag_value( $assoc_args, 'all' );
$from_batch = intval( WP_CLI\Utils\get_flag_value( $assoc_args, 'from_batch', 1 ) );
if ( ! $index_id && ! $all ) {
WP_CLI::error( 'You need to either provide an index name or specify the --all argument to re-index all enabled indices.' );
}
if ( $index_id && $all ) {
WP_CLI::error( 'You can not give both an index name and the --all parameter.' );
}
if ( $all ) {
$indices = $this->plugin->get_indices(
array(
'enabled' => true,
)
);
} else {
$index = $this->plugin->get_index( $index_id );
if ( ! $index ) {
WP_CLI::error( sprintf( 'Index with id "%s" does not exist. Make sure you don\'t include the prefix.', $index_id ) );
}
$indices = array( $index );
}
foreach ( $indices as $index ) {
$this->do_reindex( $index, $clear, $from_batch );
}
}
/**
* Do reindex.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param Algolia_Index $index Algolia_Index instance.
* @param bool $clear Clear all existing records prior to pushing the records.
* @param int $from_batch The batch to start indexing from.
*
* @return void
*/
private function do_reindex( Algolia_Index $index, $clear, $from_batch ) {
if ( $clear ) {
// translators: the placeholder will contain the name of the index.
WP_CLI::log( sprintf( __( 'About to clear index %s...', 'wp-search-with-algolia' ), $index->get_name() ) );
$index->clear();
// translators: the placeholder will contain the name of the index.
WP_CLI::success( sprintf( __( 'Correctly cleared index "%s".', 'wp-search-with-algolia' ), $index->get_name() ) );
}
$total_pages = $index->get_re_index_max_num_pages() - ( $from_batch - 1 );
if ( 0 > $total_pages ) {
WP_CLI::error( 'from_batch value for re-indexing is out of bounds.' );
return;
}
if ( 0 === $total_pages ) {
$index->re_index( 1 );
WP_CLI::success( sprintf( 'Index %s was created but no entries were sent.', $index->get_name() ) );
return;
}
$progress = WP_CLI\Utils\make_progress_bar( sprintf( 'Processing %s batches of results.', $total_pages ), $total_pages );
$page = $from_batch;
do {
WP_CLI::log( sprintf( 'Indexing batch %s.', $page ) );
$index->re_index( $page++ );
WP_CLI::log( sprintf( 'Indexed batch %s.', ( $page - 1 ) ) );
$progress->tick();
} while ( $page <= ( $total_pages + $from_batch - 1 ) );
$progress->finish();
WP_CLI::success( sprintf( 'Indexed "%s" batches of results inside index "%s"', $total_pages, $index->get_name() ) );
}
}
================================================
FILE: includes/class-algolia-compatibility.php
================================================
<?php
/**
* Algolia_Compatibility class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;
/**
* Class Algolia_Compatibility
*
* @since 1.0.0
*/
class Algolia_Compatibility {
/**
* The "current language" from WPML, if available, else null.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var string|null
*/
private $current_language;
/**
* Algolia_Compatibility constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function __construct() {
add_action( 'algolia_before_get_records', array( $this, 'register_vc_shortcodes' ) );
add_action( 'algolia_before_get_records', array( $this, 'enable_yoast_frontend' ) );
add_action( 'algolia_before_get_records', array( $this, 'wpml_switch_language' ) );
add_action( 'algolia_after_get_records', array( $this, 'wpml_switch_back_language' ) );
add_action( 'algolia_excluded_post_types', [ $this, 'woocommerce_post_types' ] );
add_action( 'algolia_excluded_taxonomies', [ $this, 'woocommerce_internal_taxonomies' ] );
add_filter( 'algolia_is_block_theme', [ $this, 'maybe_block_theme' ] );
}
/**
* Enable Yoast frontend.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function enable_yoast_frontend() {
if ( ! function_exists( 'YoastSEO' ) ) {
return;
}
if (
class_exists( 'Meta_Tags_Context_Memoizer' ) &&
class_exists( 'WPSEO_Replace_Vars' ) &&
class_exists( 'Helpers_Surface' )
) {
YoastSEO()->classes->get( Meta_Tags_Context_Memoizer::class );
YoastSEO()->classes->get( WPSEO_Replace_Vars::class );
YoastSEO()->classes->get( Helpers_Surface::class );
}
}
/**
* Register VC shortcodes.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function register_vc_shortcodes() {
if ( class_exists( 'WPBMap' ) && method_exists( 'WPBMap', 'addAllMappedShortcodes' ) ) {
WPBMap::addAllMappedShortcodes();
}
}
/**
* WPML switch language.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @global \SitePress $sitepress The WPML global SitePress instance.
*
* @param mixed $post Maybe post object.
*
* @return void
*/
public function wpml_switch_language( $post ) {
if ( ! $post instanceof WP_Post || ! $this->is_wpml_enabled() ) {
return;
}
global $sitepress;
$lang_info = wpml_get_language_information( null, $post->ID );
$this->current_language = $sitepress->get_current_language();
$sitepress->switch_lang( $lang_info['language_code'] );
}
/**
* WPML switch back language.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @global \SitePress $sitepress The WPML global SitePress instance.
*
* @param mixed $post Maybe post object.
*
* @return void
*/
public function wpml_switch_back_language( $post ) {
if ( ! $post instanceof WP_Post || ! $this->is_wpml_enabled() ) {
return;
}
global $sitepress;
$sitepress->switch_lang( $this->current_language );
}
/**
* Check if WPML is enabled.
*
* @link https://github.com/algolia/algoliasearch-wordpress/issues/567
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return bool
*/
private function is_wpml_enabled() {
return function_exists( 'icl_object_id' ) && ! class_exists( 'Polylang' );
}
/**
* Add internal WooCommerce post types to our excluded list on Autocomplete page.
*
* @since 2.10.0
*
* @param array $post_types Array of post types to exclude from listing.
* @return array
*/
public function woocommerce_post_types( array $post_types ) {
if ( ! defined( 'WC_PLUGIN_FILE' ) ) {
return $post_types;
}
$post_types[] = 'patterns_ai_data';
$post_types[] = 'shop_order';
$post_types[] = 'shop_order_placehold';
$post_types[] = 'shop_order_refund';
return $post_types;
}
/**
* Add internal WooCommerce taxonomies to our excluded list on Autocomplete page.
*
* @since 2.10.0
*
* @param array $taxonomies Array of taxonomies to exclude from listing.
* @return array
*/
public function woocommerce_internal_taxonomies( array $taxonomies ) {
if ( ! defined( 'WC_PLUGIN_FILE' ) ) {
return $taxonomies;
}
$taxonomies[] = 'product_visibility';
$taxonomies[] = 'product_shipping_class';
return $taxonomies;
}
/**
* Return whether or not the current theme is block based.
*
* @since 2.10.3
*
* @param bool $maybe_block_theme Whether or not a block theme is active.
* @return bool
*/
public function maybe_block_theme( $maybe_block_theme ) {
// return early if it has already been determined.
if ( true === $maybe_block_theme ) {
return $maybe_block_theme;
}
return wp_is_block_theme();
}
}
================================================
FILE: includes/class-algolia-plugin.php
================================================
<?php
/**
* Algolia_Plugin class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Plugin
*
* @since 1.0.0
*/
class Algolia_Plugin {
const NAME = 'algolia';
/**
* Instance of Algolia_API.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_API
*/
protected $api;
/**
* Instance of Algolia_Settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Settings
*/
private $settings;
/**
* Instance of Algolia_Autocomplete_Config.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Autocomplete_Config
*/
private $autocomplete_config;
/**
* Array of indices.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var array
*/
private $indices;
/**
* Array of watchers.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var array
*/
private $changes_watchers;
/**
* Instance of Algolia_Styles.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.5.0
*
* @var Algolia_Styles
*/
private $styles;
/**
* Instance of Algolia_Scripts.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.5.0
*
* @var Algolia_Scripts
*/
private $scripts;
/**
* Instance of Algolia_Update_Messages.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.8.0
*
* @var Algolia_Update_Messages
*/
private $update_messages;
/**
* Instance of Algolia_Template_Loader.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Template_Loader
*/
private $template_loader;
/**
* Instance of Algolia_Admin.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 2.5.4
*
* @var Algolia_Admin
*/
public $admin;
/**
* Instance of Algolia_Compatibility.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Compatibility
*/
private $compatibility;
/**
* Instance of Algoolia_Health_Panel
*
* @since 2.10.0
*
* @var Algolia_Health_Panel
*/
private $health;
/**
* Get the singleton instance of Algolia_Plugin.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
* @deprecated 1.6.0 Use Algolia_Plugin_Factory::create()
* @see Algolia_Plugin_Factory::create()
*
* @return Algolia_Plugin
*/
public static function get_instance() {
_deprecated_function( __METHOD__, '1.6.0', 'Algolia_Plugin_Factory::create();' );
return Algolia_Plugin_Factory::create();
}
/**
* Algolia_Plugin constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function __construct() {
$this->settings = new Algolia_Settings();
$this->api = new Algolia_API( $this->settings );
$this->compatibility = new Algolia_Compatibility();
$this->styles = new Algolia_Styles();
$this->scripts = new Algolia_Scripts();
$this->update_messages = new Algolia_Update_Messages();
add_action( 'init', array( $this, 'load' ), 20 );
}
/**
* Load.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function load() {
if ( $this->api->is_reachable() ) {
$this->load_indices();
$this->override_wordpress_search();
$this->autocomplete_config = new Algolia_Autocomplete_Config( $this );
$this->template_loader = new Algolia_Template_Loader( $this );
}
// Load admin or public part of the plugin.
if ( is_admin() ) {
$this->admin = new Algolia_Admin( $this );
$this->health = new Algolia_Health_Panel( $this );
}
}
/**
* Get the plugin name.
*
* The name of the plugin used to uniquely identify it within the context of
* WordPress and to define internationalization functionality.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return string The name of the plugin.
*/
public function get_name() {
return self::NAME;
}
/**
* Retrieve the version number of the plugin.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return string The version number of the plugin.
*/
public function get_version() {
return ALGOLIA_VERSION;
}
/**
* Get the Aloglia_API.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return Algolia_API
*/
public function get_api() {
return $this->api;
}
/**
* Get the Algolia_Settings.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return Algolia_Settings
*/
public function get_settings() {
return $this->settings;
}
/**
* Override WordPress native search.
*
* Replaces native WordPress search results by Algolia ranked results.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return void
*/
private function override_wordpress_search() {
// Do not override native search if the feature is not enabled.
if ( ! $this->settings->should_override_search_in_backend() ) {
return;
}
$index_id = $this->settings->get_native_search_index_id();
$index = $this->get_index( $index_id );
if ( null === $index ) {
return;
}
new Algolia_Search( $index );
}
/**
* Get the Algolia_Autocomplete_Config.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return Algolia_Autocomplete_Config
*/
public function get_autocomplete_config() {
return $this->autocomplete_config;
}
/**
* Load indices.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function load_indices() {
$synced_indices_ids = $this->settings->get_synced_indices_ids();
$client = $this->get_api()->get_client();
$index_name_prefix = $this->settings->get_index_name_prefix();
// Add a searchable posts index.
$searchable_post_types = get_post_types(
array(
'exclude_from_search' => false,
),
'names'
);
/**
* Filters the array of searchable post types.
*
* @since 1.0.0
*
* @param array $searchable_post_types Array of registered post types that are not excluded from search.
* @return array $value Filtered array of post types.
*/
$searchable_post_types = (array) apply_filters( 'algolia_searchable_post_types', $searchable_post_types );
$this->indices[] = new Algolia_Searchable_Posts_Index( $searchable_post_types );
// Add one posts index per post type.
$post_types = get_post_types();
$excluded_post_types = $this->settings->get_excluded_post_types();
foreach ( $post_types as $post_type ) {
// Skip excluded post types.
if ( in_array( $post_type, $excluded_post_types, true ) ) {
continue;
}
$this->indices[] = new Algolia_Posts_Index( $post_type );
}
// Add one terms index per taxonomy.
$taxonomies = get_taxonomies();
$excluded_taxonomies = $this->settings->get_excluded_taxonomies();
foreach ( $taxonomies as $taxonomy ) {
// Skip excluded taxonomies.
if ( in_array( $taxonomy, $excluded_taxonomies, true ) ) {
continue;
}
$this->indices[] = new Algolia_Terms_Index( $taxonomy );
}
// Add the users index.
$this->indices[] = new Algolia_Users_Index();
/**
* Filters the array of indices to load.
*
* @since 1.0.0
*
* @param array $indices Array of indices to load.
* @return array $value Filtered array of indices.
*/
$this->indices = (array) apply_filters( 'algolia_indices', $this->indices );
foreach ( $this->indices as $index ) {
$index->set_name_prefix( $index_name_prefix );
$index->set_client( $client );
if ( in_array( $index->get_id(), $synced_indices_ids, true ) ) {
$index->set_enabled( true );
if ( $index->contains_only( 'posts' ) ) {
$this->changes_watchers[] = new Algolia_Post_Changes_Watcher( $index );
} elseif ( $index->contains_only( 'terms' ) ) {
$this->changes_watchers[] = new Algolia_Term_Changes_Watcher( $index );
} elseif ( $index->contains_only( 'users' ) ) {
$this->changes_watchers[] = new Algolia_User_Changes_Watcher( $index );
}
}
}
/**
* Filters the array of changes watchers to work with.
*
* @since 1.0.0
*
* @param array $change_watchers Array of watchers to work with.
* @param array $indices Array of indices.
* @return array $value Filtered array of watchers.
*/
$this->changes_watchers = (array) apply_filters( 'algolia_changes_watchers', $this->changes_watchers, $this->indices );
foreach ( $this->changes_watchers as $watcher ) {
$watcher->watch();
}
}
/**
* Get indices.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param array $args Array of arguments.
*
* @return array
*/
public function get_indices( array $args = array() ) {
if ( empty( $args ) ) {
return $this->indices;
}
$indices = $this->indices;
if ( isset( $args['enabled'] ) && true === $args['enabled'] ) {
$indices = array_filter(
$indices,
function( $index ) {
return $index->is_enabled();
}
);
}
if ( isset( $args['contains'] ) ) {
$contains = (string) $args['contains'];
$indices = array_filter(
$indices,
function( $index ) use ( $contains ) {
return $index->contains_only( $contains );
}
);
}
return $indices;
}
/**
* Get index.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $index_id The ID of the index to get.
*
* @return Algolia_Index|null
*/
public function get_index( $index_id ) {
foreach ( $this->indices as $index ) {
if ( $index_id === $index->get_id() ) {
return $index;
}
}
return null;
}
/**
* Get the plugin path.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return string
*/
public function get_path() {
return untrailingslashit( ALGOLIA_PATH );
}
/**
* Get the templates path.
*
* Somewhat misleading method name.
* Actually returns a path segment (directory name) with trailing slash.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
* @deprecated 1.8.0 Use Algolia_Template_Utils::get_filtered_theme_templates_dirname()
* @see Algolia_Template_Utils::get_filtered_theme_templates_dirname()
*
* @return string
*/
public function get_templates_path() {
_deprecated_function(
__METHOD__,
'1.8.0',
'Algolia_Template_Utils::get_filtered_theme_templates_dirname()'
);
return (string) Algolia_Template_Utils::get_filtered_theme_templates_dirname();
}
/**
* Get the Algolia_Template_Loader.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return Algolia_Template_Loader
*/
public function get_template_loader() {
return $this->template_loader;
}
/**
* Get the Algolia_Styles.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.5.0
*
* @return Algolia_Styles
*/
public function get_styles() {
return $this->styles;
}
/**
* Get the Algolia_Scripts.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.5.0
*
* @return Algolia_Scripts
*/
public function get_scripts() {
return $this->scripts;
}
}
================================================
FILE: includes/class-algolia-scripts.php
================================================
<?php
/**
* Algolia_Scripts class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.5.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Scripts
*
* @since 1.5.0
*/
class Algolia_Scripts {
/**
* Algolia_Scripts constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.5.0
*/
public function __construct() {
add_action( 'wp_enqueue_scripts', [ $this, 'register_scripts' ] );
}
/**
* Register scripts.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.5.0
*/
public function register_scripts() {
$in_footer = Algolia_Utils::get_scripts_in_footer_argument();
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
$ais_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG
? '.development'
: '.production';
wp_register_script(
'algolia-search',
ALGOLIA_PLUGIN_URL . 'js/algoliasearch/dist/algoliasearch-lite.umd.js',
[
'underscore',
'wp-util',
],
ALGOLIA_VERSION,
$in_footer
);
wp_register_script(
'algolia-autocomplete',
ALGOLIA_PLUGIN_URL . 'js/autocomplete.js/dist/autocomplete' . $suffix . '.js',
[
'underscore',
'wp-util',
'algolia-search',
],
ALGOLIA_VERSION,
$in_footer
);
wp_register_script(
'algolia-autocomplete-noconflict',
ALGOLIA_PLUGIN_URL . 'js/autocomplete-noconflict.js',
[
'algolia-autocomplete',
],
ALGOLIA_VERSION,
$in_footer
);
wp_register_script(
'algolia-instantsearch',
ALGOLIA_PLUGIN_URL . 'js/instantsearch.js/dist/instantsearch' . $ais_suffix . $suffix . '.js',
[
'underscore',
'wp-util',
'algolia-search',
],
ALGOLIA_VERSION,
$in_footer
);
}
}
================================================
FILE: includes/class-algolia-search.php
================================================
<?php
/**
* Algolia_Search class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
use WebDevStudios\WPSWA\Algolia\AlgoliaSearch\Exceptions\AlgoliaException;
/**
* Class Algolia_Search
*
* @since 1.0.0
*/
class Algolia_Search {
/**
* Current page hits.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var array
*/
private $current_page_hits = [];
/**
* Total hits.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var int
*/
private $total_hits;
/**
* Instance of Algolia_Index.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @var Algolia_Index
*/
private $index;
/**
* Algolia_Search constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param Algolia_Index $index Instance of Algolia_Index.
*/
public function __construct( Algolia_Index $index ) {
$this->index = $index;
add_action( 'loop_start', [ $this, 'begin_highlighting' ] );
add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
add_action( 'wp_head', [ $this, 'output_highlighting_bundled_styles' ] );
}
/**
* Determines if we should filter the query passed as argument.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param WP_Query $query The WP_Query to check.
*
* @return bool
*/
private function should_filter_query( WP_Query $query ) {
$should_filter = ! $query->is_admin && $query->is_search() && $query->is_main_query();
/**
* Allow developers to override the return value of `should_filter_query()`.
*
* @since 1.3.0
*
* @param bool $should_filter Whether Algolia should filter the search query.
* @param WP_Query $query The WP_Query that was tested for Algolia Search filtering.
*/
return (bool) apply_filters(
'algolia_should_filter_query',
$should_filter,
$query
);
}
/**
* We force the WP_Query to only return records according to Algolia's ranking.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param WP_Query $query The WP_Query being filtered.
*
* @return void
*/
public function pre_get_posts( WP_Query $query ) {
if ( ! $this->should_filter_query( $query ) ) {
return;
}
$current_page = 1;
if ( get_query_var( 'paged' ) ) {
$current_page = get_query_var( 'paged' );
} elseif ( get_query_var( 'page' ) ) {
$current_page = get_query_var( 'page' );
}
/**
* Filters the array of parameters used in the Algolia Index search.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
* @since 1.2.0 Introduced 'highlightPreTag' and 'highlightPostTag` parameters.
*
* @param array $params {
* Search parameters for the Algolia Index search.
*
* @type string $attributesToRetrieve Which attributes to retrieve.
* @type int $hitsPerPage Pagination parameter. The number of hits per page to retrieve.
* @type int $page Pagination parameter. The page of results to retrieve.
* @type string $highlightPreTag HTML string to insert before highlights in result snippets.
* @type string $highlightPostTag HTML string to insert after highlights in result snippets.
* }
*/
$params = apply_filters(
'algolia_search_params',
array(
'attributesToRetrieve' => 'post_id',
'hitsPerPage' => (int) get_option( 'posts_per_page' ),
'page' => $current_page - 1, // Algolia pages are zero indexed.
'highlightPreTag' => '<em class="algolia-search-highlight">',
'highlightPostTag' => '</em>',
)
);
/**
* Filters the order by clause for our backend search query.
*
* @since 1.0.0
*
* @param null $value Order by parameter. Default null.
* @return string $value Filtered order by parameter.
*/
$order_by = apply_filters( 'algolia_search_order_by', null );
/**
* Filters the order clause for our backend search query.
*
* @since 1.0.0
*
* @param string $value Order parameter. Default 'desc'.
* @return string $value Filtered order parameter.
*/
$order = apply_filters( 'algolia_search_order', 'desc' );
try {
$results = $this->index->search( $query->query['s'], $params, $order_by, $order );
} catch ( AlgoliaException $exception ) {
error_log( $exception->getMessage() ); // phpcs:ignore -- Legacy.
return;
}
add_filter( 'found_posts', array( $this, 'found_posts' ), 10, 2 );
add_filter( 'posts_search', array( $this, 'posts_search' ), 10, 2 );
// Store the current page hits, so that we can use them for highlighting later on.
foreach ( $results['hits'] as $hit ) {
$this->current_page_hits[ $hit['post_id'] ] = $hit;
}
// Store the total number of its, so that we can hook into the `found_posts`.
// This is useful for pagination.
$this->total_hits = $results['nbHits'];
$post_ids = array();
foreach ( $results['hits'] as $result ) {
$post_ids[] = $result['post_id'];
}
// Make sure there are not results by tricking WordPress in trying to find
// a non existing post ID.
// Otherwise, the query returns all the results.
if ( empty( $post_ids ) ) {
$post_ids = array( 0 );
}
$query->set( 'posts_per_page', $params['hitsPerPage'] );
$query->set( 'offset', 0 );
$post_types = 'any';
$maybe_post_type = filter_input( INPUT_GET, 'post_type', FILTER_SANITIZE_SPECIAL_CHARS );
if ( ! empty( $maybe_post_type ) ) {
$post_type = get_post_type_object( $maybe_post_type );
if ( null !== $post_type ) {
$post_types = $post_type->name;
}
}
$query->set( 'post_type', $post_types );
$query->set( 'post__in', $post_ids );
$query->set( 'orderby', 'post__in' );
// @todo: This actually still excludes trash and auto-drafts.
$query->set( 'post_status', 'any' );
}
/**
* This hook returns the actual real number of results available in Algolia.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param int $found_posts The number of posts found.
* @param WP_Query $query The WP_Query instance (passed by reference).
*
* @return int
*/
public function found_posts( $found_posts, WP_Query $query ) {
return $this->should_filter_query( $query ) ? $this->total_hits : $found_posts;
}
/**
* Filter the search SQL that is used in the WHERE clause of WP_Query.
* Removes the where Like part of the queries as we consider Algolia as being the source of truth.
* We don't want to filter by anything but the actual list of post_ids resulting
* from the Algolia search.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $search Search SQL for WHERE clause.
* @param WP_Query $query The current WP_Query object.
*
* @return string
*/
public function posts_search( $search, WP_Query $query ) {
return $this->should_filter_query( $query ) ? '' : $search;
}
/**
* Output the bundled styles for highlighting search result matches, if enabled.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.2.0
*
* @return void
*/
public function output_highlighting_bundled_styles() {
if ( ! $this->highlighting_enabled() ) {
return;
}
/**
* Filters whether or not to output styling for search highlight.
*
* @since 1.2.0
*
* @param bool $value Whether or not to output styling CSS
* @return bool $value Filtered determination.
*/
if ( ! apply_filters( 'algolia_search_highlighting_enable_bundled_styles', true ) ) {
return;
}
?>
<style>
.algolia-search-highlight {
background-color: #fffbcc;
border-radius: 2px;
font-style: normal;
}
</style>
<?php
}
/**
* Begin highlighting search result matches, if enabled.
*
* This method is called on the loop_start action, where we want to begin highlighting search result matches.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param WP_Query $query The WP_Query.
*
* @return void
*/
public function begin_highlighting( $query ) {
if ( ! $this->should_filter_query( $query ) ) {
return;
}
if ( ! $this->highlighting_enabled() ) {
return;
}
add_filter( 'the_title', [ $this, 'highlight_the_title' ], 10, 2 );
add_filter( 'get_the_excerpt', [ $this, 'highlight_get_the_excerpt' ], 10, 2 );
add_action( 'loop_end', [ $this, 'end_highlighting' ] );
}
/**
* Stop highlighting search result matches.
*
* This method is called on the loop_end action, where we want to stop highlighting search result matches.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param WP_Query $query The WP_Query.
*/
public function end_highlighting( $query ) {
remove_filter( 'the_title', [ $this, 'highlight_the_title' ], 10 );
remove_filter( 'get_the_excerpt', [ $this, 'highlight_get_the_excerpt' ], 10 );
remove_action( 'loop_end', [ $this, 'end_highlighting' ] );
}
/**
* Filter the_title, replacing it with the highlighted title from the Algolia index.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $title The title string.
* @param int $post_id The post ID.
*
* @return string
*/
public function highlight_the_title( $title, $post_id ) {
$highlighted_title = $this->current_page_hits[ $post_id ]['_highlightResult']['post_title']['value'] ?? null;
if ( ! empty( $highlighted_title ) ) {
$title = $highlighted_title;
}
return $title;
}
/**
* Filter get_the_excerpt, replacing it with the highlighted excerpt from the Algolia index.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @param string $excerpt The excerpt string.
* @param WP_Post $post The post object.
*
* @return string
*/
public function highlight_get_the_excerpt( $excerpt, $post ) {
$highlighted_excerpt = $this->current_page_hits[ $post->ID ]['_snippetResult']['content']['value'] ?? null;
if ( ! empty( $highlighted_excerpt ) ) {
$excerpt = $highlighted_excerpt;
}
return $excerpt;
}
/**
* Determine whether highlighting is enabled.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return bool
*/
private function highlighting_enabled() : bool {
/**
* Filters whether or not highlighting is enabled.
*
* @since 1.2.0
*
* @param bool $value Whether or not highlighting is enabled.
* @return mixed $value Determined highlight enabled status.
*/
return apply_filters( 'algolia_search_highlighting_enabled', true );
}
}
================================================
FILE: includes/class-algolia-settings.php
================================================
<?php
/**
* Algolia_Settings class file.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @package WebDevStudios\WPSWA
*/
/**
* Class Algolia_Settings
*
* @since 1.0.0
*/
class Algolia_Settings {
/**
* Algolia_Settings constructor.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*/
public function __construct() {
add_option( 'algolia_application_id', '' );
add_option( 'algolia_search_api_key', '' );
add_option( 'algolia_api_key', '' );
add_option( 'algolia_synced_indices_ids', array() );
add_option( 'algolia_autocomplete_enabled', 'no' );
add_option( 'algolia_autocomplete_debounce', 0 );
add_option( 'algolia_autocomplete_config', array() );
add_option( 'algolia_override_native_search', 'native' );
add_option( 'algolia_instantsearch_template_version', 'legacy' );
add_option( 'algolia_index_name_prefix', 'wp_' );
add_option( 'algolia_api_is_reachable', 'no' );
add_option( 'algolia_powered_by_enabled', 'yes' );
add_option( 'algolia_insights_enabled', 'no' );
}
/**
* Get the Algolia Application ID.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return string
*/
public function get_application_id() {
if ( ! $this->is_application_id_in_config() ) {
return (string) get_option( 'algolia_application_id', '' );
}
$this->assert_constant_is_non_empty_string( ALGOLIA_APPLICATION_ID, 'ALGOLIA_APPLICATION_ID' );
return ALGOLIA_APPLICATION_ID;
}
/**
* Get the Algolia Search-Only API Key.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return string
*/
public function get_search_api_key() {
if ( ! $this->is_search_api_key_in_config() ) {
return (string) get_option( 'algolia_search_api_key', '' );
}
$this->assert_constant_is_non_empty_string( ALGOLIA_SEARCH_API_KEY, 'ALGOLIA_SEARCH_API_KEY' );
return ALGOLIA_SEARCH_API_KEY;
}
/**
* Get the Algolia Admin API Key
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return string
*/
public function get_api_key() {
if ( ! $this->is_api_key_in_config() ) {
return (string) get_option( 'algolia_api_key', '' );
}
$this->assert_constant_is_non_empty_string( ALGOLIA_API_KEY, 'ALGOLIA_API_KEY' );
return ALGOLIA_API_KEY;
}
/**
* Get the excluded post types.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
* @deprecated 1.7.0 Use Algolia_Settings::get_excluded_post_types()
* @see Algolia_Settings::get_excluded_post_types()
*
* @return array
*/
public function get_post_types_blacklist() {
_deprecated_function(
__METHOD__,
'1.7.0',
'Algolia_Settings::get_excluded_post_types();'
);
return $this->get_excluded_post_types();
}
/**
* Get the excluded post types.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.7.0
*
* @return array
*/
public function get_excluded_post_types() {
// Default array of excluded post types.
$excluded = [ 'nav_menu_item' ];
/**
* Filters excluded post types.
*
* @since 1.0.0
* @deprecated 1.7.0 Use {@see 'algolia_excluded_post_types'} instead.
*
* @param array $excluded The excluded post types.
*/
$excluded = (array) apply_filters_deprecated(
'algolia_post_types_blacklist',
[ $excluded ],
'1.7.0',
'algolia_excluded_post_types'
);
/**
* Filters excluded post types.
*
* @since 1.7.0
*
* @param array $excluded The excluded post types.
*/
$excluded = (array) apply_filters( 'algolia_excluded_post_types', $excluded );
// Native WordPress.
$builtin = get_post_types( [ '_builtin' => true ] );
// Preserve posts, pages, and attachments.
unset( $builtin['post'] );
unset( $builtin['page'] );
unset( $builtin['attachment'] );
foreach ( $builtin as $type ) {
$excluded[] = $type;
}
// Native to WordPress VIP platform.
$excluded[] = 'kr_request_token';
$excluded[] = 'kr_access_token';
$excluded[] = 'deprecated_log';
$excluded[] = 'async-scan-result';
$excluded[] = 'scanresult';
return array_unique( $excluded );
}
/**
* Get synced indices IDs.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
*
* @return array
*/
public function get_synced_indices_ids() {
$ids = array();
// Gather indices used in autocomplete experience.
$config = $this->get_autocomplete_config();
foreach ( $config as $index ) {
if ( isset( $index['index_id'] ) ) {
$ids[] = $index['index_id'];
}
}
// Push index used in instantsearch experience.
// Todo: we should allow users to index without using the shipped search UI or backend implementation.
if ( $this->should_override_search_in_backend() || $this->should_override_search_with_instantsearch() ) {
$ids[] = $this->get_native_search_index_id();
}
/**
* Filters the indices IDs that will be synced.
*
* @since 1.0.0
*
* @param array $ids Array of IDs to sync.
* @return array $value Filtered array of IDs.
*/
return (array) apply_filters( 'algolia_get_synced_indices_ids', $ids );
}
/**
* Get excluded taxonomies.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.0.0
* @deprecated 1.7.0 Use Algolia_Settings::get_excluded_taxonomies()
* @see Algolia_Settings::get_excluded_taxonomies()
*
* @return array
*/
public function get_taxonomies_blacklist() {
_deprecated_function(
__METHOD__,
'1.7.0',
'Algolia_Settings::get_excluded_taxonomies();'
);
return $this->get_excluded_taxonomies();
}
/**
* Get excluded taxonomies.
*
* @author WebDevStudios <contact@webdevstudios.com>
* @since 1.7.0
*
* @return array
*/
public function ge
gitextract_z0wy0_zz/ ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── LICENSE.md │ └── MIT-LICENSE.md ├── .gitignore ├── .nvmrc ├── CHANGELOG.md ├── README.txt ├── algolia.php ├── classmap.php ├── composer.json ├── css/ │ ├── algolia-autocomplete.css │ ├── algolia-instantsearch.css │ └── index.php ├── includes/ │ ├── admin/ │ │ ├── class-algolia-admin-page-autocomplete.php │ │ ├── class-algolia-admin-page-native-search.php │ │ ├── class-algolia-admin-page-premium-support.php │ │ ├── class-algolia-admin-page-seo.php │ │ ├── class-algolia-admin-page-settings.php │ │ ├── class-algolia-admin-page-woocommerce.php │ │ ├── class-algolia-admin-template-notices.php │ │ ├── class-algolia-admin.php │ │ ├── css/ │ │ │ ├── algolia-admin.css │ │ │ └── index.php │ │ ├── fonts/ │ │ │ └── index.php │ │ ├── img/ │ │ │ └── index.php │ │ ├── index.php │ │ ├── js/ │ │ │ ├── algolia-admin.js │ │ │ ├── index.php │ │ │ ├── push-settings-button.js │ │ │ └── reindex-button.js │ │ └── partials/ │ │ ├── form-options-premium-support.php │ │ ├── form-options-seo.php │ │ ├── form-options-woocommerce.php │ │ ├── form-options.php │ │ ├── form-override-search-option.php │ │ ├── form-override-search-version-option.php │ │ ├── index.php │ │ ├── page-autocomplete-config.php │ │ ├── page-autocomplete.php │ │ └── page-search.php │ ├── class-algolia-api.php │ ├── class-algolia-autocomplete-config.php │ ├── class-algolia-cli.php │ ├── class-algolia-compatibility.php │ ├── class-algolia-plugin.php │ ├── class-algolia-scripts.php │ ├── class-algolia-search.php │ ├── class-algolia-settings.php │ ├── class-algolia-styles.php │ ├── class-algolia-template-loader.php │ ├── class-algolia-utils.php │ ├── factories/ │ │ ├── class-algolia-http-client-interface-factory.php │ │ ├── class-algolia-plugin-factory.php │ │ └── class-algolia-search-client-factory.php │ ├── index.php │ ├── indices/ │ │ ├── class-algolia-index-replica.php │ │ ├── class-algolia-index.php │ │ ├── class-algolia-posts-index.php │ │ ├── class-algolia-searchable-posts-index.php │ │ ├── class-algolia-terms-index.php │ │ ├── class-algolia-users-index.php │ │ └── index.php │ ├── utilities/ │ │ ├── class-algolia-health-panel.php │ │ ├── class-algolia-template-utils.php │ │ ├── class-algolia-update-messages.php │ │ └── class-algolia-version-utils.php │ └── watchers/ │ ├── class-algolia-changes-watcher.php │ ├── class-algolia-post-changes-watcher.php │ ├── class-algolia-term-changes-watcher.php │ ├── class-algolia-user-changes-watcher.php │ └── index.php ├── index.php ├── js/ │ ├── algoliasearch/ │ │ ├── README.md │ │ ├── dist/ │ │ │ ├── algoliasearch-lite.d.ts │ │ │ ├── algoliasearch-lite.esm.browser.js │ │ │ ├── algoliasearch-lite.umd.js │ │ │ ├── algoliasearch.cjs.js │ │ │ ├── algoliasearch.d.ts │ │ │ ├── algoliasearch.esm.browser.js │ │ │ └── algoliasearch.umd.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── lite.d.ts │ │ ├── lite.js │ │ └── package.json │ ├── autocomplete-noconflict.js │ ├── autocomplete.js/ │ │ ├── CHANGELOG.md │ │ ├── CONTRIBUTING.md │ │ ├── Gruntfile.js │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bower.json │ │ ├── dist/ │ │ │ ├── autocomplete.angular.js │ │ │ ├── autocomplete.jquery.js │ │ │ └── autocomplete.js │ │ ├── examples/ │ │ │ ├── basic.html │ │ │ ├── basic_angular.html │ │ │ ├── basic_jquery.html │ │ │ └── index.html │ │ ├── index.js │ │ ├── index_angular.js │ │ ├── index_jquery.js │ │ ├── karma.conf.js │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── netlify-deploy.js │ │ │ └── release.sh │ │ ├── src/ │ │ │ ├── angular/ │ │ │ │ └── directive.js │ │ │ ├── autocomplete/ │ │ │ │ ├── css.js │ │ │ │ ├── dataset.js │ │ │ │ ├── dropdown.js │ │ │ │ ├── event_bus.js │ │ │ │ ├── event_emitter.js │ │ │ │ ├── html.js │ │ │ │ ├── input.js │ │ │ │ └── typeahead.js │ │ │ ├── common/ │ │ │ │ ├── dom.js │ │ │ │ ├── parseAlgoliaClientVersion.js │ │ │ │ └── utils.js │ │ │ ├── jquery/ │ │ │ │ └── plugin.js │ │ │ ├── sources/ │ │ │ │ ├── hits.js │ │ │ │ ├── index.js │ │ │ │ └── popularIn.js │ │ │ └── standalone/ │ │ │ └── index.js │ │ ├── test/ │ │ │ ├── ci.sh │ │ │ ├── fixtures.js │ │ │ ├── helpers/ │ │ │ │ ├── mocks.js │ │ │ │ └── waits_for.js │ │ │ ├── integration/ │ │ │ │ ├── test.html │ │ │ │ └── test.js │ │ │ ├── playground.css │ │ │ ├── playground.html │ │ │ ├── playground_angular.html │ │ │ ├── playground_jquery.html │ │ │ ├── test.bundle.js │ │ │ └── unit/ │ │ │ ├── angular_spec.js │ │ │ ├── dataset_spec.js │ │ │ ├── dropdown_spec.js │ │ │ ├── event_emitter_spec.js │ │ │ ├── hits_spec.js │ │ │ ├── input_spec.js │ │ │ ├── jquery_spec.js │ │ │ ├── parseAlgoliaClientVersion_spec.js │ │ │ ├── popularIn_spec.js │ │ │ ├── standalone_spec.js │ │ │ ├── typeahead_spec.js │ │ │ └── utils_spec.js │ │ ├── version.js │ │ └── zepto.js │ └── instantsearch.js/ │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── cjs/ │ │ ├── components/ │ │ │ ├── Answers/ │ │ │ │ └── Answers.js │ │ │ ├── Breadcrumb/ │ │ │ │ └── Breadcrumb.js │ │ │ ├── ClearRefinements/ │ │ │ │ └── ClearRefinements.js │ │ │ ├── CurrentRefinements/ │ │ │ │ └── CurrentRefinements.js │ │ │ ├── GeoSearchControls/ │ │ │ │ ├── GeoSearchButton.js │ │ │ │ ├── GeoSearchControls.js │ │ │ │ └── GeoSearchToggle.js │ │ │ ├── Highlight/ │ │ │ │ └── Highlight.js │ │ │ ├── Hits/ │ │ │ │ └── Hits.js │ │ │ ├── InfiniteHits/ │ │ │ │ └── InfiniteHits.js │ │ │ ├── InternalHighlight/ │ │ │ │ └── InternalHighlight.js │ │ │ ├── MenuSelect/ │ │ │ │ └── MenuSelect.js │ │ │ ├── Pagination/ │ │ │ │ ├── Pagination.js │ │ │ │ └── PaginationLink.js │ │ │ ├── Panel/ │ │ │ │ └── Panel.js │ │ │ ├── PoweredBy/ │ │ │ │ └── PoweredBy.js │ │ │ ├── QueryRuleCustomData/ │ │ │ │ └── QueryRuleCustomData.js │ │ │ ├── RangeInput/ │ │ │ │ └── RangeInput.js │ │ │ ├── RefinementList/ │ │ │ │ ├── RefinementList.js │ │ │ │ └── RefinementListItem.js │ │ │ ├── RelevantSort/ │ │ │ │ └── RelevantSort.js │ │ │ ├── ReverseHighlight/ │ │ │ │ └── ReverseHighlight.js │ │ │ ├── ReverseSnippet/ │ │ │ │ └── ReverseSnippet.js │ │ │ ├── SearchBox/ │ │ │ │ └── SearchBox.js │ │ │ ├── Selector/ │ │ │ │ └── Selector.js │ │ │ ├── Slider/ │ │ │ │ ├── Pit.js │ │ │ │ ├── Rheostat.js │ │ │ │ └── Slider.js │ │ │ ├── Snippet/ │ │ │ │ └── Snippet.js │ │ │ ├── Stats/ │ │ │ │ └── Stats.js │ │ │ ├── Template/ │ │ │ │ └── Template.js │ │ │ ├── ToggleRefinement/ │ │ │ │ └── ToggleRefinement.js │ │ │ └── VoiceSearch/ │ │ │ └── VoiceSearch.js │ │ ├── connectors/ │ │ │ ├── answers/ │ │ │ │ └── connectAnswers.js │ │ │ ├── autocomplete/ │ │ │ │ └── connectAutocomplete.js │ │ │ ├── breadcrumb/ │ │ │ │ └── connectBreadcrumb.js │ │ │ ├── clear-refinements/ │ │ │ │ └── connectClearRefinements.js │ │ │ ├── configure/ │ │ │ │ └── connectConfigure.js │ │ │ ├── configure-related-items/ │ │ │ │ └── connectConfigureRelatedItems.js │ │ │ ├── current-refinements/ │ │ │ │ └── connectCurrentRefinements.js │ │ │ ├── dynamic-widgets/ │ │ │ │ └── connectDynamicWidgets.js │ │ │ ├── frequently-bought-together/ │ │ │ │ └── connectFrequentlyBoughtTogether.js │ │ │ ├── geo-search/ │ │ │ │ └── connectGeoSearch.js │ │ │ ├── hierarchical-menu/ │ │ │ │ └── connectHierarchicalMenu.js │ │ │ ├── hits/ │ │ │ │ ├── connectHits.js │ │ │ │ └── connectHitsWithInsights.js │ │ │ ├── hits-per-page/ │ │ │ │ └── connectHitsPerPage.js │ │ │ ├── index.js │ │ │ ├── infinite-hits/ │ │ │ │ ├── connectInfiniteHits.js │ │ │ │ └── connectInfiniteHitsWithInsights.js │ │ │ ├── looking-similar/ │ │ │ │ └── connectLookingSimilar.js │ │ │ ├── menu/ │ │ │ │ └── connectMenu.js │ │ │ ├── numeric-menu/ │ │ │ │ └── connectNumericMenu.js │ │ │ ├── pagination/ │ │ │ │ ├── Paginator.js │ │ │ │ └── connectPagination.js │ │ │ ├── powered-by/ │ │ │ │ └── connectPoweredBy.js │ │ │ ├── query-rules/ │ │ │ │ └── connectQueryRules.js │ │ │ ├── range/ │ │ │ │ └── connectRange.js │ │ │ ├── rating-menu/ │ │ │ │ └── connectRatingMenu.js │ │ │ ├── refinement-list/ │ │ │ │ └── connectRefinementList.js │ │ │ ├── related-products/ │ │ │ │ └── connectRelatedProducts.js │ │ │ ├── relevant-sort/ │ │ │ │ └── connectRelevantSort.js │ │ │ ├── search-box/ │ │ │ │ └── connectSearchBox.js │ │ │ ├── sort-by/ │ │ │ │ └── connectSortBy.js │ │ │ ├── stats/ │ │ │ │ └── connectStats.js │ │ │ ├── toggle-refinement/ │ │ │ │ ├── connectToggleRefinement.js │ │ │ │ └── types.js │ │ │ ├── trending-items/ │ │ │ │ └── connectTrendingItems.js │ │ │ └── voice-search/ │ │ │ └── connectVoiceSearch.js │ │ ├── helpers/ │ │ │ ├── components/ │ │ │ │ ├── Highlight.js │ │ │ │ ├── ReverseHighlight.js │ │ │ │ ├── ReverseSnippet.js │ │ │ │ ├── Snippet.js │ │ │ │ └── index.js │ │ │ ├── get-insights-anonymous-user-token.js │ │ │ ├── highlight.js │ │ │ ├── index.js │ │ │ ├── insights.js │ │ │ ├── reverseHighlight.js │ │ │ ├── reverseSnippet.js │ │ │ └── snippet.js │ │ ├── index.js │ │ ├── lib/ │ │ │ ├── InstantSearch.js │ │ │ ├── createHelpers.js │ │ │ ├── formatNumber.js │ │ │ ├── infiniteHitsCache/ │ │ │ │ ├── index.js │ │ │ │ └── sessionStorage.js │ │ │ ├── insights/ │ │ │ │ ├── client.js │ │ │ │ ├── index.js │ │ │ │ └── listener.js │ │ │ ├── main.js │ │ │ ├── routers/ │ │ │ │ ├── history.js │ │ │ │ └── index.js │ │ │ ├── server.js │ │ │ ├── stateMappings/ │ │ │ │ ├── index.js │ │ │ │ ├── simple.js │ │ │ │ └── singleIndex.js │ │ │ ├── suit.js │ │ │ ├── templating/ │ │ │ │ ├── index.js │ │ │ │ ├── prepareTemplateProps.js │ │ │ │ └── renderTemplate.js │ │ │ ├── utils/ │ │ │ │ ├── addWidgetId.js │ │ │ │ ├── capitalize.js │ │ │ │ ├── checkIndexUiState.js │ │ │ │ ├── checkRendering.js │ │ │ │ ├── clearRefinements.js │ │ │ │ ├── concatHighlightedParts.js │ │ │ │ ├── convertNumericRefinementsToFilters.js │ │ │ │ ├── createConcurrentSafePromise.js │ │ │ │ ├── createSendEventForFacet.js │ │ │ │ ├── createSendEventForHits.js │ │ │ │ ├── cx.js │ │ │ │ ├── debounce.js │ │ │ │ ├── defer.js │ │ │ │ ├── detect-insights-client.js │ │ │ │ ├── documentation.js │ │ │ │ ├── escape-highlight.js │ │ │ │ ├── escape-html.js │ │ │ │ ├── escape.js │ │ │ │ ├── escapeFacetValue.js │ │ │ │ ├── escapeRefinement.js │ │ │ │ ├── find.js │ │ │ │ ├── findIndex.js │ │ │ │ ├── geo-search.js │ │ │ │ ├── getAppIdAndApiKey.js │ │ │ │ ├── getContainerNode.js │ │ │ │ ├── getHighlightFromSiblings.js │ │ │ │ ├── getHighlightedParts.js │ │ │ │ ├── getObjectType.js │ │ │ │ ├── getPropertyByPath.js │ │ │ │ ├── getRefinements.js │ │ │ │ ├── getWidgetAttribute.js │ │ │ │ ├── hits-absolute-position.js │ │ │ │ ├── hits-query-id.js │ │ │ │ ├── hydrateRecommendCache.js │ │ │ │ ├── hydrateSearchClient.js │ │ │ │ ├── index.js │ │ │ │ ├── isDomElement.js │ │ │ │ ├── isEqual.js │ │ │ │ ├── isFacetRefined.js │ │ │ │ ├── isFiniteNumber.js │ │ │ │ ├── isIndexWidget.js │ │ │ │ ├── isPlainObject.js │ │ │ │ ├── isSpecialClick.js │ │ │ │ ├── logger.js │ │ │ │ ├── mergeSearchParameters.js │ │ │ │ ├── noop.js │ │ │ │ ├── omit.js │ │ │ │ ├── prepareTemplateProps.js │ │ │ │ ├── range.js │ │ │ │ ├── render-args.js │ │ │ │ ├── renderTemplate.js │ │ │ │ ├── resolveSearchParameters.js │ │ │ │ ├── reverseHighlightedParts.js │ │ │ │ ├── safelyRunOnBrowser.js │ │ │ │ ├── serializer.js │ │ │ │ ├── setIndexHelperState.js │ │ │ │ ├── toArray.js │ │ │ │ ├── typedObject.js │ │ │ │ ├── unescape.js │ │ │ │ ├── unescapeRefinement.js │ │ │ │ ├── uniq.js │ │ │ │ ├── uuid.js │ │ │ │ └── walkIndex.js │ │ │ ├── version.js │ │ │ └── voiceSearchHelper/ │ │ │ ├── index.js │ │ │ └── types.js │ │ ├── middlewares/ │ │ │ ├── createInsightsMiddleware.js │ │ │ ├── createMetadataMiddleware.js │ │ │ ├── createRouterMiddleware.js │ │ │ └── index.js │ │ ├── templates/ │ │ │ ├── carousel/ │ │ │ │ └── carousel.js │ │ │ └── index.js │ │ ├── types/ │ │ │ ├── algoliasearch.js │ │ │ ├── component.js │ │ │ ├── connector.js │ │ │ ├── index.js │ │ │ ├── insights.js │ │ │ ├── instantsearch.js │ │ │ ├── middleware.js │ │ │ ├── render-state.js │ │ │ ├── results.js │ │ │ ├── router.js │ │ │ ├── templates.js │ │ │ ├── ui-state.js │ │ │ ├── utils.js │ │ │ ├── widget-factory.js │ │ │ └── widget.js │ │ └── widgets/ │ │ ├── analytics/ │ │ │ └── analytics.js │ │ ├── answers/ │ │ │ ├── answers.js │ │ │ └── defaultTemplates.js │ │ ├── breadcrumb/ │ │ │ ├── breadcrumb.js │ │ │ └── defaultTemplates.js │ │ ├── clear-refinements/ │ │ │ ├── clear-refinements.js │ │ │ └── defaultTemplates.js │ │ ├── configure/ │ │ │ └── configure.js │ │ ├── configure-related-items/ │ │ │ └── configure-related-items.js │ │ ├── current-refinements/ │ │ │ └── current-refinements.js │ │ ├── dynamic-widgets/ │ │ │ └── dynamic-widgets.js │ │ ├── frequently-bought-together/ │ │ │ └── frequently-bought-together.js │ │ ├── geo-search/ │ │ │ ├── GeoSearchRenderer.d.js │ │ │ ├── GeoSearchRenderer.js │ │ │ ├── createHTMLMarker.js │ │ │ ├── defaultTemplates.js │ │ │ └── geo-search.js │ │ ├── hierarchical-menu/ │ │ │ ├── defaultTemplates.js │ │ │ └── hierarchical-menu.js │ │ ├── hits/ │ │ │ ├── defaultTemplates.js │ │ │ └── hits.js │ │ ├── hits-per-page/ │ │ │ └── hits-per-page.js │ │ ├── index/ │ │ │ └── index.js │ │ ├── index.js │ │ ├── infinite-hits/ │ │ │ ├── defaultTemplates.js │ │ │ └── infinite-hits.js │ │ ├── looking-similar/ │ │ │ └── looking-similar.js │ │ ├── menu/ │ │ │ ├── defaultTemplates.js │ │ │ └── menu.js │ │ ├── menu-select/ │ │ │ ├── defaultTemplates.js │ │ │ └── menu-select.js │ │ ├── numeric-menu/ │ │ │ ├── defaultTemplates.js │ │ │ └── numeric-menu.js │ │ ├── pagination/ │ │ │ └── pagination.js │ │ ├── panel/ │ │ │ └── panel.js │ │ ├── places/ │ │ │ └── places.js │ │ ├── powered-by/ │ │ │ └── powered-by.js │ │ ├── query-rule-context/ │ │ │ └── query-rule-context.js │ │ ├── query-rule-custom-data/ │ │ │ └── query-rule-custom-data.js │ │ ├── range-input/ │ │ │ └── range-input.js │ │ ├── range-slider/ │ │ │ └── range-slider.js │ │ ├── rating-menu/ │ │ │ ├── defaultTemplates.js │ │ │ └── rating-menu.js │ │ ├── refinement-list/ │ │ │ ├── defaultTemplates.js │ │ │ └── refinement-list.js │ │ ├── related-products/ │ │ │ └── related-products.js │ │ ├── relevant-sort/ │ │ │ ├── defaultTemplates.js │ │ │ └── relevant-sort.js │ │ ├── search-box/ │ │ │ ├── defaultTemplates.js │ │ │ └── search-box.js │ │ ├── sort-by/ │ │ │ └── sort-by.js │ │ ├── stats/ │ │ │ ├── defaultTemplates.js │ │ │ └── stats.js │ │ ├── toggle-refinement/ │ │ │ ├── defaultTemplates.js │ │ │ └── toggle-refinement.js │ │ ├── trending-items/ │ │ │ └── trending-items.js │ │ └── voice-search/ │ │ ├── defaultTemplates.js │ │ └── voice-search.js │ ├── dist/ │ │ ├── instantsearch.development.d.ts │ │ ├── instantsearch.development.js │ │ ├── instantsearch.production.d.ts │ │ └── instantsearch.production.min.d.ts │ ├── es/ │ │ ├── components/ │ │ │ ├── Answers/ │ │ │ │ ├── Answers.d.ts │ │ │ │ └── Answers.js │ │ │ ├── Breadcrumb/ │ │ │ │ ├── Breadcrumb.d.ts │ │ │ │ └── Breadcrumb.js │ │ │ ├── ClearRefinements/ │ │ │ │ ├── ClearRefinements.d.ts │ │ │ │ └── ClearRefinements.js │ │ │ ├── CurrentRefinements/ │ │ │ │ ├── CurrentRefinements.d.ts │ │ │ │ └── CurrentRefinements.js │ │ │ ├── GeoSearchControls/ │ │ │ │ ├── GeoSearchButton.d.ts │ │ │ │ ├── GeoSearchButton.js │ │ │ │ ├── GeoSearchControls.d.ts │ │ │ │ ├── GeoSearchControls.js │ │ │ │ ├── GeoSearchToggle.d.ts │ │ │ │ └── GeoSearchToggle.js │ │ │ ├── Highlight/ │ │ │ │ ├── Highlight.d.ts │ │ │ │ └── Highlight.js │ │ │ ├── Hits/ │ │ │ │ ├── Hits.d.ts │ │ │ │ └── Hits.js │ │ │ ├── InfiniteHits/ │ │ │ │ ├── InfiniteHits.d.ts │ │ │ │ └── InfiniteHits.js │ │ │ ├── InternalHighlight/ │ │ │ │ ├── InternalHighlight.d.ts │ │ │ │ └── InternalHighlight.js │ │ │ ├── MenuSelect/ │ │ │ │ ├── MenuSelect.d.ts │ │ │ │ └── MenuSelect.js │ │ │ ├── Pagination/ │ │ │ │ ├── Pagination.d.ts │ │ │ │ ├── Pagination.js │ │ │ │ └── PaginationLink.js │ │ │ ├── Panel/ │ │ │ │ ├── Panel.d.ts │ │ │ │ └── Panel.js │ │ │ ├── PoweredBy/ │ │ │ │ ├── PoweredBy.d.ts │ │ │ │ └── PoweredBy.js │ │ │ ├── QueryRuleCustomData/ │ │ │ │ ├── QueryRuleCustomData.d.ts │ │ │ │ └── QueryRuleCustomData.js │ │ │ ├── RangeInput/ │ │ │ │ ├── RangeInput.d.ts │ │ │ │ └── RangeInput.js │ │ │ ├── RefinementList/ │ │ │ │ ├── RefinementList.d.ts │ │ │ │ ├── RefinementList.js │ │ │ │ ├── RefinementListItem.d.ts │ │ │ │ └── RefinementListItem.js │ │ │ ├── RelevantSort/ │ │ │ │ ├── RelevantSort.d.ts │ │ │ │ └── RelevantSort.js │ │ │ ├── ReverseHighlight/ │ │ │ │ ├── ReverseHighlight.d.ts │ │ │ │ └── ReverseHighlight.js │ │ │ ├── ReverseSnippet/ │ │ │ │ ├── ReverseSnippet.d.ts │ │ │ │ └── ReverseSnippet.js │ │ │ ├── SearchBox/ │ │ │ │ ├── SearchBox.d.ts │ │ │ │ └── SearchBox.js │ │ │ ├── Selector/ │ │ │ │ ├── Selector.d.ts │ │ │ │ └── Selector.js │ │ │ ├── Slider/ │ │ │ │ ├── Pit.d.ts │ │ │ │ ├── Pit.js │ │ │ │ ├── Rheostat.d.ts │ │ │ │ ├── Rheostat.js │ │ │ │ ├── Slider.d.ts │ │ │ │ └── Slider.js │ │ │ ├── Snippet/ │ │ │ │ ├── Snippet.d.ts │ │ │ │ └── Snippet.js │ │ │ ├── Stats/ │ │ │ │ ├── Stats.d.ts │ │ │ │ └── Stats.js │ │ │ ├── Template/ │ │ │ │ ├── Template.d.ts │ │ │ │ └── Template.js │ │ │ ├── ToggleRefinement/ │ │ │ │ ├── ToggleRefinement.d.ts │ │ │ │ └── ToggleRefinement.js │ │ │ └── VoiceSearch/ │ │ │ ├── VoiceSearch.d.ts │ │ │ └── VoiceSearch.js │ │ ├── connectors/ │ │ │ ├── answers/ │ │ │ │ ├── connectAnswers.d.ts │ │ │ │ └── connectAnswers.js │ │ │ ├── autocomplete/ │ │ │ │ ├── connectAutocomplete.d.ts │ │ │ │ └── connectAutocomplete.js │ │ │ ├── breadcrumb/ │ │ │ │ ├── connectBreadcrumb.d.ts │ │ │ │ └── connectBreadcrumb.js │ │ │ ├── clear-refinements/ │ │ │ │ ├── connectClearRefinements.d.ts │ │ │ │ └── connectClearRefinements.js │ │ │ ├── configure/ │ │ │ │ ├── connectConfigure.d.ts │ │ │ │ └── connectConfigure.js │ │ │ ├── configure-related-items/ │ │ │ │ ├── connectConfigureRelatedItems.d.ts │ │ │ │ └── connectConfigureRelatedItems.js │ │ │ ├── current-refinements/ │ │ │ │ ├── connectCurrentRefinements.d.ts │ │ │ │ └── connectCurrentRefinements.js │ │ │ ├── dynamic-widgets/ │ │ │ │ ├── connectDynamicWidgets.d.ts │ │ │ │ └── connectDynamicWidgets.js │ │ │ ├── frequently-bought-together/ │ │ │ │ ├── connectFrequentlyBoughtTogether.d.ts │ │ │ │ └── connectFrequentlyBoughtTogether.js │ │ │ ├── geo-search/ │ │ │ │ ├── connectGeoSearch.d.ts │ │ │ │ └── connectGeoSearch.js │ │ │ ├── hierarchical-menu/ │ │ │ │ ├── connectHierarchicalMenu.d.ts │ │ │ │ └── connectHierarchicalMenu.js │ │ │ ├── hits/ │ │ │ │ ├── connectHits.d.ts │ │ │ │ ├── connectHits.js │ │ │ │ ├── connectHitsWithInsights.d.ts │ │ │ │ └── connectHitsWithInsights.js │ │ │ ├── hits-per-page/ │ │ │ │ ├── connectHitsPerPage.d.ts │ │ │ │ └── connectHitsPerPage.js │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── infinite-hits/ │ │ │ │ ├── connectInfiniteHits.d.ts │ │ │ │ ├── connectInfiniteHits.js │ │ │ │ ├── connectInfiniteHitsWithInsights.d.ts │ │ │ │ └── connectInfiniteHitsWithInsights.js │ │ │ ├── looking-similar/ │ │ │ │ ├── connectLookingSimilar.d.ts │ │ │ │ └── connectLookingSimilar.js │ │ │ ├── menu/ │ │ │ │ ├── connectMenu.d.ts │ │ │ │ └── connectMenu.js │ │ │ ├── numeric-menu/ │ │ │ │ ├── connectNumericMenu.d.ts │ │ │ │ └── connectNumericMenu.js │ │ │ ├── pagination/ │ │ │ │ ├── Paginator.d.ts │ │ │ │ ├── Paginator.js │ │ │ │ ├── connectPagination.d.ts │ │ │ │ └── connectPagination.js │ │ │ ├── powered-by/ │ │ │ │ ├── connectPoweredBy.d.ts │ │ │ │ └── connectPoweredBy.js │ │ │ ├── query-rules/ │ │ │ │ ├── connectQueryRules.d.ts │ │ │ │ └── connectQueryRules.js │ │ │ ├── range/ │ │ │ │ ├── connectRange.d.ts │ │ │ │ └── connectRange.js │ │ │ ├── rating-menu/ │ │ │ │ ├── connectRatingMenu.d.ts │ │ │ │ └── connectRatingMenu.js │ │ │ ├── refinement-list/ │ │ │ │ ├── connectRefinementList.d.ts │ │ │ │ └── connectRefinementList.js │ │ │ ├── related-products/ │ │ │ │ ├── connectRelatedProducts.d.ts │ │ │ │ └── connectRelatedProducts.js │ │ │ ├── relevant-sort/ │ │ │ │ ├── connectRelevantSort.d.ts │ │ │ │ └── connectRelevantSort.js │ │ │ ├── search-box/ │ │ │ │ ├── connectSearchBox.d.ts │ │ │ │ └── connectSearchBox.js │ │ │ ├── sort-by/ │ │ │ │ ├── connectSortBy.d.ts │ │ │ │ └── connectSortBy.js │ │ │ ├── stats/ │ │ │ │ ├── connectStats.d.ts │ │ │ │ └── connectStats.js │ │ │ ├── toggle-refinement/ │ │ │ │ ├── connectToggleRefinement.d.ts │ │ │ │ ├── connectToggleRefinement.js │ │ │ │ ├── types.d.ts │ │ │ │ └── types.js │ │ │ ├── trending-items/ │ │ │ │ ├── connectTrendingItems.d.ts │ │ │ │ └── connectTrendingItems.js │ │ │ └── voice-search/ │ │ │ ├── connectVoiceSearch.d.ts │ │ │ └── connectVoiceSearch.js │ │ ├── helpers/ │ │ │ ├── components/ │ │ │ │ ├── Highlight.d.ts │ │ │ │ ├── Highlight.js │ │ │ │ ├── ReverseHighlight.d.ts │ │ │ │ ├── ReverseHighlight.js │ │ │ │ ├── ReverseSnippet.d.ts │ │ │ │ ├── ReverseSnippet.js │ │ │ │ ├── Snippet.d.ts │ │ │ │ ├── Snippet.js │ │ │ │ ├── index.d.ts │ │ │ │ └── index.js │ │ │ ├── get-insights-anonymous-user-token.d.ts │ │ │ ├── get-insights-anonymous-user-token.js │ │ │ ├── highlight.d.ts │ │ │ ├── highlight.js │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── insights.d.ts │ │ │ ├── insights.js │ │ │ ├── reverseHighlight.d.ts │ │ │ ├── reverseHighlight.js │ │ │ ├── reverseSnippet.d.ts │ │ │ ├── reverseSnippet.js │ │ │ ├── snippet.d.ts │ │ │ └── snippet.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── lib/ │ │ │ ├── InstantSearch.d.ts │ │ │ ├── InstantSearch.js │ │ │ ├── createHelpers.d.ts │ │ │ ├── createHelpers.js │ │ │ ├── formatNumber.d.ts │ │ │ ├── formatNumber.js │ │ │ ├── infiniteHitsCache/ │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ ├── sessionStorage.d.ts │ │ │ │ └── sessionStorage.js │ │ │ ├── insights/ │ │ │ │ ├── client.d.ts │ │ │ │ ├── client.js │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ ├── listener.d.ts │ │ │ │ └── listener.js │ │ │ ├── main.js │ │ │ ├── routers/ │ │ │ │ ├── history.d.ts │ │ │ │ ├── history.js │ │ │ │ ├── index.d.ts │ │ │ │ └── index.js │ │ │ ├── server.d.ts │ │ │ ├── server.js │ │ │ ├── stateMappings/ │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ ├── simple.d.ts │ │ │ │ ├── simple.js │ │ │ │ ├── singleIndex.d.ts │ │ │ │ └── singleIndex.js │ │ │ ├── suit.d.ts │ │ │ ├── suit.js │ │ │ ├── templating/ │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ ├── prepareTemplateProps.d.ts │ │ │ │ ├── prepareTemplateProps.js │ │ │ │ ├── renderTemplate.d.ts │ │ │ │ └── renderTemplate.js │ │ │ ├── utils/ │ │ │ │ ├── addWidgetId.d.ts │ │ │ │ ├── addWidgetId.js │ │ │ │ ├── capitalize.d.ts │ │ │ │ ├── capitalize.js │ │ │ │ ├── checkIndexUiState.d.ts │ │ │ │ ├── checkIndexUiState.js │ │ │ │ ├── checkRendering.d.ts │ │ │ │ ├── checkRendering.js │ │ │ │ ├── clearRefinements.d.ts │ │ │ │ ├── clearRefinements.js │ │ │ │ ├── concatHighlightedParts.d.ts │ │ │ │ ├── concatHighlightedParts.js │ │ │ │ ├── convertNumericRefinementsToFilters.d.ts │ │ │ │ ├── convertNumericRefinementsToFilters.js │ │ │ │ ├── createConcurrentSafePromise.d.ts │ │ │ │ ├── createConcurrentSafePromise.js │ │ │ │ ├── createSendEventForFacet.d.ts │ │ │ │ ├── createSendEventForFacet.js │ │ │ │ ├── createSendEventForHits.d.ts │ │ │ │ ├── createSendEventForHits.js │ │ │ │ ├── cx.d.ts │ │ │ │ ├── cx.js │ │ │ │ ├── debounce.d.ts │ │ │ │ ├── debounce.js │ │ │ │ ├── defer.d.ts │ │ │ │ ├── defer.js │ │ │ │ ├── detect-insights-client.d.ts │ │ │ │ ├── detect-insights-client.js │ │ │ │ ├── documentation.d.ts │ │ │ │ ├── documentation.js │ │ │ │ ├── escape-highlight.d.ts │ │ │ │ ├── escape-highlight.js │ │ │ │ ├── escape-html.d.ts │ │ │ │ ├── escape-html.js │ │ │ │ ├── escape.d.ts │ │ │ │ ├── escape.js │ │ │ │ ├── escapeFacetValue.d.ts │ │ │ │ ├── escapeFacetValue.js │ │ │ │ ├── escapeRefinement.js │ │ │ │ ├── find.d.ts │ │ │ │ ├── find.js │ │ │ │ ├── findIndex.d.ts │ │ │ │ ├── findIndex.js │ │ │ │ ├── geo-search.d.ts │ │ │ │ ├── geo-search.js │ │ │ │ ├── getAppIdAndApiKey.d.ts │ │ │ │ ├── getAppIdAndApiKey.js │ │ │ │ ├── getContainerNode.d.ts │ │ │ │ ├── getContainerNode.js │ │ │ │ ├── getHighlightFromSiblings.d.ts │ │ │ │ ├── getHighlightFromSiblings.js │ │ │ │ ├── getHighlightedParts.d.ts │ │ │ │ ├── getHighlightedParts.js │ │ │ │ ├── getObjectType.d.ts │ │ │ │ ├── getObjectType.js │ │ │ │ ├── getPropertyByPath.d.ts │ │ │ │ ├── getPropertyByPath.js │ │ │ │ ├── getRefinements.d.ts │ │ │ │ ├── getRefinements.js │ │ │ │ ├── getWidgetAttribute.d.ts │ │ │ │ ├── getWidgetAttribute.js │ │ │ │ ├── hits-absolute-position.d.ts │ │ │ │ ├── hits-absolute-position.js │ │ │ │ ├── hits-query-id.d.ts │ │ │ │ ├── hits-query-id.js │ │ │ │ ├── hydrateRecommendCache.d.ts │ │ │ │ ├── hydrateRecommendCache.js │ │ │ │ ├── hydrateSearchClient.d.ts │ │ │ │ ├── hydrateSearchClient.js │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ ├── isDomElement.d.ts │ │ │ │ ├── isDomElement.js │ │ │ │ ├── isEqual.d.ts │ │ │ │ ├── isEqual.js │ │ │ │ ├── isFacetRefined.d.ts │ │ │ │ ├── isFacetRefined.js │ │ │ │ ├── isFiniteNumber.d.ts │ │ │ │ ├── isFiniteNumber.js │ │ │ │ ├── isIndexWidget.d.ts │ │ │ │ ├── isIndexWidget.js │ │ │ │ ├── isPlainObject.d.ts │ │ │ │ ├── isPlainObject.js │ │ │ │ ├── isSpecialClick.d.ts │ │ │ │ ├── isSpecialClick.js │ │ │ │ ├── logger.d.ts │ │ │ │ ├── logger.js │ │ │ │ ├── mergeSearchParameters.d.ts │ │ │ │ ├── mergeSearchParameters.js │ │ │ │ ├── noop.d.ts │ │ │ │ ├── noop.js │ │ │ │ ├── omit.d.ts │ │ │ │ ├── omit.js │ │ │ │ ├── prepareTemplateProps.d.ts │ │ │ │ ├── prepareTemplateProps.js │ │ │ │ ├── range.d.ts │ │ │ │ ├── range.js │ │ │ │ ├── render-args.d.ts │ │ │ │ ├── render-args.js │ │ │ │ ├── renderTemplate.d.ts │ │ │ │ ├── renderTemplate.js │ │ │ │ ├── resolveSearchParameters.d.ts │ │ │ │ ├── resolveSearchParameters.js │ │ │ │ ├── reverseHighlightedParts.d.ts │ │ │ │ ├── reverseHighlightedParts.js │ │ │ │ ├── safelyRunOnBrowser.d.ts │ │ │ │ ├── safelyRunOnBrowser.js │ │ │ │ ├── serializer.d.ts │ │ │ │ ├── serializer.js │ │ │ │ ├── setIndexHelperState.d.ts │ │ │ │ ├── setIndexHelperState.js │ │ │ │ ├── toArray.d.ts │ │ │ │ ├── toArray.js │ │ │ │ ├── typedObject.d.ts │ │ │ │ ├── typedObject.js │ │ │ │ ├── unescape.d.ts │ │ │ │ ├── unescape.js │ │ │ │ ├── unescapeRefinement.js │ │ │ │ ├── uniq.d.ts │ │ │ │ ├── uniq.js │ │ │ │ ├── uuid.d.ts │ │ │ │ ├── uuid.js │ │ │ │ ├── walkIndex.d.ts │ │ │ │ └── walkIndex.js │ │ │ ├── version.d.ts │ │ │ ├── version.js │ │ │ └── voiceSearchHelper/ │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── types.d.ts │ │ │ └── types.js │ │ ├── middlewares/ │ │ │ ├── createInsightsMiddleware.d.ts │ │ │ ├── createInsightsMiddleware.js │ │ │ ├── createMetadataMiddleware.d.ts │ │ │ ├── createMetadataMiddleware.js │ │ │ ├── createRouterMiddleware.d.ts │ │ │ ├── createRouterMiddleware.js │ │ │ ├── index.d.ts │ │ │ └── index.js │ │ ├── package.json │ │ ├── templates/ │ │ │ ├── carousel/ │ │ │ │ ├── carousel.d.ts │ │ │ │ └── carousel.js │ │ │ ├── index.d.ts │ │ │ └── index.js │ │ ├── types/ │ │ │ ├── algoliasearch.d.ts │ │ │ ├── algoliasearch.js │ │ │ ├── component.d.ts │ │ │ ├── component.js │ │ │ ├── connector.d.ts │ │ │ ├── connector.js │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── insights.d.ts │ │ │ ├── insights.js │ │ │ ├── instantsearch.d.ts │ │ │ ├── instantsearch.js │ │ │ ├── middleware.d.ts │ │ │ ├── middleware.js │ │ │ ├── render-state.d.ts │ │ │ ├── render-state.js │ │ │ ├── results.d.ts │ │ │ ├── results.js │ │ │ ├── router.d.ts │ │ │ ├── router.js │ │ │ ├── templates.d.ts │ │ │ ├── templates.js │ │ │ ├── ui-state.d.ts │ │ │ ├── ui-state.js │ │ │ ├── utils.d.ts │ │ │ ├── utils.js │ │ │ ├── widget-factory.d.ts │ │ │ ├── widget-factory.js │ │ │ ├── widget.d.ts │ │ │ └── widget.js │ │ └── widgets/ │ │ ├── analytics/ │ │ │ ├── analytics.d.ts │ │ │ └── analytics.js │ │ ├── answers/ │ │ │ ├── answers.d.ts │ │ │ ├── answers.js │ │ │ ├── defaultTemplates.d.ts │ │ │ └── defaultTemplates.js │ │ ├── breadcrumb/ │ │ │ ├── breadcrumb.d.ts │ │ │ ├── breadcrumb.js │ │ │ ├── defaultTemplates.d.ts │ │ │ └── defaultTemplates.js │ │ ├── clear-refinements/ │ │ │ ├── clear-refinements.d.ts │ │ │ ├── clear-refinements.js │ │ │ ├── defaultTemplates.d.ts │ │ │ └── defaultTemplates.js │ │ ├── configure/ │ │ │ ├── configure.d.ts │ │ │ └── configure.js │ │ ├── configure-related-items/ │ │ │ ├── configure-related-items.d.ts │ │ │ └── configure-related-items.js │ │ ├── current-refinements/ │ │ │ ├── current-refinements.d.ts │ │ │ └── current-refinements.js │ │ ├── dynamic-widgets/ │ │ │ ├── dynamic-widgets.d.ts │ │ │ └── dynamic-widgets.js │ │ ├── frequently-bought-together/ │ │ │ ├── frequently-bought-together.d.ts │ │ │ └── frequently-bought-together.js │ │ ├── geo-search/ │ │ │ ├── GeoSearchRenderer.d.js │ │ │ ├── GeoSearchRenderer.d.ts │ │ │ ├── GeoSearchRenderer.js │ │ │ ├── createHTMLMarker.d.ts │ │ │ ├── createHTMLMarker.js │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── geo-search.d.ts │ │ │ └── geo-search.js │ │ ├── hierarchical-menu/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── hierarchical-menu.d.ts │ │ │ └── hierarchical-menu.js │ │ ├── hits/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── hits.d.ts │ │ │ └── hits.js │ │ ├── hits-per-page/ │ │ │ ├── hits-per-page.d.ts │ │ │ └── hits-per-page.js │ │ ├── index/ │ │ │ ├── index.d.ts │ │ │ └── index.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── infinite-hits/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── infinite-hits.d.ts │ │ │ └── infinite-hits.js │ │ ├── looking-similar/ │ │ │ ├── looking-similar.d.ts │ │ │ └── looking-similar.js │ │ ├── menu/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── menu.d.ts │ │ │ └── menu.js │ │ ├── menu-select/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── menu-select.d.ts │ │ │ └── menu-select.js │ │ ├── numeric-menu/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── numeric-menu.d.ts │ │ │ └── numeric-menu.js │ │ ├── pagination/ │ │ │ ├── pagination.d.ts │ │ │ └── pagination.js │ │ ├── panel/ │ │ │ ├── panel.d.ts │ │ │ └── panel.js │ │ ├── places/ │ │ │ ├── places.d.ts │ │ │ └── places.js │ │ ├── powered-by/ │ │ │ ├── powered-by.d.ts │ │ │ └── powered-by.js │ │ ├── query-rule-context/ │ │ │ ├── query-rule-context.d.ts │ │ │ └── query-rule-context.js │ │ ├── query-rule-custom-data/ │ │ │ ├── query-rule-custom-data.d.ts │ │ │ └── query-rule-custom-data.js │ │ ├── range-input/ │ │ │ ├── range-input.d.ts │ │ │ └── range-input.js │ │ ├── range-slider/ │ │ │ ├── range-slider.d.ts │ │ │ └── range-slider.js │ │ ├── rating-menu/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── rating-menu.d.ts │ │ │ └── rating-menu.js │ │ ├── refinement-list/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── refinement-list.d.ts │ │ │ └── refinement-list.js │ │ ├── related-products/ │ │ │ ├── related-products.d.ts │ │ │ └── related-products.js │ │ ├── relevant-sort/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── relevant-sort.d.ts │ │ │ └── relevant-sort.js │ │ ├── search-box/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── search-box.d.ts │ │ │ └── search-box.js │ │ ├── sort-by/ │ │ │ ├── sort-by.d.ts │ │ │ └── sort-by.js │ │ ├── stats/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── stats.d.ts │ │ │ └── stats.js │ │ ├── toggle-refinement/ │ │ │ ├── defaultTemplates.d.ts │ │ │ ├── defaultTemplates.js │ │ │ ├── toggle-refinement.d.ts │ │ │ └── toggle-refinement.js │ │ ├── trending-items/ │ │ │ ├── trending-items.d.ts │ │ │ └── trending-items.js │ │ └── voice-search/ │ │ ├── defaultTemplates.d.ts │ │ ├── defaultTemplates.js │ │ ├── voice-search.d.ts │ │ └── voice-search.js │ ├── package.json │ └── scripts/ │ └── transforms/ │ ├── README.md │ ├── __testfixtures__/ │ │ └── addWidget-to-addWidgets/ │ │ ├── global.input.js │ │ ├── global.output.js │ │ ├── imported.input.js │ │ ├── imported.output.js │ │ ├── mixed.input.js │ │ ├── mixed.output.js │ │ ├── remove.input.js │ │ └── remove.output.js │ ├── __tests__/ │ │ └── addWidget-to-addWidgets.test.js │ └── addWidget-to-addWidgets.js ├── languages/ │ ├── index.php │ ├── wp-search-with-algolia-it_IT.mo │ ├── wp-search-with-algolia-it_IT.po │ └── wp-search-with-algolia.pot ├── package.json ├── phpcs.xml ├── templates/ │ ├── autocomplete.php │ ├── instantsearch-modern.php │ └── instantsearch.php ├── uninstall.php ├── vendor_prefixed/ │ ├── .gitignore │ ├── algolia/ │ │ └── algoliasearch-client-php/ │ │ ├── LICENSE │ │ └── src/ │ │ ├── AccountClient.php │ │ ├── Algolia.php │ │ ├── AnalyticsClient.php │ │ ├── Cache/ │ │ │ ├── FileCacheDriver.php │ │ │ └── NullCacheDriver.php │ │ ├── Config/ │ │ │ ├── AbstractConfig.php │ │ │ ├── AnalyticsConfig.php │ │ │ ├── InsightsConfig.php │ │ │ ├── PersonalizationConfig.php │ │ │ ├── PlacesConfig.php │ │ │ ├── RecommendConfig.php │ │ │ ├── RecommendationConfig.php │ │ │ └── SearchConfig.php │ │ ├── Exceptions/ │ │ │ ├── AlgoliaException.php │ │ │ ├── BadRequestException.php │ │ │ ├── CannotWaitException.php │ │ │ ├── MissingObjectId.php │ │ │ ├── NotFoundException.php │ │ │ ├── ObjectNotFoundException.php │ │ │ ├── RequestException.php │ │ │ ├── RetriableException.php │ │ │ ├── UnreachableException.php │ │ │ └── ValidUntilNotFoundException.php │ │ ├── Http/ │ │ │ ├── CurlHttpClient.php │ │ │ ├── GuzzleHttpClient.php │ │ │ ├── HttpClientInterface.php │ │ │ └── Psr7/ │ │ │ ├── BufferStream.php │ │ │ ├── PumpStream.php │ │ │ ├── Request.php │ │ │ ├── Response.php │ │ │ ├── Stream.php │ │ │ ├── Uri.php │ │ │ ├── UriResolver.php │ │ │ └── functions.php │ │ ├── Insights/ │ │ │ └── UserInsightsClient.php │ │ ├── InsightsClient.php │ │ ├── Iterators/ │ │ │ ├── AbstractAlgoliaIterator.php │ │ │ ├── ObjectIterator.php │ │ │ ├── RuleIterator.php │ │ │ └── SynonymIterator.php │ │ ├── Log/ │ │ │ └── DebugLogger.php │ │ ├── PersonalizationClient.php │ │ ├── PlacesClient.php │ │ ├── RecommendClient.php │ │ ├── RecommendationClient.php │ │ ├── RequestOptions/ │ │ │ ├── RequestOptions.php │ │ │ └── RequestOptionsFactory.php │ │ ├── Response/ │ │ │ ├── AbstractResponse.php │ │ │ ├── AddApiKeyResponse.php │ │ │ ├── BatchIndexingResponse.php │ │ │ ├── DeleteApiKeyResponse.php │ │ │ ├── DictionaryResponse.php │ │ │ ├── IndexingResponse.php │ │ │ ├── MultiResponse.php │ │ │ ├── MultipleIndexBatchIndexingResponse.php │ │ │ ├── NullResponse.php │ │ │ ├── RestoreApiKeyResponse.php │ │ │ └── UpdateApiKeyResponse.php │ │ ├── RetryStrategy/ │ │ │ ├── ApiWrapper.php │ │ │ ├── ApiWrapperInterface.php │ │ │ ├── ClusterHosts.php │ │ │ ├── Host.php │ │ │ └── HostCollection.php │ │ ├── SearchClient.php │ │ ├── SearchIndex.php │ │ ├── Support/ │ │ │ ├── Helpers.php │ │ │ └── UserAgent.php │ │ └── functions.php │ ├── autoload-classmap.php │ ├── autoload-files.php │ ├── autoload.php │ └── psr/ │ ├── http-message/ │ │ ├── LICENSE │ │ └── src/ │ │ ├── MessageInterface.php │ │ ├── RequestInterface.php │ │ ├── ResponseInterface.php │ │ ├── ServerRequestInterface.php │ │ ├── StreamInterface.php │ │ ├── UploadedFileInterface.php │ │ └── UriInterface.php │ ├── log/ │ │ ├── LICENSE │ │ └── Psr/ │ │ └── Log/ │ │ ├── AbstractLogger.php │ │ ├── InvalidArgumentException.php │ │ ├── LogLevel.php │ │ ├── LoggerAwareInterface.php │ │ ├── LoggerAwareTrait.php │ │ ├── LoggerInterface.php │ │ ├── LoggerTrait.php │ │ ├── NullLogger.php │ │ └── Test/ │ │ ├── DummyTest.php │ │ ├── LoggerInterfaceTest.php │ │ └── TestLogger.php │ └── simple-cache/ │ ├── LICENSE.md │ └── src/ │ ├── CacheException.php │ ├── CacheInterface.php │ └── InvalidArgumentException.php └── wordfence-vendor.txt
Showing preview only (647K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6275 symbols across 693 files)
FILE: algolia.php
function algolia_php_version_check (line 53) | function algolia_php_version_check() {
function algolia_wp_version_check (line 68) | function algolia_wp_version_check() {
function algolia_is_pro_active (line 83) | function algolia_is_pro_active() {
function algolia_requirements_error_notice (line 96) | function algolia_requirements_error_notice() {
function algolia_load_textdomain (line 129) | function algolia_load_textdomain() {
FILE: includes/admin/class-algolia-admin-page-autocomplete.php
class Algolia_Admin_Page_Autocomplete (line 16) | class Algolia_Admin_Page_Autocomplete {
method __construct (line 86) | public function __construct( Algolia_Settings $settings, Algolia_Autoc...
method add_page (line 103) | public function add_page() {
method add_settings (line 128) | public function add_settings() {
method autocomplete_enabled_callback (line 171) | public function autocomplete_enabled_callback() {
method autocomplete_debounce_callback (line 187) | public function autocomplete_debounce_callback() {
method sanitize_autocomplete_enabled (line 209) | public function sanitize_autocomplete_enabled( $value ) {
method sanitize_autocomplete_debounce (line 231) | public function sanitize_autocomplete_debounce( $value ) {
method autocomplete_config_callback (line 241) | public function autocomplete_config_callback() {
method sanitize_autocomplete_config (line 257) | public function sanitize_autocomplete_config( $values ) {
method display_page (line 267) | public function display_page() {
method display_errors (line 279) | public function display_errors() {
method print_section_settings (line 305) | public function print_section_settings() {
FILE: includes/admin/class-algolia-admin-page-native-search.php
class Algolia_Admin_Page_Native_Search (line 16) | class Algolia_Admin_Page_Native_Search {
method __construct (line 76) | public function __construct( Algolia_Plugin $plugin ) {
method add_page (line 90) | public function add_page() {
method add_settings (line 108) | public function add_settings() {
method override_native_search_callback (line 151) | public function override_native_search_callback() {
method instantsearch_template_version (line 163) | public function instantsearch_template_version() {
method sanitize_override_native_search (line 179) | public function sanitize_override_native_search( $value ) {
method display_page (line 214) | public function display_page() {
method display_errors (line 226) | public function display_errors() {
method print_section_settings (line 260) | public function print_section_settings() {
FILE: includes/admin/class-algolia-admin-page-premium-support.php
class Algolia_Admin_Page_Premium_Support (line 15) | class Algolia_Admin_Page_Premium_Support {
method __construct (line 70) | public function __construct( Algolia_Plugin $plugin ) {
method add_page (line 86) | public function add_page() {
method add_settings (line 105) | public function add_settings() {
method display_page (line 120) | public function display_page() {
method print_section_settings (line 130) | public function print_section_settings() {
FILE: includes/admin/class-algolia-admin-page-seo.php
class Algolia_Admin_Page_SEO (line 15) | class Algolia_Admin_Page_SEO {
method __construct (line 70) | public function __construct( Algolia_Plugin $plugin ) {
method add_page (line 84) | public function add_page() {
method add_settings (line 113) | public function add_settings() {
method display_page (line 128) | public function display_page() {
method print_section_settings (line 138) | public function print_section_settings() {
FILE: includes/admin/class-algolia-admin-page-settings.php
class Algolia_Admin_Page_Settings (line 16) | class Algolia_Admin_Page_Settings {
method __construct (line 76) | public function __construct( Algolia_Plugin $plugin ) {
method add_action_links (line 97) | public function add_action_links( array $links ) {
method add_page (line 114) | public function add_page() {
method add_settings (line 145) | public function add_settings() {
method application_id_callback (line 215) | public function application_id_callback() {
method search_api_key_callback (line 234) | public function search_api_key_callback() {
method api_key_callback (line 253) | public function api_key_callback() {
method index_name_prefix_callback (line 271) | public function index_name_prefix_callback() {
method powered_by_enabled_callback (line 287) | public function powered_by_enabled_callback() {
method insights_enabled_callback (line 302) | public function insights_enabled_callback() {
method sanitize_application_id (line 322) | public function sanitize_application_id( $value ) {
method sanitize_search_api_key (line 350) | public function sanitize_search_api_key( $value ) {
method sanitize_api_key (line 377) | public function sanitize_api_key( $value ) {
method is_valid_index_name_prefix (line 457) | public function is_valid_index_name_prefix( $index_name_prefix ) {
method sanitize_index_name_prefix (line 473) | public function sanitize_index_name_prefix( $value ) {
method sanitize_powered_by_enabled (line 503) | public function sanitize_powered_by_enabled( $value ) {
method sanitize_insights_enabled (line 516) | public function sanitize_insights_enabled( $value ) {
method display_page (line 526) | public function display_page() {
method display_errors (line 536) | public function display_errors() {
method print_section_settings (line 546) | public function print_section_settings() {
FILE: includes/admin/class-algolia-admin-page-woocommerce.php
class Algolia_Admin_Page_WooCommerce (line 15) | class Algolia_Admin_Page_WooCommerce {
method __construct (line 70) | public function __construct( Algolia_Plugin $plugin ) {
method add_page (line 84) | public function add_page() {
method add_settings (line 113) | public function add_settings() {
method display_page (line 128) | public function display_page() {
method print_section_settings (line 138) | public function print_section_settings() {
FILE: includes/admin/class-algolia-admin-template-notices.php
class Algolia_Admin_Template_Notices (line 16) | class Algolia_Admin_Template_Notices {
method __construct (line 24) | public function __construct() {
method template_version_notices (line 36) | public function template_version_notices() {
FILE: includes/admin/class-algolia-admin.php
class Algolia_Admin (line 18) | class Algolia_Admin {
method __construct (line 37) | public function __construct( Algolia_Plugin $plugin ) {
method enqueue_styles (line 79) | public function enqueue_styles() {
method enqueue_scripts (line 89) | public function enqueue_scripts() {
method localize_scripts (line 119) | public function localize_scripts() {
method display_unmet_requirements_notices (line 138) | public function display_unmet_requirements_notices() {
method w3tc_notice (line 168) | public function w3tc_notice() {
method display_reindexing_notices (line 194) | public function display_reindexing_notices() {
method re_index (line 242) | public function re_index() {
method push_settings (line 290) | public function push_settings() {
method algolia_footer (line 325) | public function algolia_footer( $original = '' ) {
method add_pro_menu_item (line 370) | public function add_pro_menu_item() {
method handle_pro_redirect (line 395) | public function handle_pro_redirect() {
FILE: includes/admin/js/algolia-admin.js
function updateAutocompletePositions (line 7) | function updateAutocompletePositions () {
function submenuHighlight (line 22) | function submenuHighlight () {
FILE: includes/admin/js/push-settings-button.js
function handleButtonClick (line 12) | function handleButtonClick(e) {
function disableButton (line 28) | function disableButton($button) {
function enableButton (line 32) | function enableButton($button) {
function pushSettings (line 36) | function pushSettings($clickedButton, index) {
FILE: includes/admin/js/reindex-button.js
function handleReindexButtonClick (line 20) | function handleReindexButtonClick(e) {
function updateIndexingPourcentage (line 37) | function updateIndexingPourcentage($clickedButton, amount) {
function reIndex (line 41) | function reIndex($clickedButton, index, currentPage) {
function resetButton (line 83) | function resetButton($clickedButton) {
FILE: includes/class-algolia-api.php
class Algolia_API (line 19) | class Algolia_API {
method __construct (line 49) | public function __construct( Algolia_Settings $settings ) {
method is_reachable (line 61) | public function is_reachable() {
method get_client (line 85) | public function get_client(): ?SearchClient {
method assert_valid_credentials (line 120) | public static function assert_valid_credentials( $application_id, $api...
method is_valid_credentials (line 174) | public static function is_valid_credentials( $application_id, $api_key...
method is_valid_search_api_key (line 195) | public static function is_valid_search_api_key( $application_id, $sear...
FILE: includes/class-algolia-autocomplete-config.php
class Algolia_Autocomplete_Config (line 16) | class Algolia_Autocomplete_Config {
method __construct (line 36) | public function __construct( Algolia_Plugin $plugin ) {
method get_form_data (line 48) | public function get_form_data() {
method sanitize_form_data (line 96) | public function sanitize_form_data( $data ) {
method extract_index_config (line 141) | private function extract_index_config( array $config, $index_id ) {
method get_config (line 157) | public function get_config() {
FILE: includes/class-algolia-cli.php
class Algolia_CLI (line 18) | class Algolia_CLI {
method __construct (line 36) | public function __construct() {
method reindex (line 69) | public function reindex( $args, $assoc_args ) {
method do_reindex (line 118) | private function do_reindex( Algolia_Index $index, $clear, $from_batch...
FILE: includes/class-algolia-compatibility.php
class Algolia_Compatibility (line 19) | class Algolia_Compatibility {
method __construct (line 37) | public function __construct() {
method enable_yoast_frontend (line 53) | public function enable_yoast_frontend() {
method register_vc_shortcodes (line 75) | public function register_vc_shortcodes() {
method wpml_switch_language (line 93) | public function wpml_switch_language( $post ) {
method wpml_switch_back_language (line 116) | public function wpml_switch_back_language( $post ) {
method is_wpml_enabled (line 136) | private function is_wpml_enabled() {
method woocommerce_post_types (line 148) | public function woocommerce_post_types( array $post_types ) {
method woocommerce_internal_taxonomies (line 168) | public function woocommerce_internal_taxonomies( array $taxonomies ) {
method maybe_block_theme (line 187) | public function maybe_block_theme( $maybe_block_theme ) {
FILE: includes/class-algolia-plugin.php
class Algolia_Plugin (line 16) | class Algolia_Plugin {
method get_instance (line 149) | public static function get_instance() {
method __construct (line 160) | public function __construct() {
method load (line 177) | public function load() {
method get_name (line 203) | public function get_name() {
method get_version (line 215) | public function get_version() {
method get_api (line 227) | public function get_api() {
method get_settings (line 239) | public function get_settings() {
method override_wordpress_search (line 253) | private function override_wordpress_search() {
method get_autocomplete_config (line 277) | public function get_autocomplete_config() {
method load_indices (line 287) | public function load_indices() {
method get_indices (line 393) | public function get_indices( array $args = array() ) {
method get_index (line 432) | public function get_index( $index_id ) {
method get_path (line 450) | public function get_path() {
method get_templates_path (line 467) | public function get_templates_path() {
method get_template_loader (line 484) | public function get_template_loader() {
method get_styles (line 496) | public function get_styles() {
method get_scripts (line 508) | public function get_scripts() {
FILE: includes/class-algolia-scripts.php
class Algolia_Scripts (line 16) | class Algolia_Scripts {
method __construct (line 24) | public function __construct() {
method register_scripts (line 34) | public function register_scripts() {
FILE: includes/class-algolia-search.php
class Algolia_Search (line 18) | class Algolia_Search {
method __construct (line 58) | public function __construct( Algolia_Index $index ) {
method should_filter_query (line 76) | private function should_filter_query( WP_Query $query ) {
method pre_get_posts (line 104) | public function pre_get_posts( WP_Query $query ) {
method found_posts (line 229) | public function found_posts( $found_posts, WP_Query $query ) {
method posts_search (line 247) | public function posts_search( $search, WP_Query $query ) {
method output_highlighting_bundled_styles (line 259) | public function output_highlighting_bundled_styles() {
method begin_highlighting (line 299) | public function begin_highlighting( $query ) {
method end_highlighting (line 324) | public function end_highlighting( $query ) {
method highlight_the_title (line 342) | public function highlight_the_title( $title, $post_id ) {
method highlight_get_the_excerpt (line 363) | public function highlight_get_the_excerpt( $excerpt, $post ) {
method highlighting_enabled (line 381) | private function highlighting_enabled() : bool {
FILE: includes/class-algolia-settings.php
class Algolia_Settings (line 16) | class Algolia_Settings {
method __construct (line 24) | public function __construct() {
method get_application_id (line 48) | public function get_application_id() {
method get_search_api_key (line 67) | public function get_search_api_key() {
method get_api_key (line 86) | public function get_api_key() {
method get_post_types_blacklist (line 107) | public function get_post_types_blacklist() {
method get_excluded_post_types (line 125) | public function get_excluded_post_types() {
method get_synced_indices_ids (line 183) | public function get_synced_indices_ids() {
method get_taxonomies_blacklist (line 221) | public function get_taxonomies_blacklist() {
method get_excluded_taxonomies (line 239) | public function get_excluded_taxonomies() {
method get_autocomplete_enabled (line 286) | public function get_autocomplete_enabled() {
method get_autocomplete_debounce (line 308) | public function get_autocomplete_debounce() {
method get_autocomplete_config (line 329) | public function get_autocomplete_config() {
method get_override_native_search (line 341) | public function get_override_native_search() {
method should_override_search_in_backend (line 360) | public function should_override_search_in_backend() {
method should_override_search_with_instantsearch (line 372) | public function should_override_search_with_instantsearch() {
method get_native_search_index_id (line 394) | public function get_native_search_index_id() {
method get_index_name_prefix (line 415) | public function get_index_name_prefix() {
method assert_constant_is_non_empty_string (line 439) | protected function assert_constant_is_non_empty_string( $value, $const...
method is_application_id_in_config (line 457) | public function is_application_id_in_config() {
method is_search_api_key_in_config (line 469) | public function is_search_api_key_in_config() {
method is_api_key_in_config (line 481) | public function is_api_key_in_config() {
method is_index_name_prefix_in_config (line 492) | public function is_index_name_prefix_in_config() {
method get_api_is_reachable (line 504) | public function get_api_is_reachable() {
method set_api_is_reachable (line 518) | public function set_api_is_reachable( $flag ) {
method is_powered_by_enabled (line 531) | public function is_powered_by_enabled() {
method enable_powered_by (line 543) | public function enable_powered_by() {
method disable_powered_by (line 553) | public function disable_powered_by() {
method is_insights_enabled (line 563) | public function is_insights_enabled() {
method get_instantsearch_template_version (line 574) | public function get_instantsearch_template_version() {
method should_use_instantsearch_modern (line 595) | public function should_use_instantsearch_modern() {
FILE: includes/class-algolia-styles.php
class Algolia_Styles (line 16) | class Algolia_Styles {
method __construct (line 24) | public function __construct() {
method register_styles (line 34) | public function register_styles() {
FILE: includes/class-algolia-template-loader.php
class Algolia_Template_Loader (line 16) | class Algolia_Template_Loader {
method __construct (line 35) | public function __construct( Algolia_Plugin $plugin ) {
method load_algolia_config (line 93) | public function load_algolia_config() {
method should_load_autocomplete (line 154) | private function should_load_autocomplete() {
method enqueue_autocomplete_scripts (line 177) | public function enqueue_autocomplete_scripts() {
method template_loader (line 214) | public function template_loader( $template ) {
method load_instantsearch_assets (line 236) | public function load_instantsearch_assets() {
method load_instantsearch_template (line 266) | public function load_instantsearch_template() {
method load_autocomplete_template (line 281) | public function load_autocomplete_template() {
method locate_template (line 297) | private function locate_template( $file ) {
FILE: includes/class-algolia-utils.php
class Algolia_Utils (line 16) | class Algolia_Utils {
method get_term_parents (line 32) | public static function get_term_parents( $id, $taxonomy, $separator = ...
method get_taxonomy_tree (line 78) | public static function get_taxonomy_tree( array $terms, $taxonomy, $se...
method get_post_images (line 115) | public static function get_post_images( $post_id ) {
method prepare_content (line 175) | public static function prepare_content( $content ) {
method remove_content_noise (line 191) | public static function remove_content_noise( $content ) {
method explode_content (line 249) | public static function explode_content( $content ) {
method get_scripts_in_footer_argument (line 288) | public static function get_scripts_in_footer_argument() {
method pro_cta_content (line 310) | public static function pro_cta_content() {
FILE: includes/factories/class-algolia-http-client-interface-factory.php
class Algolia_Http_Client_Interface_Factory (line 20) | class Algolia_Http_Client_Interface_Factory {
method create (line 30) | public static function create(): HttpClientInterface {
method create_php53_http_client (line 60) | public static function create_php53_http_client(): HttpClientInterface {
method create_http_client (line 83) | public static function create_http_client(): HttpClientInterface {
FILE: includes/factories/class-algolia-plugin-factory.php
class Algolia_Plugin_Factory (line 16) | class Algolia_Plugin_Factory {
method create (line 26) | public static function create(): Algolia_Plugin {
FILE: includes/factories/class-algolia-search-client-factory.php
class Algolia_Search_Client_Factory (line 19) | class Algolia_Search_Client_Factory {
method create (line 32) | public static function create( string $app_id, string $api_key ): Sear...
FILE: includes/indices/class-algolia-index-replica.php
class Algolia_Index_Replica (line 16) | class Algolia_Index_Replica {
method __construct (line 52) | public function __construct( $attribute_name, $order ) {
method get_replica_index_name (line 72) | public function get_replica_index_name( Algolia_Index $index ) {
method get_ranking (line 84) | public function get_ranking() {
method get_attribute_name (line 96) | public function get_attribute_name() {
method get_order (line 108) | public function get_order() {
FILE: includes/indices/class-algolia-index.php
class Algolia_Index (line 20) | abstract class Algolia_Index {
method get_admin_name (line 80) | abstract public function get_admin_name();
method contains_only (line 92) | final public function contains_only( $type ) {
method supports (line 115) | abstract public function supports( $item );
method assert_is_supported (line 127) | public function assert_is_supported( $item ) {
method set_client (line 141) | final public function set_client( SearchClient $client ) {
method get_client (line 155) | final protected function get_client() {
method search (line 176) | final public function search( $query, $args = null, $order_by = null, ...
method search_in_replica (line 198) | private function search_in_replica( $query, $args, $order_by, $order =...
method get_replica (line 220) | private function get_replica( $attribute_name, $order ) {
method set_enabled (line 247) | final public function set_enabled( $flag ) {
method is_enabled (line 259) | final public function is_enabled() {
method set_name_prefix (line 271) | final public function set_name_prefix( $prefix ) {
method sync (line 285) | public function sync( $item ) {
method should_index (line 325) | abstract protected function should_index( $item );
method get_records (line 337) | abstract protected function get_records( $item );
method update_records (line 350) | protected function update_records( $item, array $records ) {
method get_index (line 410) | public function get_index() {
method get_name (line 424) | public function get_name( $prefix = null ) {
method re_index (line 444) | public function re_index( $page, $specific_ids = [] ) {
method create_index_if_not_existing (line 566) | public function create_index_if_not_existing( $clear_if_existing = tru...
method push_settings (line 628) | public function push_settings() {
method sanitize_json_data (line 661) | protected function sanitize_json_data( $data ) {
method get_re_index_items_count (line 673) | abstract protected function get_re_index_items_count();
method is_last_page_to_re_index (line 685) | protected function is_last_page_to_re_index( $page ) {
method get_re_index_max_num_pages (line 697) | public function get_re_index_max_num_pages() {
method de_index_items (line 710) | public function de_index_items() {
method get_re_index_batch_size (line 732) | public function get_re_index_batch_size() {
method get_settings (line 767) | abstract protected function get_settings();
method get_synonyms (line 777) | abstract protected function get_synonyms();
method get_id (line 787) | abstract public function get_id();
method get_items (line 801) | abstract protected function get_items( $page, $batch_size, $specific_i...
method get_default_autocomplete_config (line 811) | public function get_default_autocomplete_config() {
method to_array (line 835) | public function to_array() {
method get_replicas (line 861) | public function get_replicas() {
method sync_replicas (line 905) | private function sync_replicas() {
method delete_item (line 961) | abstract public function delete_item( $item );
method exists (line 976) | public function exists() {
method clear (line 998) | public function clear() {
FILE: includes/indices/class-algolia-posts-index.php
class Algolia_Posts_Index (line 16) | final class Algolia_Posts_Index extends Algolia_Index {
method __construct (line 46) | public function __construct( $post_type ) {
method supports (line 65) | public function supports( $item ) {
method get_default_autocomplete_config (line 77) | public function get_default_autocomplete_config() {
method get_admin_name (line 108) | public function get_admin_name() {
method should_index (line 124) | protected function should_index( $item ) {
method should_index_post (line 138) | private function should_index_post( WP_Post $post ) {
method get_records (line 176) | protected function get_records( $item ) {
method get_post_records (line 195) | private function get_post_records( WP_Post $post ) {
method get_post_shared_attributes (line 273) | private function get_post_shared_attributes( WP_Post $post ) {
method get_settings (line 370) | protected function get_settings() {
method get_synonyms (line 448) | protected function get_synonyms() {
method get_post_object_id (line 487) | private function get_post_object_id( $post_id, $record_index ) {
method update_records (line 514) | protected function update_records( $item, array $records ) {
method update_post_records (line 527) | private function update_post_records( WP_Post $post, array $records ) {
method get_id (line 584) | public function get_id() {
method get_re_index_items_count (line 596) | protected function get_re_index_items_count() {
method get_items (line 623) | protected function get_items( $page, $batch_size, $specific_ids = [] ) {
method delete_item (line 650) | public function delete_item( $item, $wait = false ) {
method get_post_records_count (line 681) | private function get_post_records_count( $post_id ) {
method set_post_records_count (line 694) | private function set_post_records_count( WP_Post $post, $count ) {
FILE: includes/indices/class-algolia-searchable-posts-index.php
class Algolia_Searchable_Posts_Index (line 16) | final class Algolia_Searchable_Posts_Index extends Algolia_Index {
method __construct (line 46) | public function __construct( array $post_types ) {
method supports (line 65) | public function supports( $item ) {
method get_default_autocomplete_config (line 77) | public function get_default_autocomplete_config() {
method get_admin_name (line 108) | public function get_admin_name() {
method should_index (line 122) | protected function should_index( $item ) {
method should_index_post (line 136) | private function should_index_post( WP_Post $post ) {
method get_records (line 163) | protected function get_records( $item ) {
method get_post_records (line 182) | private function get_post_records( WP_Post $post ) {
method get_post_shared_attributes (line 262) | private function get_post_shared_attributes( WP_Post $post ) {
method get_settings (line 354) | protected function get_settings() {
method get_synonyms (line 420) | protected function get_synonyms() {
method get_post_object_id (line 445) | private function get_post_object_id( $post_id, $record_index ) {
method update_records (line 470) | protected function update_records( $item, array $records ) {
method update_post_records (line 483) | private function update_post_records( WP_Post $post, array $records ) {
method get_id (line 540) | public function get_id() {
method get_re_index_items_count (line 552) | protected function get_re_index_items_count() {
method get_items (line 579) | public function get_items( $page, $batch_size, $specific_ids = [] ) {
method delete_item (line 609) | public function delete_item( $item, $wait = false ) {
method get_post_records_count (line 640) | private function get_post_records_count( $post_id ) {
method set_post_records_count (line 652) | private function set_post_records_count( WP_Post $post, $count ) {
FILE: includes/indices/class-algolia-terms-index.php
class Algolia_Terms_Index (line 16) | final class Algolia_Terms_Index extends Algolia_Index {
method __construct (line 46) | public function __construct( $taxonomy ) {
method get_admin_name (line 58) | public function get_admin_name() {
method should_index (line 74) | protected function should_index( $item ) {
method get_records (line 102) | protected function get_records( $item ) {
method get_re_index_items_count (line 152) | protected function get_re_index_items_count() {
method get_settings (line 164) | protected function get_settings() {
method get_synonyms (line 227) | protected function get_synonyms() {
method get_id (line 248) | public function get_id() {
method get_items (line 265) | protected function get_items( $page, $batch_size, $specific_ids = [] ) {
method supports (line 299) | public function supports( $item ) {
method get_default_autocomplete_config (line 314) | public function get_default_autocomplete_config() {
method delete_item (line 348) | public function delete_item( $item ) {
FILE: includes/indices/class-algolia-users-index.php
class Algolia_Users_Index (line 16) | final class Algolia_Users_Index extends Algolia_Index {
method get_admin_name (line 36) | public function get_admin_name() {
method should_index (line 50) | protected function should_index( $item ) {
method get_records (line 81) | protected function get_records( $item ) {
method get_re_index_items_count (line 130) | protected function get_re_index_items_count() {
method get_settings (line 144) | protected function get_settings() {
method get_synonyms (line 193) | protected function get_synonyms() {
method get_id (line 214) | public function get_id() {
method get_items (line 231) | protected function get_items( $page, $batch_size, $specific_ids = [] ) {
method supports (line 264) | public function supports( $item ) {
method get_default_autocomplete_config (line 276) | public function get_default_autocomplete_config() {
method delete_item (line 310) | public function delete_item( $item ) {
FILE: includes/utilities/class-algolia-health-panel.php
class Algolia_Health_Panel (line 15) | class Algolia_Health_Panel {
method __construct (line 30) | public function __construct( Algolia_Plugin $plugin ) {
method health_panel (line 44) | public function health_panel( array $debug_info ) {
method get_constants (line 84) | protected function get_constants() : array {
FILE: includes/utilities/class-algolia-template-utils.php
class Algolia_Template_Utils (line 14) | class Algolia_Template_Utils {
method get_plugin_templates_dirname (line 55) | public static function get_plugin_templates_dirname() {
method get_theme_templates_dirname (line 67) | public static function get_theme_templates_dirname() {
method get_filtered_theme_templates_dirname (line 79) | public static function get_filtered_theme_templates_dirname() {
method get_default_template (line 123) | public static function get_default_template( $file ) {
method get_filtered_default_template (line 137) | public static function get_filtered_default_template( $file ) {
method locate_template (line 169) | public static function locate_template( $file ) {
method get_template_version (line 246) | public static function get_template_version( $template ): ?string {
method get_template_file_names (line 288) | public static function get_template_file_names(): array {
method get_core_template_paths (line 300) | public static function get_core_template_paths(): array {
method get_located_template_paths (line 325) | public static function get_located_template_paths(): array {
method get_custom_template_paths (line 346) | public static function get_custom_template_paths(): array {
FILE: includes/utilities/class-algolia-update-messages.php
class Algolia_Update_Messages (line 16) | class Algolia_Update_Messages {
method __construct (line 24) | public function __construct() {
method in_plugin_update_message (line 68) | public function in_plugin_update_message( $plugin_data, $response ) {
FILE: includes/utilities/class-algolia-version-utils.php
class Algolia_Version_Utils (line 16) | class Algolia_Version_Utils {
method parse_semver_version_string (line 60) | public static function parse_semver_version_string( string $version ):...
method get_major_version (line 81) | public static function get_major_version( string $version ): ?int {
method get_minor_version (line 100) | public static function get_minor_version( string $version ): ?int {
method get_patch_version (line 119) | public static function get_patch_version( string $version ): ?int {
FILE: includes/watchers/class-algolia-changes-watcher.php
type Algolia_Changes_Watcher (line 16) | interface Algolia_Changes_Watcher {
method watch (line 24) | public function watch();
FILE: includes/watchers/class-algolia-post-changes-watcher.php
class Algolia_Post_Changes_Watcher (line 18) | class Algolia_Post_Changes_Watcher implements Algolia_Changes_Watcher {
method __construct (line 98) | public function __construct( Algolia_Index $index ) {
method watch (line 108) | public function watch() {
method sync_item (line 143) | public function sync_item( $post_id ) {
method check_slug_update (line 184) | public function check_slug_update( $post_id, $post_data ) {
method delete_item (line 215) | public function delete_item( $post_id ) {
method on_meta_change (line 243) | public function on_meta_change( $meta_id, $object_id, $meta_key, $meta...
method track_updated_posts (line 273) | public function track_updated_posts( $post_id ) {
method sync_item_for_pmxi (line 292) | public function sync_item_for_pmxi( $import_id ) {
FILE: includes/watchers/class-algolia-term-changes-watcher.php
class Algolia_Term_Changes_Watcher (line 17) | class Algolia_Term_Changes_Watcher implements Algolia_Changes_Watcher {
method __construct (line 46) | public function __construct( Algolia_Index $index ) {
method watch (line 56) | public function watch() {
method sync_term_posts (line 86) | public function sync_term_posts( $term_id, $tt_id, $taxonomy ) {
method get_searchable_indexes (line 141) | private function get_searchable_indexes( $post_types ) {
method sync_posts (line 179) | public function sync_posts( $posts ) {
method sync_item (line 201) | public function sync_item( $term_id ) {
method handle_changes (line 232) | public function handle_changes( $object_id, $terms, $tt_ids, $taxonomy...
method on_delete_term (line 254) | public function on_delete_term( $term, $tt_id, $taxonomy, $deleted_ter...
method on_meta_change (line 278) | public function on_meta_change( $meta_id, $object_id, $meta_key, $meta...
method large_count_notice (line 307) | public function large_count_notice() {
FILE: includes/watchers/class-algolia-user-changes-watcher.php
class Algolia_User_Changes_Watcher (line 18) | class Algolia_User_Changes_Watcher implements Algolia_Changes_Watcher {
method __construct (line 38) | public function __construct( Algolia_Index $index ) {
method watch (line 48) | public function watch() {
method sync_item (line 81) | public function sync_item( $user_id ) {
method delete_item (line 109) | public function delete_item( $user_id ) {
method on_save_post (line 132) | public function on_save_post( $post_id, WP_Post $post ) {
method on_delete_post (line 146) | public function on_delete_post( $post_id ) {
method on_meta_change (line 180) | public function on_meta_change( $meta_id, $object_id, $meta_key, $meta...
FILE: js/algoliasearch/dist/algoliasearch-lite.d.ts
type AlgoliaSearchOptions (line 24) | type AlgoliaSearchOptions = Partial<ClientTransporterOptions> & WithoutC...
type Credentials (line 26) | type Credentials = {
type SearchClient (line 31) | type SearchClient = SearchClient_2 & {
type SearchIndex (line 41) | type SearchIndex = SearchIndex_2 & {
type WithoutCredentials (line 47) | type WithoutCredentials<TClientOptions extends Credentials> = Omit<TClie...
FILE: js/algoliasearch/dist/algoliasearch-lite.esm.browser.js
function createBrowserLocalStorageCache (line 1) | function createBrowserLocalStorageCache(options) {
function createFallbackableCache (line 80) | function createFallbackableCache(options) {
function createNullCache (line 112) | function createNullCache() {
function createInMemoryCache (line 134) | function createInMemoryCache(options = { serializable: true }) {
function createAuth (line 166) | function createAuth(authMode, appId, apiKey) {
function shuffle (line 182) | function shuffle(array) {
function addMethods (line 193) | function addMethods(base, methods) {
function encode (line 203) | function encode(format, ...args) {
function createMappedRequestOptions (line 222) | function createMappedRequestOptions(requestOptions, timeout) {
constant EXPIRATION_DELAY (line 262) | const EXPIRATION_DELAY = 2 * 60 * 1000;
function createStatefulHost (line 263) | function createStatefulHost(host, status = HostStatusEnum.Up) {
function isStatefulHostUp (line 270) | function isStatefulHostUp(host) {
function isStatefulHostTimeouted (line 273) | function isStatefulHostTimeouted(host) {
function createStatelessHost (line 277) | function createStatelessHost(options) {
function createRetryableOptions (line 299) | function createRetryableOptions(hostsCache, statelessHosts) {
function retryableRequest (line 358) | function retryableRequest(transporter, statelessHosts, request, requestO...
function createTransporter (line 461) | function createTransporter(options) {
function createUserAgent (line 557) | function createUserAgent(version) {
function deserializeSuccess (line 572) | function deserializeSuccess(response) {
function deserializeFailure (line 581) | function deserializeFailure({ content, status }, stackFrame) {
function serializeUrl (line 594) | function serializeUrl(host, path, queryParameters) {
function serializeQueryParameters (line 603) | function serializeQueryParameters(parameters) {
function serializeData (line 610) | function serializeData(request, requestOptions) {
function serializeHeaders (line 620) | function serializeHeaders(transporter, requestOptions) {
function stackTraceWithoutCredentials (line 635) | function stackTraceWithoutCredentials(stackTrace) {
function stackFrameWithoutCredentials (line 638) | function stackFrameWithoutCredentials(stackFrame) {
function createApiError (line 654) | function createApiError(message, status, transporterStackTrace) {
function createDeserializationError (line 663) | function createDeserializationError(message, response) {
function createRetryError (line 671) | function createRetryError(transporterStackTrace) {
method addAlgoliaAgent (line 705) | addAlgoliaAgent(segment, version) {
method clearCache (line 708) | clearCache() {
function createConsoleLogger (line 818) | function createConsoleLogger(logLevel) {
function createBrowserXhrRequester (line 839) | function createBrowserXhrRequester() {
function algoliasearch (line 895) | function algoliasearch(appId, apiKey, options) {
FILE: js/algoliasearch/dist/algoliasearch-lite.umd.js
function e (line 2) | function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enume...
function t (line 2) | function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){va...
function r (line 2) | function r(r){for(var n=1;n<arguments.length;n++){var o=null!=arguments[...
function n (line 2) | function n(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)r...
function o (line 2) | function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||fun...
function a (line 2) | function a(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new ...
function u (line 2) | function u(e){var t,r="algoliasearch-client-js-".concat(e.key),n=functio...
function i (line 2) | function i(e){var t=a(e.caches),r=t.shift();return void 0===r?{get:funct...
function s (line 2) | function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0...
function c (line 2) | function c(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random...
function l (line 2) | function l(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](...
function f (line 2) | function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;...
function h (line 2) | function h(e,t){var r=e||{},n=r.data||{};return Object.keys(r).forEach((...
function y (line 2) | function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
function b (line 2) | function b(e){return"string"==typeof e?{protocol:"https",url:e,accept:d....
function q (line 2) | function q(e,t){return Promise.all(t.map((function(t){return e.get(t,(fu...
function j (line 2) | function j(e,t,n,o){var u=[],i=function(e,t){if(e.method===O||void 0===e...
function w (line 2) | function w(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:...
function S (line 2) | function S(e,t,r){var n=T(r),o="".concat(e.protocol,"://").concat(e.url,...
function T (line 2) | function T(e){return Object.keys(e).map((function(t){return f("%s=%s",t,...
function A (line 2) | function A(e){return e.map((function(e){return N(e)}))}
function N (line 2) | function N(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-a...
function Q (line 2) | function Q(e,t,n){var o,a={appId:e,apiKey:t,timeouts:{connect:1,read:2,w...
FILE: js/algoliasearch/dist/algoliasearch.cjs.js
function algoliasearch (line 13) | function algoliasearch(appId, apiKey, options) {
FILE: js/algoliasearch/dist/algoliasearch.d.ts
type AlgoliaSearchOptions (line 112) | type AlgoliaSearchOptions = Partial<ClientTransporterOptions> & WithoutC...
type AnalyticsClient (line 114) | type AnalyticsClient = AnalyticsClient_2 & {
type Credentials (line 122) | type Credentials = {
type InitAnalyticsOptions (line 127) | type InitAnalyticsOptions = Partial<ClientTransporterOptions> & Optional...
type InitPersonalizationOptions (line 129) | type InitPersonalizationOptions = Partial<ClientTransporterOptions> & Op...
type InitRecommendationOptions (line 134) | type InitRecommendationOptions = InitPersonalizationOptions;
type OptionalCredentials (line 136) | type OptionalCredentials<TClientOptions extends Credentials> = Omit<TCli...
type PersonalizationClient (line 138) | type PersonalizationClient = PersonalizationClient_2 & {
type RecommendationClient (line 146) | type RecommendationClient = PersonalizationClient;
type SearchClient (line 148) | type SearchClient = SearchClient_2 & {
type SearchIndex (line 203) | type SearchIndex = SearchIndex_2 & {
type WithoutCredentials (line 245) | type WithoutCredentials<TClientOptions extends Credentials> = Omit<TClie...
FILE: js/algoliasearch/dist/algoliasearch.esm.browser.js
function createBrowserLocalStorageCache (line 1) | function createBrowserLocalStorageCache(options) {
function createFallbackableCache (line 80) | function createFallbackableCache(options) {
function createNullCache (line 112) | function createNullCache() {
function createInMemoryCache (line 134) | function createInMemoryCache(options = { serializable: true }) {
function createAuth (line 166) | function createAuth(authMode, appId, apiKey) {
function createRetryablePromise (line 181) | function createRetryablePromise(callback) {
function createWaitablePromise (line 194) | function createWaitablePromise(promise, wait = (_response, _requestOptio...
function shuffle (line 208) | function shuffle(array) {
function addMethods (line 219) | function addMethods(base, methods) {
function encode (line 229) | function encode(format, ...args) {
function createMappedRequestOptions (line 248) | function createMappedRequestOptions(requestOptions, timeout) {
constant EXPIRATION_DELAY (line 288) | const EXPIRATION_DELAY = 2 * 60 * 1000;
function createStatefulHost (line 289) | function createStatefulHost(host, status = HostStatusEnum.Up) {
function isStatefulHostUp (line 296) | function isStatefulHostUp(host) {
function isStatefulHostTimeouted (line 299) | function isStatefulHostTimeouted(host) {
function createStatelessHost (line 303) | function createStatelessHost(options) {
function createRetryableOptions (line 325) | function createRetryableOptions(hostsCache, statelessHosts) {
function retryableRequest (line 384) | function retryableRequest(transporter, statelessHosts, request, requestO...
function createTransporter (line 487) | function createTransporter(options) {
function createUserAgent (line 583) | function createUserAgent(version) {
function deserializeSuccess (line 598) | function deserializeSuccess(response) {
function deserializeFailure (line 607) | function deserializeFailure({ content, status }, stackFrame) {
function serializeUrl (line 620) | function serializeUrl(host, path, queryParameters) {
function serializeQueryParameters (line 629) | function serializeQueryParameters(parameters) {
function serializeData (line 636) | function serializeData(request, requestOptions) {
function serializeHeaders (line 646) | function serializeHeaders(transporter, requestOptions) {
function stackTraceWithoutCredentials (line 661) | function stackTraceWithoutCredentials(stackTrace) {
function stackFrameWithoutCredentials (line 664) | function stackFrameWithoutCredentials(stackFrame) {
function createApiError (line 680) | function createApiError(message, status, transporterStackTrace) {
function createDeserializationError (line 689) | function createDeserializationError(message, response) {
function createRetryError (line 697) | function createRetryError(transporterStackTrace) {
function createBrowsablePromise (line 809) | function createBrowsablePromise(options) {
method addAlgoliaAgent (line 871) | addAlgoliaAgent(segment, version) {
method clearCache (line 874) | clearCache() {
function createMissingObjectIDError (line 884) | function createMissingObjectIDError() {
function createObjectNotFoundError (line 895) | function createObjectNotFoundError() {
method request (line 1438) | request(data) {
method request (line 1463) | request(data) {
function createConsoleLogger (line 2037) | function createConsoleLogger(logLevel) {
function createBrowserXhrRequester (line 2058) | function createBrowserXhrRequester() {
function algoliasearch (line 2114) | function algoliasearch(appId, apiKey, options) {
FILE: js/algoliasearch/dist/algoliasearch.umd.js
function t (line 2) | function t(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enume...
function e (line 2) | function e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){va...
function r (line 2) | function r(r){for(var n=1;n<arguments.length;n++){var a=null!=arguments[...
function n (line 2) | function n(t,e){if(null==t)return{};var r,n,a=function(t,e){if(null==t)r...
function a (line 2) | function a(t,e){return function(t){if(Array.isArray(t))return t}(t)||fun...
function o (line 2) | function o(t){return function(t){if(Array.isArray(t)){for(var e=0,r=new ...
function i (line 2) | function i(t){var e,r="algoliasearch-client-js-".concat(t.key),n=functio...
function u (line 2) | function u(t){var e=o(t.caches),r=e.shift();return void 0===r?{get:funct...
function s (line 2) | function s(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0...
function c (line 2) | function c(t,e,r){var n={"x-algolia-api-key":r,"x-algolia-application-id...
function f (line 2) | function f(t){var e=0;return t((function r(){return e++,new Promise((fun...
function d (line 2) | function d(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[...
function l (line 2) | function l(t){for(var e=t.length-1;e>0;e--){var r=Math.floor(Math.random...
function p (line 2) | function p(t,e){return e?(Object.keys(e).forEach((function(r){t[r]=e[r](...
function h (line 2) | function h(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),n=1;n<e;...
function y (line 2) | function y(t,e){var r=t||{},n=r.data||{};return Object.keys(r).forEach((...
function P (line 2) | function P(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[...
function w (line 2) | function w(t){return"string"==typeof t?{protocol:"https",url:t,accept:g....
function q (line 2) | function q(t,e){return Promise.all(e.map((function(e){return t.get(e,(fu...
function S (line 2) | function S(t,e,n,a){var i=[],u=function(t,e){if(t.method===j||void 0===t...
function k (line 2) | function k(t){var e=t.hostsCache,r=t.logger,n=t.requester,o=t.requestsCa...
function T (line 2) | function T(t){var e={value:"Algolia for JavaScript (".concat(t,")"),add:...
function N (line 2) | function N(t,e,r){var n=E(r),a="".concat(t.protocol,"://").concat(t.url,...
function E (line 2) | function E(t){return Object.keys(t).map((function(e){return h("%s=%s",e,...
function R (line 2) | function R(t){return t.map((function(t){return A(t)}))}
function A (line 2) | function A(t){var e=t.request.headers["x-algolia-api-key"]?{"x-algolia-a...
function K (line 2) | function K(t){return function e(r){return t.request(r).then((function(n)...
function ge (line 2) | function ge(t,e,n){var a,o={appId:t,apiKey:e,timeouts:{connect:1,read:2,...
FILE: js/autocomplete.js/dist/autocomplete.angular.js
function __webpack_require__ (line 11) | function __webpack_require__(moduleId) {
function initialize (line 123) | function initialize() {
function escapeRegExp (line 202) | function escapeRegExp(str) {
function EventBus (line 345) | function EventBus(o) {
function Typeahead (line 390) | function Typeahead(o) {
function buildDom (line 876) | function buildDom(options) {
function getBackgroundStyles (line 986) | function getBackgroundStyles($el) {
function destroyDomStructure (line 999) | function destroyDomStructure($node, cssClasses) {
function Input (line 1055) | function Input(o) {
function buildOverflowHelper (line 1343) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 1366) | function areQueriesEquivalent(a, b) {
function withModifier (line 1370) | function withModifier($e) {
function on (line 1393) | function on(method, types, cb, context) {
function onAsync (line 1413) | function onAsync(types, cb, context) {
function onSync (line 1417) | function onSync(types, cb, context) {
function off (line 1421) | function off(types) {
function trigger (line 1437) | function trigger(types) {
function getFlush (line 1463) | function getFlush(callbacks, context, args) {
function bindContext (line 1478) | function bindContext(fn, context) {
function cleanUpNextTick (line 1502) | function cleanUpNextTick() {
function nextTick (line 1518) | function nextTick() {
function Item (line 1550) | function Item(fun, array) {
function immediate (line 1572) | function immediate(task) {
function defaultSetTimout (line 1620) | function defaultSetTimout() {
function defaultClearTimeout (line 1623) | function defaultClearTimeout () {
function runTimeout (line 1646) | function runTimeout(fun) {
function runClearTimeout (line 1671) | function runClearTimeout(marker) {
function cleanUpNextTick (line 1703) | function cleanUpNextTick() {
function drainQueue (line 1718) | function drainQueue() {
function Item (line 1756) | function Item(fun, array) {
function noop (line 1770) | function noop() {}
function Dropdown (line 1903) | function Dropdown(o) {
function isDatasetEmpty (line 2070) | function isDatasetEmpty(dataset) {
function hasEmptyTemplate (line 2074) | function hasEmptyTemplate(dataset) {
function updateDataset (line 2246) | function updateDataset(dataset) {
function clearDataset (line 2255) | function clearDataset(dataset) {
function destroyDataset (line 2271) | function destroyDataset(dataset) {
function initializeDataset (line 2281) | function initializeDataset($menu, oDataset, cssClasses) {
function Dataset (line 2307) | function Dataset(o) {
function getEmptyHtml (line 2418) | function getEmptyHtml() {
function getSuggestionsHtml (line 2424) | function getSuggestionsHtml() {
function getHeaderHtml (line 2466) | function getHeaderHtml() {
function getFooterHtml (line 2472) | function getFooterHtml() {
function handleSuggestions (line 2486) | function handleSuggestions(suggestions) {
function getDisplayFn (line 2570) | function getDisplayFn(display) {
function getTemplates (line 2580) | function getTemplates(templates, displayFn) {
function isValidName (line 2593) | function isValidName(str) {
function createMultiQuerySource (line 2741) | function createMultiQuerySource() {
function sourceFn (line 2866) | function sourceFn(query, cb) {
FILE: js/autocomplete.js/dist/autocomplete.jquery.js
function __webpack_require__ (line 11) | function __webpack_require__(moduleId) {
function reverseArgs (line 77) | function reverseArgs(index, value) {
function attach (line 107) | function attach() {
function openTypeahead (line 139) | function openTypeahead() {
function closeTypeahead (line 152) | function closeTypeahead() {
function setVal (line 167) | function setVal() {
function getVal (line 176) | function getVal($input) {
function unattach (line 191) | function unattach() {
function escapeRegExp (line 251) | function escapeRegExp(str) {
function Typeahead (line 400) | function Typeahead(o) {
function buildDom (line 886) | function buildDom(options) {
function getBackgroundStyles (line 996) | function getBackgroundStyles($el) {
function destroyDomStructure (line 1009) | function destroyDomStructure($node, cssClasses) {
function EventBus (line 1054) | function EventBus(o) {
function Input (line 1104) | function Input(o) {
function buildOverflowHelper (line 1392) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 1415) | function areQueriesEquivalent(a, b) {
function withModifier (line 1419) | function withModifier($e) {
function on (line 1442) | function on(method, types, cb, context) {
function onAsync (line 1462) | function onAsync(types, cb, context) {
function onSync (line 1466) | function onSync(types, cb, context) {
function off (line 1470) | function off(types) {
function trigger (line 1486) | function trigger(types) {
function getFlush (line 1512) | function getFlush(callbacks, context, args) {
function bindContext (line 1527) | function bindContext(fn, context) {
function cleanUpNextTick (line 1551) | function cleanUpNextTick() {
function nextTick (line 1567) | function nextTick() {
function Item (line 1599) | function Item(fun, array) {
function immediate (line 1621) | function immediate(task) {
function defaultSetTimout (line 1669) | function defaultSetTimout() {
function defaultClearTimeout (line 1672) | function defaultClearTimeout () {
function runTimeout (line 1695) | function runTimeout(fun) {
function runClearTimeout (line 1720) | function runClearTimeout(marker) {
function cleanUpNextTick (line 1752) | function cleanUpNextTick() {
function drainQueue (line 1767) | function drainQueue() {
function Item (line 1805) | function Item(fun, array) {
function noop (line 1819) | function noop() {}
function Dropdown (line 1952) | function Dropdown(o) {
function isDatasetEmpty (line 2119) | function isDatasetEmpty(dataset) {
function hasEmptyTemplate (line 2123) | function hasEmptyTemplate(dataset) {
function updateDataset (line 2295) | function updateDataset(dataset) {
function clearDataset (line 2304) | function clearDataset(dataset) {
function destroyDataset (line 2320) | function destroyDataset(dataset) {
function initializeDataset (line 2330) | function initializeDataset($menu, oDataset, cssClasses) {
function Dataset (line 2356) | function Dataset(o) {
function getEmptyHtml (line 2467) | function getEmptyHtml() {
function getSuggestionsHtml (line 2473) | function getSuggestionsHtml() {
function getHeaderHtml (line 2515) | function getHeaderHtml() {
function getFooterHtml (line 2521) | function getFooterHtml() {
function handleSuggestions (line 2535) | function handleSuggestions(suggestions) {
function getDisplayFn (line 2619) | function getDisplayFn(display) {
function getTemplates (line 2629) | function getTemplates(templates, displayFn) {
function isValidName (line 2642) | function isValidName(str) {
function createMultiQuerySource (line 2790) | function createMultiQuerySource() {
function sourceFn (line 2915) | function sourceFn(query, cb) {
FILE: js/autocomplete.js/dist/autocomplete.js
function __webpack_require__ (line 21) | function __webpack_require__(moduleId) {
function reverseArgs (line 89) | function reverseArgs(index, value) {
function autocomplete (line 101) | function autocomplete(selector, options, datasets, typeaheadObject) {
function type (line 234) | function type(obj) {
function isFunction (line 239) | function isFunction(value) { return type(value) == "function" }
function isWindow (line 240) | function isWindow(obj) { return obj != null && obj == obj.window }
function isDocument (line 241) | function isDocument(obj) { return obj != null && obj.nodeType == obj.D...
function isObject (line 242) | function isObject(obj) { return type(obj) == "object" }
function isPlainObject (line 243) | function isPlainObject(obj) {
function likeArray (line 247) | function likeArray(obj) {
function compact (line 257) | function compact(array) { return filter.call(array, function(item){ retu...
function flatten (line 258) | function flatten(array) { return array.length > 0 ? $.fn.concat.apply([]...
function dasherize (line 260) | function dasherize(str) {
function classRE (line 269) | function classRE(name) {
function maybeAddPx (line 274) | function maybeAddPx(name, value) {
function defaultDisplay (line 278) | function defaultDisplay(nodeName) {
function children (line 291) | function children(element) {
function Z (line 297) | function Z(dom, selector) {
function extend (line 404) | function extend(target, source, deep) {
function filtered (line 448) | function filtered(nodes, selector) {
function funcArg (line 462) | function funcArg(context, arg, idx, payload) {
function setAttribute (line 466) | function setAttribute(node, name, value) {
function className (line 471) | function className(node, value){
function deserializeValue (line 487) | function deserializeValue(value) {
function traverseNode (line 1029) | function traverseNode(node, fun) {
function zid (line 1119) | function zid(element) {
function findHandlers (line 1122) | function findHandlers(element, event, fn, selector) {
function parse (line 1133) | function parse(event) {
function matcherFor (line 1137) | function matcherFor(ns) {
function eventCapture (line 1141) | function eventCapture(handler, captureSetting) {
function realEvent (line 1147) | function realEvent(type) {
function add (line 1151) | function add(element, events, fn, data, selector, delegator, capture){
function remove (line 1184) | function remove(element, events, fn, selector, capture){
function compatible (line 1234) | function compatible(event, source) {
function createProxy (line 1259) | function createProxy(event) {
function getData (line 1410) | function getData(node, name) {
function setData (line 1424) | function setData(node, name, value) {
function attributeData (line 1432) | function attributeData(node) {
function escapeRegExp (line 1508) | function escapeRegExp(str) {
function Typeahead (line 1657) | function Typeahead(o) {
function buildDom (line 2143) | function buildDom(options) {
function getBackgroundStyles (line 2253) | function getBackgroundStyles($el) {
function destroyDomStructure (line 2266) | function destroyDomStructure($node, cssClasses) {
function EventBus (line 2311) | function EventBus(o) {
function Input (line 2361) | function Input(o) {
function buildOverflowHelper (line 2649) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 2672) | function areQueriesEquivalent(a, b) {
function withModifier (line 2676) | function withModifier($e) {
function on (line 2699) | function on(method, types, cb, context) {
function onAsync (line 2719) | function onAsync(types, cb, context) {
function onSync (line 2723) | function onSync(types, cb, context) {
function off (line 2727) | function off(types) {
function trigger (line 2743) | function trigger(types) {
function getFlush (line 2769) | function getFlush(callbacks, context, args) {
function bindContext (line 2784) | function bindContext(fn, context) {
function cleanUpNextTick (line 2808) | function cleanUpNextTick() {
function nextTick (line 2824) | function nextTick() {
function Item (line 2856) | function Item(fun, array) {
function immediate (line 2878) | function immediate(task) {
function defaultSetTimout (line 2926) | function defaultSetTimout() {
function defaultClearTimeout (line 2929) | function defaultClearTimeout () {
function runTimeout (line 2952) | function runTimeout(fun) {
function runClearTimeout (line 2977) | function runClearTimeout(marker) {
function cleanUpNextTick (line 3009) | function cleanUpNextTick() {
function drainQueue (line 3024) | function drainQueue() {
function Item (line 3062) | function Item(fun, array) {
function noop (line 3076) | function noop() {}
function Dropdown (line 3209) | function Dropdown(o) {
function isDatasetEmpty (line 3376) | function isDatasetEmpty(dataset) {
function hasEmptyTemplate (line 3380) | function hasEmptyTemplate(dataset) {
function updateDataset (line 3552) | function updateDataset(dataset) {
function clearDataset (line 3561) | function clearDataset(dataset) {
function destroyDataset (line 3577) | function destroyDataset(dataset) {
function initializeDataset (line 3587) | function initializeDataset($menu, oDataset, cssClasses) {
function Dataset (line 3613) | function Dataset(o) {
function getEmptyHtml (line 3724) | function getEmptyHtml() {
function getSuggestionsHtml (line 3730) | function getSuggestionsHtml() {
function getHeaderHtml (line 3772) | function getHeaderHtml() {
function getFooterHtml (line 3778) | function getFooterHtml() {
function handleSuggestions (line 3792) | function handleSuggestions(suggestions) {
function getDisplayFn (line 3876) | function getDisplayFn(display) {
function getTemplates (line 3886) | function getTemplates(templates, displayFn) {
function isValidName (line 3899) | function isValidName(str) {
function createMultiQuerySource (line 4047) | function createMultiQuerySource() {
function sourceFn (line 4172) | function sourceFn(query, cb) {
FILE: js/autocomplete.js/scripts/netlify-deploy.js
function logStdOut (line 10) | function logStdOut(opts) {
FILE: js/autocomplete.js/src/angular/directive.js
function initialize (line 63) | function initialize() {
FILE: js/autocomplete.js/src/autocomplete/dataset.js
function Dataset (line 16) | function Dataset(o) {
function getEmptyHtml (line 127) | function getEmptyHtml() {
function getSuggestionsHtml (line 133) | function getSuggestionsHtml() {
function getHeaderHtml (line 175) | function getHeaderHtml() {
function getFooterHtml (line 181) | function getFooterHtml() {
function handleSuggestions (line 195) | function handleSuggestions(suggestions) {
function getDisplayFn (line 279) | function getDisplayFn(display) {
function getTemplates (line 289) | function getTemplates(templates, displayFn) {
function isValidName (line 302) | function isValidName(str) {
FILE: js/autocomplete.js/src/autocomplete/dropdown.js
function Dropdown (line 12) | function Dropdown(o) {
function isDatasetEmpty (line 179) | function isDatasetEmpty(dataset) {
function hasEmptyTemplate (line 183) | function hasEmptyTemplate(dataset) {
function updateDataset (line 355) | function updateDataset(dataset) {
function clearDataset (line 364) | function clearDataset(dataset) {
function destroyDataset (line 380) | function destroyDataset(dataset) {
function initializeDataset (line 390) | function initializeDataset($menu, oDataset, cssClasses) {
FILE: js/autocomplete.js/src/autocomplete/event_bus.js
function EventBus (line 11) | function EventBus(o) {
FILE: js/autocomplete.js/src/autocomplete/event_emitter.js
function on (line 13) | function on(method, types, cb, context) {
function onAsync (line 33) | function onAsync(types, cb, context) {
function onSync (line 37) | function onSync(types, cb, context) {
function off (line 41) | function off(types) {
function trigger (line 57) | function trigger(types) {
function getFlush (line 83) | function getFlush(callbacks, context, args) {
function bindContext (line 98) | function bindContext(fn, context) {
FILE: js/autocomplete.js/src/autocomplete/input.js
function Input (line 22) | function Input(o) {
function buildOverflowHelper (line 310) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 333) | function areQueriesEquivalent(a, b) {
function withModifier (line 337) | function withModifier($e) {
FILE: js/autocomplete.js/src/autocomplete/typeahead.js
function Typeahead (line 17) | function Typeahead(o) {
function buildDom (line 503) | function buildDom(options) {
function getBackgroundStyles (line 613) | function getBackgroundStyles($el) {
function destroyDomStructure (line 626) | function destroyDomStructure($node, cssClasses) {
FILE: js/autocomplete.js/src/common/utils.js
function escapeRegExp (line 5) | function escapeRegExp(str) {
FILE: js/autocomplete.js/src/jquery/plugin.js
function reverseArgs (line 17) | function reverseArgs(index, value) {
function attach (line 47) | function attach() {
function openTypeahead (line 79) | function openTypeahead() {
function closeTypeahead (line 92) | function closeTypeahead() {
function setVal (line 107) | function setVal() {
function getVal (line 116) | function getVal($input) {
function unattach (line 131) | function unattach() {
FILE: js/autocomplete.js/src/sources/hits.js
function createMultiQuerySource (line 7) | function createMultiQuerySource() {
FILE: js/autocomplete.js/src/sources/popularIn.js
function sourceFn (line 27) | function sourceFn(query, cb) {
FILE: js/autocomplete.js/src/standalone/index.js
function reverseArgs (line 19) | function reverseArgs(index, value) {
function autocomplete (line 31) | function autocomplete(selector, options, datasets, typeaheadObject) {
FILE: js/autocomplete.js/test/helpers/mocks.js
function Mock (line 20) | function Mock() {
FILE: js/autocomplete.js/test/helpers/waits_for.js
function clearMe (line 18) | function clearMe() {
FILE: js/autocomplete.js/test/integration/test.js
function setIf (line 27) | function setIf(obj, key, val) {
function testSuite (line 102) | function testSuite () {
FILE: js/autocomplete.js/test/unit/dataset_spec.js
function noSource (line 25) | function noSource() {
function fn (line 33) | function fn() {
function fakeGetWithSyncResults (line 505) | function fakeGetWithSyncResults(query, cb) {
function fakeGetForDisplayFn (line 513) | function fakeGetForDisplayFn(query, cb) {
function fakeGetWithSyncNonArrayResults (line 517) | function fakeGetWithSyncNonArrayResults(query, cb) {
function fakeGetWithSyncEmptyResults (line 521) | function fakeGetWithSyncEmptyResults(query, cb) {
function fakeGetWithSyncEmptyResultsAndExtraParams (line 525) | function fakeGetWithSyncEmptyResultsAndExtraParams(query, cb) {
function fakeGetWithSyncResultsAndExtraParams (line 529) | function fakeGetWithSyncResultsAndExtraParams(query, cb) {
function fakeGetWithAsyncResults (line 537) | function fakeGetWithAsyncResults(query, cb) {
FILE: js/autocomplete.js/test/unit/dropdown_spec.js
function noMenu (line 35) | function noMenu() {
function noDatasets (line 39) | function noDatasets() {
FILE: js/autocomplete.js/test/unit/event_emitter_spec.js
function setCbContext (line 33) | function setCbContext() {
function assertCbContext (line 37) | function assertCbContext() {
function cancel (line 116) | function cancel() {
function assertCallCount (line 121) | function assertCallCount(spy, expected, done) {
function assertArgs (line 128) | function assertArgs(spy, call, expected) {
FILE: js/autocomplete.js/test/unit/input_spec.js
function noInput (line 43) | function noInput() {
function simulateInputEvent (line 453) | function simulateInputEvent($node) {
function simulateKeyEvent (line 463) | function simulateKeyEvent($node, type, key, withModifier) {
function setCursorPosition (line 480) | function setCursorPosition($input, pos) {
FILE: js/autocomplete.js/test/unit/popularIn_spec.js
function build (line 14) | function build(options) {
function cb (line 126) | function cb(hits) {
FILE: js/autocomplete.js/zepto.js
function type (line 67) | function type(obj) {
function isFunction (line 72) | function isFunction(value) { return type(value) == "function" }
function isWindow (line 73) | function isWindow(obj) { return obj != null && obj == obj.window }
function isDocument (line 74) | function isDocument(obj) { return obj != null && obj.nodeType == obj.D...
function isObject (line 75) | function isObject(obj) { return type(obj) == "object" }
function isPlainObject (line 76) | function isPlainObject(obj) {
function likeArray (line 80) | function likeArray(obj) {
function compact (line 90) | function compact(array) { return filter.call(array, function(item){ retu...
function flatten (line 91) | function flatten(array) { return array.length > 0 ? $.fn.concat.apply([]...
function dasherize (line 93) | function dasherize(str) {
function classRE (line 102) | function classRE(name) {
function maybeAddPx (line 107) | function maybeAddPx(name, value) {
function defaultDisplay (line 111) | function defaultDisplay(nodeName) {
function children (line 124) | function children(element) {
function Z (line 130) | function Z(dom, selector) {
function extend (line 237) | function extend(target, source, deep) {
function filtered (line 281) | function filtered(nodes, selector) {
function funcArg (line 295) | function funcArg(context, arg, idx, payload) {
function setAttribute (line 299) | function setAttribute(node, name, value) {
function className (line 304) | function className(node, value){
function deserializeValue (line 320) | function deserializeValue(value) {
function traverseNode (line 862) | function traverseNode(node, fun) {
function zid (line 952) | function zid(element) {
function findHandlers (line 955) | function findHandlers(element, event, fn, selector) {
function parse (line 966) | function parse(event) {
function matcherFor (line 970) | function matcherFor(ns) {
function eventCapture (line 974) | function eventCapture(handler, captureSetting) {
function realEvent (line 980) | function realEvent(type) {
function add (line 984) | function add(element, events, fn, data, selector, delegator, capture){
function remove (line 1017) | function remove(element, events, fn, selector, capture){
function compatible (line 1067) | function compatible(event, source) {
function createProxy (line 1092) | function createProxy(event) {
function getData (line 1243) | function getData(node, name) {
function setData (line 1257) | function setData(node, name, value) {
function attributeData (line 1265) | function attributeData(node) {
FILE: js/instantsearch.js/cjs/components/Answers/Answers.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 12) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 13) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 14) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 15) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 16) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 17) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _extends (line 18) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
method __hitIndex (line 51) | get __hitIndex() {
FILE: js/instantsearch.js/cjs/components/Breadcrumb/Breadcrumb.js
function _interopRequireDefault (line 11) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _extends (line 12) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
FILE: js/instantsearch.js/cjs/components/ClearRefinements/ClearRefinements.js
function _interopRequireDefault (line 10) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _extends (line 11) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
FILE: js/instantsearch.js/cjs/components/GeoSearchControls/GeoSearchControls.js
function _interopRequireDefault (line 12) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _extends (line 13) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
FILE: js/instantsearch.js/cjs/components/Highlight/Highlight.js
function _extends (line 11) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _objectWithoutProperties (line 12) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 13) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function Highlight (line 14) | function Highlight(_ref) {
FILE: js/instantsearch.js/cjs/components/Hits/Hits.js
function _typeof (line 3) | function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "fun...
function _interopRequireDefault (line 13) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 14) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 15) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
function _defineProperty (line 16) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 17) | function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); re...
function _toPrimitive (line 18) | function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || ...
function _extends (line 19) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function Hits (line 20) | function Hits(_ref) {
FILE: js/instantsearch.js/cjs/components/InfiniteHits/InfiniteHits.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 13) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 14) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 15) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 16) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 17) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 18) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _extends (line 19) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
method __hitIndex (line 119) | get __hitIndex() {
FILE: js/instantsearch.js/cjs/components/MenuSelect/MenuSelect.js
function _interopRequireDefault (line 11) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _extends (line 12) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function MenuSelect (line 13) | function MenuSelect(_ref) {
FILE: js/instantsearch.js/cjs/components/Pagination/Pagination.js
function _interopRequireDefault (line 11) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function Pagination (line 12) | function Pagination(props) {
function PaginationLink (line 83) | function PaginationLink(_ref) {
FILE: js/instantsearch.js/cjs/components/Panel/Panel.js
function _interopRequireDefault (line 11) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _slicedToArray (line 12) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 13) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 14) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 15) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 16) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 17) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function Panel (line 18) | function Panel(props) {
FILE: js/instantsearch.js/cjs/components/QueryRuleCustomData/QueryRuleCustomData.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/components/RangeInput/RangeInput.js
function _interopRequireDefault (line 10) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 11) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _extends (line 12) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _classCallCheck (line 13) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 14) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 15) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _inherits (line 16) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function _setPrototypeOf (line 17) | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf...
function _createSuper (line 18) | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNati...
function _possibleConstructorReturn (line 19) | function _possibleConstructorReturn(self, call) { if (call && (_typeof(c...
function _assertThisInitialized (line 20) | function _assertThisInitialized(self) { if (self === void 0) { throw new...
function _isNativeReflectConstruct (line 21) | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined...
function _getPrototypeOf (line 22) | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? ...
function _defineProperty (line 23) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 24) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 25) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function stripLeadingZeroFromInput (line 27) | function stripLeadingZeroFromInput(value) {
function RangeInput (line 35) | function RangeInput() {
FILE: js/instantsearch.js/cjs/components/RefinementList/RefinementList.js
function _interopRequireDefault (line 14) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 15) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 16) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 17) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _extends (line 18) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _objectWithoutProperties (line 19) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 20) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function _classCallCheck (line 21) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 22) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 23) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _inherits (line 24) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function _setPrototypeOf (line 25) | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf...
function _createSuper (line 26) | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNati...
function _possibleConstructorReturn (line 27) | function _possibleConstructorReturn(self, call) { if (call && (_typeof(c...
function _assertThisInitialized (line 28) | function _assertThisInitialized(self) { if (self === void 0) { throw new...
function _isNativeReflectConstruct (line 29) | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined...
function _getPrototypeOf (line 30) | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? ...
function _defineProperty (line 31) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 32) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 33) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function isHierarchicalMenuItem (line 40) | function isHierarchicalMenuItem(facetValue) {
function RefinementList (line 46) | function RefinementList() {
FILE: js/instantsearch.js/cjs/components/RefinementList/RefinementListItem.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _extends (line 10) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function RefinementListItem (line 11) | function RefinementListItem(_ref) {
FILE: js/instantsearch.js/cjs/components/RelevantSort/RelevantSort.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/components/ReverseHighlight/ReverseHighlight.js
function _extends (line 11) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _objectWithoutProperties (line 12) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 13) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function ReverseHighlight (line 14) | function ReverseHighlight(_ref) {
FILE: js/instantsearch.js/cjs/components/ReverseSnippet/ReverseSnippet.js
function _extends (line 11) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _objectWithoutProperties (line 12) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 13) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function ReverseSnippet (line 14) | function ReverseSnippet(_ref) {
FILE: js/instantsearch.js/cjs/components/SearchBox/SearchBox.js
function _interopRequireDefault (line 10) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 11) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _classCallCheck (line 12) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 13) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 14) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _inherits (line 15) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function _setPrototypeOf (line 16) | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf...
function _createSuper (line 17) | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNati...
function _possibleConstructorReturn (line 18) | function _possibleConstructorReturn(self, call) { if (call && (_typeof(c...
function _assertThisInitialized (line 19) | function _assertThisInitialized(self) { if (self === void 0) { throw new...
function _isNativeReflectConstruct (line 20) | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined...
function _getPrototypeOf (line 21) | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? ...
function _defineProperty (line 22) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 23) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 24) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function SearchBox (line 44) | function SearchBox() {
FILE: js/instantsearch.js/cjs/components/Selector/Selector.js
function Selector (line 9) | function Selector(_ref) {
FILE: js/instantsearch.js/cjs/components/Slider/Pit.js
function _typeof (line 9) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 10) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 11) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 12) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 13) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 14) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/components/Slider/Rheostat.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _defineProperties (line 9) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 10) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _classCallCheck (line 11) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _inherits (line 12) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function _setPrototypeOf (line 13) | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf...
function _createSuper (line 14) | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNati...
function _possibleConstructorReturn (line 15) | function _possibleConstructorReturn(self, call) { if (call && (_typeof(c...
function _assertThisInitialized (line 16) | function _assertThisInitialized(self) { if (self === void 0) { throw new...
function _isNativeReflectConstruct (line 17) | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined...
function _getPrototypeOf (line 18) | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? ...
function _defineProperty (line 19) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 20) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 21) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _extends (line 22) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function getPosition (line 40) | function getPosition(value, min, max) {
function getValue (line 43) | function getValue(pos, min, max) {
function getClassName (line 52) | function getClassName(props) {
function getHandleFor (line 56) | function getHandleFor(ev) {
function killEvent (line 59) | function killEvent(ev) {
function Button (line 63) | function Button(props) {
function Rheostat (line 77) | function Rheostat() {
FILE: js/instantsearch.js/cjs/components/Slider/Slider.js
function _interopRequireDefault (line 12) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _toConsumableArray (line 13) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 14) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 15) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 16) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 17) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 18) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _extends (line 19) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _typeof (line 20) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _classCallCheck (line 21) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 22) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 23) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _inherits (line 24) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function _setPrototypeOf (line 25) | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf...
function _createSuper (line 26) | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNati...
function _possibleConstructorReturn (line 27) | function _possibleConstructorReturn(self, call) { if (call && (_typeof(c...
function _assertThisInitialized (line 28) | function _assertThisInitialized(self) { if (self === void 0) { throw new...
function _isNativeReflectConstruct (line 29) | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined...
function _getPrototypeOf (line 30) | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? ...
function _defineProperty (line 31) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 32) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 33) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function Slider (line 37) | function Slider() {
FILE: js/instantsearch.js/cjs/components/Snippet/Snippet.js
function _extends (line 11) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _objectWithoutProperties (line 12) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 13) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function Snippet (line 14) | function Snippet(_ref) {
FILE: js/instantsearch.js/cjs/components/Stats/Stats.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 12) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _extends (line 13) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function ownKeys (line 14) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 15) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 16) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 17) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 18) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 19) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 20) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
FILE: js/instantsearch.js/cjs/components/Template/Template.js
function _extends (line 10) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _typeof (line 11) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _toConsumableArray (line 12) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 13) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 14) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 15) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 16) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 17) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _classCallCheck (line 18) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 19) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 20) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _inherits (line 21) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function _setPrototypeOf (line 22) | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf...
function _createSuper (line 23) | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNati...
function _possibleConstructorReturn (line 24) | function _possibleConstructorReturn(self, call) { if (call && (_typeof(c...
function _assertThisInitialized (line 25) | function _assertThisInitialized(self) { if (self === void 0) { throw new...
function _isNativeReflectConstruct (line 26) | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined...
function _getPrototypeOf (line 27) | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? ...
function _defineProperty (line 28) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 29) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 30) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function RawHtml (line 34) | function RawHtml() {
function Template (line 94) | function Template() {
FILE: js/instantsearch.js/cjs/components/ToggleRefinement/ToggleRefinement.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _extends (line 10) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
FILE: js/instantsearch.js/cjs/components/VoiceSearch/VoiceSearch.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/connectors/answers/connectAnswers.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function hasFindAnswersMethod (line 14) | function hasFindAnswersMethod(answersIndex) {
FILE: js/instantsearch.js/cjs/connectors/autocomplete/connectAutocomplete.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/breadcrumb/connectBreadcrumb.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _slicedToArray (line 14) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 15) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 16) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 17) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 18) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 19) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function getRefinedState (line 44) | function getRefinedState(state, facetValue) {
function getItems (line 81) | function getItems() {
function prepareItems (line 155) | function prepareItems(data) {
function shiftItemsValues (line 169) | function shiftItemsValues(array) {
function removeEmptyRefinementsFromUiState (line 177) | function removeEmptyRefinementsFromUiState(indexUiState, attribute) {
FILE: js/instantsearch.js/cjs/connectors/clear-refinements/connectClearRefinements.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _toConsumableArray (line 9) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 10) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 11) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 12) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 13) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 14) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function ownKeys (line 15) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 16) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 17) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 18) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 19) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function getAttributesToClear (line 122) | function getAttributesToClear(_ref5) {
FILE: js/instantsearch.js/cjs/connectors/configure-related-items/connectConfigureRelatedItems.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 11) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 12) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 13) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 14) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 15) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 16) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _toConsumableArray (line 17) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 18) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 19) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 20) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 21) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 22) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function createOptionalFilter (line 27) | function createOptionalFilter(_ref) {
FILE: js/instantsearch.js/cjs/connectors/configure/connectConfigure.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 10) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function getInitialSearchParameters (line 24) | function getInitialSearchParameters(state, widgetParams) {
function refine (line 40) | function refine(helper) {
FILE: js/instantsearch.js/cjs/connectors/current-refinements/connectCurrentRefinements.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _toConsumableArray (line 9) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 10) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 11) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 12) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 13) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 14) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function ownKeys (line 15) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 16) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 17) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 18) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 19) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function getItems (line 66) | function getItems() {
function getRefinementsItems (line 106) | function getRefinementsItems(_ref3) {
function clearRefinementFromState (line 140) | function clearRefinementFromState(state, refinement) {
function clearRefinement (line 162) | function clearRefinement(helper, refinement) {
function getOperatorSymbol (line 165) | function getOperatorSymbol(operator) {
function normalizeRefinement (line 175) | function normalizeRefinement(refinement) {
function getValue (line 195) | function getValue(refinement) {
FILE: js/instantsearch.js/cjs/connectors/dynamic-widgets/connectDynamicWidgets.js
function ownKeys (line 8) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 9) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 10) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 11) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 12) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _typeof (line 13) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
FILE: js/instantsearch.js/cjs/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/geo-search/connectGeoSearch.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function getBoundingBoxAsString (line 22) | function getBoundingBoxAsString(state) {
function setBoundingBoxAsString (line 25) | function setBoundingBoxAsString(state, value) {
FILE: js/instantsearch.js/cjs/connectors/hierarchical-menu/connectHierarchicalMenu.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 10) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 11) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 12) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 13) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 14) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 15) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 16) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function _slicedToArray (line 17) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 18) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 19) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 20) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 21) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 22) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function cachedToggleShowMore (line 81) | function cachedToggleShowMore() {
function createToggleShowMore (line 86) | function createToggleShowMore(renderOptions, widget) {
function getLimit (line 92) | function getLimit() {
function _prepareFacetValues (line 95) | function _prepareFacetValues(facetValues) {
function removeEmptyRefinementsFromUiState (line 243) | function removeEmptyRefinementsFromUiState(indexUiState, attribute) {
FILE: js/instantsearch.js/cjs/connectors/hits-per-page/connectHitsPerPage.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _toConsumableArray (line 9) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 10) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 11) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 12) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 13) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 14) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function ownKeys (line 15) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 16) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 17) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 18) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 19) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/hits/connectHits.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/hits/connectHitsWithInsights.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/connectors/index.js
function _interopRequireDefault (line 227) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/connectors/infinite-hits/connectInfiniteHits.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _toConsumableArray (line 16) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 17) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 18) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 19) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 20) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 21) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _objectWithoutProperties (line 22) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 23) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function getStateWithoutPage (line 28) | function getStateWithoutPage(state) {
function normalizeState (line 34) | function normalizeState(state) {
function getInMemoryCache (line 41) | function getInMemoryCache() {
function extractHitsFromCachedHits (line 57) | function extractHitsFromCachedHits(cachedHits) {
FILE: js/instantsearch.js/cjs/connectors/infinite-hits/connectInfiniteHitsWithInsights.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/connectors/looking-similar/connectLookingSimilar.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/menu/connectMenu.js
function _typeof (line 9) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _objectWithoutProperties (line 10) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 11) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function _slicedToArray (line 12) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 13) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 14) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 15) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 16) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 17) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function ownKeys (line 18) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 19) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 20) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 21) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 22) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function createToggleShowMore (line 69) | function createToggleShowMore(renderOptions, widget) {
function cachedToggleShowMore (line 75) | function cachedToggleShowMore() {
function getLimit (line 78) | function getLimit() {
function removeEmptyRefinementsFromUiState (line 208) | function removeEmptyRefinementsFromUiState(indexUiState, attribute) {
FILE: js/instantsearch.js/cjs/connectors/numeric-menu/connectNumericMenu.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _createForOfIteratorHelper (line 9) | function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof...
function _slicedToArray (line 10) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 11) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 12) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 13) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 14) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 15) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function ownKeys (line 16) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 17) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 18) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 19) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 20) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function isRefined (line 200) | function isRefined(state, attribute, option) {
function getRefinedState (line 223) | function getRefinedState(state, attribute, facetValue) {
function hasNumericRefinement (line 265) | function hasNumericRefinement(currentRefinements, operator, value) {
function removeEmptyRefinementsFromUiState (line 268) | function removeEmptyRefinementsFromUiState(indexUiState, attribute) {
FILE: js/instantsearch.js/cjs/connectors/pagination/Paginator.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _classCallCheck (line 9) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 10) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 11) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _defineProperty (line 12) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 13) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 14) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function Paginator (line 16) | function Paginator(params) {
FILE: js/instantsearch.js/cjs/connectors/pagination/connectPagination.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 10) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function getMaxPage (line 41) | function getMaxPage(_ref2) {
FILE: js/instantsearch.js/cjs/connectors/powered-by/connectPoweredBy.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/query-rules/connectQueryRules.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _toConsumableArray (line 14) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 15) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 16) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 17) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 18) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 19) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function hasStateRefinements (line 24) | function hasStateRefinements(state) {
function escapeRuleContext (line 32) | function escapeRuleContext(ruleName) {
function getRuleContextsFromTrackedFilters (line 35) | function getRuleContextsFromTrackedFilters(_ref) {
function applyRuleContexts (line 55) | function applyRuleContexts(event) {
FILE: js/instantsearch.js/cjs/connectors/range/connectRange.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _slicedToArray (line 14) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 15) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 16) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 17) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 18) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 19) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function toPrecision (line 31) | function toPrecision(_ref) {
function _getCurrentRange (line 142) | function _getCurrentRange(stats) {
function _getCurrentRefinement (line 165) | function _getCurrentRefinement(helper) {
function _refine (line 176) | function _refine(helper, currentRange) {
FILE: js/instantsearch.js/cjs/connectors/rating-menu/connectRatingMenu.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _toConsumableArray (line 9) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 10) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _iterableToArray (line 11) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 12) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function ownKeys (line 13) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 14) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 15) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 16) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 17) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _slicedToArray (line 18) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 19) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 20) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 21) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 22) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 23) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function getRefinedState (line 128) | function getRefinedState(state, facetValue) {
function removeEmptyRefinementsFromUiState (line 284) | function removeEmptyRefinementsFromUiState(indexUiState, attribute) {
FILE: js/instantsearch.js/cjs/connectors/refinement-list/connectRefinementList.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 16) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 17) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function cachedToggleShowMore (line 85) | function cachedToggleShowMore() {
function createToggleShowMore (line 88) | function createToggleShowMore(renderOptions, widget) {
function getLimit (line 94) | function getLimit() {
function removeEmptyRefinementsFromUiState (line 283) | function removeEmptyRefinementsFromUiState(indexUiState, attribute) {
FILE: js/instantsearch.js/cjs/connectors/related-products/connectRelatedProducts.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/relevant-sort/connectRelevantSort.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/search-box/connectSearchBox.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/sort-by/connectSortBy.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/stats/connectStats.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/toggle-refinement/connectToggleRefinement.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _slicedToArray (line 14) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 15) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 16) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 17) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 18) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 19) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
FILE: js/instantsearch.js/cjs/connectors/trending-items/connectTrendingItems.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/connectors/voice-search/connectVoiceSearch.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 10) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/helpers/components/Highlight.js
function _extends (line 11) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _objectWithoutProperties (line 12) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 13) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function Highlight (line 14) | function Highlight(_ref) {
FILE: js/instantsearch.js/cjs/helpers/components/ReverseHighlight.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _extends (line 13) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function ownKeys (line 14) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 15) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 16) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 17) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 18) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 19) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 20) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function ReverseHighlight (line 21) | function ReverseHighlight(_ref) {
FILE: js/instantsearch.js/cjs/helpers/components/ReverseSnippet.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _extends (line 13) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function ownKeys (line 14) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 15) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 16) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 17) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 18) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 19) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 20) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function ReverseSnippet (line 21) | function ReverseSnippet(_ref) {
FILE: js/instantsearch.js/cjs/helpers/components/Snippet.js
function _extends (line 11) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function _objectWithoutProperties (line 12) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 13) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function Snippet (line 14) | function Snippet(_ref) {
FILE: js/instantsearch.js/cjs/helpers/get-insights-anonymous-user-token.js
function _typeof (line 10) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function getCookie (line 12) | function getCookie(name) {
function getInsightsAnonymousUserTokenInternal (line 29) | function getInsightsAnonymousUserTokenInternal() {
function getInsightsAnonymousUserToken (line 36) | function getInsightsAnonymousUserToken() {
FILE: js/instantsearch.js/cjs/helpers/highlight.js
function highlight (line 14) | function highlight(_ref) {
FILE: js/instantsearch.js/cjs/helpers/index.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 108) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _getRequireWildcardCache (line 109) | function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap)...
function _interopRequireWildcard (line 110) | function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) re...
FILE: js/instantsearch.js/cjs/helpers/insights.js
function _typeof (line 10) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function readDataAttributes (line 12) | function readDataAttributes(domElement) {
function writeDataAttributes (line 30) | function writeDataAttributes(_ref) {
function insights (line 48) | function insights(method, payload) {
FILE: js/instantsearch.js/cjs/helpers/reverseHighlight.js
function reverseHighlight (line 14) | function reverseHighlight(_ref) {
FILE: js/instantsearch.js/cjs/helpers/reverseSnippet.js
function reverseSnippet (line 14) | function reverseSnippet(_ref) {
FILE: js/instantsearch.js/cjs/helpers/snippet.js
function snippet (line 14) | function snippet(_ref) {
FILE: js/instantsearch.js/cjs/index.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 18) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _getRequireWildcardCache (line 19) | function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap)...
function _interopRequireWildcard (line 20) | function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) re...
FILE: js/instantsearch.js/cjs/lib/InstantSearch.js
function _interopRequireDefault (line 16) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 17) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 18) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 19) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _classCallCheck (line 20) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 21) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 22) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _inherits (line 23) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function _setPrototypeOf (line 24) | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf...
function _createSuper (line 25) | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNati...
function _possibleConstructorReturn (line 26) | function _possibleConstructorReturn(self, call) { if (call && (_typeof(c...
function _assertThisInitialized (line 27) | function _assertThisInitialized(self) { if (self === void 0) { throw new...
function _isNativeReflectConstruct (line 28) | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined...
function _getPrototypeOf (line 29) | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? ...
function _defineProperty (line 30) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 31) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 32) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function defaultCreateURL (line 36) | function defaultCreateURL() {
function InstantSearch (line 61) | function InstantSearch(options) {
FILE: js/instantsearch.js/cjs/lib/createHelpers.js
function _typeof (line 9) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 10) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 11) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 12) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 13) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 14) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function hoganHelpers (line 15) | function hoganHelpers(_ref) {
FILE: js/instantsearch.js/cjs/lib/formatNumber.js
function formatNumber (line 7) | function formatNumber(value, numberLocale) {
FILE: js/instantsearch.js/cjs/lib/infiniteHitsCache/index.js
function _interopRequireDefault (line 13) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/lib/infiniteHitsCache/sessionStorage.js
function _objectWithoutProperties (line 9) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 10) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function getStateWithoutPage (line 11) | function getStateWithoutPage(state) {
function createInfiniteHitsSessionStorageCache (line 17) | function createInfiniteHitsSessionStorageCache() {
FILE: js/instantsearch.js/cjs/lib/insights/client.js
function _typeof (line 9) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 10) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 11) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 12) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 13) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 14) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function withInsights (line 103) | function withInsights(connector) {
FILE: js/instantsearch.js/cjs/lib/insights/index.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 27) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _getRequireWildcardCache (line 28) | function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap)...
function _interopRequireWildcard (line 29) | function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) re...
FILE: js/instantsearch.js/cjs/lib/insights/listener.js
function findInsightsTarget (line 38) | function findInsightsTarget(startElement, endElement, validator) {
function parseInsightsEvent (line 48) | function parseInsightsEvent(element) {
function withInsightsListener (line 63) | function withInsightsListener(BaseComponent) {
FILE: js/instantsearch.js/cjs/lib/main.js
function _typeof (line 3) | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol ===...
function _getRequireWildcardCache (line 28) | function _getRequireWildcardCache() { if (typeof WeakMap !== "function")...
function _interopRequireWildcard (line 30) | function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { ret...
function _interopRequireDefault (line 32) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/lib/routers/history.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 10) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _classCallCheck (line 11) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 12) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 13) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _defineProperty (line 14) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 15) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 16) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function BrowserHistory (line 29) | function BrowserHistory(_ref) {
function historyRouter (line 274) | function historyRouter() {
FILE: js/instantsearch.js/cjs/lib/routers/index.js
function _interopRequireDefault (line 13) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/lib/server.js
function _typeof (line 9) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 10) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 11) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 12) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 13) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 14) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function waitForResults (line 19) | function waitForResults(search) {
function getInitialResults (line 90) | function getInitialResults(rootIndex,
FILE: js/instantsearch.js/cjs/lib/stateMappings/index.js
function _interopRequireDefault (line 20) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/lib/stateMappings/simple.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 14) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 15) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function getIndexStateWithoutConfigure (line 16) | function getIndexStateWithoutConfigure(uiState) {
function simpleStateMapping (line 25) | function simpleStateMapping() {
FILE: js/instantsearch.js/cjs/lib/stateMappings/singleIndex.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _defineProperty (line 9) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 10) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 11) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 12) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 13) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function getIndexStateWithoutConfigure (line 14) | function getIndexStateWithoutConfigure(uiState) {
function singleIndexStateMapping (line 19) | function singleIndexStateMapping(indexName) {
FILE: js/instantsearch.js/cjs/lib/templating/prepareTemplateProps.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _toConsumableArray (line 14) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 15) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 16) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 17) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 18) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 19) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function prepareTemplates (line 20) | function prepareTemplates(
function prepareTemplateProps (line 43) | function prepareTemplateProps(_ref) {
FILE: js/instantsearch.js/cjs/lib/templating/renderTemplate.js
function _interopRequireDefault (line 10) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 11) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 12) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 13) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 14) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 15) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 16) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function transformHelpersToHogan (line 21) | function transformHelpersToHogan() {
function renderTemplate (line 37) | function renderTemplate(_ref) {
FILE: js/instantsearch.js/cjs/lib/utils/addWidgetId.js
function addWidgetId (line 9) | function addWidgetId(widget) {
function resetWidgetId (line 15) | function resetWidgetId() {
FILE: js/instantsearch.js/cjs/lib/utils/capitalize.js
function capitalize (line 7) | function capitalize(text) {
FILE: js/instantsearch.js/cjs/lib/utils/checkIndexUiState.js
function _toConsumableArray (line 10) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 11) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _iterableToArray (line 12) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 13) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _slicedToArray (line 14) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 15) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 16) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 17) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 18) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 19) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function getWidgetNames (line 22) | function getWidgetNames(connectorName) {
function checkIndexUiState (line 90) | function checkIndexUiState(_ref) {
FILE: js/instantsearch.js/cjs/lib/utils/checkRendering.js
function checkRendering (line 8) | function checkRendering(rendering, usage) {
FILE: js/instantsearch.js/cjs/lib/utils/clearRefinements.js
function clearRefinements (line 13) | function clearRefinements(_ref) {
FILE: js/instantsearch.js/cjs/lib/utils/concatHighlightedParts.js
function concatHighlightedParts (line 8) | function concatHighlightedParts(parts) {
FILE: js/instantsearch.js/cjs/lib/utils/convertNumericRefinementsToFilters.js
function convertNumericRefinementsToFilters (line 8) | function convertNumericRefinementsToFilters(state, attribute) {
FILE: js/instantsearch.js/cjs/lib/utils/createConcurrentSafePromise.js
function createConcurrentSafePromise (line 15) | function createConcurrentSafePromise() {
FILE: js/instantsearch.js/cjs/lib/utils/createSendEventForFacet.js
function ownKeys (line 8) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 9) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 10) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 11) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 12) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _typeof (line 13) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _slicedToArray (line 14) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 15) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 16) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 17) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 18) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 19) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function createSendEventForFacet (line 20) | function createSendEventForFacet(_ref) {
FILE: js/instantsearch.js/cjs/lib/utils/createSendEventForHits.js
function ownKeys (line 10) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 11) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 12) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 13) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 14) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _slicedToArray (line 15) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 16) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 17) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 18) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 19) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 20) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _typeof (line 21) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function chunk (line 22) | function chunk(arr) {
function _buildEventPayloadsForHits (line 30) | function _buildEventPayloadsForHits(_ref) {
function createSendEventForHits (line 137) | function createSendEventForHits(_ref2) {
function createBindEventForHits (line 168) | function createBindEventForHits(_ref3) {
FILE: js/instantsearch.js/cjs/lib/utils/cx.js
function cx (line 8) | function cx(cssClasses) {
FILE: js/instantsearch.js/cjs/lib/utils/debounce.js
function debounce (line 9) | function debounce(func, wait) {
FILE: js/instantsearch.js/cjs/lib/utils/defer.js
function defer (line 8) | function defer(callback) {
FILE: js/instantsearch.js/cjs/lib/utils/detect-insights-client.js
function hasDetectedInsightsClient (line 10) | function hasDetectedInsightsClient() {
FILE: js/instantsearch.js/cjs/lib/utils/documentation.js
function createDocumentationLink (line 8) | function createDocumentationLink(_ref) {
function createDocumentationMessageGenerator (line 14) | function createDocumentationMessageGenerator() {
FILE: js/instantsearch.js/cjs/lib/utils/escape-highlight.js
function _typeof (line 11) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _objectDestructuringEmpty (line 12) | function _objectDestructuringEmpty(obj) { if (obj == null) throw new Typ...
function _extends (line 13) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function ownKeys (line 14) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 15) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 16) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 17) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 18) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function replaceTagsAndEscape (line 29) | function replaceTagsAndEscape(value) {
function recursiveEscape (line 32) | function recursiveEscape(input) {
function escapeHits (line 45) | function escapeHits(hits) {
function escapeFacets (line 63) | function escapeFacets(facetHits) {
FILE: js/instantsearch.js/cjs/lib/utils/escape-html.js
function escape (line 30) | function escape(value) {
function unescape (line 58) | function unescape(value) {
FILE: js/instantsearch.js/cjs/lib/utils/escape.js
function escape (line 28) | function escape(value) {
FILE: js/instantsearch.js/cjs/lib/utils/escapeFacetValue.js
function unescapeFacetValue (line 8) | function unescapeFacetValue(value) {
function escapeFacetValue (line 14) | function escapeFacetValue(value) {
FILE: js/instantsearch.js/cjs/lib/utils/escapeRefinement.js
function escapeRefinement (line 8) | function escapeRefinement(value) {
FILE: js/instantsearch.js/cjs/lib/utils/find.js
function find (line 13) | function find(items, predicate) {
FILE: js/instantsearch.js/cjs/lib/utils/findIndex.js
function findIndex (line 13) | function findIndex(array, comparator) {
FILE: js/instantsearch.js/cjs/lib/utils/geo-search.js
function _slicedToArray (line 8) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 9) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 10) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 11) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 12) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 13) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function aroundLatLngToPosition (line 15) | function aroundLatLngToPosition(value) {
function insideBoundingBoxArrayToBoundingBox (line 28) | function insideBoundingBoxArrayToBoundingBox(value) {
function insideBoundingBoxStringToBoundingBox (line 54) | function insideBoundingBoxStringToBoundingBox(value) {
function insideBoundingBoxToBoundingBox (line 78) | function insideBoundingBoxToBoundingBox(value) {
FILE: js/instantsearch.js/cjs/lib/utils/getAppIdAndApiKey.js
function getAppIdAndApiKey (line 8) | function getAppIdAndApiKey(searchClient) {
FILE: js/instantsearch.js/cjs/lib/utils/getContainerNode.js
function getContainerNode (line 17) | function getContainerNode(selectorOrHTMLElement) {
FILE: js/instantsearch.js/cjs/lib/utils/getHighlightFromSiblings.js
function getHighlightFromSiblings (line 9) | function getHighlightFromSiblings(parts, i) {
FILE: js/instantsearch.js/cjs/lib/utils/getHighlightedParts.js
function getHighlightedParts (line 8) | function getHighlightedParts(highlightedValue) {
FILE: js/instantsearch.js/cjs/lib/utils/getObjectType.js
function getObjectType (line 7) | function getObjectType(object) {
FILE: js/instantsearch.js/cjs/lib/utils/getPropertyByPath.js
function getPropertyByPath (line 7) | function getPropertyByPath(object, path) {
FILE: js/instantsearch.js/cjs/lib/utils/getRefinements.js
function getRefinement (line 9) | function getRefinement(state, type, attribute, name) {
function getRefinements (line 49) | function getRefinements(_results, state) {
FILE: js/instantsearch.js/cjs/lib/utils/getWidgetAttribute.js
function getWidgetAttribute (line 7) | function getWidgetAttribute(widget, initOptions) {
FILE: js/instantsearch.js/cjs/lib/utils/hits-absolute-position.js
function _typeof (line 7) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 8) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 9) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 10) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 11) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 12) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function addAbsolutePosition (line 13) | function addAbsolutePosition(hits, page, hitsPerPage) {
FILE: js/instantsearch.js/cjs/lib/utils/hits-query-id.js
function _typeof (line 7) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 8) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 9) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 10) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 11) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 12) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function addQueryID (line 13) | function addQueryID(hits, queryID) {
FILE: js/instantsearch.js/cjs/lib/utils/hydrateRecommendCache.js
function _typeof (line 7) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 8) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 9) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 10) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 11) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 12) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function hydrateRecommendCache (line 13) | function hydrateRecommendCache(helper, initialResults) {
FILE: js/instantsearch.js/cjs/lib/utils/hydrateSearchClient.js
function _typeof (line 7) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _slicedToArray (line 8) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 9) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 10) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 11) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 12) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 13) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function ownKeys (line 14) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 15) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 16) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 17) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 18) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function hydrateSearchClient (line 19) | function hydrateSearchClient(client, results) {
function deserializeQueryParameters (line 108) | function deserializeQueryParameters(parameters) {
function serializeQueryParameters (line 121) | function serializeQueryParameters(parameters) {
FILE: js/instantsearch.js/cjs/lib/utils/isDomElement.js
function isDomElement (line 7) | function isDomElement(object) {
FILE: js/instantsearch.js/cjs/lib/utils/isEqual.js
function isPrimitive (line 7) | function isPrimitive(obj) {
function isEqual (line 10) | function isEqual(first, second) {
FILE: js/instantsearch.js/cjs/lib/utils/isFacetRefined.js
function isFacetRefined (line 7) | function isFacetRefined(helper, facet, value) {
FILE: js/instantsearch.js/cjs/lib/utils/isFiniteNumber.js
function isFiniteNumber (line 11) | function isFiniteNumber(value) {
FILE: js/instantsearch.js/cjs/lib/utils/isIndexWidget.js
function isIndexWidget (line 7) | function isIndexWidget(widget) {
FILE: js/instantsearch.js/cjs/lib/utils/isPlainObject.js
function _typeof (line 7) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function getTag (line 13) | function getTag(value) {
function isObjectLike (line 19) | function isObjectLike(value) {
function isPlainObject (line 29) | function isPlainObject(value) {
FILE: js/instantsearch.js/cjs/lib/utils/isSpecialClick.js
function isSpecialClick (line 7) | function isSpecialClick(event) {
FILE: js/instantsearch.js/cjs/lib/utils/mergeSearchParameters.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 16) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 17) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
FILE: js/instantsearch.js/cjs/lib/utils/noop.js
function noop (line 7) | function noop() {}
FILE: js/instantsearch.js/cjs/lib/utils/omit.js
function omit (line 13) | function omit(source, excluded) {
FILE: js/instantsearch.js/cjs/lib/utils/prepareTemplateProps.js
function _interopRequireDefault (line 10) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 12) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 14) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
function _defineProperty (line 16) | function _defineProperty(obj, key, value) { if (key in obj) { Object.def...
function _toConsumableArray (line 18) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 20) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 22) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 24) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && S...
function _arrayWithoutHoles (line 26) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 28) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function prepareTemplates (line 30) | function prepareTemplates( // can not use = {} here, since the template ...
function prepareTemplateProps (line 54) | function prepareTemplateProps(_ref) {
FILE: js/instantsearch.js/cjs/lib/utils/range.js
function _toConsumableArray (line 7) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 8) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 9) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 10) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 11) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 12) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function range (line 13) | function range(_ref) {
FILE: js/instantsearch.js/cjs/lib/utils/render-args.js
function createInitArgs (line 8) | function createInitArgs(instantSearchInstance, parent, uiState) {
function createRenderArgs (line 27) | function createRenderArgs(instantSearchInstance, parent, widget) {
FILE: js/instantsearch.js/cjs/lib/utils/renderTemplate.js
function _interopRequireDefault (line 10) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 12) | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol ===...
function ownKeys (line 14) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 16) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
function _defineProperty (line 18) | function _defineProperty(obj, key, value) { if (key in obj) { Object.def...
function transformHelpersToHogan (line 24) | function transformHelpersToHogan() {
function renderTemplate (line 43) | function renderTemplate(_ref) {
FILE: js/instantsearch.js/cjs/lib/utils/resolveSearchParameters.js
function resolveSearchParameters (line 7) | function resolveSearchParameters(current) {
FILE: js/instantsearch.js/cjs/lib/utils/reverseHighlightedParts.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function reverseHighlightedParts (line 14) | function reverseHighlightedParts(parts) {
FILE: js/instantsearch.js/cjs/lib/utils/safelyRunOnBrowser.js
function safelyRunOnBrowser (line 12) | function safelyRunOnBrowser(callback) {
FILE: js/instantsearch.js/cjs/lib/utils/serializer.js
function serializePayload (line 8) | function serializePayload(payload) {
function deserializePayload (line 11) | function deserializePayload(serialized) {
FILE: js/instantsearch.js/cjs/lib/utils/setIndexHelperState.js
function setIndexHelperState (line 9) | function setIndexHelperState(finalUiState, indexWidget) {
FILE: js/instantsearch.js/cjs/lib/utils/toArray.js
function toArray (line 7) | function toArray(value) {
FILE: js/instantsearch.js/cjs/lib/utils/unescape.js
function unescape (line 28) | function unescape(value) {
FILE: js/instantsearch.js/cjs/lib/utils/unescapeRefinement.js
function unescapeRefinement (line 8) | function unescapeRefinement(value) {
FILE: js/instantsearch.js/cjs/lib/utils/uniq.js
function uniq (line 7) | function uniq(array) {
FILE: js/instantsearch.js/cjs/lib/utils/uuid.js
function createUUID (line 13) | function createUUID() {
FILE: js/instantsearch.js/cjs/lib/utils/walkIndex.js
function walkIndex (line 11) | function walkIndex(indexWidget, callback) {
FILE: js/instantsearch.js/cjs/lib/voiceSearchHelper/index.js
function _typeof (line 7) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 8) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 9) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 10) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 11) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 12) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/middlewares/createInsightsMiddleware.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _slicedToArray (line 16) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 17) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _iterableToArrayLimit (line 18) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 19) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _toConsumableArray (line 20) | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _it...
function _nonIterableSpread (line 21) | function _nonIterableSpread() { throw new TypeError("Invalid attempt to ...
function _unsupportedIterableToArray (line 22) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _iterableToArray (line 23) | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && i...
function _arrayWithoutHoles (line 24) | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _array...
function _arrayLikeToArray (line 25) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function createInsightsMiddleware (line 28) | function createInsightsMiddleware() {
function getInitialParameters (line 333) | function getInitialParameters(instantSearchInstance) {
function saveTokenAsCookie (line 343) | function saveTokenAsCookie(token, cookieDuration) {
function isModernInsightsClient (line 355) | function isModernInsightsClient(client) {
function normalizeUserToken (line 374) | function normalizeUserToken(userToken) {
FILE: js/instantsearch.js/cjs/middlewares/createMetadataMiddleware.js
function extractWidgetPayload (line 9) | function extractWidgetPayload(widgets, instantSearchInstance, payload) {
function isMetadataEnabled (line 35) | function isMetadataEnabled() {
function createMetadataMiddleware (line 54) | function createMetadataMiddleware() {
FILE: js/instantsearch.js/cjs/middlewares/createRouterMiddleware.js
function _interopRequireDefault (line 10) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 11) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 12) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 13) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 14) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 15) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 16) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function topLevelCreateURL (line 27) | function topLevelCreateURL(nextState) {
FILE: js/instantsearch.js/cjs/templates/carousel/carousel.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 12) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 13) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 14) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 15) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 16) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _extends (line 17) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
function CarouselWithRefs (line 22) | function CarouselWithRefs(props) {
function carousel (line 31) | function carousel() {
FILE: js/instantsearch.js/cjs/widgets/analytics/analytics.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 9) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 10) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 11) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 12) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 13) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/answers/answers.js
function _interopRequireDefault (line 15) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 16) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 17) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 18) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 19) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 20) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 21) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/breadcrumb/breadcrumb.js
function _interopRequireDefault (line 15) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 16) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 17) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 18) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 19) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 20) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 21) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/clear-refinements/clear-refinements.js
function _interopRequireDefault (line 15) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 16) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 17) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 18) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 19) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 20) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 21) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/configure-related-items/configure-related-items.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 10) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/configure/configure.js
function _interopRequireDefault (line 9) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 10) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 11) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 12) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 13) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 14) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 15) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/current-refinements/current-refinements.js
function _interopRequireDefault (line 13) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 14) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 15) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 16) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 17) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 18) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 19) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/dynamic-widgets/dynamic-widgets.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 12) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 13) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 14) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 15) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 16) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 17) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 18) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 19) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function createContainer (line 24) | function createContainer(rootContainer) {
FILE: js/instantsearch.js/cjs/widgets/frequently-bought-together/frequently-bought-together.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 15) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 16) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 17) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 18) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 19) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 20) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 21) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 22) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function _extends (line 23) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
FILE: js/instantsearch.js/cjs/widgets/geo-search/GeoSearchRenderer.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 11) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 12) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 13) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 14) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 15) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 16) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _slicedToArray (line 17) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
function _nonIterableRest (line 18) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
function _unsupportedIterableToArray (line 19) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
function _arrayLikeToArray (line 20) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
function _iterableToArrayLimit (line 21) | function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undef...
function _arrayWithHoles (line 22) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
FILE: js/instantsearch.js/cjs/widgets/geo-search/createHTMLMarker.js
function _typeof (line 8) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _classCallCheck (line 9) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
function _defineProperties (line 10) | function _defineProperties(target, props) { for (var i = 0; i < props.le...
function _createClass (line 11) | function _createClass(Constructor, protoProps, staticProps) { if (protoP...
function _inherits (line 12) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
function _setPrototypeOf (line 13) | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf...
function _createSuper (line 14) | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNati...
function _possibleConstructorReturn (line 15) | function _possibleConstructorReturn(self, call) { if (call && (_typeof(c...
function _assertThisInitialized (line 16) | function _assertThisInitialized(self) { if (self === void 0) { throw new...
function _isNativeReflectConstruct (line 17) | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined...
function _getPrototypeOf (line 18) | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? ...
function _defineProperty (line 19) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 20) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 21) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function HTMLMarker (line 26) | function HTMLMarker(_ref) {
FILE: js/instantsearch.js/cjs/widgets/geo-search/geo-search.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 21) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 22) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 23) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 24) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 25) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 26) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 27) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 28) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
FILE: js/instantsearch.js/cjs/widgets/hierarchical-menu/hierarchical-menu.js
function _interopRequireDefault (line 15) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 16) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 17) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 18) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 19) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 20) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 21) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/hits-per-page/hits-per-page.js
function _interopRequireDefault (line 13) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function _typeof (line 14) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function ownKeys (line 15) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 16) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 17) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 18) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 19) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
FILE: js/instantsearch.js/cjs/widgets/hits/hits.js
function _typeof (line 3) | function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "funct...
function _interopRequireDefault (line 18) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
function ownKeys (line 19) | function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnProper...
function _objectSpread (line 20) | function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) {...
function _defineProperty (line 21) | function _defineProperty(obj, key, value) { key = _toPropertyKey(key); i...
function _toPropertyKey (line 22) | function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "...
function _toPrimitive (line 23) | function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t...
function _objectWithoutProperties (line 24) | function _objectWithoutProperties(source, excluded) { if (source == null...
function _objectWithoutPropertiesLoose (line 25) | function _objectWithoutPropertiesLoose(source, excluded) { if (source ==...
function _objectDestructuringEmpty (line 26) | function _objectDestructuringEmpty(obj) { if (obj == null) throw new Typ...
function _extends (line 27) | function _extends() { _extends = Object.assign ? Object.assign.bind() : ...
method __hitIndex (line 90) | get __hitIndex() {
FILE: js/instantsearch.js/cjs/widgets/index.js
function _interopRequireDefault (line 255) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
FILE: js/instantsearch.js/cjs/widgets/index
Condensed preview — 1011 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,640K chars).
[
{
"path": ".gitattributes",
"chars": 1210,
"preview": "# A set of files you probably don't want in your WordPress.org distribution\n.babelrc export-ignore\n.circleci/config.yml "
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 834,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 595,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
},
{
"path": ".github/LICENSE.md",
"chars": 15150,
"preview": "GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundati"
},
{
"path": ".github/MIT-LICENSE.md",
"chars": 1098,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Algolia\nhttp://www.algolia.com/\n\nPermission is hereby granted, free of charge,"
},
{
"path": ".gitignore",
"chars": 97,
"preview": "*.sql\n*.tar.gz\n*.zip\n.DS_Store\n.editorconfig\nThumbs.db\nbin\npublic\nnode_modules\ntests\ntmp\n/vendor\n"
},
{
"path": ".nvmrc",
"chars": 11,
"preview": "lts/erbium\n"
},
{
"path": "CHANGELOG.md",
"chars": 11565,
"preview": "## 2.11.3\n* Fixed: minimum requirement discrepancies in readme and defined constant.\n* Updated: cleaned out some unused "
},
{
"path": "README.txt",
"chars": 13055,
"preview": "=== WP Search with Algolia ===\r\nContributors: WebDevStudios, williamsba1, tw2113, mrasharirfan, scottbasgaard, gregricka"
},
{
"path": "algolia.php",
"chars": 4229,
"preview": "<?php\n/**\n * Plugin Name: WP Search with Algolia\n * Plugin URI: https://github.com/WebDevStudios/wp-search-"
},
{
"path": "classmap.php",
"chars": 3697,
"preview": "<?php\n/**\n * WP Search With Algolia \"Classmap\" file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since "
},
{
"path": "composer.json",
"chars": 2383,
"preview": "{\n \"name\": \"webdevstudios/wp-search-with-algolia\",\n \"version\": \"2.11.3\",\n \"description\": \"Integrate the powerful Algo"
},
{
"path": "css/algolia-autocomplete.css",
"chars": 3157,
"preview": ".algolia-autocomplete {\n\tz-index: 999999 !important;\n}\n.aa-dropdown-menu {\n\t/* we set the width in JS */\n\tfont-family: s"
},
{
"path": "css/algolia-instantsearch.css",
"chars": 4756,
"preview": "#ais-wrapper {\n\tdisplay: flex;\n}\n\n#ais-main {\n\tpadding: 1rem;\n\twidth: 100%;\n}\n\n#ais-facets {\n\twidth: 40%;\n\tpadding: 1rem"
},
{
"path": "css/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/admin/class-algolia-admin-page-autocomplete.php",
"chars": 10161,
"preview": "<?php\n/**\n * Algolia_Admin_Page_Autocomplete class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @si"
},
{
"path": "includes/admin/class-algolia-admin-page-native-search.php",
"chars": 7966,
"preview": "<?php\n/**\n * Algolia_Admin_Page_Native_Search class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @s"
},
{
"path": "includes/admin/class-algolia-admin-page-premium-support.php",
"chars": 2800,
"preview": "<?php\n/**\n * Algolia_Admin_Page_Premiun_Support class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * "
},
{
"path": "includes/admin/class-algolia-admin-page-seo.php",
"chars": 2856,
"preview": "<?php\n/**\n * Algolia_Admin_Page_SEO class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 2.5"
},
{
"path": "includes/admin/class-algolia-admin-page-settings.php",
"chars": 17732,
"preview": "<?php\n/**\n * Algolia_Admin_Page_Settings class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since "
},
{
"path": "includes/admin/class-algolia-admin-page-woocommerce.php",
"chars": 2928,
"preview": "<?php\n/**\n * Algolia_Admin_Page_WooCommerce class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @sin"
},
{
"path": "includes/admin/class-algolia-admin-template-notices.php",
"chars": 2278,
"preview": "<?php\n/**\n * Algolia_Admin_Template_Notices class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @sin"
},
{
"path": "includes/admin/class-algolia-admin.php",
"chars": 12049,
"preview": "<?php\n/**\n * Algolia_Admin class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n *\n * "
},
{
"path": "includes/admin/css/algolia-admin.css",
"chars": 3770,
"preview": "/**\n * All of the CSS for your admin-specific functionality should be\n * included in this file.\n */\n\n/*\n * https://algol"
},
{
"path": "includes/admin/css/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/admin/fonts/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/admin/img/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/admin/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/admin/js/algolia-admin.js",
"chars": 994,
"preview": "(function( $ ) {\n\t'use strict';\n\n\t$(\n\t\tfunction() {\n\n\t\t\tfunction updateAutocompletePositions () {\n\t\t\t\t$( '.table-autocom"
},
{
"path": "includes/admin/js/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/admin/js/push-settings-button.js",
"chars": 1299,
"preview": "(function($) {\n\n\t/* global algoliaPushSettingsButton */\n\n\t$(\n\t\tfunction() {\n\t\t\tvar $buttons = $( '.algolia-push-settings"
},
{
"path": "includes/admin/js/reindex-button.js",
"chars": 2177,
"preview": "(function($) {\n\n\t$(\n\t\tfunction() {\n\t\t\tvar $reindexButtons = $( '.algolia-reindex-button' );\n\t\t\t$reindexButtons.on( 'clic"
},
{
"path": "includes/admin/partials/form-options-premium-support.php",
"chars": 4313,
"preview": "<?php\n/**\n * Form options admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 2"
},
{
"path": "includes/admin/partials/form-options-seo.php",
"chars": 691,
"preview": "<?php\n/**\n * Form options admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 2"
},
{
"path": "includes/admin/partials/form-options-woocommerce.php",
"chars": 684,
"preview": "<?php\n/**\n * Form options admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 2"
},
{
"path": "includes/admin/partials/form-options.php",
"chars": 752,
"preview": "<?php\n/**\n * Form options admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1"
},
{
"path": "includes/admin/partials/form-override-search-option.php",
"chars": 1886,
"preview": "<?php\n/**\n * Form override search option admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com"
},
{
"path": "includes/admin/partials/form-override-search-version-option.php",
"chars": 1248,
"preview": "<?php\n/**\n * Form override search option admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com"
},
{
"path": "includes/admin/partials/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/admin/partials/page-autocomplete-config.php",
"chars": 4230,
"preview": "<?php\n/**\n * Autocomplete config admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @si"
},
{
"path": "includes/admin/partials/page-autocomplete.php",
"chars": 420,
"preview": "<?php\n/**\n * Autocomplete admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1"
},
{
"path": "includes/admin/partials/page-search.php",
"chars": 795,
"preview": "<?php\n/**\n * Search admin template partial.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n "
},
{
"path": "includes/class-algolia-api.php",
"chars": 5560,
"preview": "<?php\n/**\n * Algolia_API class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n *\n * @p"
},
{
"path": "includes/class-algolia-autocomplete-config.php",
"chars": 4183,
"preview": "<?php\n/**\n * Algolia_Autocomplete_Config class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since "
},
{
"path": "includes/class-algolia-cli.php",
"chars": 4266,
"preview": "<?php\n/**\n * Algolia_CLI class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n *\n * @p"
},
{
"path": "includes/class-algolia-compatibility.php",
"chars": 4968,
"preview": "<?php\n/**\n * Algolia_Compatibility class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0."
},
{
"path": "includes/class-algolia-plugin.php",
"chars": 11509,
"preview": "<?php\n/**\n * Algolia_Plugin class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n *\n *"
},
{
"path": "includes/class-algolia-scripts.php",
"chars": 1732,
"preview": "<?php\n/**\n * Algolia_Scripts class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.5.0\n *\n "
},
{
"path": "includes/class-algolia-search.php",
"chars": 10804,
"preview": "<?php\n/**\n * Algolia_Search class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n *\n *"
},
{
"path": "includes/class-algolia-settings.php",
"chars": 14827,
"preview": "<?php\n/**\n * Algolia_Settings class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n *\n"
},
{
"path": "includes/class-algolia-styles.php",
"chars": 876,
"preview": "<?php\n/**\n * Algolia_Styles class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.5.0\n *\n *"
},
{
"path": "includes/class-algolia-template-loader.php",
"chars": 8232,
"preview": "<?php\n/**\n * Algolia_Template_Loader class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1."
},
{
"path": "includes/class-algolia-utils.php",
"chars": 12474,
"preview": "<?php\n/**\n * Algolia_Utils class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n *\n * "
},
{
"path": "includes/factories/class-algolia-http-client-interface-factory.php",
"chars": 3381,
"preview": "<?php\n/**\n * Algolia_Http_Client_Interface_Factory class file.\n *\n * @since 1.6.0\n * @package WebDevStudios\\WPSWA\n */\n"
},
{
"path": "includes/factories/class-algolia-plugin-factory.php",
"chars": 802,
"preview": "<?php\n/**\n * Algolia_Plugin_Factory class file.\n *\n * @since 1.6.0\n * @package WebDevStudios\\WPSWA\n */\n\n/**\n * Class A"
},
{
"path": "includes/factories/class-algolia-search-client-factory.php",
"chars": 3741,
"preview": "<?php\n/**\n * Algolia_Search_Client_Factory class file.\n *\n * @since 1.6.0\n * @package WebDevStudios\\WPSWA\n */\n\nuse Web"
},
{
"path": "includes/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/indices/class-algolia-index-replica.php",
"chars": 2269,
"preview": "<?php\n/**\n * Algolia_Index_Replica class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0."
},
{
"path": "includes/indices/class-algolia-index.php",
"chars": 23318,
"preview": "<?php\n/**\n * Algolia_Index class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n *\n * "
},
{
"path": "includes/indices/class-algolia-posts-index.php",
"chars": 20186,
"preview": "<?php\n/**\n * Algolia_Posts_Index class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n"
},
{
"path": "includes/indices/class-algolia-searchable-posts-index.php",
"chars": 19033,
"preview": "<?php\n/**\n * Algolia_Searchable_Posts_Index class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @sin"
},
{
"path": "includes/indices/class-algolia-terms-index.php",
"chars": 8797,
"preview": "<?php\n/**\n * Algolia_Terms_Index class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n"
},
{
"path": "includes/indices/class-algolia-users-index.php",
"chars": 7596,
"preview": "<?php\n/**\n * Algolia_Users_Index class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.0.0\n"
},
{
"path": "includes/indices/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "includes/utilities/class-algolia-health-panel.php",
"chars": 2234,
"preview": "<?php\n/**\n * Algolia_Health_Panel class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 2.10."
},
{
"path": "includes/utilities/class-algolia-template-utils.php",
"chars": 9207,
"preview": "<?php\n/**\n * Algolia_Template_Utils class file.\n *\n * @since 1.8.0\n * @package WebDevStudios\\WPSWA\n */\n\n/**\n * Class A"
},
{
"path": "includes/utilities/class-algolia-update-messages.php",
"chars": 3683,
"preview": "<?php\n/**\n * Algolia_Update_Messages class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1."
},
{
"path": "includes/utilities/class-algolia-version-utils.php",
"chars": 3313,
"preview": "<?php\n/**\n * Algolia_Version_Utils class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since 1.8."
},
{
"path": "includes/watchers/class-algolia-changes-watcher.php",
"chars": 413,
"preview": "<?php\n/**\n * Algolia_Changes_Watcher interface file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since "
},
{
"path": "includes/watchers/class-algolia-post-changes-watcher.php",
"chars": 9771,
"preview": "<?php\n/**\n * Algolia_Post_Changes_Watcher class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since"
},
{
"path": "includes/watchers/class-algolia-term-changes-watcher.php",
"chars": 9436,
"preview": "<?php\n/**\n * Algolia_Term_Changes_Watcher class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since"
},
{
"path": "includes/watchers/class-algolia-user-changes-watcher.php",
"chars": 5059,
"preview": "<?php\n/**\n * Algolia_User_Changes_Watcher class file.\n *\n * @author WebDevStudios <contact@webdevstudios.com>\n * @since"
},
{
"path": "includes/watchers/index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "index.php",
"chars": 27,
"preview": "<?php // Silence is golden\n"
},
{
"path": "js/algoliasearch/README.md",
"chars": 2929,
"preview": "<p align=\"center\">\n <a href=\"https://www.algolia.com\">\n <img alt=\"Algolia for JavaScript\" src=\"https://raw.githubuse"
},
{
"path": "js/algoliasearch/dist/algoliasearch-lite.d.ts",
"chars": 2814,
"preview": "import { ClientTransporterOptions } from '@algolia/client-common';\r\nimport { FindAnswersOptions } from '@algolia/client-"
},
{
"path": "js/algoliasearch/dist/algoliasearch-lite.esm.browser.js",
"chars": 34586,
"preview": "function createBrowserLocalStorageCache(options) {\r\n const namespaceKey = `algoliasearch-client-js-${options.key}`;\r\n"
},
{
"path": "js/algoliasearch/dist/algoliasearch-lite.umd.js",
"chars": 14385,
"preview": "/*! algoliasearch-lite.umd.js | 4.18.0 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */"
},
{
"path": "js/algoliasearch/dist/algoliasearch.cjs.js",
"chars": 8093,
"preview": "'use strict';\n\nvar cacheCommon = require('@algolia/cache-common');\nvar cacheInMemory = require('@algolia/cache-in-memory"
},
{
"path": "js/algoliasearch/dist/algoliasearch.d.ts",
"chars": 21369,
"preview": "import { ABTest } from '@algolia/client-analytics';\r\nimport { AddABTestResponse } from '@algolia/client-analytics';\r\nimp"
},
{
"path": "js/algoliasearch/dist/algoliasearch.esm.browser.js",
"chars": 81760,
"preview": "function createBrowserLocalStorageCache(options) {\r\n const namespaceKey = `algoliasearch-client-js-${options.key}`;\r\n"
},
{
"path": "js/algoliasearch/dist/algoliasearch.umd.js",
"chars": 33515,
"preview": "/*! algoliasearch.umd.js | 4.18.0 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */\n!fun"
},
{
"path": "js/algoliasearch/index.d.ts",
"chars": 127,
"preview": "/* eslint-disable import/no-unresolved*/\nexport * from './dist/algoliasearch';\nexport { default } from './dist/algoliase"
},
{
"path": "js/algoliasearch/index.js",
"chars": 605,
"preview": "/* eslint-disable functional/immutable-data, import/no-commonjs */\nconst algoliasearch = require('./dist/algoliasearch.c"
},
{
"path": "js/algoliasearch/lite.d.ts",
"chars": 137,
"preview": "/* eslint-disable import/no-unresolved*/\nexport * from './dist/algoliasearch-lite';\nexport { default } from './dist/algo"
},
{
"path": "js/algoliasearch/lite.js",
"chars": 111,
"preview": "// eslint-disable-next-line functional/immutable-data, import/no-commonjs\nmodule.exports = require('./index');\n"
},
{
"path": "js/algoliasearch/package.json",
"chars": 2378,
"preview": "{\n \"_from\": \"algoliasearch@^4.18.0\",\n \"_id\": \"algoliasearch@4.18.0\",\n \"_inBundle\": false,\n \"_integrity\": \"sha512-pCu"
},
{
"path": "js/autocomplete-noconflict.js",
"chars": 56,
"preview": "window.algoliaAutocomplete = autocomplete.noConflict();\n"
},
{
"path": "js/autocomplete.js/CHANGELOG.md",
"chars": 13757,
"preview": "<a name=\"0.38.1\"></a>\n## [0.38.1](https://github.com/algolia/autocomplete.js/compare/v0.38.0...v0.38.1) (2021-12-13)\n\n\n\n"
},
{
"path": "js/autocomplete.js/CONTRIBUTING.md",
"chars": 2371,
"preview": "# Contributing to Autocomplete.js\n\nFirst of all, thanks for taking a look at contributing here 🎉 If you have any questio"
},
{
"path": "js/autocomplete.js/Gruntfile.js",
"chars": 3259,
"preview": "'use strict';\n\nmodule.exports = function(grunt) {\n grunt.initConfig({\n version: grunt.file.readJSON('package.json')."
},
{
"path": "js/autocomplete.js/LICENSE",
"chars": 1098,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2013 Algolia\nhttp://www.algolia.com/\n\nPermission is hereby granted, free of charge,"
},
{
"path": "js/autocomplete.js/README.md",
"chars": 29074,
"preview": "> **⚠️ Deprecation notice**\n>\n> [Autocomplete.js (v0.x)](https://www.npmjs.com/package/autocomplete.js) is deprecated an"
},
{
"path": "js/autocomplete.js/bower.json",
"chars": 447,
"preview": "{\n \"name\": \"algolia-autocomplete.js\",\n \"main\": \"dist/autocomplete.js\",\n \"version\": \"0.38.1\",\n \"homepage\": \"https://g"
},
{
"path": "js/autocomplete.js/dist/autocomplete.angular.js",
"chars": 78654,
"preview": "/*!\n * autocomplete.js 0.38.1\n * https://github.com/algolia/autocomplete.js\n * Copyright 2021 Algolia, Inc. and other co"
},
{
"path": "js/autocomplete.js/dist/autocomplete.jquery.js",
"chars": 78630,
"preview": "/*!\n * autocomplete.js 0.38.1\n * https://github.com/algolia/autocomplete.js\n * Copyright 2021 Algolia, Inc. and other co"
},
{
"path": "js/autocomplete.js/dist/autocomplete.js",
"chars": 125982,
"preview": "/*!\n * autocomplete.js 0.38.1\n * https://github.com/algolia/autocomplete.js\n * Copyright 2021 Algolia, Inc. and other co"
},
{
"path": "js/autocomplete.js/examples/basic.html",
"chars": 2174,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/boo"
},
{
"path": "js/autocomplete.js/examples/basic_angular.html",
"chars": 2682,
"preview": "<!DOCTYPE html>\n<html ng-app=\"myApp\">\n <head>\n <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstra"
},
{
"path": "js/autocomplete.js/examples/basic_jquery.html",
"chars": 2080,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/boo"
},
{
"path": "js/autocomplete.js/examples/index.html",
"chars": 1013,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "js/autocomplete.js/index.js",
"chars": 62,
"preview": "'use strict';\n\nmodule.exports = require('./src/standalone/');\n"
},
{
"path": "js/autocomplete.js/index_angular.js",
"chars": 71,
"preview": "'use strict';\n\nmodule.exports = require('./src/angular/directive.js');\n"
},
{
"path": "js/autocomplete.js/index_jquery.js",
"chars": 67,
"preview": "'use strict';\n\nmodule.exports = require('./src/jquery/plugin.js');\n"
},
{
"path": "js/autocomplete.js/karma.conf.js",
"chars": 1089,
"preview": "'use strict';\n\nmodule.exports = function(config) {\n config.set({\n basePath: '',\n\n frameworks: ['jasmine', 'sinon'"
},
{
"path": "js/autocomplete.js/package.json",
"chars": 3476,
"preview": "{\n \"_from\": \"autocomplete.js@^0.38.0\",\n \"_id\": \"autocomplete.js@0.38.1\",\n \"_inBundle\": false,\n \"_integrity\": \"sha512"
},
{
"path": "js/autocomplete.js/scripts/netlify-deploy.js",
"chars": 2124,
"preview": "#!/usr/bin/env node\n'use strict';\n/* eslint-disable no-console */\nconst execa = require('execa');\nconst replace = requir"
},
{
"path": "js/autocomplete.js/scripts/release.sh",
"chars": 1295,
"preview": "#!/usr/bin/env bash\n\nfunction error_exit\n{\n\techo \"release: $1\" 1>&2\n\texit 1\n}\n\nif [[ $# -eq 0 ]] ; then\n error_exit \"us"
},
{
"path": "js/autocomplete.js/src/angular/directive.js",
"chars": 3958,
"preview": "'use strict';\n\nvar angular = require('angular');\n\n// setup DOM element\nvar DOM = require('../common/dom.js');\nDOM.elemen"
},
{
"path": "js/autocomplete.js/src/autocomplete/css.js",
"chars": 2030,
"preview": "'use strict';\n\nvar _ = require('../common/utils.js');\n\nvar css = {\n wrapper: {\n position: 'relative',\n display: '"
},
{
"path": "js/autocomplete.js/src/autocomplete/dataset.js",
"chars": 8979,
"preview": "'use strict';\n\nvar datasetKey = 'aaDataset';\nvar valueKey = 'aaValue';\nvar datumKey = 'aaDatum';\n\nvar _ = require('../co"
},
{
"path": "js/autocomplete.js/src/autocomplete/dropdown.js",
"chars": 10498,
"preview": "'use strict';\n\nvar _ = require('../common/utils.js');\nvar DOM = require('../common/dom.js');\nvar EventEmitter = require("
},
{
"path": "js/autocomplete.js/src/autocomplete/event_bus.js",
"chars": 596,
"preview": "'use strict';\n\nvar namespace = 'autocomplete:';\n\nvar _ = require('../common/utils.js');\nvar DOM = require('../common/dom"
},
{
"path": "js/autocomplete.js/src/autocomplete/event_emitter.js",
"chars": 1988,
"preview": "'use strict';\n\nvar immediate = require('immediate');\nvar splitter = /\\s+/;\n\nmodule.exports = {\n onSync: onSync,\n onAsy"
},
{
"path": "js/autocomplete.js/src/autocomplete/html.js",
"chars": 320,
"preview": "'use strict';\n\nmodule.exports = {\n wrapper: '<span class=\"%ROOT%\"></span>',\n dropdown: '<span class=\"%PREFIX%%DROPDOWN"
},
{
"path": "js/autocomplete.js/src/autocomplete/input.js",
"chars": 8237,
"preview": "'use strict';\n\nvar specialKeyCodeMap;\n\nspecialKeyCodeMap = {\n 9: 'tab',\n 27: 'esc',\n 37: 'left',\n 39: 'right',\n 13:"
},
{
"path": "js/autocomplete.js/src/autocomplete/typeahead.js",
"chars": 18274,
"preview": "'use strict';\n\nvar attrsKey = 'aaAttrs';\n\nvar _ = require('../common/utils.js');\nvar DOM = require('../common/dom.js');\n"
},
{
"path": "js/autocomplete.js/src/common/dom.js",
"chars": 53,
"preview": "'use strict';\n\nmodule.exports = {\n element: null\n};\n"
},
{
"path": "js/autocomplete.js/src/common/parseAlgoliaClientVersion.js",
"chars": 413,
"preview": "'use strict';\n\nmodule.exports = function parseAlgoliaClientVersion(agent) {\n var parsed =\n // User agent for algolia"
},
{
"path": "js/autocomplete.js/src/common/utils.js",
"chars": 3402,
"preview": "'use strict';\n\nvar DOM = require('./dom.js');\n\nfunction escapeRegExp(str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\"
},
{
"path": "js/autocomplete.js/src/jquery/plugin.js",
"chars": 3903,
"preview": "'use strict';\n\n// setup DOM element\nvar DOM = require('../common/dom.js');\nvar $ = require('jquery');\nDOM.element = $;\n\n"
},
{
"path": "js/autocomplete.js/src/sources/hits.js",
"chars": 1877,
"preview": "'use strict';\n\nvar _ = require('../common/utils.js');\nvar version = require('../../version.js');\nvar parseAlgoliaClientV"
},
{
"path": "js/autocomplete.js/src/sources/index.js",
"chars": 106,
"preview": "'use strict';\n\nmodule.exports = {\n hits: require('./hits.js'),\n popularIn: require('./popularIn.js')\n};\n"
},
{
"path": "js/autocomplete.js/src/sources/popularIn.js",
"chars": 2635,
"preview": "'use strict';\n\nvar _ = require('../common/utils.js');\nvar version = require('../../version.js');\nvar parseAlgoliaClientV"
},
{
"path": "js/autocomplete.js/src/standalone/index.js",
"chars": 2893,
"preview": "'use strict';\n\n// this will inject Zepto in window, unfortunately no easy commonJS zepto build\nvar zepto = require('../."
},
{
"path": "js/autocomplete.js/test/ci.sh",
"chars": 445,
"preview": "#!/usr/bin/env bash\n\nset -e # exit when error, no verbose\n\nif [ \"$TEST_SUITE\" == \"unit\" ]; then\n ./node_modules/karma/b"
},
{
"path": "js/autocomplete.js/test/fixtures.js",
"chars": 1487,
"preview": "'use strict';\n\nvar fixtures = {};\n\nfixtures.data = {\n simple: [\n {value: 'big'},\n {value: 'bigger'},\n {value: "
},
{
"path": "js/autocomplete.js/test/helpers/mocks.js",
"chars": 1340,
"preview": "'use strict';\n\nvar _ = require('../../src/common/utils.js');\nvar $ = require('jquery');\nmodule.exports = function mock(C"
},
{
"path": "js/autocomplete.js/test/helpers/waits_for.js",
"chars": 652,
"preview": "'use strict';\n\nvar waitsForAndRuns = function(escapeFunction, runFunction, escapeTime) {\n // check the escapeFunction e"
},
{
"path": "js/autocomplete.js/test/integration/test.html",
"chars": 2914,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title></title>\n <script src=\"../../node_modules/jquery/dist/jquery.js\"></script>"
},
{
"path": "js/autocomplete.js/test/integration/test.js",
"chars": 12752,
"preview": "'use strict';\n\n/* eslint-env jasmine */\n\nvar wd = require('yiewd');\nvar colors = require('colors');\nvar expect = require"
},
{
"path": "js/autocomplete.js/test/playground.css",
"chars": 845,
"preview": ".my-custom-menu {\n width: 400px;\n}\n\n.aa-cursor {\n background: #F6624E;\n color: white;\n}\n\n.autocomplete-wrapper {\n di"
},
{
"path": "js/autocomplete.js/test/playground.html",
"chars": 7670,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/boo"
},
{
"path": "js/autocomplete.js/test/playground_angular.html",
"chars": 2052,
"preview": "<!DOCTYPE html>\n<html ng-app=\"myApp\">\n <head>\n <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstra"
},
{
"path": "js/autocomplete.js/test/playground_jquery.html",
"chars": 6937,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/boo"
},
{
"path": "js/autocomplete.js/test/test.bundle.js",
"chars": 132,
"preview": "'use strict';\n\nvar context = require.context('.', true, /.+_spec\\.js$/);\ncontext.keys().forEach(context);\nmodule.exports"
},
{
"path": "js/autocomplete.js/test/unit/angular_spec.js",
"chars": 1539,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\nif (typeof Function.prototype.bind != 'function') {\n Function.prototype"
},
{
"path": "js/autocomplete.js/test/unit/dataset_spec.js",
"chars": 17236,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\n\ndescribe('Dataset', function() {\n require('../../src/common/dom.js').e"
},
{
"path": "js/autocomplete.js/test/unit/dropdown_spec.js",
"chars": 13288,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('Dropdown', function() {\n require('../../src/common/dom.js').e"
},
{
"path": "js/autocomplete.js/test/unit/event_emitter_spec.js",
"chars": 3850,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('EventEmitter', function() {\n require('../../src/common/dom.js"
},
{
"path": "js/autocomplete.js/test/unit/hits_spec.js",
"chars": 4405,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('hits', function () {\n var hitsSource = require('../../src/sou"
},
{
"path": "js/autocomplete.js/test/unit/input_spec.js",
"chars": 13871,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('Input', function() {\n var $ = require('jquery');\n require('j"
},
{
"path": "js/autocomplete.js/test/unit/jquery_spec.js",
"chars": 1162,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('Typeahead', function() {\n var $ = require('jquery');\n requir"
},
{
"path": "js/autocomplete.js/test/unit/parseAlgoliaClientVersion_spec.js",
"chars": 787,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('parseAlgoliaClientVersion', function() {\n var parseAlgoliaCli"
},
{
"path": "js/autocomplete.js/test/unit/popularIn_spec.js",
"chars": 3714,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('popularIn', function() {\n require('../../src/common/dom.js')."
},
{
"path": "js/autocomplete.js/test/unit/standalone_spec.js",
"chars": 4141,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('Typeahead', function() {\n\n var fixtures = require('../fixture"
},
{
"path": "js/autocomplete.js/test/unit/typeahead_spec.js",
"chars": 31325,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\ndescribe('Typeahead', function() {\n require('../../src/common/dom.js')."
},
{
"path": "js/autocomplete.js/test/unit/utils_spec.js",
"chars": 3157,
"preview": "'use strict';\n\n/* eslint-env mocha, jasmine */\n\nvar _ = require('../../src/common/utils.js');\n\ndescribe('escapeHTML', fu"
},
{
"path": "js/autocomplete.js/version.js",
"chars": 27,
"preview": "module.exports = \"0.38.1\";\n"
},
{
"path": "js/autocomplete.js/zepto.js",
"chars": 46862,
"preview": "/* istanbul ignore next */\n/* Zepto v1.2.0 - zepto event assets data - zeptojs.com/license */\n(function(global, factory)"
},
{
"path": "js/instantsearch.js/CHANGELOG.md",
"chars": 227374,
"preview": "## [4.49.1](https://github.com/algolia/instantsearch.js/compare/v4.49.0...v4.49.1) (2022-11-01)\n\n\n### Bug Fixes\n\n* **ins"
},
{
"path": "js/instantsearch.js/LICENSE",
"chars": 1088,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015-present Algolia, Inc.\n\nPermission is hereby granted, free of charge, to any pe"
},
{
"path": "js/instantsearch.js/README.md",
"chars": 8572,
"preview": "<p align=\"center\">\n <a href=\"https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/js/\">\n <img"
},
{
"path": "js/instantsearch.js/cjs/components/Answers/Answers.js",
"chars": 3815,
"preview": "\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\""
},
{
"path": "js/instantsearch.js/cjs/components/Breadcrumb/Breadcrumb.js",
"chars": 2560,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/ClearRefinements/ClearRefinements.js",
"chars": 1426,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/CurrentRefinements/CurrentRefinements.js",
"chars": 1989,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/GeoSearchControls/GeoSearchButton.js",
"chars": 561,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/GeoSearchControls/GeoSearchControls.js",
"chars": 3135,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/GeoSearchControls/GeoSearchToggle.js",
"chars": 631,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/Highlight/Highlight.js",
"chars": 2177,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Highlight = Highlight;\nvar _inst"
},
{
"path": "js/instantsearch.js/cjs/components/Hits/Hits.js",
"chars": 4489,
"preview": "\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbo"
},
{
"path": "js/instantsearch.js/cjs/components/InfiniteHits/InfiniteHits.js",
"chars": 6756,
"preview": "\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\""
},
{
"path": "js/instantsearch.js/cjs/components/InternalHighlight/InternalHighlight.js",
"chars": 405,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.InternalHighlight = void 0;\nvar "
},
{
"path": "js/instantsearch.js/cjs/components/MenuSelect/MenuSelect.js",
"chars": 1959,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/Pagination/Pagination.js",
"chars": 4365,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/Pagination/PaginationLink.js",
"chars": 1050,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _preact ="
},
{
"path": "js/instantsearch.js/cjs/components/Panel/Panel.js",
"chars": 4143,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/PoweredBy/PoweredBy.js",
"chars": 6218,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/QueryRuleCustomData/QueryRuleCustomData.js",
"chars": 718,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/RangeInput/RangeInput.js",
"chars": 9146,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/RefinementList/RefinementList.js",
"chars": 16252,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/RefinementList/RefinementListItem.js",
"chars": 1430,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/RelevantSort/RelevantSort.js",
"chars": 1302,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/ReverseHighlight/ReverseHighlight.js",
"chars": 2226,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ReverseHighlight = ReverseHighli"
},
{
"path": "js/instantsearch.js/cjs/components/ReverseSnippet/ReverseSnippet.js",
"chars": 2212,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ReverseSnippet = ReverseSnippet;"
},
{
"path": "js/instantsearch.js/cjs/components/SearchBox/SearchBox.js",
"chars": 10680,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/Selector/Selector.js",
"chars": 960,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/Slider/Pit.js",
"chars": 2652,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/Slider/Rheostat.js",
"chars": 25529,
"preview": "\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\""
},
{
"path": "js/instantsearch.js/cjs/components/Slider/Slider.js",
"chars": 10047,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _instantse"
},
{
"path": "js/instantsearch.js/cjs/components/Snippet/Snippet.js",
"chars": 2163,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Snippet = Snippet;\nvar _instants"
},
{
"path": "js/instantsearch.js/cjs/components/Stats/Stats.js",
"chars": 4215,
"preview": "\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\""
},
{
"path": "js/instantsearch.js/cjs/components/Template/Template.js",
"chars": 10423,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/ToggleRefinement/ToggleRefinement.js",
"chars": 1510,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/components/VoiceSearch/VoiceSearch.js",
"chars": 2038,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _preact = "
},
{
"path": "js/instantsearch.js/cjs/connectors/answers/connectAnswers.js",
"chars": 6946,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
},
{
"path": "js/instantsearch.js/cjs/connectors/autocomplete/connectAutocomplete.js",
"chars": 7189,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
},
{
"path": "js/instantsearch.js/cjs/connectors/breadcrumb/connectBreadcrumb.js",
"chars": 11271,
"preview": "\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\""
},
{
"path": "js/instantsearch.js/cjs/connectors/clear-refinements/connectClearRefinements.js",
"chars": 8557,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
},
{
"path": "js/instantsearch.js/cjs/connectors/configure/connectConfigure.js",
"chars": 6393,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _algoliase"
},
{
"path": "js/instantsearch.js/cjs/connectors/configure-related-items/connectConfigureRelatedItems.js",
"chars": 6405,
"preview": "\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\""
},
{
"path": "js/instantsearch.js/cjs/connectors/current-refinements/connectCurrentRefinements.js",
"chars": 10353,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
},
{
"path": "js/instantsearch.js/cjs/connectors/dynamic-widgets/connectDynamicWidgets.js",
"chars": 8673,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
},
{
"path": "js/instantsearch.js/cjs/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.js",
"chars": 5504,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
},
{
"path": "js/instantsearch.js/cjs/connectors/geo-search/connectGeoSearch.js",
"chars": 11247,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
},
{
"path": "js/instantsearch.js/cjs/connectors/hierarchical-menu/connectHierarchicalMenu.js",
"chars": 15698,
"preview": "\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\""
},
{
"path": "js/instantsearch.js/cjs/connectors/hits/connectHits.js",
"chars": 6340,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
},
{
"path": "js/instantsearch.js/cjs/connectors/hits/connectHitsWithInsights.js",
"chars": 760,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _insights "
},
{
"path": "js/instantsearch.js/cjs/connectors/hits-per-page/connectHitsPerPage.js",
"chars": 8910,
"preview": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _utils = r"
}
]
// ... and 811 more files (download for full content)
About this extraction
This page contains the full source code of the WebDevStudios/wp-search-with-algolia GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1011 files (6.0 MB), approximately 1.6M tokens, and a symbol index with 6275 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.