react-native-notify-kit 9.7.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +71 -2
  2. package/RNNotifeeCore.podspec +2 -0
  3. package/cli/bin/react-native-notify-kit +2 -0
  4. package/cli/dist/cli.bundle.js +20834 -0
  5. package/cli/dist/cli.d.ts +2 -0
  6. package/cli/dist/cli.js +87 -0
  7. package/cli/dist/cli.js.map +1 -0
  8. package/cli/dist/commands/initNse.d.ts +12 -0
  9. package/cli/dist/commands/initNse.js +212 -0
  10. package/cli/dist/commands/initNse.js.map +1 -0
  11. package/cli/dist/lib/detectProject.d.ts +15 -0
  12. package/cli/dist/lib/detectProject.js +156 -0
  13. package/cli/dist/lib/detectProject.js.map +1 -0
  14. package/cli/dist/lib/logger.d.ts +4 -0
  15. package/cli/dist/lib/logger.js +24 -0
  16. package/cli/dist/lib/logger.js.map +1 -0
  17. package/cli/dist/lib/patchPodfile.d.ts +12 -0
  18. package/cli/dist/lib/patchPodfile.js +143 -0
  19. package/cli/dist/lib/patchPodfile.js.map +1 -0
  20. package/cli/dist/lib/patchXcodeProject.d.ts +25 -0
  21. package/cli/dist/lib/patchXcodeProject.js +239 -0
  22. package/cli/dist/lib/patchXcodeProject.js.map +1 -0
  23. package/cli/dist/lib/writeTemplates.d.ts +11 -0
  24. package/cli/dist/lib/writeTemplates.js +82 -0
  25. package/cli/dist/lib/writeTemplates.js.map +1 -0
  26. package/cli/dist/templates/Info.plist.tmpl +29 -0
  27. package/cli/dist/templates/NotificationService.swift.tmpl +32 -0
  28. package/cli/dist/templates/NotifyKitNSE.entitlements.tmpl +6 -0
  29. package/cli/dist/templates/templates/Info.plist.tmpl +29 -0
  30. package/cli/dist/templates/templates/NotificationService.swift.tmpl +73 -0
  31. package/cli/dist/templates/templates/NotifyKitNSE.entitlements.tmpl +6 -0
  32. package/dist/NotifeeApiModule.d.ts +17 -0
  33. package/dist/NotifeeApiModule.js +66 -1
  34. package/dist/NotifeeApiModule.js.map +1 -1
  35. package/dist/fcm/index.d.ts +4 -0
  36. package/dist/fcm/index.js +3 -0
  37. package/dist/fcm/index.js.map +1 -0
  38. package/dist/fcm/parseFcmPayload.d.ts +16 -0
  39. package/dist/fcm/parseFcmPayload.js +37 -0
  40. package/dist/fcm/parseFcmPayload.js.map +1 -0
  41. package/dist/fcm/reconstructNotification.d.ts +8 -0
  42. package/dist/fcm/reconstructNotification.js +167 -0
  43. package/dist/fcm/reconstructNotification.js.map +1 -0
  44. package/dist/fcm/types.d.ts +51 -0
  45. package/dist/fcm/types.js +6 -0
  46. package/dist/fcm/types.js.map +1 -0
  47. package/dist/index.d.ts +2 -0
  48. package/dist/index.js +1 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/types/Module.d.ts +21 -0
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +1 -1
  53. package/dist/version.js.map +1 -1
  54. package/package.json +38 -3
  55. package/server/README.md +129 -0
  56. package/server/dist/android.d.ts +8 -0
  57. package/server/dist/android.d.ts.map +1 -0
  58. package/server/dist/android.js +20 -0
  59. package/server/dist/android.js.map +1 -0
  60. package/server/dist/buildPayload.d.ts +3 -0
  61. package/server/dist/buildPayload.d.ts.map +1 -0
  62. package/server/dist/buildPayload.js +82 -0
  63. package/server/dist/buildPayload.js.map +1 -0
  64. package/server/dist/index.d.ts +6 -0
  65. package/server/dist/index.d.ts.map +1 -0
  66. package/server/dist/index.js +12 -0
  67. package/server/dist/index.js.map +1 -0
  68. package/server/dist/ios.d.ts +11 -0
  69. package/server/dist/ios.d.ts.map +1 -0
  70. package/server/dist/ios.js +61 -0
  71. package/server/dist/ios.js.map +1 -0
  72. package/server/dist/serialize.d.ts +11 -0
  73. package/server/dist/serialize.d.ts.map +1 -0
  74. package/server/dist/serialize.js +32 -0
  75. package/server/dist/serialize.js.map +1 -0
  76. package/server/dist/types.d.ts +2 -0
  77. package/server/dist/types.d.ts.map +1 -0
  78. package/server/dist/types.js +3 -0
  79. package/server/dist/types.js.map +1 -0
  80. package/server/dist/validation.d.ts +3 -0
  81. package/server/dist/validation.d.ts.map +1 -0
  82. package/server/dist/validation.js +101 -0
  83. package/server/dist/validation.js.map +1 -0
  84. package/server/package.json +5 -0
  85. package/server/src/android.ts +27 -0
  86. package/server/src/buildPayload.ts +91 -0
  87. package/server/src/index.ts +12 -0
  88. package/server/src/ios.ts +88 -0
  89. package/server/src/serialize.ts +39 -0
  90. package/server/src/types.ts +24 -0
  91. package/server/src/validation.ts +134 -0
  92. package/server/tsconfig.json +25 -0
  93. package/src/NotifeeApiModule.ts +80 -1
  94. package/src/fcm/index.ts +4 -0
  95. package/src/fcm/parseFcmPayload.ts +56 -0
  96. package/src/fcm/reconstructNotification.ts +201 -0
  97. package/src/fcm/types.ts +57 -0
  98. package/src/index.ts +2 -0
  99. package/src/internal/fcmContract.d.ts +150 -0
  100. package/src/types/Module.ts +23 -0
  101. package/src/version.ts +1 -1
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.patchPodfile = patchPodfile;
37
+ exports.getPatchedPodfile = getPatchedPodfile;
38
+ const fs = __importStar(require("fs"));
39
+ /**
40
+ * Patches the Podfile to add the NSE target with RNNotifeeCore pod.
41
+ * The NSE target is nested inside the main app target so CocoaPods can
42
+ * detect the host→extension relationship. Uses `inherit! :search_paths`.
43
+ * Idempotent: if the target already exists, returns false.
44
+ */
45
+ function patchPodfile(podfilePath, targetName, dryRun) {
46
+ const content = fs.readFileSync(podfilePath, 'utf-8');
47
+ // Idempotency check — skip commented lines (# prefix)
48
+ if (hasUncommentedTarget(content, targetName)) {
49
+ return false; // Already present
50
+ }
51
+ const patched = insertNseTarget(content, targetName);
52
+ if (patched === null) {
53
+ return false; // Could not find insertion point
54
+ }
55
+ if (!dryRun) {
56
+ fs.writeFileSync(podfilePath, patched, 'utf-8');
57
+ }
58
+ return true;
59
+ }
60
+ /**
61
+ * Returns the patched Podfile content without writing to disk (for dry-run
62
+ * preview or testing).
63
+ */
64
+ function getPatchedPodfile(content, targetName) {
65
+ if (hasUncommentedTarget(content, targetName)) {
66
+ return null; // Already present
67
+ }
68
+ return insertNseTarget(content, targetName);
69
+ }
70
+ /**
71
+ * Inserts the NSE target block inside the main app target, just before
72
+ * the target's closing `end`.
73
+ *
74
+ * CocoaPods host-target rule: an app-extension target (Notification Service
75
+ * Extension here) must be declared nested inside its host app's target
76
+ * block with `inherit! :search_paths`. A top-level `target 'NotifyKitNSE'`
77
+ * block fails `pod install` with "Unable to find host target". We parse
78
+ * block depth to locate the main app's target body and insert the NSE
79
+ * sub-target there.
80
+ * Discovered: F3 Round 3, Check 3 smoke-app integration (2026-04).
81
+ */
82
+ function insertNseTarget(content, targetName) {
83
+ // Build the NSE block (indented since it's inside the parent target)
84
+ let block = `\n target '${targetName}' do\n`;
85
+ block += ` inherit! :search_paths\n`;
86
+ block += ` pod 'RNNotifeeCore', :path => '../node_modules/react-native-notify-kit'\n`;
87
+ block += ` end\n`;
88
+ // Find the main app target's closing `end`.
89
+ // Strategy: find the first `target '...' do` and then its matching `end`.
90
+ // We insert just before that `end`.
91
+ const targetMatch = content.match(/^target\s+['"][^'"]+['"]\s+do/m);
92
+ if (!targetMatch || targetMatch.index === undefined) {
93
+ // No target found — append at top level (unusual Podfile)
94
+ return content + '\n' + block;
95
+ }
96
+ // Find the matching `end` for this target block.
97
+ // Simple approach: find the last top-level `end` after the target declaration.
98
+ // We look for `end` at the start of a line (possibly with leading whitespace)
99
+ // that closes the main target block.
100
+ const afterTarget = content.slice(targetMatch.index);
101
+ let depth = 0;
102
+ let insertIndex = -1;
103
+ const lines = afterTarget.split('\n');
104
+ let charIndex = targetMatch.index;
105
+ for (const line of lines) {
106
+ const trimmed = line.trim();
107
+ // Count block openers: `do` at end of line (target ... do, post_install do |...|)
108
+ if (/\bdo\b(\s*\|[^|]*\|)?\s*$/.test(trimmed) && !trimmed.startsWith('#')) {
109
+ depth++;
110
+ }
111
+ // Count block closers
112
+ if (trimmed === 'end') {
113
+ depth--;
114
+ if (depth === 0) {
115
+ // This is the closing `end` of the main target — insert before it
116
+ insertIndex = charIndex;
117
+ break;
118
+ }
119
+ }
120
+ charIndex += line.length + 1; // +1 for newline
121
+ }
122
+ if (insertIndex === -1) {
123
+ // Could not find matching end — abort rather than silently producing invalid output
124
+ throw new Error("Could not locate main app target's closing 'end' in Podfile. NSE insertion aborted. " +
125
+ 'Your Podfile may use abstract_target, unusual formatting, or nested blocks — ' +
126
+ 'add the NSE target manually per the legacy guide.');
127
+ }
128
+ return content.slice(0, insertIndex) + block + content.slice(insertIndex);
129
+ }
130
+ function hasUncommentedTarget(content, targetName) {
131
+ const pattern = new RegExp(`target\\s+['"]${escapeRegex(targetName)}['"]`);
132
+ for (const line of content.split('\n')) {
133
+ const stripped = line.replace(/#.*$/, ''); // Remove comments
134
+ if (pattern.test(stripped)) {
135
+ return true;
136
+ }
137
+ }
138
+ return false;
139
+ }
140
+ function escapeRegex(s) {
141
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
142
+ }
143
+ //# sourceMappingURL=patchPodfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patchPodfile.js","sourceRoot":"","sources":["../../src/lib/patchPodfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Xcode project patching via xcode@3.x.
3
+ *
4
+ * xcode@3.x has three known bugs that this module works around. See inline
5
+ * comments tagged "xcode@3.x bug" for details. Do NOT remove these
6
+ * workarounds without verifying `pod install` succeeds on a real RN app —
7
+ * the bugs are silent at the library level but fail at the CocoaPods
8
+ * parsing or CocoaPods host-detection stage.
9
+ *
10
+ * Maintenance note: if xcode@3.x is replaced or upgraded, re-run the F3
11
+ * Round 3 Check 3 smoke-app integration test to confirm which workarounds
12
+ * remain necessary.
13
+ */
14
+ export interface PatchXcodeOptions {
15
+ pbxprojPath: string;
16
+ targetName: string;
17
+ bundleId: string;
18
+ iosDir: string;
19
+ dryRun: boolean;
20
+ }
21
+ /**
22
+ * Adds an NSE target to the .pbxproj file via the xcode library.
23
+ * Idempotent: if a target with the given name already exists, returns false.
24
+ */
25
+ export declare function patchXcodeProject(opts: PatchXcodeOptions): boolean;
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ /**
3
+ * Xcode project patching via xcode@3.x.
4
+ *
5
+ * xcode@3.x has three known bugs that this module works around. See inline
6
+ * comments tagged "xcode@3.x bug" for details. Do NOT remove these
7
+ * workarounds without verifying `pod install` succeeds on a real RN app —
8
+ * the bugs are silent at the library level but fail at the CocoaPods
9
+ * parsing or CocoaPods host-detection stage.
10
+ *
11
+ * Maintenance note: if xcode@3.x is replaced or upgraded, re-run the F3
12
+ * Round 3 Check 3 smoke-app integration test to confirm which workarounds
13
+ * remain necessary.
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ var __importDefault = (this && this.__importDefault) || function (mod) {
49
+ return (mod && mod.__esModule) ? mod : { "default": mod };
50
+ };
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.patchXcodeProject = patchXcodeProject;
53
+ const crypto = __importStar(require("crypto"));
54
+ const fs = __importStar(require("fs"));
55
+ const xcode_1 = __importDefault(require("xcode"));
56
+ /**
57
+ * Adds an NSE target to the .pbxproj file via the xcode library.
58
+ * Idempotent: if a target with the given name already exists, returns false.
59
+ */
60
+ function patchXcodeProject(opts) {
61
+ const proj = xcode_1.default.project(opts.pbxprojPath);
62
+ proj.parseSync();
63
+ // Idempotency: check if target already exists
64
+ if (targetExists(proj, opts.targetName)) {
65
+ return false;
66
+ }
67
+ // 1. Add the extension target
68
+ const target = proj.addTarget(opts.targetName, 'app_extension', opts.targetName);
69
+ if (!target || !target.uuid) {
70
+ throw new Error(`xcode library failed to create target '${opts.targetName}'`);
71
+ }
72
+ // xcode@3.x bug: addTarget creates the .appex product reference with
73
+ // `fileEncoding = undefined` and `lastKnownFileType = undefined` instead
74
+ // of omitting these keys entirely. CocoaPods' pbxproj parser rejects
75
+ // "undefined" literal string values and fails with a parse error during
76
+ // `pod install`. Strip these fields post-addTarget to restore a clean
77
+ // product reference that CocoaPods accepts.
78
+ // Discovered: F3 Round 3, Check 3 smoke-app integration (2026-04).
79
+ fixProductFileReference(proj, opts.targetName);
80
+ // 2. Add build phases
81
+ proj.addBuildPhase([], 'PBXSourcesBuildPhase', 'Sources', target.uuid);
82
+ proj.addBuildPhase([], 'PBXFrameworksBuildPhase', 'Frameworks', target.uuid);
83
+ proj.addBuildPhase([], 'PBXResourcesBuildPhase', 'Resources', target.uuid);
84
+ // 3. Create PBX group for the NSE target files, then register the source file
85
+ const group = proj.addPbxGroup([], opts.targetName, opts.targetName);
86
+ proj.addSourceFile(`${opts.targetName}/NotificationService.swift`, {
87
+ target: target.uuid,
88
+ }, group.uuid);
89
+ // xcode@3.x bug: addTargetDependency() adds the dependency to an internal
90
+ // cache but does not serialize it to the project hash, so writeSync()
91
+ // emits a pbxproj with no dependency entry. CocoaPods' host-target
92
+ // detection then fails with "Unable to find host target for NotifyKitNSE".
93
+ // Manual injection of PBXContainerItemProxy + PBXTargetDependency into
94
+ // the project hash restores the expected pbxproj structure.
95
+ // NOTE: we do NOT add an "Embed App Extensions" build phase here —
96
+ // the xcode library creates inconsistent file references that cause
97
+ // CocoaPods' post_install to crash. Xcode auto-creates the embed phase
98
+ // when the user opens the project and sees the dependency.
99
+ // Discovered: F3 Round 3, Check 3 smoke-app integration (2026-04).
100
+ const hostUuid = findHostTarget(proj);
101
+ if (hostUuid) {
102
+ addTargetDependencyManual(proj, hostUuid, target.uuid, opts.targetName);
103
+ stripRnfbInfoPlistInputPath(proj, hostUuid);
104
+ }
105
+ // 5. Set build settings for all configurations
106
+ setBuildSettings(proj, opts.targetName, opts.bundleId);
107
+ // 6. Write — writeSync() returns content as string, must write manually
108
+ if (!opts.dryRun) {
109
+ fs.writeFileSync(opts.pbxprojPath, proj.writeSync());
110
+ }
111
+ return true;
112
+ }
113
+ function findHostTarget(proj) {
114
+ const targets = proj.pbxNativeTargetSection();
115
+ for (const [key, value] of Object.entries(targets)) {
116
+ if (typeof value !== 'object' || key.endsWith('_comment'))
117
+ continue;
118
+ const target = value;
119
+ const productType = String(target.productType ?? '');
120
+ if (productType.includes('application')) {
121
+ return key;
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ function targetExists(proj, name) {
127
+ const targets = proj.pbxNativeTargetSection();
128
+ for (const [, value] of Object.entries(targets)) {
129
+ if (typeof value !== 'object')
130
+ continue;
131
+ const target = value;
132
+ const targetName = String(target.name ?? '').replace(/"/g, '');
133
+ if (targetName === name) {
134
+ return true;
135
+ }
136
+ }
137
+ return false;
138
+ }
139
+ function setBuildSettings(proj, targetName, bundleId) {
140
+ const configs = proj.pbxXCBuildConfigurationSection();
141
+ for (const [, value] of Object.entries(configs)) {
142
+ if (typeof value !== 'object')
143
+ continue;
144
+ const config = value;
145
+ const settings = config.buildSettings;
146
+ if (!settings)
147
+ continue;
148
+ if (settings.PRODUCT_NAME !== `"${targetName}"`)
149
+ continue;
150
+ settings.INFOPLIST_FILE = `"${targetName}/Info.plist"`;
151
+ settings.PRODUCT_BUNDLE_IDENTIFIER = `"${bundleId}"`;
152
+ settings.TARGETED_DEVICE_FAMILY = `"1,2"`;
153
+ settings.IPHONEOS_DEPLOYMENT_TARGET = '15.1';
154
+ settings.SWIFT_VERSION = '5.0';
155
+ settings.CODE_SIGN_ENTITLEMENTS = `"${targetName}/${targetName}.entitlements"`;
156
+ settings.GENERATE_INFOPLIST_FILE = 'NO';
157
+ }
158
+ }
159
+ function fixProductFileReference(proj, targetName) {
160
+ const fileRefs = proj.hash.project.objects.PBXFileReference;
161
+ if (!fileRefs)
162
+ return;
163
+ for (const [, value] of Object.entries(fileRefs)) {
164
+ if (typeof value !== 'object')
165
+ continue;
166
+ const ref = value;
167
+ if (String(ref.name ?? '').replace(/"/g, '') === `${targetName}.appex`) {
168
+ // Remove broken fields that xcode@3.x sets to literal 'undefined'
169
+ delete ref.fileEncoding;
170
+ delete ref.lastKnownFileType;
171
+ }
172
+ }
173
+ }
174
+ function genUuid() {
175
+ return crypto.randomBytes(12).toString('hex').toUpperCase().slice(0, 24);
176
+ }
177
+ /**
178
+ * Manually adds PBXTargetDependency + PBXContainerItemProxy to the project
179
+ * hash. The xcode@3.x library's addTargetDependency() exists but doesn't
180
+ * serialize to the output — so we inject directly into the internal hash.
181
+ * CocoaPods requires these entries to detect the host→extension relationship.
182
+ */
183
+ function addTargetDependencyManual(proj, hostUuid, extensionUuid, extensionName) {
184
+ const proxyUuid = genUuid();
185
+ const depUuid = genUuid();
186
+ const objects = proj.hash.project.objects;
187
+ const rootObject = proj.hash.project.rootObject;
188
+ if (!objects.PBXContainerItemProxy)
189
+ objects.PBXContainerItemProxy = {};
190
+ objects.PBXContainerItemProxy[proxyUuid] = {
191
+ isa: 'PBXContainerItemProxy',
192
+ containerPortal: rootObject,
193
+ proxyType: 1,
194
+ remoteGlobalIDString: extensionUuid,
195
+ remoteInfo: `"${extensionName}"`,
196
+ };
197
+ objects.PBXContainerItemProxy[proxyUuid + '_comment'] = 'PBXContainerItemProxy';
198
+ if (!objects.PBXTargetDependency)
199
+ objects.PBXTargetDependency = {};
200
+ objects.PBXTargetDependency[depUuid] = {
201
+ isa: 'PBXTargetDependency',
202
+ target: extensionUuid,
203
+ targetProxy: proxyUuid,
204
+ };
205
+ objects.PBXTargetDependency[depUuid + '_comment'] = 'PBXTargetDependency';
206
+ const hostTarget = objects.PBXNativeTarget[hostUuid];
207
+ if (hostTarget && Array.isArray(hostTarget.dependencies)) {
208
+ hostTarget.dependencies.push({ value: depUuid, comment: 'PBXTargetDependency' });
209
+ }
210
+ }
211
+ function stripRnfbInfoPlistInputPath(proj, hostUuid) {
212
+ const objects = proj.hash.project.objects;
213
+ const hostTarget = objects.PBXNativeTarget?.[hostUuid];
214
+ const shellPhases = objects.PBXShellScriptBuildPhase;
215
+ if (!hostTarget || !Array.isArray(hostTarget.buildPhases) || !shellPhases) {
216
+ return;
217
+ }
218
+ for (const phaseRef of hostTarget.buildPhases) {
219
+ const phaseUuid = phaseRef?.value;
220
+ if (!phaseUuid)
221
+ continue;
222
+ const phase = shellPhases[phaseUuid];
223
+ if (!phase)
224
+ continue;
225
+ const phaseName = String(phase.name ?? '').replace(/"/g, '');
226
+ if (phaseName !== '[CP-User] [RNFB] Core Configuration') {
227
+ continue;
228
+ }
229
+ const inputPaths = Array.isArray(phase.inputPaths) ? phase.inputPaths : [];
230
+ const filteredInputPaths = inputPaths.filter(entry => String(entry) !== '"$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)"');
231
+ if (filteredInputPaths.length > 0) {
232
+ phase.inputPaths = filteredInputPaths;
233
+ }
234
+ else {
235
+ delete phase.inputPaths;
236
+ }
237
+ }
238
+ }
239
+ //# sourceMappingURL=patchXcodeProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patchXcodeProject.js","sourceRoot":"","sources":["../../src/lib/patchXcodeProject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface WriteTemplatesOptions {
2
+ iosDir: string;
3
+ targetName: string;
4
+ bundleId: string;
5
+ force: boolean;
6
+ }
7
+ /**
8
+ * Writes the NSE template files (Swift, Info.plist, entitlements) to the
9
+ * target directory under the iOS project.
10
+ */
11
+ export declare function writeTemplates(opts: WriteTemplatesOptions): string[];
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.writeTemplates = writeTemplates;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ // Templates live at dist/templates/ in dev (relative to dist/lib/writeTemplates.js)
40
+ // and at cli/dist/templates/ in the bundled prepack (relative to cli/dist/cli.bundle.js).
41
+ // The fallback path handles the bundled context where __dirname is the bundle's dir.
42
+ const TEMPLATES_DIR = fs.existsSync(path.join(__dirname, 'templates'))
43
+ ? path.join(__dirname, 'templates')
44
+ : path.join(__dirname, '..', 'templates');
45
+ /**
46
+ * Writes the NSE template files (Swift, Info.plist, entitlements) to the
47
+ * target directory under the iOS project.
48
+ */
49
+ function writeTemplates(opts) {
50
+ const targetDir = path.join(opts.iosDir, opts.targetName);
51
+ if (fs.existsSync(targetDir) && !opts.force) {
52
+ throw new Error(`NSE target '${opts.targetName}' appears to exist at ${targetDir}.\n` +
53
+ ' Use --force to overwrite or --target-name to use a different name.');
54
+ }
55
+ fs.mkdirSync(targetDir, { recursive: true });
56
+ const files = [
57
+ {
58
+ template: 'NotificationService.swift.tmpl',
59
+ output: 'NotificationService.swift',
60
+ },
61
+ {
62
+ template: 'Info.plist.tmpl',
63
+ output: 'Info.plist',
64
+ },
65
+ {
66
+ template: 'NotifyKitNSE.entitlements.tmpl',
67
+ output: `${opts.targetName}.entitlements`,
68
+ },
69
+ ];
70
+ const written = [];
71
+ for (const { template, output } of files) {
72
+ const templatePath = path.join(TEMPLATES_DIR, template);
73
+ let content = fs.readFileSync(templatePath, 'utf-8');
74
+ content = content.replace(/\{\{TARGET_NAME\}\}/g, opts.targetName);
75
+ content = content.replace(/\{\{BUNDLE_ID\}\}/g, opts.bundleId);
76
+ const outputPath = path.join(targetDir, output);
77
+ fs.writeFileSync(outputPath, content, 'utf-8');
78
+ written.push(outputPath);
79
+ }
80
+ return written;
81
+ }
82
+ //# sourceMappingURL=writeTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeTemplates.js","sourceRoot":"","sources":["../../src/lib/writeTemplates.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,wCAwCC;AA7DD,uCAAyB;AACzB,2CAA6B;AAE7B,oFAAoF;AACpF,0FAA0F;AAC1F,qFAAqF;AACrF,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;IACnC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAS5C;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAA2B;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAE1D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,CAAC,UAAU,yBAAyB,SAAS,KAAK;YACnE,sEAAsE,CACzE,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,KAAK,GAAG;QACZ;YACE,QAAQ,EAAE,gCAAgC;YAC1C,MAAM,EAAE,2BAA2B;SACpC;QACD;YACE,QAAQ,EAAE,iBAAiB;YAC3B,MAAM,EAAE,YAAY;SACrB;QACD;YACE,QAAQ,EAAE,gCAAgC;YAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,eAAe;SAC1C;KACF,CAAC;IAEF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACnE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAChD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDisplayName</key>
6
+ <string>{{TARGET_NAME}}</string>
7
+ <key>CFBundleExecutable</key>
8
+ <string>$(EXECUTABLE_NAME)</string>
9
+ <key>CFBundleIdentifier</key>
10
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+ <key>CFBundleInfoDictionaryVersion</key>
12
+ <string>6.0</string>
13
+ <key>CFBundleName</key>
14
+ <string>$(PRODUCT_NAME)</string>
15
+ <key>CFBundlePackageType</key>
16
+ <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
17
+ <key>CFBundleShortVersionString</key>
18
+ <string>1.0</string>
19
+ <key>CFBundleVersion</key>
20
+ <string>1</string>
21
+ <key>NSExtension</key>
22
+ <dict>
23
+ <key>NSExtensionPointIdentifier</key>
24
+ <string>com.apple.usernotifications.service</string>
25
+ <key>NSExtensionPrincipalClass</key>
26
+ <string>$(PRODUCT_MODULE_NAME).NotificationService</string>
27
+ </dict>
28
+ </dict>
29
+ </plist>
@@ -0,0 +1,32 @@
1
+ import UserNotifications
2
+ import RNNotifeeCore
3
+
4
+ class NotificationService: UNNotificationServiceExtension {
5
+ var contentHandler: ((UNNotificationContent) -> Void)?
6
+ var bestAttemptContent: UNMutableNotificationContent?
7
+
8
+ override func didReceive(
9
+ _ request: UNNotificationRequest,
10
+ withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
11
+ ) {
12
+ self.contentHandler = contentHandler
13
+ self.bestAttemptContent = request.content.mutableCopy() as? UNMutableNotificationContent
14
+
15
+ guard let bestAttemptContent = bestAttemptContent else {
16
+ contentHandler(request.content)
17
+ return
18
+ }
19
+
20
+ NotifeeExtensionHelper.populateNotificationContent(
21
+ request,
22
+ with: bestAttemptContent,
23
+ withContentHandler: contentHandler
24
+ )
25
+ }
26
+
27
+ override func serviceExtensionTimeWillExpire() {
28
+ if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
29
+ contentHandler(bestAttemptContent)
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ </dict>
6
+ </plist>
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDisplayName</key>
6
+ <string>{{TARGET_NAME}}</string>
7
+ <key>CFBundleExecutable</key>
8
+ <string>$(EXECUTABLE_NAME)</string>
9
+ <key>CFBundleIdentifier</key>
10
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+ <key>CFBundleInfoDictionaryVersion</key>
12
+ <string>6.0</string>
13
+ <key>CFBundleName</key>
14
+ <string>$(PRODUCT_NAME)</string>
15
+ <key>CFBundlePackageType</key>
16
+ <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
17
+ <key>CFBundleShortVersionString</key>
18
+ <string>1.0</string>
19
+ <key>CFBundleVersion</key>
20
+ <string>1</string>
21
+ <key>NSExtension</key>
22
+ <dict>
23
+ <key>NSExtensionPointIdentifier</key>
24
+ <string>com.apple.usernotifications.service</string>
25
+ <key>NSExtensionPrincipalClass</key>
26
+ <string>$(PRODUCT_MODULE_NAME).NotificationService</string>
27
+ </dict>
28
+ </dict>
29
+ </plist>