@embedpdf/plugin-search 2.0.0-next.1 → 2.0.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@embedpdf/core"),e=require("@embedpdf/models"),s="SEARCH/INIT_STATE",a="SEARCH/CLEANUP_STATE",r="SEARCH/START_SEARCH_SESSION",o="SEARCH/STOP_SEARCH_SESSION",n="SEARCH/SET_SEARCH_FLAGS",c="SEARCH/SET_SHOW_ALL_RESULTS",l="SEARCH/START_SEARCH",i="SEARCH/SET_SEARCH_RESULTS",u="SEARCH/APPEND_SEARCH_RESULTS",h="SEARCH/SET_ACTIVE_RESULT_INDEX";function d(t,e){return{type:c,payload:{documentId:t,showAll:e}}}function S(t,e,s,a){return{type:i,payload:{documentId:t,results:e,total:s,activeResultIndex:a}}}function p(t,e){return{type:h,payload:{documentId:t,index:e}}}const R={flags:[],results:[],total:0,activeResultIndex:-1,showAllResults:!0,query:"",loading:!1,active:!1},g={documents:{}},m=(t,e,s)=>{const a=t.documents[e]||R;return{...t,documents:{...t.documents,[e]:{...a,...s}}}},f=class extends t.BasePlugin{constructor(e,s,a){super(e,s),this.searchStop$=t.createBehaviorEmitter(),this.searchStart$=t.createBehaviorEmitter(),this.searchResult$=t.createBehaviorEmitter(),this.searchActiveResultChange$=t.createBehaviorEmitter(),this.searchResultState$=t.createBehaviorEmitter(),this.searchState$=t.createBehaviorEmitter(),this.currentTask=new Map,this.pluginConfig=a}onDocumentLoadingStarted(t){const e={...R,flags:this.pluginConfig.flags||[],showAllResults:this.pluginConfig.showAllResults??!0};this.dispatch(function(t,e){return{type:s,payload:{documentId:t,state:e}}}(t,e))}onDocumentClosed(t){this.stopSearchSession(t),this.dispatch(function(t){return{type:a,payload:t}}(t)),this.currentTask.delete(t)}async initialize(){}onStoreUpdated(t,e){for(const s in e.documents){const a=t.documents[s],r=e.documents[s];a!==r&&(this.searchState$.emit({documentId:s,state:r}),a&&a.results===r.results&&a.activeResultIndex===r.activeResultIndex&&a.showAllResults===r.showAllResults&&a.active===r.active||this.searchResultState$.emit({documentId:s,state:{results:r.results,activeResultIndex:r.activeResultIndex,showAllResults:r.showAllResults,active:r.active}}))}}buildCapability(){const t=t=>t??this.getActiveDocumentId(),e=e=>{const s=t(e),a=this.state.documents[s];if(!a)throw new Error(`Search state not found for document ${s}`);return a};return{startSearch:e=>this.startSearchSession(t(e)),stopSearch:e=>this.stopSearchSession(t(e)),searchAllPages:(e,s)=>this.searchAllPages(e,t(s)),nextResult:e=>this.nextResult(t(e)),previousResult:e=>this.previousResult(t(e)),goToResult:(e,s)=>this.goToResult(e,t(s)),setShowAllResults:(e,s)=>this.dispatch(d(t(s),e)),getShowAllResults:t=>e(t).showAllResults,getFlags:t=>e(t).flags,setFlags:(e,s)=>this.setFlags(e,t(s)),getState:t=>e(t),forDocument:this.createSearchScope.bind(this),onSearchResult:this.searchResult$.on,onSearchStart:this.searchStart$.on,onSearchStop:this.searchStop$.on,onActiveResultChange:this.searchActiveResultChange$.on,onSearchResultStateChange:this.searchResultState$.on,onStateChange:this.searchState$.on}}createSearchScope(t){const e=()=>{const e=this.state.documents[t];if(!e)throw new Error(`Search state not found for document ${t}`);return e};return{startSearch:()=>this.startSearchSession(t),stopSearch:()=>this.stopSearchSession(t),searchAllPages:e=>this.searchAllPages(e,t),nextResult:()=>this.nextResult(t),previousResult:()=>this.previousResult(t),goToResult:e=>this.goToResult(e,t),setShowAllResults:e=>this.dispatch(d(t,e)),getShowAllResults:()=>e().showAllResults,getFlags:()=>e().flags,setFlags:e=>this.setFlags(e,t),getState:e,onSearchResult:e=>this.searchResult$.on(s=>{s.documentId===t&&e(s.results)}),onSearchStart:e=>this.searchStart$.on(s=>{s.documentId===t&&e()}),onSearchStop:e=>this.searchStop$.on(s=>{s.documentId===t&&e()}),onActiveResultChange:e=>this.searchActiveResultChange$.on(s=>{s.documentId===t&&e(s.index)}),onSearchResultStateChange:e=>this.searchResultState$.on(s=>{s.documentId===t&&e(s.state)}),onStateChange:e=>this.searchState$.on(s=>{s.documentId===t&&e(s.state)})}}setFlags(t,e){this.dispatch(function(t,e){return{type:n,payload:{documentId:t,flags:e}}}(e,t));const s=this.state.documents[e];(null==s?void 0:s.active)&&this.searchAllPages(s.query,e,!0)}notifySearchStart(t){this.searchStart$.emit({documentId:t})}notifySearchStop(t){this.searchStop$.emit({documentId:t})}notifyActiveResultChange(t,e){this.searchActiveResultChange$.emit({documentId:t,index:e})}startSearchSession(t){this.getCoreDocument(t)&&(this.dispatch(function(t){return{type:r,payload:{documentId:t}}}(t)),this.notifySearchStart(t))}stopSearchSession(t){var s;const a=this.state.documents[t];if(!(null==a?void 0:a.active))return;const r=this.currentTask.get(t);if(r){try{null==(s=r.abort)||s.call(r,{code:e.PdfErrorCode.Cancelled,message:"search stopped"})}catch{}this.currentTask.delete(t)}this.dispatch(function(t){return{type:o,payload:{documentId:t}}}(t)),this.notifySearchStop(t)}searchAllPages(t,s,a=!1){var r;const o=this.state.documents[s];if(!o)return e.PdfTaskHelper.reject({code:e.PdfErrorCode.NotFound,message:"Search state not initialized"});const n=this.getCoreDocument(s);if(!(null==n?void 0:n.document))return e.PdfTaskHelper.reject({code:e.PdfErrorCode.NotFound,message:"Document not loaded"});const c=t.trim();if(o.query===c&&!a)return e.PdfTaskHelper.resolve({results:o.results,total:o.total});const i=this.currentTask.get(s);if(i){try{null==(r=i.abort)||r.call(i,{code:e.PdfErrorCode.Cancelled,message:"new search"})}catch{}this.currentTask.delete(s)}if(this.dispatch(function(t,e){return{type:l,payload:{documentId:t,query:e}}}(s,c)),!c)return this.dispatch(S(s,[],0,-1)),e.PdfTaskHelper.resolve({results:[],total:0});o.active||this.startSearchSession(s);const h=this.engine.searchAllPages(n.document,c,{flags:o.flags});return this.currentTask.set(s,h),h.onProgress(t=>{var e;(null==(e=null==t?void 0:t.results)?void 0:e.length)&&this.currentTask.get(s)===h&&(this.dispatch(function(t,e){return{type:u,payload:{documentId:t,results:e}}}(s,t.results)),-1===this.state.documents[s].activeResultIndex&&(this.dispatch(p(s,0)),this.notifyActiveResultChange(s,0)))}),h.wait(t=>{this.currentTask.delete(s);const e=t.total>0?0:-1;this.dispatch(S(s,t.results,t.total,e)),this.searchResult$.emit({documentId:s,results:t}),t.total>0&&this.notifyActiveResultChange(s,0)},t=>{var a;(null==(a=null==t?void 0:t.reason)?void 0:a.code)!==e.PdfErrorCode.Cancelled&&(console.error("Error during search:",t),this.dispatch(S(s,[],0,-1))),this.currentTask.delete(s)}),h}nextResult(t){const e=this.state.documents[t];if(!e||0===e.results.length)return-1;const s=e.activeResultIndex>=e.results.length-1?0:e.activeResultIndex+1;return this.goToResult(s,t)}previousResult(t){const e=this.state.documents[t];if(!e||0===e.results.length)return-1;const s=e.activeResultIndex<=0?e.results.length-1:e.activeResultIndex-1;return this.goToResult(s,t)}goToResult(t,e){const s=this.state.documents[e];return!s||0===s.results.length||t<0||t>=s.results.length?-1:(this.dispatch(p(e,t)),this.notifyActiveResultChange(e,t),t)}async destroy(){for(const t of Object.keys(this.state.documents))this.stopSearchSession(t);this.searchResult$.clear(),this.searchStart$.clear(),this.searchStop$.clear(),this.searchActiveResultChange$.clear(),this.searchResultState$.clear(),this.searchState$.clear(),super.destroy()}};f.id="search";let v=f;const y="search",A={id:y,name:"Search Plugin",version:"1.0.0",provides:["search"],requires:[],optional:[],defaultConfig:{enabled:!0,flags:[]}},I={manifest:A,create:(t,e)=>new v(y,t,e),reducer:(t=g,e)=>{switch(e.type){case s:return{...t,documents:{...t.documents,[e.payload.documentId]:e.payload.state}};case a:{const s=e.payload,{[s]:a,...r}=t.documents;return{...t,documents:r}}case r:return m(t,e.payload.documentId,{active:!0});case o:return m(t,e.payload.documentId,{results:[],total:0,activeResultIndex:-1,query:"",loading:!1,active:!1});case n:return m(t,e.payload.documentId,{flags:e.payload.flags});case c:return m(t,e.payload.documentId,{showAllResults:e.payload.showAll});case l:return m(t,e.payload.documentId,{loading:!0,query:e.payload.query,results:[],total:0,activeResultIndex:-1});case u:{const{documentId:s,results:a}=e.payload,r=t.documents[s];if(!r)return t;const o=[...r.results,...a],n=-1===r.activeResultIndex&&o.length>0?0:r.activeResultIndex;return m(t,s,{results:o,total:o.length,activeResultIndex:n,loading:!0})}case i:{const{documentId:s,results:a,total:r,activeResultIndex:o}=e.payload;return m(t,s,{results:a,total:r,activeResultIndex:o,loading:!1})}case h:return m(t,e.payload.documentId,{activeResultIndex:e.payload.index});default:return t}},initialState:g};exports.SEARCH_PLUGIN_ID=y,exports.SearchPlugin=v,exports.SearchPluginPackage=I,exports.initialSearchDocumentState=R,exports.initialState=g,exports.manifest=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@embedpdf/core"),e=require("@embedpdf/models"),s="SEARCH/INIT_STATE",a="SEARCH/CLEANUP_STATE",r="SEARCH/START_SEARCH_SESSION",o="SEARCH/STOP_SEARCH_SESSION",n="SEARCH/SET_SEARCH_FLAGS",c="SEARCH/SET_SHOW_ALL_RESULTS",l="SEARCH/START_SEARCH",i="SEARCH/SET_SEARCH_RESULTS",u="SEARCH/APPEND_SEARCH_RESULTS",h="SEARCH/SET_ACTIVE_RESULT_INDEX";function d(t,e){return{type:c,payload:{documentId:t,showAll:e}}}function S(t,e,s,a){return{type:i,payload:{documentId:t,results:e,total:s,activeResultIndex:a}}}function p(t,e){return{type:h,payload:{documentId:t,index:e}}}const R={flags:[],results:[],total:0,activeResultIndex:-1,showAllResults:!0,query:"",loading:!1,active:!1},g={documents:{}},m=(t,e,s)=>{const a=t.documents[e]||R;return{...t,documents:{...t.documents,[e]:{...a,...s}}}},f=class extends t.BasePlugin{constructor(e,s,a){super(e,s),this.searchStop$=t.createBehaviorEmitter(),this.searchStart$=t.createBehaviorEmitter(),this.searchResult$=t.createBehaviorEmitter(),this.searchActiveResultChange$=t.createBehaviorEmitter(),this.searchResultState$=t.createBehaviorEmitter(),this.searchState$=t.createBehaviorEmitter(),this.currentTask=new Map,this.pluginConfig=a}onDocumentLoadingStarted(t){const e={...R,flags:this.pluginConfig.flags||[],showAllResults:this.pluginConfig.showAllResults??!0};this.dispatch(function(t,e){return{type:s,payload:{documentId:t,state:e}}}(t,e))}onDocumentClosed(t){this.stopSearchSession(t),this.dispatch(function(t){return{type:a,payload:t}}(t)),this.currentTask.delete(t)}async initialize(){}onStoreUpdated(t,e){for(const s in e.documents){const a=t.documents[s],r=e.documents[s];a!==r&&(this.searchState$.emit({documentId:s,state:r}),a&&a.results===r.results&&a.activeResultIndex===r.activeResultIndex&&a.showAllResults===r.showAllResults&&a.active===r.active||this.searchResultState$.emit({documentId:s,state:{results:r.results,activeResultIndex:r.activeResultIndex,showAllResults:r.showAllResults,active:r.active}}))}}buildCapability(){const t=t=>t??this.getActiveDocumentId(),e=e=>{const s=t(e),a=this.state.documents[s];if(!a)throw new Error(`Search state not found for document ${s}`);return a};return{startSearch:e=>this.startSearchSession(t(e)),stopSearch:e=>this.stopSearchSession(t(e)),searchAllPages:(e,s)=>this.searchAllPages(e,t(s)),nextResult:e=>this.nextResult(t(e)),previousResult:e=>this.previousResult(t(e)),goToResult:(e,s)=>this.goToResult(e,t(s)),setShowAllResults:(e,s)=>this.dispatch(d(t(s),e)),getShowAllResults:t=>e(t).showAllResults,getFlags:t=>e(t).flags,setFlags:(e,s)=>this.setFlags(e,t(s)),getState:t=>e(t),forDocument:this.createSearchScope.bind(this),onSearchResult:this.searchResult$.on,onSearchStart:this.searchStart$.on,onSearchStop:this.searchStop$.on,onActiveResultChange:this.searchActiveResultChange$.on,onSearchResultStateChange:this.searchResultState$.on,onStateChange:this.searchState$.on}}createSearchScope(t){const e=()=>{const e=this.state.documents[t];if(!e)throw new Error(`Search state not found for document ${t}`);return e};return{startSearch:()=>this.startSearchSession(t),stopSearch:()=>this.stopSearchSession(t),searchAllPages:e=>this.searchAllPages(e,t),nextResult:()=>this.nextResult(t),previousResult:()=>this.previousResult(t),goToResult:e=>this.goToResult(e,t),setShowAllResults:e=>this.dispatch(d(t,e)),getShowAllResults:()=>e().showAllResults,getFlags:()=>e().flags,setFlags:e=>this.setFlags(e,t),getState:e,onSearchResult:e=>this.searchResult$.on(s=>{s.documentId===t&&e(s.results)}),onSearchStart:e=>this.searchStart$.on(s=>{s.documentId===t&&e()}),onSearchStop:e=>this.searchStop$.on(s=>{s.documentId===t&&e()}),onActiveResultChange:e=>this.searchActiveResultChange$.on(s=>{s.documentId===t&&e(s.index)}),onSearchResultStateChange:e=>this.searchResultState$.on(s=>{s.documentId===t&&e(s.state)}),onStateChange:e=>this.searchState$.on(s=>{s.documentId===t&&e(s.state)})}}setFlags(t,e){this.dispatch(function(t,e){return{type:n,payload:{documentId:t,flags:e}}}(e,t));const s=this.state.documents[e];(null==s?void 0:s.active)&&this.searchAllPages(s.query,e,!0)}notifySearchStart(t){this.searchStart$.emit({documentId:t})}notifySearchStop(t){this.searchStop$.emit({documentId:t})}notifyActiveResultChange(t,e){this.searchActiveResultChange$.emit({documentId:t,index:e})}startSearchSession(t){this.getCoreDocument(t)&&(this.dispatch(function(t){return{type:r,payload:{documentId:t}}}(t)),this.notifySearchStart(t))}stopSearchSession(t){var s;const a=this.state.documents[t];if(!(null==a?void 0:a.active))return;const r=this.currentTask.get(t);if(r){try{null==(s=r.abort)||s.call(r,{code:e.PdfErrorCode.Cancelled,message:"search stopped"})}catch{}this.currentTask.delete(t)}this.dispatch(function(t){return{type:o,payload:{documentId:t}}}(t)),this.notifySearchStop(t)}searchAllPages(t,s,a=!1){var r;const o=this.state.documents[s];if(!o)return e.PdfTaskHelper.reject({code:e.PdfErrorCode.NotFound,message:"Search state not initialized"});const n=this.getCoreDocument(s);if(!(null==n?void 0:n.document))return e.PdfTaskHelper.reject({code:e.PdfErrorCode.NotFound,message:"Document not loaded"});const c=t.trim();if(o.query===c&&!a)return e.PdfTaskHelper.resolve({results:o.results,total:o.total});const i=this.currentTask.get(s);if(i){try{null==(r=i.abort)||r.call(i,{code:e.PdfErrorCode.Cancelled,message:"new search"})}catch{}this.currentTask.delete(s)}if(this.dispatch(function(t,e){return{type:l,payload:{documentId:t,query:e}}}(s,c)),!c)return this.dispatch(S(s,[],0,-1)),e.PdfTaskHelper.resolve({results:[],total:0});o.active||this.startSearchSession(s);const h=this.engine.searchAllPages(n.document,c,{flags:o.flags});return this.currentTask.set(s,h),h.onProgress(t=>{var e;(null==(e=null==t?void 0:t.results)?void 0:e.length)&&this.currentTask.get(s)===h&&(this.dispatch(function(t,e){return{type:u,payload:{documentId:t,results:e}}}(s,t.results)),-1===this.state.documents[s].activeResultIndex&&(this.dispatch(p(s,0)),this.notifyActiveResultChange(s,0)))}),h.wait(t=>{this.currentTask.delete(s);const e=t.total>0?0:-1;this.dispatch(S(s,t.results,t.total,e)),this.searchResult$.emit({documentId:s,results:t}),t.total>0&&this.notifyActiveResultChange(s,0)},t=>{var a;(null==(a=null==t?void 0:t.reason)?void 0:a.code)!==e.PdfErrorCode.Cancelled&&(console.error("Error during search:",t),this.dispatch(S(s,[],0,-1))),this.currentTask.delete(s)}),h}nextResult(t){const e=this.state.documents[t];if(!e||0===e.results.length)return-1;const s=e.activeResultIndex>=e.results.length-1?0:e.activeResultIndex+1;return this.goToResult(s,t)}previousResult(t){const e=this.state.documents[t];if(!e||0===e.results.length)return-1;const s=e.activeResultIndex<=0?e.results.length-1:e.activeResultIndex-1;return this.goToResult(s,t)}goToResult(t,e){const s=this.state.documents[e];return!s||0===s.results.length||t<0||t>=s.results.length?-1:(this.dispatch(p(e,t)),this.notifyActiveResultChange(e,t),t)}async destroy(){for(const t of Object.keys(this.state.documents))this.stopSearchSession(t);this.searchResult$.clear(),this.searchStart$.clear(),this.searchStop$.clear(),this.searchActiveResultChange$.clear(),this.searchResultState$.clear(),this.searchState$.clear(),super.destroy()}};f.id="search";let v=f;const y="search",A={id:y,name:"Search Plugin",version:"1.0.0",provides:["search"],requires:[],optional:[],defaultConfig:{flags:[]}},I={manifest:A,create:(t,e)=>new v(y,t,e),reducer:(t=g,e)=>{switch(e.type){case s:return{...t,documents:{...t.documents,[e.payload.documentId]:e.payload.state}};case a:{const s=e.payload,{[s]:a,...r}=t.documents;return{...t,documents:r}}case r:return m(t,e.payload.documentId,{active:!0});case o:return m(t,e.payload.documentId,{results:[],total:0,activeResultIndex:-1,query:"",loading:!1,active:!1});case n:return m(t,e.payload.documentId,{flags:e.payload.flags});case c:return m(t,e.payload.documentId,{showAllResults:e.payload.showAll});case l:return m(t,e.payload.documentId,{loading:!0,query:e.payload.query,results:[],total:0,activeResultIndex:-1});case u:{const{documentId:s,results:a}=e.payload,r=t.documents[s];if(!r)return t;const o=[...r.results,...a],n=-1===r.activeResultIndex&&o.length>0?0:r.activeResultIndex;return m(t,s,{results:o,total:o.length,activeResultIndex:n,loading:!0})}case i:{const{documentId:s,results:a,total:r,activeResultIndex:o}=e.payload;return m(t,s,{results:a,total:r,activeResultIndex:o,loading:!1})}case h:return m(t,e.payload.documentId,{activeResultIndex:e.payload.index});default:return t}},initialState:g};exports.SEARCH_PLUGIN_ID=y,exports.SearchPlugin=v,exports.SearchPluginPackage=I,exports.initialSearchDocumentState=R,exports.initialState=g,exports.manifest=A;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/search-plugin.ts","../src/lib/manifest.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { MatchFlag, SearchResult } from '@embedpdf/models';\nimport { SearchDocumentState } from './types';\n\n// Action Types\nexport const INIT_SEARCH_STATE = 'SEARCH/INIT_STATE';\nexport const CLEANUP_SEARCH_STATE = 'SEARCH/CLEANUP_STATE';\nexport const START_SEARCH_SESSION = 'SEARCH/START_SEARCH_SESSION';\nexport const STOP_SEARCH_SESSION = 'SEARCH/STOP_SEARCH_SESSION';\nexport const SET_SEARCH_FLAGS = 'SEARCH/SET_SEARCH_FLAGS';\nexport const SET_SHOW_ALL_RESULTS = 'SEARCH/SET_SHOW_ALL_RESULTS';\nexport const START_SEARCH = 'SEARCH/START_SEARCH';\nexport const SET_SEARCH_RESULTS = 'SEARCH/SET_SEARCH_RESULTS';\nexport const APPEND_SEARCH_RESULTS = 'SEARCH/APPEND_SEARCH_RESULTS';\nexport const SET_ACTIVE_RESULT_INDEX = 'SEARCH/SET_ACTIVE_RESULT_INDEX';\n\n// Action Interfaces\nexport interface InitSearchStateAction extends Action {\n type: typeof INIT_SEARCH_STATE;\n payload: { documentId: string; state: SearchDocumentState };\n}\n\nexport interface CleanupSearchStateAction extends Action {\n type: typeof CLEANUP_SEARCH_STATE;\n payload: string; // documentId\n}\n\nexport interface StartSearchSessionAction extends Action {\n type: typeof START_SEARCH_SESSION;\n payload: { documentId: string };\n}\n\nexport interface StopSearchSessionAction extends Action {\n type: typeof STOP_SEARCH_SESSION;\n payload: { documentId: string };\n}\n\nexport interface SetSearchFlagsAction extends Action {\n type: typeof SET_SEARCH_FLAGS;\n payload: { documentId: string; flags: MatchFlag[] };\n}\n\nexport interface SetShowAllResultsAction extends Action {\n type: typeof SET_SHOW_ALL_RESULTS;\n payload: { documentId: string; showAll: boolean };\n}\n\nexport interface StartSearchAction extends Action {\n type: typeof START_SEARCH;\n payload: { documentId: string; query: string };\n}\n\nexport interface SetSearchResultsAction extends Action {\n type: typeof SET_SEARCH_RESULTS;\n payload: {\n documentId: string;\n results: SearchResult[];\n total: number;\n activeResultIndex: number;\n };\n}\n\nexport interface AppendSearchResultsAction extends Action {\n type: typeof APPEND_SEARCH_RESULTS;\n payload: {\n documentId: string;\n results: SearchResult[];\n };\n}\n\nexport interface SetActiveResultIndexAction extends Action {\n type: typeof SET_ACTIVE_RESULT_INDEX;\n payload: { documentId: string; index: number };\n}\n\n// Union Type for All Actions\nexport type SearchAction =\n | InitSearchStateAction\n | CleanupSearchStateAction\n | StartSearchSessionAction\n | StopSearchSessionAction\n | SetSearchFlagsAction\n | SetShowAllResultsAction\n | StartSearchAction\n | SetSearchResultsAction\n | AppendSearchResultsAction\n | SetActiveResultIndexAction;\n\n// Action Creators\nexport function initSearchState(\n documentId: string,\n state: SearchDocumentState,\n): InitSearchStateAction {\n return { type: INIT_SEARCH_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupSearchState(documentId: string): CleanupSearchStateAction {\n return { type: CLEANUP_SEARCH_STATE, payload: documentId };\n}\n\nexport function startSearchSession(documentId: string): StartSearchSessionAction {\n return { type: START_SEARCH_SESSION, payload: { documentId } };\n}\n\nexport function stopSearchSession(documentId: string): StopSearchSessionAction {\n return { type: STOP_SEARCH_SESSION, payload: { documentId } };\n}\n\nexport function setSearchFlags(documentId: string, flags: MatchFlag[]): SetSearchFlagsAction {\n return { type: SET_SEARCH_FLAGS, payload: { documentId, flags } };\n}\n\nexport function setShowAllResults(documentId: string, showAll: boolean): SetShowAllResultsAction {\n return { type: SET_SHOW_ALL_RESULTS, payload: { documentId, showAll } };\n}\n\nexport function startSearch(documentId: string, query: string): StartSearchAction {\n return { type: START_SEARCH, payload: { documentId, query } };\n}\n\nexport function setSearchResults(\n documentId: string,\n results: SearchResult[],\n total: number,\n activeResultIndex: number,\n): SetSearchResultsAction {\n return { type: SET_SEARCH_RESULTS, payload: { documentId, results, total, activeResultIndex } };\n}\n\nexport function appendSearchResults(\n documentId: string,\n results: SearchResult[],\n): AppendSearchResultsAction {\n return { type: APPEND_SEARCH_RESULTS, payload: { documentId, results } };\n}\n\nexport function setActiveResultIndex(\n documentId: string,\n index: number,\n): SetActiveResultIndexAction {\n return { type: SET_ACTIVE_RESULT_INDEX, payload: { documentId, index } };\n}\n","import { Reducer } from '@embedpdf/core';\nimport { SearchDocumentState, SearchState } from './types';\nimport {\n START_SEARCH_SESSION,\n STOP_SEARCH_SESSION,\n SET_SEARCH_FLAGS,\n SET_SHOW_ALL_RESULTS,\n START_SEARCH,\n SET_SEARCH_RESULTS,\n APPEND_SEARCH_RESULTS,\n SET_ACTIVE_RESULT_INDEX,\n SearchAction,\n INIT_SEARCH_STATE,\n CLEANUP_SEARCH_STATE,\n} from './actions';\nimport { MatchFlag } from '@embedpdf/models';\n\nexport const initialSearchDocumentState: SearchDocumentState = {\n flags: [] as MatchFlag[],\n results: [],\n total: 0,\n activeResultIndex: -1,\n showAllResults: true,\n query: '',\n loading: false,\n active: false,\n};\n\nexport const initialState: SearchState = {\n documents: {},\n};\n\nconst updateDocState = (\n state: SearchState,\n documentId: string,\n newDocState: Partial<SearchDocumentState>,\n): SearchState => {\n const oldDocState = state.documents[documentId] || initialSearchDocumentState;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...oldDocState,\n ...newDocState,\n },\n },\n };\n};\n\nexport const searchReducer: Reducer<SearchState, SearchAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_SEARCH_STATE:\n return {\n ...state,\n documents: {\n ...state.documents,\n [action.payload.documentId]: action.payload.state,\n },\n };\n\n case CLEANUP_SEARCH_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remaining } = state.documents;\n return {\n ...state,\n documents: remaining,\n };\n }\n\n case START_SEARCH_SESSION:\n return updateDocState(state, action.payload.documentId, { active: true });\n\n case STOP_SEARCH_SESSION:\n return updateDocState(state, action.payload.documentId, {\n results: [],\n total: 0,\n activeResultIndex: -1,\n query: '',\n loading: false,\n active: false,\n });\n\n case SET_SEARCH_FLAGS:\n return updateDocState(state, action.payload.documentId, { flags: action.payload.flags });\n\n case SET_SHOW_ALL_RESULTS:\n return updateDocState(state, action.payload.documentId, {\n showAllResults: action.payload.showAll,\n });\n\n case START_SEARCH:\n return updateDocState(state, action.payload.documentId, {\n loading: true,\n query: action.payload.query,\n // clear old results on new search start\n results: [],\n total: 0,\n activeResultIndex: -1,\n });\n\n case APPEND_SEARCH_RESULTS: {\n const { documentId, results } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n const newResults = [...docState.results, ...results];\n const firstHitIndex =\n docState.activeResultIndex === -1 && newResults.length > 0 ? 0 : docState.activeResultIndex;\n return updateDocState(state, documentId, {\n results: newResults,\n total: newResults.length, // total-so-far\n activeResultIndex: firstHitIndex,\n // keep loading true until final SET_SEARCH_RESULTS\n loading: true,\n });\n }\n\n case SET_SEARCH_RESULTS: {\n const { documentId, results, total, activeResultIndex } = action.payload;\n return updateDocState(state, documentId, {\n results,\n total,\n activeResultIndex,\n loading: false,\n });\n }\n\n case SET_ACTIVE_RESULT_INDEX:\n return updateDocState(state, action.payload.documentId, {\n activeResultIndex: action.payload.index,\n });\n\n default:\n return state;\n }\n};\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport {\n MatchFlag,\n SearchAllPagesResult,\n PdfEngine,\n PdfTask,\n PdfPageSearchProgress,\n PdfTaskHelper,\n PdfErrorCode,\n} from '@embedpdf/models';\nimport {\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchResultState,\n SearchScope,\n SearchResultEvent,\n SearchStartEvent,\n SearchStopEvent,\n ActiveResultChangeEvent,\n SearchResultStateEvent,\n SearchStateEvent,\n SearchDocumentState,\n} from './types';\nimport {\n startSearchSession,\n stopSearchSession,\n setSearchFlags,\n setShowAllResults,\n startSearch,\n setSearchResults,\n setActiveResultIndex,\n appendSearchResults,\n SearchAction,\n initSearchState,\n cleanupSearchState,\n} from './actions';\nimport { initialSearchDocumentState } from './reducer';\n\nexport class SearchPlugin extends BasePlugin<\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchAction\n> {\n static readonly id = 'search' as const;\n\n // Event emitters are now global and include documentId\n private readonly searchStop$ = createBehaviorEmitter<SearchStopEvent>();\n private readonly searchStart$ = createBehaviorEmitter<SearchStartEvent>();\n private readonly searchResult$ = createBehaviorEmitter<SearchResultEvent>();\n private readonly searchActiveResultChange$ = createBehaviorEmitter<ActiveResultChangeEvent>();\n private readonly searchResultState$ = createBehaviorEmitter<SearchResultStateEvent>();\n private readonly searchState$ = createBehaviorEmitter<SearchStateEvent>();\n\n // Keep reference to current running tasks per document\n private currentTask = new Map<string, ReturnType<PdfEngine['searchAllPages']>>();\n private pluginConfig: SearchPluginConfig;\n\n constructor(id: string, registry: PluginRegistry, config: SearchPluginConfig) {\n super(id, registry);\n this.pluginConfig = config;\n // We no longer need to listen to the loader.\n // Document lifecycle is handled by BasePlugin hooks.\n }\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n const initialState = {\n ...initialSearchDocumentState,\n flags: this.pluginConfig.flags || [],\n showAllResults: this.pluginConfig.showAllResults ?? true,\n };\n this.dispatch(initSearchState(documentId, initialState));\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.stopSearchSession(documentId); // Ensure any running search is stopped\n this.dispatch(cleanupSearchState(documentId));\n this.currentTask.delete(documentId);\n }\n\n async initialize(): Promise<void> {\n // Config is now handled in onDocumentLoadingStarted\n }\n\n override onStoreUpdated(prevState: SearchState, newState: SearchState): void {\n for (const documentId in newState.documents) {\n const prevDocState = prevState.documents[documentId];\n const newDocState = newState.documents[documentId];\n\n if (prevDocState !== newDocState) {\n // Emit per-document state\n this.searchState$.emit({ documentId, state: newDocState });\n\n // Emit reactive result state\n if (\n !prevDocState ||\n prevDocState.results !== newDocState.results ||\n prevDocState.activeResultIndex !== newDocState.activeResultIndex ||\n prevDocState.showAllResults !== newDocState.showAllResults ||\n prevDocState.active !== newDocState.active\n ) {\n this.searchResultState$.emit({\n documentId,\n state: {\n results: newDocState.results,\n activeResultIndex: newDocState.activeResultIndex,\n showAllResults: newDocState.showAllResults,\n active: newDocState.active,\n },\n });\n }\n }\n }\n }\n\n protected buildCapability(): SearchCapability {\n const getDocId = (documentId?: string) => documentId ?? this.getActiveDocumentId();\n const getDocState = (docId?: string) => {\n const id = getDocId(docId);\n const state = this.state.documents[id];\n if (!state) throw new Error(`Search state not found for document ${id}`);\n return state;\n };\n\n return {\n startSearch: (docId) => this.startSearchSession(getDocId(docId)),\n stopSearch: (docId) => this.stopSearchSession(getDocId(docId)),\n searchAllPages: (keyword, docId) => this.searchAllPages(keyword, getDocId(docId)),\n nextResult: (docId) => this.nextResult(getDocId(docId)),\n previousResult: (docId) => this.previousResult(getDocId(docId)),\n goToResult: (index, docId) => this.goToResult(index, getDocId(docId)),\n setShowAllResults: (showAll, docId) =>\n this.dispatch(setShowAllResults(getDocId(docId), showAll)),\n getShowAllResults: (docId) => getDocState(docId).showAllResults,\n getFlags: (docId) => getDocState(docId).flags,\n setFlags: (flags, docId) => this.setFlags(flags, getDocId(docId)),\n getState: (docId) => getDocState(docId),\n forDocument: this.createSearchScope.bind(this),\n onSearchResult: this.searchResult$.on,\n onSearchStart: this.searchStart$.on,\n onSearchStop: this.searchStop$.on,\n onActiveResultChange: this.searchActiveResultChange$.on,\n onSearchResultStateChange: this.searchResultState$.on,\n onStateChange: this.searchState$.on,\n };\n }\n\n private createSearchScope(documentId: string): SearchScope {\n const getDocState = () => {\n const state = this.state.documents[documentId];\n if (!state) throw new Error(`Search state not found for document ${documentId}`);\n return state;\n };\n\n return {\n startSearch: () => this.startSearchSession(documentId),\n stopSearch: () => this.stopSearchSession(documentId),\n searchAllPages: (keyword) => this.searchAllPages(keyword, documentId),\n nextResult: () => this.nextResult(documentId),\n previousResult: () => this.previousResult(documentId),\n goToResult: (index) => this.goToResult(index, documentId),\n setShowAllResults: (showAll) => this.dispatch(setShowAllResults(documentId, showAll)),\n getShowAllResults: () => getDocState().showAllResults,\n getFlags: () => getDocState().flags,\n setFlags: (flags) => this.setFlags(flags, documentId),\n getState: getDocState,\n onSearchResult: (listener: Listener<SearchAllPagesResult>) =>\n this.searchResult$.on((event) => {\n if (event.documentId === documentId) listener(event.results);\n }),\n onSearchStart: (listener: Listener<void>) =>\n this.searchStart$.on((event) => {\n if (event.documentId === documentId) listener();\n }),\n onSearchStop: (listener: Listener<void>) =>\n this.searchStop$.on((event) => {\n if (event.documentId === documentId) listener();\n }),\n onActiveResultChange: (listener: Listener<number>) =>\n this.searchActiveResultChange$.on((event) => {\n if (event.documentId === documentId) listener(event.index);\n }),\n onSearchResultStateChange: (listener: Listener<SearchResultState>) =>\n this.searchResultState$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n onStateChange: (listener: Listener<SearchDocumentState>) =>\n this.searchState$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n private setFlags(flags: MatchFlag[], documentId: string): void {\n this.dispatch(setSearchFlags(documentId, flags));\n const docState = this.state.documents[documentId];\n if (docState?.active) {\n this.searchAllPages(docState.query, documentId, true);\n }\n }\n\n private notifySearchStart(documentId: string): void {\n this.searchStart$.emit({ documentId });\n }\n\n private notifySearchStop(documentId: string): void {\n this.searchStop$.emit({ documentId });\n }\n\n private notifyActiveResultChange(documentId: string, index: number): void {\n this.searchActiveResultChange$.emit({ documentId, index });\n }\n\n private startSearchSession(documentId: string): void {\n const coreDoc = this.getCoreDocument(documentId);\n if (!coreDoc) return;\n this.dispatch(startSearchSession(documentId));\n this.notifySearchStart(documentId);\n }\n\n private stopSearchSession(documentId: string): void {\n const docState = this.state.documents[documentId];\n if (!docState?.active) return;\n\n const task = this.currentTask.get(documentId);\n if (task) {\n try {\n task.abort?.({ code: PdfErrorCode.Cancelled, message: 'search stopped' });\n } catch {}\n this.currentTask.delete(documentId);\n }\n\n this.dispatch(stopSearchSession(documentId));\n this.notifySearchStop(documentId);\n }\n\n private searchAllPages(\n keyword: string,\n documentId: string,\n force: boolean = false,\n ): PdfTask<SearchAllPagesResult, PdfPageSearchProgress> {\n const docState = this.state.documents[documentId];\n if (!docState) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'Search state not initialized',\n });\n }\n const coreDoc = this.getCoreDocument(documentId);\n if (!coreDoc?.document) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not loaded' });\n }\n\n const trimmedKeyword = keyword.trim();\n\n if (docState.query === trimmedKeyword && !force) {\n return PdfTaskHelper.resolve<SearchAllPagesResult, PdfPageSearchProgress>({\n results: docState.results,\n total: docState.total,\n });\n }\n\n // stop previous task if still running\n const oldTask = this.currentTask.get(documentId);\n if (oldTask) {\n try {\n oldTask.abort?.({ code: PdfErrorCode.Cancelled, message: 'new search' });\n } catch {}\n this.currentTask.delete(documentId);\n }\n\n this.dispatch(startSearch(documentId, trimmedKeyword));\n\n if (!trimmedKeyword) {\n this.dispatch(setSearchResults(documentId, [], 0, -1));\n return PdfTaskHelper.resolve<SearchAllPagesResult, PdfPageSearchProgress>({\n results: [],\n total: 0,\n });\n }\n\n if (!docState.active) {\n this.startSearchSession(documentId);\n }\n\n const task = this.engine.searchAllPages(coreDoc.document, trimmedKeyword, {\n flags: docState.flags,\n });\n this.currentTask.set(documentId, task);\n\n task.onProgress((p) => {\n if (p?.results?.length) {\n // Check if the task is still the current one before dispatching\n if (this.currentTask.get(documentId) === task) {\n this.dispatch(appendSearchResults(documentId, p.results));\n // set first active result as soon as we have something\n if (this.state.documents[documentId].activeResultIndex === -1) {\n this.dispatch(setActiveResultIndex(documentId, 0));\n this.notifyActiveResultChange(documentId, 0);\n }\n }\n }\n });\n\n task.wait(\n (results) => {\n this.currentTask.delete(documentId);\n const activeResultIndex = results.total > 0 ? 0 : -1;\n this.dispatch(\n setSearchResults(documentId, results.results, results.total, activeResultIndex),\n );\n this.searchResult$.emit({ documentId, results });\n if (results.total > 0) {\n this.notifyActiveResultChange(documentId, 0);\n }\n },\n (error) => {\n // Only clear results if the error wasn't an abort\n if (error?.reason?.code !== PdfErrorCode.Cancelled) {\n console.error('Error during search:', error);\n this.dispatch(setSearchResults(documentId, [], 0, -1));\n }\n this.currentTask.delete(documentId);\n },\n );\n\n return task;\n }\n\n private nextResult(documentId: string): number {\n const docState = this.state.documents[documentId];\n if (!docState || docState.results.length === 0) return -1;\n const nextIndex =\n docState.activeResultIndex >= docState.results.length - 1\n ? 0\n : docState.activeResultIndex + 1;\n return this.goToResult(nextIndex, documentId);\n }\n\n private previousResult(documentId: string): number {\n const docState = this.state.documents[documentId];\n if (!docState || docState.results.length === 0) return -1;\n const prevIndex =\n docState.activeResultIndex <= 0\n ? docState.results.length - 1\n : docState.activeResultIndex - 1;\n return this.goToResult(prevIndex, documentId);\n }\n\n private goToResult(index: number, documentId: string): number {\n const docState = this.state.documents[documentId];\n if (\n !docState ||\n docState.results.length === 0 ||\n index < 0 ||\n index >= docState.results.length\n ) {\n return -1;\n }\n this.dispatch(setActiveResultIndex(documentId, index));\n this.notifyActiveResultChange(documentId, index);\n return index;\n }\n\n async destroy(): Promise<void> {\n for (const documentId of Object.keys(this.state.documents)) {\n this.stopSearchSession(documentId);\n }\n this.searchResult$.clear();\n this.searchStart$.clear();\n this.searchStop$.clear();\n this.searchActiveResultChange$.clear();\n this.searchResultState$.clear();\n this.searchState$.clear();\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SearchPluginConfig } from './types';\n\nexport const SEARCH_PLUGIN_ID = 'search';\n\nexport const manifest: PluginManifest<SearchPluginConfig> = {\n id: SEARCH_PLUGIN_ID,\n name: 'Search Plugin',\n version: '1.0.0',\n provides: ['search'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n flags: [],\n },\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SearchPlugin } from './search-plugin';\nimport { manifest, SEARCH_PLUGIN_ID } from './manifest';\nimport { SearchPluginConfig, SearchState } from './types';\nimport { searchReducer, initialState, initialSearchDocumentState } from './reducer';\nimport { SearchAction } from './actions';\n\nexport const SearchPluginPackage: PluginPackage<\n SearchPlugin,\n SearchPluginConfig,\n SearchState,\n SearchAction\n> = {\n manifest,\n create: (registry, config) => new SearchPlugin(SEARCH_PLUGIN_ID, registry, config),\n reducer: searchReducer,\n initialState,\n};\n\nexport * from './search-plugin';\nexport * from './types';\nexport * from './manifest';\nexport { initialState, initialSearchDocumentState };\n"],"names":["INIT_SEARCH_STATE","CLEANUP_SEARCH_STATE","START_SEARCH_SESSION","STOP_SEARCH_SESSION","SET_SEARCH_FLAGS","SET_SHOW_ALL_RESULTS","START_SEARCH","SET_SEARCH_RESULTS","APPEND_SEARCH_RESULTS","SET_ACTIVE_RESULT_INDEX","setShowAllResults","documentId","showAll","type","payload","setSearchResults","results","total","activeResultIndex","setActiveResultIndex","index","initialSearchDocumentState","flags","showAllResults","query","loading","active","initialState","documents","updateDocState","state","newDocState","oldDocState","_SearchPlugin","BasePlugin","constructor","id","registry","config","super","this","searchStop$","createBehaviorEmitter","searchStart$","searchResult$","searchActiveResultChange$","searchResultState$","searchState$","currentTask","Map","pluginConfig","onDocumentLoadingStarted","dispatch","initSearchState","onDocumentClosed","stopSearchSession","cleanupSearchState","delete","initialize","onStoreUpdated","prevState","newState","prevDocState","emit","buildCapability","getDocId","getActiveDocumentId","getDocState","docId","Error","startSearch","startSearchSession","stopSearch","searchAllPages","keyword","nextResult","previousResult","goToResult","getShowAllResults","getFlags","setFlags","getState","forDocument","createSearchScope","bind","onSearchResult","on","onSearchStart","onSearchStop","onActiveResultChange","onSearchResultStateChange","onStateChange","listener","event","setSearchFlags","docState","notifySearchStart","notifySearchStop","notifyActiveResultChange","getCoreDocument","task","get","_a","abort","code","PdfErrorCode","Cancelled","message","force","PdfTaskHelper","reject","NotFound","coreDoc","document","trimmedKeyword","trim","resolve","oldTask","engine","set","onProgress","p","length","appendSearchResults","wait","error","reason","console","nextIndex","prevIndex","destroy","Object","keys","clear","SearchPlugin","SEARCH_PLUGIN_ID","manifest","name","version","provides","requires","optional","defaultConfig","enabled","SearchPluginPackage","create","reducer","action","removed","remaining","newResults","firstHitIndex"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/search-plugin.ts","../src/lib/manifest.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { MatchFlag, SearchResult } from '@embedpdf/models';\nimport { SearchDocumentState } from './types';\n\n// Action Types\nexport const INIT_SEARCH_STATE = 'SEARCH/INIT_STATE';\nexport const CLEANUP_SEARCH_STATE = 'SEARCH/CLEANUP_STATE';\nexport const START_SEARCH_SESSION = 'SEARCH/START_SEARCH_SESSION';\nexport const STOP_SEARCH_SESSION = 'SEARCH/STOP_SEARCH_SESSION';\nexport const SET_SEARCH_FLAGS = 'SEARCH/SET_SEARCH_FLAGS';\nexport const SET_SHOW_ALL_RESULTS = 'SEARCH/SET_SHOW_ALL_RESULTS';\nexport const START_SEARCH = 'SEARCH/START_SEARCH';\nexport const SET_SEARCH_RESULTS = 'SEARCH/SET_SEARCH_RESULTS';\nexport const APPEND_SEARCH_RESULTS = 'SEARCH/APPEND_SEARCH_RESULTS';\nexport const SET_ACTIVE_RESULT_INDEX = 'SEARCH/SET_ACTIVE_RESULT_INDEX';\n\n// Action Interfaces\nexport interface InitSearchStateAction extends Action {\n type: typeof INIT_SEARCH_STATE;\n payload: { documentId: string; state: SearchDocumentState };\n}\n\nexport interface CleanupSearchStateAction extends Action {\n type: typeof CLEANUP_SEARCH_STATE;\n payload: string; // documentId\n}\n\nexport interface StartSearchSessionAction extends Action {\n type: typeof START_SEARCH_SESSION;\n payload: { documentId: string };\n}\n\nexport interface StopSearchSessionAction extends Action {\n type: typeof STOP_SEARCH_SESSION;\n payload: { documentId: string };\n}\n\nexport interface SetSearchFlagsAction extends Action {\n type: typeof SET_SEARCH_FLAGS;\n payload: { documentId: string; flags: MatchFlag[] };\n}\n\nexport interface SetShowAllResultsAction extends Action {\n type: typeof SET_SHOW_ALL_RESULTS;\n payload: { documentId: string; showAll: boolean };\n}\n\nexport interface StartSearchAction extends Action {\n type: typeof START_SEARCH;\n payload: { documentId: string; query: string };\n}\n\nexport interface SetSearchResultsAction extends Action {\n type: typeof SET_SEARCH_RESULTS;\n payload: {\n documentId: string;\n results: SearchResult[];\n total: number;\n activeResultIndex: number;\n };\n}\n\nexport interface AppendSearchResultsAction extends Action {\n type: typeof APPEND_SEARCH_RESULTS;\n payload: {\n documentId: string;\n results: SearchResult[];\n };\n}\n\nexport interface SetActiveResultIndexAction extends Action {\n type: typeof SET_ACTIVE_RESULT_INDEX;\n payload: { documentId: string; index: number };\n}\n\n// Union Type for All Actions\nexport type SearchAction =\n | InitSearchStateAction\n | CleanupSearchStateAction\n | StartSearchSessionAction\n | StopSearchSessionAction\n | SetSearchFlagsAction\n | SetShowAllResultsAction\n | StartSearchAction\n | SetSearchResultsAction\n | AppendSearchResultsAction\n | SetActiveResultIndexAction;\n\n// Action Creators\nexport function initSearchState(\n documentId: string,\n state: SearchDocumentState,\n): InitSearchStateAction {\n return { type: INIT_SEARCH_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupSearchState(documentId: string): CleanupSearchStateAction {\n return { type: CLEANUP_SEARCH_STATE, payload: documentId };\n}\n\nexport function startSearchSession(documentId: string): StartSearchSessionAction {\n return { type: START_SEARCH_SESSION, payload: { documentId } };\n}\n\nexport function stopSearchSession(documentId: string): StopSearchSessionAction {\n return { type: STOP_SEARCH_SESSION, payload: { documentId } };\n}\n\nexport function setSearchFlags(documentId: string, flags: MatchFlag[]): SetSearchFlagsAction {\n return { type: SET_SEARCH_FLAGS, payload: { documentId, flags } };\n}\n\nexport function setShowAllResults(documentId: string, showAll: boolean): SetShowAllResultsAction {\n return { type: SET_SHOW_ALL_RESULTS, payload: { documentId, showAll } };\n}\n\nexport function startSearch(documentId: string, query: string): StartSearchAction {\n return { type: START_SEARCH, payload: { documentId, query } };\n}\n\nexport function setSearchResults(\n documentId: string,\n results: SearchResult[],\n total: number,\n activeResultIndex: number,\n): SetSearchResultsAction {\n return { type: SET_SEARCH_RESULTS, payload: { documentId, results, total, activeResultIndex } };\n}\n\nexport function appendSearchResults(\n documentId: string,\n results: SearchResult[],\n): AppendSearchResultsAction {\n return { type: APPEND_SEARCH_RESULTS, payload: { documentId, results } };\n}\n\nexport function setActiveResultIndex(\n documentId: string,\n index: number,\n): SetActiveResultIndexAction {\n return { type: SET_ACTIVE_RESULT_INDEX, payload: { documentId, index } };\n}\n","import { Reducer } from '@embedpdf/core';\nimport { SearchDocumentState, SearchState } from './types';\nimport {\n START_SEARCH_SESSION,\n STOP_SEARCH_SESSION,\n SET_SEARCH_FLAGS,\n SET_SHOW_ALL_RESULTS,\n START_SEARCH,\n SET_SEARCH_RESULTS,\n APPEND_SEARCH_RESULTS,\n SET_ACTIVE_RESULT_INDEX,\n SearchAction,\n INIT_SEARCH_STATE,\n CLEANUP_SEARCH_STATE,\n} from './actions';\nimport { MatchFlag } from '@embedpdf/models';\n\nexport const initialSearchDocumentState: SearchDocumentState = {\n flags: [] as MatchFlag[],\n results: [],\n total: 0,\n activeResultIndex: -1,\n showAllResults: true,\n query: '',\n loading: false,\n active: false,\n};\n\nexport const initialState: SearchState = {\n documents: {},\n};\n\nconst updateDocState = (\n state: SearchState,\n documentId: string,\n newDocState: Partial<SearchDocumentState>,\n): SearchState => {\n const oldDocState = state.documents[documentId] || initialSearchDocumentState;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...oldDocState,\n ...newDocState,\n },\n },\n };\n};\n\nexport const searchReducer: Reducer<SearchState, SearchAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_SEARCH_STATE:\n return {\n ...state,\n documents: {\n ...state.documents,\n [action.payload.documentId]: action.payload.state,\n },\n };\n\n case CLEANUP_SEARCH_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remaining } = state.documents;\n return {\n ...state,\n documents: remaining,\n };\n }\n\n case START_SEARCH_SESSION:\n return updateDocState(state, action.payload.documentId, { active: true });\n\n case STOP_SEARCH_SESSION:\n return updateDocState(state, action.payload.documentId, {\n results: [],\n total: 0,\n activeResultIndex: -1,\n query: '',\n loading: false,\n active: false,\n });\n\n case SET_SEARCH_FLAGS:\n return updateDocState(state, action.payload.documentId, { flags: action.payload.flags });\n\n case SET_SHOW_ALL_RESULTS:\n return updateDocState(state, action.payload.documentId, {\n showAllResults: action.payload.showAll,\n });\n\n case START_SEARCH:\n return updateDocState(state, action.payload.documentId, {\n loading: true,\n query: action.payload.query,\n // clear old results on new search start\n results: [],\n total: 0,\n activeResultIndex: -1,\n });\n\n case APPEND_SEARCH_RESULTS: {\n const { documentId, results } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n const newResults = [...docState.results, ...results];\n const firstHitIndex =\n docState.activeResultIndex === -1 && newResults.length > 0 ? 0 : docState.activeResultIndex;\n return updateDocState(state, documentId, {\n results: newResults,\n total: newResults.length, // total-so-far\n activeResultIndex: firstHitIndex,\n // keep loading true until final SET_SEARCH_RESULTS\n loading: true,\n });\n }\n\n case SET_SEARCH_RESULTS: {\n const { documentId, results, total, activeResultIndex } = action.payload;\n return updateDocState(state, documentId, {\n results,\n total,\n activeResultIndex,\n loading: false,\n });\n }\n\n case SET_ACTIVE_RESULT_INDEX:\n return updateDocState(state, action.payload.documentId, {\n activeResultIndex: action.payload.index,\n });\n\n default:\n return state;\n }\n};\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport {\n MatchFlag,\n SearchAllPagesResult,\n PdfEngine,\n PdfTask,\n PdfPageSearchProgress,\n PdfTaskHelper,\n PdfErrorCode,\n} from '@embedpdf/models';\nimport {\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchResultState,\n SearchScope,\n SearchResultEvent,\n SearchStartEvent,\n SearchStopEvent,\n ActiveResultChangeEvent,\n SearchResultStateEvent,\n SearchStateEvent,\n SearchDocumentState,\n} from './types';\nimport {\n startSearchSession,\n stopSearchSession,\n setSearchFlags,\n setShowAllResults,\n startSearch,\n setSearchResults,\n setActiveResultIndex,\n appendSearchResults,\n SearchAction,\n initSearchState,\n cleanupSearchState,\n} from './actions';\nimport { initialSearchDocumentState } from './reducer';\n\nexport class SearchPlugin extends BasePlugin<\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchAction\n> {\n static readonly id = 'search' as const;\n\n // Event emitters are now global and include documentId\n private readonly searchStop$ = createBehaviorEmitter<SearchStopEvent>();\n private readonly searchStart$ = createBehaviorEmitter<SearchStartEvent>();\n private readonly searchResult$ = createBehaviorEmitter<SearchResultEvent>();\n private readonly searchActiveResultChange$ = createBehaviorEmitter<ActiveResultChangeEvent>();\n private readonly searchResultState$ = createBehaviorEmitter<SearchResultStateEvent>();\n private readonly searchState$ = createBehaviorEmitter<SearchStateEvent>();\n\n // Keep reference to current running tasks per document\n private currentTask = new Map<string, ReturnType<PdfEngine['searchAllPages']>>();\n private pluginConfig: SearchPluginConfig;\n\n constructor(id: string, registry: PluginRegistry, config: SearchPluginConfig) {\n super(id, registry);\n this.pluginConfig = config;\n // We no longer need to listen to the loader.\n // Document lifecycle is handled by BasePlugin hooks.\n }\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n const initialState = {\n ...initialSearchDocumentState,\n flags: this.pluginConfig.flags || [],\n showAllResults: this.pluginConfig.showAllResults ?? true,\n };\n this.dispatch(initSearchState(documentId, initialState));\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.stopSearchSession(documentId); // Ensure any running search is stopped\n this.dispatch(cleanupSearchState(documentId));\n this.currentTask.delete(documentId);\n }\n\n async initialize(): Promise<void> {\n // Config is now handled in onDocumentLoadingStarted\n }\n\n override onStoreUpdated(prevState: SearchState, newState: SearchState): void {\n for (const documentId in newState.documents) {\n const prevDocState = prevState.documents[documentId];\n const newDocState = newState.documents[documentId];\n\n if (prevDocState !== newDocState) {\n // Emit per-document state\n this.searchState$.emit({ documentId, state: newDocState });\n\n // Emit reactive result state\n if (\n !prevDocState ||\n prevDocState.results !== newDocState.results ||\n prevDocState.activeResultIndex !== newDocState.activeResultIndex ||\n prevDocState.showAllResults !== newDocState.showAllResults ||\n prevDocState.active !== newDocState.active\n ) {\n this.searchResultState$.emit({\n documentId,\n state: {\n results: newDocState.results,\n activeResultIndex: newDocState.activeResultIndex,\n showAllResults: newDocState.showAllResults,\n active: newDocState.active,\n },\n });\n }\n }\n }\n }\n\n protected buildCapability(): SearchCapability {\n const getDocId = (documentId?: string) => documentId ?? this.getActiveDocumentId();\n const getDocState = (docId?: string) => {\n const id = getDocId(docId);\n const state = this.state.documents[id];\n if (!state) throw new Error(`Search state not found for document ${id}`);\n return state;\n };\n\n return {\n startSearch: (docId) => this.startSearchSession(getDocId(docId)),\n stopSearch: (docId) => this.stopSearchSession(getDocId(docId)),\n searchAllPages: (keyword, docId) => this.searchAllPages(keyword, getDocId(docId)),\n nextResult: (docId) => this.nextResult(getDocId(docId)),\n previousResult: (docId) => this.previousResult(getDocId(docId)),\n goToResult: (index, docId) => this.goToResult(index, getDocId(docId)),\n setShowAllResults: (showAll, docId) =>\n this.dispatch(setShowAllResults(getDocId(docId), showAll)),\n getShowAllResults: (docId) => getDocState(docId).showAllResults,\n getFlags: (docId) => getDocState(docId).flags,\n setFlags: (flags, docId) => this.setFlags(flags, getDocId(docId)),\n getState: (docId) => getDocState(docId),\n forDocument: this.createSearchScope.bind(this),\n onSearchResult: this.searchResult$.on,\n onSearchStart: this.searchStart$.on,\n onSearchStop: this.searchStop$.on,\n onActiveResultChange: this.searchActiveResultChange$.on,\n onSearchResultStateChange: this.searchResultState$.on,\n onStateChange: this.searchState$.on,\n };\n }\n\n private createSearchScope(documentId: string): SearchScope {\n const getDocState = () => {\n const state = this.state.documents[documentId];\n if (!state) throw new Error(`Search state not found for document ${documentId}`);\n return state;\n };\n\n return {\n startSearch: () => this.startSearchSession(documentId),\n stopSearch: () => this.stopSearchSession(documentId),\n searchAllPages: (keyword) => this.searchAllPages(keyword, documentId),\n nextResult: () => this.nextResult(documentId),\n previousResult: () => this.previousResult(documentId),\n goToResult: (index) => this.goToResult(index, documentId),\n setShowAllResults: (showAll) => this.dispatch(setShowAllResults(documentId, showAll)),\n getShowAllResults: () => getDocState().showAllResults,\n getFlags: () => getDocState().flags,\n setFlags: (flags) => this.setFlags(flags, documentId),\n getState: getDocState,\n onSearchResult: (listener: Listener<SearchAllPagesResult>) =>\n this.searchResult$.on((event) => {\n if (event.documentId === documentId) listener(event.results);\n }),\n onSearchStart: (listener: Listener<void>) =>\n this.searchStart$.on((event) => {\n if (event.documentId === documentId) listener();\n }),\n onSearchStop: (listener: Listener<void>) =>\n this.searchStop$.on((event) => {\n if (event.documentId === documentId) listener();\n }),\n onActiveResultChange: (listener: Listener<number>) =>\n this.searchActiveResultChange$.on((event) => {\n if (event.documentId === documentId) listener(event.index);\n }),\n onSearchResultStateChange: (listener: Listener<SearchResultState>) =>\n this.searchResultState$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n onStateChange: (listener: Listener<SearchDocumentState>) =>\n this.searchState$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n private setFlags(flags: MatchFlag[], documentId: string): void {\n this.dispatch(setSearchFlags(documentId, flags));\n const docState = this.state.documents[documentId];\n if (docState?.active) {\n this.searchAllPages(docState.query, documentId, true);\n }\n }\n\n private notifySearchStart(documentId: string): void {\n this.searchStart$.emit({ documentId });\n }\n\n private notifySearchStop(documentId: string): void {\n this.searchStop$.emit({ documentId });\n }\n\n private notifyActiveResultChange(documentId: string, index: number): void {\n this.searchActiveResultChange$.emit({ documentId, index });\n }\n\n private startSearchSession(documentId: string): void {\n const coreDoc = this.getCoreDocument(documentId);\n if (!coreDoc) return;\n this.dispatch(startSearchSession(documentId));\n this.notifySearchStart(documentId);\n }\n\n private stopSearchSession(documentId: string): void {\n const docState = this.state.documents[documentId];\n if (!docState?.active) return;\n\n const task = this.currentTask.get(documentId);\n if (task) {\n try {\n task.abort?.({ code: PdfErrorCode.Cancelled, message: 'search stopped' });\n } catch {}\n this.currentTask.delete(documentId);\n }\n\n this.dispatch(stopSearchSession(documentId));\n this.notifySearchStop(documentId);\n }\n\n private searchAllPages(\n keyword: string,\n documentId: string,\n force: boolean = false,\n ): PdfTask<SearchAllPagesResult, PdfPageSearchProgress> {\n const docState = this.state.documents[documentId];\n if (!docState) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'Search state not initialized',\n });\n }\n const coreDoc = this.getCoreDocument(documentId);\n if (!coreDoc?.document) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not loaded' });\n }\n\n const trimmedKeyword = keyword.trim();\n\n if (docState.query === trimmedKeyword && !force) {\n return PdfTaskHelper.resolve<SearchAllPagesResult, PdfPageSearchProgress>({\n results: docState.results,\n total: docState.total,\n });\n }\n\n // stop previous task if still running\n const oldTask = this.currentTask.get(documentId);\n if (oldTask) {\n try {\n oldTask.abort?.({ code: PdfErrorCode.Cancelled, message: 'new search' });\n } catch {}\n this.currentTask.delete(documentId);\n }\n\n this.dispatch(startSearch(documentId, trimmedKeyword));\n\n if (!trimmedKeyword) {\n this.dispatch(setSearchResults(documentId, [], 0, -1));\n return PdfTaskHelper.resolve<SearchAllPagesResult, PdfPageSearchProgress>({\n results: [],\n total: 0,\n });\n }\n\n if (!docState.active) {\n this.startSearchSession(documentId);\n }\n\n const task = this.engine.searchAllPages(coreDoc.document, trimmedKeyword, {\n flags: docState.flags,\n });\n this.currentTask.set(documentId, task);\n\n task.onProgress((p) => {\n if (p?.results?.length) {\n // Check if the task is still the current one before dispatching\n if (this.currentTask.get(documentId) === task) {\n this.dispatch(appendSearchResults(documentId, p.results));\n // set first active result as soon as we have something\n if (this.state.documents[documentId].activeResultIndex === -1) {\n this.dispatch(setActiveResultIndex(documentId, 0));\n this.notifyActiveResultChange(documentId, 0);\n }\n }\n }\n });\n\n task.wait(\n (results) => {\n this.currentTask.delete(documentId);\n const activeResultIndex = results.total > 0 ? 0 : -1;\n this.dispatch(\n setSearchResults(documentId, results.results, results.total, activeResultIndex),\n );\n this.searchResult$.emit({ documentId, results });\n if (results.total > 0) {\n this.notifyActiveResultChange(documentId, 0);\n }\n },\n (error) => {\n // Only clear results if the error wasn't an abort\n if (error?.reason?.code !== PdfErrorCode.Cancelled) {\n console.error('Error during search:', error);\n this.dispatch(setSearchResults(documentId, [], 0, -1));\n }\n this.currentTask.delete(documentId);\n },\n );\n\n return task;\n }\n\n private nextResult(documentId: string): number {\n const docState = this.state.documents[documentId];\n if (!docState || docState.results.length === 0) return -1;\n const nextIndex =\n docState.activeResultIndex >= docState.results.length - 1\n ? 0\n : docState.activeResultIndex + 1;\n return this.goToResult(nextIndex, documentId);\n }\n\n private previousResult(documentId: string): number {\n const docState = this.state.documents[documentId];\n if (!docState || docState.results.length === 0) return -1;\n const prevIndex =\n docState.activeResultIndex <= 0\n ? docState.results.length - 1\n : docState.activeResultIndex - 1;\n return this.goToResult(prevIndex, documentId);\n }\n\n private goToResult(index: number, documentId: string): number {\n const docState = this.state.documents[documentId];\n if (\n !docState ||\n docState.results.length === 0 ||\n index < 0 ||\n index >= docState.results.length\n ) {\n return -1;\n }\n this.dispatch(setActiveResultIndex(documentId, index));\n this.notifyActiveResultChange(documentId, index);\n return index;\n }\n\n async destroy(): Promise<void> {\n for (const documentId of Object.keys(this.state.documents)) {\n this.stopSearchSession(documentId);\n }\n this.searchResult$.clear();\n this.searchStart$.clear();\n this.searchStop$.clear();\n this.searchActiveResultChange$.clear();\n this.searchResultState$.clear();\n this.searchState$.clear();\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SearchPluginConfig } from './types';\n\nexport const SEARCH_PLUGIN_ID = 'search';\n\nexport const manifest: PluginManifest<SearchPluginConfig> = {\n id: SEARCH_PLUGIN_ID,\n name: 'Search Plugin',\n version: '1.0.0',\n provides: ['search'],\n requires: [],\n optional: [],\n defaultConfig: {\n flags: [],\n },\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SearchPlugin } from './search-plugin';\nimport { manifest, SEARCH_PLUGIN_ID } from './manifest';\nimport { SearchPluginConfig, SearchState } from './types';\nimport { searchReducer, initialState, initialSearchDocumentState } from './reducer';\nimport { SearchAction } from './actions';\n\nexport const SearchPluginPackage: PluginPackage<\n SearchPlugin,\n SearchPluginConfig,\n SearchState,\n SearchAction\n> = {\n manifest,\n create: (registry, config) => new SearchPlugin(SEARCH_PLUGIN_ID, registry, config),\n reducer: searchReducer,\n initialState,\n};\n\nexport * from './search-plugin';\nexport * from './types';\nexport * from './manifest';\nexport { initialState, initialSearchDocumentState };\n"],"names":["INIT_SEARCH_STATE","CLEANUP_SEARCH_STATE","START_SEARCH_SESSION","STOP_SEARCH_SESSION","SET_SEARCH_FLAGS","SET_SHOW_ALL_RESULTS","START_SEARCH","SET_SEARCH_RESULTS","APPEND_SEARCH_RESULTS","SET_ACTIVE_RESULT_INDEX","setShowAllResults","documentId","showAll","type","payload","setSearchResults","results","total","activeResultIndex","setActiveResultIndex","index","initialSearchDocumentState","flags","showAllResults","query","loading","active","initialState","documents","updateDocState","state","newDocState","oldDocState","_SearchPlugin","BasePlugin","constructor","id","registry","config","super","this","searchStop$","createBehaviorEmitter","searchStart$","searchResult$","searchActiveResultChange$","searchResultState$","searchState$","currentTask","Map","pluginConfig","onDocumentLoadingStarted","dispatch","initSearchState","onDocumentClosed","stopSearchSession","cleanupSearchState","delete","initialize","onStoreUpdated","prevState","newState","prevDocState","emit","buildCapability","getDocId","getActiveDocumentId","getDocState","docId","Error","startSearch","startSearchSession","stopSearch","searchAllPages","keyword","nextResult","previousResult","goToResult","getShowAllResults","getFlags","setFlags","getState","forDocument","createSearchScope","bind","onSearchResult","on","onSearchStart","onSearchStop","onActiveResultChange","onSearchResultStateChange","onStateChange","listener","event","setSearchFlags","docState","notifySearchStart","notifySearchStop","notifyActiveResultChange","getCoreDocument","task","get","_a","abort","code","PdfErrorCode","Cancelled","message","force","PdfTaskHelper","reject","NotFound","coreDoc","document","trimmedKeyword","trim","resolve","oldTask","engine","set","onProgress","p","length","appendSearchResults","wait","error","reason","console","nextIndex","prevIndex","destroy","Object","keys","clear","SearchPlugin","SEARCH_PLUGIN_ID","manifest","name","version","provides","requires","optional","defaultConfig","SearchPluginPackage","create","reducer","action","removed","remaining","newResults","firstHitIndex"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -416,7 +416,6 @@ const manifest = {
416
416
  requires: [],
