@hawcx/react-native-sdk 1.0.1 → 1.0.2

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 (39) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/HawcxReactNative.podspec +2 -2
  3. package/LICENSE +48 -15
  4. package/README.md +150 -88
  5. package/docs/RELEASE.md +2 -2
  6. package/example/ios/HawcxExampleApp.xcodeproj/project.pbxproj +57 -57
  7. package/example/ios/HawcxExampleApp.xcodeproj/project.xcworkspace/xcuserdata/agambhullar.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/example/ios/Podfile +24 -0
  9. package/example/ios/Podfile.lock +3 -3
  10. package/example/package-lock.json +3 -3
  11. package/example/package.json +1 -1
  12. package/example/src/App.tsx +211 -8
  13. package/example/src/hawcx.config.ts +4 -26
  14. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64/HawcxFramework.framework/HawcxFramework +0 -0
  15. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/arm64-apple-ios.abi.json +208 -77
  16. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/arm64-apple-ios.private.swiftinterface +10 -0
  17. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  18. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/arm64-apple-ios.swiftinterface +10 -0
  19. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/HawcxFramework +0 -0
  20. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/arm64-apple-ios-simulator.abi.json +208 -77
  21. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +10 -0
  22. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  23. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/arm64-apple-ios-simulator.swiftinterface +10 -0
  24. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/x86_64-apple-ios-simulator.abi.json +208 -77
  25. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +10 -0
  26. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  27. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/Modules/HawcxFramework.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +10 -0
  28. package/ios/Frameworks/HawcxFramework.xcframework/ios-arm64_x86_64-simulator/HawcxFramework.framework/_CodeSignature/CodeResources +20 -20
  29. package/ios/HawcxReactNative.swift +64 -0
  30. package/lib/commonjs/index.js +34 -0
  31. package/lib/commonjs/index.js.map +1 -1
  32. package/lib/module/index.js +33 -0
  33. package/lib/module/index.js.map +1 -1
  34. package/lib/typescript/index.d.ts +28 -0
  35. package/lib/typescript/index.d.ts.map +1 -1
  36. package/package.json +1 -1
  37. package/react_mobile_sdk_plan.md +2 -0
  38. package/src/__tests__/index.test.ts +40 -1
  39. package/src/index.ts +66 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.0.2] - YYYY-MM-DD
4
+ - OAuth flow update
5
+ - Android release prep
6
+
3
7
  ## [1.0.1] - 2025-11-17
4
8
  - Point native Android/iOS SDKs at new production authentication endpoint
5
9
  - Refresh bundled Hawcx Android/iOS binaries for the 1.0.1 cut
@@ -7,4 +11,4 @@
7
11
 
8
12
  ## [0.0.1] - 2025-11-15
9
13
  - Initial React Native bridge for Hawcx V5 authentication
10
- - Added HawcxClient helpers, hooks, push support, and example app
14
+ - Added HawcxClient helpers, hooks, push support, and example app
@@ -9,10 +9,10 @@ Pod::Spec.new do |s|
9
9
  Production-grade React Native bridge that wraps HawcxFramework (iOS) to expose
10
10
  V5 authentication, OTP, push, and web session flows to JavaScript callers.
11
11
  DESC
12
- s.homepage = 'https://github.com/hawcx/react-native-sdk'
12
+ s.homepage = 'https://github.com/hawcx/reactnative_sdk'
13
13
  s.license = { :type => 'MIT', :file => 'LICENSE' }
14
14
  s.author = { 'Hawcx Engineering' => 'engineering@hawcx.com' }
15
- s.source = { :git => 'https://github.com/hawcx/react-native-sdk.git', :tag => "v#{s.version}" }
15
+ s.source = { :git => 'https://github.com/hawcx/reactnative_sdk.git', :tag => "v#{s.version}" }
16
16
 
17
17
  s.platform = :ios, '17.5'
18
18
  s.swift_version = '5.9'
package/LICENSE CHANGED
@@ -1,21 +1,54 @@
1
- MIT License
1
+ Hawcx Proprietary License
2
2
 
