@react-native-windows/codegen 0.66.0-preview.1 → 0.67.0
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.json +193 -5
- package/CHANGELOG.md +94 -5
- package/lib-commonjs/Cli.d.ts +7 -0
- package/lib-commonjs/Cli.js +203 -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 +11 -0
- package/lib-commonjs/generators/GenerateNM2.js +94 -0
- package/lib-commonjs/generators/GenerateNM2.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/package.json +21 -11
- package/src/Cli.ts +23 -17
- package/src/generators/AliasGen.ts +105 -0
- package/src/generators/AliasManaging.ts +75 -0
- package/src/generators/GenerateNM2.ts +38 -122
- package/src/generators/ObjectTypes.ts +24 -39
- package/src/generators/ParamTypes.ts +144 -39
- package/src/generators/ReturnTypes.ts +29 -10
- package/src/generators/ValidateConstants.ts +50 -0
- package/src/generators/ValidateMethods.ts +135 -0
- package/.eslintrc.js +0 -4
- package/.vscode/launch.json +0 -23
- package/jest.config.js +0 -1
- package/tsconfig.json +0 -5
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import { NativeModuleObjectTypeAnnotation } from 'react-native-tscodegen';
|
|
7
|
+
export declare function setPreferredModuleName(moduleName: string): void;
|
|
8
|
+
export declare function getAliasCppName(typeName: string): string;
|
|
9
|
+
export interface AliasMap {
|
|
10
|
+
types: {
|
|
11
|
+
[name: string]: NativeModuleObjectTypeAnnotation | undefined;
|
|
12
|
+
};
|
|
13
|
+
jobs: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function getAnonymousAliasCppName(aliases: AliasMap, baseAliasName: string, objectType: NativeModuleObjectTypeAnnotation): string;
|
|
@@ -0,0 +1,49 @@
|
|
|
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.getAnonymousAliasCppName = exports.getAliasCppName = exports.setPreferredModuleName = void 0;
|
|
9
|
+
let preferredModuleName = '';
|
|
10
|
+
function setPreferredModuleName(moduleName) {
|
|
11
|
+
preferredModuleName = moduleName;
|
|
12
|
+
}
|
|
13
|
+
exports.setPreferredModuleName = setPreferredModuleName;
|
|
14
|
+
function getAliasCppName(typeName) {
|
|
15
|
+
return `${preferredModuleName}Spec_${typeName}`;
|
|
16
|
+
}
|
|
17
|
+
exports.getAliasCppName = getAliasCppName;
|
|
18
|
+
const ExtendedObjectKey = '$RNW-TURBOMODULE-ALIAS';
|
|
19
|
+
function recordAnonymouseAlias(aliases, baseAliasName, extended) {
|
|
20
|
+
extended[ExtendedObjectKey] = baseAliasName;
|
|
21
|
+
aliases.types[baseAliasName] = extended;
|
|
22
|
+
aliases.jobs.push(baseAliasName);
|
|
23
|
+
return baseAliasName;
|
|
24
|
+
}
|
|
25
|
+
function getAnonymousAliasCppName(aliases, baseAliasName, objectType) {
|
|
26
|
+
// someone found an anonymous object literal type
|
|
27
|
+
// if the ExtendedObjectKey flag has been set
|
|
28
|
+
// then it is a known one
|
|
29
|
+
// this happens because method signatures are generate twice in spec and error messages
|
|
30
|
+
const extended = objectType;
|
|
31
|
+
const key = extended[ExtendedObjectKey];
|
|
32
|
+
if (key !== undefined) {
|
|
33
|
+
return getAliasCppName(key);
|
|
34
|
+
}
|
|
35
|
+
// if the ExtendedObjectKey flag has not been set
|
|
36
|
+
// it means it is a unknown one
|
|
37
|
+
// associate the name with this object literal type and return
|
|
38
|
+
if (aliases.types[baseAliasName] === undefined) {
|
|
39
|
+
return getAliasCppName(recordAnonymouseAlias(aliases, baseAliasName, extended));
|
|
40
|
+
}
|
|
41
|
+
// sometimes names could be anonymous
|
|
42
|
+
let index = 2;
|
|
43
|
+
while (aliases.types[`${baseAliasName}${index}`] !== undefined) {
|
|
44
|
+
index++;
|
|
45
|
+
}
|
|
46
|
+
return getAliasCppName(recordAnonymouseAlias(aliases, `${baseAliasName}${index}`, extended));
|
|
47
|
+
}
|
|
48
|
+
exports.getAnonymousAliasCppName = getAnonymousAliasCppName;
|
|
49
|
+
//# sourceMappingURL=AliasManaging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AliasManaging.js","sourceRoot":"","sources":["../../src/generators/AliasManaging.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;;;AAIb,IAAI,mBAAmB,GAAW,EAAE,CAAC;AAErC,SAAgB,sBAAsB,CAAC,UAAkB;IACvD,mBAAmB,GAAG,UAAU,CAAC;AACnC,CAAC;AAFD,wDAEC;AAED,SAAgB,eAAe,CAAC,QAAgB;IAC9C,OAAO,GAAG,mBAAmB,QAAQ,QAAQ,EAAE,CAAC;AAClD,CAAC;AAFD,0CAEC;AAOD,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAKnD,SAAS,qBAAqB,CAC5B,OAAiB,EACjB,aAAqB,EACrB,QAAwB;IAExB,QAAQ,CAAC,iBAAiB,CAAC,GAAG,aAAa,CAAC;IAC5C,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAgB,wBAAwB,CACtC,OAAiB,EACjB,aAAqB,EACrB,UAA4C;IAE5C,iDAAiD;IACjD,6CAA6C;IAC7C,yBAAyB;IACzB,uFAAuF;IACvF,MAAM,QAAQ,GAAmB,UAAU,CAAC;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,EAAE;QACrB,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;KAC7B;IAED,iDAAiD;IACjD,+BAA+B;IAC/B,8DAA8D;IAC9D,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,SAAS,EAAE;QAC9C,OAAO,eAAe,CACpB,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CACxD,CAAC;KACH;IAED,qCAAqC;IACrC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,aAAa,GAAG,KAAK,EAAE,CAAC,KAAK,SAAS,EAAE;QAC9D,KAAK,EAAE,CAAC;KACT;IAED,OAAO,eAAe,CACpB,qBAAqB,CAAC,OAAO,EAAE,GAAG,aAAa,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,CACrE,CAAC;AACJ,CAAC;AAjCD,4DAiCC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport {NativeModuleObjectTypeAnnotation} from 'react-native-tscodegen';\n\nlet preferredModuleName: string = '';\n\nexport function setPreferredModuleName(moduleName: string): void {\n preferredModuleName = moduleName;\n}\n\nexport function getAliasCppName(typeName: string): string {\n return `${preferredModuleName}Spec_${typeName}`;\n}\n\nexport interface AliasMap {\n types: {[name: string]: NativeModuleObjectTypeAnnotation | undefined};\n jobs: string[];\n}\n\nconst ExtendedObjectKey = '$RNW-TURBOMODULE-ALIAS';\ninterface ExtendedObject extends NativeModuleObjectTypeAnnotation {\n '$RNW-TURBOMODULE-ALIAS'?: string;\n}\n\nfunction recordAnonymouseAlias(\n aliases: AliasMap,\n baseAliasName: string,\n extended: ExtendedObject,\n): string {\n extended[ExtendedObjectKey] = baseAliasName;\n aliases.types[baseAliasName] = extended;\n aliases.jobs.push(baseAliasName);\n return baseAliasName;\n}\n\nexport function getAnonymousAliasCppName(\n aliases: AliasMap,\n baseAliasName: string,\n objectType: NativeModuleObjectTypeAnnotation,\n): string {\n // someone found an anonymous object literal type\n // if the ExtendedObjectKey flag has been set\n // then it is a known one\n // this happens because method signatures are generate twice in spec and error messages\n const extended = <ExtendedObject>objectType;\n const key = extended[ExtendedObjectKey];\n if (key !== undefined) {\n return getAliasCppName(key);\n }\n\n // if the ExtendedObjectKey flag has not been set\n // it means it is a unknown one\n // associate the name with this object literal type and return\n if (aliases.types[baseAliasName] === undefined) {\n return getAliasCppName(\n recordAnonymouseAlias(aliases, baseAliasName, extended),\n );\n }\n\n // sometimes names could be anonymous\n let index = 2;\n while (aliases.types[`${baseAliasName}${index}`] !== undefined) {\n index++;\n }\n\n return getAliasCppName(\n recordAnonymouseAlias(aliases, `${baseAliasName}${index}`, extended),\n );\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
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 createNM2Generator({ namespace }: {
|
|
9
|
+
namespace: string;
|
|
10
|
+
}): (_libraryName: string, schema: SchemaType, _moduleSpecName: string) => FilesOutput;
|
|
11
|
+
export {};
|
|
@@ -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 }) {
|
|
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) {
|
|
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.substr(1))
|
|
84
|
+
.replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substr(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,EAAC,SAAS,EAAsB;IACjE,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,EAAE;oBAC3B,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,MAAM,CAAC,CAAC,CAAC,CAAC;qBACzD,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;qBACzD,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;AAlED,gDAkEC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport {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({namespace}: {namespace: string}) {\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) {\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.substr(1))\n .replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substr(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,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import { 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;;;AAGb,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,qBAAqB,CAAC;aAC9B;QACH,KAAK,6BAA6B;YAChC,OAAO,gBAAgB,CAAC;QAC1B,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 {NativeModuleBaseTypeAnnotation, Nullable} 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 { 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 {\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 { 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,qBAAqB,CAAC;aAC9B;QACH,KAAK,6BAA6B;YAChC,OAAO,gBAAgB,CAAC;QAC1B,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 {\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 { NativeModuleSchema } from 'react-native-tscodegen';
|
|
7
|
+
import { AliasMap } from './AliasManaging';
|
|
8
|
+
export declare function generateValidateConstants(nativeModule: NativeModuleSchema, aliases: AliasMap): [string, string] | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
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.generateValidateConstants = void 0;
|
|
9
|
+
const AliasManaging_1 = require("./AliasManaging");
|
|
10
|
+
function generateValidateConstants(nativeModule, aliases) {
|
|
11
|
+
const candidates = nativeModule.spec.properties.filter(prop => prop.name === 'getConstants');
|
|
12
|
+
if (candidates.length === 0) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const getConstant = candidates[0];
|
|
16
|
+
const funcType = getConstant.typeAnnotation.type === 'NullableTypeAnnotation'
|
|
17
|
+
? getConstant.typeAnnotation.typeAnnotation
|
|
18
|
+
: getConstant.typeAnnotation;
|
|
19
|
+
if (funcType.params.length > 0 ||
|
|
20
|
+
funcType.returnTypeAnnotation.type !== 'ObjectTypeAnnotation') {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const constantType = funcType.returnTypeAnnotation;
|
|
24
|
+
if (constantType.properties.length === 0) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const cppName = (0, AliasManaging_1.getAnonymousAliasCppName)(aliases, 'Constants', constantType);
|
|
28
|
+
return [
|
|
29
|
+
` TypedConstant<${cppName}>{0},`,
|
|
30
|
+
` REACT_SHOW_CONSTANT_SPEC_ERRORS(
|
|
31
|
+
0,
|
|
32
|
+
"${cppName}",
|
|
33
|
+
" REACT_GET_CONSTANTS(GetConstants) ${cppName} GetConstants() noexcept {/*implementation*/}\\n"
|
|
34
|
+
" REACT_GET_CONSTANTS(GetConstants) static ${cppName} GetConstants() noexcept {/*implementation*/}\\n");`,
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
exports.generateValidateConstants = generateValidateConstants;
|
|
38
|
+
//# sourceMappingURL=ValidateConstants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidateConstants.js","sourceRoot":"","sources":["../../src/generators/ValidateConstants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;;;AAGb,mDAAmE;AAEnE,SAAgB,yBAAyB,CACvC,YAAgC,EAChC,OAAiB;IAEjB,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CACpD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CACrC,CAAC;IACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,QAAQ,GACZ,WAAW,CAAC,cAAc,CAAC,IAAI,KAAK,wBAAwB;QAC1D,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,cAAc;QAC3C,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC;IACjC,IACE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAC1B,QAAQ,CAAC,oBAAoB,CAAC,IAAI,KAAK,sBAAsB,EAC7D;QACA,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,oBAAoB,CAAC;IACnD,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QACxC,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,OAAO,GAAG,IAAA,wCAAwB,EAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAE7E,OAAO;QACL,uBAAuB,OAAO,OAAO;QACrC;;aAES,OAAO;mDAC+B,OAAO;0DACA,OAAO,qDAAqD;KACnH,CAAC;AACJ,CAAC;AAtCD,8DAsCC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\n'use strict';\n\nimport {NativeModuleSchema} from 'react-native-tscodegen';\nimport {AliasMap, getAnonymousAliasCppName} from './AliasManaging';\n\nexport function generateValidateConstants(\n nativeModule: NativeModuleSchema,\n aliases: AliasMap,\n): [string, string] | 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 const cppName = getAnonymousAliasCppName(aliases, 'Constants', constantType);\n\n return [\n ` TypedConstant<${cppName}>{0},`,\n ` REACT_SHOW_CONSTANT_SPEC_ERRORS(\n 0,\n \"${cppName}\",\n \" REACT_GET_CONSTANTS(GetConstants) ${cppName} GetConstants() noexcept {/*implementation*/}\\\\n\"\n \" REACT_GET_CONSTANTS(GetConstants) static ${cppName} GetConstants() noexcept {/*implementation*/}\\\\n\");`,\n ];\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
* @format
|
|
5
|
+
*/
|
|
6
|
+
import { NativeModuleSchema } from 'react-native-tscodegen';
|
|
7
|
+
import { AliasMap } from './AliasManaging';
|
|
8
|
+
export declare function generateValidateMethods(nativeModule: NativeModuleSchema, aliases: AliasMap): [string, string];
|