diff --git a/extend.php b/extend.php index 457aa34..3dec9f6 100644 --- a/extend.php +++ b/extend.php @@ -33,5 +33,6 @@ return [ (new Flarum\Settings()) ->default('blomstra-search.search-discussion-subjects', true) - ->default('blomstra-search.search-post-bodies', true), + ->default('blomstra-search.search-post-bodies', true) + ->default('blomstra-search.min-search-length', Commands\BuildCommand::DEFAULT_MIN_SEARCH_LENGTH), ]; diff --git a/js/dist/admin.js b/js/dist/admin.js index 4ec3e4a..878ff3a 100644 --- a/js/dist/admin.js +++ b/js/dist/admin.js @@ -1,2 +1,2 @@ -(()=>{var t={n:a=>{var e=a&&a.__esModule?()=>a.default:()=>a;return t.d(e,{a:e}),e},d:(a,e)=>{for(var r in e)t.o(e,r)&&!t.o(a,r)&&Object.defineProperty(a,r,{enumerable:!0,get:e[r]})},o:(t,a)=>Object.prototype.hasOwnProperty.call(t,a),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},a={};(()=>{"use strict";function e(t,a){return e=Object.setPrototypeOf||function(t,a){return t.__proto__=a,t},e(t,a)}t.r(a);const r=flarum.core.compat["admin/app"];var n=t.n(r);const s=flarum.core.compat["common/extend"],i=flarum.core.compat["admin/components/DashboardPage"];var o=t.n(i);const l=flarum.core.compat["admin/components/DashboardWidget"];var c=t.n(l);const d=flarum.core.compat["common/components/Alert"];var p=t.n(d),u=function(t){var a,r;function s(){return t.apply(this,arguments)||this}r=t,(a=s).prototype=Object.create(r.prototype),a.prototype.constructor=a,e(a,r);var i=s.prototype;return i.className=function(){return"ReindexWarningWidget"},i.content=function(){return m(p(),{type:"warning",dismissible:!1,icon:"fas fa-exclamation-triangle",title:n().translator.trans("blomstra-search.admin.reindex-required.title")},n().translator.trans("blomstra-search.admin.reindex-required.detail"))},s}(c());n().initializers.add("blomstra-search",(function(){var t=n().data.settings["blomstra-search.active-index"],a=n().data.settings["blomstra-search.index-compatible"];t&&"v2"!==a&&(0,s.extend)(o().prototype,"availableWidgets",(function(t){t.add("blomstra-search-reindex",m(u),110)}));var e=new Map;["arabic","armenian","basque","bengali","brazilian","bulgarian","catalan","cjk","czech","danish","dutch","english","estonian","finnish","french","galician","german","greek","hindi","hungarian","indonesian","irish","italian","latvian","lithuanian","norwegian","persian","portuguese","romanian","russian","sorani","spanish","swedish","turkish","thai"].forEach((function(t){e.set(t,t)})),n().extensionData.for("blomstra-search").registerSetting({setting:"blomstra-search.elastic-endpoint",label:n().translator.trans("blomstra-search.admin.elastic-endpoint"),type:"input"}).registerSetting({setting:"blomstra-search.elastic-username",label:n().translator.trans("blomstra-search.admin.elastic-username"),type:"input"}).registerSetting({setting:"blomstra-search.elastic-password",label:n().translator.trans("blomstra-search.admin.elastic-password"),type:"password"}).registerSetting({setting:"blomstra-search.elastic-index",label:n().translator.trans("blomstra-search.admin.elastic-index"),default:"flarum",type:"input"}).registerSetting({setting:"blomstra-search.analyzer-language",label:n().translator.trans("blomstra-search.admin.analyzer.label"),help:n().translator.trans("blomstra-search.admin.analyzer.help"),type:"select",options:Object.fromEntries(e.entries()),default:"english"}).registerSetting({setting:"blomstra-search.search-discussion-subjects",label:n().translator.trans("blomstra-search.admin.search-discussion-subjects"),type:"switch"}).registerSetting({setting:"blomstra-search.search-post-bodies",label:n().translator.trans("blomstra-search.admin.search-post-bodies"),type:"switch"})}))})(),module.exports=a})(); +(()=>{var t={n:a=>{var e=a&&a.__esModule?()=>a.default:()=>a;return t.d(e,{a:e}),e},d:(a,e)=>{for(var r in e)t.o(e,r)&&!t.o(a,r)&&Object.defineProperty(a,r,{enumerable:!0,get:e[r]})},o:(t,a)=>Object.prototype.hasOwnProperty.call(t,a)};(()=>{"use strict";function a(t,e){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,a){return t.__proto__=a,t},a(t,e)}const e=flarum.core.compat["admin/app"];var r=t.n(e);const n=flarum.core.compat["common/extend"],s=flarum.core.compat["admin/components/DashboardPage"];var i=t.n(s);const o=flarum.core.compat["admin/components/DashboardWidget"];var l=t.n(o);const c=flarum.core.compat["common/components/Alert"];var h=t.n(c),d=function(t){var e,n;function s(){return t.apply(this,arguments)||this}n=t,(e=s).prototype=Object.create(n.prototype),e.prototype.constructor=e,a(e,n);var i=s.prototype;return i.className=function(){return"ReindexWarningWidget"},i.content=function(){return m(h(),{type:"warning",dismissible:!1,icon:"fas fa-exclamation-triangle",title:r().translator.trans("blomstra-search.admin.reindex-required.title")},r().translator.trans("blomstra-search.admin.reindex-required.detail"))},s}(l());r().initializers.add("blomstra-search",function(){var t=r().data.settings["blomstra-search.active-index"],a=r().data.settings["blomstra-search.index-compatible"];t&&"v2"!==a&&(0,n.extend)(i().prototype,"availableWidgets",function(t){t.add("blomstra-search-reindex",m(d),110)});var e=new Map;["arabic","armenian","basque","bengali","brazilian","bulgarian","catalan","cjk","czech","danish","dutch","english","estonian","finnish","french","galician","german","greek","hindi","hungarian","indonesian","irish","italian","latvian","lithuanian","norwegian","persian","portuguese","romanian","russian","sorani","spanish","swedish","turkish","thai"].forEach(function(t){e.set(t,t)}),r().extensionData.for("blomstra-search").registerSetting(function(){var a=r().data.settings["blomstra-search.indexed-analyzer"];if(!t||!a)return null;var e=this.setting("blomstra-search.analyzer-language")()||"english",n=this.setting("blomstra-search.min-search-length")()||String(3),s=String(r().data.settings["blomstra-search.indexed-min-search-length"]||3);return e===a&&n===s?null:m(h(),{type:"warning",dismissible:!1,icon:"fas fa-exclamation-triangle"},r().translator.trans("blomstra-search.admin.index-settings-changed"))}).registerSetting({setting:"blomstra-search.elastic-endpoint",label:r().translator.trans("blomstra-search.admin.elastic-endpoint"),type:"input"}).registerSetting({setting:"blomstra-search.elastic-username",label:r().translator.trans("blomstra-search.admin.elastic-username"),type:"input"}).registerSetting({setting:"blomstra-search.elastic-password",label:r().translator.trans("blomstra-search.admin.elastic-password"),type:"password"}).registerSetting({setting:"blomstra-search.elastic-index",label:r().translator.trans("blomstra-search.admin.elastic-index"),default:"flarum",type:"input"}).registerSetting({setting:"blomstra-search.analyzer-language",label:r().translator.trans("blomstra-search.admin.analyzer.label"),help:r().translator.trans("blomstra-search.admin.analyzer.help"),type:"select",options:Object.fromEntries(e.entries()),default:"english"}).registerSetting({setting:"blomstra-search.search-discussion-subjects",label:r().translator.trans("blomstra-search.admin.search-discussion-subjects"),type:"switch"}).registerSetting({setting:"blomstra-search.search-post-bodies",label:r().translator.trans("blomstra-search.admin.search-post-bodies"),type:"switch"}).registerSetting({setting:"blomstra-search.min-search-length",label:r().translator.trans("blomstra-search.admin.min-search-length.label"),help:r().translator.trans("blomstra-search.admin.min-search-length.help"),type:"select",options:{1:"1",2:"2",3:"3",4:"4"},default:String(3)})})})(),module.exports={}})(); //# sourceMappingURL=admin.js.map \ No newline at end of file diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map index 9b7408c..86245ef 100644 --- a/js/dist/admin.js.map +++ b/js/dist/admin.js.map @@ -1 +1 @@ -{"version":3,"file":"admin.js","mappings":"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","sources":["webpack://@blomstra/search/webpack/bootstrap","webpack://@blomstra/search/webpack/runtime/compat get default export","webpack://@blomstra/search/webpack/runtime/define property getters","webpack://@blomstra/search/webpack/runtime/hasOwnProperty shorthand","webpack://@blomstra/search/webpack/runtime/make namespace object","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@blomstra/search/external root \"flarum.core.compat['admin/app']\"","webpack://@blomstra/search/external root \"flarum.core.compat['common/extend']\"","webpack://@blomstra/search/external root \"flarum.core.compat['admin/components/DashboardPage']\"","webpack://@blomstra/search/external root \"flarum.core.compat['admin/components/DashboardWidget']\"","webpack://@blomstra/search/external root \"flarum.core.compat['common/components/Alert']\"","webpack://@blomstra/search/./src/admin/index.ts","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/DashboardPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/DashboardWidget'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Alert'];","import app from 'flarum/admin/app';\nimport { extend } from 'flarum/common/extend';\nimport DashboardPage from 'flarum/admin/components/DashboardPage';\nimport DashboardWidget from 'flarum/admin/components/DashboardWidget';\nimport Alert from 'flarum/common/components/Alert';\n\nconst REQUIRED_INDEX_COMPAT = 'v2';\n\nclass ReindexWarningWidget extends DashboardWidget {\n className() {\n return 'ReindexWarningWidget';\n }\n\n content() {\n return m(Alert, {\n type: 'warning',\n dismissible: false,\n icon: 'fas fa-exclamation-triangle',\n title: app.translator.trans('blomstra-search.admin.reindex-required.title'),\n }, app.translator.trans('blomstra-search.admin.reindex-required.detail'));\n }\n}\n\napp.initializers.add('blomstra-search', () => {\n const activeIndex = app.data.settings['blomstra-search.active-index'];\n const compatVersion = app.data.settings['blomstra-search.index-compatible'];\n\n if (activeIndex && compatVersion !== REQUIRED_INDEX_COMPAT) {\n extend(DashboardPage.prototype, 'availableWidgets', function (items) {\n items.add('blomstra-search-reindex', m(ReindexWarningWidget), 110);\n });\n }\n\n const languages = new Map();\n [\n 'arabic',\n 'armenian',\n 'basque',\n 'bengali',\n 'brazilian',\n 'bulgarian',\n 'catalan',\n 'cjk',\n 'czech',\n 'danish',\n 'dutch',\n 'english',\n 'estonian',\n 'finnish',\n 'french',\n 'galician',\n 'german',\n 'greek',\n 'hindi',\n 'hungarian',\n 'indonesian',\n 'irish',\n 'italian',\n 'latvian',\n 'lithuanian',\n 'norwegian',\n 'persian',\n 'portuguese',\n 'romanian',\n 'russian',\n 'sorani',\n 'spanish',\n 'swedish',\n 'turkish',\n 'thai',\n ].forEach((language) => {\n languages.set(language, language);\n });\n\n app.extensionData\n .for('blomstra-search')\n .registerSetting({\n setting: 'blomstra-search.elastic-endpoint',\n label: app.translator.trans('blomstra-search.admin.elastic-endpoint'),\n type: 'input',\n })\n .registerSetting({\n setting: 'blomstra-search.elastic-username',\n label: app.translator.trans('blomstra-search.admin.elastic-username'),\n type: 'input',\n })\n .registerSetting({\n setting: 'blomstra-search.elastic-password',\n label: app.translator.trans('blomstra-search.admin.elastic-password'),\n type: 'password',\n })\n .registerSetting({\n setting: 'blomstra-search.elastic-index',\n label: app.translator.trans('blomstra-search.admin.elastic-index'),\n default: 'flarum',\n type: 'input',\n })\n .registerSetting({\n setting: 'blomstra-search.analyzer-language',\n label: app.translator.trans('blomstra-search.admin.analyzer.label'),\n help: app.translator.trans('blomstra-search.admin.analyzer.help'),\n type: 'select',\n options: Object.fromEntries(languages.entries()),\n default: 'english',\n })\n .registerSetting({\n setting: 'blomstra-search.search-discussion-subjects',\n label: app.translator.trans('blomstra-search.admin.search-discussion-subjects'),\n type: 'switch',\n })\n .registerSetting({\n setting: 'blomstra-search.search-post-bodies',\n label: app.translator.trans('blomstra-search.admin.search-post-bodies'),\n type: 'switch',\n });\n});\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","_setPrototypeOf","p","setPrototypeOf","__proto__","flarum","core","compat","ReindexWarningWidget","subClass","superClass","create","constructor","className","content","m","Alert","type","dismissible","icon","title","app","DashboardWidget","activeIndex","compatVersion","extend","DashboardPage","items","add","languages","Map","forEach","language","set","registerSetting","setting","label","default","help","options","fromEntries","entries"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"admin.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,GCLRF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3ER,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,I,mBCAlF,SAASI,EAAgBC,EAAGC,GAC1B,OAAOF,EAAkBT,OAAOY,eAAiBZ,OAAOY,eAAeC,OAAS,SAAUH,EAAGC,GAC3F,OAAOD,EAAEI,UAAYH,EAAGD,CAC1B,EAAGD,EAAgBC,EAAGC,EACxB,CCJA,MAAM,EAA+BI,OAAOC,KAAKC,OAAO,a,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,iBCAlD,EAA+BF,OAAOC,KAAKC,OAAO,kC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,oC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,2B,aCUlDC,EAAoB,SAAAC,GCT1B,IAAwBT,EAAGX,EDSD,SAAAmB,IAAA,OAAAC,EAAAC,MAAA,KAAAC,YAAA,KCTCtB,EDSDoB,GCTFT,EDSEQ,GCRtBZ,UAAYN,OAAOsB,OAAOvB,EAAEO,WAAYI,EAAEJ,UAAUiB,YAAcb,EAAGE,EAAeF,EAAGX,GDQjE,IAAAyB,EAAAN,EAAAZ,UAgBvB,OAhBuBkB,EACxBC,UAAA,WACE,MAAO,sBACT,EAACD,EAEDE,QAAA,WACE,OAAOC,EACLC,IACA,CACEC,KAAM,UACNC,aAAa,EACbC,KAAM,8BACNC,MAAOC,IAAAA,WAAeC,MAAM,iDAE9BD,IAAAA,WAAeC,MAAM,iDAEzB,EAAChB,CAAA,CAhBuB,CAASiB,KAmBnCF,IAAAA,aAAiBG,IAAI,kBAAmB,WACtC,IAAMC,EAAcJ,IAAAA,KAASK,SAAS,gCAChCC,EAAgBN,IAAAA,KAASK,SAAS,oCAEpCD,GA3BwB,OA2BTE,IACjBC,EAAAA,EAAAA,QAAOC,IAAAA,UAAyB,mBAAoB,SAAUC,GAC5DA,EAAMN,IAAI,0BAA2BT,EAAET,GAAuB,IAChE,GAGF,IAAMyB,EAAY,IAAIC,IACtB,CACE,SACA,WACA,SACA,UACA,YACA,YACA,UACA,MACA,QACA,SACA,QACA,UACA,WACA,UACA,SACA,WACA,SACA,QACA,QACA,YACA,aACA,QACA,UACA,UACA,aACA,YACA,UACA,aACA,WACA,UACA,SACA,UACA,UACA,UACA,QACAC,QAAQ,SAACC,GACTH,EAAUI,IAAID,EAAUA,EAC1B,GAEAb,IAAAA,cAAiB,IACV,mBACJe,gBAAgB,WAEf,IAAMC,EAAkBhB,IAAAA,KAASK,SAAS,oCAC1C,IAAKD,IAAgBY,EAAiB,OAAO,KAE7C,IAAMC,EAAkBC,KAAKC,QAAQ,oCAAbD,IAAuD,UACzEE,EAAmBF,KAAKC,QAAQ,oCAAbD,IAAuDG,OAhFpD,GAiFtBC,EAAmBD,OAAOrB,IAAAA,KAASK,SAAS,8CAjFtB,GAmF5B,OAAIY,IAAoBD,GAAmBI,IAAqBE,EAAyB,KAElF5B,EACLC,IACA,CAAEC,KAAM,UAAWC,aAAa,EAAOC,KAAM,+BAC7CE,IAAAA,WAAeC,MAAM,gDAEzB,GACCc,gBAAgB,CACfI,QAAS,mCACTI,MAAOvB,IAAAA,WAAeC,MAAM,0CAC5BL,KAAM,UAEPmB,gBAAgB,CACfI,QAAS,mCACTI,MAAOvB,IAAAA,WAAeC,MAAM,0CAC5BL,KAAM,UAEPmB,gBAAgB,CACfI,QAAS,mCACTI,MAAOvB,IAAAA,WAAeC,MAAM,0CAC5BL,KAAM,aAEPmB,gBAAgB,CACfI,QAAS,gCACTI,MAAOvB,IAAAA,WAAeC,MAAM,uCAC5BuB,QAAS,SACT5B,KAAM,UAEPmB,gBAAgB,CACfI,QAAS,oCACTI,MAAOvB,IAAAA,WAAeC,MAAM,wCAC5BwB,KAAMzB,IAAAA,WAAeC,MAAM,uCAC3BL,KAAM,SACN8B,QAAS3D,OAAO4D,YAAYjB,EAAUkB,WACtCJ,QAAS,YAEVT,gBAAgB,CACfI,QAAS,6CACTI,MAAOvB,IAAAA,WAAeC,MAAM,oDAC5BL,KAAM,WAEPmB,gBAAgB,CACfI,QAAS,qCACTI,MAAOvB,IAAAA,WAAeC,MAAM,4CAC5BL,KAAM,WAEPmB,gBAAgB,CACfI,QAAS,oCACTI,MAAOvB,IAAAA,WAAeC,MAAM,iDAC5BwB,KAAMzB,IAAAA,WAAeC,MAAM,gDAC3BL,KAAM,SACN8B,QAAS,CAAE,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAC9CF,QAASH,OAxImB,IA0IlC,E","sources":["webpack://@blomstra/search/webpack/bootstrap","webpack://@blomstra/search/webpack/runtime/compat get default export","webpack://@blomstra/search/webpack/runtime/define property getters","webpack://@blomstra/search/webpack/runtime/hasOwnProperty shorthand","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@blomstra/search/external root \"flarum.core.compat['admin/app']\"","webpack://@blomstra/search/external root \"flarum.core.compat['common/extend']\"","webpack://@blomstra/search/external root \"flarum.core.compat['admin/components/DashboardPage']\"","webpack://@blomstra/search/external root \"flarum.core.compat['admin/components/DashboardWidget']\"","webpack://@blomstra/search/external root \"flarum.core.compat['common/components/Alert']\"","webpack://@blomstra/search/./src/admin/index.ts","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/DashboardPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/DashboardWidget'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Alert'];","import app from 'flarum/admin/app';\nimport { extend } from 'flarum/common/extend';\nimport DashboardPage from 'flarum/admin/components/DashboardPage';\nimport DashboardWidget from 'flarum/admin/components/DashboardWidget';\nimport Alert from 'flarum/common/components/Alert';\n\nconst REQUIRED_INDEX_COMPAT = 'v2';\n// Matches Flarum's Search.MIN_SEARCH_LEN — not imported here as Search is a forum-only component.\nconst DEFAULT_MIN_SEARCH_LENGTH = 3;\n\nclass ReindexWarningWidget extends DashboardWidget {\n className() {\n return 'ReindexWarningWidget';\n }\n\n content() {\n return m(\n Alert,\n {\n type: 'warning',\n dismissible: false,\n icon: 'fas fa-exclamation-triangle',\n title: app.translator.trans('blomstra-search.admin.reindex-required.title'),\n },\n app.translator.trans('blomstra-search.admin.reindex-required.detail')\n );\n }\n}\n\napp.initializers.add('blomstra-search', () => {\n const activeIndex = app.data.settings['blomstra-search.active-index'];\n const compatVersion = app.data.settings['blomstra-search.index-compatible'];\n\n if (activeIndex && compatVersion !== REQUIRED_INDEX_COMPAT) {\n extend(DashboardPage.prototype, 'availableWidgets', function (items) {\n items.add('blomstra-search-reindex', m(ReindexWarningWidget), 110);\n });\n }\n\n const languages = new Map();\n [\n 'arabic',\n 'armenian',\n 'basque',\n 'bengali',\n 'brazilian',\n 'bulgarian',\n 'catalan',\n 'cjk',\n 'czech',\n 'danish',\n 'dutch',\n 'english',\n 'estonian',\n 'finnish',\n 'french',\n 'galician',\n 'german',\n 'greek',\n 'hindi',\n 'hungarian',\n 'indonesian',\n 'irish',\n 'italian',\n 'latvian',\n 'lithuanian',\n 'norwegian',\n 'persian',\n 'portuguese',\n 'romanian',\n 'russian',\n 'sorani',\n 'spanish',\n 'swedish',\n 'turkish',\n 'thai',\n ].forEach((language) => {\n languages.set(language, language);\n });\n\n app.extensionData\n .for('blomstra-search')\n .registerSetting(function (this: any) {\n // No index yet, or first build predates this tracking — stay silent.\n const indexedAnalyzer = app.data.settings['blomstra-search.indexed-analyzer'];\n if (!activeIndex || !indexedAnalyzer) return null;\n\n const currentAnalyzer = this.setting('blomstra-search.analyzer-language')() || 'english';\n const currentMinLength = this.setting('blomstra-search.min-search-length')() || String(DEFAULT_MIN_SEARCH_LENGTH);\n const indexedMinLength = String(app.data.settings['blomstra-search.indexed-min-search-length'] || DEFAULT_MIN_SEARCH_LENGTH);\n\n if (currentAnalyzer === indexedAnalyzer && currentMinLength === indexedMinLength) return null;\n\n return m(\n Alert,\n { type: 'warning', dismissible: false, icon: 'fas fa-exclamation-triangle' },\n app.translator.trans('blomstra-search.admin.index-settings-changed')\n );\n })\n .registerSetting({\n setting: 'blomstra-search.elastic-endpoint',\n label: app.translator.trans('blomstra-search.admin.elastic-endpoint'),\n type: 'input',\n })\n .registerSetting({\n setting: 'blomstra-search.elastic-username',\n label: app.translator.trans('blomstra-search.admin.elastic-username'),\n type: 'input',\n })\n .registerSetting({\n setting: 'blomstra-search.elastic-password',\n label: app.translator.trans('blomstra-search.admin.elastic-password'),\n type: 'password',\n })\n .registerSetting({\n setting: 'blomstra-search.elastic-index',\n label: app.translator.trans('blomstra-search.admin.elastic-index'),\n default: 'flarum',\n type: 'input',\n })\n .registerSetting({\n setting: 'blomstra-search.analyzer-language',\n label: app.translator.trans('blomstra-search.admin.analyzer.label'),\n help: app.translator.trans('blomstra-search.admin.analyzer.help'),\n type: 'select',\n options: Object.fromEntries(languages.entries()),\n default: 'english',\n })\n .registerSetting({\n setting: 'blomstra-search.search-discussion-subjects',\n label: app.translator.trans('blomstra-search.admin.search-discussion-subjects'),\n type: 'switch',\n })\n .registerSetting({\n setting: 'blomstra-search.search-post-bodies',\n label: app.translator.trans('blomstra-search.admin.search-post-bodies'),\n type: 'switch',\n })\n .registerSetting({\n setting: 'blomstra-search.min-search-length',\n label: app.translator.trans('blomstra-search.admin.min-search-length.label'),\n help: app.translator.trans('blomstra-search.admin.min-search-length.help'),\n type: 'select',\n options: { '1': '1', '2': '2', '3': '3', '4': '4' },\n default: String(DEFAULT_MIN_SEARCH_LENGTH),\n });\n});\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","_setPrototypeOf","t","e","setPrototypeOf","bind","__proto__","flarum","core","compat","ReindexWarningWidget","_DashboardWidget","apply","arguments","create","constructor","_proto","className","content","m","Alert","type","dismissible","icon","title","app","trans","DashboardWidget","add","activeIndex","settings","compatVersion","extend","DashboardPage","items","languages","Map","forEach","language","set","registerSetting","indexedAnalyzer","currentAnalyzer","this","setting","currentMinLength","String","indexedMinLength","label","default","help","options","fromEntries","entries"],"sourceRoot":""} \ No newline at end of file diff --git a/js/dist/forum.js b/js/dist/forum.js index 9e00f74..a9c0a3a 100644 --- a/js/dist/forum.js +++ b/js/dist/forum.js @@ -1,2 +1,3 @@ -(()=>{var t={195:(t,r,e)=>{t.exports=e(236)},236:t=>{var r=function(t){"use strict";var r,e=Object.prototype,n=e.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",i=o.asyncIterator||"@@asyncIterator",c=o.toStringTag||"@@toStringTag";function s(t,r,e){return Object.defineProperty(t,r,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[r]}try{s({},"")}catch(t){s=function(t,r,e){return t[r]=e}}function u(t,r,e,n){var o=r&&r.prototype instanceof y?r:y,a=Object.create(o.prototype),i=new S(n||[]);return a._invoke=function(t,r,e){var n=h;return function(o,a){if(n===p)throw new Error("Generator is already running");if(n===m){if("throw"===o)throw a;return N()}for(e.method=o,e.arg=a;;){var i=e.delegate;if(i){var c=P(i,e);if(c){if(c===v)continue;return c}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if(n===h)throw n=m,e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);n=p;var s=l(t,r,e);if("normal"===s.type){if(n=e.done?m:f,s.arg===v)continue;return{value:s.arg,done:e.done}}"throw"===s.type&&(n=m,e.method="throw",e.arg=s.arg)}}}(t,e,i),a}function l(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var h="suspendedStart",f="suspendedYield",p="executing",m="completed",v={};function y(){}function d(){}function g(){}var w={};s(w,a,(function(){return this}));var b=Object.getPrototypeOf,x=b&&b(b(k([])));x&&x!==e&&n.call(x,a)&&(w=x);var L=g.prototype=y.prototype=Object.create(w);function E(t){["next","throw","return"].forEach((function(r){s(t,r,(function(t){return this._invoke(r,t)}))}))}function _(t,r){function e(o,a,i,c){var s=l(t[o],t,a);if("throw"!==s.type){var u=s.arg,h=u.value;return h&&"object"==typeof h&&n.call(h,"__await")?r.resolve(h.__await).then((function(t){e("next",t,i,c)}),(function(t){e("throw",t,i,c)})):r.resolve(h).then((function(t){u.value=t,i(u)}),(function(t){return e("throw",t,i,c)}))}c(s.arg)}var o;this._invoke=function(t,n){function a(){return new r((function(r,o){e(t,n,r,o)}))}return o=o?o.then(a,a):a()}}function P(t,e){var n=t.iterator[e.method];if(n===r){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=r,P(t,e),"throw"===e.method))return v;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var o=l(n,t.iterator,e.arg);if("throw"===o.type)return e.method="throw",e.arg=o.arg,e.delegate=null,v;var a=o.arg;return a?a.done?(e[t.resultName]=a.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=r),e.delegate=null,v):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,v)}function O(t){var r={tryLoc:t[0]};1 in t&&(r.catchLoc=t[1]),2 in t&&(r.finallyLoc=t[2],r.afterLoc=t[3]),this.tryEntries.push(r)}function j(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function S(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(O,this),this.reset(!0)}function k(t){if(t){var e=t[a];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function e(){for(;++o=0;--a){var i=this.tryEntries[a],c=i.completion;if("root"===i.tryLoc)return o("end");if(i.tryLoc<=this.prev){var s=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(s&&u){if(this.prev=0;--e){var o=this.tryEntries[e];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),j(e),v}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;j(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:k(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=r),v}},t}(t.exports);try{regeneratorRuntime=r}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}}},r={};function e(n){var o=r[n];if(void 0!==o)return o.exports;var a=r[n]={exports:{}};return t[n](a,a.exports,e),a.exports}e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var n={};(()=>{"use strict";e.r(n);const t=flarum.core.compat["forum/app"];var r=e.n(t);const o=flarum.core.compat["forum/components/Search"];var a=e.n(o);const i=flarum.core.compat["common/extend"];function c(t,r,e,n,o,a,i){try{var c=t[a](i),s=c.value}catch(t){return void e(t)}c.done?r(s):Promise.resolve(s).then(n,o)}function s(t){return function(){var r=this,e=arguments;return new Promise((function(n,o){var a=t.apply(r,e);function i(t){c(a,n,o,i,s,"next",t)}function s(t){c(a,n,o,i,s,"throw",t)}i(void 0)}))}}var u=e(195),l=e.n(u);const h=flarum.core.compat["common/helpers/highlight"];var f=e.n(h);const p=flarum.core.compat["common/components/LinkButton"];var v=e.n(p);const y=flarum.core.compat["common/components/Link"];var d=e.n(y),g=function(){function t(){this.results=new Map,this.type="discussions"}var e=t.prototype;return e.search=function(){var t=s(l().mark((function t(e){var n,o,a,i;return l().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e=e.toLowerCase(),this.results.set(e,[]),n={filter:{q:e},page:{limit:3},include:"mostRelevantPost"},o=r().forum.attribute("apiUrl")+"/blomstra/search/"+this.type,t.next=6,r().request({params:n,url:o,method:"GET"});case 6:a=t.sent,i=r().store.pushPayload(a),this.results.set(e,i);case 9:case"end":return t.stop()}}),t,this)})));return function(r){return t.apply(this,arguments)}}(),e.view=function(t){var e=this;t=t.toLowerCase();var n=(this.results.get(t)||[]).map((function(n){var o=n.mostRelevantPost();return m("li",{className:"DiscussionSearchResult","data-index":""+e.type+n.id()},m(d(),{href:r().route.discussion(n,o&&o.number())},m("div",{className:"DiscussionSearchResult-title"},f()(n.title(),t)),!!o&&m("div",{className:"DiscussionSearchResult-excerpt"},f()(o.contentPlain(),t,100))))}));return[m("li",{className:"Dropdown-header"},r().translator.trans("core.forum.search.discussions_heading")),m("li",null,m(v(),{icon:"fas fa-search",href:r().route("index",{q:t})},r().translator.trans("core.forum.search.all_discussions_button",{query:t})))].concat(n)},t}();function w(){return w=Object.assign||function(t){for(var r=1;r{var t={163(t){t.exports=function(t,e){this.v=t,this.k=e},t.exports.__esModule=!0,t.exports.default=t.exports},110(t,e,r){var n=r(397);function o(){var e,r,s="function"==typeof Symbol?Symbol:{},u=s.iterator||"@@iterator",a=s.toStringTag||"@@toStringTag";function i(t,o,s,u){var a=o&&o.prototype instanceof p?o:p,i=Object.create(a.prototype);return n(i,"_invoke",function(t,n,o){var s,u,a,i=0,p=o||[],l=!1,f={p:0,n:0,v:e,a:m,f:m.bind(e,4),d:function(t,r){return s=t,u=0,a=e,f.n=r,c}};function m(t,n){for(u=t,a=n,r=0;!l&&i&&!o&&r3?(o=d===n)&&(a=s[(u=s[4])?5:(u=3,3)],s[4]=s[5]=e):s[0]<=m&&((o=t<2&&mn||n>d)&&(s[4]=t,s[5]=n,f.n=d,u=0))}if(o||t>1)return c;throw l=!0,n}return function(o,p,d){if(i>1)throw TypeError("Generator is already running");for(l&&1===p&&m(p,d),u=p,a=d;(r=u<2?e:a)||!l;){s||(u?u<3?(u>1&&(f.n=-1),m(u,a)):f.n=a:f.v=a);try{if(i=2,s){if(u||(o="next"),r=s[o]){if(!(r=r.call(s,a)))throw TypeError("iterator result is not an object");if(!r.done)return r;a=r.value,u<2&&(u=0)}else 1===u&&(r=s.return)&&r.call(s),u<2&&(a=TypeError("The iterator does not provide a '"+o+"' method"),u=1);s=e}else if((r=(l=f.n<0)?a:t.call(n,f))!==c)break}catch(t){s=e,u=1,a=t}finally{i=1}}return{value:r,done:l}}}(t,s,u),!0),i}var c={};function p(){}function l(){}function f(){}r=Object.getPrototypeOf;var m=[][u]?r(r([][u]())):(n(r={},u,function(){return this}),r),d=f.prototype=p.prototype=Object.create(m);function v(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,f):(t.__proto__=f,n(t,a,"GeneratorFunction")),t.prototype=Object.create(d),t}return l.prototype=f,n(d,"constructor",f),n(f,"constructor",l),l.displayName="GeneratorFunction",n(f,a,"GeneratorFunction"),n(d),n(d,a,"Generator"),n(d,u,function(){return this}),n(d,"toString",function(){return"[object Generator]"}),(t.exports=o=function(){return{w:i,m:v}},t.exports.__esModule=!0,t.exports.default=t.exports)()}t.exports=o,t.exports.__esModule=!0,t.exports.default=t.exports},996(t,e,r){var n=r(312);t.exports=function(t,e,r,o,s){var u=n(t,e,r,o,s);return u.next().then(function(t){return t.done?t.value:u.next()})},t.exports.__esModule=!0,t.exports.default=t.exports},312(t,e,r){var n=r(110),o=r(166);t.exports=function(t,e,r,s,u){return new o(n().w(t,e,r,s),u||Promise)},t.exports.__esModule=!0,t.exports.default=t.exports},166(t,e,r){var n=r(163),o=r(397);t.exports=function t(e,r){function s(t,o,u,a){try{var i=e[t](o),c=i.value;return c instanceof n?r.resolve(c.v).then(function(t){s("next",t,u,a)},function(t){s("throw",t,u,a)}):r.resolve(c).then(function(t){i.value=t,u(i)},function(t){return s("throw",t,u,a)})}catch(t){a(t)}}var u;this.next||(o(t.prototype),o(t.prototype,"function"==typeof Symbol&&Symbol.asyncIterator||"@asyncIterator",function(){return this})),o(this,"_invoke",function(t,e,n){function o(){return new r(function(e,r){s(t,n,e,r)})}return u=u?u.then(o,o):o()},!0)},t.exports.__esModule=!0,t.exports.default=t.exports},397(t){function e(r,n,o,s){var u=Object.defineProperty;try{u({},"",{})}catch(r){u=0}t.exports=e=function(t,r,n,o){function s(r,n){e(t,r,function(t){return this._invoke(r,n,t)})}r?u?u(t,r,{value:n,enumerable:!o,configurable:!o,writable:!o}):t[r]=n:(s("next",0),s("throw",1),s("return",2))},t.exports.__esModule=!0,t.exports.default=t.exports,e(r,n,o,s)}t.exports=e,t.exports.__esModule=!0,t.exports.default=t.exports},766(t){t.exports=function(t){var e=Object(t),r=[];for(var n in e)r.unshift(n);return function t(){for(;r.length;)if((n=r.pop())in e)return t.value=n,t.done=!1,t;return t.done=!0,t}},t.exports.__esModule=!0,t.exports.default=t.exports},24(t,e,r){var n=r(163),o=r(110),s=r(996),u=r(312),a=r(166),i=r(766),c=r(760);function p(){"use strict";var e=o(),r=e.m(p),l=(Object.getPrototypeOf?Object.getPrototypeOf(r):r.__proto__).constructor;function f(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===l||"GeneratorFunction"===(e.displayName||e.name))}var m={throw:1,return:2,break:3,continue:3};function d(t){var e,r;return function(n){e||(e={stop:function(){return r(n.a,2)},catch:function(){return n.v},abrupt:function(t,e){return r(n.a,m[t],e)},delegateYield:function(t,o,s){return e.resultName=o,r(n.d,c(t),s)},finish:function(t){return r(n.f,t)}},r=function(t,r,o){n.p=e.prev,n.n=e.next;try{return t(r,o)}finally{e.next=n.n}}),e.resultName&&(e[e.resultName]=n.v,e.resultName=void 0),e.sent=n.v,e.next=n.n;try{return t.call(this,e)}finally{n.p=e.prev,n.n=e.next}}}return(t.exports=p=function(){return{wrap:function(t,r,n,o){return e.w(d(t),r,n,o&&o.reverse())},isGeneratorFunction:f,mark:e.m,awrap:function(t,e){return new n(t,e)},AsyncIterator:a,async:function(t,e,r,n,o){return(f(e)?u:s)(d(t),e,r,n,o)},keys:i,values:c}},t.exports.__esModule=!0,t.exports.default=t.exports)()}t.exports=p,t.exports.__esModule=!0,t.exports.default=t.exports},760(t,e,r){var n=r(735).default;t.exports=function(t){if(null!=t){var e=t["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],r=0;if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length))return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}}}throw new TypeError(n(t)+" is not iterable")},t.exports.__esModule=!0,t.exports.default=t.exports},735(t){function e(r){return t.exports=e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t.exports.__esModule=!0,t.exports.default=t.exports,e(r)}t.exports=e,t.exports.__esModule=!0,t.exports.default=t.exports},183(t,e,r){var n=r(24)();t.exports=n;try{regeneratorRuntime=n}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=n:Function("r","regeneratorRuntime = r")(n)}}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var s=e[n]={exports:{}};return t[n](s,s.exports,r),s.exports}r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";const t=flarum.core.compat["forum/app"];var e=r.n(t);const n=flarum.core.compat["forum/components/Search"];var o=r.n(n);const s=flarum.core.compat["common/extend"];function u(t,e,r,n,o,s,u){try{var a=t[s](u),i=a.value}catch(t){return void r(t)}a.done?e(i):Promise.resolve(i).then(n,o)}function a(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var s=t.apply(e,r);function a(t){u(s,n,o,a,i,"next",t)}function i(t){u(s,n,o,a,i,"throw",t)}a(void 0)})}}var i=r(183),c=r.n(i);const p=flarum.core.compat["common/helpers/highlight"];var l=r.n(p);const f=flarum.core.compat["common/components/LinkButton"];var d=r.n(f);const v=flarum.core.compat["common/components/Link"];var h=r.n(v),x=function(){function t(){this.results=new Map,this.type="discussions"}var r=t.prototype;return r.search=function(){var t=a(c().mark(function t(r){var n,o,s,u;return c().wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return r=r.toLowerCase(),this.results.set(r,[]),n={filter:{q:r},page:{limit:3},include:"mostRelevantPost"},o=e().forum.attribute("apiUrl")+"/blomstra/search/"+this.type,t.next=6,e().request({params:n,url:o,method:"GET"});case 6:s=t.sent,u=e().store.pushPayload(s),this.results.set(r,u);case 9:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}(),r.view=function(t){var r=this;t=t.toLowerCase();var n=(this.results.get(t)||[]).map(function(n){var o=n.mostRelevantPost();return m("li",{className:"DiscussionSearchResult","data-index":""+r.type+n.id()},m(h(),{href:e().route.discussion(n,o&&o.number())},m("div",{className:"DiscussionSearchResult-title"},l()(n.title(),t)),!!o&&m("div",{className:"DiscussionSearchResult-excerpt"},l()(o.contentPlain(),t,100))))});return[m("li",{className:"Dropdown-header"},e().translator.trans("core.forum.search.discussions_heading")),m("li",null,m(d(),{icon:"fas fa-search",href:e().route("index",{q:t})},e().translator.trans("core.forum.search.all_discussions_button",{query:t})))].concat(n)},t}();function y(){return y=Object.assign?Object.assign.bind():function(t){for(var e=1;e result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Search'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/highlight'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","import app from 'flarum/forum/app';\nimport highlight from 'flarum/common/helpers/highlight';\nimport LinkButton from 'flarum/common/components/LinkButton';\nimport Link from 'flarum/common/components/Link';\nimport { SearchSource } from 'flarum/forum/components/Search';\nimport type Mithril from 'mithril';\n\n/**\n * The `DiscussionsSearchSource` finds and displays discussion search results in\n * the search dropdown.\n */\nexport default class DiscussionsSearchSource implements SearchSource {\n /**\n * Map of lowercase search queries to their respective model results\n */\n protected results = new Map();\n\n /**\n * Model name used for assembling API endpoint URL, and for frontend DOM.\n */\n private type = 'discussions';\n\n async search(query: string): Promise {\n query = query.toLowerCase();\n\n this.results.set(query, []);\n\n const params = {\n filter: { q: query },\n page: { limit: 3 },\n include: 'mostRelevantPost',\n };\n\n // Construct API search URI\n const url = `${app.forum.attribute('apiUrl')}/blomstra/search/${this.type}`;\n\n // Make API GET request\n const results = await app.request({ params, url, method: 'GET' });\n\n // Parse API response into models and push to store\n const models = app.store.pushPayload(results);\n\n // Add models to results map\n this.results.set(query, models);\n }\n\n view(query: string): Array {\n query = query.toLowerCase();\n\n // Get results from map\n const queryResults = this.results.get(query) || [];\n\n const results = queryResults.map((discussion: any) => {\n const mostRelevantPost = discussion.mostRelevantPost();\n\n return (\n
  • \n \n
    {highlight(discussion.title(), query)}
    \n {!!mostRelevantPost &&
    {highlight(mostRelevantPost.contentPlain(), query, 100)}
    }\n \n
  • \n );\n });\n\n return [\n
  • {app.translator.trans('core.forum.search.discussions_heading')}
  • ,\n
  • \n \n {app.translator.trans('core.forum.search.all_discussions_button', { query })}\n \n
  • ,\n ...results,\n ];\n }\n}\n","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/states/DiscussionListState'];","import app from 'flarum/forum/app';\n\nimport Search, { SearchAttrs, SearchSource } from 'flarum/forum/components/Search';\n\nimport { extend } from 'flarum/common/extend';\nimport ItemList from 'flarum/common/utils/ItemList';\n\nimport DiscussionsSearchSource from './SearchSources/DiscussionsSearchSource';\nimport extendDiscussionState from './PaginatedListStates/extendDiscussionState';\n\napp.initializers.add('blomstra-search', () => {\n extend(Search.prototype, 'sourceItems', function (this: Search, items: ItemList) {\n items.replace('discussions', new DiscussionsSearchSource());\n });\n});\n\napp.initializers.add(\n 'blomstra-search-early',\n () => {\n extendDiscussionState();\n },\n 999999\n);\n","import app from 'flarum/forum/app';\n\nimport { override } from 'flarum/common/extend';\n\nimport DiscussionListState from 'flarum/forum/states/DiscussionListState';\n\nexport default function extendDiscussionState() {\n override(DiscussionListState.prototype, 'loadPage', async function (this: DiscussionListState, original, page: number = 1) {\n const preloaded = app.data.apiDocument || null;\n\n // If existing payload is given or no search is made, fallback on native page.\n if (preloaded || !this.requestParams()?.filter?.q) return original.call(this, page);\n\n const params = this.requestParams();\n params.page = {\n offset: this.pageSize * (page - 1),\n ...params.page,\n };\n\n if (Array.isArray(params.include)) {\n params.include = params.include.join(',');\n }\n\n // Construct API search URI\n const url = `${app.forum.attribute('apiUrl')}/blomstra/search/${this.type}`;\n\n // Make API GET request\n const results = await app.request({ params, url, method: 'GET' });\n\n // Parse API response into models and push to store\n return app.store.pushPayload(results);\n });\n}\n"],"names":["module","exports","runtime","undefined","Op","Object","prototype","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","key","value","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","state","GenStateSuspendedStart","method","arg","GenStateExecuting","Error","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","done","GenStateSuspendedYield","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","invoke","resolve","reject","result","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","a","definition","o","get","prop","r","flarum","core","compat","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","args","arguments","apply","DiscussionsSearchSource","results","Map","search","query","toLowerCase","set","params","filter","q","page","limit","include","url","app","models","view","map","discussion","mostRelevantPost","className","id","href","number","highlight","title","contentPlain","icon","_extends","assign","target","source","extend","Search","items","replace","override","DiscussionListState","original","requestParams","offset","pageSize","Array","isArray","join"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/OverloadYield.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/regenerator.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/regeneratorAsync.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/regeneratorAsyncGen.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/regeneratorAsyncIterator.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/regeneratorDefine.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/regeneratorKeys.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/regeneratorValues.js","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/typeof.js","webpack://@blomstra/search/./node_modules/@babel/runtime/regenerator/index.js","webpack://@blomstra/search/webpack/bootstrap","webpack://@blomstra/search/webpack/runtime/compat get default export","webpack://@blomstra/search/webpack/runtime/define property getters","webpack://@blomstra/search/webpack/runtime/hasOwnProperty shorthand","webpack://@blomstra/search/external root \"flarum.core.compat['forum/app']\"","webpack://@blomstra/search/external root \"flarum.core.compat['forum/components/Search']\"","webpack://@blomstra/search/external root \"flarum.core.compat['common/extend']\"","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://@blomstra/search/external root \"flarum.core.compat['common/helpers/highlight']\"","webpack://@blomstra/search/external root \"flarum.core.compat['common/components/LinkButton']\"","webpack://@blomstra/search/external root \"flarum.core.compat['common/components/Link']\"","webpack://@blomstra/search/./src/forum/SearchSources/DiscussionsSearchSource.tsx","webpack://@blomstra/search/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@blomstra/search/external root \"flarum.core.compat['forum/states/DiscussionListState']\"","webpack://@blomstra/search/./src/forum/index.ts","webpack://@blomstra/search/./src/forum/PaginatedListStates/extendDiscussionState.tsx"],"sourcesContent":["function _OverloadYield(e, d) {\n this.v = e, this.k = d;\n}\nmodule.exports = _OverloadYield, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regeneratorDefine = require(\"./regeneratorDefine.js\");\nfunction _regenerator() {\n /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */\n var e,\n t,\n r = \"function\" == typeof Symbol ? Symbol : {},\n n = r.iterator || \"@@iterator\",\n o = r.toStringTag || \"@@toStringTag\";\n function i(r, n, o, i) {\n var c = n && n.prototype instanceof Generator ? n : Generator,\n u = Object.create(c.prototype);\n return regeneratorDefine(u, \"_invoke\", function (r, n, o) {\n var i,\n c,\n u,\n f = 0,\n p = o || [],\n y = !1,\n G = {\n p: 0,\n n: 0,\n v: e,\n a: d,\n f: d.bind(e, 4),\n d: function d(t, r) {\n return i = t, c = 0, u = e, G.n = r, a;\n }\n };\n function d(r, n) {\n for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {\n var o,\n i = p[t],\n d = G.p,\n l = i[2];\n r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));\n }\n if (o || r > 1) return a;\n throw y = !0, n;\n }\n return function (o, p, l) {\n if (f > 1) throw TypeError(\"Generator is already running\");\n for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {\n i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);\n try {\n if (f = 2, i) {\n if (c || (o = \"next\"), t = i[o]) {\n if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\");\n if (!t.done) return t;\n u = t.value, c < 2 && (c = 0);\n } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1);\n i = e;\n } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;\n } catch (t) {\n i = e, c = 1, u = t;\n } finally {\n f = 1;\n }\n }\n return {\n value: t,\n done: y\n };\n };\n }(r, o, i), !0), u;\n }\n var a = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n t = Object.getPrototypeOf;\n var c = [][n] ? t(t([][n]())) : (regeneratorDefine(t = {}, n, function () {\n return this;\n }), t),\n u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);\n function f(e) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, regeneratorDefine(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e;\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, regeneratorDefine(u, \"constructor\", GeneratorFunctionPrototype), regeneratorDefine(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", regeneratorDefine(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), regeneratorDefine(u), regeneratorDefine(u, o, \"Generator\"), regeneratorDefine(u, n, function () {\n return this;\n }), regeneratorDefine(u, \"toString\", function () {\n return \"[object Generator]\";\n }), (module.exports = _regenerator = function _regenerator() {\n return {\n w: i,\n m: f\n };\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)();\n}\nmodule.exports = _regenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regeneratorAsyncGen = require(\"./regeneratorAsyncGen.js\");\nfunction _regeneratorAsync(n, e, r, t, o) {\n var a = regeneratorAsyncGen(n, e, r, t, o);\n return a.next().then(function (n) {\n return n.done ? n.value : a.next();\n });\n}\nmodule.exports = _regeneratorAsync, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regenerator = require(\"./regenerator.js\");\nvar regeneratorAsyncIterator = require(\"./regeneratorAsyncIterator.js\");\nfunction _regeneratorAsyncGen(r, e, t, o, n) {\n return new regeneratorAsyncIterator(regenerator().w(r, e, t, o), n || Promise);\n}\nmodule.exports = _regeneratorAsyncGen, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nvar regeneratorDefine = require(\"./regeneratorDefine.js\");\nfunction AsyncIterator(t, e) {\n function n(r, o, i, f) {\n try {\n var c = t[r](o),\n u = c.value;\n return u instanceof OverloadYield ? e.resolve(u.v).then(function (t) {\n n(\"next\", t, i, f);\n }, function (t) {\n n(\"throw\", t, i, f);\n }) : e.resolve(u).then(function (t) {\n c.value = t, i(c);\n }, function (t) {\n return n(\"throw\", t, i, f);\n });\n } catch (t) {\n f(t);\n }\n }\n var r;\n this.next || (regeneratorDefine(AsyncIterator.prototype), regeneratorDefine(AsyncIterator.prototype, \"function\" == typeof Symbol && Symbol.asyncIterator || \"@asyncIterator\", function () {\n return this;\n })), regeneratorDefine(this, \"_invoke\", function (t, o, i) {\n function f() {\n return new e(function (e, r) {\n n(t, i, e, r);\n });\n }\n return r = r ? r.then(f, f) : f();\n }, !0);\n}\nmodule.exports = AsyncIterator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _regeneratorDefine(e, r, n, t) {\n var i = Object.defineProperty;\n try {\n i({}, \"\", {});\n } catch (e) {\n i = 0;\n }\n module.exports = _regeneratorDefine = function regeneratorDefine(e, r, n, t) {\n function o(r, n) {\n _regeneratorDefine(e, r, function (e) {\n return this._invoke(r, n, e);\n });\n }\n r ? i ? i(e, r, {\n value: n,\n enumerable: !t,\n configurable: !t,\n writable: !t\n }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2));\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _regeneratorDefine(e, r, n, t);\n}\nmodule.exports = _regeneratorDefine, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _regeneratorKeys(e) {\n var n = Object(e),\n r = [];\n for (var t in n) r.unshift(t);\n return function e() {\n for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e;\n return e.done = !0, e;\n };\n}\nmodule.exports = _regeneratorKeys, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nvar regenerator = require(\"./regenerator.js\");\nvar regeneratorAsync = require(\"./regeneratorAsync.js\");\nvar regeneratorAsyncGen = require(\"./regeneratorAsyncGen.js\");\nvar regeneratorAsyncIterator = require(\"./regeneratorAsyncIterator.js\");\nvar regeneratorKeys = require(\"./regeneratorKeys.js\");\nvar regeneratorValues = require(\"./regeneratorValues.js\");\nfunction _regeneratorRuntime() {\n \"use strict\";\n\n var r = regenerator(),\n e = r.m(_regeneratorRuntime),\n t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor;\n function n(r) {\n var e = \"function\" == typeof r && r.constructor;\n return !!e && (e === t || \"GeneratorFunction\" === (e.displayName || e.name));\n }\n var o = {\n \"throw\": 1,\n \"return\": 2,\n \"break\": 3,\n \"continue\": 3\n };\n function a(r) {\n var e, t;\n return function (n) {\n e || (e = {\n stop: function stop() {\n return t(n.a, 2);\n },\n \"catch\": function _catch() {\n return n.v;\n },\n abrupt: function abrupt(r, e) {\n return t(n.a, o[r], e);\n },\n delegateYield: function delegateYield(r, o, a) {\n return e.resultName = o, t(n.d, regeneratorValues(r), a);\n },\n finish: function finish(r) {\n return t(n.f, r);\n }\n }, t = function t(r, _t, o) {\n n.p = e.prev, n.n = e.next;\n try {\n return r(_t, o);\n } finally {\n e.next = n.n;\n }\n }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n;\n try {\n return r.call(this, e);\n } finally {\n n.p = e.prev, n.n = e.next;\n }\n };\n }\n return (module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return {\n wrap: function wrap(e, t, n, o) {\n return r.w(a(e), t, n, o && o.reverse());\n },\n isGeneratorFunction: n,\n mark: r.m,\n awrap: function awrap(r, e) {\n return new OverloadYield(r, e);\n },\n AsyncIterator: regeneratorAsyncIterator,\n async: function async(r, e, t, o, u) {\n return (n(e) ? regeneratorAsyncGen : regeneratorAsync)(a(r), e, t, o, u);\n },\n keys: regeneratorKeys,\n values: regeneratorValues\n };\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)();\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorValues(e) {\n if (null != e) {\n var t = e[\"function\" == typeof Symbol && Symbol.iterator || \"@@iterator\"],\n r = 0;\n if (t) return t.call(e);\n if (\"function\" == typeof e.next) return e;\n if (!isNaN(e.length)) return {\n next: function next() {\n return e && r >= e.length && (e = void 0), {\n value: e && e[r++],\n done: !e\n };\n }\n };\n }\n throw new TypeError(_typeof(e) + \" is not iterable\");\n}\nmodule.exports = _regeneratorValues, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Search'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","function asyncGeneratorStep(n, t, e, r, o, a, c) {\n try {\n var i = n[a](c),\n u = i.value;\n } catch (n) {\n return void e(n);\n }\n i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n return function () {\n var t = this,\n e = arguments;\n return new Promise(function (r, o) {\n var a = n.apply(t, e);\n function _next(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n }\n function _throw(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n }\n _next(void 0);\n });\n };\n}\nexport { _asyncToGenerator as default };","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/highlight'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","import app from 'flarum/forum/app';\nimport highlight from 'flarum/common/helpers/highlight';\nimport LinkButton from 'flarum/common/components/LinkButton';\nimport Link from 'flarum/common/components/Link';\nimport { SearchSource } from 'flarum/forum/components/Search';\nimport type Mithril from 'mithril';\n\n/**\n * The `DiscussionsSearchSource` finds and displays discussion search results in\n * the search dropdown.\n */\nexport default class DiscussionsSearchSource implements SearchSource {\n /**\n * Map of lowercase search queries to their respective model results\n */\n protected results = new Map();\n\n /**\n * Model name used for assembling API endpoint URL, and for frontend DOM.\n */\n private type = 'discussions';\n\n async search(query: string): Promise {\n query = query.toLowerCase();\n\n this.results.set(query, []);\n\n const params = {\n filter: { q: query },\n page: { limit: 3 },\n include: 'mostRelevantPost',\n };\n\n // Construct API search URI\n const url = `${app.forum.attribute('apiUrl')}/blomstra/search/${this.type}`;\n\n // Make API GET request\n const results = await app.request({ params, url, method: 'GET' });\n\n // Parse API response into models and push to store\n const models = app.store.pushPayload(results);\n\n // Add models to results map\n this.results.set(query, models);\n }\n\n view(query: string): Array {\n query = query.toLowerCase();\n\n // Get results from map\n const queryResults = this.results.get(query) || [];\n\n const results = queryResults.map((discussion: any) => {\n const mostRelevantPost = discussion.mostRelevantPost();\n\n return (\n
  • \n \n
    {highlight(discussion.title(), query)}
    \n {!!mostRelevantPost &&
    {highlight(mostRelevantPost.contentPlain(), query, 100)}
    }\n \n
  • \n );\n });\n\n return [\n
  • {app.translator.trans('core.forum.search.discussions_heading')}
  • ,\n
  • \n \n {app.translator.trans('core.forum.search.all_discussions_button', { query })}\n \n
  • ,\n ...results,\n ];\n }\n}\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/states/DiscussionListState'];","import app from 'flarum/forum/app';\n\nimport Search, { SearchAttrs, SearchSource } from 'flarum/forum/components/Search';\n\nimport { extend } from 'flarum/common/extend';\nimport ItemList from 'flarum/common/utils/ItemList';\n\nimport DiscussionsSearchSource from './SearchSources/DiscussionsSearchSource';\nimport extendDiscussionState from './PaginatedListStates/extendDiscussionState';\n\napp.initializers.add('blomstra-search', () => {\n const minLength = parseInt(app.data.settings['blomstra-search.min-search-length'] || String(Search.MIN_SEARCH_LEN), 10);\n if (minLength !== Search.MIN_SEARCH_LEN) {\n (Search as any).MIN_SEARCH_LEN = minLength;\n }\n\n extend(Search.prototype, 'sourceItems', function (this: Search, items: ItemList) {\n items.replace('discussions', new DiscussionsSearchSource());\n });\n});\n\napp.initializers.add(\n 'blomstra-search-early',\n () => {\n extendDiscussionState();\n },\n 999999\n);\n","import app from 'flarum/forum/app';\n\nimport { override } from 'flarum/common/extend';\n\nimport DiscussionListState from 'flarum/forum/states/DiscussionListState';\n\nexport default function extendDiscussionState() {\n override(DiscussionListState.prototype, 'loadPage', async function (this: DiscussionListState, original, page: number = 1) {\n const preloaded = app.data.apiDocument || null;\n\n // If existing payload is given or no search is made, fallback on native page.\n if (preloaded || !this.requestParams()?.filter?.q) return original.call(this, page);\n\n const params = this.requestParams();\n params.page = {\n offset: this.pageSize * (page - 1),\n ...params.page,\n };\n\n if (Array.isArray(params.include)) {\n params.include = params.include.join(',');\n }\n\n // Construct API search URI\n const url = `${app.forum.attribute('apiUrl')}/blomstra/search/${this.type}`;\n\n // Make API GET request\n const results = await app.request({ params, url, method: 'GET' });\n\n // Parse API response into models and push to store\n return app.store.pushPayload(results);\n });\n}\n"],"names":["module","exports","e","d","this","v","k","__esModule","regeneratorDefine","require","_regenerator","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","f","p","y","G","a","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","w","m","regeneratorAsyncGen","next","then","regenerator","regeneratorAsyncIterator","Promise","OverloadYield","AsyncIterator","resolve","asyncIterator","_regeneratorDefine","defineProperty","_invoke","enumerable","configurable","writable","unshift","pop","regeneratorAsync","regeneratorKeys","regeneratorValues","_regeneratorRuntime","constructor","name","stop","abrupt","delegateYield","resultName","finish","_t","prev","sent","wrap","reverse","isGeneratorFunction","mark","awrap","async","keys","values","_typeof","isNaN","runtime","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","key","get","obj","prop","hasOwnProperty","flarum","core","compat","asyncGeneratorStep","_asyncToGenerator","arguments","apply","_next","_throw","DiscussionsSearchSource","results","Map","type","_proto","search","_search","_callee","query","params","url","models","_context","toLowerCase","set","filter","q","page","limit","include","app","attribute","method","pushPayload","_x","view","_this","map","discussion","mostRelevantPost","className","id","Link","href","number","highlight","title","contentPlain","trans","LinkButton","icon","concat","_extends","assign","add","minLength","parseInt","settings","String","Search","extend","items","replace","override","DiscussionListState","_ref","original","_this$requestParams","_this$requestParams$f","apiDocument","requestParams","offset","pageSize","Array","isArray","join","_x2","_x3"],"sourceRoot":""} \ No newline at end of file diff --git a/js/src/admin/index.ts b/js/src/admin/index.ts index 854748d..ff0f0f9 100644 --- a/js/src/admin/index.ts +++ b/js/src/admin/index.ts @@ -78,6 +78,25 @@ app.initializers.add('blomstra-search', () => { app.extensionData .for('blomstra-search') + .registerSetting(function (this: any) { + // No index yet, or first build predates this tracking — stay silent. + const indexedAnalyzer = app.data.settings['blomstra-search.indexed-analyzer']; + if (!activeIndex || !indexedAnalyzer) return null; + + const currentAnalyzer = this.setting('blomstra-search.analyzer-language')() || 'english'; + const currentMinLength = this.setting('blomstra-search.min-search-length')(); + const indexedMinLength = String( + app.data.settings['blomstra-search.indexed-min-search-length'] || app.data.settings['blomstra-search.min-search-length'] + ); + + if (currentAnalyzer === indexedAnalyzer && currentMinLength === indexedMinLength) return null; + + return m( + Alert, + { type: 'warning', dismissible: false, icon: 'fas fa-exclamation-triangle' }, + app.translator.trans('blomstra-search.admin.index-settings-changed') + ); + }) .registerSetting({ setting: 'blomstra-search.elastic-endpoint', label: app.translator.trans('blomstra-search.admin.elastic-endpoint'), @@ -116,5 +135,13 @@ app.initializers.add('blomstra-search', () => { setting: 'blomstra-search.search-post-bodies', label: app.translator.trans('blomstra-search.admin.search-post-bodies'), type: 'switch', + }) + .registerSetting({ + setting: 'blomstra-search.min-search-length', + label: app.translator.trans('blomstra-search.admin.min-search-length.label'), + help: app.translator.trans('blomstra-search.admin.min-search-length.help'), + type: 'select', + options: { '1': '1', '2': '2', '3': '3', '4': '4' }, + default: app.data.settings['blomstra-search.min-search-length'], }); }); diff --git a/js/src/forum/index.ts b/js/src/forum/index.ts index a1bd2e8..e1fa5d3 100644 --- a/js/src/forum/index.ts +++ b/js/src/forum/index.ts @@ -9,6 +9,15 @@ import DiscussionsSearchSource from './SearchSources/DiscussionsSearchSource'; import extendDiscussionState from './PaginatedListStates/extendDiscussionState'; app.initializers.add('blomstra-search', () => { + const minLength = parseInt(app.data.settings['blomstra-search.min-search-length'] || String(Search.MIN_SEARCH_LEN), 10); + if (minLength !== Search.MIN_SEARCH_LEN) { + // Flarum provides no extension point for MIN_SEARCH_LEN, so we overwrite the + // static property directly. TypeScript `readonly` is compile-time only — at + // runtime this is a plain property assignment and is safe as long as no code + // reads MIN_SEARCH_LEN before this initializer runs. + (Search as any).MIN_SEARCH_LEN = minLength; + } + extend(Search.prototype, 'sourceItems', function (this: Search, items: ItemList) { items.replace('discussions', new DiscussionsSearchSource()); }); diff --git a/resources/locale/en.yml b/resources/locale/en.yml index 16a6597..ec08d82 100644 --- a/resources/locale/en.yml +++ b/resources/locale/en.yml @@ -8,7 +8,8 @@ blomstra-search: label: Analyzer language help: | The analyzer makes search understand stop words and undertakes language - specific improvements for indexing. + specific improvements for indexing. Changing this requires a full index rebuild to take effect. + index-settings-changed: "Search index settings have changed. Run: php flarum blomstra:search:index build" reindex-required: title: Search index rebuild required detail: "The search index is not compatible with this version of the extension. Run: php flarum blomstra:search:index build" @@ -16,3 +17,9 @@ blomstra-search: search-post-bodies: Search inside comments match-sentences: Match search term against full sentence match-words: Match search term against full words + min-search-length: + label: Minimum search query length + help: | + Minimum number of characters required before a search is triggered. Lower this to 1 or 2 + for CJK (Chinese, Japanese, Korean) communities where single characters carry full meaning. + Changing this requires a full index rebuild to take effect. diff --git a/src/Commands/BuildCommand.php b/src/Commands/BuildCommand.php index e4b1ca9..35f5d97 100644 --- a/src/Commands/BuildCommand.php +++ b/src/Commands/BuildCommand.php @@ -35,6 +35,9 @@ class BuildCommand extends Command */ public const INDEX_COMPAT_VERSION = 'v2'; + /** Matches Flarum's Search::MIN_SEARCH_LEN — the default minimum query length. */ + public const DEFAULT_MIN_SEARCH_LENGTH = 3; + protected $signature = 'blomstra:search:index {action? : build | promote | rollback | discard | mapping | fill} {--fresh} @@ -248,6 +251,7 @@ HELP; $settings->set('blomstra-search.active-index', $staging); $settings->set('blomstra-search.staging-index', null); $settings->set('blomstra-search.index-compatible', self::INDEX_COMPAT_VERSION); + $this->saveIndexedConfig($client, $settings, $staging); } protected function runRollback(Client $client, string $alias, SettingsRepositoryInterface $settings): void @@ -274,6 +278,7 @@ HELP; $settings->set('blomstra-search.active-index', $backup); $settings->set('blomstra-search.backup-index', null); + $this->saveIndexedConfig($client, $settings, $backup); } protected function runDiscard(Client $client, SettingsRepositoryInterface $settings): void @@ -416,7 +421,7 @@ HELP; $client->indices()->create([ 'index' => $concrete, - 'body' => ['settings' => $this->indexSettings($settings)], + 'body' => ['settings' => $this->buildIndexSettings($settings)], ]); $client->indices()->putAlias(['index' => $concrete, 'name' => $alias]); @@ -424,6 +429,8 @@ HELP; $settings->set('blomstra-search.active-index', $concrete); $settings->set('blomstra-search.index-compatible', self::INDEX_COMPAT_VERSION); + $this->saveIndexedConfig($client, $settings, $concrete); + foreach ($seeders as $seeder) { $this->setContinueAt($settings, $seeder->type(), null); } @@ -466,7 +473,7 @@ HELP; $client->indices()->create([ 'index' => $staging, - 'body' => ['settings' => $this->indexSettings($settings)], + 'body' => ['settings' => $this->buildIndexSettings($settings)], ]); $settings->set('blomstra-search.staging-index', $staging); @@ -480,14 +487,40 @@ HELP; return $staging; } - protected function indexSettings(SettingsRepositoryInterface $settings): array + /** + * Persist the analysis config that is actually live in ES for the given index. + * Reading from ES (rather than from Flarum settings) means rollbacks are also + * covered: the stored values always reflect the index that is currently aliased, + * not the settings at the time the command ran. + */ + protected function saveIndexedConfig(Client $client, SettingsRepositoryInterface $settings, string $indexName): void { + $response = $client->indices()->getSettings(['index' => $indexName]); + $analysis = Arr::get($response, "$indexName.settings.index.analysis", []); + + $analyzer = Arr::get($analysis, 'analyzer.flarum_analyzer.type', 'english'); + $minGram = (int) Arr::get($analysis, 'filter.partial_search_filter.min_gram', self::DEFAULT_MIN_SEARCH_LENGTH); + + $settings->set('blomstra-search.indexed-analyzer', $analyzer); + $settings->set('blomstra-search.indexed-min-search-length', $minGram); + } + + protected function buildIndexSettings(SettingsRepositoryInterface $settings): array + { + $language = $settings->get('blomstra-search.analyzer-language') ?: 'english'; + $minGram = max(1, (int) ($settings->get('blomstra-search.min-search-length') ?: self::DEFAULT_MIN_SEARCH_LENGTH)); + $maxGram = 10; + + if ($minGram >= $maxGram) { + throw new \InvalidArgumentException("min_gram ($minGram) must be less than max_gram ($maxGram)."); + } + return [ - 'index.max_ngram_diff' => 7, + 'index.max_ngram_diff' => $maxGram - $minGram, 'analysis' => [ 'analyzer' => [ 'flarum_analyzer' => [ - 'type' => $settings->get('blomstra-search.analyzer-language') ?: 'english', + 'type' => $language, ], 'flarum_analyzer_partial' => [ 'type' => 'custom', @@ -498,8 +531,8 @@ HELP; 'filter' => [ 'partial_search_filter' => [ 'type' => 'ngram', - 'min_gram' => 3, - 'max_gram' => 10, + 'min_gram' => $minGram, + 'max_gram' => $maxGram, 'token_chars' => ['letter', 'digit', 'symbol'], ], ],