3
- Copyright (c) 2025 Hawcx
3
+ Copyright (c) 2025 Hawcx, Inc. All Rights Reserved.
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
5
+ GRANT OF LICENSE
11
6
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
7
+ Subject to the terms and conditions of this License, Hawcx, Inc. ("Hawcx")
8
+ grants to authorized clients ("Licensee") a limited, non-exclusive,
9
+ non-transferable, non-sublicensable license to use this software and
10
+ associated documentation files (the "Software") solely for:
11
+
12
+ 1. Proof of Concept (POC) evaluation purposes, or
13
+ 2. Commercial use in production environments as explicitly authorized by Hawcx
14
+
15
+ RESTRICTIONS
16
+
17
+ Licensee shall NOT:
18
+ - Modify, alter, or create derivative works of the Software
19
+ - Distribute, sublicense, lease, rent, or transfer the Software to any third party
20
+ - Reverse engineer, decompile, or disassemble the Software
21
+ - Remove or alter any proprietary notices, labels, or marks on the Software
22
+ - Use the Software for any purpose other than as expressly authorized
23
+
24
+ AUTHORIZATION REQUIRED
25
+
26
+ Use of this Software requires explicit written authorization from Hawcx.
27
+ Unauthorized use, reproduction, or distribution is strictly prohibited and
28
+ may result in severe civil and criminal penalties.
29
+
30
+ OWNERSHIP
31
+
32
+ Hawcx retains all right, title, and interest in and to the Software,
33
+ including all intellectual property rights. This License does not grant
34
+ Licensee any ownership rights to the Software.
35
+
36
+ TERMINATION
37
+
38
+ This License is effective until terminated. Hawcx may terminate this License
39
+ immediately if Licensee fails to comply with any term hereof. Upon termination,
40
+ Licensee must destroy all copies of the Software.
41
+
42
+ WARRANTY DISCLAIMER
14
43
 
15
44
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
45
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
46
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
47
+
48
+ LIMITATION OF LIABILITY
49
+
50
+ IN NO EVENT SHALL HAWCX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
51
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
52
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
53
+
54
+ For licensing inquiries, contact: info@hawcx.com
package/README.md CHANGED
@@ -1,109 +1,171 @@
1
- # Hawcx React Native SDK (iOS)
1
+ # Hawcx React Native SDK
2
2
 
3
- This package provides the React Native wrapper for the Hawcx V5 mobile authentication framework. It reuses the production iOS implementation (`dev_ios/ios_sdk/HawcxFramework`) and exposes a typed JavaScript/TypeScript API for React Native applications.
3
+ Official React Native bindings for the Hawcx V5 mobile authentication platform. The package wraps the production Hawcx iOS and Android SDKs so you can deliver Smart‑Connect (OTP + device trust + push approvals) inside a single cross‑platform API.
4
4
 
5
- ## Repository Layout
6
- - `src/` – TypeScript entry point and public API surface.
7
- - `ios/` – Native bridge sources (Swift) plus the Podspec that embeds `HawcxFramework`.
8
- - `android/` – React Native Android bridge module (Gradle library) plus the bundled Hawcx SDK AAR.
9
- - `example/` – Runnable React Native demo app using the SDK (`npm install` -> `npm run ios`).
10
- - `react_mobile_sdk_plan.md` – Detailed delivery plan and progress tracker. **Always read and update this file when working on the SDK.**
5
+ ## Requirements
11
6
 
12
- ## Scripts
13
- | Command | Description |
14
- | --- | --- |
15
- | `npm run clean` | Removes the build output under `lib/`. |
16
- | `npm run lint` | Runs ESLint using the React Native + TypeScript rules. |
17
- | `npm run typecheck` | Executes the TypeScript compiler in `--noEmit` mode. |
18
- | `npm run build` | Builds distributable bundles via `react-native-builder-bob`. |
7
+ * React Native ≥ 0.73 (Hermes enabled by default)
8
+ * iOS 17+ / Android 8+ (SDK requires API level 26 for Android)
9
+ * OAuth client credentials **must stay on your backend**.
19
10
 
20
- > Note: Dependencies are declared in `package.json` but not yet installed. Install them once local tooling is in place (`npm install`).
11
+ ## Installation
21
12
 