417
417
  optional: [],
418
418
  defaultConfig: {
419
- enabled: true,
420
419
  flags: []
421
420
  }
422
421
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/search-plugin.ts","../src/lib/manifest.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { MatchFlag, SearchResult } from '@embedpdf/models';\nimport { SearchDocumentState } from './types';\n\n// Action Types\nexport const INIT_SEARCH_STATE = 'SEARCH/INIT_STATE';\nexport const CLEANUP_SEARCH_STATE = 'SEARCH/CLEANUP_STATE';\nexport const START_SEARCH_SESSION = 'SEARCH/START_SEARCH_SESSION';\nexport const STOP_SEARCH_SESSION = 'SEARCH/STOP_SEARCH_SESSION';\nexport const SET_SEARCH_FLAGS = 'SEARCH/SET_SEARCH_FLAGS';\nexport const SET_SHOW_ALL_RESULTS = 'SEARCH/SET_SHOW_ALL_RESULTS';\nexport const START_SEARCH = 'SEARCH/START_SEARCH';\nexport const SET_SEARCH_RESULTS = 'SEARCH/SET_SEARCH_RESULTS';\nexport const APPEND_SEARCH_RESULTS = 'SEARCH/APPEND_SEARCH_RESULTS';\nexport const SET_ACTIVE_RESULT_INDEX = 'SEARCH/SET_ACTIVE_RESULT_INDEX';\n\n// Action Interfaces\nexport interface InitSearchStateAction extends Action {\n type: typeof INIT_SEARCH_STATE;\n payload: { documentId: string; state: SearchDocumentState };\n}\n\nexport interface CleanupSearchStateAction extends Action {\n type: typeof CLEANUP_SEARCH_STATE;\n payload: string; // documentId\n}\n\nexport interface StartSearchSessionAction extends Action {\n type: typeof START_SEARCH_SESSION;\n payload: { documentId: string };\n}\n\nexport interface StopSearchSessionAction extends Action {\n type: typeof STOP_SEARCH_SESSION;\n payload: { documentId: string };\n}\n\nexport interface SetSearchFlagsAction extends Action {\n type: typeof SET_SEARCH_FLAGS;\n payload: { documentId: string; flags: MatchFlag[] };\n}\n\nexport interface SetShowAllResultsAction extends Action {\n type: typeof SET_SHOW_ALL_RESULTS;\n payload: { documentId: string; showAll: boolean };\n}\n\nexport interface StartSearchAction extends Action {\n type: typeof START_SEARCH;\n payload: { documentId: string; query: string };\n}\n\nexport interface SetSearchResultsAction extends Action {\n type: typeof SET_SEARCH_RESULTS;\n payload: {\n documentId: string;\n results: SearchResult[];\n total: number;\n activeResultIndex: number;\n };\n}\n\nexport interface AppendSearchResultsAction extends Action {\n type: typeof APPEND_SEARCH_RESULTS;\n payload: {\n documentId: string;\n results: SearchResult[];\n };\n}\n\nexport interface SetActiveResultIndexAction extends Action {\n type: typeof SET_ACTIVE_RESULT_INDEX;\n payload: { documentId: string; index: number };\n}\n\n// Union Type for All Actions\nexport type SearchAction =\n | InitSearchStateAction\n | CleanupSearchStateAction\n | StartSearchSessionAction\n | StopSearchSessionAction\n | SetSearchFlagsAction\n | SetShowAllResultsAction\n | StartSearchAction\n | SetSearchResultsAction\n | AppendSearchResultsAction\n | SetActiveResultIndexAction;\n\n// Action Creators\nexport function initSearchState(\n documentId: string,\n state: SearchDocumentState,\n): InitSearchStateAction {\n return { type: INIT_SEARCH_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupSearchState(documentId: string): CleanupSearchStateAction {\n return { type: CLEANUP_SEARCH_STATE, payload: documentId };\n}\n\nexport function startSearchSession(documentId: string): StartSearchSessionAction {\n return { type: START_SEARCH_SESSION, payload: { documentId } };\n}\n\nexport function stopSearchSession(documentId: string): StopSearchSessionAction {\n return { type: STOP_SEARCH_SESSION, payload: { documentId } };\n}\n\nexport function setSearchFlags(documentId: string, flags: MatchFlag[]): SetSearchFlagsAction {\n return { type: SET_SEARCH_FLAGS, payload: { documentId, flags } };\n}\n\nexport function setShowAllResults(documentId: string, showAll: boolean): SetShowAllResultsAction {\n return { type: SET_SHOW_ALL_RESULTS, payload: { documentId, showAll } };\n}\n\nexport function startSearch(documentId: string, query: string): StartSearchAction {\n return { type: START_SEARCH, payload: { documentId, query } };\n}\n\nexport function setSearchResults(\n documentId: string,\n results: SearchResult[],\n total: number,\n activeResultIndex: number,\n): SetSearchResultsAction {\n return { type: SET_SEARCH_RESULTS, payload: { documentId, results, total, activeResultIndex } };\n}\n\nexport function appendSearchResults(\n documentId: string,\n results: SearchResult[],\n): AppendSearchResultsAction {\n return { type: APPEND_SEARCH_RESULTS, payload: { documentId, results } };\n}\n\nexport function setActiveResultIndex(\n documentId: string,\n index: number,\n): SetActiveResultIndexAction {\n return { type: SET_ACTIVE_RESULT_INDEX, payload: { documentId, index } };\n}\n","import { Reducer } from '@embedpdf/core';\nimport { SearchDocumentState, SearchState } from './types';\nimport {\n START_SEARCH_SESSION,\n STOP_SEARCH_SESSION,\n SET_SEARCH_FLAGS,\n SET_SHOW_ALL_RESULTS,\n START_SEARCH,\n SET_SEARCH_RESULTS,\n APPEND_SEARCH_RESULTS,\n SET_ACTIVE_RESULT_INDEX,\n SearchAction,\n INIT_SEARCH_STATE,\n CLEANUP_SEARCH_STATE,\n} from './actions';\nimport { MatchFlag } from '@embedpdf/models';\n\nexport const initialSearchDocumentState: SearchDocumentState = {\n flags: [] as MatchFlag[],\n results: [],\n total: 0,\n activeResultIndex: -1,\n showAllResults: true,\n query: '',\n loading: false,\n active: false,\n};\n\nexport const initialState: SearchState = {\n documents: {},\n};\n\nconst updateDocState = (\n state: SearchState,\n documentId: string,\n newDocState: Partial<SearchDocumentState>,\n): SearchState => {\n const oldDocState = state.documents[documentId] || initialSearchDocumentState;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...oldDocState,\n ...newDocState,\n },\n },\n };\n};\n\nexport const searchReducer: Reducer<SearchState, SearchAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_SEARCH_STATE:\n return {\n ...state,\n documents: {\n ...state.documents,\n [action.payload.documentId]: action.payload.state,\n },\n };\n\n case CLEANUP_SEARCH_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remaining } = state.documents;\n return {\n ...state,\n documents: remaining,\n };\n }\n\n case START_SEARCH_SESSION:\n return updateDocState(state, action.payload.documentId, { active: true });\n\n case STOP_SEARCH_SESSION:\n return updateDocState(state, action.payload.documentId, {\n results: [],\n total: 0,\n activeResultIndex: -1,\n query: '',\n loading: false,\n active: false,\n });\n\n case SET_SEARCH_FLAGS:\n return updateDocState(state, action.payload.documentId, { flags: action.payload.flags });\n\n case SET_SHOW_ALL_RESULTS:\n return updateDocState(state, action.payload.documentId, {\n showAllResults: action.payload.showAll,\n });\n\n case START_SEARCH:\n return updateDocState(state, action.payload.documentId, {\n loading: true,\n query: action.payload.query,\n // clear old results on new search start\n results: [],\n total: 0,\n activeResultIndex: -1,\n });\n\n case APPEND_SEARCH_RESULTS: {\n const { documentId, results } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n const newResults = [...docState.results, ...results];\n const firstHitIndex =\n docState.activeResultIndex === -1 && newResults.length > 0 ? 0 : docState.activeResultIndex;\n return updateDocState(state, documentId, {\n results: newResults,\n total: newResults.length, // total-so-far\n activeResultIndex: firstHitIndex,\n // keep loading true until final SET_SEARCH_RESULTS\n loading: true,\n });\n }\n\n case SET_SEARCH_RESULTS: {\n const { documentId, results, total, activeResultIndex } = action.payload;\n return updateDocState(state, documentId, {\n results,\n total,\n activeResultIndex,\n loading: false,\n });\n }\n\n case SET_ACTIVE_RESULT_INDEX:\n return updateDocState(state, action.payload.documentId, {\n activeResultIndex: action.payload.index,\n });\n\n default:\n return state;\n }\n};\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport {\n MatchFlag,\n SearchAllPagesResult,\n PdfEngine,\n PdfTask,\n PdfPageSearchProgress,\n PdfTaskHelper,\n PdfErrorCode,\n} from '@embedpdf/models';\nimport {\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchResultState,\n SearchScope,\n SearchResultEvent,\n SearchStartEvent,\n SearchStopEvent,\n ActiveResultChangeEvent,\n SearchResultStateEvent,\n SearchStateEvent,\n SearchDocumentState,\n} from './types';\nimport {\n startSearchSession,\n stopSearchSession,\n setSearchFlags,\n setShowAllResults,\n startSearch,\n setSearchResults,\n setActiveResultIndex,\n appendSearchResults,\n SearchAction,\n initSearchState,\n cleanupSearchState,\n} from './actions';\nimport { initialSearchDocumentState } from './reducer';\n\nexport class SearchPlugin extends BasePlugin<\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchAction\n> {\n static readonly id = 'search' as const;\n\n // Event emitters are now global and include documentId\n private readonly searchStop$ = createBehaviorEmitter<SearchStopEvent>();\n private readonly searchStart$ = createBehaviorEmitter<SearchStartEvent>();\n private readonly searchResult$ = createBehaviorEmitter<SearchResultEvent>();\n private readonly searchActiveResultChange$ = createBehaviorEmitter<ActiveResultChangeEvent>();\n private readonly searchResultState$ = createBehaviorEmitter<SearchResultStateEvent>();\n private readonly searchState$ = createBehaviorEmitter<SearchStateEvent>();\n\n // Keep reference to current running tasks per document\n private currentTask = new Map<string, ReturnType<PdfEngine['searchAllPages']>>();\n private pluginConfig: SearchPluginConfig;\n\n constructor(id: string, registry: PluginRegistry, config: SearchPluginConfig) {\n super(id, registry);\n this.pluginConfig = config;\n // We no longer need to listen to the loader.\n // Document lifecycle is handled by BasePlugin hooks.\n }\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n const initialState = {\n ...initialSearchDocumentState,\n flags: this.pluginConfig.flags || [],\n showAllResults: this.pluginConfig.showAllResults ?? true,\n };\n this.dispatch(initSearchState(documentId, initialState));\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.stopSearchSession(documentId); // Ensure any running search is stopped\n this.dispatch(cleanupSearchState(documentId));\n this.currentTask.delete(documentId);\n }\n\n async initialize(): Promise<void> {\n // Config is now handled in onDocumentLoadingStarted\n }\n\n override onStoreUpdated(prevState: SearchState, newState: SearchState): void {\n for (const documentId in newState.documents) {\n const prevDocState = prevState.documents[documentId];\n const newDocState = newState.documents[documentId];\n\n if (prevDocState !== newDocState) {\n // Emit per-document state\n this.searchState$.emit({ documentId, state: newDocState });\n\n // Emit reactive result state\n if (\n !prevDocState ||\n prevDocState.results !== newDocState.results ||\n prevDocState.activeResultIndex !== newDocState.activeResultIndex ||\n prevDocState.showAllResults !== newDocState.showAllResults ||\n prevDocState.active !== newDocState.active\n ) {\n this.searchResultState$.emit({\n documentId,\n state: {\n results: newDocState.results,\n activeResultIndex: newDocState.activeResultIndex,\n showAllResults: newDocState.showAllResults,\n active: newDocState.active,\n },\n });\n }\n }\n }\n }\n\n protected buildCapability(): SearchCapability {\n const getDocId = (documentId?: string) => documentId ?? this.getActiveDocumentId();\n const getDocState = (docId?: string) => {\n const id = getDocId(docId);\n const state = this.state.documents[id];\n if (!state) throw new Error(`Search state not found for document ${id}`);\n return state;\n };\n\n return {\n startSearch: (docId) => this.startSearchSession(getDocId(docId)),\n stopSearch: (docId) => this.stopSearchSession(getDocId(docId)),\n searchAllPages: (keyword, docId) => this.searchAllPages(keyword, getDocId(docId)),\n nextResult: (docId) => this.nextResult(getDocId(docId)),\n previousResult: (docId) => this.previousResult(getDocId(docId)),\n goToResult: (index, docId) => this.goToResult(index, getDocId(docId)),\n setShowAllResults: (showAll, docId) =>\n this.dispatch(setShowAllResults(getDocId(docId), showAll)),\n getShowAllResults: (docId) => getDocState(docId).showAllResults,\n getFlags: (docId) => getDocState(docId).flags,\n setFlags: (flags, docId) => this.setFlags(flags, getDocId(docId)),\n getState: (docId) => getDocState(docId),\n forDocument: this.createSearchScope.bind(this),\n onSearchResult: this.searchResult$.on,\n onSearchStart: this.searchStart$.on,\n onSearchStop: this.searchStop$.on,\n onActiveResultChange: this.searchActiveResultChange$.on,\n onSearchResultStateChange: this.searchResultState$.on,\n onStateChange: this.searchState$.on,\n };\n }\n\n private createSearchScope(documentId: string): SearchScope {\n const getDocState = () => {\n const state = this.state.documents[documentId];\n if (!state) throw new Error(`Search state not found for document ${documentId}`);\n return state;\n };\n\n return {\n startSearch: () => this.startSearchSession(documentId),\n stopSearch: () => this.stopSearchSession(documentId),\n searchAllPages: (keyword) => this.searchAllPages(keyword, documentId),\n nextResult: () => this.nextResult(documentId),\n previousResult: () => this.previousResult(documentId),\n goToResult: (index) => this.goToResult(index, documentId),\n setShowAllResults: (showAll) => this.dispatch(setShowAllResults(documentId, showAll)),\n getShowAllResults: () => getDocState().showAllResults,\n getFlags: () => getDocState().flags,\n setFlags: (flags) => this.setFlags(flags, documentId),\n getState: getDocState,\n onSearchResult: (listener: Listener<SearchAllPagesResult>) =>\n this.searchResult$.on((event) => {\n if (event.documentId === documentId) listener(event.results);\n }),\n onSearchStart: (listener: Listener<void>) =>\n this.searchStart$.on((event) => {\n if (event.documentId === documentId) listener();\n }),\n onSearchStop: (listener: Listener<void>) =>\n this.searchStop$.on((event) => {\n if (event.documentId === documentId) listener();\n }),\n onActiveResultChange: (listener: Listener<number>) =>\n this.searchActiveResultChange$.on((event) => {\n if (event.documentId === documentId) listener(event.index);\n }),\n onSearchResultStateChange: (listener: Listener<SearchResultState>) =>\n this.searchResultState$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n onStateChange: (listener: Listener<SearchDocumentState>) =>\n this.searchState$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n private setFlags(flags: MatchFlag[], documentId: string): void {\n this.dispatch(setSearchFlags(documentId, flags));\n const docState = this.state.documents[documentId];\n if (docState?.active) {\n this.searchAllPages(docState.query, documentId, true);\n }\n }\n\n private notifySearchStart(documentId: string): void {\n this.searchStart$.emit({ documentId });\n }\n\n private notifySearchStop(documentId: string): void {\n this.searchStop$.emit({ documentId });\n }\n\n private notifyActiveResultChange(documentId: string, index: number): void {\n this.searchActiveResultChange$.emit({ documentId, index });\n }\n\n private startSearchSession(documentId: string): void {\n const coreDoc = this.getCoreDocument(documentId);\n if (!coreDoc) return;\n this.dispatch(startSearchSession(documentId));\n this.notifySearchStart(documentId);\n }\n\n private stopSearchSession(documentId: string): void {\n const docState = this.state.documents[documentId];\n if (!docState?.active) return;\n\n const task = this.currentTask.get(documentId);\n if (task) {\n try {\n task.abort?.({ code: PdfErrorCode.Cancelled, message: 'search stopped' });\n } catch {}\n this.currentTask.delete(documentId);\n }\n\n this.dispatch(stopSearchSession(documentId));\n this.notifySearchStop(documentId);\n }\n\n private searchAllPages(\n keyword: string,\n documentId: string,\n force: boolean = false,\n ): PdfTask<SearchAllPagesResult, PdfPageSearchProgress> {\n const docState = this.state.documents[documentId];\n if (!docState) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'Search state not initialized',\n });\n }\n const coreDoc = this.getCoreDocument(documentId);\n if (!coreDoc?.document) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not loaded' });\n }\n\n const trimmedKeyword = keyword.trim();\n\n if (docState.query === trimmedKeyword && !force) {\n return PdfTaskHelper.resolve<SearchAllPagesResult, PdfPageSearchProgress>({\n results: docState.results,\n total: docState.total,\n });\n }\n\n // stop previous task if still running\n const oldTask = this.currentTask.get(documentId);\n if (oldTask) {\n try {\n oldTask.abort?.({ code: PdfErrorCode.Cancelled, message: 'new search' });\n } catch {}\n this.currentTask.delete(documentId);\n }\n\n this.dispatch(startSearch(documentId, trimmedKeyword));\n\n if (!trimmedKeyword) {\n this.dispatch(setSearchResults(documentId, [], 0, -1));\n return PdfTaskHelper.resolve<SearchAllPagesResult, PdfPageSearchProgress>({\n results: [],\n total: 0,\n });\n }\n\n if (!docState.active) {\n this.startSearchSession(documentId);\n }\n\n const task = this.engine.searchAllPages(coreDoc.document, trimmedKeyword, {\n flags: docState.flags,\n });\n this.currentTask.set(documentId, task);\n\n task.onProgress((p) => {\n if (p?.results?.length) {\n // Check if the task is still the current one before dispatching\n if (this.currentTask.get(documentId) === task) {\n this.dispatch(appendSearchResults(documentId, p.results));\n // set first active result as soon as we have something\n if (this.state.documents[documentId].activeResultIndex === -1) {\n this.dispatch(setActiveResultIndex(documentId, 0));\n this.notifyActiveResultChange(documentId, 0);\n }\n }\n }\n });\n\n task.wait(\n (results) => {\n this.currentTask.delete(documentId);\n const activeResultIndex = results.total > 0 ? 0 : -1;\n this.dispatch(\n setSearchResults(documentId, results.results, results.total, activeResultIndex),\n );\n this.searchResult$.emit({ documentId, results });\n if (results.total > 0) {\n this.notifyActiveResultChange(documentId, 0);\n }\n },\n (error) => {\n // Only clear results if the error wasn't an abort\n if (error?.reason?.code !== PdfErrorCode.Cancelled) {\n console.error('Error during search:', error);\n this.dispatch(setSearchResults(documentId, [], 0, -1));\n }\n this.currentTask.delete(documentId);\n },\n );\n\n return task;\n }\n\n private nextResult(documentId: string): number {\n const docState = this.state.documents[documentId];\n if (!docState || docState.results.length === 0) return -1;\n const nextIndex =\n docState.activeResultIndex >= docState.results.length - 1\n ? 0\n : docState.activeResultIndex + 1;\n return this.goToResult(nextIndex, documentId);\n }\n\n private previousResult(documentId: string): number {\n const docState = this.state.documents[documentId];\n if (!docState || docState.results.length === 0) return -1;\n const prevIndex =\n docState.activeResultIndex <= 0\n ? docState.results.length - 1\n : docState.activeResultIndex - 1;\n return this.goToResult(prevIndex, documentId);\n }\n\n private goToResult(index: number, documentId: string): number {\n const docState = this.state.documents[documentId];\n if (\n !docState ||\n docState.results.length === 0 ||\n index < 0 ||\n index >= docState.results.length\n ) {\n return -1;\n }\n this.dispatch(setActiveResultIndex(documentId, index));\n this.notifyActiveResultChange(documentId, index);\n return index;\n }\n\n async destroy(): Promise<void> {\n for (const documentId of Object.keys(this.state.documents)) {\n this.stopSearchSession(documentId);\n }\n this.searchResult$.clear();\n this.searchStart$.clear();\n this.searchStop$.clear();\n this.searchActiveResultChange$.clear();\n this.searchResultState$.clear();\n this.searchState$.clear();\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SearchPluginConfig } from './types';\n\nexport const SEARCH_PLUGIN_ID = 'search';\n\nexport const manifest: PluginManifest<SearchPluginConfig> = {\n id: SEARCH_PLUGIN_ID,\n name: 'Search Plugin',\n version: '1.0.0',\n provides: ['search'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n flags: [],\n },\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SearchPlugin } from './search-plugin';\nimport { manifest, SEARCH_PLUGIN_ID } from './manifest';\nimport { SearchPluginConfig, SearchState } from './types';\nimport { searchReducer, initialState, initialSearchDocumentState } from './reducer';\nimport { SearchAction } from './actions';\n\nexport const SearchPluginPackage: PluginPackage<\n SearchPlugin,\n SearchPluginConfig,\n SearchState,\n SearchAction\n> = {\n manifest,\n create: (registry, config) => new SearchPlugin(SEARCH_PLUGIN_ID, registry, config),\n reducer: searchReducer,\n initialState,\n};\n\nexport * from './search-plugin';\nexport * from './types';\nexport * from './manifest';\nexport { initialState, initialSearchDocumentState };\n"],"names":["initialState","_a"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/search-plugin.ts","../src/lib/manifest.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { MatchFlag, SearchResult } from '@embedpdf/models';\nimport { SearchDocumentState } from './types';\n\n// Action Types\nexport const INIT_SEARCH_STATE = 'SEARCH/INIT_STATE';\nexport const CLEANUP_SEARCH_STATE = 'SEARCH/CLEANUP_STATE';\nexport const START_SEARCH_SESSION = 'SEARCH/START_SEARCH_SESSION';\nexport const STOP_SEARCH_SESSION = 'SEARCH/STOP_SEARCH_SESSION';\nexport const SET_SEARCH_FLAGS = 'SEARCH/SET_SEARCH_FLAGS';\nexport const SET_SHOW_ALL_RESULTS = 'SEARCH/SET_SHOW_ALL_RESULTS';\nexport const START_SEARCH = 'SEARCH/START_SEARCH';\nexport const SET_SEARCH_RESULTS = 'SEARCH/SET_SEARCH_RESULTS';\nexport const APPEND_SEARCH_RESULTS = 'SEARCH/APPEND_SEARCH_RESULTS';\nexport const SET_ACTIVE_RESULT_INDEX = 'SEARCH/SET_ACTIVE_RESULT_INDEX';\n\n// Action Interfaces\nexport interface InitSearchStateAction extends Action {\n type: typeof INIT_SEARCH_STATE;\n payload: { documentId: string; state: SearchDocumentState };\n}\n\nexport interface CleanupSearchStateAction extends Action {\n type: typeof CLEANUP_SEARCH_STATE;\n payload: string; // documentId\n}\n\nexport interface StartSearchSessionAction extends Action {\n type: typeof START_SEARCH_SESSION;\n payload: { documentId: string };\n}\n\nexport interface StopSearchSessionAction extends Action {\n type: typeof STOP_SEARCH_SESSION;\n payload: { documentId: string };\n}\n\nexport interface SetSearchFlagsAction extends Action {\n type: typeof SET_SEARCH_FLAGS;\n payload: { documentId: string; flags: MatchFlag[] };\n}\n\nexport interface SetShowAllResultsAction extends Action {\n type: typeof SET_SHOW_ALL_RESULTS;\n payload: { documentId: string; showAll: boolean };\n}\n\nexport interface StartSearchAction extends Action {\n type: typeof START_SEARCH;\n payload: { documentId: string; query: string };\n}\n\nexport interface SetSearchResultsAction extends Action {\n type: typeof SET_SEARCH_RESULTS;\n payload: {\n documentId: string;\n results: SearchResult[];\n total: number;\n activeResultIndex: number;\n };\n}\n\nexport interface AppendSearchResultsAction extends Action {\n type: typeof APPEND_SEARCH_RESULTS;\n payload: {\n documentId: string;\n results: SearchResult[];\n };\n}\n\nexport interface SetActiveResultIndexAction extends Action {\n type: typeof SET_ACTIVE_RESULT_INDEX;\n payload: { documentId: string; index: number };\n}\n\n// Union Type for All Actions\nexport type SearchAction =\n | InitSearchStateAction\n | CleanupSearchStateAction\n | StartSearchSessionAction\n | StopSearchSessionAction\n | SetSearchFlagsAction\n | SetShowAllResultsAction\n | StartSearchAction\n | SetSearchResultsAction\n | AppendSearchResultsAction\n | SetActiveResultIndexAction;\n\n// Action Creators\nexport function initSearchState(\n documentId: string,\n state: SearchDocumentState,\n): InitSearchStateAction {\n return { type: INIT_SEARCH_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupSearchState(documentId: string): CleanupSearchStateAction {\n return { type: CLEANUP_SEARCH_STATE, payload: documentId };\n}\n\nexport function startSearchSession(documentId: string): StartSearchSessionAction {\n return { type: START_SEARCH_SESSION, payload: { documentId } };\n}\n\nexport function stopSearchSession(documentId: string): StopSearchSessionAction {\n return { type: STOP_SEARCH_SESSION, payload: { documentId } };\n}\n\nexport function setSearchFlags(documentId: string, flags: MatchFlag[]): SetSearchFlagsAction {\n return { type: SET_SEARCH_FLAGS, payload: { documentId, flags } };\n}\n\nexport function setShowAllResults(documentId: string, showAll: boolean): SetShowAllResultsAction {\n return { type: SET_SHOW_ALL_RESULTS, payload: { documentId, showAll } };\n}\n\nexport function startSearch(documentId: string, query: string): StartSearchAction {\n return { type: START_SEARCH, payload: { documentId, query } };\n}\n\nexport function setSearchResults(\n documentId: string,\n results: SearchResult[],\n total: number,\n activeResultIndex: number,\n): SetSearchResultsAction {\n return { type: SET_SEARCH_RESULTS, payload: { documentId, results, total, activeResultIndex } };\n}\n\nexport function appendSearchResults(\n documentId: string,\n results: SearchResult[],\n): AppendSearchResultsAction {\n return { type: APPEND_SEARCH_RESULTS, payload: { documentId, results } };\n}\n\nexport function setActiveResultIndex(\n documentId: string,\n index: number,\n): SetActiveResultIndexAction {\n return { type: SET_ACTIVE_RESULT_INDEX, payload: { documentId, index } };\n}\n","import { Reducer } from '@embedpdf/core';\nimport { SearchDocumentState, SearchState } from './types';\nimport {\n START_SEARCH_SESSION,\n STOP_SEARCH_SESSION,\n SET_SEARCH_FLAGS,\n SET_SHOW_ALL_RESULTS,\n START_SEARCH,\n SET_SEARCH_RESULTS,\n APPEND_SEARCH_RESULTS,\n SET_ACTIVE_RESULT_INDEX,\n SearchAction,\n INIT_SEARCH_STATE,\n CLEANUP_SEARCH_STATE,\n} from './actions';\nimport { MatchFlag } from '@embedpdf/models';\n\nexport const initialSearchDocumentState: SearchDocumentState = {\n flags: [] as MatchFlag[],\n results: [],\n total: 0,\n activeResultIndex: -1,\n showAllResults: true,\n query: '',\n loading: false,\n active: false,\n};\n\nexport const initialState: SearchState = {\n documents: {},\n};\n\nconst updateDocState = (\n state: SearchState,\n documentId: string,\n newDocState: Partial<SearchDocumentState>,\n): SearchState => {\n const oldDocState = state.documents[documentId] || initialSearchDocumentState;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...oldDocState,\n ...newDocState,\n },\n },\n };\n};\n\nexport const searchReducer: Reducer<SearchState, SearchAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_SEARCH_STATE:\n return {\n ...state,\n documents: {\n ...state.documents,\n [action.payload.documentId]: action.payload.state,\n },\n };\n\n case CLEANUP_SEARCH_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remaining } = state.documents;\n return {\n ...state,\n documents: remaining,\n };\n }\n\n case START_SEARCH_SESSION:\n return updateDocState(state, action.payload.documentId, { active: true });\n\n case STOP_SEARCH_SESSION:\n return updateDocState(state, action.payload.documentId, {\n results: [],\n total: 0,\n activeResultIndex: -1,\n query: '',\n loading: false,\n active: false,\n });\n\n case SET_SEARCH_FLAGS:\n return updateDocState(state, action.payload.documentId, { flags: action.payload.flags });\n\n case SET_SHOW_ALL_RESULTS:\n return updateDocState(state, action.payload.documentId, {\n showAllResults: action.payload.showAll,\n });\n\n case START_SEARCH:\n return updateDocState(state, action.payload.documentId, {\n loading: true,\n query: action.payload.query,\n // clear old results on new search start\n results: [],\n total: 0,\n activeResultIndex: -1,\n });\n\n case APPEND_SEARCH_RESULTS: {\n const { documentId, results } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n const newResults = [...docState.results, ...results];\n const firstHitIndex =\n docState.activeResultIndex === -1 && newResults.length > 0 ? 0 : docState.activeResultIndex;\n return updateDocState(state, documentId, {\n results: newResults,\n total: newResults.length, // total-so-far\n activeResultIndex: firstHitIndex,\n // keep loading true until final SET_SEARCH_RESULTS\n loading: true,\n });\n }\n\n case SET_SEARCH_RESULTS: {\n const { documentId, results, total, activeResultIndex } = action.payload;\n return updateDocState(state, documentId, {\n results,\n total,\n activeResultIndex,\n loading: false,\n });\n }\n\n case SET_ACTIVE_RESULT_INDEX:\n return updateDocState(state, action.payload.documentId, {\n activeResultIndex: action.payload.index,\n });\n\n default:\n return state;\n }\n};\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport {\n MatchFlag,\n SearchAllPagesResult,\n PdfEngine,\n PdfTask,\n PdfPageSearchProgress,\n PdfTaskHelper,\n PdfErrorCode,\n} from '@embedpdf/models';\nimport {\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchResultState,\n SearchScope,\n SearchResultEvent,\n SearchStartEvent,\n SearchStopEvent,\n ActiveResultChangeEvent,\n SearchResultStateEvent,\n SearchStateEvent,\n SearchDocumentState,\n} from './types';\nimport {\n startSearchSession,\n stopSearchSession,\n setSearchFlags,\n setShowAllResults,\n startSearch,\n setSearchResults,\n setActiveResultIndex,\n appendSearchResults,\n SearchAction,\n initSearchState,\n cleanupSearchState,\n} from './actions';\nimport { initialSearchDocumentState } from './reducer';\n\nexport class SearchPlugin extends BasePlugin<\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchAction\n> {\n static readonly id = 'search' as const;\n\n // Event emitters are now global and include documentId\n private readonly searchStop$ = createBehaviorEmitter<SearchStopEvent>();\n private readonly searchStart$ = createBehaviorEmitter<SearchStartEvent>();\n private readonly searchResult$ = createBehaviorEmitter<SearchResultEvent>();\n private readonly searchActiveResultChange$ = createBehaviorEmitter<ActiveResultChangeEvent>();\n private readonly searchResultState$ = createBehaviorEmitter<SearchResultStateEvent>();\n private readonly searchState$ = createBehaviorEmitter<SearchStateEvent>();\n\n // Keep reference to current running tasks per document\n private currentTask = new Map<string, ReturnType<PdfEngine['searchAllPages']>>();\n private pluginConfig: SearchPluginConfig;\n\n constructor(id: string, registry: PluginRegistry, config: SearchPluginConfig) {\n super(id, registry);\n this.pluginConfig = config;\n // We no longer need to listen to the loader.\n // Document lifecycle is handled by BasePlugin hooks.\n }\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n const initialState = {\n ...initialSearchDocumentState,\n flags: this.pluginConfig.flags || [],\n showAllResults: this.pluginConfig.showAllResults ?? true,\n };\n this.dispatch(initSearchState(documentId, initialState));\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.stopSearchSession(documentId); // Ensure any running search is stopped\n this.dispatch(cleanupSearchState(documentId));\n this.currentTask.delete(documentId);\n }\n\n async initialize(): Promise<void> {\n // Config is now handled in onDocumentLoadingStarted\n }\n\n override onStoreUpdated(prevState: SearchState, newState: SearchState): void {\n for (const documentId in newState.documents) {\n const prevDocState = prevState.documents[documentId];\n const newDocState = newState.documents[documentId];\n\n if (prevDocState !== newDocState) {\n // Emit per-document state\n this.searchState$.emit({ documentId, state: newDocState });\n\n // Emit reactive result state\n if (\n !prevDocState ||\n prevDocState.results !== newDocState.results ||\n prevDocState.activeResultIndex !== newDocState.activeResultIndex ||\n prevDocState.showAllResults !== newDocState.showAllResults ||\n prevDocState.active !== newDocState.active\n ) {\n this.searchResultState$.emit({\n documentId,\n state: {\n results: newDocState.results,\n activeResultIndex: newDocState.activeResultIndex,\n showAllResults: newDocState.showAllResults,\n active: newDocState.active,\n },\n });\n }\n }\n }\n }\n\n protected buildCapability(): SearchCapability {\n const getDocId = (documentId?: string) => documentId ?? this.getActiveDocumentId();\n const getDocState = (docId?: string) => {\n const id = getDocId(docId);\n const state = this.state.documents[id];\n if (!state) throw new Error(`Search state not found for document ${id}`);\n return state;\n };\n\n return {\n startSearch: (docId) => this.startSearchSession(getDocId(docId)),\n stopSearch: (docId) => this.stopSearchSession(getDocId(docId)),\n searchAllPages: (keyword, docId) => this.searchAllPages(keyword, getDocId(docId)),\n nextResult: (docId) => this.nextResult(getDocId(docId)),\n previousResult: (docId) => this.previousResult(getDocId(docId)),\n goToResult: (index, docId) => this.goToResult(index, getDocId(docId)),\n setShowAllResults: (showAll, docId) =>\n this.dispatch(setShowAllResults(getDocId(docId), showAll)),\n getShowAllResults: (docId) => getDocState(docId).showAllResults,\n getFlags: (docId) => getDocState(docId).flags,\n setFlags: (flags, docId) => this.setFlags(flags, getDocId(docId)),\n getState: (docId) => getDocState(docId),\n forDocument: this.createSearchScope.bind(this),\n onSearchResult: this.searchResult$.on,\n onSearchStart: this.searchStart$.on,\n onSearchStop: this.searchStop$.on,\n onActiveResultChange: this.searchActiveResultChange$.on,\n onSearchResultStateChange: this.searchResultState$.on,\n onStateChange: this.searchState$.on,\n };\n }\n\n private createSearchScope(documentId: string): SearchScope {\n const getDocState = () => {\n const state = this.state.documents[documentId];\n if (!state) throw new Error(`Search state not found for document ${documentId}`);\n return state;\n };\n\n return {\n startSearch: () => this.startSearchSession(documentId),\n stopSearch: () => this.stopSearchSession(documentId),\n searchAllPages: (keyword) => this.searchAllPages(keyword, documentId),\n nextResult: () => this.nextResult(documentId),\n previousResult: () => this.previousResult(documentId),\n goToResult: (index) => this.goToResult(index, documentId),\n setShowAllResults: (showAll) => this.dispatch(setShowAllResults(documentId, showAll)),\n getShowAllResults: () => getDocState().showAllResults,\n getFlags: () => getDocState().flags,\n setFlags: (flags) => this.setFlags(flags, documentId),\n getState: getDocState,\n onSearchResult: (listener: Listener<SearchAllPagesResult>) =>\n this.searchResult$.on((event) => {\n if (event.documentId === documentId) listener(event.results);\n }),\n onSearchStart: (listener: Listener<void>) =>\n this.searchStart$.on((event) => {\n if (event.documentId === documentId) listener();\n }),\n onSearchStop: (listener: Listener<void>) =>\n this.searchStop$.on((event) => {\n if (event.documentId === documentId) listener();\n }),\n onActiveResultChange: (listener: Listener<number>) =>\n this.searchActiveResultChange$.on((event) => {\n if (event.documentId === documentId) listener(event.index);\n }),\n onSearchResultStateChange: (listener: Listener<SearchResultState>) =>\n this.searchResultState$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n onStateChange: (listener: Listener<SearchDocumentState>) =>\n this.searchState$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n private setFlags(flags: MatchFlag[], documentId: string): void {\n this.dispatch(setSearchFlags(documentId, flags));\n const docState = this.state.documents[documentId];\n if (docState?.active) {\n this.searchAllPages(docState.query, documentId, true);\n }\n }\n\n private notifySearchStart(documentId: string): void {\n this.searchStart$.emit({ documentId });\n }\n\n private notifySearchStop(documentId: string): void {\n this.searchStop$.emit({ documentId });\n }\n\n private notifyActiveResultChange(documentId: string, index: number): void {\n this.searchActiveResultChange$.emit({ documentId, index });\n }\n\n private startSearchSession(documentId: string): void {\n const coreDoc = this.getCoreDocument(documentId);\n if (!coreDoc) return;\n this.dispatch(startSearchSession(documentId));\n this.notifySearchStart(documentId);\n }\n\n private stopSearchSession(documentId: string): void {\n const docState = this.state.documents[documentId];\n if (!docState?.active) return;\n\n const task = this.currentTask.get(documentId);\n if (task) {\n try {\n task.abort?.({ code: PdfErrorCode.Cancelled, message: 'search stopped' });\n } catch {}\n this.currentTask.delete(documentId);\n }\n\n this.dispatch(stopSearchSession(documentId));\n this.notifySearchStop(documentId);\n }\n\n private searchAllPages(\n keyword: string,\n documentId: string,\n force: boolean = false,\n ): PdfTask<SearchAllPagesResult, PdfPageSearchProgress> {\n const docState = this.state.documents[documentId];\n if (!docState) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'Search state not initialized',\n });\n }\n const coreDoc = this.getCoreDocument(documentId);\n if (!coreDoc?.document) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not loaded' });\n }\n\n const trimmedKeyword = keyword.trim();\n\n if (docState.query === trimmedKeyword && !force) {\n return PdfTaskHelper.resolve<SearchAllPagesResult, PdfPageSearchProgress>({\n results: docState.results,\n total: docState.total,\n });\n }\n\n // stop previous task if still running\n const oldTask = this.currentTask.get(documentId);\n if (oldTask) {\n try {\n oldTask.abort?.({ code: PdfErrorCode.Cancelled, message: 'new search' });\n } catch {}\n this.currentTask.delete(documentId);\n }\n\n this.dispatch(startSearch(documentId, trimmedKeyword));\n\n if (!trimmedKeyword) {\n this.dispatch(setSearchResults(documentId, [], 0, -1));\n return PdfTaskHelper.resolve<SearchAllPagesResult, PdfPageSearchProgress>({\n results: [],\n total: 0,\n });\n }\n\n if (!docState.active) {\n this.startSearchSession(documentId);\n }\n\n const task = this.engine.searchAllPages(coreDoc.document, trimmedKeyword, {\n flags: docState.flags,\n });\n this.currentTask.set(documentId, task);\n\n task.onProgress((p) => {\n if (p?.results?.length) {\n // Check if the task is still the current one before dispatching\n if (this.currentTask.get(documentId) === task) {\n this.dispatch(appendSearchResults(documentId, p.results));\n // set first active result as soon as we have something\n if (this.state.documents[documentId].activeResultIndex === -1) {\n this.dispatch(setActiveResultIndex(documentId, 0));\n this.notifyActiveResultChange(documentId, 0);\n }\n }\n }\n });\n\n task.wait(\n (results) => {\n this.currentTask.delete(documentId);\n const activeResultIndex = results.total > 0 ? 0 : -1;\n this.dispatch(\n setSearchResults(documentId, results.results, results.total, activeResultIndex),\n );\n this.searchResult$.emit({ documentId, results });\n if (results.total > 0) {\n this.notifyActiveResultChange(documentId, 0);\n }\n },\n (error) => {\n // Only clear results if the error wasn't an abort\n if (error?.reason?.code !== PdfErrorCode.Cancelled) {\n console.error('Error during search:', error);\n this.dispatch(setSearchResults(documentId, [], 0, -1));\n }\n this.currentTask.delete(documentId);\n },\n );\n\n return task;\n }\n\n private nextResult(documentId: string): number {\n const docState = this.state.documents[documentId];\n if (!docState || docState.results.length === 0) return -1;\n const nextIndex =\n docState.activeResultIndex >= docState.results.length - 1\n ? 0\n : docState.activeResultIndex + 1;\n return this.goToResult(nextIndex, documentId);\n }\n\n private previousResult(documentId: string): number {\n const docState = this.state.documents[documentId];\n if (!docState || docState.results.length === 0) return -1;\n const prevIndex =\n docState.activeResultIndex <= 0\n ? docState.results.length - 1\n : docState.activeResultIndex - 1;\n return this.goToResult(prevIndex, documentId);\n }\n\n private goToResult(index: number, documentId: string): number {\n const docState = this.state.documents[documentId];\n if (\n !docState ||\n docState.results.length === 0 ||\n index < 0 ||\n index >= docState.results.length\n ) {\n return -1;\n }\n this.dispatch(setActiveResultIndex(documentId, index));\n this.notifyActiveResultChange(documentId, index);\n return index;\n }\n\n async destroy(): Promise<void> {\n for (const documentId of Object.keys(this.state.documents)) {\n this.stopSearchSession(documentId);\n }\n this.searchResult$.clear();\n this.searchStart$.clear();\n this.searchStop$.clear();\n this.searchActiveResultChange$.clear();\n this.searchResultState$.clear();\n this.searchState$.clear();\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SearchPluginConfig } from './types';\n\nexport const SEARCH_PLUGIN_ID = 'search';\n\nexport const manifest: PluginManifest<SearchPluginConfig> = {\n id: SEARCH_PLUGIN_ID,\n name: 'Search Plugin',\n version: '1.0.0',\n provides: ['search'],\n requires: [],\n optional: [],\n defaultConfig: {\n flags: [],\n },\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SearchPlugin } from './search-plugin';\nimport { manifest, SEARCH_PLUGIN_ID } from './manifest';\nimport { SearchPluginConfig, SearchState } from './types';\nimport { searchReducer, initialState, initialSearchDocumentState } from './reducer';\nimport { SearchAction } from './actions';\n\nexport const SearchPluginPackage: PluginPackage<\n SearchPlugin,\n SearchPluginConfig,\n SearchState,\n SearchAction\n> = {\n manifest,\n create: (registry, config) => new SearchPlugin(SEARCH_PLUGIN_ID, registry, config),\n reducer: searchReducer,\n initialState,\n};\n\nexport * from './search-plugin';\nexport * from './types';\nexport * from './manifest';\nexport { initialState, initialSearchDocumentState };\n"],"names":["initialState","_a"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/plugin-search",
3
- "version": "2.0.0-next.1",
3
+ "version": "2.0.0-next.3",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.cjs",
@@ -34,13 +34,13 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "@embedpdf/models": "2.0.0-next.1"
37
+ "@embedpdf/models": "2.0.0-next.3"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/react": "^18.2.0",
41
41
  "typescript": "^5.0.0",
42
42
  "@embedpdf/build": "1.1.0",
43
- "@embedpdf/core": "2.0.0-next.1"
43
+ "@embedpdf/core": "2.0.0-next.3"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "react": ">=16.8.0",
@@ -48,7 +48,7 @@
48
48
  "preact": "^10.26.4",
49
49
  "vue": ">=3.2.0",
50
50
  "svelte": ">=5 <6",
51
- "@embedpdf/core": "2.0.0-next.1"
51
+ "@embedpdf/core": "2.0.0-next.3"
52
52
  },
53
53
  "files": [
54
54
  "dist",