@ng-native/expo 0.17.0 → 0.17.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.
@@ -19,7 +19,9 @@ export interface NativeFile {
19
19
  overwrite?: boolean;
20
20
  intermediates?: boolean;
21
21
  }): void;
22
+ /** Synchronous up to SDK 57. From SDK 58 it answers a promise, and `writeSync` is synchronous. */
22
23
  write(content: string | Uint8Array): void;
24
+ writeSync?(content: string | Uint8Array): void;
23
25
  text(): Promise<string>;
24
26
  textSync(): string;
25
27
  /** The contents as bytes: a PDF, an image, anything that is not text. */
@@ -61,7 +63,8 @@ export declare class FileSystem {
61
63
  /**
62
64
  * Write text, or bytes for anything that is not text, whether or not the file is there already.
63
65
  * `write` alone throws on a file that has never been created, which is the first thing everyone
64
- * hits. It replaces what was there.
66
+ * hits. It replaces what was there, and has written by the time it returns: from SDK 58 through
67
+ * `writeSync`, since `write` there answers a promise.
65
68
  */
66
69
  write(file: NativeFile, content: string | Uint8Array): void;
67
70
  private installed;
@@ -60,12 +60,16 @@ export class FileSystem {
60
60
  /**
61
61
  * Write text, or bytes for anything that is not text, whether or not the file is there already.
62
62
  * `write` alone throws on a file that has never been created, which is the first thing everyone
63
- * hits. It replaces what was there.
63
+ * hits. It replaces what was there, and has written by the time it returns: from SDK 58 through
64
+ * `writeSync`, since `write` there answers a promise.
64
65
  */
65
66
  write(file, content) {
66
67
  if (!file.exists)
67
68
  file.create({ intermediates: true });
68
- file.write(content);
69
+ if (file.writeSync)
70
+ file.writeSync(content);
71
+ else
72
+ file.write(content);
69
73
  }
70
74
  installed() {
71
75
  if (!this.native) {
@@ -1 +1 @@
1
- {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../src/file-system.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;;AAiCtD;;;;;;GAMG;AAEH,MAAM,OAAO,UAAU;IACrB,kEAAkE;IAClE,MAAM,CAAU,MAAM,GAAG,IAAI,cAAc,CACzC,iCAAiC,EACjC;QACE,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,IAAI,GAAG,UAAU,CACrB,kBAAkB,EAClB,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAsC,CACvE,CAAC;YACF,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO;gBACL,6EAA6E;gBAC7E,IAAI,cAAc;oBAChB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC1B,CAAC;gBACD,IAAI,iBAAiB;oBACnB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAC7B,CAAC;gBACD,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CACxB,IAAI,IAAI,CAAC,IAAI,CAAC,SAAgD,EAAE,IAAI,CAAC;gBACvE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;aACpC,CAAC;QACJ,CAAC;KACF,CACF,CAAC;IAEe,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAEpD,wEAAwE;IACxE,KAAK,CAAC,IAAY;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,wDAAwD;IACxD,QAAQ,CAAC,IAAY;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,GAAW;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAgB,EAAE,OAA4B;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC,kBAAkB,EAAE,4CAA4C,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;uGAtEU,UAAU;wGAAV,UAAU;;2FAAV,UAAU;kBADtB,OAAO","sourcesContent":["/**\n * `FileSystem`, bound to `expo-file-system`.\n *\n * Files located by what they are for rather than by path. `File` and `Paths` are Expo's own\n * classes over a native one, so they are used as published; this only decides which directory a\n * name lands in and hands the file back.\n */\nimport { InjectionToken, Service, inject } from '@angular/core';\nimport { expoModule, unavailable } from './native.ts';\n\n/**\n * A file. Structural on purpose: this is Expo's `File`, described in terms a test can satisfy, so\n * a fake needs no Expo. An app gets the real object back and may use the rest of its surface.\n */\nexport interface NativeFile {\n readonly uri: string;\n readonly exists: boolean;\n readonly size: number;\n create(options?: { overwrite?: boolean; intermediates?: boolean }): void;\n write(content: string | Uint8Array): void;\n text(): Promise<string>;\n textSync(): string;\n /** The contents as bytes: a PDF, an image, anything that is not text. */\n bytes(): Promise<Uint8Array>;\n delete(): void;\n}\n\n/** A directory, as far as this needs to know: something a file can be named inside. */\nexport type NativeDirectory = object;\n\n/** The slice of `expo-file-system` this needs. */\nexport interface NativeFiles {\n /** Cleared by the system under storage pressure. */\n readonly cacheDirectory: NativeDirectory;\n /** Survives, and is backed up. */\n readonly documentDirectory: NativeDirectory;\n file(directory: NativeDirectory, name: string): NativeFile;\n /** The file at a uri, such as one a picker answers with. */\n fileAt?(uri: string): NativeFile;\n}\n\n/**\n * The two directories an app actually chooses between, plus the create-then-write dance that\n * writing a file for the first time needs.\n *\n * ponytail: a locator, not a file API. Everything else - moving, listing, downloading, streaming\n * - is on the object this hands back, documented by Expo, and not worth restating here.\n */\n@Service()\nexport class FileSystem {\n /** Overridden in a test to write files that are not on a disk. */\n static readonly SOURCE = new InjectionToken<NativeFiles | null>(\n 'angular-native.fileSystemSource',\n {\n factory: () => {\n const expo = expoModule(\n 'expo-file-system',\n () => require('expo-file-system') as typeof import('expo-file-system'),\n );\n if (!expo) return null;\n return {\n // Both are getters on Expo's side, handing back a fresh Directory each time.\n get cacheDirectory() {\n return expo.Paths.cache;\n },\n get documentDirectory() {\n return expo.Paths.document;\n },\n file: (directory, name) =>\n new expo.File(directory as InstanceType<typeof expo.Directory>, name),\n fileAt: (uri) => new expo.File(uri),\n };\n },\n },\n );\n\n private readonly native = inject(FileSystem.SOURCE);\n\n /** A file the system may delete when the device runs low on storage. */\n cache(name: string): NativeFile {\n const native = this.installed();\n return native.file(native.cacheDirectory, name);\n }\n\n /** A file that survives, and is included in backups. */\n document(name: string): NativeFile {\n const native = this.installed();\n return native.file(native.documentDirectory, name);\n }\n\n /**\n * The file at a uri: a document the user picked, a photo from the library, a download. What a\n * picker answers with is a uri, and this is the file to read from it.\n */\n file(uri: string): NativeFile {\n const native = this.installed();\n if (!native.fileAt) {\n throw new Error(\n '[angular-native] this FileSystem.SOURCE has no fileAt(uri), which file() opens a uri with.',\n );\n }\n return native.fileAt(uri);\n }\n\n /**\n * Write text, or bytes for anything that is not text, whether or not the file is there already.\n * `write` alone throws on a file that has never been created, which is the first thing everyone\n * hits. It replaces what was there.\n */\n write(file: NativeFile, content: string | Uint8Array): void {\n if (!file.exists) file.create({ intermediates: true });\n file.write(content);\n }\n\n private installed(): NativeFiles {\n if (!this.native) {\n throw unavailable('expo-file-system', 'Provide FileSystem.SOURCE with a stand-in.');\n }\n return this.native;\n }\n}\n"]}
1
+ {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../src/file-system.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;;AAmCtD;;;;;;GAMG;AAEH,MAAM,OAAO,UAAU;IACrB,kEAAkE;IAClE,MAAM,CAAU,MAAM,GAAG,IAAI,cAAc,CACzC,iCAAiC,EACjC;QACE,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,IAAI,GAAG,UAAU,CACrB,kBAAkB,EAClB,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAsC,CACvE,CAAC;YACF,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO;gBACL,6EAA6E;gBAC7E,IAAI,cAAc;oBAChB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC1B,CAAC;gBACD,IAAI,iBAAiB;oBACnB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAC7B,CAAC;gBACD,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CACxB,IAAI,IAAI,CAAC,IAAI,CAAC,SAAgD,EAAE,IAAI,CAAC;gBACvE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;aACpC,CAAC;QACJ,CAAC;KACF,CACF,CAAC;IAEe,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAEpD,wEAAwE;IACxE,KAAK,CAAC,IAAY;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,wDAAwD;IACxD,QAAQ,CAAC,IAAY;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,GAAW;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAgB,EAAE,OAA4B;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;;YACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC,kBAAkB,EAAE,4CAA4C,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;uGAxEU,UAAU;wGAAV,UAAU;;2FAAV,UAAU;kBADtB,OAAO","sourcesContent":["/**\n * `FileSystem`, bound to `expo-file-system`.\n *\n * Files located by what they are for rather than by path. `File` and `Paths` are Expo's own\n * classes over a native one, so they are used as published; this only decides which directory a\n * name lands in and hands the file back.\n */\nimport { InjectionToken, Service, inject } from '@angular/core';\nimport { expoModule, unavailable } from './native.ts';\n\n/**\n * A file. Structural on purpose: this is Expo's `File`, described in terms a test can satisfy, so\n * a fake needs no Expo. An app gets the real object back and may use the rest of its surface.\n */\nexport interface NativeFile {\n readonly uri: string;\n readonly exists: boolean;\n readonly size: number;\n create(options?: { overwrite?: boolean; intermediates?: boolean }): void;\n /** Synchronous up to SDK 57. From SDK 58 it answers a promise, and `writeSync` is synchronous. */\n write(content: string | Uint8Array): void;\n writeSync?(content: string | Uint8Array): void;\n text(): Promise<string>;\n textSync(): string;\n /** The contents as bytes: a PDF, an image, anything that is not text. */\n bytes(): Promise<Uint8Array>;\n delete(): void;\n}\n\n/** A directory, as far as this needs to know: something a file can be named inside. */\nexport type NativeDirectory = object;\n\n/** The slice of `expo-file-system` this needs. */\nexport interface NativeFiles {\n /** Cleared by the system under storage pressure. */\n readonly cacheDirectory: NativeDirectory;\n /** Survives, and is backed up. */\n readonly documentDirectory: NativeDirectory;\n file(directory: NativeDirectory, name: string): NativeFile;\n /** The file at a uri, such as one a picker answers with. */\n fileAt?(uri: string): NativeFile;\n}\n\n/**\n * The two directories an app actually chooses between, plus the create-then-write dance that\n * writing a file for the first time needs.\n *\n * ponytail: a locator, not a file API. Everything else - moving, listing, downloading, streaming\n * - is on the object this hands back, documented by Expo, and not worth restating here.\n */\n@Service()\nexport class FileSystem {\n /** Overridden in a test to write files that are not on a disk. */\n static readonly SOURCE = new InjectionToken<NativeFiles | null>(\n 'angular-native.fileSystemSource',\n {\n factory: () => {\n const expo = expoModule(\n 'expo-file-system',\n () => require('expo-file-system') as typeof import('expo-file-system'),\n );\n if (!expo) return null;\n return {\n // Both are getters on Expo's side, handing back a fresh Directory each time.\n get cacheDirectory() {\n return expo.Paths.cache;\n },\n get documentDirectory() {\n return expo.Paths.document;\n },\n file: (directory, name) =>\n new expo.File(directory as InstanceType<typeof expo.Directory>, name),\n fileAt: (uri) => new expo.File(uri),\n };\n },\n },\n );\n\n private readonly native = inject(FileSystem.SOURCE);\n\n /** A file the system may delete when the device runs low on storage. */\n cache(name: string): NativeFile {\n const native = this.installed();\n return native.file(native.cacheDirectory, name);\n }\n\n /** A file that survives, and is included in backups. */\n document(name: string): NativeFile {\n const native = this.installed();\n return native.file(native.documentDirectory, name);\n }\n\n /**\n * The file at a uri: a document the user picked, a photo from the library, a download. What a\n * picker answers with is a uri, and this is the file to read from it.\n */\n file(uri: string): NativeFile {\n const native = this.installed();\n if (!native.fileAt) {\n throw new Error(\n '[angular-native] this FileSystem.SOURCE has no fileAt(uri), which file() opens a uri with.',\n );\n }\n return native.fileAt(uri);\n }\n\n /**\n * Write text, or bytes for anything that is not text, whether or not the file is there already.\n * `write` alone throws on a file that has never been created, which is the first thing everyone\n * hits. It replaces what was there, and has written by the time it returns: from SDK 58 through\n * `writeSync`, since `write` there answers a promise.\n */\n write(file: NativeFile, content: string | Uint8Array): void {\n if (!file.exists) file.create({ intermediates: true });\n if (file.writeSync) file.writeSync(content);\n else file.write(content);\n }\n\n private installed(): NativeFiles {\n if (!this.native) {\n throw unavailable('expo-file-system', 'Provide FileSystem.SOURCE with a stand-in.');\n }\n return this.native;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-native/expo",
3
- "version": "0.17.0",
3
+ "version": "0.17.1",
4
4
  "description": "Expo modules as Angular services for Angular Native, plus registerExpoView for a module's native view.",
5
5
  "keywords": [
6
6
  "angular",
@@ -221,8 +221,8 @@
221
221
  "access": "public"
222
222
  },
223
223
  "dependencies": {
224
- "@ng-native/device": "0.17.0",
225
- "@ng-native/fabric": "0.17.0"
224
+ "@ng-native/device": "0.17.1",
225
+ "@ng-native/fabric": "0.17.1"
226
226
  },
227
227
  "nx": {
228
228
  "tags": [
@@ -237,49 +237,49 @@
237
237
  },
238
238
  "peerDependencies": {
239
239
  "@angular/core": "^22.0.0",
240
- "@expo/ui": "^57.0.0",
240
+ "@expo/ui": "^57.0.0 || ^58.0.0",
241
241
  "@react-native-async-storage/async-storage": "^2.2.0 || ^3.0.0",
242
- "expo": "^57.0.0",
243
- "expo-apple-authentication": "^57.0.0",
244
- "expo-application": "^57.0.0",
245
- "expo-asset": "^57.0.0",
246
- "expo-audio": "^57.0.0",
247
- "expo-background-task": "^57.0.0",
248
- "expo-battery": "^57.0.0",
249
- "expo-brightness": "^57.0.0",
250
- "expo-camera": "^57.0.0",
251
- "expo-clipboard": "^57.0.0",
252
- "expo-crypto": "^57.0.0",
253
- "expo-device": "^57.0.0",
254
- "expo-document-picker": "^57.0.0",
255
- "expo-file-system": "^57.0.0",
242
+ "expo": "^57.0.0 || ^58.0.0",
243
+ "expo-apple-authentication": "^57.0.0 || ^58.0.0",
244
+ "expo-application": "^57.0.0 || ^58.0.0",
245
+ "expo-asset": "^57.0.0 || ^58.0.0",
246
+ "expo-audio": "^57.0.0 || ^58.0.0",
247
+ "expo-background-task": "^57.0.0 || ^58.0.0",
248
+ "expo-battery": "^57.0.0 || ^58.0.0",
249
+ "expo-brightness": "^57.0.0 || ^58.0.0",
250
+ "expo-camera": "^57.0.0 || ^58.0.0",
251
+ "expo-clipboard": "^57.0.0 || ^58.0.0",
252
+ "expo-crypto": "^57.0.0 || ^58.0.0",
253
+ "expo-device": "^57.0.0 || ^58.0.0",
254
+ "expo-document-picker": "^57.0.0 || ^58.0.0",
255
+ "expo-file-system": "^57.0.0 || ^58.0.0",
256
256
  "expo-foldables": "^0.1.0",
257
- "expo-font": "^57.0.0",
258
- "expo-haptics": "^57.0.0",
259
- "expo-image-manipulator": "^57.0.0",
260
- "expo-image-picker": "^57.0.0",
261
- "expo-keep-awake": "^57.0.0",
262
- "expo-local-authentication": "^57.0.0",
257
+ "expo-font": "^57.0.0 || ^58.0.0",
258
+ "expo-haptics": "^57.0.0 || ^58.0.0",
259
+ "expo-image-manipulator": "^57.0.0 || ^58.0.0",
260
+ "expo-image-picker": "^57.0.0 || ^58.0.0",
261
+ "expo-keep-awake": "^57.0.0 || ^58.0.0",
262
+ "expo-local-authentication": "^57.0.0 || ^58.0.0",
263
263
  "expo-local-llm": "^0.8.1",
264
- "expo-localization": "^57.0.0",
265
- "expo-location": "^57.0.0",
266
- "expo-maps": "^57.0.0",
267
- "expo-media-library": "^57.0.0",
268
- "expo-modules-core": "^57.0.0",
269
- "expo-network": "^57.0.0",
270
- "expo-notifications": "^57.0.0",
271
- "expo-screen-capture": "^57.0.0",
272
- "expo-screen-orientation": "^57.0.0",
273
- "expo-secure-store": "^57.0.0",
274
- "expo-sensors": "^57.0.0",
275
- "expo-splash-screen": "^57.0.0",
276
- "expo-sqlite": "^57.0.0",
277
- "expo-store-review": "^57.0.0",
278
- "expo-tracking-transparency": "^57.0.0",
279
- "expo-updates": "^57.0.0",
280
- "expo-video": "^57.0.0",
281
- "expo-web-browser": "^57.0.0",
282
- "expo-widgets": "^57.0.0",
264
+ "expo-localization": "^57.0.0 || ^58.0.0",
265
+ "expo-location": "^57.0.0 || ^58.0.0",
266
+ "expo-maps": "^57.0.0 || ^58.0.0",
267
+ "expo-media-library": "^57.0.0 || ^58.0.0",
268
+ "expo-modules-core": "^57.0.0 || ^58.0.0",
269
+ "expo-network": "^57.0.0 || ^58.0.0",
270
+ "expo-notifications": "^57.0.0 || ^58.0.0",
271
+ "expo-screen-capture": "^57.0.0 || ^58.0.0",
272
+ "expo-screen-orientation": "^57.0.0 || ^58.0.0",
273
+ "expo-secure-store": "^57.0.0 || ^58.0.0",
274
+ "expo-sensors": "^57.0.0 || ^58.0.0",
275
+ "expo-splash-screen": "^57.0.0 || ^58.0.0",
276
+ "expo-sqlite": "^57.0.0 || ^58.0.0",
277
+ "expo-store-review": "^57.0.0 || ^58.0.0",
278
+ "expo-tracking-transparency": "^57.0.0 || ^58.0.0",
279
+ "expo-updates": "^57.0.0 || ^58.0.0",
280
+ "expo-video": "^57.0.0 || ^58.0.0",
281
+ "expo-web-browser": "^57.0.0 || ^58.0.0",
282
+ "expo-widgets": "^57.0.0 || ^58.0.0",
283
283
  "react-native": ">=0.86.0",
284
284
  "react-native-watch-connectivity": "^2.0.0"
285
285
  },