22
- ## Android Module (WIP)
23
- - `android/` hosts the Gradle-based library that React Native autolinks for Android builds. It already references the Hawcx Android SDK via `android/libs/hawcx-5.1.0.aar` and exposes `./gradlew` helpers for linting/publishing.
24
- - Run Gradle tasks from the repo root with `./gradlew -p android <task>` (for example, `./gradlew -p android :hawcxreactnative:lintRelease`). The first invocation requires network/Gradle cache access for AGP + React Native dependencies.
25
- - The bridge mirrors the iOS surface: `initialize`, `authenticate`, OTP/session helpers, push lifecycle (`setApnsDeviceToken` on iOS, `setFcmToken` on Android), and emits the same `hawcx.*` events for auth/session/push updates.
26
- - Android builds require `android/local.properties` pointing at your Android SDK (`sdk.dir=/Users/<you>/Library/Android/sdk`) and target `minSdkVersion` 26 to match the Hawcx AAR.
13
+ ```bash
14
+ npm install @hawcx/react-native-sdk
15
+ # or yarn add @hawcx/react-native-sdk
16
+ ```
17
+
18
+ ### iOS
19
+
20
+ ```
21
+ cd ios
22
+ pod install
23
+ cd ..
24
+ ```
25
+
26
+ Open the workspace (`ios/*.xcworkspace`) in Xcode when you need to run on a device. The pod installs the vendored HawcxFramework.xcframework automatically.
27
+
28
+ ### Android
29
+
30
+ No manual steps are required—Gradle picks up the bundled `hawcx-*.aar`. Make sure the Android SDK is installed and `ANDROID_HOME`/`adb` are on your path, then run `npm run android`.
31
+
32
+ ## Quick Start
33
+
34
+ ```tsx
35
+ import { useEffect } from 'react';
36
+ import { initialize, addAuthListener } from '@hawcx/react-native-sdk';
37
+
38
+ export function bootstrapHawcx() {
39
+ return initialize({ projectApiKey: 'YOUR_PROJECT_API_KEY' }).then(() => {
40
+ const subscription = addAuthListener(event => {
41
+ if (event.type === 'auth_error') {
42
+ console.warn('Hawcx error', event.payload);
43
+ }
44
+ });
45
+ return () => subscription.remove();
46
+ });
47
+ }
48
+ ```
27
49
 
28
- ### Refreshing the Hawcx Android SDK AAR
29
- 1. Build the native Android SDK (`cd ~/dev_android/android_sdk && ./gradlew :app:assembleRelease`).
30
- 2. Copy the generated `app/build/outputs/aar/hawcx-<version>.aar` into `android/libs/`, replacing the existing binary.
31
- 3. Update any documentation or release notes (e.g., `react_mobile_sdk_plan.md`, `CHANGELOG.md`) to reflect the new Hawcx SDK version.
50
+ Call `bootstrapHawcx()` once when your app starts (e.g., inside your root component or Redux saga). After that you can use hooks or imperative helpers to drive Smart‑Connect.
51
+
52
+ ### Authentication flow (OTP + authorization code)
53
+
54
+ The SDK now always returns an authorization code. Your frontend must forward it to your backend, which redeems it with Hawcx using the OAuth client credentials we issued for your project.
55
+
56
+ ```tsx
57
+ import React, { useEffect, useState } from 'react';
58
+ import { useHawcxAuth, storeBackendOAuthTokens } from '@hawcx/react-native-sdk';
59
+
60
+ export function SmartConnectScreen() {
61
+ const { state, authenticate, submitOtp, reset } = useHawcxAuth();
62
+ const [email, setEmail] = useState('');
63
+ const [otp, setOtp] = useState('');
64
+
65
+ useEffect(() => {
66
+ if (state.status === 'authorization_code') {
67
+ void exchangeCode(state.payload).finally(() => reset());
68
+ }
69
+ }, [state, reset]);
70
+
71
+ const exchangeCode = async ({ code, expiresIn }) => {
72
+ const response = await fetch('https://your-backend.example.com/api/hawcx/login', {
73
+ method: 'POST',
74
+ headers: { 'Content-Type': 'application/json' },
75
+ body: JSON.stringify({ email: email.trim(), code, expires_in: expiresIn }),
76
+ });
77
+ if (!response.ok) {
78
+ throw new Error('Backend verification failed');
79
+ }
80
+ const { access_token, refresh_token } = await response.json();
81
+ await storeBackendOAuthTokens(email.trim(), access_token, refresh_token);
82
+ };
83
+
84
+ return (
85
+ <>
86
+ {/* Collect identifier */}
87
+ <Button title="Continue" onPress={() => authenticate(email.trim())} />
88
+
89
+ {state.status === 'otp' && (
90
+ <>
91
+ <TextInput value={otp} onChangeText={setOtp} keyboardType="number-pad" />
92
+ <Button title="Verify OTP" onPress={() => submitOtp(otp)} />
93
+ </>
94
+ )}
95
+
96
+ {state.status === 'authorization_code' && <Text>Sending authorization code…</Text>}
97
+ {state.status === 'additional_verification_required' && (
98
+ <Text>Additional verification required: {state.payload.detail ?? state.payload.sessionId}</Text>
99
+ )}
100
+ {state.status === 'error' && <Text>{state.error.message}</Text>}
101
+ </>
102
+ );
103
+ }
104
+ ```
32
105
 
