expo-modules-test-core 56.0.0 → 56.0.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/LICENSE +21 -0
- package/android/build.gradle +2 -2
- package/build/index.js +18 -16
- package/build/index.js.map +1 -1
- package/package.json +11 -7
- package/src/index.ts +18 -16
- package/build/getStructure.d.ts +0 -3
- package/build/getStructure.d.ts.map +0 -1
- package/build/getStructure.js +0 -244
- package/build/getStructure.js.map +0 -1
- package/build/mockgen.d.ts +0 -4
- package/build/mockgen.d.ts.map +0 -1
- package/build/mockgen.js +0 -391
- package/build/mockgen.js.map +0 -1
- package/build/types.d.ts +0 -55
- package/build/types.d.ts.map +0 -1
- package/build/types.js +0 -3
- package/build/types.js.map +0 -1
- package/src/getStructure.ts +0 -299
- package/src/mockgen.ts +0 -525
- package/src/types.ts +0 -65
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/android/build.gradle
CHANGED
|
@@ -4,7 +4,7 @@ plugins {
|
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
group = 'org.unimodules'
|
|
7
|
-
version = '56.0.
|
|
7
|
+
version = '56.0.1'
|
|
8
8
|
|
|
9
9
|
expoModule {
|
|
10
10
|
canBePublished false
|
|
@@ -14,7 +14,7 @@ android {
|
|
|
14
14
|
namespace "org.unimodules.test.core"
|
|
15
15
|
defaultConfig {
|
|
16
16
|
versionCode 3
|
|
17
|
-
versionName '56.0.
|
|
17
|
+
versionName '56.0.1'
|
|
18
18
|
}
|
|
19
19
|
packagingOptions {
|
|
20
20
|
resources {
|
package/build/index.js
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
const mockgen_1 = require("./mockgen");
|
|
3
|
+
const expo_type_information_1 = require("expo-type-information");
|
|
5
4
|
const command = process.argv[2];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
async function main(args) {
|
|
6
|
+
if (command === 'generate-js-mocks') {
|
|
7
|
+
const modules = await (0, expo_type_information_1.getAllExpoModulesInWorkingDirectory)();
|
|
8
|
+
(0, expo_type_information_1.generateMocks)(modules);
|
|
9
|
+
}
|
|
10
|
+
else if (command === 'generate-ts-mocks') {
|
|
11
|
+
const modules = await (0, expo_type_information_1.getAllExpoModulesInWorkingDirectory)();
|
|
12
|
+
(0, expo_type_information_1.generateMocks)(modules, 'typescript');
|
|
13
|
+
}
|
|
14
|
+
else if (command === 'get-mocks-structure') {
|
|
15
|
+
const modules = await (0, expo_type_information_1.getAllExpoModulesInWorkingDirectory)();
|
|
16
|
+
console.log(JSON.stringify(modules, null, 2));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log('Command not recognized\n\nAvailable commands are:\n- generate-js-mocks\n- generate-ts-mocks\n- get-mocks-structure');
|
|
20
|
+
}
|
|
20
21
|
}
|
|
22
|
+
main(process.argv.slice(2));
|
|
21
23
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,iEAA2F;AAC3F,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAA,2DAAmC,GAAE,CAAC;QAC5D,IAAA,qCAAa,EAAC,OAAO,CAAC,CAAC;IACzB,CAAC;SAAM,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAA,2DAAmC,GAAE,CAAC;QAC5D,IAAA,qCAAa,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAA,2DAAmC,GAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,oHAAoH,CACrH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC","sourcesContent":["import { generateMocks, getAllExpoModulesInWorkingDirectory } from 'expo-type-information';\nconst command = process.argv[2];\n\nasync function main(args: string[]) {\n if (command === 'generate-js-mocks') {\n const modules = await getAllExpoModulesInWorkingDirectory();\n generateMocks(modules);\n } else if (command === 'generate-ts-mocks') {\n const modules = await getAllExpoModulesInWorkingDirectory();\n generateMocks(modules, 'typescript');\n } else if (command === 'get-mocks-structure') {\n const modules = await getAllExpoModulesInWorkingDirectory();\n console.log(JSON.stringify(modules, null, 2));\n } else {\n console.log(\n 'Command not recognized\\n\\nAvailable commands are:\\n- generate-js-mocks\\n- generate-ts-mocks\\n- get-mocks-structure'\n );\n }\n}\n\nmain(process.argv.slice(2));\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-modules-test-core",
|
|
3
|
-
"version": "56.0.
|
|
3
|
+
"version": "56.0.1",
|
|
4
4
|
"main": "./app.plugin.js",
|
|
5
5
|
"description": "Module providing native testing utilities for testing Expo modules",
|
|
6
6
|
"keywords": [
|
|
@@ -10,9 +10,6 @@
|
|
|
10
10
|
"expo-modules-core",
|
|
11
11
|
"expo-modules-test-core"
|
|
12
12
|
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsc"
|
|
15
|
-
},
|
|
16
13
|
"bin": {
|
|
17
14
|
"expo-modules-test-core": "./bin/cli.js"
|
|
18
15
|
},
|
|
@@ -32,7 +29,14 @@
|
|
|
32
29
|
"glob": "^13.0.0",
|
|
33
30
|
"prettier": "^3.0.3",
|
|
34
31
|
"xml-js": "^1.6.11",
|
|
35
|
-
"yaml": "^2.8.3"
|
|
32
|
+
"yaml": "^2.8.3",
|
|
33
|
+
"expo-type-information": "^0.0.1"
|
|
36
34
|
},
|
|
37
|
-
"gitHead": "
|
|
38
|
-
|
|
35
|
+
"gitHead": "40f0a6f6711d93762e0506b37e6e077e4bd9a541",
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"test": "expo-module test",
|
|
39
|
+
"lint": "expo-module lint",
|
|
40
|
+
"clean": "expo-module clean"
|
|
41
|
+
}
|
|
42
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import { getAllExpoModulesInWorkingDirectory } from '
|
|
2
|
-
import { generateMocks } from './mockgen';
|
|
3
|
-
|
|
1
|
+
import { generateMocks, getAllExpoModulesInWorkingDirectory } from 'expo-type-information';
|
|
4
2
|
const command = process.argv[2];
|
|
5
3
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
4
|
+
async function main(args: string[]) {
|
|
5
|
+
if (command === 'generate-js-mocks') {
|
|
6
|
+
const modules = await getAllExpoModulesInWorkingDirectory();
|
|
7
|
+
generateMocks(modules);
|
|
8
|
+
} else if (command === 'generate-ts-mocks') {
|
|
9
|
+
const modules = await getAllExpoModulesInWorkingDirectory();
|
|
10
|
+
generateMocks(modules, 'typescript');
|
|
11
|
+
} else if (command === 'get-mocks-structure') {
|
|
12
|
+
const modules = await getAllExpoModulesInWorkingDirectory();
|
|
13
|
+
console.log(JSON.stringify(modules, null, 2));
|
|
14
|
+
} else {
|
|
15
|
+
console.log(
|
|
16
|
+
'Command not recognized\n\nAvailable commands are:\n- generate-js-mocks\n- generate-ts-mocks\n- get-mocks-structure'
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
19
|
}
|
|
20
|
+
|
|
21
|
+
main(process.argv.slice(2));
|
package/build/getStructure.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../src/getStructure.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAKV,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AAyRjB,wBAAgB,mCAAmC,6BAGlD"}
|
package/build/getStructure.js
DELETED
|
@@ -1,244 +0,0 @@
|
|
|
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.getAllExpoModulesInWorkingDirectory = getAllExpoModulesInWorkingDirectory;
|
|
7
|
-
// convert requires above to imports
|
|
8
|
-
const child_process_1 = require("child_process");
|
|
9
|
-
const fs_1 = __importDefault(require("fs"));
|
|
10
|
-
const glob_1 = require("glob");
|
|
11
|
-
const xml_js_1 = __importDefault(require("xml-js"));
|
|
12
|
-
const yaml_1 = __importDefault(require("yaml"));
|
|
13
|
-
const rootDir = process.cwd();
|
|
14
|
-
const pattern = `${rootDir}/**/*.swift`;
|
|
15
|
-
function getStructureFromFile(file) {
|
|
16
|
-
const command = 'sourcekitten structure --file ' + file.path;
|
|
17
|
-
try {
|
|
18
|
-
const output = (0, child_process_1.execSync)(command);
|
|
19
|
-
return JSON.parse(output.toString());
|
|
20
|
-
}
|
|
21
|
-
catch (error) {
|
|
22
|
-
console.error('An error occurred while executing the command:', error);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
// find an object with "key.typename" : "ModuleDefinition" somewhere in the structure and return it
|
|
26
|
-
function findModuleDefinitionInStructure(structure) {
|
|
27
|
-
if (!structure) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
if (structure?.['key.typename'] === 'ModuleDefinition') {
|
|
31
|
-
const root = structure?.['key.substructure'];
|
|
32
|
-
if (!root) {
|
|
33
|
-
console.warn('Found ModuleDefinition but it is malformed');
|
|
34
|
-
}
|
|
35
|
-
return root;
|
|
36
|
-
}
|
|
37
|
-
const substructure = structure['key.substructure'];
|
|
38
|
-
if (Array.isArray(substructure) && substructure.length > 0) {
|
|
39
|
-
for (const child of substructure) {
|
|
40
|
-
let result = null;
|
|
41
|
-
result = findModuleDefinitionInStructure(child);
|
|
42
|
-
if (result) {
|
|
43
|
-
return result;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
// Read string straight from file – needed since we can't get cursorinfo for modulename
|
|
50
|
-
function getIdentifierFromOffsetObject(offsetObject, file) {
|
|
51
|
-
// adding 1 and removing 1 to get rid of quotes
|
|
52
|
-
return file.content
|
|
53
|
-
.substring(offsetObject['key.offset'], offsetObject['key.offset'] + offsetObject['key.length'])
|
|
54
|
-
.replaceAll('"', '');
|
|
55
|
-
}
|
|
56
|
-
function maybeUnwrapXMLStructs(type) {
|
|
57
|
-
if (!type) {
|
|
58
|
-
return type;
|
|
59
|
-
}
|
|
60
|
-
if (typeof type === 'string') {
|
|
61
|
-
return type;
|
|
62
|
-
}
|
|
63
|
-
if (type['_text']) {
|
|
64
|
-
return type['_text'];
|
|
65
|
-
}
|
|
66
|
-
if (type['ref.struct']) {
|
|
67
|
-
return maybeUnwrapXMLStructs(type['ref.struct']);
|
|
68
|
-
}
|
|
69
|
-
return type;
|
|
70
|
-
}
|
|
71
|
-
function maybeWrapArray(itemOrItems) {
|
|
72
|
-
if (!itemOrItems) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
if (Array.isArray(itemOrItems)) {
|
|
76
|
-
return itemOrItems;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
return [itemOrItems];
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
function parseXMLAnnotatedDeclarations(cursorInfoOutput) {
|
|
83
|
-
const xml = cursorInfoOutput['key.fully_annotated_decl'];
|
|
84
|
-
if (!xml) {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
const parsed = xml_js_1.default.xml2js(xml, { compact: true });
|
|
88
|
-
const parameters = maybeWrapArray(parsed?.['decl.function.free']?.['decl.var.parameter'])?.map((p) => ({
|
|
89
|
-
name: maybeUnwrapXMLStructs(p['decl.var.parameter.argument_label']),
|
|
90
|
-
typename: maybeUnwrapXMLStructs(p['decl.var.parameter.type']),
|
|
91
|
-
})) ?? [];
|
|
92
|
-
const returnType = maybeUnwrapXMLStructs(parsed?.['decl.function.free']?.['decl.function.returntype']);
|
|
93
|
-
return { parameters, returnType };
|
|
94
|
-
}
|
|
95
|
-
let cachedSDKPath = null;
|
|
96
|
-
function getSDKPath() {
|
|
97
|
-
if (cachedSDKPath) {
|
|
98
|
-
return cachedSDKPath;
|
|
99
|
-
}
|
|
100
|
-
const sdkPath = (0, child_process_1.execSync)('xcrun --sdk iphoneos --show-sdk-path').toString().trim();
|
|
101
|
-
cachedSDKPath = sdkPath;
|
|
102
|
-
return cachedSDKPath;
|
|
103
|
-
}
|
|
104
|
-
// Read type description with sourcekitten, works only for variables
|
|
105
|
-
function getTypeFromOffsetObject(offsetObject, file) {
|
|
106
|
-
if (!offsetObject) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
const request = {
|
|
110
|
-
'key.request': 'source.request.cursorinfo',
|
|
111
|
-
'key.sourcefile': file.path,
|
|
112
|
-
'key.offset': offsetObject['key.offset'],
|
|
113
|
-
'key.compilerargs': [file.path, '-target', 'arm64-apple-ios', '-sdk', getSDKPath()],
|
|
114
|
-
};
|
|
115
|
-
const yamlRequest = yaml_1.default.stringify(request, {
|
|
116
|
-
defaultStringType: 'QUOTE_DOUBLE',
|
|
117
|
-
lineWidth: 0,
|
|
118
|
-
defaultKeyType: 'PLAIN',
|
|
119
|
-
// needed since behaviour of sourcekitten is not consistent
|
|
120
|
-
}).replace('"source.request.cursorinfo"', 'source.request.cursorinfo');
|
|
121
|
-
const command = 'sourcekitten request --yaml "' + yamlRequest.replaceAll('"', '\\"') + '"';
|
|
122
|
-
try {
|
|
123
|
-
const output = (0, child_process_1.execSync)(command, { stdio: 'pipe' });
|
|
124
|
-
return parseXMLAnnotatedDeclarations(JSON.parse(output.toString()));
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
console.error('An error occurred while executing the command:', error);
|
|
128
|
-
}
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
function hasSubstructure(structureObject) {
|
|
132
|
-
return structureObject?.['key.substructure'] && structureObject['key.substructure'].length > 0;
|
|
133
|
-
}
|
|
134
|
-
function parseClosureTypes(structureObject) {
|
|
135
|
-
const closure = structureObject['key.substructure']?.find((s) => s['key.kind'] === 'source.lang.swift.expr.closure');
|
|
136
|
-
if (!closure) {
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
const parameters = closure['key.substructure']
|
|
140
|
-
?.filter((s) => s['key.kind'] === 'source.lang.swift.decl.var.parameter')
|
|
141
|
-
.map((p) => ({ name: p['key.name'], typename: p['key.typename'] }));
|
|
142
|
-
const returnType = closure?.['key.typename'] ?? 'unknown';
|
|
143
|
-
return { parameters, returnType };
|
|
144
|
-
}
|
|
145
|
-
// Used for functions,async functions, all of shape Identifier(name, closure or function)
|
|
146
|
-
function findNamedDefinitionsOfType(type, moduleDefinition, file) {
|
|
147
|
-
const definitionsOfType = moduleDefinition.filter((md) => md['key.name'] === type);
|
|
148
|
-
return definitionsOfType.reduce((acc, d) => {
|
|
149
|
-
const definitionParams = d['key.substructure'];
|
|
150
|
-
if (definitionParams[0] == null) {
|
|
151
|
-
return acc;
|
|
152
|
-
}
|
|
153
|
-
const name = getIdentifierFromOffsetObject(definitionParams[0], file);
|
|
154
|
-
let types = null;
|
|
155
|
-
if (definitionParams[1] == null) {
|
|
156
|
-
acc.push({ name, types });
|
|
157
|
-
return acc;
|
|
158
|
-
}
|
|
159
|
-
if (hasSubstructure(definitionParams[1])) {
|
|
160
|
-
types = parseClosureTypes(definitionParams[1]);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
types = getTypeFromOffsetObject(definitionParams[1], file);
|
|
164
|
-
}
|
|
165
|
-
acc.push({ name, types });
|
|
166
|
-
return acc;
|
|
167
|
-
}, []);
|
|
168
|
-
}
|
|
169
|
-
// Used for events
|
|
170
|
-
function findGroupedDefinitionsOfType(type, moduleDefinition, file) {
|
|
171
|
-
const definitionsOfType = moduleDefinition.filter((md) => md['key.name'] === type);
|
|
172
|
-
return definitionsOfType.flatMap((d) => {
|
|
173
|
-
const definitionParams = d['key.substructure'];
|
|
174
|
-
return definitionParams.map((d) => ({ name: getIdentifierFromOffsetObject(d, file) }));
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
function findAndParseNestedClassesOfType(moduleDefinition, file, type) {
|
|
178
|
-
// we support reading definitions from closure only
|
|
179
|
-
const definitionsOfType = moduleDefinition.filter((md) => md['key.name'] === type);
|
|
180
|
-
return definitionsOfType
|
|
181
|
-
.map((df) => {
|
|
182
|
-
const nestedModuleDefinition = df['key.substructure']?.[1]?.['key.substructure']?.[0]?.['key.substructure']?.[0]?.['key.substructure'];
|
|
183
|
-
const nameStructure = df['key.substructure']?.[0];
|
|
184
|
-
if (!nestedModuleDefinition || !nameStructure) {
|
|
185
|
-
console.warn('Could not parse definition');
|
|
186
|
-
return null;
|
|
187
|
-
}
|
|
188
|
-
const name = getIdentifierFromOffsetObject(nameStructure, file).replace('.self', '');
|
|
189
|
-
// let's drop nested view field and classes (are null anyways)
|
|
190
|
-
const { views: _, classes: _2, ...definition } = parseModuleDefinition(nestedModuleDefinition, file);
|
|
191
|
-
return { ...definition, name };
|
|
192
|
-
})
|
|
193
|
-
.flatMap((f) => (f ? [f] : []));
|
|
194
|
-
}
|
|
195
|
-
function omitParamsFromClosureArguments(definitions, paramsToOmit) {
|
|
196
|
-
return definitions.map((d) => ({
|
|
197
|
-
...d,
|
|
198
|
-
types: {
|
|
199
|
-
...d.types,
|
|
200
|
-
parameters: d.types?.parameters?.filter((t, idx) => !paramsToOmit.includes(t.name)) ?? [],
|
|
201
|
-
},
|
|
202
|
-
}));
|
|
203
|
-
}
|
|
204
|
-
// Some blocks have additional modifiers like runOnQueue – we may need to do additional traversing to get to the function definition
|
|
205
|
-
function parseBlockModifiers(structureObject) {
|
|
206
|
-
if (structureObject['key.name']?.includes('runOnQueue')) {
|
|
207
|
-
const structure = structureObject['key.substructure'][0];
|
|
208
|
-
if (structure != null) {
|
|
209
|
-
return structure;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return structureObject;
|
|
213
|
-
}
|
|
214
|
-
function parseModuleDefinition(moduleDefinition, file) {
|
|
215
|
-
const preparedModuleDefinition = moduleDefinition.map(parseBlockModifiers);
|
|
216
|
-
const parsedDefinition = {
|
|
217
|
-
name: findNamedDefinitionsOfType('Name', preparedModuleDefinition, file)[0]?.name ?? '',
|
|
218
|
-
functions: findNamedDefinitionsOfType('Function', preparedModuleDefinition, file),
|
|
219
|
-
asyncFunctions: omitParamsFromClosureArguments(findNamedDefinitionsOfType('AsyncFunction', preparedModuleDefinition, file), ['promise']),
|
|
220
|
-
events: findGroupedDefinitionsOfType('Events', preparedModuleDefinition, file),
|
|
221
|
-
properties: findNamedDefinitionsOfType('Property', preparedModuleDefinition, file),
|
|
222
|
-
props: omitParamsFromClosureArguments(findNamedDefinitionsOfType('Prop', preparedModuleDefinition, file), ['view']),
|
|
223
|
-
constants: findNamedDefinitionsOfType('Constant', preparedModuleDefinition, file),
|
|
224
|
-
views: findAndParseNestedClassesOfType(preparedModuleDefinition, file, 'View'),
|
|
225
|
-
classes: findAndParseNestedClassesOfType(preparedModuleDefinition, file, 'Class'),
|
|
226
|
-
};
|
|
227
|
-
return parsedDefinition;
|
|
228
|
-
}
|
|
229
|
-
function findModuleDefinitionsInFiles(files) {
|
|
230
|
-
const modules = [];
|
|
231
|
-
for (const path of files) {
|
|
232
|
-
const file = { path, content: fs_1.default.readFileSync(path, 'utf8') };
|
|
233
|
-
const definition = findModuleDefinitionInStructure(getStructureFromFile(file));
|
|
234
|
-
if (definition) {
|
|
235
|
-
modules.push(parseModuleDefinition(definition, file));
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return modules;
|
|
239
|
-
}
|
|
240
|
-
function getAllExpoModulesInWorkingDirectory() {
|
|
241
|
-
const files = (0, glob_1.globSync)(pattern);
|
|
242
|
-
return findModuleDefinitionsInFiles(files);
|
|
243
|
-
}
|
|
244
|
-
//# sourceMappingURL=getStructure.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getStructure.js","sourceRoot":"","sources":["../src/getStructure.ts"],"names":[],"mappings":"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","sourcesContent":["// convert requires above to imports\nimport { execSync } from 'child_process';\nimport fsNode from 'fs';\nimport { globSync } from 'glob';\nimport XML from 'xml-js';\nimport YAML from 'yaml';\n\nimport type {\n Closure,\n CursorInfoOutput,\n FileType,\n FullyAnnotatedDecl,\n OutputModuleDefinition,\n Structure,\n} from './types';\n\nconst rootDir = process.cwd();\nconst pattern = `${rootDir}/**/*.swift`;\n\nfunction getStructureFromFile(file: FileType) {\n const command = 'sourcekitten structure --file ' + file.path;\n\n try {\n const output = execSync(command);\n return JSON.parse(output.toString());\n } catch (error) {\n console.error('An error occurred while executing the command:', error);\n }\n}\n// find an object with \"key.typename\" : \"ModuleDefinition\" somewhere in the structure and return it\nfunction findModuleDefinitionInStructure(structure: Structure): Structure[] | null {\n if (!structure) {\n return null;\n }\n if (structure?.['key.typename'] === 'ModuleDefinition') {\n const root = structure?.['key.substructure'];\n if (!root) {\n console.warn('Found ModuleDefinition but it is malformed');\n }\n return root;\n }\n const substructure = structure['key.substructure'];\n if (Array.isArray(substructure) && substructure.length > 0) {\n for (const child of substructure) {\n let result = null;\n result = findModuleDefinitionInStructure(child);\n if (result) {\n return result;\n }\n }\n }\n return null;\n}\n\n// Read string straight from file – needed since we can't get cursorinfo for modulename\nfunction getIdentifierFromOffsetObject(offsetObject: Structure, file: FileType) {\n // adding 1 and removing 1 to get rid of quotes\n return file.content\n .substring(offsetObject['key.offset'], offsetObject['key.offset'] + offsetObject['key.length'])\n .replaceAll('\"', '');\n}\n\nfunction maybeUnwrapXMLStructs(type: string | Partial<{ _text: string; 'ref.struct': string }>) {\n if (!type) {\n return type;\n }\n if (typeof type === 'string') {\n return type;\n }\n if (type['_text']) {\n return type['_text'];\n }\n if (type['ref.struct']) {\n return maybeUnwrapXMLStructs(type['ref.struct']);\n }\n return type;\n}\n\nfunction maybeWrapArray<T>(itemOrItems: T[] | T | null) {\n if (!itemOrItems) {\n return null;\n }\n if (Array.isArray(itemOrItems)) {\n return itemOrItems;\n } else {\n return [itemOrItems];\n }\n}\n\nfunction parseXMLAnnotatedDeclarations(cursorInfoOutput: CursorInfoOutput) {\n const xml = cursorInfoOutput['key.fully_annotated_decl'];\n if (!xml) {\n return null;\n }\n const parsed = XML.xml2js(xml, { compact: true }) as FullyAnnotatedDecl;\n\n const parameters =\n maybeWrapArray(parsed?.['decl.function.free']?.['decl.var.parameter'])?.map((p) => ({\n name: maybeUnwrapXMLStructs(p['decl.var.parameter.argument_label']),\n typename: maybeUnwrapXMLStructs(p['decl.var.parameter.type']),\n })) ?? [];\n const returnType = maybeUnwrapXMLStructs(\n parsed?.['decl.function.free']?.['decl.function.returntype']\n );\n return { parameters, returnType };\n}\n\nlet cachedSDKPath: string | null = null;\nfunction getSDKPath() {\n if (cachedSDKPath) {\n return cachedSDKPath;\n }\n const sdkPath = execSync('xcrun --sdk iphoneos --show-sdk-path').toString().trim();\n cachedSDKPath = sdkPath;\n return cachedSDKPath;\n}\n\n// Read type description with sourcekitten, works only for variables\nfunction getTypeFromOffsetObject(offsetObject: Structure, file: FileType) {\n if (!offsetObject) {\n return null;\n }\n const request = {\n 'key.request': 'source.request.cursorinfo',\n 'key.sourcefile': file.path,\n 'key.offset': offsetObject['key.offset'],\n 'key.compilerargs': [file.path, '-target', 'arm64-apple-ios', '-sdk', getSDKPath()],\n };\n const yamlRequest = YAML.stringify(request, {\n defaultStringType: 'QUOTE_DOUBLE',\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n // needed since behaviour of sourcekitten is not consistent\n } as any).replace('\"source.request.cursorinfo\"', 'source.request.cursorinfo');\n\n const command = 'sourcekitten request --yaml \"' + yamlRequest.replaceAll('\"', '\\\\\"') + '\"';\n try {\n const output = execSync(command, { stdio: 'pipe' });\n return parseXMLAnnotatedDeclarations(JSON.parse(output.toString()));\n } catch (error) {\n console.error('An error occurred while executing the command:', error);\n }\n return null;\n}\n\nfunction hasSubstructure(structureObject: Structure) {\n return structureObject?.['key.substructure'] && structureObject['key.substructure'].length > 0;\n}\n\nfunction parseClosureTypes(structureObject: Structure) {\n const closure = structureObject['key.substructure']?.find(\n (s) => s['key.kind'] === 'source.lang.swift.expr.closure'\n );\n if (!closure) {\n return null;\n }\n const parameters = closure['key.substructure']\n ?.filter((s) => s['key.kind'] === 'source.lang.swift.decl.var.parameter')\n .map((p) => ({ name: p['key.name'], typename: p['key.typename'] }));\n\n const returnType = closure?.['key.typename'] ?? 'unknown';\n return { parameters, returnType };\n}\n\n// Used for functions,async functions, all of shape Identifier(name, closure or function)\nfunction findNamedDefinitionsOfType(type: string, moduleDefinition: Structure[], file: FileType) {\n const definitionsOfType = moduleDefinition.filter((md) => md['key.name'] === type);\n\n return definitionsOfType.reduce<\n { name: string; types: ReturnType<typeof getTypeFromOffsetObject> }[]\n >((acc, d) => {\n const definitionParams = d['key.substructure'];\n\n if (definitionParams[0] == null) {\n return acc;\n }\n\n const name = getIdentifierFromOffsetObject(definitionParams[0], file);\n let types = null;\n\n if (definitionParams[1] == null) {\n acc.push({ name, types });\n return acc;\n }\n\n if (hasSubstructure(definitionParams[1])) {\n types = parseClosureTypes(definitionParams[1]);\n } else {\n types = getTypeFromOffsetObject(definitionParams[1], file);\n }\n\n acc.push({ name, types });\n return acc;\n }, []);\n}\n\n// Used for events\nfunction findGroupedDefinitionsOfType(type: string, moduleDefinition: Structure[], file: FileType) {\n const definitionsOfType = moduleDefinition.filter((md) => md['key.name'] === type);\n return definitionsOfType.flatMap((d) => {\n const definitionParams = d['key.substructure'];\n return definitionParams.map((d) => ({ name: getIdentifierFromOffsetObject(d, file) }));\n });\n}\nfunction findAndParseNestedClassesOfType(\n moduleDefinition: Structure[],\n file: FileType,\n type: string\n) {\n // we support reading definitions from closure only\n const definitionsOfType = moduleDefinition.filter((md) => md['key.name'] === type);\n return definitionsOfType\n .map((df) => {\n const nestedModuleDefinition =\n df['key.substructure']?.[1]?.['key.substructure']?.[0]?.['key.substructure']?.[0]?.[\n 'key.substructure'\n ];\n const nameStructure = df['key.substructure']?.[0];\n if (!nestedModuleDefinition || !nameStructure) {\n console.warn('Could not parse definition');\n return null;\n }\n const name = getIdentifierFromOffsetObject(nameStructure, file).replace('.self', '');\n // let's drop nested view field and classes (are null anyways)\n const {\n views: _,\n classes: _2,\n ...definition\n } = parseModuleDefinition(nestedModuleDefinition, file);\n return { ...definition, name };\n })\n .flatMap((f) => (f ? [f] : []));\n}\n\nfunction omitParamsFromClosureArguments<T extends Closure>(\n definitions: T[],\n paramsToOmit: string[]\n) {\n return definitions.map((d) => ({\n ...d,\n types: {\n ...d.types,\n parameters: d.types?.parameters?.filter((t, idx) => !paramsToOmit.includes(t.name)) ?? [],\n },\n }));\n}\n\n// Some blocks have additional modifiers like runOnQueue – we may need to do additional traversing to get to the function definition\nfunction parseBlockModifiers(structureObject: Structure) {\n if (structureObject['key.name']?.includes('runOnQueue')) {\n const structure = structureObject['key.substructure'][0];\n if (structure != null) {\n return structure;\n }\n }\n return structureObject;\n}\n\nfunction parseModuleDefinition(\n moduleDefinition: Structure[],\n file: FileType\n): OutputModuleDefinition {\n const preparedModuleDefinition = moduleDefinition.map(parseBlockModifiers);\n const parsedDefinition = {\n name: findNamedDefinitionsOfType('Name', preparedModuleDefinition, file)[0]?.name ?? '',\n functions: findNamedDefinitionsOfType('Function', preparedModuleDefinition, file),\n asyncFunctions: omitParamsFromClosureArguments(\n findNamedDefinitionsOfType('AsyncFunction', preparedModuleDefinition, file),\n ['promise']\n ),\n events: findGroupedDefinitionsOfType('Events', preparedModuleDefinition, file),\n properties: findNamedDefinitionsOfType('Property', preparedModuleDefinition, file),\n props: omitParamsFromClosureArguments(\n findNamedDefinitionsOfType('Prop', preparedModuleDefinition, file),\n ['view']\n ),\n constants: findNamedDefinitionsOfType('Constant', preparedModuleDefinition, file),\n views: findAndParseNestedClassesOfType(preparedModuleDefinition, file, 'View'),\n classes: findAndParseNestedClassesOfType(preparedModuleDefinition, file, 'Class'),\n };\n return parsedDefinition;\n}\n\nfunction findModuleDefinitionsInFiles(files: string[]) {\n const modules = [];\n for (const path of files) {\n const file = { path, content: fsNode.readFileSync(path, 'utf8') };\n const definition = findModuleDefinitionInStructure(getStructureFromFile(file));\n if (definition) {\n modules.push(parseModuleDefinition(definition, file));\n }\n }\n return modules;\n}\n\nexport function getAllExpoModulesInWorkingDirectory() {\n const files = globSync(pattern);\n return findModuleDefinitionsInFiles(files);\n}\n"]}
|
package/build/mockgen.d.ts
DELETED
package/build/mockgen.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mockgen.d.ts","sourceRoot":"","sources":["../src/mockgen.ts"],"names":[],"mappings":";AAQA,OAAO,EAIL,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AAudjB,wBAAsB,aAAa,CACjC,OAAO,EAAE,sBAAsB,EAAE,EACjC,cAAc,GAAE,YAAY,GAAG,YAA2B,iBAqC3D"}
|