@react-native-windows/codegen 0.0.0-canary.4 → 0.0.0-canary.41
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 +359 -4
- package/bin.js +0 -0
- package/lib-commonjs/Cli.d.ts +7 -0
- package/lib-commonjs/Cli.js +60 -0
- package/lib-commonjs/Cli.js.map +1 -0
- package/lib-commonjs/generators/AliasGen.d.ts +11 -0
- package/lib-commonjs/generators/AliasGen.js +72 -0
- package/lib-commonjs/generators/AliasGen.js.map +1 -0
- package/lib-commonjs/generators/AliasManaging.d.ts +15 -0
- package/lib-commonjs/generators/AliasManaging.js +49 -0
- package/lib-commonjs/generators/AliasManaging.js.map +1 -0
- package/lib-commonjs/generators/GenerateNM2.d.ts +12 -0
- package/lib-commonjs/generators/GenerateNM2.js +94 -0
- package/lib-commonjs/generators/GenerateNM2.js.map +1 -0
- package/lib-commonjs/generators/GenerateTypeScript.d.ts +11 -0
- package/lib-commonjs/generators/GenerateTypeScript.js +166 -0
- package/lib-commonjs/generators/GenerateTypeScript.js.map +1 -0
- package/lib-commonjs/generators/ObjectTypes.d.ts +8 -0
- package/lib-commonjs/generators/ObjectTypes.js +53 -0
- package/lib-commonjs/generators/ObjectTypes.js.map +1 -0
- package/lib-commonjs/generators/ParamTypes.d.ts +11 -0
- package/lib-commonjs/generators/ParamTypes.js +114 -0
- package/lib-commonjs/generators/ParamTypes.js.map +1 -0
- package/lib-commonjs/generators/ReturnTypes.d.ts +9 -0
- package/lib-commonjs/generators/ReturnTypes.js +63 -0
- package/lib-commonjs/generators/ReturnTypes.js.map +1 -0
- package/lib-commonjs/generators/ValidateConstants.d.ts +8 -0
- package/lib-commonjs/generators/ValidateConstants.js +38 -0
- package/lib-commonjs/generators/ValidateConstants.js.map +1 -0
- package/lib-commonjs/generators/ValidateMethods.d.ts +8 -0
- package/lib-commonjs/generators/ValidateMethods.js +70 -0
- package/lib-commonjs/generators/ValidateMethods.js.map +1 -0
- package/lib-commonjs/index.d.ts +35 -0
- package/lib-commonjs/index.js +190 -0
- package/lib-commonjs/index.js.map +1 -0
- package/package.json +32 -18
- package/src/Cli.ts +26 -152
- package/src/generators/AliasGen.ts +105 -0
- package/src/generators/AliasManaging.ts +75 -0
- package/src/generators/GenerateNM2.ts +69 -297
- package/src/generators/GenerateTypeScript.ts +247 -0
- package/src/generators/ObjectTypes.ts +73 -0
- package/src/generators/ParamTypes.ts +220 -0
- package/src/generators/ReturnTypes.ts +92 -0
- package/src/generators/ValidateConstants.ts +50 -0
- package/src/generators/ValidateMethods.ts +135 -0
- package/src/index.ts +321 -0
- package/.eslintrc.js +0 -4
- package/.vscode/launch.json +0 -23
- package/CHANGELOG.json +0 -462
- package/jest.config.js +0 -1
- package/tsconfig.json +0 -5
|
@@ -0,0 +1,94 @@
|
|
|
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.createNM2Generator = void 0;
|
|
9
|
+
const AliasManaging_1 = require("./AliasManaging");
|
|
10
|
+
const AliasGen_1 = require("./AliasGen");
|
|
11
|
+
const ValidateConstants_1 = require("./ValidateConstants");
|
|
12
|
+
const ValidateMethods_1 = require("./ValidateMethods");
|
|
13
|
+
const moduleTemplate = `
|
|
14
|
+
/*
|
|
15
|
+
* This file is auto-generated from a NativeModule spec file in js.
|
|
16
|
+
*
|
|
17
|
+
* This is a C++ Spec class that should be used with MakeTurboModuleProvider to register native modules
|
|
18
|
+
* in a way that also verifies at compile time that the native module matches the interface required
|
|
19
|
+
* by the TurboModule JS spec.
|
|
20
|
+
*/
|
|
21
|
+
#pragma once
|
|
22
|
+
|
|
23
|
+
#include "NativeModules.h"
|
|
24
|
+
#include <tuple>
|
|
25
|
+
|
|
26
|
+
namespace ::_NAMESPACE_:: {
|
|
27
|
+
::_MODULE_ALIASED_STRUCTS_::
|
|
28
|
+
struct ::_MODULE_NAME_::Spec : winrt::Microsoft::ReactNative::TurboModuleSpec {
|
|
29
|
+
::_MODULE_MEMBERS_TUPLES_::
|
|
30
|
+
|
|
31
|
+
template <class TModule>
|
|
32
|
+
static constexpr void ValidateModule() noexcept {
|
|
33
|
+
::_MODULE_MEMBERS_CHECKS_::
|
|
34
|
+
|
|
35
|
+
::_MODULE_MEMBERS_ERRORS_::
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
} // namespace ::_NAMESPACE_::
|
|
40
|
+
`;
|
|
41
|
+
function createNM2Generator({ namespace, methodonly, }) {
|
|
42
|
+
return (_libraryName, schema, _moduleSpecName) => {
|
|
43
|
+
const files = new Map();
|
|
44
|
+
for (const moduleName of Object.keys(schema.modules)) {
|
|
45
|
+
const nativeModule = schema.modules[moduleName];
|
|
46
|
+
// from 0.65 facebook's react-native-codegen
|
|
47
|
+
// the module name has the Native prefix comparing to 0.63
|
|
48
|
+
// when reading files we provided
|
|
49
|
+
const preferredModuleName = moduleName.startsWith('Native')
|
|
50
|
+
? moduleName.substr(6)
|
|
51
|
+
: moduleName;
|
|
52
|
+
(0, AliasManaging_1.setPreferredModuleName)(preferredModuleName);
|
|
53
|
+
if (nativeModule.type === 'NativeModule') {
|
|
54
|
+
console.log(`Generating Native${preferredModuleName}Spec.g.h`);
|
|
55
|
+
// copy all explicit to a map
|
|
56
|
+
const aliases = (0, AliasGen_1.createAliasMap)(nativeModule.aliases);
|
|
57
|
+
// prepare methods
|
|
58
|
+
const methods = (0, ValidateMethods_1.generateValidateMethods)(nativeModule, aliases);
|
|
59
|
+
let tuples = `
|
|
60
|
+
static constexpr auto methods = std::tuple{
|
|
61
|
+
${methods[0]}
|
|
62
|
+
};`;
|
|
63
|
+
let checks = `
|
|
64
|
+
constexpr auto methodCheckResults = CheckMethods<TModule, ::_MODULE_NAME_::Spec>();`;
|
|
65
|
+
let errors = methods[1];
|
|
66
|
+
// prepare constants
|
|
67
|
+
const constants = (0, ValidateConstants_1.generateValidateConstants)(nativeModule, aliases);
|
|
68
|
+
if (constants !== undefined && !methodonly) {
|
|
69
|
+
tuples = `
|
|
70
|
+
static constexpr auto constants = std::tuple{
|
|
71
|
+
${constants[0]}
|
|
72
|
+
};${tuples}`;
|
|
73
|
+
checks = `
|
|
74
|
+
constexpr auto constantCheckResults = CheckConstants<TModule, ::_MODULE_NAME_::Spec>();${checks}`;
|
|
75
|
+
errors = `${constants[1]}
|
|
76
|
+
|
|
77
|
+
${errors}`;
|
|
78
|
+
}
|
|
79
|
+
// generate code for structs
|
|
80
|
+
const traversedAliasedStructs = (0, AliasGen_1.generateAliases)(aliases);
|
|
81
|
+
files.set(`Native${preferredModuleName}Spec.g.h`, moduleTemplate
|
|
82
|
+
.replace(/::_MODULE_ALIASED_STRUCTS_::/g, traversedAliasedStructs)
|
|
83
|
+
.replace(/::_MODULE_MEMBERS_TUPLES_::/g, tuples.substring(1))
|
|
84
|
+
.replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substring(1))
|
|
85
|
+
.replace(/::_MODULE_MEMBERS_ERRORS_::/g, errors)
|
|
86
|
+
.replace(/::_MODULE_NAME_::/g, preferredModuleName)
|
|
87
|
+
.replace(/::_NAMESPACE_::/g, namespace));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return files;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
exports.createNM2Generator = createNM2Generator;
|
|
94
|
+
//# sourceMappingURL=GenerateNM2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenerateNM2.js","sourceRoot":"","sources":["../../src/generators/GenerateNM2.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;;;AAGb,mDAAiE;AACjE,yCAA2D;AAC3D,2DAA8D;AAC9D,uDAA0D;AAI1D,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BtB,CAAC;AAEF,SAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,UAAU,GAIX;IACC,OAAO,CACL,YAAoB,EACpB,MAAkB,EAClB,eAAuB,EACV,EAAE;QACf,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QAExC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YACpD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,4CAA4C;YAC5C,0DAA0D;YAC1D,iCAAiC;YACjC,MAAM,mBAAmB,GAAG,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACzD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,UAAU,CAAC;YACf,IAAA,sCAAsB,EAAC,mBAAmB,CAAC,CAAC;YAE5C,IAAI,YAAY,CAAC,IAAI,KAAK,cAAc,EAAE;gBACxC,OAAO,CAAC,GAAG,CAAC,oBAAoB,mBAAmB,UAAU,CAAC,CAAC;gBAE/D,6BAA6B;gBAC7B,MAAM,OAAO,GAAa,IAAA,yBAAc,EAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAE/D,kBAAkB;gBAClB,MAAM,OAAO,GAAG,IAAA,yCAAuB,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC/D,IAAI,MAAM,GAAG;;EAEnB,OAAO,CAAC,CAAC,CAAC;KACP,CAAC;gBACE,IAAI,MAAM,GAAG;wFACmE,CAAC;gBACjF,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAExB,oBAAoB;gBACpB,MAAM,SAAS,GAAG,IAAA,6CAAyB,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACnE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,UAAU,EAAE;oBAC1C,MAAM,GAAG;;EAEjB,SAAS,CAAC,CAAC,CAAC;MACR,MAAM,EAAE,CAAC;oBACL,MAAM,GAAG;6FAC0E,MAAM,EAAE,CAAC;oBAC5F,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC;;EAEhC,MAAM,EAAE,CAAC;iBACF;gBAED,4BAA4B;gBAC5B,MAAM,uBAAuB,GAAG,IAAA,0BAAe,EAAC,OAAO,CAAC,CAAC;gBAEzD,KAAK,CAAC,GAAG,CACP,SAAS,mBAAmB,UAAU,EACtC,cAAc;qBACX,OAAO,CAAC,+BAA+B,EAAE,uBAAuB,CAAC;qBACjE,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;qBAC5D,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;qBAC5D,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC;qBAC/C,OAAO,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;qBAClD,OAAO,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAC1C,CAAC;aACH;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAxED,gDAwEC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport type {SchemaType} from 'react-native-tscodegen';\nimport {AliasMap, setPreferredModuleName} from './AliasManaging';\nimport {createAliasMap, generateAliases} from './AliasGen';\nimport {generateValidateConstants} from './ValidateConstants';\nimport {generateValidateMethods} from './ValidateMethods';\n\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 C++ Spec class that should be used with MakeTurboModuleProvider to register native modules\n * in a way that also verifies at compile time that the native module matches the interface required\n * by the TurboModule JS spec.\n */\n#pragma once\n\n#include \"NativeModules.h\"\n#include <tuple>\n\nnamespace ::_NAMESPACE_:: {\n::_MODULE_ALIASED_STRUCTS_::\nstruct ::_MODULE_NAME_::Spec : winrt::Microsoft::ReactNative::TurboModuleSpec {\n::_MODULE_MEMBERS_TUPLES_::\n\n template <class TModule>\n static constexpr void ValidateModule() noexcept {\n::_MODULE_MEMBERS_CHECKS_::\n\n::_MODULE_MEMBERS_ERRORS_::\n }\n};\n\n} // namespace ::_NAMESPACE_::\n`;\n\nexport function createNM2Generator({\n namespace,\n methodonly,\n}: {\n namespace: string;\n methodonly: boolean;\n}) {\n return (\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 preferredModuleName = moduleName.startsWith('Native')\n ? moduleName.substr(6)\n : moduleName;\n setPreferredModuleName(preferredModuleName);\n\n if (nativeModule.type === 'NativeModule') {\n console.log(`Generating Native${preferredModuleName}Spec.g.h`);\n\n // copy all explicit to a map\n const aliases: AliasMap = createAliasMap(nativeModule.aliases);\n\n // prepare methods\n const methods = generateValidateMethods(nativeModule, aliases);\n let tuples = `\n static constexpr auto methods = std::tuple{\n${methods[0]}\n };`;\n let checks = `\n constexpr auto methodCheckResults = CheckMethods<TModule, ::_MODULE_NAME_::Spec>();`;\n let errors = methods[1];\n\n // prepare constants\n const constants = generateValidateConstants(nativeModule, aliases);\n if (constants !== undefined && !methodonly) {\n tuples = `\n static constexpr auto constants = std::tuple{\n${constants[0]}\n };${tuples}`;\n checks = `\n constexpr auto constantCheckResults = CheckConstants<TModule, ::_MODULE_NAME_::Spec>();${checks}`;\n errors = `${constants[1]}\n\n${errors}`;\n }\n\n // generate code for structs\n const traversedAliasedStructs = generateAliases(aliases);\n\n files.set(\n `Native${preferredModuleName}Spec.g.h`,\n moduleTemplate\n .replace(/::_MODULE_ALIASED_STRUCTS_::/g, traversedAliasedStructs)\n .replace(/::_MODULE_MEMBERS_TUPLES_::/g, tuples.substring(1))\n .replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substring(1))\n .replace(/::_MODULE_MEMBERS_ERRORS_::/g, errors)\n .replace(/::_MODULE_NAME_::/g, preferredModuleName)\n .replace(/::_NAMESPACE_::/g, namespace),\n );\n }\n }\n\n return files;\n };\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import type { NativeModuleSchema, SchemaType } from 'react-native-tscodegen';
|
|
7
|
+
export declare function setOptionalTurboModule(schema: NativeModuleSchema, optional: boolean): void;
|
|
8
|
+
export declare function getOptionalTurboModule(schema: NativeModuleSchema): boolean;
|
|
9
|
+
declare type FilesOutput = Map<string, string>;
|
|
10
|
+
export declare function generateTypeScript(_libraryName: string, schema: SchemaType, _moduleSpecName: string): FilesOutput;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,166 @@
|
|
|
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 = exports.getOptionalTurboModule = exports.setOptionalTurboModule = void 0;
|
|
9
|
+
function setOptionalTurboModule(schema, optional) {
|
|
10
|
+
const cs = schema;
|
|
11
|
+
cs.optionalTurboModule = optional;
|
|
12
|
+
}
|
|
13
|
+
exports.setOptionalTurboModule = setOptionalTurboModule;
|
|
14
|
+
function getOptionalTurboModule(schema) {
|
|
15
|
+
var _a;
|
|
16
|
+
return (_a = schema.optionalTurboModule) !== null && _a !== void 0 ? _a : false;
|
|
17
|
+
}
|
|
18
|
+
exports.getOptionalTurboModule = getOptionalTurboModule;
|
|
19
|
+
const moduleTemplate = `
|
|
20
|
+
/*
|
|
21
|
+
* This file is auto-generated from a NativeModule spec file in js.
|
|
22
|
+
*
|
|
23
|
+
* This is a TypeScript turbo module definition file.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import {TurboModule, TurboModuleRegistry} from 'react-native';
|
|
27
|
+
'use strict';
|
|
28
|
+
::_MODULE_ALIASED_STRUCTS_::
|
|
29
|
+
export interface Spec extends TurboModule {
|
|
30
|
+
::_MODULE_MEMBERS_::
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default TurboModuleRegistry.::_MODULE_GETTER_::<Spec>('::_MODULE_NAME_::');
|
|
34
|
+
`;
|
|
35
|
+
function optionalSign(obj) {
|
|
36
|
+
return obj.optional ? '?' : '';
|
|
37
|
+
}
|
|
38
|
+
function translateType(type) {
|
|
39
|
+
// avoid: Property 'type' does not exist on type 'never'
|
|
40
|
+
const returnType = type.type;
|
|
41
|
+
switch (type.type) {
|
|
42
|
+
case 'StringTypeAnnotation':
|
|
43
|
+
return 'string';
|
|
44
|
+
case 'NumberTypeAnnotation':
|
|
45
|
+
case 'FloatTypeAnnotation':
|
|
46
|
+
case 'DoubleTypeAnnotation':
|
|
47
|
+
case 'Int32TypeAnnotation':
|
|
48
|
+
return 'number';
|
|
49
|
+
case 'BooleanTypeAnnotation':
|
|
50
|
+
return 'boolean';
|
|
51
|
+
case 'ArrayTypeAnnotation':
|
|
52
|
+
if (type.elementType) {
|
|
53
|
+
return `${translateType(type.elementType)}[]`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return `Array`;
|
|
57
|
+
}
|
|
58
|
+
case 'GenericObjectTypeAnnotation':
|
|
59
|
+
return 'object';
|
|
60
|
+
case 'ObjectTypeAnnotation':
|
|
61
|
+
return `{${type.properties
|
|
62
|
+
.map((prop) => {
|
|
63
|
+
return `${prop.name}${optionalSign(prop)}: ${translateType(prop.typeAnnotation)}`;
|
|
64
|
+
})
|
|
65
|
+
.join(', ')}}`;
|
|
66
|
+
case 'ReservedTypeAnnotation': {
|
|
67
|
+
// avoid: Property 'name' does not exist on type 'never'
|
|
68
|
+
const name = type.name;
|
|
69
|
+
// (#6597)
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
71
|
+
if (name !== 'RootTag')
|
|
72
|
+
throw new Error(`Unknown reserved function: ${name} in translateReturnType`);
|
|
73
|
+
return 'number';
|
|
74
|
+
}
|
|
75
|
+
case 'TypeAliasTypeAnnotation':
|
|
76
|
+
return type.name;
|
|
77
|
+
case 'NullableTypeAnnotation':
|
|
78
|
+
return `(${translateType(type.typeAnnotation)} | null | undefined)`;
|
|
79
|
+
case 'VoidTypeAnnotation':
|
|
80
|
+
return `void`;
|
|
81
|
+
case 'PromiseTypeAnnotation':
|
|
82
|
+
return `Promise`;
|
|
83
|
+
case `FunctionTypeAnnotation`:
|
|
84
|
+
return `((${type.params
|
|
85
|
+
.map((param) => {
|
|
86
|
+
return `${param.name}${optionalSign(param)}: ${translateType(param.typeAnnotation)}`;
|
|
87
|
+
})
|
|
88
|
+
.join(', ')}) => ${translateType(type.returnTypeAnnotation)})`;
|
|
89
|
+
default:
|
|
90
|
+
throw new Error(`Unhandled type in translateReturnType: ${returnType}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function translateAlias(name, type) {
|
|
94
|
+
return `
|
|
95
|
+
export interface ${name} {
|
|
96
|
+
${type.properties
|
|
97
|
+
.map((prop) => {
|
|
98
|
+
return ` ${prop.name}${optionalSign(prop)}: ${translateType(prop.typeAnnotation)};`;
|
|
99
|
+
})
|
|
100
|
+
.join('\n')}
|
|
101
|
+
}
|
|
102
|
+
`;
|
|
103
|
+
}
|
|
104
|
+
function tryGetConstantType(nativeModule) {
|
|
105
|
+
const candidates = nativeModule.spec.properties.filter(prop => prop.name === 'getConstants');
|
|
106
|
+
if (candidates.length === 0) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const getConstant = candidates[0];
|
|
110
|
+
const funcType = getConstant.typeAnnotation.type === 'NullableTypeAnnotation'
|
|
111
|
+
? getConstant.typeAnnotation.typeAnnotation
|
|
112
|
+
: getConstant.typeAnnotation;
|
|
113
|
+
if (funcType.params.length > 0 ||
|
|
114
|
+
funcType.returnTypeAnnotation.type !== 'ObjectTypeAnnotation') {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const constantType = funcType.returnTypeAnnotation;
|
|
118
|
+
if (constantType.properties.length === 0) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
return constantType;
|
|
122
|
+
}
|
|
123
|
+
function translateMethod(func) {
|
|
124
|
+
const funcType = func.typeAnnotation.type === 'NullableTypeAnnotation'
|
|
125
|
+
? func.typeAnnotation.typeAnnotation
|
|
126
|
+
: func.typeAnnotation;
|
|
127
|
+
return `
|
|
128
|
+
${func.name}(${funcType.params
|
|
129
|
+
.map((param) => {
|
|
130
|
+
return `${param.name}${optionalSign(param)}: ${translateType(param.typeAnnotation)}`;
|
|
131
|
+
})
|
|
132
|
+
.join(', ')})${optionalSign(func)}: ${translateType(funcType.returnTypeAnnotation)}${funcType.returnTypeAnnotation.type === 'ObjectTypeAnnotation' ? '' : ';'}`;
|
|
133
|
+
}
|
|
134
|
+
function generateTypeScript(_libraryName, schema, _moduleSpecName) {
|
|
135
|
+
const files = new Map();
|
|
136
|
+
for (const moduleName of Object.keys(schema.modules)) {
|
|
137
|
+
const nativeModule = schema.modules[moduleName];
|
|
138
|
+
// from 0.65 facebook's react-native-codegen
|
|
139
|
+
// the module name has the Native prefix comparing to 0.63
|
|
140
|
+
// when reading files we provided
|
|
141
|
+
const nativePrefix = 'Native';
|
|
142
|
+
const preferredModuleName = moduleName.startsWith(nativePrefix)
|
|
143
|
+
? moduleName.substr(nativePrefix.length)
|
|
144
|
+
: moduleName;
|
|
145
|
+
if (nativeModule.type === 'NativeModule') {
|
|
146
|
+
console.log(`Generating ${preferredModuleName}Spec.g.ts`);
|
|
147
|
+
const aliasCode = Object.keys(nativeModule.aliases)
|
|
148
|
+
.map(name => translateAlias(name, nativeModule.aliases[name]))
|
|
149
|
+
.join('');
|
|
150
|
+
const constantType = tryGetConstantType(nativeModule);
|
|
151
|
+
const constantCode = constantType === undefined
|
|
152
|
+
? ''
|
|
153
|
+
: ` getConstants(): ${translateType(constantType)}`;
|
|
154
|
+
const methods = nativeModule.spec.properties.filter(prop => prop.name !== 'getConstants');
|
|
155
|
+
const membersCode = methods.map(translateMethod).join('');
|
|
156
|
+
files.set(`${preferredModuleName}Spec.g.ts`, moduleTemplate
|
|
157
|
+
.replace(/::_MODULE_ALIASED_STRUCTS_::/g, aliasCode)
|
|
158
|
+
.replace(/::_MODULE_MEMBERS_::/g, constantCode + membersCode)
|
|
159
|
+
.replace(/::_MODULE_NAME_::/g, preferredModuleName)
|
|
160
|
+
.replace(/::_MODULE_GETTER_::/g, getOptionalTurboModule(nativeModule) ? 'get' : 'getEnforcing'));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return files;
|
|
164
|
+
}
|
|
165
|
+
exports.generateTypeScript = generateTypeScript;
|
|
166
|
+
//# 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 type {\n NamedShape,\n NativeModuleBaseTypeAnnotation,\n NativeModuleFunctionTypeAnnotation,\n NativeModuleObjectTypeAnnotation,\n NativeModuleParamTypeAnnotation,\n NativeModuleReturnTypeAnnotation,\n NativeModuleSchema,\n Nullable,\n SchemaType,\n} from 'react-native-tscodegen';\n\ninterface CodegenNativeModuleSchema extends NativeModuleSchema {\n optionalTurboModule?: boolean;\n}\n\nexport function setOptionalTurboModule(\n schema: NativeModuleSchema,\n optional: boolean,\n): void {\n const cs = <CodegenNativeModuleSchema>schema;\n cs.optionalTurboModule = optional;\n}\n\nexport function getOptionalTurboModule(schema: NativeModuleSchema): boolean {\n return (<CodegenNativeModuleSchema>schema).optionalTurboModule ?? false;\n}\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\nimport {TurboModule, TurboModuleRegistry} from 'react-native';\n'use strict';\n::_MODULE_ALIASED_STRUCTS_::\nexport interface Spec extends TurboModule {\n::_MODULE_MEMBERS_::\n}\n\nexport default TurboModuleRegistry.::_MODULE_GETTER_::<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 .replace(\n /::_MODULE_GETTER_::/g,\n getOptionalTurboModule(nativeModule) ? 'get' : 'getEnforcing',\n ),\n );\n }\n }\n\n return files;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import type { NativeModuleBaseTypeAnnotation, Nullable } from 'react-native-tscodegen';
|
|
7
|
+
import { AliasMap } from './AliasManaging';
|
|
8
|
+
export declare function translateField(type: Nullable<NativeModuleBaseTypeAnnotation>, aliases: AliasMap, baseAliasName: string): string;
|
|
@@ -0,0 +1,53 @@
|
|
|
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.translateField = void 0;
|
|
9
|
+
const AliasManaging_1 = require("./AliasManaging");
|
|
10
|
+
function translateField(type, aliases, baseAliasName) {
|
|
11
|
+
// avoid: Property 'type' does not exist on type 'never'
|
|
12
|
+
const returnType = type.type;
|
|
13
|
+
switch (type.type) {
|
|
14
|
+
case 'StringTypeAnnotation':
|
|
15
|
+
return 'std::string';
|
|
16
|
+
case 'NumberTypeAnnotation':
|
|
17
|
+
case 'FloatTypeAnnotation':
|
|
18
|
+
case 'DoubleTypeAnnotation':
|
|
19
|
+
return 'double';
|
|
20
|
+
case 'Int32TypeAnnotation':
|
|
21
|
+
return 'int';
|
|
22
|
+
case 'BooleanTypeAnnotation':
|
|
23
|
+
return 'bool';
|
|
24
|
+
case 'ArrayTypeAnnotation':
|
|
25
|
+
if (type.elementType) {
|
|
26
|
+
return `std::vector<${translateField(type.elementType, aliases, `${baseAliasName}_element`)}>`;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return `::React::JSValueArray`;
|
|
30
|
+
}
|
|
31
|
+
case 'GenericObjectTypeAnnotation':
|
|
32
|
+
return '::React::JSValue';
|
|
33
|
+
case 'ObjectTypeAnnotation':
|
|
34
|
+
return (0, AliasManaging_1.getAnonymousAliasCppName)(aliases, baseAliasName, type);
|
|
35
|
+
case 'ReservedTypeAnnotation': {
|
|
36
|
+
// avoid: Property 'name' does not exist on type 'never'
|
|
37
|
+
const name = type.name;
|
|
38
|
+
// (#6597)
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
40
|
+
if (name !== 'RootTag')
|
|
41
|
+
throw new Error(`Unknown reserved function: ${name} in translateReturnType`);
|
|
42
|
+
return 'double';
|
|
43
|
+
}
|
|
44
|
+
case 'TypeAliasTypeAnnotation':
|
|
45
|
+
return (0, AliasManaging_1.getAliasCppName)(type.name);
|
|
46
|
+
case 'NullableTypeAnnotation':
|
|
47
|
+
return `std::optional<${translateField(type.typeAnnotation, aliases, baseAliasName)}>`;
|
|
48
|
+
default:
|
|
49
|
+
throw new Error(`Unhandled type in translateReturnType: ${returnType}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.translateField = translateField;
|
|
53
|
+
//# sourceMappingURL=ObjectTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectTypes.js","sourceRoot":"","sources":["../../src/generators/ObjectTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;;;AAMb,mDAIyB;AAEzB,SAAgB,cAAc,CAC5B,IAA8C,EAC9C,OAAiB,EACjB,aAAqB;IAErB,wDAAwD;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;IAC7B,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,sBAAsB;YACzB,OAAO,aAAa,CAAC;QACvB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,qBAAqB,CAAC;QAC3B,KAAK,sBAAsB;YACzB,OAAO,QAAQ,CAAC;QAClB,KAAK,qBAAqB;YACxB,OAAO,KAAK,CAAC;QACf,KAAK,uBAAuB;YAC1B,OAAO,MAAM,CAAC;QAChB,KAAK,qBAAqB;YACxB,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,OAAO,eAAe,cAAc,CAClC,IAAI,CAAC,WAAW,EAChB,OAAO,EACP,GAAG,aAAa,UAAU,CAC3B,GAAG,CAAC;aACN;iBAAM;gBACL,OAAO,uBAAuB,CAAC;aAChC;QACH,KAAK,6BAA6B;YAChC,OAAO,kBAAkB,CAAC;QAC5B,KAAK,sBAAsB;YACzB,OAAO,IAAA,wCAAwB,EAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QAChE,KAAK,wBAAwB,CAAC,CAAC;YAC7B,wDAAwD;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,UAAU;YACV,uEAAuE;YACvE,IAAI,IAAI,KAAK,SAAS;gBACpB,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,yBAAyB,CAC5D,CAAC;YACJ,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,yBAAyB;YAC5B,OAAO,IAAA,+BAAe,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,wBAAwB;YAC3B,OAAO,iBAAiB,cAAc,CACpC,IAAI,CAAC,cAAc,EACnB,OAAO,EACP,aAAa,CACd,GAAG,CAAC;QACP;YACE,MAAM,IAAI,KAAK,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC;KAC3E;AACH,CAAC;AAtDD,wCAsDC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport type {\n NativeModuleBaseTypeAnnotation,\n Nullable,\n} from 'react-native-tscodegen';\nimport {\n AliasMap,\n getAliasCppName,\n getAnonymousAliasCppName,\n} from './AliasManaging';\n\nexport function translateField(\n type: Nullable<NativeModuleBaseTypeAnnotation>,\n aliases: AliasMap,\n baseAliasName: string,\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 'std::string';\n case 'NumberTypeAnnotation':\n case 'FloatTypeAnnotation':\n case 'DoubleTypeAnnotation':\n return 'double';\n case 'Int32TypeAnnotation':\n return 'int';\n case 'BooleanTypeAnnotation':\n return 'bool';\n case 'ArrayTypeAnnotation':\n if (type.elementType) {\n return `std::vector<${translateField(\n type.elementType,\n aliases,\n `${baseAliasName}_element`,\n )}>`;\n } else {\n return `::React::JSValueArray`;\n }\n case 'GenericObjectTypeAnnotation':\n return '::React::JSValue';\n case 'ObjectTypeAnnotation':\n return getAnonymousAliasCppName(aliases, baseAliasName, type);\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 'double';\n }\n case 'TypeAliasTypeAnnotation':\n return getAliasCppName(type.name);\n case 'NullableTypeAnnotation':\n return `std::optional<${translateField(\n type.typeAnnotation,\n aliases,\n baseAliasName,\n )}>`;\n default:\n throw new Error(`Unhandled type in translateReturnType: ${returnType}`);\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import type { NamedShape, NativeModuleParamTypeAnnotation, Nullable } from 'react-native-tscodegen';
|
|
7
|
+
import { AliasMap } from './AliasManaging';
|
|
8
|
+
declare type NativeModuleParamShape = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;
|
|
9
|
+
export declare function translateSpecArgs(params: ReadonlyArray<NativeModuleParamShape>, aliases: AliasMap, baseAliasName: string): string[];
|
|
10
|
+
export declare function translateArgs(params: ReadonlyArray<NativeModuleParamShape>, aliases: AliasMap, baseAliasName: string): string[];
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
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.translateArgs = exports.translateSpecArgs = void 0;
|
|
9
|
+
const AliasManaging_1 = require("./AliasManaging");
|
|
10
|
+
function decorateType(type, target) {
|
|
11
|
+
switch (target) {
|
|
12
|
+
case 'method-arg':
|
|
13
|
+
return `${type} &&`;
|
|
14
|
+
case 'callback-arg':
|
|
15
|
+
return `${type} const &`;
|
|
16
|
+
default:
|
|
17
|
+
return type;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function translateParam(param, aliases, baseAliasName, target) {
|
|
21
|
+
// avoid: Property 'type' does not exist on type 'never'
|
|
22
|
+
const paramType = param.type;
|
|
23
|
+
switch (param.type) {
|
|
24
|
+
case 'StringTypeAnnotation':
|
|
25
|
+
return 'std::string';
|
|
26
|
+
case 'NumberTypeAnnotation':
|
|
27
|
+
case 'FloatTypeAnnotation':
|
|
28
|
+
case 'DoubleTypeAnnotation':
|
|
29
|
+
return 'double';
|
|
30
|
+
case 'Int32TypeAnnotation':
|
|
31
|
+
return 'int';
|
|
32
|
+
case 'BooleanTypeAnnotation':
|
|
33
|
+
return 'bool';
|
|
34
|
+
case 'FunctionTypeAnnotation': {
|
|
35
|
+
// TODO: type.returnTypeAnnotation
|
|
36
|
+
switch (target) {
|
|
37
|
+
case 'spec':
|
|
38
|
+
return `Callback<${param.params
|
|
39
|
+
.map((p) => translateSpecFunctionParam(p, aliases, `${baseAliasName}_${p.name}`))
|
|
40
|
+
.join(', ')}>`;
|
|
41
|
+
case 'template':
|
|
42
|
+
return `std::function<void(${param.params
|
|
43
|
+
.map((p) => translateCallbackParam(p, aliases, `${baseAliasName}_${p.name}`))
|
|
44
|
+
.join(', ')})>`;
|
|
45
|
+
default:
|
|
46
|
+
return `std::function<void(${param.params
|
|
47
|
+
.map((p) => translateCallbackParam(p, aliases, `${baseAliasName}_${p.name}`))
|
|
48
|
+
.join(', ')})> const &`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
case 'ArrayTypeAnnotation':
|
|
52
|
+
if (param.elementType) {
|
|
53
|
+
switch (target) {
|
|
54
|
+
case 'spec':
|
|
55
|
+
case 'template':
|
|
56
|
+
return `std::vector<${translateNullableParamType(param.elementType, aliases, `${baseAliasName}_element`, 'template', 'template')}>`;
|
|
57
|
+
default:
|
|
58
|
+
return `std::vector<${translateNullableParamType(param.elementType, aliases, `${baseAliasName}_element`, 'template', 'template')}> const &`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
return decorateType('::React::JSValueArray', target);
|
|
63
|
+
}
|
|
64
|
+
case 'GenericObjectTypeAnnotation':
|
|
65
|
+
return decorateType('::React::JSValue', target);
|
|
66
|
+
case 'ObjectTypeAnnotation':
|
|
67
|
+
return decorateType((0, AliasManaging_1.getAnonymousAliasCppName)(aliases, baseAliasName, param), target);
|
|
68
|
+
case 'ReservedTypeAnnotation': {
|
|
69
|
+
// avoid: Property 'name' does not exist on type 'never'
|
|
70
|
+
const name = param.name;
|
|
71
|
+
// (#6597)
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
73
|
+
if (name !== 'RootTag')
|
|
74
|
+
throw new Error(`Unknown reserved function: ${name} in translateParam`);
|
|
75
|
+
return 'double';
|
|
76
|
+
}
|
|
77
|
+
case 'TypeAliasTypeAnnotation':
|
|
78
|
+
return decorateType((0, AliasManaging_1.getAliasCppName)(param.name), target);
|
|
79
|
+
default:
|
|
80
|
+
throw new Error(`Unhandled type in translateParam: ${paramType}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function translateNullableParamType(paramType, aliases, baseAliasName, nullableTarget, target) {
|
|
84
|
+
switch (paramType.type) {
|
|
85
|
+
case 'NullableTypeAnnotation':
|
|
86
|
+
return `std::optional<${translateParam(paramType.typeAnnotation, aliases, baseAliasName, nullableTarget)}>`;
|
|
87
|
+
default:
|
|
88
|
+
return translateParam(paramType, aliases, baseAliasName, target);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function translateSpecFunctionParam(param, aliases, baseAliasName) {
|
|
92
|
+
return translateNullableParamType(param.typeAnnotation, aliases, baseAliasName, 'spec', 'spec');
|
|
93
|
+
}
|
|
94
|
+
function translateCallbackParam(param, aliases, baseAliasName) {
|
|
95
|
+
return translateNullableParamType(param.typeAnnotation, aliases, baseAliasName, 'template', 'callback-arg');
|
|
96
|
+
}
|
|
97
|
+
function translateFunctionParam(param, aliases, baseAliasName) {
|
|
98
|
+
return translateNullableParamType(param.typeAnnotation, aliases, baseAliasName, 'template', 'method-arg');
|
|
99
|
+
}
|
|
100
|
+
function translateSpecArgs(params, aliases, baseAliasName) {
|
|
101
|
+
return params.map(param => {
|
|
102
|
+
const translatedParam = translateSpecFunctionParam(param, aliases, `${baseAliasName}_${param.name}`);
|
|
103
|
+
return `${translatedParam}`;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
exports.translateSpecArgs = translateSpecArgs;
|
|
107
|
+
function translateArgs(params, aliases, baseAliasName) {
|
|
108
|
+
return params.map(param => {
|
|
109
|
+
const translatedParam = translateFunctionParam(param, aliases, `${baseAliasName}_${param.name}`);
|
|
110
|
+
return `${translatedParam} ${param.name}`;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
exports.translateArgs = translateArgs;
|
|
114
|
+
//# sourceMappingURL=ParamTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParamTypes.js","sourceRoot":"","sources":["../../src/generators/ParamTypes.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 type {\n NamedShape,\n NativeModuleParamTypeAnnotation,\n Nullable,\n} from 'react-native-tscodegen';\nimport {\n AliasMap,\n getAliasCppName,\n getAnonymousAliasCppName,\n} from './AliasManaging';\n\ntype NativeModuleParamShape = NamedShape<\n Nullable<NativeModuleParamTypeAnnotation>\n>;\n\ntype ParamTarget = 'spec' | 'template' | 'callback-arg' | 'method-arg';\n\nfunction decorateType(type: string, target: ParamTarget): string {\n switch (target) {\n case 'method-arg':\n return `${type} &&`;\n case 'callback-arg':\n return `${type} const &`;\n default:\n return type;\n }\n}\n\nfunction translateParam(\n param: NativeModuleParamTypeAnnotation,\n aliases: AliasMap,\n baseAliasName: string,\n target: ParamTarget,\n): string {\n // avoid: Property 'type' does not exist on type 'never'\n const paramType = param.type;\n switch (param.type) {\n case 'StringTypeAnnotation':\n return 'std::string';\n case 'NumberTypeAnnotation':\n case 'FloatTypeAnnotation':\n case 'DoubleTypeAnnotation':\n return 'double';\n case 'Int32TypeAnnotation':\n return 'int';\n case 'BooleanTypeAnnotation':\n return 'bool';\n case 'FunctionTypeAnnotation': {\n // TODO: type.returnTypeAnnotation\n switch (target) {\n case 'spec':\n return `Callback<${param.params\n .map((p: NativeModuleParamShape) =>\n translateSpecFunctionParam(\n p,\n aliases,\n `${baseAliasName}_${p.name}`,\n ),\n )\n .join(', ')}>`;\n case 'template':\n return `std::function<void(${param.params\n .map((p: NativeModuleParamShape) =>\n translateCallbackParam(p, aliases, `${baseAliasName}_${p.name}`),\n )\n .join(', ')})>`;\n default:\n return `std::function<void(${param.params\n .map((p: NativeModuleParamShape) =>\n translateCallbackParam(p, aliases, `${baseAliasName}_${p.name}`),\n )\n .join(', ')})> const &`;\n }\n }\n case 'ArrayTypeAnnotation':\n if (param.elementType) {\n switch (target) {\n case 'spec':\n case 'template':\n return `std::vector<${translateNullableParamType(\n param.elementType,\n aliases,\n `${baseAliasName}_element`,\n 'template',\n 'template',\n )}>`;\n default:\n return `std::vector<${translateNullableParamType(\n param.elementType,\n aliases,\n `${baseAliasName}_element`,\n 'template',\n 'template',\n )}> const &`;\n }\n } else {\n return decorateType('::React::JSValueArray', target);\n }\n case 'GenericObjectTypeAnnotation':\n return decorateType('::React::JSValue', target);\n case 'ObjectTypeAnnotation':\n return decorateType(\n getAnonymousAliasCppName(aliases, baseAliasName, param),\n target,\n );\n case 'ReservedTypeAnnotation': {\n // avoid: Property 'name' does not exist on type 'never'\n const name = param.name;\n // (#6597)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (name !== 'RootTag')\n throw new Error(`Unknown reserved function: ${name} in translateParam`);\n return 'double';\n }\n case 'TypeAliasTypeAnnotation':\n return decorateType(getAliasCppName(param.name), target);\n default:\n throw new Error(`Unhandled type in translateParam: ${paramType}`);\n }\n}\n\nfunction translateNullableParamType(\n paramType: Nullable<NativeModuleParamTypeAnnotation>,\n aliases: AliasMap,\n baseAliasName: string,\n nullableTarget: ParamTarget,\n target: ParamTarget,\n): string {\n switch (paramType.type) {\n case 'NullableTypeAnnotation':\n return `std::optional<${translateParam(\n paramType.typeAnnotation,\n aliases,\n baseAliasName,\n nullableTarget,\n )}>`;\n default:\n return translateParam(paramType, aliases, baseAliasName, target);\n }\n}\n\nfunction translateSpecFunctionParam(\n param: NativeModuleParamShape,\n aliases: AliasMap,\n baseAliasName: string,\n): string {\n return translateNullableParamType(\n param.typeAnnotation,\n aliases,\n baseAliasName,\n 'spec',\n 'spec',\n );\n}\n\nfunction translateCallbackParam(\n param: NativeModuleParamShape,\n aliases: AliasMap,\n baseAliasName: string,\n): string {\n return translateNullableParamType(\n param.typeAnnotation,\n aliases,\n baseAliasName,\n 'template',\n 'callback-arg',\n );\n}\n\nfunction translateFunctionParam(\n param: NativeModuleParamShape,\n aliases: AliasMap,\n baseAliasName: string,\n): string {\n return translateNullableParamType(\n param.typeAnnotation,\n aliases,\n baseAliasName,\n 'template',\n 'method-arg',\n );\n}\n\nexport function translateSpecArgs(\n params: ReadonlyArray<NativeModuleParamShape>,\n aliases: AliasMap,\n baseAliasName: string,\n) {\n return params.map(param => {\n const translatedParam = translateSpecFunctionParam(\n param,\n aliases,\n `${baseAliasName}_${param.name}`,\n );\n return `${translatedParam}`;\n });\n}\n\nexport function translateArgs(\n params: ReadonlyArray<NativeModuleParamShape>,\n aliases: AliasMap,\n baseAliasName: string,\n) {\n return params.map(param => {\n const translatedParam = translateFunctionParam(\n param,\n aliases,\n `${baseAliasName}_${param.name}`,\n );\n return `${translatedParam} ${param.name}`;\n });\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import type { NativeModuleReturnTypeAnnotation, Nullable } from 'react-native-tscodegen';
|
|
7
|
+
import { AliasMap } from './AliasManaging';
|
|
8
|
+
export declare function translateSpecReturnType(type: Nullable<NativeModuleReturnTypeAnnotation>, aliases: AliasMap, baseAliasName: string): string;
|
|
9
|
+
export declare function translateImplReturnType(type: Nullable<NativeModuleReturnTypeAnnotation>, aliases: AliasMap, baseAliasName: string): string;
|
|
@@ -0,0 +1,63 @@
|
|
|
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.translateImplReturnType = exports.translateSpecReturnType = void 0;
|
|
9
|
+
const AliasManaging_1 = require("./AliasManaging");
|
|
10
|
+
function translateReturnType(type, aliases, baseAliasName) {
|
|
11
|
+
// avoid: Property 'type' does not exist on type 'never'
|
|
12
|
+
const returnType = type.type;
|
|
13
|
+
switch (type.type) {
|
|
14
|
+
case 'VoidTypeAnnotation':
|
|
15
|
+
case 'PromiseTypeAnnotation':
|
|
16
|
+
return 'void';
|
|
17
|
+
case 'StringTypeAnnotation':
|
|
18
|
+
return 'std::string';
|
|
19
|
+
case 'NumberTypeAnnotation':
|
|
20
|
+
case 'FloatTypeAnnotation':
|
|
21
|
+
case 'DoubleTypeAnnotation':
|
|
22
|
+
return 'double';
|
|
23
|
+
case 'Int32TypeAnnotation':
|
|
24
|
+
return 'int';
|
|
25
|
+
case 'BooleanTypeAnnotation':
|
|
26
|
+
return 'bool';
|
|
27
|
+
case 'ArrayTypeAnnotation':
|
|
28
|
+
if (type.elementType) {
|
|
29
|
+
return `std::vector<${translateReturnType(type.elementType, aliases, `${baseAliasName}_element`)}>`;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return '::React::JSValueArray';
|
|
33
|
+
}
|
|
34
|
+
case 'GenericObjectTypeAnnotation':
|
|
35
|
+
return '::React::JSValue';
|
|
36
|
+
case 'ObjectTypeAnnotation':
|
|
37
|
+
return (0, AliasManaging_1.getAnonymousAliasCppName)(aliases, baseAliasName, type);
|
|
38
|
+
case 'ReservedTypeAnnotation': {
|
|
39
|
+
// avoid: Property 'name' does not exist on type 'never'
|
|
40
|
+
const name = type.name;
|
|
41
|
+
// (#6597)
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
43
|
+
if (name !== 'RootTag')
|
|
44
|
+
throw new Error(`Unknown reserved function: ${name} in translateReturnType`);
|
|
45
|
+
return 'double';
|
|
46
|
+
}
|
|
47
|
+
case 'TypeAliasTypeAnnotation':
|
|
48
|
+
return (0, AliasManaging_1.getAliasCppName)(type.name);
|
|
49
|
+
case 'NullableTypeAnnotation':
|
|
50
|
+
return `std::optional<${translateReturnType(type.typeAnnotation, aliases, baseAliasName)}>`;
|
|
51
|
+
default:
|
|
52
|
+
throw new Error(`Unhandled type in translateReturnType: ${returnType}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function translateSpecReturnType(type, aliases, baseAliasName) {
|
|
56
|
+
return translateReturnType(type, aliases, `${baseAliasName}_returnType`);
|
|
57
|
+
}
|
|
58
|
+
exports.translateSpecReturnType = translateSpecReturnType;
|
|
59
|
+
function translateImplReturnType(type, aliases, baseAliasName) {
|
|
60
|
+
return translateReturnType(type, aliases, `${baseAliasName}_returnType`);
|
|
61
|
+
}
|
|
62
|
+
exports.translateImplReturnType = translateImplReturnType;
|
|
63
|
+
//# sourceMappingURL=ReturnTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReturnTypes.js","sourceRoot":"","sources":["../../src/generators/ReturnTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;;;AAMb,mDAIyB;AAEzB,SAAS,mBAAmB,CAC1B,IAAgD,EAChD,OAAiB,EACjB,aAAqB;IAErB,wDAAwD;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;IAC7B,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,uBAAuB;YAC1B,OAAO,MAAM,CAAC;QAChB,KAAK,sBAAsB;YACzB,OAAO,aAAa,CAAC;QACvB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,qBAAqB,CAAC;QAC3B,KAAK,sBAAsB;YACzB,OAAO,QAAQ,CAAC;QAClB,KAAK,qBAAqB;YACxB,OAAO,KAAK,CAAC;QACf,KAAK,uBAAuB;YAC1B,OAAO,MAAM,CAAC;QAChB,KAAK,qBAAqB;YACxB,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,OAAO,eAAe,mBAAmB,CACvC,IAAI,CAAC,WAAW,EAChB,OAAO,EACP,GAAG,aAAa,UAAU,CAC3B,GAAG,CAAC;aACN;iBAAM;gBACL,OAAO,uBAAuB,CAAC;aAChC;QACH,KAAK,6BAA6B;YAChC,OAAO,kBAAkB,CAAC;QAC5B,KAAK,sBAAsB;YACzB,OAAO,IAAA,wCAAwB,EAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QAChE,KAAK,wBAAwB,CAAC,CAAC;YAC7B,wDAAwD;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,UAAU;YACV,uEAAuE;YACvE,IAAI,IAAI,KAAK,SAAS;gBACpB,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,yBAAyB,CAC5D,CAAC;YACJ,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,yBAAyB;YAC5B,OAAO,IAAA,+BAAe,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,wBAAwB;YAC3B,OAAO,iBAAiB,mBAAmB,CACzC,IAAI,CAAC,cAAc,EACnB,OAAO,EACP,aAAa,CACd,GAAG,CAAC;QACP;YACE,MAAM,IAAI,KAAK,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC;KAC3E;AACH,CAAC;AAED,SAAgB,uBAAuB,CACrC,IAAgD,EAChD,OAAiB,EACjB,aAAqB;IAErB,OAAO,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,aAAa,CAAC,CAAC;AAC3E,CAAC;AAND,0DAMC;AAED,SAAgB,uBAAuB,CACrC,IAAgD,EAChD,OAAiB,EACjB,aAAqB;IAErB,OAAO,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,aAAa,CAAC,CAAC;AAC3E,CAAC;AAND,0DAMC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport type {\n NativeModuleReturnTypeAnnotation,\n Nullable,\n} from 'react-native-tscodegen';\nimport {\n AliasMap,\n getAliasCppName,\n getAnonymousAliasCppName,\n} from './AliasManaging';\n\nfunction translateReturnType(\n type: Nullable<NativeModuleReturnTypeAnnotation>,\n aliases: AliasMap,\n baseAliasName: string,\n): string {\n // avoid: Property 'type' does not exist on type 'never'\n const returnType = type.type;\n switch (type.type) {\n case 'VoidTypeAnnotation':\n case 'PromiseTypeAnnotation':\n return 'void';\n case 'StringTypeAnnotation':\n return 'std::string';\n case 'NumberTypeAnnotation':\n case 'FloatTypeAnnotation':\n case 'DoubleTypeAnnotation':\n return 'double';\n case 'Int32TypeAnnotation':\n return 'int';\n case 'BooleanTypeAnnotation':\n return 'bool';\n case 'ArrayTypeAnnotation':\n if (type.elementType) {\n return `std::vector<${translateReturnType(\n type.elementType,\n aliases,\n `${baseAliasName}_element`,\n )}>`;\n } else {\n return '::React::JSValueArray';\n }\n case 'GenericObjectTypeAnnotation':\n return '::React::JSValue';\n case 'ObjectTypeAnnotation':\n return getAnonymousAliasCppName(aliases, baseAliasName, type);\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 'double';\n }\n case 'TypeAliasTypeAnnotation':\n return getAliasCppName(type.name);\n case 'NullableTypeAnnotation':\n return `std::optional<${translateReturnType(\n type.typeAnnotation,\n aliases,\n baseAliasName,\n )}>`;\n default:\n throw new Error(`Unhandled type in translateReturnType: ${returnType}`);\n }\n}\n\nexport function translateSpecReturnType(\n type: Nullable<NativeModuleReturnTypeAnnotation>,\n aliases: AliasMap,\n baseAliasName: string,\n) {\n return translateReturnType(type, aliases, `${baseAliasName}_returnType`);\n}\n\nexport function translateImplReturnType(\n type: Nullable<NativeModuleReturnTypeAnnotation>,\n aliases: AliasMap,\n baseAliasName: string,\n) {\n return translateReturnType(type, aliases, `${baseAliasName}_returnType`);\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import type { NativeModuleSchema } from 'react-native-tscodegen';
|
|
7
|
+
import { AliasMap } from './AliasManaging';
|
|
8
|
+
export declare function generateValidateConstants(nativeModule: NativeModuleSchema, aliases: AliasMap): [string, string] | undefined;
|