33
- ## Usage (WIP)
106
+ ### Backend exchange
107
+
108
+ Redeem the authorization code on your server using the hawcx/oauth-client package or your preferred language SDK. Never ship `clientId`, token endpoint, private keys, or Hawcx public keys inside your mobile app.
34
109
 
35
110
  ```ts
36
- import {
37
- initialize,
38
- authenticate,
39
- submitOtp,
40
- addAuthListener,
41
- hawcxClient,
42
- useHawcxAuth,
43
- useHawcxWebLogin,
44
- } from '@hawcx/react-native-sdk';
45
-
46
- await initialize({ projectApiKey: 'YOUR_PROJECT_KEY' });
47
-
48
- const subscription = addAuthListener(event => {
49
- switch (event.type) {
50
- case 'otp_required':
51
- // show OTP UI
52
- break;
53
- case 'auth_success':
54
- console.log('Login success', event.payload);
55
- break;
56
- case 'auth_error':
57
- console.error('Auth failed', event.payload.message);
58
- break;
59
- }
60
- });
111
+ import express from 'express';
112
+ import { exchangeCodeForTokenAndClaims } from '@hawcx/oauth-client';
61
113
 
62
- await authenticate('user@example.com');
63
- await submitOtp('123456');
114
+ const app = express();
115
+ app.use(express.json());
64
116
 
65
- subscription.remove();
117
+ app.post('/api/hawcx/login', async (req, res) => {
118
+ const { email, code, expires_in } = req.body ?? {};
119
+ if (!email || !code) {
120
+ return res.status(400).json({ success: false, error: 'Missing email or code' });
121
+ }
66
122
 
67
- // HawcxClient helper
68
- const { promise } = hawcxClient.authenticate('user@example.com', {
69
- onOtpRequired: () => console.log('show OTP UI'),
123
+ try {
124
+ const [claims, idToken] = await exchangeCodeForTokenAndClaims({
125
+ code,
126
+ oauthTokenUrl: process.env.HAWCX_OAUTH_TOKEN_ENDPOINT!,
127
+ clientId: process.env.HAWCX_OAUTH_CLIENT_ID!,
128
+ publicKey: process.env.HAWCX_OAUTH_PUBLIC_KEY_PEM!,
129
+ audience: process.env.HAWCX_OAUTH_CLIENT_ID,
130
+ issuer: process.env.HAWCX_OAUTH_ISSUER,
131
+ });
132
+
133
+ return res.json({
134
+ success: true,
135
+ message: `Verified ${claims.email}`,
136
+ access_token: idToken,
137
+ refresh_token: idToken,
138
+ });
139
+ } catch (error) {
140
+ return res.status(401).json({ success: false, error: error.message });
141
+ }
70
142
  });
71
- const result = await promise; // -> { accessToken?, refreshToken?, isLoginFlow }
143
+ ```
72
144
 
