@glassly/crust 0.1.0-dev.1

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.
Files changed (67) hide show
  1. package/README.md +41 -0
  2. package/android/build.gradle +146 -0
  3. package/android/src/internal/AndroidManifest.xml +9 -0
  4. package/android/src/internal/java/com/glassly/crust/receivers/CaptionsTesterIncidentReceiver.kt +46 -0
  5. package/android/src/main/AndroidManifest.xml +33 -0
  6. package/android/src/main/java/com/glassly/crust/CrustModule.kt +1074 -0
  7. package/android/src/main/java/com/glassly/crust/CrustView.kt +30 -0
  8. package/android/src/main/java/com/glassly/crust/heading/HeadingManager.kt +150 -0
  9. package/android/src/main/java/com/glassly/crust/jsc/JSCDispatcher.kt +189 -0
  10. package/android/src/main/java/com/glassly/crust/jsc/JSCPolyfillBridge.kt +287 -0
  11. package/android/src/main/java/com/glassly/crust/jsc/JSCRuntime.kt +593 -0
  12. package/android/src/main/java/com/glassly/crust/navigation/NavigationManager.kt +1466 -0
  13. package/android/src/main/java/com/glassly/crust/services/NotificationListener.kt +502 -0
  14. package/android/src/main/java/com/glassly/crust/services/NotificationProcessBridge.kt +222 -0
  15. package/android/src/main/java/com/glassly/crust/utils/ImageProcessor.java +452 -0
  16. package/android/src/main/java/com/glassly/crust/utils/VideoStabilizer.kt +556 -0
  17. package/android/src/main/res/values/strings.xml +3 -0
  18. package/app.plugin.js +3 -0
  19. package/build/Crust.types.d.ts +153 -0
  20. package/build/Crust.types.d.ts.map +1 -0
  21. package/build/Crust.types.js +2 -0
  22. package/build/Crust.types.js.map +1 -0
  23. package/build/CrustModule.d.ts +186 -0
  24. package/build/CrustModule.d.ts.map +1 -0
  25. package/build/CrustModule.js +4 -0
  26. package/build/CrustModule.js.map +1 -0
  27. package/build/CrustModule.web.d.ts +39 -0
  28. package/build/CrustModule.web.d.ts.map +1 -0
  29. package/build/CrustModule.web.js +69 -0
  30. package/build/CrustModule.web.js.map +1 -0
  31. package/build/CrustView.d.ts +4 -0
  32. package/build/CrustView.d.ts.map +1 -0
  33. package/build/CrustView.js +8 -0
  34. package/build/CrustView.js.map +1 -0
  35. package/build/CrustView.web.d.ts +3 -0
  36. package/build/CrustView.web.d.ts.map +1 -0
  37. package/build/CrustView.web.js +5 -0
  38. package/build/CrustView.web.js.map +1 -0
  39. package/build/index.d.ts +4 -0
  40. package/build/index.d.ts.map +1 -0
  41. package/build/index.js +6 -0
  42. package/build/index.js.map +1 -0
  43. package/expo-module.config.json +9 -0
  44. package/ios/Crust.podspec +65 -0
  45. package/ios/CrustModule.swift +784 -0
  46. package/ios/CrustView.swift +38 -0
  47. package/ios/Resources/startup.js +804 -0
  48. package/ios/Source/JSCDispatcher.swift +226 -0
  49. package/ios/Source/JSCPolyfillBridge.swift +378 -0
  50. package/ios/Source/JSCRuntime.swift +674 -0
  51. package/ios/Source/utils/ImageProcessor.swift +392 -0
  52. package/ios/Source/utils/SystemGestures.swift +53 -0
  53. package/ios/Source/utils/VideoStabilizer.swift +374 -0
  54. package/ios/heading/HeadingManager.swift +74 -0
  55. package/ios/navigation/NavPayloads.swift +62 -0
  56. package/ios/navigation/NavigationManager.swift +751 -0
  57. package/package.json +69 -0
  58. package/plugin/build/index.d.ts +21 -0
  59. package/plugin/build/index.js +25 -0
  60. package/plugin/build/withAndroid.d.ts +2 -0
  61. package/plugin/build/withAndroid.js +133 -0
  62. package/src/Crust.types.ts +162 -0
  63. package/src/CrustModule.ts +194 -0
  64. package/src/CrustModule.web.ts +72 -0
  65. package/src/CrustView.tsx +10 -0
  66. package/src/CrustView.web.tsx +9 -0
  67. package/src/index.ts +5 -0
