{
  "version": 3,
  "sources": ["../../../src/components/page-patterns/search-items.js"],
  "sourcesContent": ["import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';\nimport { unlock } from '../../lock-unlock';\nconst { extractWords, getNormalizedSearchTerms, normalizeString } = unlock(\n\tblockEditorPrivateApis\n);\nimport {\n\tTEMPLATE_PART_ALL_AREAS_CATEGORY,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tPATTERN_TYPES,\n\tTEMPLATE_PART_POST_TYPE,\n} from '../../utils/constants';\n\n// Default search helpers.\nconst defaultGetName = ( item ) => {\n\tif ( item.type === PATTERN_TYPES.user ) {\n\t\treturn item.slug;\n\t}\n\n\tif ( item.type === TEMPLATE_PART_POST_TYPE ) {\n\t\treturn '';\n\t}\n\n\treturn item.name || '';\n};\n\nexport const defaultGetTitle = ( item ) => {\n\tif ( typeof item.title === 'string' ) {\n\t\treturn item.title;\n\t}\n\n\tif ( item.title && item.title.rendered ) {\n\t\treturn item.title.rendered;\n\t}\n\n\tif ( item.title && item.title.raw ) {\n\t\treturn item.title.raw;\n\t}\n\n\treturn '';\n};\n\nconst defaultGetDescription = ( item ) => {\n\tif ( item.type === PATTERN_TYPES.user ) {\n\t\treturn item.excerpt.raw;\n\t}\n\n\treturn item.description || '';\n};\n\nconst defaultGetKeywords = ( item ) => item.keywords || [];\nconst defaultHasCategory = () => false;\n\nconst removeMatchingTerms = ( unmatchedTerms, unprocessedTerms ) => {\n\treturn unmatchedTerms.filter(\n\t\t( term ) =>\n\t\t\t! getNormalizedSearchTerms( unprocessedTerms ).some(\n\t\t\t\t( unprocessedTerm ) => unprocessedTerm.includes( term )\n\t\t\t)\n\t);\n};\n\n/**\n * Filters an item list given a search term.\n *\n * @param {Array}  items       Item list\n * @param {string} searchInput Search input.\n * @param {Object} config      Search Config.\n *\n * @return {Array} Filtered item list.\n */\nexport const searchItems = ( items = [], searchInput = '', config = {} ) => {\n\tconst normalizedSearchTerms = getNormalizedSearchTerms( searchInput );\n\n\t// Filter patterns by category: the default category indicates that all patterns will be shown.\n\tconst onlyFilterByCategory =\n\t\tconfig.categoryId !== PATTERN_DEFAULT_CATEGORY &&\n\t\t! normalizedSearchTerms.length;\n\tconst searchRankConfig = { ...config, onlyFilterByCategory };\n\n\t// If we aren't filtering on search terms, matching on category is satisfactory.\n\t// If we are, then we need more than a category match.\n\tconst threshold = onlyFilterByCategory ? 0 : 1;\n\n\tconst rankedItems = items\n\t\t.map( ( item ) => {\n\t\t\treturn [\n\t\t\t\titem,\n\t\t\t\tgetItemSearchRank( item, searchInput, searchRankConfig ),\n\t\t\t];\n\t\t} )\n\t\t.filter( ( [ , rank ] ) => rank > threshold );\n\n\t// If we didn't have terms to search on, there's no point sorting.\n\tif ( normalizedSearchTerms.length === 0 ) {\n\t\treturn rankedItems.map( ( [ item ] ) => item );\n\t}\n\n\trankedItems.sort( ( [ , rank1 ], [ , rank2 ] ) => rank2 - rank1 );\n\treturn rankedItems.map( ( [ item ] ) => item );\n};\n\n/**\n * Get the search rank for a given item and a specific search term.\n * The better the match, the higher the rank.\n * If the rank equals 0, it should be excluded from the results.\n *\n * @param {Object} item       Item to filter.\n * @param {string} searchTerm Search term.\n * @param {Object} config     Search Config.\n *\n * @return {number} Search Rank.\n */\nfunction getItemSearchRank( item, searchTerm, config ) {\n\tconst {\n\t\tcategoryId,\n\t\tgetName = defaultGetName,\n\t\tgetTitle = defaultGetTitle,\n\t\tgetDescription = defaultGetDescription,\n\t\tgetKeywords = defaultGetKeywords,\n\t\thasCategory = defaultHasCategory,\n\t\tonlyFilterByCategory,\n\t} = config;\n\n\tlet rank =\n\t\tcategoryId === PATTERN_DEFAULT_CATEGORY ||\n\t\tcategoryId === TEMPLATE_PART_ALL_AREAS_CATEGORY ||\n\t\t( categoryId === PATTERN_USER_CATEGORY &&\n\t\t\titem.type === PATTERN_TYPES.user ) ||\n\t\thasCategory( item, categoryId )\n\t\t\t? 1\n\t\t\t: 0;\n\n\t// If an item doesn't belong to the current category or we don't have\n\t// search terms to filter by, return the initial rank value.\n\tif ( ! rank || onlyFilterByCategory ) {\n\t\treturn rank;\n\t}\n\n\tconst name = getName( item );\n\tconst title = getTitle( item );\n\tconst description = getDescription( item );\n\tconst keywords = getKeywords( item );\n\n\tconst normalizedSearchInput = normalizeString( searchTerm );\n\tconst normalizedTitle = normalizeString( title );\n\n\t// Prefers exact matches\n\t// Then prefers if the beginning of the title matches the search term\n\t// name, keywords, description matches come later.\n\tif ( normalizedSearchInput === normalizedTitle ) {\n\t\trank += 30;\n\t} else if ( normalizedTitle.startsWith( normalizedSearchInput ) ) {\n\t\trank += 20;\n\t} else {\n\t\tconst terms = [ name, title, description, ...keywords ].join( ' ' );\n\t\tconst normalizedSearchTerms = extractWords( normalizedSearchInput );\n\t\tconst unmatchedTerms = removeMatchingTerms(\n\t\t\tnormalizedSearchTerms,\n\t\t\tterms\n\t\t);\n\n\t\tif ( unmatchedTerms.length === 0 ) {\n\t\t\trank += 10;\n\t\t}\n\t}\n\n\treturn rank;\n}\n"],
  "mappings": "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",
  "names": []
}
