@react-native-windows/codegen 0.0.0-canary.24 → 0.0.0-canary.27
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/CHANGELOG.md +33 -4
- package/lib-commonjs/Cli.js +17 -1
- package/lib-commonjs/Cli.js.map +1 -1
- package/lib-commonjs/generators/GenerateTypeScript.d.ts +9 -0
- package/lib-commonjs/generators/GenerateTypeScript.js +157 -0
- package/lib-commonjs/generators/GenerateTypeScript.js.map +1 -0
- package/package.json +7 -7
- package/src/Cli.ts +24 -1
- package/src/generators/GenerateTypeScript.ts +229 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,46 @@
|
|
|
1
1
|
# Change Log - @react-native-windows/codegen
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Fri, 04 Mar 2022 06:08:44 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
-
## 0.0.0-canary.
|
|
7
|
+
## 0.0.0-canary.27
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Fri, 04 Mar 2022 06:08:44 GMT
|
|
10
10
|
|
|
11
11
|
### Changes
|
|
12
12
|
|
|
13
|
-
-
|
|
13
|
+
- Generate fabric eventemitter.cpp (acoates@microsoft.com)
|
|
14
14
|
|
|
15
|
+
## 0.0.0-canary.26
|
|
16
|
+
|
|
17
|
+
Thu, 24 Feb 2022 06:07:47 GMT
|
|
18
|
+
|
|
19
|
+
### Changes
|
|
20
|
+
|
|
21
|
+
- Add TypeScript turbo module definition as new codegen traget (53799235+ZihanChen-MSFT@users.noreply.github.com)
|
|
22
|
+
|
|
23
|
+
## 0.0.0-canary.25
|
|
24
|
+
|
|
25
|
+
Wed, 09 Feb 2022 06:09:36 GMT
|
|
26
|
+
|
|
27
|
+
### Changes
|
|
28
|
+
|
|
29
|
+
- Bump minimum Node version to 14 (jthysell@microsoft.com)
|
|
30
|
+
- Bump @react-native-windows/fs to v1.0.2
|
|
31
|
+
- Bump @rnw-scripts/eslint-config to v1.1.11
|
|
32
|
+
- Bump @rnw-scripts/jest-unittest-config to v1.2.6
|
|
33
|
+
- Bump @rnw-scripts/just-task to v2.2.3
|
|
34
|
+
- Bump @rnw-scripts/ts-config to v2.0.2
|
|
35
|
+
|
|
36
|
+
## 0.0.0-canary.24
|
|
37
|
+
|
|
38
|
+
Tue, 08 Feb 2022 18:21:23 GMT
|
|
39
|
+
|
|
40
|
+
### Changes
|
|
41
|
+
|
|
42
|
+
- Fix TurboModule codegen document (53799235+ZihanChen-MSFT@users.noreply.github.com)
|
|
43
|
+
|
|
15
44
|
## 0.0.0-canary.23
|
|
16
45
|
|
|
17
46
|
Sat, 29 Jan 2022 06:08:58 GMT
|
package/lib-commonjs/Cli.js
CHANGED
|
@@ -14,6 +14,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
14
14
|
const fs_1 = __importDefault(require("@react-native-windows/fs"));
|
|
15
15
|
const globby_1 = __importDefault(require("globby"));
|
|
16
16
|
const GenerateNM2_1 = require("./generators/GenerateNM2");
|
|
17
|
+
const GenerateTypeScript_1 = require("./generators/GenerateTypeScript");
|
|
17
18
|
// @ts-ignore
|
|
18
19
|
const flow_1 = require("react-native-tscodegen/lib/rncodegen/src/parsers/flow");
|
|
19
20
|
// @ts-ignore
|
|
@@ -27,6 +28,16 @@ const argv = yargs_1.default.options({
|
|
|
27
28
|
type: 'array',
|
|
28
29
|
describe: 'glob patterns for files which contains specs',
|
|
29
30
|
},
|
|
31
|
+
ts: {
|
|
32
|
+
type: 'boolean',
|
|
33
|
+
describe: 'generate turbo module definition files in TypeScript',
|
|
34
|
+
default: false,
|
|
35
|
+
},
|
|
36
|
+
outdir: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
describe: 'output directory',
|
|
39
|
+
default: 'codegen',
|
|
40
|
+
},
|
|
30
41
|
test: {
|
|
31
42
|
type: 'boolean',
|
|
32
43
|
describe: 'Verify that the generated output is unchanged',
|
|
@@ -161,7 +172,11 @@ function generate({ libraryName, schema, outputDirectory, moduleSpecName }, { /*
|
|
|
161
172
|
const generatorShadowNodeCPP = require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateShadowNodeCPP').generate;
|
|
162
173
|
const generatorComponentDescriptorH = require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateComponentDescriptorH').generate;
|
|
163
174
|
const generatorEventEmitterH = require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateEventEmitterH').generate;
|
|
175
|
+
const generatorEventEmitterCPP = require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateEventEmitterCpp').generate;
|
|
164
176
|
normalizeFileMap(generateNM2(libraryName, schema, moduleSpecName), outputDirectory, generatedFiles);
|
|
177
|
+
if (argv.ts) {
|
|
178
|
+
normalizeFileMap((0, GenerateTypeScript_1.generateTypeScript)(libraryName, schema, moduleSpecName), outputDirectory, generatedFiles);
|
|
179
|
+
}
|
|
165
180
|
if (Object.keys(schema.modules).some((moduleName) => schema.modules[moduleName].type === 'Component')) {
|
|
166
181
|
const componentGenerators = [
|
|
167
182
|
generatorPropsH,
|
|
@@ -170,6 +185,7 @@ function generate({ libraryName, schema, outputDirectory, moduleSpecName }, { /*
|
|
|
170
185
|
generatorShadowNodeCPP,
|
|
171
186
|
generatorComponentDescriptorH,
|
|
172
187
|
generatorEventEmitterH,
|
|
188
|
+
generatorEventEmitterCPP,
|
|
173
189
|
];
|
|
174
190
|
componentGenerators.forEach((generator) => {
|
|
175
191
|
const generated = generator(libraryName, schema, moduleSpecName);
|
|
@@ -194,6 +210,6 @@ else {
|
|
|
194
210
|
}
|
|
195
211
|
const libraryName = argv.libraryName;
|
|
196
212
|
const moduleSpecName = 'moduleSpecName';
|
|
197
|
-
const outputDirectory =
|
|
213
|
+
const outputDirectory = argv.outdir;
|
|
198
214
|
generate({ libraryName, schema, outputDirectory, moduleSpecName }, { generators: [], test: false });
|
|
199
215
|
//# sourceMappingURL=Cli.js.map
|
package/lib-commonjs/Cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport yargs from 'yargs';\nimport path from 'path';\nimport fs from '@react-native-windows/fs';\nimport globby from 'globby';\nimport {createNM2Generator} from './generators/GenerateNM2';\n// @ts-ignore\nimport {parseFile} from 'react-native-tscodegen/lib/rncodegen/src/parsers/flow';\n// @ts-ignore\nimport schemaValidator from 'react-native-tscodegen/lib/rncodegen/src/schemaValidator';\n\nconst argv = yargs.options({\n file: {\n type: 'string',\n describe: 'file which contains spec',\n },\n files: {\n type: 'array',\n describe: 'glob patterns for files which contains specs',\n },\n test: {\n type: 'boolean',\n describe: 'Verify that the generated output is unchanged',\n },\n namespace: {\n type: 'string',\n describe: 'C++/C# Namespace to put generated native modules in',\n default: 'MyNamespace',\n },\n libraryName: {\n type: 'string',\n required: true,\n describe: 'Used for part of the path generated within the codegen dir',\n },\n}).argv;\n\nimport {SchemaType} from 'react-native-tscodegen';\n\ninterface Options {\n libraryName: string;\n schema: SchemaType;\n outputDirectory: string;\n moduleSpecName: string;\n}\n\ninterface Config {\n generators: any[] /*Generators[]*/;\n test?: boolean;\n}\n\n/*\nconst GENERATORS = {\n descriptors: [generateComponentDescriptorH.generate],\n events: [\n generateEventEmitterCpp.generate,\n generateEventEmitterH.generate,\n generateModuleHObjCpp.generate,\n generateModuleMm.generate,\n ],\n props: [\n generateComponentHObjCpp.generate,\n generatePropsCpp.generate,\n generatePropsH.generate,\n generatePropsJavaInterface.generate,\n generatePropsJavaDelegate.generate,\n ],\n modules: [generateModuleCpp.generate, generateModuleH.generate],\n tests: [generateTests.generate],\n 'shadow-nodes': [\n generateShadowNodeCpp.generate,\n generateShadowNodeH.generate,\n ],\n};\n*/\n\nfunction normalizeFileMap(\n map: Map<string, string>,\n outputDir: string,\n outMap: Map<string, string>,\n): void {\n for (const [fileName, contents] of map) {\n const location = path.join(outputDir, fileName);\n outMap.set(path.normalize(location), contents);\n }\n}\n\nfunction checkFilesForChanges(\n map: Map<string, string>,\n outputDir: string,\n): boolean {\n let hasChanges = false;\n\n const allExistingFiles = globby\n .sync(`${outputDir}/**`)\n .map((_) => path.normalize(_))\n .sort();\n const allGeneratedFiles = [...map.keys()]\n .map((_) => path.normalize(_))\n .sort();\n\n if (\n allExistingFiles.length !== allGeneratedFiles.length ||\n !allExistingFiles.every((val, index) => val === allGeneratedFiles[index])\n )\n return true;\n\n for (const [fileName, contents] of map) {\n if (!fs.existsSync(fileName)) {\n hasChanges = true;\n continue;\n }\n\n const currentContents = fs.readFileSync(fileName, 'utf8');\n if (currentContents !== contents) {\n console.error(`- ${fileName} has changed`);\n hasChanges = true;\n continue;\n }\n }\n\n return hasChanges;\n}\n\nfunction writeMapToFiles(map: Map<string, string>, outputDir: string) {\n let success = true;\n\n // This ensures that we delete any generated files from modules that have been deleted\n const allExistingFiles = globby.sync(`${outputDir}/**`);\n allExistingFiles.forEach((existingFile) => {\n if (!map.has(path.normalize(existingFile))) {\n fs.unlinkSync(existingFile);\n }\n });\n\n for (const [fileName, contents] of map) {\n try {\n fs.mkdirSync(path.dirname(fileName), {recursive: true});\n\n if (fs.existsSync(fileName)) {\n const currentContents = fs.readFileSync(fileName, 'utf8');\n // Don't update the files if there are no changes as this breaks incremental builds\n if (currentContents === contents) {\n continue;\n }\n }\n\n fs.writeFileSync(fileName, contents);\n } catch (error) {\n success = false;\n console.error(`Failed to write ${fileName} to ${fileName}`, error);\n }\n }\n\n return success;\n}\n\nfunction parseFlowFile(filename: string): SchemaType {\n try {\n return parseFile(filename);\n } catch (e) {\n if (e instanceof Error) {\n e.message = `(${filename}): ${e.message}`;\n }\n throw e;\n }\n}\n\nfunction combineSchemas(files: string[]): SchemaType {\n return files.reduce(\n (merged, filename) => {\n const contents = fs.readFileSync(filename, 'utf8');\n if (\n contents &&\n (/export\\s+default\\s+\\(?codegenNativeComponent</.test(contents) ||\n contents.includes('extends TurboModule'))\n ) {\n const schema = parseFlowFile(filename);\n merged.modules = {...merged.modules, ...schema.modules};\n }\n return merged;\n },\n {modules: {}},\n );\n}\n\nfunction generate(\n {libraryName, schema, outputDirectory, moduleSpecName}: Options,\n {/*generators,*/ test}: Config,\n): boolean {\n schemaValidator.validate(schema);\n\n const componentOutputdir = path.join(\n outputDirectory,\n 'react/components',\n libraryName,\n );\n\n const generatedFiles = new Map<string, string>();\n\n generatedFiles.set(\n path.join(outputDirectory, '.clang-format'),\n 'DisableFormat: true\\nSortIncludes: false',\n );\n\n const generateNM2 = createNM2Generator({namespace: argv.namespace});\n const generatorPropsH =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GeneratePropsH').generate;\n const generatorPropsCPP =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GeneratePropsCPP').generate;\n const generatorShadowNodeH =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateShadowNodeH').generate;\n const generatorShadowNodeCPP =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateShadowNodeCPP').generate;\n const generatorComponentDescriptorH =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateComponentDescriptorH').generate;\n const generatorEventEmitterH =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateEventEmitterH').generate;\n\n normalizeFileMap(\n generateNM2(libraryName, schema, moduleSpecName),\n outputDirectory,\n generatedFiles,\n );\n\n if (\n Object.keys(schema.modules).some(\n (moduleName) => schema.modules[moduleName].type === 'Component',\n )\n ) {\n const componentGenerators = [\n generatorPropsH,\n generatorPropsCPP,\n generatorShadowNodeH,\n generatorShadowNodeCPP,\n generatorComponentDescriptorH,\n generatorEventEmitterH,\n ];\n\n componentGenerators.forEach((generator) => {\n const generated: Map<string, string> = generator(\n libraryName,\n schema,\n moduleSpecName,\n );\n normalizeFileMap(generated, componentOutputdir, generatedFiles);\n });\n }\n\n if (test === true) {\n return checkFilesForChanges(generatedFiles, outputDirectory);\n }\n\n return writeMapToFiles(generatedFiles, outputDirectory);\n}\n\nif ((argv.file && argv.files) || (!argv.file && !argv.files)) {\n console.error('You must specify either --file or --files.');\n process.exit(1);\n}\n\nlet schema: SchemaType;\nif (argv.file) {\n schema = parseFlowFile(argv.file);\n} else {\n schema = combineSchemas(globby.sync(argv.files as string[]));\n}\n\nconst libraryName = argv.libraryName;\nconst moduleSpecName = 'moduleSpecName';\nconst outputDirectory = 'codegen';\ngenerate(\n {libraryName, schema, outputDirectory, moduleSpecName},\n {generators: [], test: false},\n);\n"]}
|
|
1
|
+
{"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport yargs from 'yargs';\nimport path from 'path';\nimport fs from '@react-native-windows/fs';\nimport globby from 'globby';\nimport {createNM2Generator} from './generators/GenerateNM2';\nimport {generateTypeScript} from './generators/GenerateTypeScript';\n// @ts-ignore\nimport {parseFile} from 'react-native-tscodegen/lib/rncodegen/src/parsers/flow';\n// @ts-ignore\nimport schemaValidator from 'react-native-tscodegen/lib/rncodegen/src/schemaValidator';\n\nconst argv = yargs.options({\n file: {\n type: 'string',\n describe: 'file which contains spec',\n },\n files: {\n type: 'array',\n describe: 'glob patterns for files which contains specs',\n },\n ts: {\n type: 'boolean',\n describe: 'generate turbo module definition files in TypeScript',\n default: false,\n },\n outdir: {\n type: 'string',\n describe: 'output directory',\n default: 'codegen',\n },\n test: {\n type: 'boolean',\n describe: 'Verify that the generated output is unchanged',\n },\n namespace: {\n type: 'string',\n describe: 'C++/C# Namespace to put generated native modules in',\n default: 'MyNamespace',\n },\n libraryName: {\n type: 'string',\n required: true,\n describe: 'Used for part of the path generated within the codegen dir',\n },\n}).argv;\n\nimport {SchemaType} from 'react-native-tscodegen';\n\ninterface Options {\n libraryName: string;\n schema: SchemaType;\n outputDirectory: string;\n moduleSpecName: string;\n}\n\ninterface Config {\n generators: any[] /*Generators[]*/;\n test?: boolean;\n}\n\n/*\nconst GENERATORS = {\n descriptors: [generateComponentDescriptorH.generate],\n events: [\n generateEventEmitterCpp.generate,\n generateEventEmitterH.generate,\n generateModuleHObjCpp.generate,\n generateModuleMm.generate,\n ],\n props: [\n generateComponentHObjCpp.generate,\n generatePropsCpp.generate,\n generatePropsH.generate,\n generatePropsJavaInterface.generate,\n generatePropsJavaDelegate.generate,\n ],\n modules: [generateModuleCpp.generate, generateModuleH.generate],\n tests: [generateTests.generate],\n 'shadow-nodes': [\n generateShadowNodeCpp.generate,\n generateShadowNodeH.generate,\n ],\n};\n*/\n\nfunction normalizeFileMap(\n map: Map<string, string>,\n outputDir: string,\n outMap: Map<string, string>,\n): void {\n for (const [fileName, contents] of map) {\n const location = path.join(outputDir, fileName);\n outMap.set(path.normalize(location), contents);\n }\n}\n\nfunction checkFilesForChanges(\n map: Map<string, string>,\n outputDir: string,\n): boolean {\n let hasChanges = false;\n\n const allExistingFiles = globby\n .sync(`${outputDir}/**`)\n .map((_) => path.normalize(_))\n .sort();\n const allGeneratedFiles = [...map.keys()]\n .map((_) => path.normalize(_))\n .sort();\n\n if (\n allExistingFiles.length !== allGeneratedFiles.length ||\n !allExistingFiles.every((val, index) => val === allGeneratedFiles[index])\n )\n return true;\n\n for (const [fileName, contents] of map) {\n if (!fs.existsSync(fileName)) {\n hasChanges = true;\n continue;\n }\n\n const currentContents = fs.readFileSync(fileName, 'utf8');\n if (currentContents !== contents) {\n console.error(`- ${fileName} has changed`);\n hasChanges = true;\n continue;\n }\n }\n\n return hasChanges;\n}\n\nfunction writeMapToFiles(map: Map<string, string>, outputDir: string) {\n let success = true;\n\n // This ensures that we delete any generated files from modules that have been deleted\n const allExistingFiles = globby.sync(`${outputDir}/**`);\n allExistingFiles.forEach((existingFile) => {\n if (!map.has(path.normalize(existingFile))) {\n fs.unlinkSync(existingFile);\n }\n });\n\n for (const [fileName, contents] of map) {\n try {\n fs.mkdirSync(path.dirname(fileName), {recursive: true});\n\n if (fs.existsSync(fileName)) {\n const currentContents = fs.readFileSync(fileName, 'utf8');\n // Don't update the files if there are no changes as this breaks incremental builds\n if (currentContents === contents) {\n continue;\n }\n }\n\n fs.writeFileSync(fileName, contents);\n } catch (error) {\n success = false;\n console.error(`Failed to write ${fileName} to ${fileName}`, error);\n }\n }\n\n return success;\n}\n\nfunction parseFlowFile(filename: string): SchemaType {\n try {\n return parseFile(filename);\n } catch (e) {\n if (e instanceof Error) {\n e.message = `(${filename}): ${e.message}`;\n }\n throw e;\n }\n}\n\nfunction combineSchemas(files: string[]): SchemaType {\n return files.reduce(\n (merged, filename) => {\n const contents = fs.readFileSync(filename, 'utf8');\n if (\n contents &&\n (/export\\s+default\\s+\\(?codegenNativeComponent</.test(contents) ||\n contents.includes('extends TurboModule'))\n ) {\n const schema = parseFlowFile(filename);\n merged.modules = {...merged.modules, ...schema.modules};\n }\n return merged;\n },\n {modules: {}},\n );\n}\n\nfunction generate(\n {libraryName, schema, outputDirectory, moduleSpecName}: Options,\n {/*generators,*/ test}: Config,\n): boolean {\n schemaValidator.validate(schema);\n\n const componentOutputdir = path.join(\n outputDirectory,\n 'react/components',\n libraryName,\n );\n\n const generatedFiles = new Map<string, string>();\n\n generatedFiles.set(\n path.join(outputDirectory, '.clang-format'),\n 'DisableFormat: true\\nSortIncludes: false',\n );\n\n const generateNM2 = createNM2Generator({namespace: argv.namespace});\n\n const generatorPropsH =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GeneratePropsH').generate;\n const generatorPropsCPP =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GeneratePropsCPP').generate;\n const generatorShadowNodeH =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateShadowNodeH').generate;\n const generatorShadowNodeCPP =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateShadowNodeCPP').generate;\n const generatorComponentDescriptorH =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateComponentDescriptorH').generate;\n const generatorEventEmitterH =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateEventEmitterH').generate;\n const generatorEventEmitterCPP =\n require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateEventEmitterCpp').generate;\n\n normalizeFileMap(\n generateNM2(libraryName, schema, moduleSpecName),\n outputDirectory,\n generatedFiles,\n );\n\n if (argv.ts) {\n normalizeFileMap(\n generateTypeScript(libraryName, schema, moduleSpecName),\n outputDirectory,\n generatedFiles,\n );\n }\n\n if (\n Object.keys(schema.modules).some(\n (moduleName) => schema.modules[moduleName].type === 'Component',\n )\n ) {\n const componentGenerators = [\n generatorPropsH,\n generatorPropsCPP,\n generatorShadowNodeH,\n generatorShadowNodeCPP,\n generatorComponentDescriptorH,\n generatorEventEmitterH,\n generatorEventEmitterCPP,\n ];\n\n componentGenerators.forEach((generator) => {\n const generated: Map<string, string> = generator(\n libraryName,\n schema,\n moduleSpecName,\n );\n normalizeFileMap(generated, componentOutputdir, generatedFiles);\n });\n }\n\n if (test === true) {\n return checkFilesForChanges(generatedFiles, outputDirectory);\n }\n\n return writeMapToFiles(generatedFiles, outputDirectory);\n}\n\nif ((argv.file && argv.files) || (!argv.file && !argv.files)) {\n console.error('You must specify either --file or --files.');\n process.exit(1);\n}\n\nlet schema: SchemaType;\nif (argv.file) {\n schema = parseFlowFile(argv.file);\n} else {\n schema = combineSchemas(globby.sync(argv.files as string[]));\n}\n\nconst libraryName = argv.libraryName;\nconst moduleSpecName = 'moduleSpecName';\nconst outputDirectory = argv.outdir;\ngenerate(\n {libraryName, schema, outputDirectory, moduleSpecName},\n {generators: [], test: false},\n);\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import { SchemaType } from 'react-native-tscodegen';
|
|
7
|
+
declare type FilesOutput = Map<string, string>;
|
|
8
|
+
export declare function generateTypeScript(_libraryName: string, schema: SchemaType, _moduleSpecName: string): FilesOutput;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
'use strict';
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generateTypeScript = void 0;
|
|
9
|
+
const moduleTemplate = `
|
|
10
|
+
/*
|
|
11
|
+
* This file is auto-generated from a NativeModule spec file in js.
|
|
12
|
+
*
|
|
13
|
+
* This is a TypeScript turbo module definition file.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// the following import statements are not actually working today
|
|
17
|
+
import {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
|
|
18
|
+
import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry';
|
|
19
|
+
'use strict';
|
|
20
|
+
::_MODULE_ALIASED_STRUCTS_::
|
|
21
|
+
export interface Spec extends TurboModule {
|
|
22
|
+
::_MODULE_MEMBERS_::
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('::_MODULE_NAME_::');
|
|
26
|
+
`;
|
|
27
|
+
function optionalSign(obj) {
|
|
28
|
+
return obj.optional ? '?' : '';
|
|
29
|
+
}
|
|
30
|
+
function translateType(type) {
|
|
31
|
+
// avoid: Property 'type' does not exist on type 'never'
|
|
32
|
+
const returnType = type.type;
|
|
33
|
+
switch (type.type) {
|
|
34
|
+
case 'StringTypeAnnotation':
|
|
35
|
+
return 'string';
|
|
36
|
+
case 'NumberTypeAnnotation':
|
|
37
|
+
case 'FloatTypeAnnotation':
|
|
38
|
+
case 'DoubleTypeAnnotation':
|
|
39
|
+
case 'Int32TypeAnnotation':
|
|
40
|
+
return 'number';
|
|
41
|
+
case 'BooleanTypeAnnotation':
|
|
42
|
+
return 'boolean';
|
|
43
|
+
case 'ArrayTypeAnnotation':
|
|
44
|
+
if (type.elementType) {
|
|
45
|
+
return `${translateType(type.elementType)}[]`;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return `Array`;
|
|
49
|
+
}
|
|
50
|
+
case 'GenericObjectTypeAnnotation':
|
|
51
|
+
return 'object';
|
|
52
|
+
case 'ObjectTypeAnnotation':
|
|
53
|
+
return `{${type.properties
|
|
54
|
+
.map((prop) => {
|
|
55
|
+
return `${prop.name}${optionalSign(prop)}: ${translateType(prop.typeAnnotation)}`;
|
|
56
|
+
})
|
|
57
|
+
.join(', ')}}`;
|
|
58
|
+
case 'ReservedTypeAnnotation': {
|
|
59
|
+
// avoid: Property 'name' does not exist on type 'never'
|
|
60
|
+
const name = type.name;
|
|
61
|
+
// (#6597)
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
63
|
+
if (name !== 'RootTag')
|
|
64
|
+
throw new Error(`Unknown reserved function: ${name} in translateReturnType`);
|
|
65
|
+
return 'number';
|
|
66
|
+
}
|
|
67
|
+
case 'TypeAliasTypeAnnotation':
|
|
68
|
+
return type.name;
|
|
69
|
+
case 'NullableTypeAnnotation':
|
|
70
|
+
return `(${translateType(type.typeAnnotation)} | null | undefined)`;
|
|
71
|
+
case 'VoidTypeAnnotation':
|
|
72
|
+
return `void`;
|
|
73
|
+
case 'PromiseTypeAnnotation':
|
|
74
|
+
return `Promise`;
|
|
75
|
+
case `FunctionTypeAnnotation`:
|
|
76
|
+
return `((${type.params
|
|
77
|
+
.map((param) => {
|
|
78
|
+
return `${param.name}${optionalSign(param)}: ${translateType(param.typeAnnotation)}`;
|
|
79
|
+
})
|
|
80
|
+
.join(', ')}) => ${translateType(type.returnTypeAnnotation)})`;
|
|
81
|
+
default:
|
|
82
|
+
throw new Error(`Unhandled type in translateReturnType: ${returnType}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function translateAlias(name, type) {
|
|
86
|
+
return `
|
|
87
|
+
export interface ${name} {
|
|
88
|
+
${type.properties
|
|
89
|
+
.map((prop) => {
|
|
90
|
+
return ` ${prop.name}${optionalSign(prop)}: ${translateType(prop.typeAnnotation)};`;
|
|
91
|
+
})
|
|
92
|
+
.join('\n')}
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
function tryGetConstantType(nativeModule) {
|
|
97
|
+
const candidates = nativeModule.spec.properties.filter((prop) => prop.name === 'getConstants');
|
|
98
|
+
if (candidates.length === 0) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
const getConstant = candidates[0];
|
|
102
|
+
const funcType = getConstant.typeAnnotation.type === 'NullableTypeAnnotation'
|
|
103
|
+
? getConstant.typeAnnotation.typeAnnotation
|
|
104
|
+
: getConstant.typeAnnotation;
|
|
105
|
+
if (funcType.params.length > 0 ||
|
|
106
|
+
funcType.returnTypeAnnotation.type !== 'ObjectTypeAnnotation') {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const constantType = funcType.returnTypeAnnotation;
|
|
110
|
+
if (constantType.properties.length === 0) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
return constantType;
|
|
114
|
+
}
|
|
115
|
+
function translateMethod(func) {
|
|
116
|
+
const funcType = func.typeAnnotation.type === 'NullableTypeAnnotation'
|
|
117
|
+
? func.typeAnnotation.typeAnnotation
|
|
118
|
+
: func.typeAnnotation;
|
|
119
|
+
return `
|
|
120
|
+
${func.name}(${funcType.params
|
|
121
|
+
.map((param) => {
|
|
122
|
+
return `${param.name}${optionalSign(param)}: ${translateType(param.typeAnnotation)}`;
|
|
123
|
+
})
|
|
124
|
+
.join(', ')})${optionalSign(func)}: ${translateType(funcType.returnTypeAnnotation)}${funcType.returnTypeAnnotation.type === 'ObjectTypeAnnotation' ? '' : ';'}`;
|
|
125
|
+
}
|
|
126
|
+
function generateTypeScript(_libraryName, schema, _moduleSpecName) {
|
|
127
|
+
const files = new Map();
|
|
128
|
+
for (const moduleName of Object.keys(schema.modules)) {
|
|
129
|
+
const nativeModule = schema.modules[moduleName];
|
|
130
|
+
// from 0.65 facebook's react-native-codegen
|
|
131
|
+
// the module name has the Native prefix comparing to 0.63
|
|
132
|
+
// when reading files we provided
|
|
133
|
+
const nativePrefix = 'Native';
|
|
134
|
+
const preferredModuleName = moduleName.startsWith(nativePrefix)
|
|
135
|
+
? moduleName.substr(nativePrefix.length)
|
|
136
|
+
: moduleName;
|
|
137
|
+
if (nativeModule.type === 'NativeModule') {
|
|
138
|
+
console.log(`Generating ${preferredModuleName}Spec.g.ts`);
|
|
139
|
+
const aliasCode = Object.keys(nativeModule.aliases)
|
|
140
|
+
.map((name) => translateAlias(name, nativeModule.aliases[name]))
|
|
141
|
+
.join('');
|
|
142
|
+
const constantType = tryGetConstantType(nativeModule);
|
|
143
|
+
const constantCode = constantType === undefined
|
|
144
|
+
? ''
|
|
145
|
+
: ` getConstants(): ${translateType(constantType)}`;
|
|
146
|
+
const methods = nativeModule.spec.properties.filter((prop) => prop.name !== 'getConstants');
|
|
147
|
+
const membersCode = methods.map(translateMethod).join('');
|
|
148
|
+
files.set(`${preferredModuleName}Spec.g.ts`, moduleTemplate
|
|
149
|
+
.replace(/::_MODULE_ALIASED_STRUCTS_::/g, aliasCode)
|
|
150
|
+
.replace(/::_MODULE_MEMBERS_::/g, constantCode + membersCode)
|
|
151
|
+
.replace(/::_MODULE_NAME_::/g, preferredModuleName));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return files;
|
|
155
|
+
}
|
|
156
|
+
exports.generateTypeScript = generateTypeScript;
|
|
157
|
+
//# sourceMappingURL=GenerateTypeScript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenerateTypeScript.js","sourceRoot":"","sources":["../../src/generators/GenerateTypeScript.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport {\n NamedShape,\n NativeModuleBaseTypeAnnotation,\n NativeModuleFunctionTypeAnnotation,\n NativeModuleObjectTypeAnnotation,\n NativeModuleParamTypeAnnotation,\n NativeModuleReturnTypeAnnotation,\n NativeModuleSchema,\n Nullable,\n SchemaType,\n} from 'react-native-tscodegen';\n\ntype ObjectProp = NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>;\ntype FunctionParam = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;\ntype FunctionDecl = NamedShape<Nullable<NativeModuleFunctionTypeAnnotation>>;\ntype FilesOutput = Map<string, string>;\n\nconst moduleTemplate = `\n/*\n * This file is auto-generated from a NativeModule spec file in js.\n *\n * This is a TypeScript turbo module definition file.\n */\n\n// the following import statements are not actually working today\nimport {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';\nimport * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry';\n'use strict';\n::_MODULE_ALIASED_STRUCTS_::\nexport interface Spec extends TurboModule {\n::_MODULE_MEMBERS_::\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>('::_MODULE_NAME_::');\n`;\n\nfunction optionalSign<T>(obj: NamedShape<T>): string {\n return obj.optional ? '?' : '';\n}\n\nfunction translateType(\n type: Nullable<\n | NativeModuleBaseTypeAnnotation\n | NativeModuleParamTypeAnnotation\n | NativeModuleReturnTypeAnnotation\n >,\n): string {\n // avoid: Property 'type' does not exist on type 'never'\n const returnType = type.type;\n switch (type.type) {\n case 'StringTypeAnnotation':\n return 'string';\n case 'NumberTypeAnnotation':\n case 'FloatTypeAnnotation':\n case 'DoubleTypeAnnotation':\n case 'Int32TypeAnnotation':\n return 'number';\n case 'BooleanTypeAnnotation':\n return 'boolean';\n case 'ArrayTypeAnnotation':\n if (type.elementType) {\n return `${translateType(type.elementType)}[]`;\n } else {\n return `Array`;\n }\n case 'GenericObjectTypeAnnotation':\n return 'object';\n case 'ObjectTypeAnnotation':\n return `{${type.properties\n .map((prop: ObjectProp) => {\n return `${prop.name}${optionalSign(prop)}: ${translateType(\n prop.typeAnnotation,\n )}`;\n })\n .join(', ')}}`;\n case 'ReservedTypeAnnotation': {\n // avoid: Property 'name' does not exist on type 'never'\n const name = type.name;\n // (#6597)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (name !== 'RootTag')\n throw new Error(\n `Unknown reserved function: ${name} in translateReturnType`,\n );\n return 'number';\n }\n case 'TypeAliasTypeAnnotation':\n return type.name;\n case 'NullableTypeAnnotation':\n return `(${translateType(type.typeAnnotation)} | null | undefined)`;\n case 'VoidTypeAnnotation':\n return `void`;\n case 'PromiseTypeAnnotation':\n return `Promise`;\n case `FunctionTypeAnnotation`:\n return `((${type.params\n .map((param: FunctionParam) => {\n return `${param.name}${optionalSign(param)}: ${translateType(\n param.typeAnnotation,\n )}`;\n })\n .join(', ')}) => ${translateType(type.returnTypeAnnotation)})`;\n default:\n throw new Error(`Unhandled type in translateReturnType: ${returnType}`);\n }\n}\n\nfunction translateAlias(\n name: string,\n type: NativeModuleObjectTypeAnnotation,\n): string {\n return `\nexport interface ${name} {\n${type.properties\n .map((prop: ObjectProp) => {\n return ` ${prop.name}${optionalSign(prop)}: ${translateType(\n prop.typeAnnotation,\n )};`;\n })\n .join('\\n')}\n}\n`;\n}\n\nfunction tryGetConstantType(\n nativeModule: NativeModuleSchema,\n): NativeModuleObjectTypeAnnotation | undefined {\n const candidates = nativeModule.spec.properties.filter(\n (prop) => prop.name === 'getConstants',\n );\n if (candidates.length === 0) {\n return undefined;\n }\n\n const getConstant = candidates[0];\n const funcType =\n getConstant.typeAnnotation.type === 'NullableTypeAnnotation'\n ? getConstant.typeAnnotation.typeAnnotation\n : getConstant.typeAnnotation;\n if (\n funcType.params.length > 0 ||\n funcType.returnTypeAnnotation.type !== 'ObjectTypeAnnotation'\n ) {\n return undefined;\n }\n\n const constantType = funcType.returnTypeAnnotation;\n if (constantType.properties.length === 0) {\n return undefined;\n }\n\n return constantType;\n}\n\nfunction translateMethod(func: FunctionDecl): string {\n const funcType =\n func.typeAnnotation.type === 'NullableTypeAnnotation'\n ? func.typeAnnotation.typeAnnotation\n : func.typeAnnotation;\n\n return `\n ${func.name}(${funcType.params\n .map((param: FunctionParam) => {\n return `${param.name}${optionalSign(param)}: ${translateType(\n param.typeAnnotation,\n )}`;\n })\n .join(', ')})${optionalSign(func)}: ${translateType(\n funcType.returnTypeAnnotation,\n )}${\n funcType.returnTypeAnnotation.type === 'ObjectTypeAnnotation' ? '' : ';'\n }`;\n}\n\nexport function generateTypeScript(\n _libraryName: string,\n schema: SchemaType,\n _moduleSpecName: string,\n): FilesOutput {\n const files = new Map<string, string>();\n\n for (const moduleName of Object.keys(schema.modules)) {\n const nativeModule = schema.modules[moduleName];\n // from 0.65 facebook's react-native-codegen\n // the module name has the Native prefix comparing to 0.63\n // when reading files we provided\n const nativePrefix = 'Native';\n const preferredModuleName = moduleName.startsWith(nativePrefix)\n ? moduleName.substr(nativePrefix.length)\n : moduleName;\n\n if (nativeModule.type === 'NativeModule') {\n console.log(`Generating ${preferredModuleName}Spec.g.ts`);\n\n const aliasCode = Object.keys(nativeModule.aliases)\n .map((name) => translateAlias(name, nativeModule.aliases[name]))\n .join('');\n\n const constantType = tryGetConstantType(nativeModule);\n const constantCode =\n constantType === undefined\n ? ''\n : ` getConstants(): ${translateType(constantType)}`;\n\n const methods = nativeModule.spec.properties.filter(\n (prop) => prop.name !== 'getConstants',\n );\n const membersCode = methods.map(translateMethod).join('');\n\n files.set(\n `${preferredModuleName}Spec.g.ts`,\n moduleTemplate\n .replace(/::_MODULE_ALIASED_STRUCTS_::/g, aliasCode)\n .replace(/::_MODULE_MEMBERS_::/g, constantCode + membersCode)\n .replace(/::_MODULE_NAME_::/g, preferredModuleName),\n );\n }\n }\n\n return files;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-native-windows/codegen",
|
|
3
|
-
"version": "0.0.0-canary.
|
|
3
|
+
"version": "0.0.0-canary.27",
|
|
4
4
|
"description": "Generators for react-native-codegen targeting react-native-windows",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": "https://github.com/microsoft/react-native-windows",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"react-native-windows-codegen": "./bin.js"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@react-native-windows/fs": "^1.0.
|
|
21
|
+
"@react-native-windows/fs": "^1.0.2",
|
|
22
22
|
"chalk": "^4.1.0",
|
|
23
23
|
"globby": "^9.2.0",
|
|
24
24
|
"mustache": "^4.0.1",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"yargs": "^16.2.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@rnw-scripts/eslint-config": "1.1.
|
|
31
|
-
"@rnw-scripts/jest-unittest-config": "1.2.
|
|
32
|
-
"@rnw-scripts/just-task": "2.2.
|
|
33
|
-
"@rnw-scripts/ts-config": "2.0.
|
|
30
|
+
"@rnw-scripts/eslint-config": "1.1.11",
|
|
31
|
+
"@rnw-scripts/jest-unittest-config": "1.2.6",
|
|
32
|
+
"@rnw-scripts/just-task": "2.2.3",
|
|
33
|
+
"@rnw-scripts/ts-config": "2.0.2",
|
|
34
34
|
"@types/chalk": "^2.2.0",
|
|
35
35
|
"@types/globby": "^9.1.0",
|
|
36
36
|
"@types/jest": "^26.0.20",
|
|
@@ -60,6 +60,6 @@
|
|
|
60
60
|
},
|
|
61
61
|
"promoteRelease": true,
|
|
62
62
|
"engines": {
|
|
63
|
-
"node": ">=
|
|
63
|
+
"node": ">= 14"
|
|
64
64
|
}
|
|
65
65
|
}
|
package/src/Cli.ts
CHANGED
|
@@ -10,6 +10,7 @@ import path from 'path';
|
|
|
10
10
|
import fs from '@react-native-windows/fs';
|
|
11
11
|
import globby from 'globby';
|
|
12
12
|
import {createNM2Generator} from './generators/GenerateNM2';
|
|
13
|
+
import {generateTypeScript} from './generators/GenerateTypeScript';
|
|
13
14
|
// @ts-ignore
|
|
14
15
|
import {parseFile} from 'react-native-tscodegen/lib/rncodegen/src/parsers/flow';
|
|
15
16
|
// @ts-ignore
|
|
@@ -24,6 +25,16 @@ const argv = yargs.options({
|
|
|
24
25
|
type: 'array',
|
|
25
26
|
describe: 'glob patterns for files which contains specs',
|
|
26
27
|
},
|
|
28
|
+
ts: {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
describe: 'generate turbo module definition files in TypeScript',
|
|
31
|
+
default: false,
|
|
32
|
+
},
|
|
33
|
+
outdir: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
describe: 'output directory',
|
|
36
|
+
default: 'codegen',
|
|
37
|
+
},
|
|
27
38
|
test: {
|
|
28
39
|
type: 'boolean',
|
|
29
40
|
describe: 'Verify that the generated output is unchanged',
|
|
@@ -209,6 +220,7 @@ function generate(
|
|
|
209
220
|
);
|
|
210
221
|
|
|
211
222
|
const generateNM2 = createNM2Generator({namespace: argv.namespace});
|
|
223
|
+
|
|
212
224
|
const generatorPropsH =
|
|
213
225
|
require('react-native-tscodegen/lib/rncodegen/src/generators/components/GeneratePropsH').generate;
|
|
214
226
|
const generatorPropsCPP =
|
|
@@ -221,6 +233,8 @@ function generate(
|
|
|
221
233
|
require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateComponentDescriptorH').generate;
|
|
222
234
|
const generatorEventEmitterH =
|
|
223
235
|
require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateEventEmitterH').generate;
|
|
236
|
+
const generatorEventEmitterCPP =
|
|
237
|
+
require('react-native-tscodegen/lib/rncodegen/src/generators/components/GenerateEventEmitterCpp').generate;
|
|
224
238
|
|
|
225
239
|
normalizeFileMap(
|
|
226
240
|
generateNM2(libraryName, schema, moduleSpecName),
|
|
@@ -228,6 +242,14 @@ function generate(
|
|
|
228
242
|
generatedFiles,
|
|
229
243
|
);
|
|
230
244
|
|
|
245
|
+
if (argv.ts) {
|
|
246
|
+
normalizeFileMap(
|
|
247
|
+
generateTypeScript(libraryName, schema, moduleSpecName),
|
|
248
|
+
outputDirectory,
|
|
249
|
+
generatedFiles,
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
231
253
|
if (
|
|
232
254
|
Object.keys(schema.modules).some(
|
|
233
255
|
(moduleName) => schema.modules[moduleName].type === 'Component',
|
|
@@ -240,6 +262,7 @@ function generate(
|
|
|
240
262
|
generatorShadowNodeCPP,
|
|
241
263
|
generatorComponentDescriptorH,
|
|
242
264
|
generatorEventEmitterH,
|
|
265
|
+
generatorEventEmitterCPP,
|
|
243
266
|
];
|
|
244
267
|
|
|
245
268
|
componentGenerators.forEach((generator) => {
|
|
@@ -273,7 +296,7 @@ if (argv.file) {
|
|
|
273
296
|
|
|
274
297
|
const libraryName = argv.libraryName;
|
|
275
298
|
const moduleSpecName = 'moduleSpecName';
|
|
276
|
-
const outputDirectory =
|
|
299
|
+
const outputDirectory = argv.outdir;
|
|
277
300
|
generate(
|
|
278
301
|
{libraryName, schema, outputDirectory, moduleSpecName},
|
|
279
302
|
{generators: [], test: false},
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
NamedShape,
|
|
11
|
+
NativeModuleBaseTypeAnnotation,
|
|
12
|
+
NativeModuleFunctionTypeAnnotation,
|
|
13
|
+
NativeModuleObjectTypeAnnotation,
|
|
14
|
+
NativeModuleParamTypeAnnotation,
|
|
15
|
+
NativeModuleReturnTypeAnnotation,
|
|
16
|
+
NativeModuleSchema,
|
|
17
|
+
Nullable,
|
|
18
|
+
SchemaType,
|
|
19
|
+
} from 'react-native-tscodegen';
|
|
20
|
+
|
|
21
|
+
type ObjectProp = NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>;
|
|
22
|
+
type FunctionParam = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;
|
|
23
|
+
type FunctionDecl = NamedShape<Nullable<NativeModuleFunctionTypeAnnotation>>;
|
|
24
|
+
type FilesOutput = Map<string, string>;
|
|
25
|
+
|
|
26
|
+
const moduleTemplate = `
|
|
27
|
+
/*
|
|
28
|
+
* This file is auto-generated from a NativeModule spec file in js.
|
|
29
|
+
*
|
|
30
|
+
* This is a TypeScript turbo module definition file.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
// the following import statements are not actually working today
|
|
34
|
+
import {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
|
|
35
|
+
import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry';
|
|
36
|
+
'use strict';
|
|
37
|
+
::_MODULE_ALIASED_STRUCTS_::
|
|
38
|
+
export interface Spec extends TurboModule {
|
|
39
|
+
::_MODULE_MEMBERS_::
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('::_MODULE_NAME_::');
|
|
43
|
+
`;
|
|
44
|
+
|
|
45
|
+
function optionalSign<T>(obj: NamedShape<T>): string {
|
|
46
|
+
return obj.optional ? '?' : '';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function translateType(
|
|
50
|
+
type: Nullable<
|
|
51
|
+
| NativeModuleBaseTypeAnnotation
|
|
52
|
+
| NativeModuleParamTypeAnnotation
|
|
53
|
+
| NativeModuleReturnTypeAnnotation
|
|
54
|
+
>,
|
|
55
|
+
): string {
|
|
56
|
+
// avoid: Property 'type' does not exist on type 'never'
|
|
57
|
+
const returnType = type.type;
|
|
58
|
+
switch (type.type) {
|
|
59
|
+
case 'StringTypeAnnotation':
|
|
60
|
+
return 'string';
|
|
61
|
+
case 'NumberTypeAnnotation':
|
|
62
|
+
case 'FloatTypeAnnotation':
|
|
63
|
+
case 'DoubleTypeAnnotation':
|
|
64
|
+
case 'Int32TypeAnnotation':
|
|
65
|
+
return 'number';
|
|
66
|
+
case 'BooleanTypeAnnotation':
|
|
67
|
+
return 'boolean';
|
|
68
|
+
case 'ArrayTypeAnnotation':
|
|
69
|
+
if (type.elementType) {
|
|
70
|
+
return `${translateType(type.elementType)}[]`;
|
|
71
|
+
} else {
|
|
72
|
+
return `Array`;
|
|
73
|
+
}
|
|
74
|
+
case 'GenericObjectTypeAnnotation':
|
|
75
|
+
return 'object';
|
|
76
|
+
case 'ObjectTypeAnnotation':
|
|
77
|
+
return `{${type.properties
|
|
78
|
+
.map((prop: ObjectProp) => {
|
|
79
|
+
return `${prop.name}${optionalSign(prop)}: ${translateType(
|
|
80
|
+
prop.typeAnnotation,
|
|
81
|
+
)}`;
|
|
82
|
+
})
|
|
83
|
+
.join(', ')}}`;
|
|
84
|
+
case 'ReservedTypeAnnotation': {
|
|
85
|
+
// avoid: Property 'name' does not exist on type 'never'
|
|
86
|
+
const name = type.name;
|
|
87
|
+
// (#6597)
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
89
|
+
if (name !== 'RootTag')
|
|
90
|
+
throw new Error(
|
|
91
|
+
`Unknown reserved function: ${name} in translateReturnType`,
|
|
92
|
+
);
|
|
93
|
+
return 'number';
|
|
94
|
+
}
|
|
95
|
+
case 'TypeAliasTypeAnnotation':
|
|
96
|
+
return type.name;
|
|
97
|
+
case 'NullableTypeAnnotation':
|
|
98
|
+
return `(${translateType(type.typeAnnotation)} | null | undefined)`;
|
|
99
|
+
case 'VoidTypeAnnotation':
|
|
100
|
+
return `void`;
|
|
101
|
+
case 'PromiseTypeAnnotation':
|
|
102
|
+
return `Promise`;
|
|
103
|
+
case `FunctionTypeAnnotation`:
|
|
104
|
+
return `((${type.params
|
|
105
|
+
.map((param: FunctionParam) => {
|
|
106
|
+
return `${param.name}${optionalSign(param)}: ${translateType(
|
|
107
|
+
param.typeAnnotation,
|
|
108
|
+
)}`;
|
|
109
|
+
})
|
|
110
|
+
.join(', ')}) => ${translateType(type.returnTypeAnnotation)})`;
|
|
111
|
+
default:
|
|
112
|
+
throw new Error(`Unhandled type in translateReturnType: ${returnType}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function translateAlias(
|
|
117
|
+
name: string,
|
|
118
|
+
type: NativeModuleObjectTypeAnnotation,
|
|
119
|
+
): string {
|
|
120
|
+
return `
|
|
121
|
+
export interface ${name} {
|
|
122
|
+
${type.properties
|
|
123
|
+
.map((prop: ObjectProp) => {
|
|
124
|
+
return ` ${prop.name}${optionalSign(prop)}: ${translateType(
|
|
125
|
+
prop.typeAnnotation,
|
|
126
|
+
)};`;
|
|
127
|
+
})
|
|
128
|
+
.join('\n')}
|
|
129
|
+
}
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function tryGetConstantType(
|
|
134
|
+
nativeModule: NativeModuleSchema,
|
|
135
|
+
): NativeModuleObjectTypeAnnotation | undefined {
|
|
136
|
+
const candidates = nativeModule.spec.properties.filter(
|
|
137
|
+
(prop) => prop.name === 'getConstants',
|
|
138
|
+
);
|
|
139
|
+
if (candidates.length === 0) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const getConstant = candidates[0];
|
|
144
|
+
const funcType =
|
|
145
|
+
getConstant.typeAnnotation.type === 'NullableTypeAnnotation'
|
|
146
|
+
? getConstant.typeAnnotation.typeAnnotation
|
|
147
|
+
: getConstant.typeAnnotation;
|
|
148
|
+
if (
|
|
149
|
+
funcType.params.length > 0 ||
|
|
150
|
+
funcType.returnTypeAnnotation.type !== 'ObjectTypeAnnotation'
|
|
151
|
+
) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const constantType = funcType.returnTypeAnnotation;
|
|
156
|
+
if (constantType.properties.length === 0) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return constantType;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function translateMethod(func: FunctionDecl): string {
|
|
164
|
+
const funcType =
|
|
165
|
+
func.typeAnnotation.type === 'NullableTypeAnnotation'
|
|
166
|
+
? func.typeAnnotation.typeAnnotation
|
|
167
|
+
: func.typeAnnotation;
|
|
168
|
+
|
|
169
|
+
return `
|
|
170
|
+
${func.name}(${funcType.params
|
|
171
|
+
.map((param: FunctionParam) => {
|
|
172
|
+
return `${param.name}${optionalSign(param)}: ${translateType(
|
|
173
|
+
param.typeAnnotation,
|
|
174
|
+
)}`;
|
|
175
|
+
})
|
|
176
|
+
.join(', ')})${optionalSign(func)}: ${translateType(
|
|
177
|
+
funcType.returnTypeAnnotation,
|
|
178
|
+
)}${
|
|
179
|
+
funcType.returnTypeAnnotation.type === 'ObjectTypeAnnotation' ? '' : ';'
|
|
180
|
+
}`;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function generateTypeScript(
|
|
184
|
+
_libraryName: string,
|
|
185
|
+
schema: SchemaType,
|
|
186
|
+
_moduleSpecName: string,
|
|
187
|
+
): FilesOutput {
|
|
188
|
+
const files = new Map<string, string>();
|
|
189
|
+
|
|
190
|
+
for (const moduleName of Object.keys(schema.modules)) {
|
|
191
|
+
const nativeModule = schema.modules[moduleName];
|
|
192
|
+
// from 0.65 facebook's react-native-codegen
|
|
193
|
+
// the module name has the Native prefix comparing to 0.63
|
|
194
|
+
// when reading files we provided
|
|
195
|
+
const nativePrefix = 'Native';
|
|
196
|
+
const preferredModuleName = moduleName.startsWith(nativePrefix)
|
|
197
|
+
? moduleName.substr(nativePrefix.length)
|
|
198
|
+
: moduleName;
|
|
199
|
+
|
|
200
|
+
if (nativeModule.type === 'NativeModule') {
|
|
201
|
+
console.log(`Generating ${preferredModuleName}Spec.g.ts`);
|
|
202
|
+
|
|
203
|
+
const aliasCode = Object.keys(nativeModule.aliases)
|
|
204
|
+
.map((name) => translateAlias(name, nativeModule.aliases[name]))
|
|
205
|
+
.join('');
|
|
206
|
+
|
|
207
|
+
const constantType = tryGetConstantType(nativeModule);
|
|
208
|
+
const constantCode =
|
|
209
|
+
constantType === undefined
|
|
210
|
+
? ''
|
|
211
|
+
: ` getConstants(): ${translateType(constantType)}`;
|
|
212
|
+
|
|
213
|
+
const methods = nativeModule.spec.properties.filter(
|
|
214
|
+
(prop) => prop.name !== 'getConstants',
|
|
215
|
+
);
|
|
216
|
+
const membersCode = methods.map(translateMethod).join('');
|
|
217
|
+
|
|
218
|
+
files.set(
|
|
219
|
+
`${preferredModuleName}Spec.g.ts`,
|
|
220
|
+
moduleTemplate
|
|
221
|
+
.replace(/::_MODULE_ALIASED_STRUCTS_::/g, aliasCode)
|
|
222
|
+
.replace(/::_MODULE_MEMBERS_::/g, constantCode + membersCode)
|
|
223
|
+
.replace(/::_MODULE_NAME_::/g, preferredModuleName),
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return files;
|
|
229
|
+
}
|