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,2 @@
1
+ export declare function renderReactNativeSafeAreaContextHarmonyShim(): string;
2
+ export declare function renderHarmonyRuntimePrelude(): string;
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderReactNativeSafeAreaContextHarmonyShim = renderReactNativeSafeAreaContextHarmonyShim;
4
+ exports.renderHarmonyRuntimePrelude = renderHarmonyRuntimePrelude;
5
+ function renderReactNativeSafeAreaContextHarmonyShim() {
6
+ return `'use strict';
7
+
8
+ const React = require('react');
9
+ const { Dimensions, View } = require('react-native');
10
+
11
+ function getWindowMetrics() {
12
+ const metrics = Dimensions.get('window') ?? { width: 0, height: 0 };
13
+
14
+ return {
15
+ frame: {
16
+ x: 0,
17
+ y: 0,
18
+ width: typeof metrics.width === 'number' ? metrics.width : 0,
19
+ height: typeof metrics.height === 'number' ? metrics.height : 0,
20
+ },
21
+ insets: {
22
+ top: 0,
23
+ right: 0,
24
+ bottom: 0,
25
+ left: 0,
26
+ },
27
+ };
28
+ }
29
+
30
+ const initialWindowMetrics = getWindowMetrics();
31
+ const initialWindowSafeAreaInsets = initialWindowMetrics.insets;
32
+ const SafeAreaInsetsContext = React.createContext(initialWindowMetrics.insets);
33
+ const SafeAreaFrameContext = React.createContext(initialWindowMetrics.frame);
34
+
35
+ function SafeAreaProvider({ children, initialMetrics = initialWindowMetrics, style }) {
36
+ const metrics = initialMetrics ?? initialWindowMetrics;
37
+
38
+ return React.createElement(
39
+ SafeAreaFrameContext.Provider,
40
+ { value: metrics.frame },
41
+ React.createElement(
42
+ SafeAreaInsetsContext.Provider,
43
+ { value: metrics.insets },
44
+ React.createElement(View, { style: [{ flex: 1 }, style] }, children),
45
+ ),
46
+ );
47
+ }
48
+
49
+ function NativeSafeAreaProvider(props) {
50
+ return React.createElement(SafeAreaProvider, props);
51
+ }
52
+
53
+ function SafeAreaView({ children, style, ...rest }) {
54
+ return React.createElement(View, { ...rest, style }, children);
55
+ }
56
+
57
+ function SafeAreaListener({ children }) {
58
+ return typeof children === 'function' ? children(initialWindowMetrics) : null;
59
+ }
60
+
61
+ function useSafeAreaInsets() {
62
+ return React.useContext(SafeAreaInsetsContext);
63
+ }
64
+
65
+ function useSafeAreaFrame() {
66
+ return React.useContext(SafeAreaFrameContext);
67
+ }
68
+
69
+ function useSafeArea() {
70
+ return useSafeAreaInsets();
71
+ }
72
+
73
+ function withSafeAreaInsets(Component) {
74
+ return React.forwardRef((props, ref) =>
75
+ React.createElement(Component, {
76
+ ...props,
77
+ ref,
78
+ insets: useSafeAreaInsets(),
79
+ }),
80
+ );
81
+ }
82
+
83
+ module.exports = {
84
+ EdgeInsets: undefined,
85
+ initialWindowMetrics,
86
+ initialWindowSafeAreaInsets,
87
+ NativeSafeAreaProvider,
88
+ SafeAreaConsumer: SafeAreaInsetsContext.Consumer,
89
+ SafeAreaFrameContext,
90
+ SafeAreaInsetsContext,
91
+ SafeAreaListener,
92
+ SafeAreaProvider,
93
+ SafeAreaView,
94
+ useSafeArea,
95
+ useSafeAreaFrame,
96
+ useSafeAreaInsets,
97
+ withSafeAreaInsets,
98
+ };
99
+ `;
100
+ }
101
+ function renderHarmonyRuntimePrelude() {
102
+ return `'use strict';
103
+
104
+ require('react-native/Libraries/Core/InitializeCore');
105
+
106
+ function requireReactNativeBaseViewConfigHarmony() {
107
+ try {
108
+ return require('react-native/Libraries/NativeComponent/BaseViewConfig.harmony');
109
+ } catch (_error) {
110
+ return null;
111
+ }
112
+ }
113
+
114
+ function requireRnohBaseViewConfigHarmony() {
115
+ try {
116
+ return require('@react-native-oh/react-native-harmony/Libraries/NativeComponent/BaseViewConfig.harmony');
117
+ } catch (_error) {
118
+ return null;
119
+ }
120
+ }
121
+
122
+ function requireReactNativeBaseViewConfig() {
123
+ try {
124
+ return require('react-native/Libraries/NativeComponent/BaseViewConfig');
125
+ } catch (_error) {
126
+ return null;
127
+ }
128
+ }
129
+
130
+ function requireReactNativePlatformBaseViewConfig() {
131
+ try {
132
+ return require('react-native/Libraries/NativeComponent/PlatformBaseViewConfig');
133
+ } catch (_error) {
134
+ return null;
135
+ }
136
+ }
137
+
138
+ function requireRnohBaseViewConfig() {
139
+ try {
140
+ return require('@react-native-oh/react-native-harmony/Libraries/NativeComponent/BaseViewConfig');
141
+ } catch (_error) {
142
+ return null;
143
+ }
144
+ }
145
+
146
+ function requireRnohPlatformBaseViewConfig() {
147
+ try {
148
+ return require('@react-native-oh/react-native-harmony/Libraries/NativeComponent/PlatformBaseViewConfig');
149
+ } catch (_error) {
150
+ return null;
151
+ }
152
+ }
153
+
154
+ function patchNativeComponentViewConfigDefaults() {
155
+ const harmonyBaseViewConfigModule =
156
+ requireReactNativeBaseViewConfigHarmony() ?? requireRnohBaseViewConfigHarmony();
157
+ const harmonyBaseViewConfig = harmonyBaseViewConfigModule?.default ?? harmonyBaseViewConfigModule;
158
+
159
+ if (!harmonyBaseViewConfig) {
160
+ return;
161
+ }
162
+
163
+ for (const moduleExports of [
164
+ requireReactNativeBaseViewConfig(),
165
+ requireReactNativePlatformBaseViewConfig(),
166
+ requireRnohBaseViewConfig(),
167
+ requireRnohPlatformBaseViewConfig(),
168
+ ]) {
169
+ if (moduleExports && typeof moduleExports === 'object') {
170
+ moduleExports.default = harmonyBaseViewConfig;
171
+ }
172
+ }
173
+ }
174
+
175
+ function installGlobalIfMissing(name, factory) {
176
+ if (typeof globalThis[name] !== 'undefined') {
177
+ return;
178
+ }
179
+
180
+ const value = factory();
181
+
182
+ if (typeof value !== 'undefined') {
183
+ globalThis[name] = value;
184
+ }
185
+ }
186
+
187
+ patchNativeComponentViewConfigDefaults();
188
+ installGlobalIfMissing('FormData', () => require('react-native/Libraries/Network/FormData').default);
189
+ installGlobalIfMissing('Blob', () => require('react-native/Libraries/Blob/Blob').default);
190
+ installGlobalIfMissing('FileReader', () => require('react-native/Libraries/Blob/FileReader').default);
191
+ `;
192
+ }
@@ -0,0 +1,11 @@
1
+ import { HarmonyIdentifiers, PackageJson, ToolkitConfig, ToolkitManifest } from '../../types';
2
+ export declare function isBinaryTemplate(relativePath: string): boolean;
3
+ export declare function contentsEqual(currentContents: Buffer, nextContents: string | Buffer, binary?: boolean): boolean;
4
+ export declare function sortRecordByKey(record: Record<string, string>): Record<string, string>;
5
+ export declare function isEquivalentToolkitScript(scriptName: string, currentCommand: string, desiredCommand: string): boolean;
6
+ export declare function buildDesiredPackageScripts(_packageJson: PackageJson): Record<string, string>;
7
+ export declare function usesExpoRouter(packageJson: PackageJson): boolean;
8
+ export declare function resolveHarmonyBundleEntryFile(packageJson: PackageJson): string;
9
+ export declare function renderRouterHarmonyEntry(identifiers: HarmonyIdentifiers): string;
10
+ export declare function collectMetadataWarnings(previousManifest: ToolkitManifest | null, previousToolkitConfig: ToolkitConfig | null): string[];
11
+ export declare function stabilizeToolkitConfigTimestamp(previousToolkitConfig: ToolkitConfig | null, nextToolkitConfig: ToolkitConfig): ToolkitConfig;
@@ -0,0 +1,108 @@
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.isBinaryTemplate = isBinaryTemplate;
7
+ exports.contentsEqual = contentsEqual;
8
+ exports.sortRecordByKey = sortRecordByKey;
9
+ exports.isEquivalentToolkitScript = isEquivalentToolkitScript;
10
+ exports.buildDesiredPackageScripts = buildDesiredPackageScripts;
11
+ exports.usesExpoRouter = usesExpoRouter;
12
+ exports.resolveHarmonyBundleEntryFile = resolveHarmonyBundleEntryFile;
13
+ exports.renderRouterHarmonyEntry = renderRouterHarmonyEntry;
14
+ exports.collectMetadataWarnings = collectMetadataWarnings;
15
+ exports.stabilizeToolkitConfigTimestamp = stabilizeToolkitConfigTimestamp;
16
+ const path_1 = __importDefault(require("path"));
17
+ const constants_1 = require("../constants");
18
+ const project_1 = require("../project");
19
+ const validatedMatrices_1 = require("../../data/validatedMatrices");
20
+ function isBinaryTemplate(relativePath) {
21
+ return ['.png'].includes(path_1.default.extname(relativePath));
22
+ }
23
+ function contentsEqual(currentContents, nextContents, binary = false) {
24
+ if (binary || Buffer.isBuffer(nextContents)) {
25
+ return currentContents.equals(Buffer.isBuffer(nextContents) ? nextContents : Buffer.from(nextContents));
26
+ }
27
+ return currentContents.toString('utf8') === nextContents;
28
+ }
29
+ function sortRecordByKey(record) {
30
+ return Object.fromEntries(Object.entries(record).sort(([left], [right]) => left.localeCompare(right)));
31
+ }
32
+ function isEquivalentToolkitScript(scriptName, currentCommand, desiredCommand) {
33
+ if (currentCommand === desiredCommand) {
34
+ return true;
35
+ }
36
+ const compatibilityPatterns = {
37
+ 'harmony:doctor': /\bexpo-harmony(?:\.js)?\s+doctor\b/,
38
+ 'harmony:init': /\bexpo-harmony(?:\.js)?\s+init\b/,
39
+ 'harmony:sync-template': /\bexpo-harmony(?:\.js)?\s+sync-template\b/,
40
+ 'harmony:env': /\bexpo-harmony(?:\.js)?\s+env\b/,
41
+ 'harmony:bundle': /\bexpo-harmony(?:\.js)?\s+bundle\b/,
42
+ 'harmony:build:debug': /\bexpo-harmony(?:\.js)?\s+build-hap\b[\s\S]*--mode\s+debug\b/,
43
+ 'harmony:build:release': /\bexpo-harmony(?:\.js)?\s+build-hap\b[\s\S]*--mode\s+release\b/,
44
+ };
45
+ const compatibilityPattern = compatibilityPatterns[scriptName];
46
+ return compatibilityPattern ? compatibilityPattern.test(currentCommand) : false;
47
+ }
48
+ function buildDesiredPackageScripts(_packageJson) {
49
+ return {
50
+ ...constants_1.DESIRED_PACKAGE_SCRIPTS,
51
+ };
52
+ }
53
+ function usesExpoRouter(packageJson) {
54
+ return (0, project_1.hasDeclaredDependency)(packageJson, 'expo-router');
55
+ }
56
+ function resolveHarmonyBundleEntryFile(packageJson) {
57
+ return usesExpoRouter(packageJson) ? constants_1.HARMONY_ROUTER_ENTRY_FILENAME : 'index.js';
58
+ }
59
+ function renderRouterHarmonyEntry(identifiers) {
60
+ return `require('./${constants_1.HARMONY_RUNTIME_PRELUDE_RELATIVE_PATH}');
61
+
62
+ const React = require('react');
63
+ const { AppRegistry } = require('react-native');
64
+ const { registerRootComponent } = require('expo');
65
+ const { ExpoRoot } = require('expo-router');
66
+
67
+ const context = require.context('./app', true, /\\.[jt]sx?$/);
68
+
69
+ function App() {
70
+ return React.createElement(ExpoRoot, {
71
+ context,
72
+ });
73
+ }
74
+
75
+ registerRootComponent(App);
76
+ AppRegistry.registerComponent(${JSON.stringify(identifiers.slug)}, () => App);
77
+ `;
78
+ }
79
+ function collectMetadataWarnings(previousManifest, previousToolkitConfig) {
80
+ const warnings = [];
81
+ if (previousManifest && previousManifest.templateVersion !== constants_1.TEMPLATE_VERSION) {
82
+ warnings.push(`Existing manifest template version ${previousManifest.templateVersion} does not match current template ${constants_1.TEMPLATE_VERSION}. Sync will refresh managed metadata.`);
83
+ }
84
+ if (previousManifest && previousManifest.matrixId !== validatedMatrices_1.DEFAULT_VALIDATED_MATRIX_ID) {
85
+ warnings.push(`Existing manifest matrix ${previousManifest.matrixId ?? 'unknown'} does not match current matrix ${validatedMatrices_1.DEFAULT_VALIDATED_MATRIX_ID}. Sync will refresh managed metadata.`);
86
+ }
87
+ if (previousToolkitConfig && previousToolkitConfig.templateVersion !== constants_1.TEMPLATE_VERSION) {
88
+ warnings.push(`Existing toolkit-config template version ${previousToolkitConfig.templateVersion} does not match current template ${constants_1.TEMPLATE_VERSION}. Sync will refresh managed metadata.`);
89
+ }
90
+ if (previousToolkitConfig && previousToolkitConfig.matrixId !== validatedMatrices_1.DEFAULT_VALIDATED_MATRIX_ID) {
91
+ warnings.push(`Existing toolkit-config matrix ${previousToolkitConfig.matrixId ?? 'unknown'} does not match current matrix ${validatedMatrices_1.DEFAULT_VALIDATED_MATRIX_ID}. Sync will refresh managed metadata.`);
92
+ }
93
+ return warnings;
94
+ }
95
+ function stabilizeToolkitConfigTimestamp(previousToolkitConfig, nextToolkitConfig) {
96
+ if (!previousToolkitConfig) {
97
+ return nextToolkitConfig;
98
+ }
99
+ const { generatedAt: previousGeneratedAt, ...previousComparable } = previousToolkitConfig;
100
+ const { generatedAt: nextGeneratedAt, ...nextComparable } = nextToolkitConfig;
101
+ if (JSON.stringify(previousComparable) === JSON.stringify(nextComparable)) {
102
+ return {
103
+ ...nextToolkitConfig,
104
+ generatedAt: previousGeneratedAt,
105
+ };
106
+ }
107
+ return nextToolkitConfig;
108
+ }
@@ -1,4 +1,5 @@
1
- import { InitResult, PackageJson, SyncResult } from '../types';
1
+ import { InitResult, SyncResult } from '../types';
2
+ export { buildDesiredPackageScripts, resolveHarmonyBundleEntryFile, usesExpoRouter, } from './template/support';
2
3
  export declare const BUILD_REQUIRED_MANAGED_FILE_PATHS: readonly [string, string, string, string, string];
3
4
  interface SyncProjectTemplateOptions {
4
5
  forceManagedPaths?: readonly string[];
@@ -6,8 +7,3 @@ interface SyncProjectTemplateOptions {
6
7
  }
7
8
  export declare function initProject(projectRoot: string, force?: boolean): Promise<InitResult>;
8
9
  export declare function syncProjectTemplate(projectRoot: string, force?: boolean, options?: SyncProjectTemplateOptions): Promise<SyncResult>;
9
- export declare function normalizeKnownHarmonyPackageJsons(projectRoot: string): Promise<() => Promise<void>>;
10
- export declare function buildDesiredPackageScripts(packageJson: PackageJson): Record<string, string>;
11
- export declare function usesExpoRouter(packageJson: PackageJson): boolean;
12
- export declare function resolveHarmonyBundleEntryFile(packageJson: PackageJson): string;
13
- export {};