expo-harmony-toolkit 1.7.2 → 1.7.3

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 (68) hide show
  1. package/README.en.md +20 -9
  2. package/README.md +22 -11
  3. package/build/core/autolinking.d.ts +10 -0
  4. package/build/core/autolinking.js +421 -0
  5. package/build/core/build/commands.d.ts +19 -0
  6. package/build/core/build/commands.js +61 -0
  7. package/build/core/build/compatibilityShims.d.ts +1 -0
  8. package/build/core/build/compatibilityShims.js +272 -0
  9. package/build/core/build/localHar.d.ts +13 -0
  10. package/build/core/build/localHar.js +337 -0
  11. package/build/core/build/reporting.d.ts +19 -0
  12. package/build/core/build/reporting.js +67 -0
  13. package/build/core/build/rnohCompatibility.d.ts +1 -0
  14. package/build/core/build/rnohCompatibility.js +38 -0
  15. package/build/core/build.d.ts +4 -12
  16. package/build/core/build.js +70 -762
  17. package/build/core/constants.d.ts +2 -1
  18. package/build/core/constants.js +3 -2
  19. package/build/core/dependencyInspection.d.ts +2 -0
  20. package/build/core/dependencyInspection.js +112 -0
  21. package/build/core/env.js +1 -1
  22. package/build/core/report.js +33 -10
  23. package/build/core/signing.d.ts +2 -0
  24. package/build/core/signing.js +30 -0
  25. package/build/core/template/capabilityRegistry.d.ts +9 -0
  26. package/build/core/template/capabilityRegistry.js +84 -0
  27. package/build/core/template/expoModulesCoreShim.d.ts +2 -0
  28. package/build/core/template/expoModulesCoreShim.js +279 -0
  29. package/build/core/template/metro.d.ts +2 -0
  30. package/build/core/template/metro.js +213 -0
  31. package/build/core/template/nativeFiles.d.ts +8 -0
  32. package/build/core/template/nativeFiles.js +333 -0
  33. package/build/core/template/renderers/camera.d.ts +4 -0
  34. package/build/core/template/renderers/camera.js +612 -0
  35. package/build/core/template/renderers/fileSystem.d.ts +4 -0
  36. package/build/core/template/renderers/fileSystem.js +814 -0
  37. package/build/core/template/renderers/imagePicker.d.ts +4 -0
  38. package/build/core/template/renderers/imagePicker.js +753 -0
  39. package/build/core/template/renderers/location.d.ts +4 -0
  40. package/build/core/template/renderers/location.js +836 -0
  41. package/build/core/template/runtimeShims.d.ts +2 -0
  42. package/build/core/template/runtimeShims.js +192 -0
  43. package/build/core/template/support.d.ts +11 -0
  44. package/build/core/template/support.js +108 -0
  45. package/build/core/template.d.ts +2 -6
  46. package/build/core/template.js +40 -4453
  47. package/build/data/capabilities.js +21 -4
  48. package/build/data/dependencyCatalog.js +10 -0
  49. package/build/data/publicDocs.d.ts +11 -0
  50. package/build/data/publicDocs.js +28 -0
  51. package/build/data/validatedMatrices.js +9 -1
  52. package/build/docs/render.d.ts +9 -0
  53. package/build/docs/render.js +248 -0
  54. package/build/types.d.ts +12 -0
  55. package/docs/cli-build.md +1 -1
  56. package/docs/npm-release.md +1 -0
  57. package/docs/official-app-shell-sample.md +2 -1
  58. package/docs/official-minimal-sample.md +2 -1
  59. package/docs/official-native-capabilities-sample.md +3 -2
  60. package/docs/official-ui-stack-sample.md +2 -1
  61. package/docs/signing-and-release.md +3 -0
  62. package/docs/support-matrix.md +34 -9
  63. package/package.json +13 -5
  64. package/docs/v1.5.1-acceptance.md +0 -385
  65. package/docs/v1.6.0-acceptance.md +0 -193
  66. package/docs/v1.7.0-acceptance.md +0 -111
  67. package/docs/v1.7.1-acceptance.md +0 -111
  68. package/docs/v1.7.2-acceptance.md +0 -37
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildInvocation = buildInvocation;
7
+ exports.createHarmonyBuildEnvironment = createHarmonyBuildEnvironment;
8
+ exports.defaultCommandRunner = defaultCommandRunner;
9
+ const node_child_process_1 = require("node:child_process");
10
+ const path_1 = __importDefault(require("path"));
11
+ const node_util_1 = require("node:util");
12
+ const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
13
+ function buildInvocation(file, args) {
14
+ if (file.endsWith('.js')) {
15
+ return {
16
+ file: process.execPath,
17
+ args: [file, ...args],
18
+ };
19
+ }
20
+ return {
21
+ file,
22
+ args,
23
+ };
24
+ }
25
+ function createHarmonyBuildEnvironment(runtimeEnv, envReport) {
26
+ const buildEnvironment = {
27
+ ...runtimeEnv,
28
+ };
29
+ if (envReport.sdkRoot) {
30
+ buildEnvironment.DEVECO_SDK_HOME = envReport.sdkRoot;
31
+ buildEnvironment.OHOS_BASE_SDK_HOME = envReport.sdkRoot;
32
+ }
33
+ if (envReport.devecoStudioPath) {
34
+ buildEnvironment.NODE_HOME =
35
+ buildEnvironment.NODE_HOME ??
36
+ path_1.default.join(envReport.devecoStudioPath, 'Contents', 'tools', 'node');
37
+ }
38
+ return buildEnvironment;
39
+ }
40
+ async function defaultCommandRunner(file, args, options) {
41
+ try {
42
+ const result = await execFileAsync(file, args, {
43
+ cwd: options.cwd,
44
+ env: options.env,
45
+ maxBuffer: 20 * 1024 * 1024,
46
+ });
47
+ return {
48
+ exitCode: 0,
49
+ stdout: result.stdout,
50
+ stderr: result.stderr,
51
+ };
52
+ }
53
+ catch (error) {
54
+ const failed = error;
55
+ return {
56
+ exitCode: typeof failed.code === 'number' ? failed.code : 1,
57
+ stdout: failed.stdout ?? '',
58
+ stderr: failed.stderr ?? failed.message ?? '',
59
+ };
60
+ }
61
+ }
@@ -0,0 +1 @@
1
+ export declare function ensureNormalizedLocalHarCompatibilityShims(directoryPath: string, packageName: string): Promise<void>;
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureNormalizedLocalHarCompatibilityShims = ensureNormalizedLocalHarCompatibilityShims;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ async function ensureNormalizedLocalHarCompatibilityShims(directoryPath, packageName) {
10
+ if (packageName === '@react-native-oh-tpl/react-native-gesture-handler') {
11
+ const gestureHandlerPackageHeaderPath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'RnohReactNativeHarmonyGestureHandlerPackage.h');
12
+ const gestureHandlerPackagePath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'RnohReactNativeHarmonyGestureHandlerPackage.cpp');
13
+ const gestureHandlerTurboModulePath = path_1.default.join(directoryPath, 'src', 'main', 'ets', 'rnoh', 'RNGestureHandlerModule.ts');
14
+ if (await fs_extra_1.default.pathExists(gestureHandlerTurboModulePath)) {
15
+ const gestureHandlerTurboModuleContents = await fs_extra_1.default.readFile(gestureHandlerTurboModulePath, 'utf8');
16
+ let nextGestureHandlerTurboModuleContents = gestureHandlerTurboModuleContents;
17
+ nextGestureHandlerTurboModuleContents = nextGestureHandlerTurboModuleContents.replace(/^import \{ TM \} from ["']@rnoh\/react-native-openharmony\/generated\/ts["'];?\r?\n/m, '');
18
+ nextGestureHandlerTurboModuleContents = nextGestureHandlerTurboModuleContents.replace(/\s+implements TM\.RNGestureHandlerModule\.Spec/, '');
19
+ if (nextGestureHandlerTurboModuleContents !== gestureHandlerTurboModuleContents) {
20
+ await fs_extra_1.default.writeFile(gestureHandlerTurboModulePath, nextGestureHandlerTurboModuleContents);
21
+ }
22
+ }
23
+ const gestureHandlerGeneratedDirectoryPath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'generated');
24
+ await fs_extra_1.default.ensureDir(gestureHandlerGeneratedDirectoryPath);
25
+ await fs_extra_1.default.writeFile(path_1.default.join(gestureHandlerGeneratedDirectoryPath, 'RNGestureHandlerButtonComponentDescriptor.h'), createGestureHandlerCompatibilityDescriptorHeader('RNGestureHandlerButton'));
26
+ await fs_extra_1.default.writeFile(path_1.default.join(gestureHandlerGeneratedDirectoryPath, 'RNGestureHandlerRootViewComponentDescriptor.h'), createGestureHandlerCompatibilityDescriptorHeader('RNGestureHandlerRootView'));
27
+ if (await fs_extra_1.default.pathExists(gestureHandlerPackageHeaderPath)) {
28
+ const gestureHandlerPackageHeaderContents = await fs_extra_1.default.readFile(gestureHandlerPackageHeaderPath, 'utf8');
29
+ const nextGestureHandlerPackageHeaderContents = patchGestureHandlerCompatibilityPackageHeader(gestureHandlerPackageHeaderContents);
30
+ if (nextGestureHandlerPackageHeaderContents !== gestureHandlerPackageHeaderContents) {
31
+ await fs_extra_1.default.writeFile(gestureHandlerPackageHeaderPath, nextGestureHandlerPackageHeaderContents);
32
+ }
33
+ }
34
+ if (!(await fs_extra_1.default.pathExists(gestureHandlerPackagePath))) {
35
+ return;
36
+ }
37
+ const gestureHandlerPackageContents = await fs_extra_1.default.readFile(gestureHandlerPackagePath, 'utf8');
38
+ const nextGestureHandlerPackageContents = patchGestureHandlerCompatibilityPackageSource(gestureHandlerPackageContents);
39
+ if (nextGestureHandlerPackageContents !== gestureHandlerPackageContents) {
40
+ await fs_extra_1.default.writeFile(gestureHandlerPackagePath, nextGestureHandlerPackageContents);
41
+ }
42
+ if (!nextGestureHandlerPackageContents.includes('<react/renderer/debug/SystraceSection.h>')) {
43
+ return;
44
+ }
45
+ const systraceCompatibilityShimPath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'react', 'renderer', 'debug', 'SystraceSection.h');
46
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(systraceCompatibilityShimPath));
47
+ await fs_extra_1.default.writeFile(systraceCompatibilityShimPath, '#pragma once\n#include <cxxreact/SystraceSection.h>\n');
48
+ return;
49
+ }
50
+ if (packageName === '@react-native-oh-tpl/react-native-reanimated') {
51
+ const reanimatedCmakeListsPath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'CMakeLists.txt');
52
+ const reanimatedMountHookHeaderPath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'Common', 'cpp', 'Fabric', 'ReanimatedMountHook.h');
53
+ const reanimatedMountHookSourcePath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'Common', 'cpp', 'Fabric', 'ReanimatedMountHook.cpp');
54
+ const nativeReanimatedModuleSourcePath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'Common', 'cpp', 'NativeModules', 'NativeReanimatedModule.cpp');
55
+ if (await fs_extra_1.default.pathExists(reanimatedCmakeListsPath)) {
56
+ const reanimatedCmakeListsContents = await fs_extra_1.default.readFile(reanimatedCmakeListsPath, 'utf8');
57
+ if (reanimatedCmakeListsContents.includes('REACT_NATIVE_MINOR_VERSION=72')) {
58
+ await fs_extra_1.default.writeFile(reanimatedCmakeListsPath, reanimatedCmakeListsContents.replace('REACT_NATIVE_MINOR_VERSION=72', 'REACT_NATIVE_MINOR_VERSION=82'));
59
+ }
60
+ }
61
+ if (await fs_extra_1.default.pathExists(reanimatedMountHookHeaderPath)) {
62
+ const reanimatedMountHookHeaderContents = await fs_extra_1.default.readFile(reanimatedMountHookHeaderPath, 'utf8');
63
+ if (reanimatedMountHookHeaderContents.includes('double mountTime) noexcept override;')) {
64
+ await fs_extra_1.default.writeFile(reanimatedMountHookHeaderPath, reanimatedMountHookHeaderContents.replace('double mountTime) noexcept override;', 'HighResTimeStamp mountTime) noexcept override;'));
65
+ }
66
+ }
67
+ if (await fs_extra_1.default.pathExists(reanimatedMountHookSourcePath)) {
68
+ const reanimatedMountHookSourceContents = await fs_extra_1.default.readFile(reanimatedMountHookSourcePath, 'utf8');
69
+ if (reanimatedMountHookSourceContents.includes('double) noexcept {')) {
70
+ await fs_extra_1.default.writeFile(reanimatedMountHookSourcePath, reanimatedMountHookSourceContents.replace('double) noexcept {', 'HighResTimeStamp) noexcept {'));
71
+ }
72
+ }
73
+ if (await fs_extra_1.default.pathExists(nativeReanimatedModuleSourcePath)) {
74
+ const nativeReanimatedModuleSourceContents = await fs_extra_1.default.readFile(nativeReanimatedModuleSourcePath, 'utf8');
75
+ let nextNativeReanimatedModuleSourceContents = nativeReanimatedModuleSourceContents;
76
+ if (nextNativeReanimatedModuleSourceContents.includes('<react/renderer/core/TraitCast.h>')) {
77
+ nextNativeReanimatedModuleSourceContents = nextNativeReanimatedModuleSourceContents.replace('<react/renderer/core/TraitCast.h>', '<react/renderer/core/LayoutableShadowNode.h>');
78
+ }
79
+ if (nextNativeReanimatedModuleSourceContents.includes('#include <react/utils/CoreFeatures.h>')) {
80
+ nextNativeReanimatedModuleSourceContents = nextNativeReanimatedModuleSourceContents.replace('#include <react/utils/CoreFeatures.h>\n', '');
81
+ nextNativeReanimatedModuleSourceContents = nextNativeReanimatedModuleSourceContents.replace('#include <react/utils/CoreFeatures.h>\r\n', '');
82
+ }
83
+ if (nextNativeReanimatedModuleSourceContents.includes('traitCast<LayoutableShadowNode const *>(newestCloneOfShadowNode.get())')) {
84
+ nextNativeReanimatedModuleSourceContents = nextNativeReanimatedModuleSourceContents.replace('traitCast<LayoutableShadowNode const *>(newestCloneOfShadowNode.get())', 'dynamic_cast<LayoutableShadowNode const *>(newestCloneOfShadowNode.get())');
85
+ }
86
+ if (nextNativeReanimatedModuleSourceContents.includes('shadowNodeFromValue(rt, shadowNodeWrapper)')) {
87
+ nextNativeReanimatedModuleSourceContents =
88
+ nextNativeReanimatedModuleSourceContents.replace(/auto (\w+) = shadowNodeFromValue\(rt, shadowNodeWrapper\);/g, 'auto $1 = Bridging<std::shared_ptr<const ShadowNode>>::fromJs(rt, shadowNodeWrapper);');
89
+ }
90
+ if (nextNativeReanimatedModuleSourceContents.includes('shadowNodeFromValue(rt, shadowNodeValue)')) {
91
+ nextNativeReanimatedModuleSourceContents =
92
+ nextNativeReanimatedModuleSourceContents.replace(/(ShadowNode::Shared|auto) (\w+) = shadowNodeFromValue\(rt, shadowNodeValue\);/g, 'auto $2 = Bridging<std::shared_ptr<const ShadowNode>>::fromJs(rt, shadowNodeValue);');
93
+ }
94
+ if (nextNativeReanimatedModuleSourceContents.includes('bool CoreFeatures::useNativeState;')) {
95
+ nextNativeReanimatedModuleSourceContents = nextNativeReanimatedModuleSourceContents.replace(/#if REACT_NATIVE_MINOR_VERSION >= 73 && defined\(RCT_NEW_ARCH_ENABLED\)\r?\n\/\/ Android can't find the definition of this static field\r?\nbool CoreFeatures::useNativeState;\r?\n#endif\r?\n/m, '');
96
+ }
97
+ if (nextNativeReanimatedModuleSourceContents.includes('/* .shouldYield = */ [this]() {')) {
98
+ nextNativeReanimatedModuleSourceContents =
99
+ nextNativeReanimatedModuleSourceContents.replace(/#if REACT_NATIVE_MINOR_VERSION >= 72\r?\n\s*\/\* \.mountSynchronously = \*\/ true,\r?\n#endif\r?\n\s*\/\* \.shouldYield = \*\/ \[this\]\(\) \{\r?\n\s*return propsRegistry_->shouldReanimatedSkipCommit\(\);\r?\n\s*\}/m, '#if REACT_NATIVE_MINOR_VERSION >= 72\n'
100
+ + ' /* .mountSynchronously = */ true,\n'
101
+ + '#endif\n'
102
+ + ' /* .source = */ ShadowTree::CommitSource::Unknown');
103
+ }
104
+ if (nextNativeReanimatedModuleSourceContents !== nativeReanimatedModuleSourceContents) {
105
+ await fs_extra_1.default.writeFile(nativeReanimatedModuleSourcePath, nextNativeReanimatedModuleSourceContents);
106
+ }
107
+ }
108
+ return;
109
+ }
110
+ if (packageName !== '@react-native-oh-tpl/react-native-svg') {
111
+ return;
112
+ }
113
+ const svgGeneratedPropsPath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'generated', 'react', 'renderer', 'components', 'react_native_svg', 'Props.h');
114
+ const svgPathComponentInstancePath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'componentInstances', 'RNSVGPathComponentInstance.h');
115
+ const svgImageComponentDescriptorPath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'svgImage', 'RNSVGImageComponentDescriptor.h');
116
+ const svgImageShadowNodePath = path_1.default.join(directoryPath, 'src', 'main', 'cpp', 'svgImage', 'RNSVGImageShadowNode.h');
117
+ if (await fs_extra_1.default.pathExists(svgGeneratedPropsPath)) {
118
+ const svgGeneratedPropsContents = await fs_extra_1.default.readFile(svgGeneratedPropsPath, 'utf8');
119
+ if (svgGeneratedPropsContents.includes('butter::map<std::string, RawValue>')) {
120
+ await fs_extra_1.default.writeFile(svgGeneratedPropsPath, svgGeneratedPropsContents.replace(/butter::map<std::string, RawValue>/g, 'std::unordered_map<std::string, RawValue>'));
121
+ }
122
+ }
123
+ if (await fs_extra_1.default.pathExists(svgImageComponentDescriptorPath)) {
124
+ const svgImageComponentDescriptorContents = await fs_extra_1.default.readFile(svgImageComponentDescriptorPath, 'utf8');
125
+ let nextSvgImageComponentDescriptorContents = svgImageComponentDescriptorContents;
126
+ if (nextSvgImageComponentDescriptorContents.includes('void adopt(ShadowNode::Unshared const &shadowNode) const override {')) {
127
+ nextSvgImageComponentDescriptorContents =
128
+ nextSvgImageComponentDescriptorContents.replace('void adopt(ShadowNode::Unshared const &shadowNode) const override {', 'void adopt(ShadowNode& shadowNode) const override {');
129
+ }
130
+ if (nextSvgImageComponentDescriptorContents.includes('auto imageShadowNode = std::static_pointer_cast<RNSVGImageShadowNode>(shadowNode);')) {
131
+ nextSvgImageComponentDescriptorContents =
132
+ nextSvgImageComponentDescriptorContents.replace('auto imageShadowNode = std::static_pointer_cast<RNSVGImageShadowNode>(shadowNode);', 'auto& imageShadowNode = static_cast<RNSVGImageShadowNode&>(shadowNode);');
133
+ }
134
+ if (nextSvgImageComponentDescriptorContents.includes('imageShadowNode->setImageManager(imageManager_);')) {
135
+ nextSvgImageComponentDescriptorContents =
136
+ nextSvgImageComponentDescriptorContents.replace('imageShadowNode->setImageManager(imageManager_);', 'imageShadowNode.setImageManager(imageManager_);');
137
+ }
138
+ if (nextSvgImageComponentDescriptorContents !== svgImageComponentDescriptorContents) {
139
+ await fs_extra_1.default.writeFile(svgImageComponentDescriptorPath, nextSvgImageComponentDescriptorContents);
140
+ }
141
+ }
142
+ if (await fs_extra_1.default.pathExists(svgImageShadowNodePath)) {
143
+ const svgImageShadowNodeContents = await fs_extra_1.default.readFile(svgImageShadowNodePath, 'utf8');
144
+ let nextSvgImageShadowNodeContents = svgImageShadowNodeContents;
145
+ const svgImageShadowNodeNewline = svgImageShadowNodeContents.includes('\r\n') ? '\r\n' : '\n';
146
+ if (!nextSvgImageShadowNodeContents.includes('#include <react/renderer/core/ShadowNodeFamily.h>')
147
+ && nextSvgImageShadowNodeContents.includes('#include <react/renderer/components/view/ConcreteViewShadowNode.h>')) {
148
+ nextSvgImageShadowNodeContents = nextSvgImageShadowNodeContents.replace('#include <react/renderer/components/view/ConcreteViewShadowNode.h>', '#include <react/renderer/components/view/ConcreteViewShadowNode.h>'
149
+ + `${svgImageShadowNodeNewline}#include <react/renderer/core/ShadowNodeFamily.h>`);
150
+ }
151
+ const svgImageInitialStateSignaturePattern = /static RNSVGImageState initialStateData\(ShadowNodeFragment const &fragment,\r?\n\s*ShadowNodeFamilyFragment const &familyFragment,\r?\n\s*ComponentDescriptor const &componentDescriptor\) \{/m;
152
+ if (svgImageInitialStateSignaturePattern.test(nextSvgImageShadowNodeContents)) {
153
+ nextSvgImageShadowNodeContents = nextSvgImageShadowNodeContents.replace(svgImageInitialStateSignaturePattern, 'static RNSVGImageState initialStateData(const Props::Shared& /*props*/,'
154
+ + `${svgImageShadowNodeNewline}`
155
+ + ' const ShadowNodeFamily::Shared& /*family*/,'
156
+ + `${svgImageShadowNodeNewline}`
157
+ + ' const ComponentDescriptor& /*componentDescriptor*/) {');
158
+ }
159
+ if (nextSvgImageShadowNodeContents !== svgImageShadowNodeContents) {
160
+ await fs_extra_1.default.writeFile(svgImageShadowNodePath, nextSvgImageShadowNodeContents);
161
+ }
162
+ }
163
+ if (!(await fs_extra_1.default.pathExists(svgPathComponentInstancePath))) {
164
+ return;
165
+ }
166
+ const svgPathComponentInstanceContents = await fs_extra_1.default.readFile(svgPathComponentInstancePath, 'utf8');
167
+ if (!svgPathComponentInstanceContents.includes('Float m_cacheScale;')) {
168
+ return;
169
+ }
170
+ await fs_extra_1.default.writeFile(svgPathComponentInstancePath, svgPathComponentInstanceContents.replace('Float m_cacheScale;', 'facebook::react::Float m_cacheScale;'));
171
+ }
172
+ function createGestureHandlerCompatibilityDescriptorHeader(componentName) {
173
+ return [
174
+ '#pragma once',
175
+ '',
176
+ '#include <react/renderer/components/view/ConcreteViewShadowNode.h>',
177
+ '#include <react/renderer/core/ConcreteComponentDescriptor.h>',
178
+ '',
179
+ 'namespace facebook::react {',
180
+ '',
181
+ `inline constexpr char ${componentName}ComponentName[] = "${componentName}";`,
182
+ '',
183
+ `using ${componentName}ShadowNode = ConcreteViewShadowNode<${componentName}ComponentName>;`,
184
+ `using ${componentName}ComponentDescriptor = ConcreteComponentDescriptor<${componentName}ShadowNode>;`,
185
+ '',
186
+ '} // namespace facebook::react',
187
+ '',
188
+ ].join('\n');
189
+ }
190
+ function patchGestureHandlerCompatibilityPackageHeader(contents) {
191
+ if (contents.includes('createComponentDescriptorProviders() override;')) {
192
+ return contents;
193
+ }
194
+ return contents.replace(' std::vector<ArkTSMessageHandler::Shared> createArkTSMessageHandlers() override;\n', [
195
+ ' std::vector<facebook::react::ComponentDescriptorProvider> createComponentDescriptorProviders() override;',
196
+ '',
197
+ ' ComponentJSIBinderByString createComponentJSIBinderByName() override;',
198
+ '',
199
+ ' std::vector<ArkTSMessageHandler::Shared> createArkTSMessageHandlers() override;',
200
+ ].join('\n'));
201
+ }
202
+ function patchGestureHandlerCompatibilityPackageSource(contents) {
203
+ let nextContents = contents;
204
+ if (!nextContents.includes('#include "RNOHCorePackage/ComponentBinders/ViewComponentJSIBinder.h"')) {
205
+ nextContents = nextContents.replace('#include "RNOH/RNInstanceCAPI.h"\n', '#include "RNOH/RNInstanceCAPI.h"\n#include "RNOHCorePackage/ComponentBinders/ViewComponentJSIBinder.h"\n');
206
+ }
207
+ if (!nextContents.includes('#include "generated/RNGestureHandlerButtonComponentDescriptor.h"')) {
208
+ nextContents = nextContents.replace('#include "componentInstances/RNGestureHandlerRootViewComponentInstance.h"\n', '#include "componentInstances/RNGestureHandlerRootViewComponentInstance.h"\n#include "generated/RNGestureHandlerButtonComponentDescriptor.h"\n#include "generated/RNGestureHandlerRootViewComponentDescriptor.h"\n');
209
+ }
210
+ if (!nextContents.includes('class RNGestureHandlerComponentJSIBinder')) {
211
+ nextContents = nextContents.replace('using namespace rnoh;\nusing namespace facebook;\n\n', [
212
+ 'using namespace rnoh;',
213
+ 'using namespace facebook;',
214
+ '',
215
+ 'class RNGestureHandlerComponentJSIBinder : public ViewComponentJSIBinder {',
216
+ 'protected:',
217
+ ' facebook::jsi::Object createNativeProps(facebook::jsi::Runtime &rt) override {',
218
+ ' auto nativeProps = ViewComponentJSIBinder::createNativeProps(rt);',
219
+ ' nativeProps.setProperty(rt, "exclusive", "boolean");',
220
+ ' nativeProps.setProperty(rt, "foreground", "boolean");',
221
+ ' nativeProps.setProperty(rt, "borderless", "boolean");',
222
+ ' nativeProps.setProperty(rt, "enabled", "boolean");',
223
+ ' nativeProps.setProperty(rt, "rippleColor", "Color");',
224
+ ' nativeProps.setProperty(rt, "rippleRadius", "number");',
225
+ ' nativeProps.setProperty(rt, "touchSoundDisabled", "boolean");',
226
+ ' return nativeProps;',
227
+ ' }',
228
+ '',
229
+ ' facebook::jsi::Object createDirectEventTypes(facebook::jsi::Runtime &rt) override {',
230
+ ' auto events = ViewComponentJSIBinder::createDirectEventTypes(rt);',
231
+ ' events.setProperty(rt, "onGestureHandlerEvent", createDirectEvent(rt, "onGestureHandlerEvent"));',
232
+ ' events.setProperty(',
233
+ ' rt,',
234
+ ' "onGestureHandlerStateChange",',
235
+ ' createDirectEvent(rt, "onGestureHandlerStateChange"));',
236
+ ' events.setProperty(rt, "topOnGestureHandlerEvent", createDirectEvent(rt, "onGestureHandlerEvent"));',
237
+ ' events.setProperty(',
238
+ ' rt,',
239
+ ' "topOnGestureHandlerStateChange",',
240
+ ' createDirectEvent(rt, "onGestureHandlerStateChange"));',
241
+ ' return events;',
242
+ ' }',
243
+ '};',
244
+ '',
245
+ ].join('\n'));
246
+ }
247
+ if (!nextContents.includes('RnohReactNativeHarmonyGestureHandlerPackage::createComponentDescriptorProviders()')) {
248
+ nextContents = nextContents.replace('EventEmitRequestHandlers RnohReactNativeHarmonyGestureHandlerPackage::createEventEmitRequestHandlers() {\n', [
249
+ 'std::vector<facebook::react::ComponentDescriptorProvider>',
250
+ 'RnohReactNativeHarmonyGestureHandlerPackage::createComponentDescriptorProviders() {',
251
+ ' return {',
252
+ ' facebook::react::concreteComponentDescriptorProvider<',
253
+ ' facebook::react::RNGestureHandlerButtonComponentDescriptor>(),',
254
+ ' facebook::react::concreteComponentDescriptorProvider<',
255
+ ' facebook::react::RNGestureHandlerRootViewComponentDescriptor>(),',
256
+ ' };',
257
+ '}',
258
+ '',
259
+ 'ComponentJSIBinderByString',
260
+ 'RnohReactNativeHarmonyGestureHandlerPackage::createComponentJSIBinderByName() {',
261
+ ' auto componentJSIBinder = std::make_shared<RNGestureHandlerComponentJSIBinder>();',
262
+ ' return {',
263
+ ' {"RNGestureHandlerButton", componentJSIBinder},',
264
+ ' {"RNGestureHandlerRootView", componentJSIBinder},',
265
+ ' };',
266
+ '}',
267
+ '',
268
+ 'EventEmitRequestHandlers RnohReactNativeHarmonyGestureHandlerPackage::createEventEmitRequestHandlers() {',
269
+ ].join('\n'));
270
+ }
271
+ return nextContents;
272
+ }
@@ -0,0 +1,13 @@
1
+ export interface NormalizedLocalHarPackage {
2
+ packageName: string;
3
+ moduleName: string;
4
+ directoryPath: string;
5
+ }
6
+ export declare function normalizeLocalHarDependencies(harmonyProjectRoot: string): Promise<{
7
+ restore: () => Promise<void>;
8
+ packages: NormalizedLocalHarPackage[];
9
+ }>;
10
+ export declare function ensureHarmonyBuildProfileSupportsNormalizedLocalDeps(harmonyProjectRoot: string, localHarPackages: NormalizedLocalHarPackage[]): Promise<() => Promise<void>>;
11
+ export declare function ensureRnohGeneratedTsShim(harmonyProjectRoot: string): Promise<void>;
12
+ export declare function alignRnohCodegenWithNormalizedLocalPackage(harmonyProjectRoot: string, localHarPackages: NormalizedLocalHarPackage[]): Promise<() => Promise<void>>;
13
+ export declare function findHarmonyArtifacts(harmonyProjectRoot: string): Promise<string[]>;