react-native-acoustic-connect-beta 18.0.34 → 18.0.35

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/CHANGELOG.md CHANGED
@@ -1,3 +1,4 @@
1
+ ## [18.0.35](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/compare/18.0.34...18.0.35) (2026-06-15)
1
2
  ## [18.0.34](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/compare/18.0.33...18.0.34) (2026-06-15)
2
3
  ## [18.0.33](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/compare/18.0.32...18.0.33) (2026-06-15)
3
4
  <!--
package/README.md CHANGED
@@ -15,8 +15,9 @@ For the full product overview see the
15
15
  - Node 20 or newer
16
16
  - iOS deployment target ≥ 15.1, AcousticConnect / AcousticConnectDebug pod ≥ 2.0.5
17
17
  - Android `minSdk` ≥ 26, `compileSdk` ≥ 35, `io.github.go-acoustic:connect` in `[11.0.11, 12.0.0)`
18
- - **Expo is not supported by this package.** Expo apps should use the sibling
19
- Config Plugin (shipped separately).
18
+ - **Expo SDK 55+ is supported** via the bundled Expo Config Plugin
19
+ development builds only (Expo Go is not supported); see
20
+ [Using with Expo SDK 55+](#using-with-expo-sdk-55).
20
21
 
21
22
  ### Nitro version pin
22
23
 
@@ -83,6 +84,94 @@ Field summary (see [API reference](#api-reference) for full semantics):
83
84
  | `iOSAppGroupIdentifier` | `null` | iOS App Group shared with the Notification Service / Notification Content extension. |
84
85
  | `AndroidNotificationIconResName` | `null` | Drawable resource name (no extension) for the Android notification small icon. |
85
86
 
87
+ ## Using with Expo SDK 55+
88
+
89
+ Expo SDK 55 and newer is supported via the bundled Expo Config Plugin.
90
+ **Development builds only** — Expo Go is not supported: Nitro Modules and
91
+ native push registration require native code that Expo Go cannot load. There
92
+ is no runtime Expo Go detection or fallback; use
93
+ [`expo-dev-client`](https://docs.expo.dev/develop/development-builds/introduction/)
94
+ or EAS Build.
95
+
96
+ ### Install
97
+
98
+ ```bash
99
+ npx create-expo-app@latest my-app # Expo SDK 55+, new architecture enabled
100
+ cd my-app
101
+ npx expo install expo-dev-client expo-build-properties
102
+ npm install react-native-acoustic-connect-beta react-native-nitro-modules
103
+ ```
104
+
105
+ `expo-build-properties` is needed to raise Android `minSdkVersion` to 26
106
+ (the Connect Android SDK floor — Expo templates default to a lower value):
107
+
108
+ ```json
109
+ {
110
+ "expo": {
111
+ "plugins": [
112
+ ["expo-build-properties", { "android": { "minSdkVersion": 26 } }]
113
+ ]
114
+ }
115
+ }
116
+ ```
117
+
118
+ ### Configure
119
+
120
+ 1. Put `ConnectConfig.json` at the project root — the same file documented in
121
+ [Installation](#installation). For push, set `PushEnabled`, `iOSPushMode`,
122
+ and `iOSAppGroupIdentifier` in the `Connect` block.
123
+
124
+ 2. Add the plugin to `app.json`:
125
+
126
+ ```json
127
+ {
128
+ "expo": {
129
+ "plugins": ["react-native-acoustic-connect-beta"]
130
+ }
131
+ }
132
+ ```
133
+
134
+ The plugin reads the App Group from `Connect.iOSAppGroupIdentifier` in
135
+ `ConnectConfig.json` — the same value the SDK reads at runtime, so the
136
+ entitlement and the runtime config agree by construction. To use a different
137
+ value for the entitlement only (rarely needed), pass a plugin prop; the prop
138
+ takes precedence over `ConnectConfig.json`:
139
+
140
+ ```json
141
+ {
142
+ "expo": {
143
+ "plugins": [
144
+ [
145
+ "react-native-acoustic-connect-beta",
146
+ { "iosAppGroupIdentifier": "group.com.example.myapp" }
147
+ ]
148
+ ]
149
+ }
150
+ }
151
+ ```
152
+
153
+ ### Build
154
+
155
+ ```bash
156
+ npx expo prebuild
157
+ npx expo run:ios # or: eas build --profile development --platform ios
158
+ npx expo run:android # or: eas build --profile development --platform android
159
+ ```
160
+
161
+ During `expo prebuild` the plugin automatically:
162
+
163
+ - adds a `ConnectNSE` Notification Service Extension target to the Xcode
164
+ project (rich-media push attachments + delivery tracking), with
165
+ `NotificationService.swift` generated from the SDK template;
166
+ - adds the App Group entitlement to both the host app and the NSE;
167
+ - appends a `ConnectNSE` target to the generated `Podfile` that links the
168
+ same Connect SDK pod as the app.
169
+
170
+ Re-running `expo prebuild` — with or without `--clean` — is idempotent: no
171
+ duplicate targets, entitlements, or Podfile entries.
172
+
173
+ A working example lives in [`Examples/expo`](Examples/expo).
174
+
86
175
  ## Quick start
87
176
 
88
177
  ### 1. Initialise the SDK
@@ -1,4 +1,4 @@
1
- #Mon Jun 15 05:05:53 PDT 2026
1
+ #Mon Jun 15 05:39:24 PDT 2026
2
2
  UseWhiteList=true
3
3
  PrintScreen=3
4
4
  UseRandomSample=false
package/app.plugin.js ADDED
@@ -0,0 +1,15 @@
1
+ // Copyright (C) 2026 Acoustic, L.P. All rights reserved.
2
+ //
3
+ // Thin entry shim for the Expo Config Plugin.
4
+ //
5
+ // Expo resolves the plugin from the package root via the `expo.plugins` field
6
+ // in app.json. This file delegates directly to the compiled plugin build so
7
+ // that Expo's Node.js environment (CommonJS) loads it correctly.
8
+ //
9
+ // The plugin composition is defined in plugin/src/index.ts and compiled to
10
+ // plugin/build/index.js (CommonJS) by `npm run build:plugin`.
11
+ //
12
+ // To add a new mod (e.g. withConnectNCE from CA-143488), extend the `mods`
13
+ // array in plugin/src/index.ts — do not modify this shim.
14
+
15
+ module.exports = require('./plugin/build/index').default
package/package.json CHANGED
@@ -8,6 +8,8 @@
8
8
  },
9
9
  "description": "BETA: React native plugin for Acoustic Connect",
10
10
  "devDependencies": {
11
+ "@expo/config-plugins": "~55.0.10",
12
+ "@expo/config-types": "^55.0.5",
11
13
  "@jamesacarr/eslint-formatter-github-actions": "^0.2.0",
12
14
  "@release-it/bumper": "^7.0.1",
13
15
  "@release-it/conventional-changelog": "^10.0.0",
@@ -71,6 +73,9 @@
71
73
  "ios/**/*.swift",
72
74
  "ios/AcousticConnectRNConfig.json",
73
75
  "app.plugin.js",
76
+ "plugin/build",
77
+ "plugin/swift",
78
+ "plugin/src",
74
79
  "*.podspec",
75
80
  "README.md",
76
81
  "CHANGELOG.md",
@@ -98,10 +103,16 @@
98
103
  "module": "./lib/module/index.js",
99
104
  "name": "react-native-acoustic-connect-beta",
100
105
  "peerDependencies": {
106
+ "@expo/config-plugins": ">=55.0.0",
101
107
  "react": ">=19.1.1 <20.0.0",
102
108
  "react-native": ">=0.82.0 <0.86.0",
103
109
  "react-native-nitro-modules": "0.35.9"
104
110
  },
111
+ "peerDependenciesMeta": {
112
+ "@expo/config-plugins": {
113
+ "optional": true
114
+ }
115
+ },
105
116
  "prettier": {
106
117
  "quoteProps": "consistent",
107
118
  "semi": false,
@@ -184,11 +195,14 @@
184
195
  "scripts": {
185
196
  "applyConfiguration": "node scripts/applyConfiguration.js $INIT_CWD",
186
197
  "build": "npm run typecheck && bob build",
198
+ "build:plugin": "tsc -p plugin/tsconfig.json",
187
199
  "codegen": "nitrogen --logLevel=\"debug\" && npm run build && node post-script.js",
188
200
  "postinstall": "./scripts/postInstallScripts.sh",
201
+ "prepack": "npm run build:plugin",
189
202
  "rebuild": "npm run codegen && npm run rebuildExample --prefix ./example",
190
203
  "release": "release-it",
191
204
  "test": "echo \"Error: no test specified\" && exit 1",
205
+ "test:plugin": "npm run build:plugin && node --test plugin/__tests__/",
192
206
  "typecheck": "tsc --noEmit",
193
207
  "verifyConnectSetup": "node scripts/verifyConnectSetup.js $INIT_CWD",
194
208
  "yalcPublish": "npm run rebuild && yalc publish"
@@ -196,7 +210,7 @@
196
210
  "source": "src/index",
197
211
  "summary": "react-native ios android tealeaf connect cxa wxca er enhanced-replay",
198
212
  "types": "./lib/typescript/src/index.d.ts",
199
- "version": "18.0.34",
213
+ "version": "18.0.35",
200
214
  "workspaces": [
201
215
  "example",
202
216
  "Examples/bare-workflow"
@@ -0,0 +1,22 @@
1
+ import { type ConfigPlugin } from '@expo/config-plugins';
2
+ import { withConnectNSE, type ConnectPluginProps } from './withConnectNSE';
3
+ /**
4
+ * Expo Config Plugin for react-native-acoustic-connect-beta.
5
+ *
6
+ * Provisions the ConnectNSE Notification Service Extension target during
7
+ * `expo prebuild`. Designed as a chainable composition: additional mods
8
+ * (e.g. withConnectNCE from CA-143488) are appended by adding to the mods
9
+ * array without touching this file.
10
+ *
11
+ * Consumer app.json usage:
12
+ * // With explicit App Group override:
13
+ * ["react-native-acoustic-connect-beta", { "iosAppGroupIdentifier": "group.com.example.app" }]
14
+ *
15
+ * // Without props (reads from ConnectConfig.json):
16
+ * "react-native-acoustic-connect-beta"
17
+ */
18
+ declare const withAcousticConnect: ConfigPlugin<ConnectPluginProps | void>;
19
+ export default withAcousticConnect;
20
+ export { withConnectNSE };
21
+ export type { ConnectPluginProps };
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1E;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,mBAAmB,EAAE,YAAY,CAAC,kBAAkB,GAAG,IAAI,CAWhE,CAAA;AAED,eAAe,mBAAmB,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,CAAA;AACzB,YAAY,EAAE,kBAAkB,EAAE,CAAA"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ // Copyright (C) 2026 Acoustic, L.P. All rights reserved.
3
+ //
4
+ // NOTICE: This file contains material that is confidential and proprietary to
5
+ // Acoustic, L.P. and/or other developers. No license is granted under any
6
+ // intellectual or industrial property rights of Acoustic, L.P. except as may
7
+ // be provided in an agreement with Acoustic, L.P. Any unauthorized copying or
8
+ // distribution of content from this file is prohibited.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.withConnectNSE = void 0;
11
+ const withConnectNSE_1 = require("./withConnectNSE");
12
+ Object.defineProperty(exports, "withConnectNSE", { enumerable: true, get: function () { return withConnectNSE_1.withConnectNSE; } });
13
+ /**
14
+ * Expo Config Plugin for react-native-acoustic-connect-beta.
15
+ *
16
+ * Provisions the ConnectNSE Notification Service Extension target during
17
+ * `expo prebuild`. Designed as a chainable composition: additional mods
18
+ * (e.g. withConnectNCE from CA-143488) are appended by adding to the mods
19
+ * array without touching this file.
20
+ *
21
+ * Consumer app.json usage:
22
+ * // With explicit App Group override:
23
+ * ["react-native-acoustic-connect-beta", { "iosAppGroupIdentifier": "group.com.example.app" }]
24
+ *
25
+ * // Without props (reads from ConnectConfig.json):
26
+ * "react-native-acoustic-connect-beta"
27
+ */
28
+ const withAcousticConnect = (config, props) => {
29
+ const resolvedProps = props != null && typeof props === 'object' ? props : {};
30
+ // Chainable composition array — CA-143488 appends withConnectNCE here.
31
+ const mods = [withConnectNSE_1.withConnectNSE];
32
+ return mods.reduce((accConfig, mod) => mod(accConfig, resolvedProps), config);
33
+ };
34
+ exports.default = withAcousticConnect;
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,yDAAyD;AACzD,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,8EAA8E;AAC9E,wDAAwD;;;AAGxD,qDAA0E;AA+BjE,+FA/BA,+BAAc,OA+BA;AA7BvB;;;;;;;;;;;;;;GAcG;AACH,MAAM,mBAAmB,GAA4C,CACnE,MAAM,EACN,KAAK,EACL,EAAE;IACF,MAAM,aAAa,GACjB,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAEzD,uEAAuE;IACvE,MAAM,IAAI,GAA4C,CAAC,+BAAc,CAAC,CAAA;IAEtE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAA;AAC/E,CAAC,CAAA;AAED,kBAAe,mBAAmB,CAAA"}
@@ -0,0 +1,95 @@
1
+ import { type ConfigPlugin } from '@expo/config-plugins';
2
+ import type { ExpoConfig } from '@expo/config-types';
3
+ export interface ConnectPluginProps {
4
+ /** Explicit App Group override. Wins over ConnectConfig.json when set. */
5
+ iosAppGroupIdentifier?: string;
6
+ }
7
+ /**
8
+ * Validates an App Group identifier against Apple's format and returns it.
9
+ * Throws an actionable error otherwise.
10
+ */
11
+ export declare function assertValidAppGroup(value: string, source: string): string;
12
+ /**
13
+ * Resolves the iOS App Group identifier used by ConnectNSE.
14
+ *
15
+ * Priority:
16
+ * 1. `iosAppGroupIdentifier` plugin prop in app.json (explicit override)
17
+ * 2. `Connect.iOSAppGroupIdentifier` in `<projectRoot>/ConnectConfig.json`
18
+ *
19
+ * The resolved value is validated against Apple's App Group format. Throws a
20
+ * clear, actionable error if neither source provides the value, or if the
21
+ * provided value is malformed.
22
+ */
23
+ export declare function resolveAppGroupIdentifier(projectRoot: string, props: ConnectPluginProps): string;
24
+ /**
25
+ * Returns the content of `plugin/swift/NotificationService.swift` with the
26
+ * placeholder replaced by the resolved App Group identifier and a generated
27
+ * header prepended.
28
+ */
29
+ export declare function substituteSwiftTemplate(templatePath: string, appGroupIdentifier: string): string;
30
+ /**
31
+ * Generates the Info.plist content for the ConnectNSE target.
32
+ *
33
+ * RCTNewArchEnabled is intentionally omitted: the NSE links the Connect SDK
34
+ * only — no React Native runtime is present in the extension process.
35
+ */
36
+ export declare function buildNSEInfoPlist(): string;
37
+ /** Generates the entitlements plist content for the ConnectNSE target. */
38
+ export declare function buildNSEEntitlements(appGroupIdentifier: string): string;
39
+ /**
40
+ * Returns the Ruby snippet to inject into the Expo-generated Podfile.
41
+ *
42
+ * Tolerates a missing ConnectConfig.json or a missing `Connect` key: when
43
+ * the file or key is absent the block defaults to AcousticConnectDebug with
44
+ * floor '>= 2.1.12' and no version pin, so prop-only setups (no
45
+ * ConnectConfig.json) keep working. If the file exists but contains invalid
46
+ * JSON, `pod install` will print a warning and use the same defaults rather
47
+ * than crashing.
48
+ */
49
+ export declare function buildPodfileBlock(): string;
50
+ /**
51
+ * Injects the ConnectNSE Podfile block into `podfileContent` if not already
52
+ * present (idempotent, guarded by PODFILE_MARKER).
53
+ */
54
+ export declare function injectPodfileBlock(podfileContent: string): string;
55
+ /**
56
+ * Adds the App Group to the HOST app's entitlements. Merges idempotently
57
+ * — never clobbers an existing `com.apple.security.application-groups` array.
58
+ */
59
+ export declare function withNSEEntitlements(config: ExpoConfig, appGroupIdentifier: string): ExpoConfig;
60
+ /**
61
+ * Adds the ConnectNSE Xcode target (app_extension) to the project.
62
+ *
63
+ * Follows the OneSignal plugin pattern (withOneSignalNSE.ts) using the
64
+ * `xcode` API exposed via `config.modResults`.
65
+ *
66
+ * Idempotent: if a target named ConnectNSE already exists, skips target
67
+ * creation but still (re)writes the source files.
68
+ */
69
+ export declare function withNSEXcodeProject(config: ExpoConfig, appGroupIdentifier: string, swiftContent: string): ExpoConfig;
70
+ /**
71
+ * Injects the ConnectNSE Podfile target block via withDangerousMod.
72
+ * Guarded by a marker comment — re-runs are no-ops.
73
+ *
74
+ * M5: throws a clear, actionable error when the Podfile does not exist at
75
+ * mod-execution time, instead of silently returning — a silent skip would
76
+ * ship an NSE whose `import Connect` cannot resolve.
77
+ */
78
+ export declare function withNSEPodfile(config: ExpoConfig): ExpoConfig;
79
+ /**
80
+ * Expo Config Plugin mod that provisions a Notification Service Extension
81
+ * (NSE) Xcode target named `ConnectNSE`.
82
+ *
83
+ * Applies three mutations — all idempotent:
84
+ * 1. Host app entitlements: merges App Group into
85
+ * `com.apple.security.application-groups`.
86
+ * 2. Xcode project: adds ConnectNSE target + files (skips if already present).
87
+ * 3. Podfile: injects `target 'ConnectNSE'` block (guarded by marker comment).
88
+ *
89
+ * M4: `config._internal.projectRoot` is required. If absent (i.e. invoked
90
+ * outside Expo CLI), an actionable error is thrown rather than silently
91
+ * falling back to `process.cwd()`, which would misresolve ConnectConfig.json
92
+ * in monorepo setups.
93
+ */
94
+ export declare const withConnectNSE: ConfigPlugin<ConnectPluginProps>;
95
+ //# sourceMappingURL=withConnectNSE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withConnectNSE.d.ts","sourceRoot":"","sources":["../src/withConnectNSE.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAapD,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAUD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,kBAAkB,GACxB,MAAM,CAsCR;AAQD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,GACzB,MAAM,CAOR;AAID;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAiC1C;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAYvE;AAOD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA4B1C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAKjE;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,kBAAkB,EAAE,MAAM,GACzB,UAAU,CAcZ;AAkFD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,kBAAkB,EAAE,MAAM,EAC1B,YAAY,EAAE,MAAM,GACnB,UAAU,CA+MZ;AAID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAuB7D;AAID;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,kBAAkB,CAgC3D,CAAA"}