@prose-reader/react-native 1.324.0 → 1.326.0

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.
@@ -1,5 +1,5 @@
1
1
  import { Archive } from '@prose-reader/archive-reader';
2
- import { Directory } from 'expo-file-system/next';
2
+ import { Directory } from 'expo-file-system';
3
3
  export declare const createArchiveFromExpoFileSystemNext: (directory: Directory, { orderByAlpha, name }?: {
4
4
  orderByAlpha?: boolean;
5
5
  name?: string;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../shared-C6TEX07M.cjs");let t=require("react"),n=require("@prose-reader/archive-reader"),r=require("@prose-reader/shared"),i=require("expo-file-system/next"),a=require("@prose-reader/streamer"),o=require("react/jsx-runtime"),s=require("@webview-bridge/react-native");var c=async(e,{orderByAlpha:t,name:a}={})=>{let o=e.list();t&&(o=o.slice().sort((e,t)=>(0,r.sortByTitleComparator)(e.name,t.name)));let s=e=>e.list().reduce((e,t)=>t instanceof i.Directory?[...e,...s(t)]:[...e,t],[]);return(0,n.createArchive)({filename:a,records:o.reduce((e,t)=>t instanceof i.Directory?[...e,...s(t)]:[...e,t],[]).map(e=>e instanceof i.Directory?{dir:!0,basename:(0,r.getUriBasename)(e.name),uri:e.uri.replace(`file://`,``)}:{dir:!1,basename:(0,r.getUriBasename)(e.name),uri:e.uri.replace(`file://`,``),size:e.info().size??0,encodingFormat:e.type??void 0,...(0,n.blobFileAccessors)(async()=>new Blob([await e.arrayBuffer()]))}),close:()=>Promise.resolve()})},l=class extends a.Streamer{async fetchResourceAsData({key:e,resourcePath:t}){let n=await super.fetchResource({key:e,resourcePath:t});return{data:await n.text(),headers:Object.fromEntries(n.headers.entries())}}},u=(0,t.createContext)(void 0),d=()=>{let e=(0,t.useContext)(u);if(!e)throw Error(`useProseReader must be used within a ProseReaderProvider`);return e},f=({children:e,reader:t})=>(0,o.jsx)(u.Provider,{value:t,children:e}),p=n=>{let r=e.t(n),[i]=(0,t.useState)(()=>(0,s.bridge)(({set:e})=>({pagination:void 0,setPagination:async t=>{e({pagination:t})},context:void 0,setContext:async t=>{e({context:t})},async getResource(e){return r.current.getResource(e)}})));return i},m=(0,s.postMessageSchema)({load:{validate:e=>e},turnRight:{validate:()=>{}},turnLeft:{validate:()=>{}}}),h=e=>{let[n,r]=(0,t.useState)(void 0),i=p(e),a=n?.postMessage;(0,t.useEffect)(()=>{i&&r((0,s.createWebView)({bridge:i,debug:!0,postMessageSchema:m}))},[i]);let o=(0,t.useCallback)(e=>{a?.(`load`,{manifest:e})},[a]);return n?{webviewBridge:n,ReaderWebView:n.WebView,appBridge:i,load:o}:null},g=()=>{let{webviewBridge:e}=d(),{postMessage:t}=e;return{turnRight:()=>{t(`turnRight`,void 0)},turnLeft:()=>{t(`turnLeft`,void 0)}}},_=e=>{let{appBridge:t}=d();return(0,s.useBridge)(t,e)};exports.ReactNativeStreamer=l,exports.ReaderProvider=f,exports.createArchiveFromExpoFileSystemNext=c,exports.useCreateReader=h,exports.useLiveRef=e.t,exports.useReader=g,exports.useReaderState=_;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../shared-C6TEX07M.cjs");let t=require("react"),n=require("@prose-reader/archive-reader"),r=require("@prose-reader/shared"),i=require("expo-file-system"),a=require("@prose-reader/streamer"),o=require("react/jsx-runtime"),s=require("@webview-bridge/react-native");var c=async(e,{orderByAlpha:t,name:a}={})=>{let o=e.list();t&&(o=o.slice().sort((e,t)=>(0,r.sortByTitleComparator)(e.name,t.name)));let s=e=>e.list().reduce((e,t)=>t instanceof i.Directory?[...e,...s(t)]:[...e,t],[]);return(0,n.createArchive)({filename:a,records:o.reduce((e,t)=>t instanceof i.Directory?[...e,...s(t)]:[...e,t],[]).map(e=>e instanceof i.Directory?{dir:!0,basename:(0,r.getUriBasename)(e.name),uri:e.uri.replace(`file://`,``)}:{dir:!1,basename:(0,r.getUriBasename)(e.name),uri:e.uri.replace(`file://`,``),size:e.info().size??0,encodingFormat:e.type??void 0,...(0,n.blobFileAccessors)(async()=>new Blob([await e.arrayBuffer()]))}),close:()=>Promise.resolve()})},l=class extends a.Streamer{async fetchResourceAsData({key:e,resourcePath:t}){let n=await super.fetchResource({key:e,resourcePath:t});return{data:await n.text(),headers:Object.fromEntries(n.headers.entries())}}},u=(0,t.createContext)(void 0),d=()=>{let e=(0,t.useContext)(u);if(!e)throw Error(`useProseReader must be used within a ProseReaderProvider`);return e},f=({children:e,reader:t})=>(0,o.jsx)(u.Provider,{value:t,children:e}),p=n=>{let r=e.t(n),[i]=(0,t.useState)(()=>(0,s.bridge)(({set:e})=>({pagination:void 0,setPagination:async t=>{e({pagination:t})},context:void 0,setContext:async t=>{e({context:t})},async getResource(e){return r.current.getResource(e)}})));return i},m=(0,s.postMessageSchema)({load:{validate:e=>e},turnRight:{validate:()=>{}},turnLeft:{validate:()=>{}}}),h=e=>{let[n,r]=(0,t.useState)(void 0),i=p(e),a=n?.postMessage;(0,t.useEffect)(()=>{i&&r((0,s.createWebView)({bridge:i,debug:!0,postMessageSchema:m}))},[i]);let o=(0,t.useCallback)(e=>{a?.(`load`,{manifest:e})},[a]);return n?{webviewBridge:n,ReaderWebView:n.WebView,appBridge:i,load:o}:null},g=()=>{let{webviewBridge:e}=d(),{postMessage:t}=e;return{turnRight:()=>{t(`turnRight`,void 0)},turnLeft:()=>{t(`turnLeft`,void 0)}}},_=e=>{let{appBridge:t}=d();return(0,s.useBridge)(t,e)};exports.ReactNativeStreamer=l,exports.ReaderProvider=f,exports.createArchiveFromExpoFileSystemNext=c,exports.useCreateReader=h,exports.useLiveRef=e.t,exports.useReader=g,exports.useReaderState=_;
@@ -2,7 +2,7 @@ import { t as e } from "../shared-iVT9o4xR.js";
2
2
  import { createContext as t, useCallback as n, useContext as r, useEffect as i, useState as a } from "react";
3
3
  import { blobFileAccessors as o, createArchive as s } from "@prose-reader/archive-reader";
4
4
  import { getUriBasename as c, sortByTitleComparator as l } from "@prose-reader/shared";
5
- import { Directory as u } from "expo-file-system/next";
5
+ import { Directory as u } from "expo-file-system";
6
6
  import { Streamer as d } from "@prose-reader/streamer";
7
7
  import { jsx as f } from "react/jsx-runtime";
8
8
  import { bridge as p, createWebView as m, postMessageSchema as h, useBridge as g } from "@webview-bridge/react-native";
@@ -2,7 +2,7 @@ import { ContextState, createReader, EnhancerPaginationInto, Manifest } from '@p
2
2
  import { Bridge, BridgeStore } from '@webview-bridge/react-native';
3
3
  type ReaderOptions = Parameters<typeof createReader>[0];
4
4
  type RnPaginationState = Omit<EnhancerPaginationInto, "navigationId">;
5
- type RnContextState = Omit<ContextState, "containerElement" | "rootElement">;
5
+ type RnContextState = Omit<ContextState, "rootElement">;
6
6
  export interface BridgeState extends Bridge {
7
7
  pagination: RnPaginationState | undefined;
8
8
  setPagination: (pagination: RnPaginationState) => Promise<void>;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@webview-bridge/web");var t=()=>(0,e.linkBridge)({onReady:async()=>{}}),n=({bridge:e,reader:t,containerElement:n})=>(e.addEventListener(`load`,e=>{t.load({containerElement:n,manifest:e.manifest})}),e.addEventListener(`turnRight`,()=>{t.navigation.turnRight()}),e.addEventListener(`turnLeft`,()=>{t.navigation.turnLeft()}),t.pagination.state$.subscribe(t=>{e.setPagination(t)}),t.context.subscribe(({rootElement:t,...n})=>{e.setContext(n)}),t);exports.bridgeReader=n,exports.createReaderBridge=t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@webview-bridge/web");var t=()=>(0,e.linkBridge)({onReady:async()=>{}}),n=({bridge:e,createReader:t,containerElement:n})=>{let r;return e.addEventListener(`load`,i=>{r?.destroy();let a=t(i.manifest);r=a,a.pagination.state$.subscribe(t=>{e.setPagination(t)}),a.context.subscribe(({rootElement:t,...n})=>{e.setContext(n)}),a.mount(n)}),e.addEventListener(`turnRight`,()=>{r?.navigation.turnRight()}),e.addEventListener(`turnLeft`,()=>{r?.navigation.turnLeft()}),{getReader:()=>r}};exports.bridgeReader=n,exports.createReaderBridge=t;
@@ -1,10 +1,166 @@
1
- import { createReader as createReaderCore } from '@prose-reader/core';
1
+ import { createReader as createReaderCore, Manifest } from '@prose-reader/core';
2
2
  import { ProseBridgeStore, ProsePostMessageSchema } from '../shared';
3
3
  type Reader = ReturnType<typeof createReaderCore>;
4
4
  export declare const createReaderBridge: () => import('@webview-bridge/web').LinkBridge<import('@webview-bridge/types').ExcludePrimitive<import('../shared').BridgeMethods & import('../shared').BridgeState>, Omit<ProseBridgeStore, "setState">, ProsePostMessageSchema>;
5
- export declare const bridgeReader: ({ bridge, reader, containerElement, }: {
6
- reader: Reader;
5
+ export declare const bridgeReader: ({ bridge, createReader, containerElement, }: {
6
+ /**
7
+ * Factory invoked for every `load` event coming from the native side.
8
+ * A reader renders a single book: a subsequent `load` destroys the
9
+ * previous reader and creates a fresh one from the new manifest.
10
+ */
11
+ createReader: (manifest: Manifest) => Reader;
7
12
  bridge: ReturnType<typeof createReaderBridge>;
8
13
  containerElement: HTMLElement;
9
- }) => Reader;
14
+ }) => {
15
+ getReader: () => (Omit<Omit<Omit<{
16
+ id: `${string}-${string}-${string}-${string}-${string}`;
17
+ context: import('@prose-reader/core').Context;
18
+ spine: import('@prose-reader/core').Spine;
19
+ hookManager: import('@prose-reader/core').HookManager<import('@prose-reader/core').CoreHook>;
20
+ cfi: import('@prose-reader/core').CfiManager;
21
+ navigation: {
22
+ destroy: () => void;
23
+ getNavigation: () => import('@prose-reader/core').InternalNavigationEntry;
24
+ internalNavigator: import('@prose-reader/core').InternalNavigator;
25
+ scrollNavigationController: import('@prose-reader/core').ScrollNavigationController;
26
+ controlledNavigationController: import('@prose-reader/core').ControlledNavigationController;
27
+ navigationState$: import('rxjs').Observable<"free" | "busy">;
28
+ navigate: (to: import('@prose-reader/core').UserNavigationEntry) => void;
29
+ lock: () => () => void;
30
+ isLocked$: import('rxjs').Observable<boolean>;
31
+ navigationResolver: {
32
+ getNavigationForUrl: (url: string | URL) => {
33
+ position: import('@prose-reader/core').SpinePosition;
34
+ spineItemId: string;
35
+ } | undefined;
36
+ getNavigationForSpineItemPage: (params: Omit<Parameters<getNavigationForSpineItemPage>[0], "spineItemsManager" | "spineItemNavigationResolver" | "spineLocator" | "viewport">) => import('@prose-reader/core').SpinePosition;
37
+ getNavigationFromSpineItemPosition: (params: {
38
+ spineItemPosition: import('@prose-reader/core').SpineItemPosition;
39
+ spineItem: import('@prose-reader/core').SpineItem;
40
+ }) => import('@prose-reader/core').SpinePosition;
41
+ getNavigationForCfi: (cfi: string) => import('@prose-reader/core').SpinePosition | undefined;
42
+ getNavigationForLastPage: (spineItem: import('@prose-reader/core').SpineItem) => import('@prose-reader/core').SpinePosition;
43
+ getNavigationForSpineIndexOrId: (indexOrId: number | string | import('@prose-reader/core').SpineItem) => import('@prose-reader/core').SpinePosition;
44
+ getNavigationForPosition: (viewportPosition: import('@prose-reader/core').SpinePosition | import('@prose-reader/core').UnboundSpinePosition) => import('@prose-reader/core').SpinePosition;
45
+ getMostPredominantNavigationForPosition: (viewportPosition: import('@prose-reader/core').SpinePosition) => import('@prose-reader/core').SpinePosition;
46
+ clampPositionInSpine: (position: import('@prose-reader/core').SpinePosition | import('@prose-reader/core').UnboundSpinePosition, size: import('@prose-reader/core').NavigationVisibleArea) => import('@prose-reader/core').UnboundSpinePosition;
47
+ getBoundaryForPosition: (position: import('@prose-reader/core').SpinePosition | import('@prose-reader/core').UnboundSpinePosition, size?: import('@prose-reader/core').NavigationVisibleArea) => import('@prose-reader/core').SpineBoundary | undefined;
48
+ isNavigationGoingForwardFrom: (to: import('@prose-reader/core').SpinePosition, from: import('@prose-reader/core').SpinePosition) => boolean;
49
+ arePositionsDifferent: (a: {
50
+ x: number;
51
+ y: number;
52
+ }, b: {
53
+ x: number;
54
+ y: number;
55
+ }) => boolean;
56
+ getAdjustedPositionForSpread: (position: import('@prose-reader/core').SpinePosition | import('@prose-reader/core').UnboundSpinePosition) => import('@prose-reader/core').SpinePosition | import('@prose-reader/core').UnboundSpinePosition;
57
+ spineItemNavigator: {
58
+ getNavigationForLastPage: (spineItem: import('@prose-reader/core').SpineItem) => import('@prose-reader/core').SpineItemPosition;
59
+ getNavigationForPosition: (spineItem: import('@prose-reader/core').SpineItem, position: import('@prose-reader/core').SpineItemPosition) => import('@prose-reader/core').SpineItemPosition;
60
+ getNavigationFromNode: (spineItem: import('@prose-reader/core').SpineItem, node: Node, offset: number) => import('@prose-reader/core').SpineItemPosition;
61
+ };
62
+ };
63
+ navigation$: import('rxjs').Observable<Pick<import('@prose-reader/core').InternalNavigationEntry, "id" | "position" | "requestedPosition" | "requestedVisibleArea"> & {
64
+ triggeredBy: import('@prose-reader/core').InternalNavigationEntry["meta"]["triggeredBy"];
65
+ }>;
66
+ position$: import('rxjs').Observable<import('@prose-reader/core').SpinePosition | import('@prose-reader/core').UnboundSpinePosition>;
67
+ };
68
+ spineItemsObserver: import('@prose-reader/core').SpineItemsObserver;
69
+ spineItemsManager: import('@prose-reader/core').SpineItemsManager;
70
+ layout: (options?: {
71
+ immediate?: boolean;
72
+ }) => void;
73
+ mount: (containerElement: HTMLElement) => void;
74
+ destroy: () => void;
75
+ pagination: {
76
+ readonly state: import('@prose-reader/core').PaginationInfo;
77
+ readonly state$: import('rxjs').Observable<import('rxjs').ObservedValueOf<import('@prose-reader/core').Pagination>>;
78
+ };
79
+ settings: import('@prose-reader/core').SettingsInterface<NonNullable<import('@prose-reader/core').CoreInputSettings>, NonNullable<import('@prose-reader/core').CoreOutputSettings | undefined>>;
80
+ renderHeadless: (spineItem: import('@prose-reader/core').SpineItemReference) => import('rxjs').Observable<{
81
+ doc: Document;
82
+ release: () => void;
83
+ } | undefined>;
84
+ viewport: import('@prose-reader/core').Viewport;
85
+ viewportState$: import('rxjs').Observable<"free" | "busy">;
86
+ viewportFree$: import('rxjs').Observable<"free">;
87
+ mounted$: import('rxjs').Observable<boolean>;
88
+ features: import('@prose-reader/core').Features;
89
+ $: {
90
+ destroy$: import('rxjs').Subject<void>;
91
+ };
92
+ } & {
93
+ theme: import('@prose-reader/core').ThemeEnhancerOutput;
94
+ }, "settings"> & import('@prose-reader/core').LayoutEnhancerOutput & {
95
+ settings: import('@prose-reader/core').SettingsInterface<import('@prose-reader/core').CoreInputSettings & import('@prose-reader/core').EnhancerLayoutInputSettings, import('@prose-reader/core').EnhancerLayoutInputSettings & import('@prose-reader/core').CoreInputSettings & import('@prose-reader/core').ComputedCoreSettings>;
96
+ }, "pagination"> & {
97
+ pagination: Omit<{
98
+ readonly state: import('@prose-reader/core').PaginationInfo;
99
+ readonly state$: import('rxjs').Observable<import('rxjs').ObservedValueOf<import('@prose-reader/core').Pagination>>;
100
+ }, "state" | "state$"> & {
101
+ state$: import('rxjs').Observable<import('@prose-reader/core').PaginationInfo & import('@prose-reader/core').ExtraPaginationInfo>;
102
+ state: import('@prose-reader/core').PaginationInfo & import('@prose-reader/core').ExtraPaginationInfo;
103
+ };
104
+ locateResource: import('@prose-reader/core').ResourcesLocator["locateResource"];
105
+ } & {
106
+ links$: import('rxjs').Observable<MouseEvent>;
107
+ } & import('@prose-reader/core').NavigationEnhancerOutput & import('@prose-reader/core').ZoomEnhancerOutput & {
108
+ utils: {
109
+ isOrIsWithinValidLink: (target: Event[`target`]) => boolean;
110
+ injectScopedCSS: (doc: Document, scope: string, styleTemplate: string) => () => void;
111
+ };
112
+ }, "settings"> & {
113
+ settings: import('@prose-reader/core').SettingsInterface<import('@prose-reader/core').CoreInputSettings & import('@prose-reader/core').EnhancerLayoutInputSettings & import('@prose-reader/core').EnhancerFontsInputSettings, import('@prose-reader/core').EnhancerFontsInputSettings & import('@prose-reader/core').EnhancerLayoutInputSettings & import('@prose-reader/core').CoreInputSettings & import('@prose-reader/core').ComputedCoreSettings>;
114
+ } & {
115
+ selection: {
116
+ selection$: import('rxjs').Observable<{
117
+ itemIndex: number;
118
+ type: "change";
119
+ selection: Selection;
120
+ } | {
121
+ itemIndex: number;
122
+ type: "over";
123
+ event: Event;
124
+ selection: Selection;
125
+ } | undefined>;
126
+ selectionStart$: import('rxjs').Observable<boolean>;
127
+ selectionEnd$: import('rxjs').Observable<void>;
128
+ selectionOver$: import('rxjs').Observable<{
129
+ itemIndex: number;
130
+ type: "over";
131
+ event: Event;
132
+ selection: Selection;
133
+ }>;
134
+ lastSelectionOnPointerdown$: import('rxjs').Observable<{
135
+ itemIndex: number;
136
+ type: "change";
137
+ selection: Selection;
138
+ } | {
139
+ itemIndex: number;
140
+ type: "over";
141
+ event: Event;
142
+ selection: Selection;
143
+ } | undefined>;
144
+ getSelection: () => {
145
+ itemIndex: number;
146
+ type: "change";
147
+ selection: Selection;
148
+ } | {
149
+ itemIndex: number;
150
+ type: "over";
151
+ event: Event;
152
+ selection: Selection;
153
+ } | undefined;
154
+ createOrderedRangeFromSelection: (params: {
155
+ selection: {
156
+ anchorNode?: Node | null;
157
+ anchorOffset?: number;
158
+ focusNode?: Node | null;
159
+ focusOffset?: number;
160
+ };
161
+ spineItem: import('@prose-reader/core').SpineItem;
162
+ }) => Range | undefined;
163
+ };
164
+ }) | undefined;
165
+ };
10
166
  export {};
package/dist/web/index.js CHANGED
@@ -1,18 +1,20 @@
1
1
  import { linkBridge as e } from "@webview-bridge/web";
2
2
  //#region src/web/index.ts
3
- var t = () => e({ onReady: async () => {} }), n = ({ bridge: e, reader: t, containerElement: n }) => (e.addEventListener("load", (e) => {
4
- t.load({
5
- containerElement: n,
6
- manifest: e.manifest
7
- });
8
- }), e.addEventListener("turnRight", () => {
9
- t.navigation.turnRight();
10
- }), e.addEventListener("turnLeft", () => {
11
- t.navigation.turnLeft();
12
- }), t.pagination.state$.subscribe((t) => {
13
- e.setPagination(t);
14
- }), t.context.subscribe(({ rootElement: t, ...n }) => {
15
- e.setContext(n);
16
- }), t);
3
+ var t = () => e({ onReady: async () => {} }), n = ({ bridge: e, createReader: t, containerElement: n }) => {
4
+ let r;
5
+ return e.addEventListener("load", (i) => {
6
+ r?.destroy();
7
+ let a = t(i.manifest);
8
+ r = a, a.pagination.state$.subscribe((t) => {
9
+ e.setPagination(t);
10
+ }), a.context.subscribe(({ rootElement: t, ...n }) => {
11
+ e.setContext(n);
12
+ }), a.mount(n);
13
+ }), e.addEventListener("turnRight", () => {
14
+ r?.navigation.turnRight();
15
+ }), e.addEventListener("turnLeft", () => {
16
+ r?.navigation.turnLeft();
17
+ }), { getReader: () => r };
18
+ };
17
19
  //#endregion
18
20
  export { n as bridgeReader, t as createReaderBridge };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/react-native",
3
- "version": "1.324.0",
3
+ "version": "1.326.0",
4
4
  "type": "module",
5
5
  "main": "./dist/native/index.cjs",
6
6
  "module": "./dist/native/index.js",
@@ -26,6 +26,7 @@
26
26
  "scripts": {
27
27
  "start": "vite build --watch --mode development",
28
28
  "build": "vite build",
29
+ "tsc": "tsc --noEmit -p tsconfig.rn.json && tsc --noEmit -p tsconfig.web.json",
29
30
  "test": "vitest run --coverage"
30
31
  },
31
32
  "devDependencies": {
@@ -42,5 +43,5 @@
42
43
  "react": "19.x",
43
44
  "rxjs": "*"
44
45
  },
45
- "gitHead": "70a490808c1db75819d239ccc6ef7933a1156a4f"
46
+ "gitHead": "abf0d33ae33aa1e008536f5c674e57a7e7ab84da"
46
47
  }