@expo-harmony/expo-modules-autolinking 55.0.25-harmony.1
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 +12 -0
- package/bin/expo-harmony-autolinking.ts +14 -0
- package/build/bin/expo-harmony-autolinking.d.ts +2 -0
- package/build/bin/expo-harmony-autolinking.js +11 -0
- package/build/index.d.ts +8 -0
- package/build/index.js +15 -0
- package/build/src/autolinking/link.d.ts +3 -0
- package/build/src/autolinking/link.js +150 -0
- package/build/src/autolinking/resolve.d.ts +4 -0
- package/build/src/autolinking/resolve.js +25 -0
- package/build/src/autolinking/search.d.ts +3 -0
- package/build/src/autolinking/search.js +357 -0
- package/build/src/autolinking/verify.d.ts +4 -0
- package/build/src/autolinking/verify.js +366 -0
- package/build/src/commands/autolinkingOptions.d.ts +12 -0
- package/build/src/commands/autolinkingOptions.js +35 -0
- package/build/src/commands/cli.d.ts +2 -0
- package/build/src/commands/cli.js +50 -0
- package/build/src/commands/link.d.ts +2 -0
- package/build/src/commands/link.js +27 -0
- package/build/src/commands/output.d.ts +3 -0
- package/build/src/commands/output.js +33 -0
- package/build/src/commands/resolve.d.ts +2 -0
- package/build/src/commands/resolve.js +13 -0
- package/build/src/commands/search.d.ts +2 -0
- package/build/src/commands/search.js +13 -0
- package/build/src/commands/verify.d.ts +2 -0
- package/build/src/commands/verify.js +17 -0
- package/build/src/config/constants.d.ts +17 -0
- package/build/src/config/constants.js +40 -0
- package/build/src/config/options.d.ts +13 -0
- package/build/src/config/options.js +202 -0
- package/build/src/errors.d.ts +18 -0
- package/build/src/errors.js +35 -0
- package/build/src/harmony/manifest/generate.d.ts +4 -0
- package/build/src/harmony/manifest/generate.js +55 -0
- package/build/src/harmony/manifest/index.d.ts +7 -0
- package/build/src/harmony/manifest/index.js +64 -0
- package/build/src/harmony/materialize.d.ts +12 -0
- package/build/src/harmony/materialize.js +278 -0
- package/build/src/harmony/ohpm/dependencies.d.ts +7 -0
- package/build/src/harmony/ohpm/dependencies.js +52 -0
- package/build/src/harmony/persistence/canonicalize.d.ts +15 -0
- package/build/src/harmony/persistence/canonicalize.js +108 -0
- package/build/src/harmony/providers/host.d.ts +3 -0
- package/build/src/harmony/providers/host.js +88 -0
- package/build/src/harmony/rnoh/cli.d.ts +2 -0
- package/build/src/harmony/rnoh/cli.js +55 -0
- package/build/src/harmony/rnoh/link.d.ts +2 -0
- package/build/src/harmony/rnoh/link.js +419 -0
- package/build/src/harmony/rnoh/packageMetadata.d.ts +12 -0
- package/build/src/harmony/rnoh/packageMetadata.js +125 -0
- package/build/src/harmony/transaction/previousState.d.ts +15 -0
- package/build/src/harmony/transaction/previousState.js +96 -0
- package/build/src/harmony/transaction/publish.d.ts +6 -0
- package/build/src/harmony/transaction/publish.js +272 -0
- package/build/src/harmony/transaction/stageProject.d.ts +18 -0
- package/build/src/harmony/transaction/stageProject.js +313 -0
- package/build/src/metadata/descriptor.d.ts +19 -0
- package/build/src/metadata/descriptor.js +306 -0
- package/build/src/metadata/host.d.ts +5 -0
- package/build/src/metadata/host.js +37 -0
- package/build/src/metadata/schema.d.ts +10 -0
- package/build/src/metadata/schema.js +171 -0
- package/build/src/types.d.ts +194 -0
- package/build/src/types.js +2 -0
- package/build/src/utilities/values.d.ts +17 -0
- package/build/src/utilities/values.js +205 -0
- package/harmony-module.schema.json +28 -0
- package/index.ts +41 -0
- package/package.json +66 -0
- package/src/autolinking/link.ts +170 -0
- package/src/autolinking/resolve.ts +33 -0
- package/src/autolinking/search.ts +369 -0
- package/src/autolinking/verify.ts +415 -0
- package/src/commands/autolinkingOptions.ts +38 -0
- package/src/commands/cli.ts +56 -0
- package/src/commands/link.ts +28 -0
- package/src/commands/output.ts +36 -0
- package/src/commands/resolve.ts +14 -0
- package/src/commands/search.ts +14 -0
- package/src/commands/verify.ts +17 -0
- package/src/config/constants.ts +45 -0
- package/src/config/options.ts +195 -0
- package/src/errors.ts +48 -0
- package/src/harmony/manifest/generate.ts +65 -0
- package/src/harmony/manifest/index.ts +81 -0
- package/src/harmony/materialize.ts +382 -0
- package/src/harmony/ohpm/dependencies.ts +59 -0
- package/src/harmony/persistence/canonicalize.ts +156 -0
- package/src/harmony/providers/host.ts +147 -0
- package/src/harmony/rnoh/cli.ts +59 -0
- package/src/harmony/rnoh/link.ts +481 -0
- package/src/harmony/rnoh/packageMetadata.ts +105 -0
- package/src/harmony/transaction/previousState.ts +71 -0
- package/src/harmony/transaction/publish.ts +287 -0
- package/src/harmony/transaction/stageProject.ts +345 -0
- package/src/metadata/descriptor.ts +324 -0
- package/src/metadata/host.ts +41 -0
- package/src/metadata/schema.ts +184 -0
- package/src/types.ts +220 -0
- package/src/utilities/values.ts +190 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,306 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createDescriptorFromSearchRecordAsync = createDescriptorFromSearchRecordAsync;
|
|
40
|
+
const fs = __importStar(require("node:fs"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
const json5_1 = __importDefault(require("json5"));
|
|
43
|
+
const errors_1 = require("../errors");
|
|
44
|
+
const schema_1 = require("./schema");
|
|
45
|
+
const materialize_1 = require("../harmony/materialize");
|
|
46
|
+
const packageMetadata_1 = require("../harmony/rnoh/packageMetadata");
|
|
47
|
+
const values_1 = require("../utilities/values");
|
|
48
|
+
const HarScanIgnoredDirectories = new Set(['.git', 'build', 'node_modules', 'oh_modules']);
|
|
49
|
+
const ArkTsLibraryManifestPath = 'harmony/library/oh-package.json5';
|
|
50
|
+
const ArkTsLibraryHarPath = 'harmony/library.har';
|
|
51
|
+
async function findHarPathsAsync(packageRoot, scanRoot, record) {
|
|
52
|
+
const harPaths = [];
|
|
53
|
+
const visited = new Set();
|
|
54
|
+
async function visit(directory) {
|
|
55
|
+
let real;
|
|
56
|
+
let entries;
|
|
57
|
+
try {
|
|
58
|
+
real = await fs.promises.realpath(directory);
|
|
59
|
+
entries = await fs.promises.readdir(directory, { withFileTypes: true });
|
|
60
|
+
}
|
|
61
|
+
catch (cause) {
|
|
62
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', 'Unable to scan harmony.autolinking.mainHarPath.', {
|
|
63
|
+
cause,
|
|
64
|
+
packageName: record.packageName,
|
|
65
|
+
stage: 'metadata',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (!(0, values_1.isPathInside)(packageRoot, real)) {
|
|
69
|
+
throw new errors_1.HarmonyAutolinkingError('PATH_OUTSIDE_PACKAGE', 'harmony.autolinking.mainHarPath resolves outside package root.', { packageName: record.packageName, stage: 'metadata' });
|
|
70
|
+
}
|
|
71
|
+
if (visited.has(real))
|
|
72
|
+
return;
|
|
73
|
+
visited.add(real);
|
|
74
|
+
entries.sort((left, right) => (0, values_1.compareText)(left.name, right.name));
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const target = path.join(directory, entry.name);
|
|
77
|
+
let stat;
|
|
78
|
+
try {
|
|
79
|
+
stat = await fs.promises.lstat(target);
|
|
80
|
+
}
|
|
81
|
+
catch (cause) {
|
|
82
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', 'A HAR scan entry is missing or unreadable.', {
|
|
83
|
+
cause,
|
|
84
|
+
packageName: record.packageName,
|
|
85
|
+
stage: 'metadata',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (stat.isDirectory()) {
|
|
89
|
+
if (HarScanIgnoredDirectories.has(entry.name))
|
|
90
|
+
continue;
|
|
91
|
+
await visit(target);
|
|
92
|
+
}
|
|
93
|
+
else if (path.extname(entry.name) === '.har') {
|
|
94
|
+
let realTarget;
|
|
95
|
+
try {
|
|
96
|
+
realTarget = await fs.promises.realpath(target);
|
|
97
|
+
if (!(await fs.promises.stat(realTarget)).isFile())
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
catch (cause) {
|
|
101
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', 'A HAR scan entry is missing or unreadable.', {
|
|
102
|
+
cause,
|
|
103
|
+
packageName: record.packageName,
|
|
104
|
+
stage: 'metadata',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
if (!(0, values_1.isPathInside)(packageRoot, realTarget)) {
|
|
108
|
+
throw new errors_1.HarmonyAutolinkingError('PATH_OUTSIDE_PACKAGE', 'A HAR scan path resolves outside package root.', { packageName: record.packageName, stage: 'metadata' });
|
|
109
|
+
}
|
|
110
|
+
harPaths.push((0, values_1.normalizeSlashes)(path.relative(packageRoot, target)));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
await visit(scanRoot);
|
|
115
|
+
return (0, values_1.sortedUniqueStrings)(harPaths);
|
|
116
|
+
}
|
|
117
|
+
function resolveOhpmPackageName(raw, harPaths, record) {
|
|
118
|
+
const base = (0, packageMetadata_1.defaultOhPackageNameForNpmPackage)(record.packageName);
|
|
119
|
+
const fallback = harPath => ({
|
|
120
|
+
harName: path.basename(harPath),
|
|
121
|
+
packageName: (0, packageMetadata_1.ohPackageNameForHar)(base, harPath, harPaths.length),
|
|
122
|
+
});
|
|
123
|
+
if (raw === undefined) {
|
|
124
|
+
return harPaths.length === 1 ? base : harPaths.map(fallback);
|
|
125
|
+
}
|
|
126
|
+
if (typeof raw === 'string') {
|
|
127
|
+
return harPaths.length === 1
|
|
128
|
+
? raw
|
|
129
|
+
: harPaths.map(harPath => ({
|
|
130
|
+
harName: path.basename(harPath),
|
|
131
|
+
packageName: (0, packageMetadata_1.ohPackageNameForHar)(raw, harPath, harPaths.length),
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
const harNames = new Set(harPaths.map(harPath => path.basename(harPath)));
|
|
135
|
+
const mappings = raw.map((mapping) => {
|
|
136
|
+
if (!harNames.has(mapping.harName)) {
|
|
137
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', `package.json#harmony.autolinking.ohPackageName mapping ${mapping.harName} does not match a discovered HAR.`, {
|
|
138
|
+
packageName: record.packageName,
|
|
139
|
+
stage: 'metadata',
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return mapping;
|
|
143
|
+
});
|
|
144
|
+
const mapped = new Set(mappings.map(mapping => mapping.harName));
|
|
145
|
+
for (const harPath of harPaths) {
|
|
146
|
+
if (!mapped.has(path.basename(harPath)))
|
|
147
|
+
mappings.push(fallback(harPath));
|
|
148
|
+
}
|
|
149
|
+
return mappings;
|
|
150
|
+
}
|
|
151
|
+
async function resolveArkTsModulePackageAsync(record, harmony) {
|
|
152
|
+
const hasHostExtensions = harmony.rootViewComponents.length > 0;
|
|
153
|
+
if (harmony.modules.length === 0 && !hasHostExtensions)
|
|
154
|
+
return undefined;
|
|
155
|
+
const manifestPath = await (0, values_1.resolveInsideAsync)(record.packageRoot, ArkTsLibraryManifestPath, 'Harmony library OHPM manifest', { packageName: record.packageName, type: 'file' });
|
|
156
|
+
let manifest;
|
|
157
|
+
try {
|
|
158
|
+
manifest = json5_1.default.parse(await fs.promises.readFile(manifestPath, 'utf8'));
|
|
159
|
+
}
|
|
160
|
+
catch (cause) {
|
|
161
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', `${ArkTsLibraryManifestPath} must contain valid JSON5.`, { cause, packageName: record.packageName, stage: 'metadata' });
|
|
162
|
+
}
|
|
163
|
+
if (!(0, values_1.isObject)(manifest) || !(0, schema_1.isValidOhpmPackageName)(manifest.name)) {
|
|
164
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', `${ArkTsLibraryManifestPath} must declare a valid OHPM package name.`, { packageName: record.packageName, stage: 'metadata' });
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
harPath: ArkTsLibraryHarPath,
|
|
168
|
+
ohPackageName: manifest.name,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function normalizeExpoMetadata(record, canonical) {
|
|
172
|
+
if (!record.supportsHarmony)
|
|
173
|
+
return {
|
|
174
|
+
rootViewComponents: [],
|
|
175
|
+
};
|
|
176
|
+
return {
|
|
177
|
+
rootViewComponents: canonical.rootViewComponents,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
async function normalizeRnohMetadataAsync(record) {
|
|
181
|
+
if (record.rnohMetadata == null) {
|
|
182
|
+
return {
|
|
183
|
+
ohPackageName: undefined,
|
|
184
|
+
mainHarPath: undefined,
|
|
185
|
+
harPaths: [],
|
|
186
|
+
etsPackageClassName: undefined,
|
|
187
|
+
cppPackageClassName: undefined,
|
|
188
|
+
cmakeLibraryTargetName: undefined,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const metadata = (0, schema_1.normalizeRnohPackageMetadata)(record.rnohMetadata, {
|
|
192
|
+
packageName: record.packageName,
|
|
193
|
+
packageVersion: record.packageVersion,
|
|
194
|
+
});
|
|
195
|
+
let main;
|
|
196
|
+
if (metadata.mainHarPath !== undefined) {
|
|
197
|
+
main = metadata.mainHarPath;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
try {
|
|
201
|
+
const harmonyStat = await fs.promises.stat(path.join(record.packageRoot, 'harmony'));
|
|
202
|
+
main = harmonyStat.isDirectory() ? 'harmony' : '.';
|
|
203
|
+
}
|
|
204
|
+
catch (_cause) {
|
|
205
|
+
main = '.';
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const scanRoot = await (0, values_1.resolveInsideAsync)(record.packageRoot, main, 'harmony.autolinking.mainHarPath', { packageName: record.packageName, type: 'directory' });
|
|
209
|
+
main = (0, values_1.normalizeSlashes)(path.relative(record.packageRoot, scanRoot)) || '.';
|
|
210
|
+
const harPaths = await findHarPathsAsync(record.packageRoot, scanRoot, record);
|
|
211
|
+
if (harPaths.length === 0) {
|
|
212
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', 'harmony.autolinking.mainHarPath does not contain a HAR file.', {
|
|
213
|
+
packageName: record.packageName,
|
|
214
|
+
stage: 'metadata',
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
const harBasenames = harPaths.map(harPath => path.basename(harPath));
|
|
218
|
+
if (new Set(harBasenames).size !== harBasenames.length) {
|
|
219
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', 'harmony.autolinking.mainHarPath contains duplicate HAR filenames.', {
|
|
220
|
+
packageName: record.packageName,
|
|
221
|
+
stage: 'metadata',
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
const name = resolveOhpmPackageName(metadata.ohPackageName, harPaths, record);
|
|
225
|
+
if (Array.isArray(name)) {
|
|
226
|
+
const order = new Map(name.map((mapping, index) => [mapping.harName, index]));
|
|
227
|
+
harPaths.sort((left, right) => {
|
|
228
|
+
return order.get(path.basename(left)) - order.get(path.basename(right));
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
const rnoh = {
|
|
232
|
+
ohPackageName: name,
|
|
233
|
+
mainHarPath: main,
|
|
234
|
+
harPaths,
|
|
235
|
+
etsPackageClassName: metadata.etsPackageClassName,
|
|
236
|
+
etsPackageImport: metadata.etsPackageImport,
|
|
237
|
+
cppPackageClassName: metadata.cppPackageClassName,
|
|
238
|
+
cmakeLibraryTargetName: metadata.cmakeLibraryTargetName
|
|
239
|
+
|| (0, packageMetadata_1.defaultCmakeTargetForNpmPackage)(record.packageName),
|
|
240
|
+
};
|
|
241
|
+
return rnoh;
|
|
242
|
+
}
|
|
243
|
+
function assertSearchRecord(record) {
|
|
244
|
+
if (!(0, values_1.isObject)(record)) {
|
|
245
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', 'Search record must be an object.', {
|
|
246
|
+
stage: 'metadata',
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
for (const field of ['packageName', 'packageVersion', 'packageRoot', 'source']) {
|
|
250
|
+
(0, values_1.requireNonEmptyString)(record[field], field, { packageName: record.packageName });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async function createDescriptorFromSearchRecordAsync(record, buildType = 'debug') {
|
|
254
|
+
assertSearchRecord(record);
|
|
255
|
+
let packageRoot;
|
|
256
|
+
try {
|
|
257
|
+
packageRoot = await fs.promises.realpath(record.packageRoot);
|
|
258
|
+
if (!(await fs.promises.stat(packageRoot)).isDirectory())
|
|
259
|
+
throw new TypeError('not a directory');
|
|
260
|
+
}
|
|
261
|
+
catch (cause) {
|
|
262
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', `${record.packageName} packageRoot is not an existing directory.`, {
|
|
263
|
+
cause,
|
|
264
|
+
packageName: record.packageName,
|
|
265
|
+
stage: 'metadata',
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
const base = { ...record, packageRoot };
|
|
269
|
+
let link = packageRoot;
|
|
270
|
+
if (typeof record.revision?.originPath === 'string') {
|
|
271
|
+
const candidate = path.resolve(record.revision.originPath);
|
|
272
|
+
try {
|
|
273
|
+
if (await fs.promises.realpath(candidate) === packageRoot)
|
|
274
|
+
link = candidate;
|
|
275
|
+
}
|
|
276
|
+
catch (_cause) {
|
|
277
|
+
// The canonical package root remains the safe fallback for direct callers.
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
const expoConfig = (0, values_1.isObject)(base.expoModuleConfig) ? base.expoModuleConfig : null;
|
|
281
|
+
const harmony = (0, schema_1.normalizeHarmonyModuleMetadata)(expoConfig?.harmony, { packageName: record.packageName, packageVersion: record.packageVersion });
|
|
282
|
+
const arkTs = await resolveArkTsModulePackageAsync(base, harmony);
|
|
283
|
+
const rnoh = await normalizeRnohMetadataAsync(base);
|
|
284
|
+
const expo = normalizeExpoMetadata(base, harmony);
|
|
285
|
+
const artifact = await (0, materialize_1.materializeModuleArtifactAsync)({
|
|
286
|
+
packageName: record.packageName,
|
|
287
|
+
packageRoot,
|
|
288
|
+
source: record.source,
|
|
289
|
+
buildType,
|
|
290
|
+
arkTs,
|
|
291
|
+
rnoh,
|
|
292
|
+
});
|
|
293
|
+
const descriptor = {
|
|
294
|
+
packageName: record.packageName,
|
|
295
|
+
packageVersion: record.packageVersion,
|
|
296
|
+
packageRoot,
|
|
297
|
+
packageLinkPath: link,
|
|
298
|
+
source: record.source,
|
|
299
|
+
expo,
|
|
300
|
+
rnoh,
|
|
301
|
+
harmony,
|
|
302
|
+
...(arkTs ? { arkTs } : {}),
|
|
303
|
+
artifact,
|
|
304
|
+
};
|
|
305
|
+
return descriptor;
|
|
306
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HostMetadataFields = void 0;
|
|
4
|
+
exports.normalizeHostMetadata = normalizeHostMetadata;
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
const values_1 = require("../utilities/values");
|
|
7
|
+
const ArkTsIdentifierPattern = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
8
|
+
const HostMetadataFields = Object.freeze([
|
|
9
|
+
'rootViewComponents',
|
|
10
|
+
]);
|
|
11
|
+
exports.HostMetadataFields = HostMetadataFields;
|
|
12
|
+
function normalizeIdentifiers(value, field, packageName) {
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
return [];
|
|
15
|
+
if (!Array.isArray(value)) {
|
|
16
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', `expo-module.config.json#harmony.${field} must be an array.`, {
|
|
17
|
+
packageName,
|
|
18
|
+
stage: 'metadata',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const values = value.map((item, index) => {
|
|
22
|
+
if (typeof item !== 'string' || !ArkTsIdentifierPattern.test(item)) {
|
|
23
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', `harmony.${field}[${index}] must be a valid ArkTS identifier.`, {
|
|
24
|
+
packageName,
|
|
25
|
+
stage: 'metadata',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return item;
|
|
29
|
+
});
|
|
30
|
+
return (0, values_1.sortedUniqueStrings)(values);
|
|
31
|
+
}
|
|
32
|
+
function normalizeHostMetadata(harmony, record) {
|
|
33
|
+
return Object.fromEntries(HostMetadataFields.map(field => [
|
|
34
|
+
field,
|
|
35
|
+
normalizeIdentifiers(harmony[field], field, record.packageName),
|
|
36
|
+
]));
|
|
37
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { HarmonyModuleMetadata, RnohMetadata } from '../types';
|
|
2
|
+
interface MetadataRecord {
|
|
3
|
+
readonly packageName: string;
|
|
4
|
+
readonly packageVersion?: string;
|
|
5
|
+
}
|
|
6
|
+
declare function isValidOhpmPackageName(value: unknown): value is string;
|
|
7
|
+
declare function normalizeHarmonyModuleMetadata(harmonyValue: unknown, record: MetadataRecord): HarmonyModuleMetadata;
|
|
8
|
+
/** Normalizes current RNOH package metadata, independently of Expo module config. */
|
|
9
|
+
declare function normalizeRnohPackageMetadata(value: unknown, record: MetadataRecord): Omit<RnohMetadata, 'harPaths'>;
|
|
10
|
+
export { isValidOhpmPackageName, normalizeHarmonyModuleMetadata, normalizeRnohPackageMetadata, };
|
|
@@ -0,0 +1,171 @@
|
|
|
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.isValidOhpmPackageName = isValidOhpmPackageName;
|
|
37
|
+
exports.normalizeHarmonyModuleMetadata = normalizeHarmonyModuleMetadata;
|
|
38
|
+
exports.normalizeRnohPackageMetadata = normalizeRnohPackageMetadata;
|
|
39
|
+
const path = __importStar(require("node:path"));
|
|
40
|
+
const errors_1 = require("../errors");
|
|
41
|
+
const host_1 = require("./host");
|
|
42
|
+
const values_1 = require("../utilities/values");
|
|
43
|
+
const ArkTsIdentifierPattern = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
44
|
+
const CppIdentifierPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
45
|
+
const CmakeTargetPattern = /^[A-Za-z0-9_.:+-]+$/;
|
|
46
|
+
const OhPackagePartPattern = /^[A-Za-z0-9._~-]+$/;
|
|
47
|
+
function metadataError(message, record) {
|
|
48
|
+
throw new errors_1.HarmonyAutolinkingError('INVALID_METADATA', message, {
|
|
49
|
+
packageName: record.packageName,
|
|
50
|
+
stage: 'metadata-normalize',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function requireObject(value, message, record) {
|
|
54
|
+
if (!(0, values_1.isObject)(value))
|
|
55
|
+
metadataError(message, record);
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
function isValidOhpmPackageName(value) {
|
|
59
|
+
if (typeof value !== 'string' || !value || /[\0\r\n\\'"`;${}()<>\s]/u.test(value))
|
|
60
|
+
return false;
|
|
61
|
+
const scoped = value.startsWith('@');
|
|
62
|
+
const parts = scoped ? value.slice(1).split('/') : value.split('/');
|
|
63
|
+
return parts.length === (scoped ? 2 : 1)
|
|
64
|
+
&& parts.every(part => part !== '.' && part !== '..' && OhPackagePartPattern.test(part));
|
|
65
|
+
}
|
|
66
|
+
function normalizeOhPackageName(value, record) {
|
|
67
|
+
if (value === undefined)
|
|
68
|
+
return undefined;
|
|
69
|
+
if (typeof value === 'string') {
|
|
70
|
+
if (!isValidOhpmPackageName(value)) {
|
|
71
|
+
metadataError('package.json#harmony.autolinking.ohPackageName must be a safe OHPM package name.', record);
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
if (!Array.isArray(value)) {
|
|
76
|
+
metadataError('package.json#harmony.autolinking.ohPackageName must be a string or HAR mapping array.', record);
|
|
77
|
+
}
|
|
78
|
+
const seen = new Set();
|
|
79
|
+
return value.map((rawMapping, index) => {
|
|
80
|
+
const field = `package.json#harmony.autolinking.ohPackageName[${index}]`;
|
|
81
|
+
const mapping = requireObject(rawMapping, `${field} must be an object.`, record);
|
|
82
|
+
const harName = (0, values_1.requireNonEmptyString)(mapping.harName, `${field}.harName`, {
|
|
83
|
+
packageName: record.packageName,
|
|
84
|
+
stage: 'metadata-normalize',
|
|
85
|
+
});
|
|
86
|
+
if (path.posix.basename(harName) !== harName
|
|
87
|
+
|| path.win32.basename(harName) !== harName
|
|
88
|
+
|| path.posix.extname(harName).toLowerCase() !== '.har') {
|
|
89
|
+
metadataError(`${field}.harName must be a HAR filename.`, record);
|
|
90
|
+
}
|
|
91
|
+
if (seen.has(harName))
|
|
92
|
+
metadataError(`${field}.harName is declared more than once.`, record);
|
|
93
|
+
seen.add(harName);
|
|
94
|
+
if (!isValidOhpmPackageName(mapping.packageName)) {
|
|
95
|
+
metadataError(`${field}.packageName must be a safe OHPM package name.`, record);
|
|
96
|
+
}
|
|
97
|
+
const version = mapping.version === undefined
|
|
98
|
+
? undefined
|
|
99
|
+
: (0, values_1.requireNonEmptyString)(mapping.version, `${field}.version`, {
|
|
100
|
+
packageName: record.packageName,
|
|
101
|
+
stage: 'metadata-normalize',
|
|
102
|
+
});
|
|
103
|
+
return { harName, packageName: mapping.packageName, ...(version ? { version } : {}) };
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function normalizeArkTsModules(value, record) {
|
|
107
|
+
if (value === undefined)
|
|
108
|
+
return [];
|
|
109
|
+
if (!Array.isArray(value)) {
|
|
110
|
+
metadataError('expo-module.config.json#harmony.modules must be an array.', record);
|
|
111
|
+
}
|
|
112
|
+
const seen = new Set();
|
|
113
|
+
const modules = value.map((item, index) => {
|
|
114
|
+
const moduleClass = (0, values_1.requireNonEmptyString)(item, `expo-module.config.json#harmony.modules[${index}]`, { packageName: record.packageName, stage: 'metadata-normalize' });
|
|
115
|
+
if (!ArkTsIdentifierPattern.test(moduleClass)) {
|
|
116
|
+
metadataError(`expo-module.config.json#harmony.modules[${index}] must be an ArkTS identifier.`, record);
|
|
117
|
+
}
|
|
118
|
+
if (seen.has(moduleClass)) {
|
|
119
|
+
metadataError(`expo-module.config.json#harmony.modules declares ${moduleClass} more than once.`, record);
|
|
120
|
+
}
|
|
121
|
+
seen.add(moduleClass);
|
|
122
|
+
return moduleClass;
|
|
123
|
+
});
|
|
124
|
+
return modules.sort((left, right) => left.localeCompare(right, 'en'));
|
|
125
|
+
}
|
|
126
|
+
function normalizeHarmonyModuleMetadata(harmonyValue, record) {
|
|
127
|
+
const harmony = harmonyValue === undefined
|
|
128
|
+
? {}
|
|
129
|
+
: requireObject(harmonyValue, 'expo-module.config.json#harmony must be an object.', record);
|
|
130
|
+
const host = (0, host_1.normalizeHostMetadata)(harmony, record);
|
|
131
|
+
return {
|
|
132
|
+
...host,
|
|
133
|
+
modules: normalizeArkTsModules(harmony.modules, record),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function optionalIdentifier(value, field, pattern, record) {
|
|
137
|
+
if (value === undefined)
|
|
138
|
+
return undefined;
|
|
139
|
+
const normalized = (0, values_1.requireNonEmptyString)(value, field, {
|
|
140
|
+
packageName: record.packageName,
|
|
141
|
+
stage: 'metadata-normalize',
|
|
142
|
+
});
|
|
143
|
+
if (!pattern.test(normalized))
|
|
144
|
+
metadataError(`${field} is invalid.`, record);
|
|
145
|
+
return normalized;
|
|
146
|
+
}
|
|
147
|
+
/** Normalizes current RNOH package metadata, independently of Expo module config. */
|
|
148
|
+
function normalizeRnohPackageMetadata(value, record) {
|
|
149
|
+
if (value == null || value === true)
|
|
150
|
+
return {};
|
|
151
|
+
const rnoh = requireObject(value, 'package.json#harmony.autolinking must be an object.', record);
|
|
152
|
+
const etsPackageImport = rnoh.etsPackageImport;
|
|
153
|
+
if (etsPackageImport !== undefined && etsPackageImport !== 'default' && etsPackageImport !== 'named') {
|
|
154
|
+
metadataError('package.json#harmony.autolinking.etsPackageImport must be "default" or "named".', record);
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
ohPackageName: normalizeOhPackageName(rnoh.ohPackageName, record),
|
|
158
|
+
...(rnoh.mainHarPath === undefined
|
|
159
|
+
? {}
|
|
160
|
+
: {
|
|
161
|
+
mainHarPath: (0, values_1.requireNonEmptyString)(rnoh.mainHarPath, 'package.json#harmony.autolinking.mainHarPath', {
|
|
162
|
+
packageName: record.packageName,
|
|
163
|
+
stage: 'metadata-normalize',
|
|
164
|
+
}),
|
|
165
|
+
}),
|
|
166
|
+
etsPackageClassName: optionalIdentifier(rnoh.etsPackageClassName, 'package.json#harmony.autolinking.etsPackageClassName', ArkTsIdentifierPattern, record),
|
|
167
|
+
etsPackageImport: etsPackageImport,
|
|
168
|
+
cppPackageClassName: optionalIdentifier(rnoh.cppPackageClassName, 'package.json#harmony.autolinking.cppPackageClassName', CppIdentifierPattern, record),
|
|
169
|
+
cmakeLibraryTargetName: optionalIdentifier(rnoh.cmakeLibraryTargetName, 'package.json#harmony.autolinking.cmakeLibraryTargetName', CmakeTargetPattern, record),
|
|
170
|
+
};
|
|
171
|
+
}
|