73
- // React hook example
74
- function AuthScreen() {
75
- const { state, authenticate, submitOtp } = useHawcxAuth();
145
+ Once the backend responds, call `storeBackendOAuthTokens(userId, tokens)` so the Hawcx SDK saves them securely and can continue handling push registration and device sessions.
76
146
 
77
- const start = () => authenticate('user@example.com');
78
- const sendOtp = (otp: string) => submitOtp(otp);
147
+ ## Hooks & Helpers
79
148
 
80
- return null;
81
- }
149
+ * `useHawcxAuth()` – React hook that exposes the current auth state and helpers (`authenticate`, `submitOtp`, `reset`).
150
+ * `useHawcxWebLogin()` – Drive QR/PIN based approvals.
151
+ * `addAuthListener` / `addSessionListener` / `addPushListener` – Lower-level event APIs if you prefer an imperative approach.
152
+ * `setPushDeviceToken` / `notifyUserAuthenticated` – Wire push login approvals.
82
153
 
83
- function WebLoginScreen() {
84
- const { state, webLogin, webApprove, getDeviceDetails } = useHawcxWebLogin();
154
+ Refer to the updated [React Quickstart documentation](https://docs.hawcx.com/react/quickstart) for details on each API, push approvals, and device session management.
85
155
 
86
- const validatePin = (pin: string) => webLogin(pin);
87
- const approveSession = (token: string) => webApprove(token);
88
- const refreshDevices = () => getDeviceDetails();
156
+ ## Example App
89
157
 
90
- return null;
91
- }
158
+ `/example` contains a full React Native app wired to the SDK with logging, OTP UI, push harness, and a backend toggle. To run it:
159
+
160
+ ```bash
161
+ cd example
162
+ npm install
163
+ npm run ios # or npm run android
92
164
  ```
93
165
 
94
- ## Example App & E2E
95
- - `cd example && npm install` to bootstrap the sample app.
96
- - Edit `example/src/hawcx.config.ts` with your project API key plus the OAuth client ID, token endpoint, and PEM from `dev_ios/ios_demo_dev`, then run `npm run ios` or `npm run android`.
97
- - Use `example/e2e/hawcx-login.yaml` with [Maestro](https://maestro.mobile.dev/) to drive a smoke test through OTP login. Adjust selectors to match your bundle ID and UI tweaks.
98
-
99
- ## Release Process
100
- Review `docs/RELEASE.md` before publishing. In short:
101
- 1. Run `npm run lint && npm run typecheck && npm test && npm run build`.
102
- 2. Update `package.json` + `CHANGELOG.md`.
103
- 3. Smoke test the example app.
104
- 4. `npm publish --access public` and `pod repo push trunk HawcxReactNative.podspec`.
105
- 5. Tag the repo (`git tag vX.Y.Z && git push origin --tags`).
106
-
107
- ## Next Steps
108
- 1. Follow `react_mobile_sdk_plan.md` Phase 1+ to implement the native bridge and JS API.
109
- 2. Keep this README updated with integration steps and release instructions as the SDK matures.
166
+ Add your Project API key in `example/src/hawcx.config.ts` or paste it into the in-app form. The **Authorization Code & Backend Exchange** card runs in demo mode by default (codes complete locally). Set `BACKEND_FLOW_ENABLED = true` in `example/src/App.tsx` when you have a tunnel or backend ready to receive `{ code, email, expires_in }`.
167
+
168
+ ## Support
169
+
170
+ * Documentation: [React Quickstart](https://docs.hawcx.com/react/quickstart)
171
+ * Questions? Reach out to your Hawcx solutions engineer or info@hawcx.com.
package/docs/RELEASE.md CHANGED
@@ -50,7 +50,7 @@ This document outlines every command, directory, and deliverable required to pub
50
50
  ```bash
51
51
  git add package.json package-lock.json android/build.gradle example/package.json example/package-lock.json example/ios/Podfile.lock CHANGELOG.md
52
52
  git commit -m "chore: release vX.Y.Z"
53
- ```
53
+ ```
54
54
  Include refreshed native artifacts (`ios/Frameworks/*.xcframework`, `android/libs/*.aar`) in the same commit when they change.
55
55
 
56
56
  4. **Smoke test the example app**
@@ -73,7 +73,7 @@ This document outlines every command, directory, and deliverable required to pub
73
73
 
74
74
  6. **Publish CocoaPods spec (repo root)**
75
75
  ```bash
76
- pod repo push trunk HawcxReactNative.podspec --allow-warnings
76
+ pod trunk push HawcxReactNative.podspec --allow-warnings
77
77
  ```
78
78
  Ensure the command finishes without validation errors. If you have trouble with trunk authentication, re-run `pod trunk register`.
79
79