react-native-notify-kit 9.7.0 → 10.1.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.
- package/README.md +140 -6
- package/RNNotifeeCore.podspec +2 -0
- package/android/src/androidTest/java/app/notifee/core/RebootRecoveryTest.java +94 -2
- package/android/src/main/AndroidManifest.xml +8 -7
- package/android/src/main/java/app/notifee/core/NotificationManager.java +2 -0
- package/android/src/main/java/app/notifee/core/model/NotificationAndroidModel.java +8 -3
- package/android/src/main/java/app/notifee/core/utility/ResourceUtils.java +28 -0
- package/android/src/test/java/app/notifee/core/model/NotificationAndroidModelSmallIconFallbackTest.java +74 -0
- package/android/src/test/java/app/notifee/core/utility/ResourceUtilsFallbackIconTest.java +116 -0
- package/cli/bin/react-native-notify-kit +2 -0
- package/cli/dist/cli.bundle.js +20834 -0
- package/cli/dist/cli.d.ts +2 -0
- package/cli/dist/cli.js +87 -0
- package/cli/dist/cli.js.map +1 -0
- package/cli/dist/commands/initNse.d.ts +12 -0
- package/cli/dist/commands/initNse.js +212 -0
- package/cli/dist/commands/initNse.js.map +1 -0
- package/cli/dist/lib/detectProject.d.ts +15 -0
- package/cli/dist/lib/detectProject.js +156 -0
- package/cli/dist/lib/detectProject.js.map +1 -0
- package/cli/dist/lib/logger.d.ts +4 -0
- package/cli/dist/lib/logger.js +24 -0
- package/cli/dist/lib/logger.js.map +1 -0
- package/cli/dist/lib/patchPodfile.d.ts +12 -0
- package/cli/dist/lib/patchPodfile.js +143 -0
- package/cli/dist/lib/patchPodfile.js.map +1 -0
- package/cli/dist/lib/patchXcodeProject.d.ts +25 -0
- package/cli/dist/lib/patchXcodeProject.js +239 -0
- package/cli/dist/lib/patchXcodeProject.js.map +1 -0
- package/cli/dist/lib/writeTemplates.d.ts +11 -0
- package/cli/dist/lib/writeTemplates.js +82 -0
- package/cli/dist/lib/writeTemplates.js.map +1 -0
- package/cli/dist/templates/Info.plist.tmpl +29 -0
- package/cli/dist/templates/NotificationService.swift.tmpl +32 -0
- package/cli/dist/templates/NotifyKitNSE.entitlements.tmpl +6 -0
- package/cli/dist/templates/templates/Info.plist.tmpl +29 -0
- package/cli/dist/templates/templates/NotificationService.swift.tmpl +73 -0
- package/cli/dist/templates/templates/NotifyKitNSE.entitlements.tmpl +6 -0
- package/dist/NotifeeApiModule.d.ts +17 -0
- package/dist/NotifeeApiModule.js +66 -1
- package/dist/NotifeeApiModule.js.map +1 -1
- package/dist/fcm/index.d.ts +4 -0
- package/dist/fcm/index.js +3 -0
- package/dist/fcm/index.js.map +1 -0
- package/dist/fcm/parseFcmPayload.d.ts +16 -0
- package/dist/fcm/parseFcmPayload.js +37 -0
- package/dist/fcm/parseFcmPayload.js.map +1 -0
- package/dist/fcm/reconstructNotification.d.ts +8 -0
- package/dist/fcm/reconstructNotification.js +167 -0
- package/dist/fcm/reconstructNotification.js.map +1 -0
- package/dist/fcm/types.d.ts +51 -0
- package/dist/fcm/types.js +6 -0
- package/dist/fcm/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types/Module.d.ts +21 -0
- package/dist/validators/validateTrigger.js +16 -0
- package/dist/validators/validateTrigger.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +38 -3
- package/server/README.md +129 -0
- package/server/dist/android.d.ts +8 -0
- package/server/dist/android.d.ts.map +1 -0
- package/server/dist/android.js +20 -0
- package/server/dist/android.js.map +1 -0
- package/server/dist/buildPayload.d.ts +3 -0
- package/server/dist/buildPayload.d.ts.map +1 -0
- package/server/dist/buildPayload.js +82 -0
- package/server/dist/buildPayload.js.map +1 -0
- package/server/dist/index.d.ts +6 -0
- package/server/dist/index.d.ts.map +1 -0
- package/server/dist/index.js +12 -0
- package/server/dist/index.js.map +1 -0
- package/server/dist/ios.d.ts +11 -0
- package/server/dist/ios.d.ts.map +1 -0
- package/server/dist/ios.js +61 -0
- package/server/dist/ios.js.map +1 -0
- package/server/dist/serialize.d.ts +11 -0
- package/server/dist/serialize.d.ts.map +1 -0
- package/server/dist/serialize.js +32 -0
- package/server/dist/serialize.js.map +1 -0
- package/server/dist/types.d.ts +2 -0
- package/server/dist/types.d.ts.map +1 -0
- package/server/dist/types.js +3 -0
- package/server/dist/types.js.map +1 -0
- package/server/dist/validation.d.ts +3 -0
- package/server/dist/validation.d.ts.map +1 -0
- package/server/dist/validation.js +101 -0
- package/server/dist/validation.js.map +1 -0
- package/server/package.json +5 -0
- package/server/src/android.ts +27 -0
- package/server/src/buildPayload.ts +91 -0
- package/server/src/index.ts +12 -0
- package/server/src/ios.ts +88 -0
- package/server/src/serialize.ts +39 -0
- package/server/src/types.ts +24 -0
- package/server/src/validation.ts +134 -0
- package/server/tsconfig.json +25 -0
- package/src/NotifeeApiModule.ts +80 -1
- package/src/fcm/index.ts +4 -0
- package/src/fcm/parseFcmPayload.ts +56 -0
- package/src/fcm/reconstructNotification.ts +201 -0
- package/src/fcm/types.ts +57 -0
- package/src/index.ts +2 -0
- package/src/internal/fcmContract.d.ts +150 -0
- package/src/types/Module.ts +23 -0
- package/src/validators/validateTrigger.ts +24 -0
- 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":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBH,8CAkEC;AAlFD,+CAAiC;AACjC,uCAAyB;AACzB,kDAA0B;AAU1B;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,IAAuB;IACvD,MAAM,IAAI,GAAG,eAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;IAEjB,8CAA8C;IAC9C,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8BAA8B;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAEjF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IAChF,CAAC;IAED,qEAAqE;IACrE,yEAAyE;IACzE,qEAAqE;IACrE,wEAAwE;IACxE,sEAAsE;IACtE,4CAA4C;IAC5C,mEAAmE;IACnE,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAE/C,sBAAsB;IACtB,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7E,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAE3E,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,IAAI,CAAC,aAAa,CAChB,GAAG,IAAI,CAAC,UAAU,4BAA4B,EAC9C;QACE,MAAM,EAAE,MAAM,CAAC,IAAI;KACpB,EACD,KAAK,CAAC,IAAI,CACX,CAAC;IAEF,0EAA0E;IAC1E,sEAAsE;IACtE,mEAAmE;IACnE,2EAA2E;IAC3E,uEAAuE;IACvE,4DAA4D;IAC5D,mEAAmE;IACnE,oEAAoE;IACpE,uEAAuE;IACvE,2DAA2D;IAC3D,mEAAmE;IACnE,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACxE,2BAA2B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,+CAA+C;IAC/C,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEvD,wEAAwE;IACxE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,IAAsC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,SAAS;QACpE,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAAsC,EAAE,IAAY;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAsC,EACtC,UAAkB,EAClB,QAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,CAAC,8BAA8B,EAAE,CAAC;IAEtD,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAmD,CAAC;QAE5E,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,IAAI,QAAQ,CAAC,YAAY,KAAK,IAAI,UAAU,GAAG;YAAE,SAAS;QAE1D,QAAQ,CAAC,cAAc,GAAG,IAAI,UAAU,cAAc,CAAC;QACvD,QAAQ,CAAC,yBAAyB,GAAG,IAAI,QAAQ,GAAG,CAAC;QACrD,QAAQ,CAAC,sBAAsB,GAAG,OAAO,CAAC;QAC1C,QAAQ,CAAC,0BAA0B,GAAG,MAAM,CAAC;QAC7C,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;QAC/B,QAAQ,CAAC,sBAAsB,GAAG,IAAI,UAAU,IAAI,UAAU,gBAAgB,CAAC;QAC/E,QAAQ,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAsC,EAAE,UAAkB;IACzF,MAAM,QAAQ,GAAI,IAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACrE,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,UAAU,QAAQ,EAAE,CAAC;YACvE,kEAAkE;YAClE,OAAO,GAAG,CAAC,YAAY,CAAC;YACxB,OAAO,GAAG,CAAC,iBAAiB,CAAC;QAC/B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO;IACd,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAChC,IAAsC,EACtC,QAAgB,EAChB,aAAqB,EACrB,aAAqB;IAErB,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;IAE1B,MAAM,OAAO,GAAI,IAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAEnD,MAAM,UAAU,GAAI,IAAY,CAAC,IAAI,CAAC,OAAO,CAAC,UAAoB,CAAC;IAEnE,IAAI,CAAC,OAAO,CAAC,qBAAqB;QAAE,OAAO,CAAC,qBAAqB,GAAG,EAAE,CAAC;IACvE,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC,GAAG;QACzC,GAAG,EAAE,uBAAuB;QAC5B,eAAe,EAAE,UAAU;QAC3B,SAAS,EAAE,CAAC;QACZ,oBAAoB,EAAE,aAAa;QACnC,UAAU,EAAE,IAAI,aAAa,GAAG;KACjC,CAAC;IACF,OAAO,CAAC,qBAAqB,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,uBAAuB,CAAC;IAEhF,IAAI,CAAC,OAAO,CAAC,mBAAmB;QAAE,OAAO,CAAC,mBAAmB,GAAG,EAAE,CAAC;IACnE,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG;QACrC,GAAG,EAAE,qBAAqB;QAC1B,MAAM,EAAE,aAAa;QACrB,WAAW,EAAE,SAAS;KACvB,CAAC;IACF,OAAO,CAAC,mBAAmB,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,qBAAqB,CAAC;IAE1E,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,IAAsC,EACtC,QAAgB;IAEhB,MAAM,OAAO,GAAI,IAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAErD,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,CAAC;QAClC,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAwC,CAAC;QAC5E,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,SAAS,KAAK,qCAAqC,EAAE,CAAC;YACxD,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAC1C,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,2CAA2C,CACvE,CAAC;QAEF,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC,UAAU,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -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,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>
|