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 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.
@@ -4,7 +4,7 @@ plugins {
4
4
  }
5
5
 
6
6
  group = 'org.unimodules'
7
- version = '56.0.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.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 getStructure_1 = require("./getStructure");
4
- const mockgen_1 = require("./mockgen");
3
+ const expo_type_information_1 = require("expo-type-information");
5
4
  const command = process.argv[2];
6
- if (command === 'generate-js-mocks') {
7
- const modules = (0, getStructure_1.getAllExpoModulesInWorkingDirectory)();
8
- (0, mockgen_1.generateMocks)(modules);
9
- }
10
- else if (command === 'generate-ts-mocks') {
11
- const modules = (0, getStructure_1.getAllExpoModulesInWorkingDirectory)();
12
- (0, mockgen_1.generateMocks)(modules, 'typescript');
13
- }
14
- else if (command === 'get-mocks-structure') {
15
- const modules = (0, getStructure_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');
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,iDAAqE;AACrE,uCAA0C;AAE1C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAA,kDAAmC,GAAE,CAAC;IACtD,IAAA,uBAAa,EAAC,OAAO,CAAC,CAAC;AACzB,CAAC;KAAM,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAA,kDAAmC,GAAE,CAAC;IACtD,IAAA,uBAAa,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACvC,CAAC;KAAM,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAA,kDAAmC,GAAE,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CACT,oHAAoH,CACrH,CAAC;AACJ,CAAC","sourcesContent":["import { getAllExpoModulesInWorkingDirectory } from './getStructure';\nimport { generateMocks } from './mockgen';\n\nconst command = process.argv[2];\n\nif (command === 'generate-js-mocks') {\n const modules = getAllExpoModulesInWorkingDirectory();\n generateMocks(modules);\n} else if (command === 'generate-ts-mocks') {\n const modules = getAllExpoModulesInWorkingDirectory();\n generateMocks(modules, 'typescript');\n} else if (command === 'get-mocks-structure') {\n const modules = 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"]}
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.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": "6dcd9ce9d615d25df78597f60520492e35e02efb"
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 './getStructure';
2
- import { generateMocks } from './mockgen';
3
-
1
+ import { generateMocks, getAllExpoModulesInWorkingDirectory } from 'expo-type-information';
4
2
  const command = process.argv[2];
5
3
 
6
- if (command === 'generate-js-mocks') {
7
- const modules = getAllExpoModulesInWorkingDirectory();
8
- generateMocks(modules);
9
- } else if (command === 'generate-ts-mocks') {
10
- const modules = getAllExpoModulesInWorkingDirectory();
11
- generateMocks(modules, 'typescript');
12
- } else if (command === 'get-mocks-structure') {
13
- const modules = getAllExpoModulesInWorkingDirectory();
14
- console.log(JSON.stringify(modules, null, 2));
15
- } else {
16
- console.log(
17
- 'Command not recognized\n\nAvailable commands are:\n- generate-js-mocks\n- generate-ts-mocks\n- get-mocks-structure'
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));
@@ -1,3 +0,0 @@
1
- import type { OutputModuleDefinition } from './types';
2
- export declare function getAllExpoModulesInWorkingDirectory(): OutputModuleDefinition[];
3
- //# sourceMappingURL=getStructure.d.ts.map
@@ -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"}
@@ -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"]}
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import { OutputModuleDefinition } from './types';
3
- export declare function generateMocks(modules: OutputModuleDefinition[], outputLanguage?: 'javascript' | 'typescript'): Promise<void>;
4
- //# sourceMappingURL=mockgen.d.ts.map
@@ -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"}