@@ -0,0 +1,153 @@
1
+ import type { StyleProp, ViewStyle } from "react-native";
2
+ export type OnLoadEventPayload = {
3
+ url: string;
4
+ };
5
+ export type CrustModuleEvents = {
6
+ onChange: (params: ChangeEventPayload) => void;
7
+ onNavManeuver: (params: NavManeuverPayload) => void;
8
+ onNavRerouting: (params: Record<string, never>) => void;
9
+ onNavArrived: (params: Record<string, never>) => void;
10
+ onNavError: (params: NavErrorPayload) => void;
11
+ onNavLocation: (params: NavLocationPayload) => void;
12
+ onNavRoute: (params: NavRoutePayload) => void;
13
+ onNavOffRoute: (params: NavOffRoutePayload) => void;
14
+ onHeading: (params: HeadingPayload) => void;
15
+ };
16
+ export type NavOffRoutePayload = {
17
+ /** Approximate perpendicular distance in meters from the route. */
18
+ offRouteDistanceMeters: number;
19
+ };
20
+ export type HeadingPayload = {
21
+ /** Compass heading in degrees, 0 = north, 90 = east. */
22
+ degrees: number;
23
+ };
24
+ export type NavRoutePayload = {
25
+ points: Array<{
26
+ lat: number;
27
+ lng: number;
28
+ }>;
29
+ /**
30
+ * Ordered step list along the route, when supplied by the host. Each
31
+ * step is one navigable segment — typically one straight stretch of
32
+ * road ending in a maneuver. Optional for back-compat with older
33
+ * hosts that only ship the polyline. The SDK's pivot module consumes
34
+ * this to enrich pivots with `fromRoad` / `toRoad` metadata.
35
+ */
36
+ steps?: NavRouteStepPayload[];
37
+ };
38
+ export type NavRouteStepPayload = {
39
+ /** Coordinate where this step begins (== end of the previous step). */
40
+ lat: number;
41
+ lng: number;
42
+ /**
43
+ * Index into `NavRoutePayload.points[]` where this step starts.
44
+ * Lets consumers correlate step boundaries with polyline geometry.
45
+ */
46
+ routeIndex: number;
47
+ /** Name of the road traversed during this step. Null when the engine has no name. */
48
+ road?: string | null;
49
+ /**
50
+ * Categorical maneuver performed at the END of this step (i.e. how
51
+ * the user exits this step). Same vocabulary as `NavManeuverPayload.maneuverType`.
52
+ */
53
+ maneuver: string;
54
+ /** Length of this step in meters. */
55
+ distanceMeters: number;
56
+ };
57
+ export type NavLocationPayload = {
58
+ lat: number;
59
+ lng: number;
60
+ /** Horizontal accuracy in meters, if reported by the platform. */
61
+ accuracy: number | null;
62
+ /** Unix ms timestamp of the fix. */
63
+ timestamp: number;
64
+ phone_notification: (event: PhoneNotificationEvent) => void;
65
+ phone_notification_dismissed: (event: PhoneNotificationDismissedEvent) => void;
66
+ captions_tester_incident: (event: CaptionsTesterIncidentEvent) => void;
67
+ };
68
+ export type ChangeEventPayload = {
69
+ value: string;
70
+ };
71
+ export type NavManeuverPayload = {
72
+ /**
73
+ * Categorical type of the upcoming maneuver. One of: STRAIGHT,
74
+ * SLIGHT_LEFT, SLIGHT_RIGHT, TURN_LEFT, TURN_RIGHT, SHARP_LEFT,
75
+ * SHARP_RIGHT, U_TURN, ARRIVE.
76
+ */
77
+ maneuverType: string;
78
+ /** Distance in meters from the user's current position to that maneuver. -1 if unknown. */
79
+ distanceMeters: number;
80
+ /** Road the user is currently on, per the Nav SDK. Null if unavailable. */
81
+ fromRoad?: string | null;
82
+ /**
83
+ * Legacy "next road" field — historically populated from the same
84
+ * source as `fromRoad` (the current step's road, NOT the road
85
+ * after the upcoming turn). Kept for back-compat. New consumers
86
+ * should read `nextStepRoad` instead.
87
+ */
88
+ toRoad?: string | null;
89
+ /**
90
+ * Road the user will be on AFTER the upcoming maneuver, sourced
91
+ * from the Nav SDK's `remainingSteps[0]`. This is the value to
92
+ * show as the "next street" headline on the maneuver card. Null
93
+ * when the SDK hasn't surfaced a remaining step yet (final leg,
94
+ * pre-first-NavInfo, etc.).
95
+ */
96
+ nextStepRoad?: string | null;
97
+ /** Total remaining distance to final destination, meters. -1 if unknown. */
98
+ distanceToDestinationMeters?: number;
99
+ /** Total remaining travel time, seconds. -1 if unknown. */
100
+ timeToDestinationSeconds?: number;
101
+ /** Current speed in m/s. Null if unavailable. */
102
+ currentSpeedMps?: number | null;
103
+ /** Speed limit on the current road segment in m/s. Null if unknown / not regulated. */
104
+ speedLimitMps?: number | null;
105
+ /** Bearing along the route at the user's current position, 0–360. Null if unknown. */
106
+ routeHeadingDeg?: number | null;
107
+ };
108
+ export type NavErrorPayload = {
109
+ message: string;
110
+ };
111
+ export type InstalledApp = {
112
+ packageName: string;
113
+ appName: string;
114
+ isBlocked: boolean;
115
+ icon: string | null;
116
+ };
117
+ export type PhoneNotificationEvent = {
118
+ notificationId: string;
119
+ app: string;
120
+ title: string;
121
+ content: string;
122
+ /**
123
+ * Android notification priority: PRIORITY_MIN (-2) through PRIORITY_MAX (2).
124
+ * Derived from the channel importance when the ranking is available, since
125
+ * Notification.priority reads 0 for channel-based notifications.
126
+ */
127
+ priority: number;
128
+ timestamp: number;
129
+ packageName: string;
130
+ };
131
+ export type PhoneNotificationDismissedEvent = {
132
+ notificationKey: string;
133
+ packageName: string;
134
+ notificationId: string;
135
+ };
136
+ export type CaptionsTesterIncidentEvent = {
137
+ action?: string;
138
+ timestamp?: number;
139
+ failure_code?: string;
140
+ failure_message?: string;
141
+ test_run_id?: string;
142
+ scenario_name?: string;
143
+ source?: string;
144
+ [key: string]: unknown;
145
+ };
146
+ export type CrustViewProps = {
147
+ url: string;
148
+ onLoad: (event: {
149
+ nativeEvent: OnLoadEventPayload;
150
+ }) => void;
151
+ style?: StyleProp<ViewStyle>;
152
+ };
153
+ //# sourceMappingURL=Crust.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Crust.types.d.ts","sourceRoot":"","sources":["../src/Crust.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Crust.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Crust.types.js","sourceRoot":"","sources":["../src/Crust.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {StyleProp, ViewStyle} from \"react-native\"\n\nexport type OnLoadEventPayload = {\n url: string\n}\n\nexport type CrustModuleEvents = {\n onChange: (params: ChangeEventPayload) => void\n onNavManeuver: (params: NavManeuverPayload) => void\n onNavRerouting: (params: Record<string, never>) => void\n onNavArrived: (params: Record<string, never>) => void\n onNavError: (params: NavErrorPayload) => void\n onNavLocation: (params: NavLocationPayload) => void\n onNavRoute: (params: NavRoutePayload) => void\n onNavOffRoute: (params: NavOffRoutePayload) => void\n onHeading: (params: HeadingPayload) => void\n}\n\nexport type NavOffRoutePayload = {\n /** Approximate perpendicular distance in meters from the route. */\n offRouteDistanceMeters: number\n}\n\nexport type HeadingPayload = {\n /** Compass heading in degrees, 0 = north, 90 = east. */\n degrees: number\n}\n\nexport type NavRoutePayload = {\n points: Array<{lat: number; lng: number}>\n /**\n * Ordered step list along the route, when supplied by the host. Each\n * step is one navigable segment — typically one straight stretch of\n * road ending in a maneuver. Optional for back-compat with older\n * hosts that only ship the polyline. The SDK's pivot module consumes\n * this to enrich pivots with `fromRoad` / `toRoad` metadata.\n */\n steps?: NavRouteStepPayload[]\n}\n\nexport type NavRouteStepPayload = {\n /** Coordinate where this step begins (== end of the previous step). */\n lat: number\n lng: number\n /**\n * Index into `NavRoutePayload.points[]` where this step starts.\n * Lets consumers correlate step boundaries with polyline geometry.\n */\n routeIndex: number\n /** Name of the road traversed during this step. Null when the engine has no name. */\n road?: string | null\n /**\n * Categorical maneuver performed at the END of this step (i.e. how\n * the user exits this step). Same vocabulary as `NavManeuverPayload.maneuverType`.\n */\n maneuver: string\n /** Length of this step in meters. */\n distanceMeters: number\n}\n\nexport type NavLocationPayload = {\n lat: number\n lng: number\n /** Horizontal accuracy in meters, if reported by the platform. */\n accuracy: number | null\n /** Unix ms timestamp of the fix. */\n timestamp: number\n phone_notification: (event: PhoneNotificationEvent) => void\n phone_notification_dismissed: (event: PhoneNotificationDismissedEvent) => void\n captions_tester_incident: (event: CaptionsTesterIncidentEvent) => void\n}\n\nexport type ChangeEventPayload = {\n value: string\n}\n\nexport type NavManeuverPayload = {\n /**\n * Categorical type of the upcoming maneuver. One of: STRAIGHT,\n * SLIGHT_LEFT, SLIGHT_RIGHT, TURN_LEFT, TURN_RIGHT, SHARP_LEFT,\n * SHARP_RIGHT, U_TURN, ARRIVE.\n */\n maneuverType: string\n /** Distance in meters from the user's current position to that maneuver. -1 if unknown. */\n distanceMeters: number\n /** Road the user is currently on, per the Nav SDK. Null if unavailable. */\n fromRoad?: string | null\n /**\n * Legacy \"next road\" field — historically populated from the same\n * source as `fromRoad` (the current step's road, NOT the road\n * after the upcoming turn). Kept for back-compat. New consumers\n * should read `nextStepRoad` instead.\n */\n toRoad?: string | null\n /**\n * Road the user will be on AFTER the upcoming maneuver, sourced\n * from the Nav SDK's `remainingSteps[0]`. This is the value to\n * show as the \"next street\" headline on the maneuver card. Null\n * when the SDK hasn't surfaced a remaining step yet (final leg,\n * pre-first-NavInfo, etc.).\n */\n nextStepRoad?: string | null\n /** Total remaining distance to final destination, meters. -1 if unknown. */\n distanceToDestinationMeters?: number\n /** Total remaining travel time, seconds. -1 if unknown. */\n timeToDestinationSeconds?: number\n /** Current speed in m/s. Null if unavailable. */\n currentSpeedMps?: number | null\n /** Speed limit on the current road segment in m/s. Null if unknown / not regulated. */\n speedLimitMps?: number | null\n /** Bearing along the route at the user's current position, 0–360. Null if unknown. */\n routeHeadingDeg?: number | null\n}\n\nexport type NavErrorPayload = {\n message: string\n}\n\nexport type InstalledApp = {\n packageName: string\n appName: string\n isBlocked: boolean\n icon: string | null\n}\n\nexport type PhoneNotificationEvent = {\n notificationId: string\n app: string\n title: string\n content: string\n /**\n * Android notification priority: PRIORITY_MIN (-2) through PRIORITY_MAX (2).\n * Derived from the channel importance when the ranking is available, since\n * Notification.priority reads 0 for channel-based notifications.\n */\n priority: number\n timestamp: number\n packageName: string\n}\n\nexport type PhoneNotificationDismissedEvent = {\n notificationKey: string\n packageName: string\n notificationId: string\n}\n\nexport type CaptionsTesterIncidentEvent = {\n action?: string\n timestamp?: number\n failure_code?: string\n failure_message?: string\n test_run_id?: string\n scenario_name?: string\n source?: string\n [key: string]: unknown\n}\n\nexport type CrustViewProps = {\n url: string\n onLoad: (event: {nativeEvent: OnLoadEventPayload}) => void\n style?: StyleProp<ViewStyle>\n}\n"]}
@@ -0,0 +1,186 @@
1
+ import { NativeModule } from "expo";
2
+ import type { CrustModuleEvents, InstalledApp } from "./Crust.types";
3
+ declare class CrustModule extends NativeModule<CrustModuleEvents> {
4
+ PI: number;
5
+ hello(): string;
6
+ setValueAsync(value: string): Promise<void>;
7
+ nativeHttpRequest(method: string, url: string, headers: Record<string, string>, body?: string | null): Promise<{
8
+ status: number;
9
+ statusText: string;
10
+ headers: Record<string, string>;
11
+ body: string;
12
+ }>;
13
+ showAVRoutePicker(tintColor?: string | null): void;
14
+ /**
15
+ * iOS: configure `preferredScreenEdgesDeferringSystemGestures`. When an
16
+ * edge is deferred, the first swipe across that edge is consumed by the
17
+ * app and the system gesture (Control Center, Notification Center, Home
18
+ * indicator) only fires on a second swipe — i.e. a two-swipe-to-exit UX.
19
+ *
20
+ * Pass `[]` to restore default behavior. Android: no-op (Android has no
21
+ * per-app equivalent; system gestures are configured at the OS level).
22
+ */
23
+ setDeferredSystemGestures(edges: Array<"top" | "bottom" | "left" | "right" | "all">): Promise<void>;
24
+ setNotificationConfig(listenerEnabled: boolean, blocklist: string[]): Promise<void>;
25
+ getInstalledApps(): Promise<InstalledApp[]>;
26
+ getInstalledAppsForNotifications(): Promise<InstalledApp[]>;
27
+ hasNotificationListenerPermission(): Promise<boolean>;
28
+ refreshNotificationListener(): Promise<boolean>;
29
+ openNotificationListenerSettings(): Promise<boolean>;
30
+ isBetaBuild(): Promise<boolean>;
31
+ showLocationServicesDialog(): Promise<boolean>;
32
+ isLocationServicesEnabled(): Promise<boolean>;
33
+ openLocationSettings(): Promise<boolean>;
34
+ openAppSettings(): Promise<boolean>;
35
+ openBluetoothSettings(): Promise<boolean>;
36
+ processGalleryImage(inputPath: string, outputPath: string, options: {
37
+ lensCorrection?: boolean;
38
+ colorCorrection?: boolean;
39
+ }): Promise<{
40
+ success: boolean;
41
+ outputPath?: string;
42
+ processingTimeMs?: number;
43
+ error?: string;
44
+ }>;
45
+ mergeHdrBrackets(underPath: string, normalPath: string, overPath: string, outputPath: string): Promise<{
46
+ success: boolean;
47
+ outputPath?: string;
48
+ processingTimeMs?: number;
49
+ error?: string;
50
+ }>;
51
+ stabilizeVideo(inputPath: string, imuPath: string, outputPath: string): Promise<{
52
+ success: boolean;
53
+ outputPath?: string;
54
+ processingTimeMs?: number;
55
+ error?: string;
56
+ }>;
57
+ saveToGalleryWithDate(filePath: string, captureTimeMillis?: number, displayName?: string): Promise<{
58
+ success: boolean;
59
+ uri?: string;
60
+ identifier?: string;
61
+ existing?: boolean;
62
+ error?: string;
63
+ }>;
64
+ /**
65
+ * Override the Mapbox access token the native Navigation SDK
66
+ * authenticates with. A non-empty token wins over the one baked at build
67
+ * time (AndroidManifest `com.mapbox.token` / Info.plist `MBXAccessToken`);
68
+ * "" clears the override and restores the baked token. Call before
69
+ * `startNavigation` — the engine pushes the user's Settings > Keys token
70
+ * here per trip start.
71
+ */
72
+ setMapboxAccessToken(token: string): Promise<{
73
+ ok: boolean;
74
+ error?: string;
75
+ }>;
76
+ startNavigation(lat: number, lng: number, options?: {
77
+ simulate?: boolean;
78
+ speedMultiplier?: number;
79
+ /** Optional multi-stop list. When present takes precedence over lat/lng. Last entry is the final destination. */
80
+ stops?: Array<{
81
+ lat: number;
82
+ lng: number;
83
+ }>;
84
+ /** "walking" | "driving" | "cycling" | "two_wheeler". Defaults driving. */
85
+ mode?: string;
86
+ avoid?: {
87
+ highways?: boolean;
88
+ tolls?: boolean;
89
+ ferries?: boolean;
90
+ };
91
+ /** Force a reroute when the user is more than N meters past a pivot they didn't take. */
92
+ missedTurnRerouteMeters?: number;
93
+ }): Promise<{
94
+ ok: boolean;
95
+ error?: string;
96
+ }>;
97
+ stopNavigation(): Promise<{
98
+ ok: boolean;
99
+ error?: string;
100
+ }>;
101
+ /**
102
+ * Kept for API parity with the Google-era contract. Mapbox has no
103
+ * Terms & Conditions dialog, so no dialog is shown; resolves with
104
+ * `{accepted: true}` once permission handling completes. Idempotent —
105
+ * still safe (and intended) to call eagerly.
106
+ */
107
+ requestNavigationPermission(): Promise<{
108
+ ok: boolean;
109
+ accepted: boolean;
110
+ error?: string;
111
+ }>;
112
+ /**
113
+ * Dev-only: push the simulated user position off-route so the Nav SDK
114
+ * reroutes. Only meaningful in simulate mode. Both platforms;
115
+ * `offsetMeters` tunes the jump on Android and is ignored on iOS.
116
+ */
117
+ simulateDeviation(offsetMeters?: number): Promise<{
118
+ ok: boolean;
119
+ error?: string;
120
+ }>;
121
+ /**
122
+ * Dev toggle. When enabled, the native NavigationManager shifts every
123
+ * reported location ~8m perpendicular to the route bearing, simulating
124
+ * a pedestrian walking on the wrong sidewalk. Only meaningful in
125
+ * simulate mode; lets us verify the SDK's along-path pivot trigger
126
+ * fires even when the user never crosses the 7m pivot point radius.
127
+ * Android-only today; iOS is a no-op stub.
128
+ */
129
+ setWrongSidewalkOffset(enabled: boolean): Promise<{
130
+ ok: boolean;
131
+ error?: string;
132
+ }>;
133
+ /**
134
+ * Dev toggle. When enabled, the native NavigationManager takes over
135
+ * from the Mapbox simulator and walks the user along a modified
136
+ * polyline that omits crossing micro-steps — reproducing the
137
+ * wrong-sidewalk-then-missed-the-turn scenario. Android-only today;
138
+ * iOS is a no-op stub.
139
+ */
140
+ setSkipCrossings(enabled: boolean): Promise<{
141
+ ok: boolean;
142
+ error?: string;
143
+ }>;
144
+ startHeading(): Promise<{
145
+ ok: boolean;
146
+ error?: string;
147
+ }>;
148
+ stopHeading(): Promise<{
149
+ ok: boolean;
150
+ error?: string;
151
+ }>;
152
+ /**
153
+ * Spawn a per-miniapp JS context. Re-spawn is allowed: a live context
154
+ * with the same packageName is killed first. Returns true if the
155
+ * polyfill bundle + miniapp source evaluated without throwing.
156
+ *
157
+ * The polyfill bundle is `mobile/modules/glasslyjs-runtime/dist/startup.js`
158
+ * (shipped inside the host binary). It installs window-style globals
159
+ * (console, timers, fetch, localStorage, crypto) atop the JSC runtime.
160
+ */
161
+ jsSpawn(packageName: string, polyfillBundle: string, miniappJs: string): Promise<boolean>;
162
+ jsEvaluate(packageName: string, source: string): Promise<unknown>;
163
+ jsKill(packageName: string): Promise<void>;
164
+ /**
165
+ * Push a `{kind: "event"|"response", …}` envelope into the named
166
+ * context's globalThis.__deliver. Returns when the underlying
167
+ * evaluateScript completes (the JS handler runs synchronously on the
168
+ * context's queue).
169
+ */
170
+ jsDispatchToJs(packageName: string, envelope: Record<string, unknown>): Promise<void>;
171
+ jsSetManifest(packageName: string, permissions: string[]): Promise<void>;
172
+ /** Diagnostic — returns the packageNames of every live JSContext. */
173
+ jsAlivePackages(): string[];
174
+ /** Diagnostic — force a GC cycle on the named context. */
175
+ jsDebugForceGC(packageName: string): Promise<boolean>;
176
+ /**
177
+ * Read the bundled GlasslyJS polyfill (startup.js) shipped inside the
178
+ * host binary. Synchronous — host RN code calls this once on app boot
179
+ * and caches the string, then passes it to every jsSpawn so
180
+ * every JSContext starts with the same polyfill ABI.
181
+ */
182
+ jsLoadPolyfillBundle(): string;
183
+ }
184
+ declare const _default: CrustModule;
185
+ export default _default;
186
+ //# sourceMappingURL=CrustModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrustModule.d.ts","sourceRoot":"","sources":["../src/CrustModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { NativeModule, requireNativeModule } from "expo";
2
+ // This call loads the native module object from the JSI.
3
+ export default requireNativeModule("Crust");
4
+ //# sourceMappingURL=CrustModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrustModule.js","sourceRoot":"","sources":["../src/CrustModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,mBAAmB,EAAC,MAAM,MAAM,CAAA;AAgMtD,yDAAyD;AACzD,eAAe,mBAAmB,CAAc,OAAO,CAAC,CAAA","sourcesContent":["import {NativeModule, requireNativeModule} from \"expo\"\n\nimport type {CrustModuleEvents, InstalledApp} from \"./Crust.types\"\n\ndeclare class CrustModule extends NativeModule<CrustModuleEvents> {\n PI: number\n hello(): string\n setValueAsync(value: string): Promise<void>\n nativeHttpRequest(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string | null,\n ): Promise<{status: number; statusText: string; headers: Record<string, string>; body: string}>\n showAVRoutePicker(tintColor?: string | null): void\n\n /**\n * iOS: configure `preferredScreenEdgesDeferringSystemGestures`. When an\n * edge is deferred, the first swipe across that edge is consumed by the\n * app and the system gesture (Control Center, Notification Center, Home\n * indicator) only fires on a second swipe — i.e. a two-swipe-to-exit UX.\n *\n * Pass `[]` to restore default behavior. Android: no-op (Android has no\n * per-app equivalent; system gestures are configured at the OS level).\n */\n setDeferredSystemGestures(edges: Array<\"top\" | \"bottom\" | \"left\" | \"right\" | \"all\">): Promise<void>\n\n // Glassly Notification Commands\n setNotificationConfig(listenerEnabled: boolean, blocklist: string[]): Promise<void>\n getInstalledApps(): Promise<InstalledApp[]>\n getInstalledAppsForNotifications(): Promise<InstalledApp[]>\n hasNotificationListenerPermission(): Promise<boolean>\n refreshNotificationListener(): Promise<boolean>\n openNotificationListenerSettings(): Promise<boolean>\n isBetaBuild(): Promise<boolean>\n // location services commands\n showLocationServicesDialog(): Promise<boolean>\n isLocationServicesEnabled(): Promise<boolean>\n openLocationSettings(): Promise<boolean>\n openAppSettings(): Promise<boolean>\n openBluetoothSettings(): Promise<boolean>\n\n // Image Processing Commands\n processGalleryImage(\n inputPath: string,\n outputPath: string,\n options: {\n lensCorrection?: boolean\n colorCorrection?: boolean\n },\n ): Promise<{\n success: boolean\n outputPath?: string\n processingTimeMs?: number\n error?: string\n }>\n\n mergeHdrBrackets(\n underPath: string,\n normalPath: string,\n overPath: string,\n outputPath: string,\n ): Promise<{\n success: boolean\n outputPath?: string\n processingTimeMs?: number\n error?: string\n }>\n\n stabilizeVideo(\n inputPath: string,\n imuPath: string,\n outputPath: string,\n ): Promise<{\n success: boolean\n outputPath?: string\n processingTimeMs?: number\n error?: string\n }>\n\n // Media Library Commands\n saveToGalleryWithDate(\n filePath: string,\n captureTimeMillis?: number,\n displayName?: string,\n ): Promise<{\n success: boolean\n uri?: string\n identifier?: string\n existing?: boolean\n error?: string\n }>\n\n // Navigation (both platforms via Mapbox; the dev toggles below are Android-only)\n /**\n * Override the Mapbox access token the native Navigation SDK\n * authenticates with. A non-empty token wins over the one baked at build\n * time (AndroidManifest `com.mapbox.token` / Info.plist `MBXAccessToken`);\n * \"\" clears the override and restores the baked token. Call before\n * `startNavigation` — the engine pushes the user's Settings > Keys token\n * here per trip start.\n */\n setMapboxAccessToken(token: string): Promise<{ok: boolean; error?: string}>\n startNavigation(\n lat: number,\n lng: number,\n options?: {\n simulate?: boolean\n speedMultiplier?: number\n /** Optional multi-stop list. When present takes precedence over lat/lng. Last entry is the final destination. */\n stops?: Array<{lat: number; lng: number}>\n /** \"walking\" | \"driving\" | \"cycling\" | \"two_wheeler\". Defaults driving. */\n mode?: string\n avoid?: {highways?: boolean; tolls?: boolean; ferries?: boolean}\n /** Force a reroute when the user is more than N meters past a pivot they didn't take. */\n missedTurnRerouteMeters?: number\n },\n ): Promise<{ok: boolean; error?: string}>\n stopNavigation(): Promise<{ok: boolean; error?: string}>\n\n /**\n * Kept for API parity with the Google-era contract. Mapbox has no\n * Terms & Conditions dialog, so no dialog is shown; resolves with\n * `{accepted: true}` once permission handling completes. Idempotent —\n * still safe (and intended) to call eagerly.\n */\n requestNavigationPermission(): Promise<{ok: boolean; accepted: boolean; error?: string}>\n\n /**\n * Dev-only: push the simulated user position off-route so the Nav SDK\n * reroutes. Only meaningful in simulate mode. Both platforms;\n * `offsetMeters` tunes the jump on Android and is ignored on iOS.\n */\n simulateDeviation(offsetMeters?: number): Promise<{ok: boolean; error?: string}>\n\n /**\n * Dev toggle. When enabled, the native NavigationManager shifts every\n * reported location ~8m perpendicular to the route bearing, simulating\n * a pedestrian walking on the wrong sidewalk. Only meaningful in\n * simulate mode; lets us verify the SDK's along-path pivot trigger\n * fires even when the user never crosses the 7m pivot point radius.\n * Android-only today; iOS is a no-op stub.\n */\n setWrongSidewalkOffset(enabled: boolean): Promise<{ok: boolean; error?: string}>\n\n /**\n * Dev toggle. When enabled, the native NavigationManager takes over\n * from the Mapbox simulator and walks the user along a modified\n * polyline that omits crossing micro-steps — reproducing the\n * wrong-sidewalk-then-missed-the-turn scenario. Android-only today;\n * iOS is a no-op stub.\n */\n setSkipCrossings(enabled: boolean): Promise<{ok: boolean; error?: string}>\n\n // Heading / compass (both platforms)\n startHeading(): Promise<{ok: boolean; error?: string}>\n stopHeading(): Promise<{ok: boolean; error?: string}>\n\n // GlasslyJS Runtime — per-miniapp JSContext lifecycle.\n /**\n * Spawn a per-miniapp JS context. Re-spawn is allowed: a live context\n * with the same packageName is killed first. Returns true if the\n * polyfill bundle + miniapp source evaluated without throwing.\n *\n * The polyfill bundle is `mobile/modules/glasslyjs-runtime/dist/startup.js`\n * (shipped inside the host binary). It installs window-style globals\n * (console, timers, fetch, localStorage, crypto) atop the JSC runtime.\n */\n jsSpawn(packageName: string, polyfillBundle: string, miniappJs: string): Promise<boolean>\n jsEvaluate(packageName: string, source: string): Promise<unknown>\n jsKill(packageName: string): Promise<void>\n /**\n * Push a `{kind: \"event\"|\"response\", …}` envelope into the named\n * context's globalThis.__deliver. Returns when the underlying\n * evaluateScript completes (the JS handler runs synchronously on the\n * context's queue).\n */\n jsDispatchToJs(packageName: string, envelope: Record<string, unknown>): Promise<void>\n jsSetManifest(packageName: string, permissions: string[]): Promise<void>\n /** Diagnostic — returns the packageNames of every live JSContext. */\n jsAlivePackages(): string[]\n /** Diagnostic — force a GC cycle on the named context. */\n jsDebugForceGC(packageName: string): Promise<boolean>\n /**\n * Read the bundled GlasslyJS polyfill (startup.js) shipped inside the\n * host binary. Synchronous — host RN code calls this once on app boot\n * and caches the string, then passes it to every jsSpawn so\n * every JSContext starts with the same polyfill ABI.\n */\n jsLoadPolyfillBundle(): string\n}\n\n// This call loads the native module object from the JSI.\nexport default requireNativeModule<CrustModule>(\"Crust\")\n"]}
@@ -0,0 +1,39 @@
1
+ import { NativeModule } from "expo";
2
+ import type { CrustModuleEvents } from "./Crust.types";
3
+ declare class CrustModule extends NativeModule<CrustModuleEvents> {
4
+ PI: number;
5
+ setValueAsync(value: string): Promise<void>;
6
+ nativeHttpRequest(method: string, url: string, headers: Record<string, string>, body?: string | null): Promise<{
7
+ status: number;
8
+ statusText: string;
9
+ headers: {
10
+ [k: string]: string;
11
+ };
12
+ body: string;
13
+ }>;
14
+ hello(): string;
15
+ showAVRoutePicker(_tintColor?: string | null): void;
16
+ setDeferredSystemGestures(_edges: string[]): Promise<void>;
17
+ setNotificationConfig(_listenerEnabled: boolean, _blocklist: string[]): Promise<void>;
18
+ getInstalledApps(): Promise<never[]>;
19
+ getInstalledAppsForNotifications(): Promise<never[]>;
20
+ hasNotificationListenerPermission(): Promise<boolean>;
21
+ refreshNotificationListener(): Promise<boolean>;
22
+ openNotificationListenerSettings(): Promise<boolean>;
23
+ isBetaBuild(): Promise<boolean>;
24
+ setMapboxAccessToken(_token: string): Promise<{
25
+ ok: boolean;
26
+ error: string;
27
+ }>;
28
+ jsSpawn(_pkg: string, _polyfill: string, _miniappJs: string): Promise<boolean>;
29
+ jsEvaluate(_pkg: string, _src: string): Promise<null>;
30
+ jsKill(_pkg: string): Promise<void>;
31
+ jsDispatchToJs(_pkg: string, _env: Record<string, unknown>): Promise<void>;
32
+ jsSetManifest(_pkg: string, _perms: string[]): Promise<void>;
33
+ jsAlivePackages(): never[];
34
+ jsDebugForceGC(_pkg: string): Promise<boolean>;
35
+ jsLoadPolyfillBundle(): string;
36
+ }
37
+ declare const _default: typeof CrustModule;
38
+ export default _default;
39
+ //# sourceMappingURL=CrustModule.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrustModule.web.d.ts","sourceRoot":"","sources":["../src/CrustModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAC,MAAM,MAAM,CAAA;AAEpD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAA;AAEpD,cAAM,WAAY,SAAQ,YAAY,CAAC,iBAAiB,CAAC;IACvD,EAAE,SAAU;IACN,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAG3C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;;;;;;;;IAS1G,KAAK;IAGL,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IACtC,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1D,qBAAqB,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IACrF,gBAAgB;IAGhB,gCAAgC;IAGhC,iCAAiC;IAGjC,2BAA2B;IAG3B,gCAAgC;IAGhC,WAAW;IAGX,oBAAoB,CAAC,MAAM,EAAE,MAAM;;;;IAGnC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAG3D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAGrC,MAAM,CAAC,IAAI,EAAE,MAAM;IAGnB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAG1D,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;IAGlD,eAAe;IAGT,cAAc,CAAC,IAAI,EAAE,MAAM;IAGjC,oBAAoB;CAGrB;;AAED,wBAA4D"}
@@ -0,0 +1,69 @@
1
+ import { registerWebModule, NativeModule } from "expo";
2
+ class CrustModule extends NativeModule {
3
+ PI = Math.PI;
4
+ async setValueAsync(value) {
5
+ this.emit("onChange", { value });
6
+ }
7
+ async nativeHttpRequest(method, url, headers, body) {
8
+ const response = await fetch(url, { method, headers, body });
9
+ return {
10
+ status: response.status,
11
+ statusText: response.statusText,
12
+ headers: Object.fromEntries(response.headers.entries()),
13
+ body: await response.text(),
14
+ };
15
+ }
16
+ hello() {
17
+ return "Hello world! 👋";
18
+ }
19
+ showAVRoutePicker(_tintColor) { }
20
+ async setDeferredSystemGestures(_edges) { }
21
+ async setNotificationConfig(_listenerEnabled, _blocklist) { }
22
+ async getInstalledApps() {
23
+ return [];
24
+ }
25
+ async getInstalledAppsForNotifications() {
26
+ return [];
27
+ }
28
+ async hasNotificationListenerPermission() {
29
+ return false;
30
+ }
31
+ async refreshNotificationListener() {
32
+ return false;
33
+ }
34
+ async openNotificationListenerSettings() {
35
+ return false;
36
+ }
37
+ async isBetaBuild() {
38
+ return false;
39
+ }
40
+ async setMapboxAccessToken(_token) {
41
+ return { ok: false, error: "Not supported on web" };
42
+ }
43
+ async jsSpawn(_pkg, _polyfill, _miniappJs) {
44
+ return false;
45
+ }
46
+ async jsEvaluate(_pkg, _src) {
47
+ return null;
48
+ }
49
+ async jsKill(_pkg) {
50
+ return;
51
+ }
52
+ async jsDispatchToJs(_pkg, _env) {
53
+ return;
54
+ }
55
+ async jsSetManifest(_pkg, _perms) {
56
+ return;
57
+ }
58
+ jsAlivePackages() {
59
+ return [];
60
+ }
61
+ async jsDebugForceGC(_pkg) {
62
+ return false;
63
+ }
64
+ jsLoadPolyfillBundle() {
65
+ return "";
66
+ }
67
+ }
68
+ export default registerWebModule(CrustModule, "CrustModule");
69
+ //# sourceMappingURL=CrustModule.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrustModule.web.js","sourceRoot":"","sources":["../src/CrustModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAE,YAAY,EAAC,MAAM,MAAM,CAAA;AAIpD,MAAM,WAAY,SAAQ,YAA+B;IACvD,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;IACZ,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAC,KAAK,EAAC,CAAC,CAAA;IAChC,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,GAAW,EAAE,OAA+B,EAAE,IAAoB;QACxG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAA;QAC1D,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvD,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE;SAC5B,CAAA;IACH,CAAC;IACD,KAAK;QACH,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IACD,iBAAiB,CAAC,UAA0B,IAAG,CAAC;IAChD,KAAK,CAAC,yBAAyB,CAAC,MAAgB,IAAkB,CAAC;IACnE,KAAK,CAAC,qBAAqB,CAAC,gBAAyB,EAAE,UAAoB,IAAkB,CAAC;IAC9F,KAAK,CAAC,gBAAgB;QACpB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,KAAK,CAAC,gCAAgC;QACpC,OAAO,EAAE,CAAA;IACX,CAAC;IACD,KAAK,CAAC,iCAAiC;QACrC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,CAAC,2BAA2B;QAC/B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,CAAC,gCAAgC;QACpC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,CAAC,WAAW;QACf,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,CAAC,oBAAoB,CAAC,MAAc;QACvC,OAAO,EAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAC,CAAA;IACnD,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,SAAiB,EAAE,UAAkB;QAC/D,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,IAAY;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,OAAM;IACR,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,IAA6B;QAC9D,OAAM;IACR,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,MAAgB;QAChD,OAAM;IACR,CAAC;IACD,eAAe;QACb,OAAO,EAAE,CAAA;IACX,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,oBAAoB;QAClB,OAAO,EAAE,CAAA;IACX,CAAC;CACF;AAED,eAAe,iBAAiB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA","sourcesContent":["import {registerWebModule, NativeModule} from \"expo\"\n\nimport type {CrustModuleEvents} from \"./Crust.types\"\n\nclass CrustModule extends NativeModule<CrustModuleEvents> {\n PI = Math.PI\n async setValueAsync(value: string): Promise<void> {\n this.emit(\"onChange\", {value})\n }\n async nativeHttpRequest(method: string, url: string, headers: Record<string, string>, body?: string | null) {\n const response = await fetch(url, {method, headers, body})\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n body: await response.text(),\n }\n }\n hello() {\n return \"Hello world! 👋\"\n }\n showAVRoutePicker(_tintColor?: string | null) {}\n async setDeferredSystemGestures(_edges: string[]): Promise<void> {}\n async setNotificationConfig(_listenerEnabled: boolean, _blocklist: string[]): Promise<void> {}\n async getInstalledApps() {\n return []\n }\n async getInstalledAppsForNotifications() {\n return []\n }\n async hasNotificationListenerPermission() {\n return false\n }\n async refreshNotificationListener() {\n return false\n }\n async openNotificationListenerSettings() {\n return false\n }\n async isBetaBuild() {\n return false\n }\n async setMapboxAccessToken(_token: string) {\n return {ok: false, error: \"Not supported on web\"}\n }\n async jsSpawn(_pkg: string, _polyfill: string, _miniappJs: string) {\n return false\n }\n async jsEvaluate(_pkg: string, _src: string) {\n return null\n }\n async jsKill(_pkg: string) {\n return\n }\n async jsDispatchToJs(_pkg: string, _env: Record<string, unknown>) {\n return\n }\n async jsSetManifest(_pkg: string, _perms: string[]) {\n return\n }\n jsAlivePackages() {\n return []\n }\n async jsDebugForceGC(_pkg: string) {\n return false\n }\n jsLoadPolyfillBundle() {\n return \"\"\n }\n}\n\nexport default registerWebModule(CrustModule, \"CrustModule\")\n"]}
@@ -0,0 +1,4 @@
1
+ import * as React from "react";
2
+ import type { CrustViewProps } from "./Crust.types";
3
+ export default function CrustView(props: CrustViewProps): React.JSX.Element;
4
+ //# sourceMappingURL=CrustView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrustView.d.ts","sourceRoot":"","sources":["../src/CrustView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,eAAe,CAAA;AAIjD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAK,EAAE,cAAc,qBAEtD"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { requireNativeView } from "expo";
3
+ import * as React from "react";
4
+ const NativeView = requireNativeView("Crust");
5
+ export default function CrustView(props) {
6
+ return _jsx(NativeView, { ...props });
7
+ }
8
+ //# sourceMappingURL=CrustView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrustView.js","sourceRoot":"","sources":["../src/CrustView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,MAAM,CAAA;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,UAAU,GAAwC,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAElF,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAqB;IACrD,OAAO,KAAC,UAAU,OAAK,KAAK,GAAI,CAAA;AAClC,CAAC","sourcesContent":["import {requireNativeView} from \"expo\"\nimport * as React from \"react\"\n\nimport type {CrustViewProps} from \"./Crust.types\"\n\nconst NativeView: React.ComponentType<CrustViewProps> = requireNativeView(\"Crust\")\n\nexport default function CrustView(props: CrustViewProps) {\n return <NativeView {...props} />\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { CrustViewProps } from "./Crust.types";
2
+ export default function CrustView(props: CrustViewProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=CrustView.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrustView.web.d.ts","sourceRoot":"","sources":["../src/CrustView.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,eAAe,CAAA;AAEjD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAK,EAAE,cAAc,+BAMtD"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export default function CrustView(props) {
3
+ return (_jsx("div", { children: _jsx("iframe", { style: { flex: 1 }, src: props.url, onLoad: () => props.onLoad({ nativeEvent: { url: props.url } }) }) }));
4
+ }
5
+ //# sourceMappingURL=CrustView.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrustView.web.js","sourceRoot":"","sources":["../src/CrustView.web.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAqB;IACrD,OAAO,CACL,wBACE,iBAAQ,KAAK,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,EAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAC,EAAC,CAAC,GAAI,GACrG,CACP,CAAA;AACH,CAAC","sourcesContent":["import type {CrustViewProps} from \"./Crust.types\"\n\nexport default function CrustView(props: CrustViewProps) {\n return (\n <div>\n <iframe style={{flex: 1}} src={props.url} onLoad={() => props.onLoad({nativeEvent: {url: props.url}})} />\n </div>\n )\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { default } from "./CrustModule";
2
+ export { default as CrustView } from "./CrustView";
3
+ export * from "./Crust.types";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,aAAa,CAAA;AAChD,cAAc,eAAe,CAAA"}
package/build/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // Reexport the native module. On web, it will be resolved to CrustModule.web.ts
2
+ // and on native platforms to CrustModule.ts
3
+ export { default } from "./CrustModule";
4
+ export { default as CrustView } from "./CrustView";
5
+ export * from "./Crust.types";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4CAA4C;AAC5C,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,aAAa,CAAA;AAChD,cAAc,eAAe,CAAA","sourcesContent":["// Reexport the native module. On web, it will be resolved to CrustModule.web.ts\n// and on native platforms to CrustModule.ts\nexport {default} from \"./CrustModule\"\nexport {default as CrustView} from \"./CrustView\"\nexport * from \"./Crust.types\"\n"]}
@@ -0,0 +1,9 @@
1
+ {
2
+ "platforms": ["apple", "android", "web"],
3
+ "apple": {
4
+ "modules": ["CrustModule"]
5
+ },
6
+ "android": {
7
+ "modules": ["com.glassly.crust.CrustModule"]
8
+ }
9
+ }