@react-native-windows/codegen 0.0.0-canary.65 → 0.0.0-canary.67

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 CHANGED
@@ -1,18 +1,35 @@
1
1
  # Change Log - @react-native-windows/codegen
2
2
 
3
- This log was last generated on Wed, 26 Jul 2023 05:12:58 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 08 Aug 2023 05:12:09 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## 0.0.0-canary.65
7
+ ## 0.0.0-canary.67
8
8
 
9
- Wed, 26 Jul 2023 05:12:58 GMT
9
+ Tue, 08 Aug 2023 05:12:09 GMT
10
10
 
11
11
  ### Changes
12
12
 
13
- - Bump @react-native-windows/fs to v0.0.0-canary.26
14
- - Bump @rnw-scripts/just-task to v2.3.14
13
+ - @rnw/codegen generates GetStructInfo instead of REACT_STRUCT (53799235+ZihanChen-MSFT@users.noreply.github.com)
15
14
 
15
+ ## 0.0.0-canary.66
16
+
17
+ Fri, 28 Jul 2023 05:14:53 GMT
18
+
19
+ ### Changes
20
+
21
+ - Bump @react-native-windows/fs to v0.0.0-canary.27
22
+ - Bump @rnw-scripts/just-task to v2.3.15
23
+
24
+ ## 0.0.0-canary.65
25
+
26
+ Wed, 26 Jul 2023 05:15:47 GMT
27
+
28
+ ### Changes
29
+
30
+ - Bump @react-native-windows/fs to v0.0.0-canary.26
31
+ - Bump @rnw-scripts/just-task to v2.3.14
32
+
16
33
  ## 0.0.0-canary.64
17
34
 
18
35
  Fri, 14 Jul 2023 05:17:05 GMT
@@ -9,4 +9,4 @@ import { CppCodegenOptions } from './ObjectTypes';
9
9
  export declare function createAliasMap(nativeModuleAliases: {
10
10
  [name: string]: NativeModuleObjectTypeAnnotation;
11
11
  }): AliasMap;
12
- export declare function generateAliases(aliases: AliasMap, options: CppCodegenOptions): string;
12
+ export declare function generateAliases(aliases: AliasMap, options: CppCodegenOptions): [string, string];
@@ -8,16 +8,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.generateAliases = exports.createAliasMap = void 0;
9
9
  const AliasManaging_1 = require("./AliasManaging");
10
10
  const ObjectTypes_1 = require("./ObjectTypes");
11
- function translateObjectBody(type, aliases, baseAliasName, prefix, options) {
11
+ function translateObjectMembersDefinition(type, aliases, baseAliasName, prefix, options) {
12
12
  return type.properties
13
13
  .map((prop) => {
14
14
  let propType = prop.typeAnnotation;
15
15
  if (prop.optional && propType.type !== 'NullableTypeAnnotation') {
16
16
  propType = { type: 'NullableTypeAnnotation', typeAnnotation: propType };
17
17
  }
18
- const first = `${prefix}REACT_FIELD(${prop.name})`;
19
- const second = `${prefix}${(0, ObjectTypes_1.translateField)(propType, aliases, `${baseAliasName}_${prop.name}`, options)} ${prop.name};`;
20
- return `${first}\n${second}`;
18
+ return `${prefix}${(0, ObjectTypes_1.translateField)(propType, aliases, `${baseAliasName}_${prop.name}`, options)} ${prop.name};`;
19
+ })
20
+ .join('\n');
21
+ }
22
+ function translateObjectMembersReflection(type, aliasCppName, prefix) {
23
+ return type.properties
24
+ .map((prop) => {
25
+ return `${prefix}{L"${prop.name}", &${aliasCppName}::${prop.name}},`;
21
26
  })
22
27
  .join('\n');
23
28
  }
@@ -30,13 +35,22 @@ function createAliasMap(nativeModuleAliases) {
30
35
  }
31
36
  exports.createAliasMap = createAliasMap;
32
37
  function generateSingleAlias(aliases, aliasName, aliasCode, options) {
38
+ const aliasCppName = (0, AliasManaging_1.getAliasCppName)(aliasName);
33
39
  const aliasType = aliases.types[aliasName];
34
- aliasCode[aliasName] = `
35
- REACT_STRUCT(${(0, AliasManaging_1.getAliasCppName)(aliasName)})
36
- struct ${(0, AliasManaging_1.getAliasCppName)(aliasName)} {
37
- ${translateObjectBody(aliasType, aliases, aliasName, ' ', options)}
40
+ const definition = `
41
+ struct ${aliasCppName} {
42
+ ${translateObjectMembersDefinition(aliasType, aliases, aliasName, ' ', options)}
38
43
  };
39
44
  `;
45
+ const reflection = `
46
+ inline winrt::Microsoft::ReactNative::FieldMap GetStructInfo(${aliasCppName}*) noexcept {
47
+ winrt::Microsoft::ReactNative::FieldMap fieldMap {
48
+ ${translateObjectMembersReflection(aliasType, aliasCppName, ' ')}
49
+ };
50
+ return fieldMap;
51
+ }
52
+ `;
53
+ aliasCode[aliasName] = { definition, reflection };
40
54
  }
41
55
  function generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options) {
42
56
  // retrieve and clean all ungenerated aliases
@@ -62,11 +76,13 @@ function generateAliases(aliases, options) {
62
76
  const aliasOrder = [];
63
77
  generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options);
64
78
  // aliasOrder now has the correct order of C++ struct code
65
- let traversedAliasedStructs = '';
79
+ let customTypes = '';
80
+ let customReflection = '';
66
81
  for (const aliasName of aliasOrder) {
67
- traversedAliasedStructs = `${traversedAliasedStructs}${aliasCode[aliasName]}`;
82
+ customTypes = `${customTypes}${aliasCode[aliasName].definition}`;
83
+ customReflection = `${customReflection}${aliasCode[aliasName].reflection}`;
68
84
  }
69
- return traversedAliasedStructs;
85
+ return [customTypes, customReflection];
70
86
  }
71
87
  exports.generateAliases = generateAliases;
72
88
  //# sourceMappingURL=AliasGen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AliasGen.js","sourceRoot":"","sources":["../../src/generators/AliasGen.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 NativeModuleBaseTypeAnnotation,\n NativeModuleObjectTypeAnnotation,\n NamedShape,\n Nullable,\n} from '@react-native/codegen/lib/CodegenSchema';\nimport {AliasMap, getAliasCppName} from './AliasManaging';\nimport {CppCodegenOptions, translateField} from './ObjectTypes';\n\nfunction translateObjectBody(\n type: NativeModuleObjectTypeAnnotation,\n aliases: AliasMap,\n baseAliasName: string,\n prefix: string,\n options: CppCodegenOptions,\n) {\n return type.properties\n .map((prop: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>) => {\n let propType = prop.typeAnnotation;\n if (prop.optional && propType.type !== 'NullableTypeAnnotation') {\n propType = {type: 'NullableTypeAnnotation', typeAnnotation: propType};\n }\n const first = `${prefix}REACT_FIELD(${prop.name})`;\n const second = `${prefix}${translateField(\n propType,\n aliases,\n `${baseAliasName}_${prop.name}`,\n options,\n )} ${prop.name};`;\n return `${first}\\n${second}`;\n })\n .join('\\n');\n}\n\nexport function createAliasMap(nativeModuleAliases: {\n [name: string]: NativeModuleObjectTypeAnnotation;\n}): AliasMap {\n const aliases: AliasMap = {types: {}, jobs: Object.keys(nativeModuleAliases)};\n for (const aliasName of aliases.jobs) {\n aliases.types[aliasName] = nativeModuleAliases[aliasName];\n }\n return aliases;\n}\n\ninterface AliasCodeMap {\n [name: string]: string;\n}\n\nfunction generateSingleAlias(\n aliases: AliasMap,\n aliasName: string,\n aliasCode: AliasCodeMap,\n options: CppCodegenOptions,\n): void {\n const aliasType = <NativeModuleObjectTypeAnnotation>aliases.types[aliasName];\n aliasCode[aliasName] = `\nREACT_STRUCT(${getAliasCppName(aliasName)})\nstruct ${getAliasCppName(aliasName)} {\n${translateObjectBody(aliasType, aliases, aliasName, ' ', options)}\n};\n`;\n}\n\nfunction generateNestedAliasesInCorrectOrder(\n aliases: AliasMap,\n aliasCode: AliasCodeMap,\n aliasOrder: string[],\n options: CppCodegenOptions,\n): void {\n // retrieve and clean all ungenerated aliases\n const jobs = aliases.jobs;\n aliases.jobs = [];\n\n // generate each one in its found order\n for (const aliasName of jobs) {\n // generate a new struct and all fields will be examined\n // new anonymous objects could be found\n // they will be stored in aliases.jobs\n generateSingleAlias(aliases, aliasName, aliasCode, options);\n // nested C++ structs must be put before the current C++ struct\n // as they will be used in the current C++ struct\n // the order will be perfectly and easily ensured by doing this recursively\n generateNestedAliasesInCorrectOrder(\n aliases,\n aliasCode,\n aliasOrder,\n options,\n );\n // all referenced C++ structs are generated\n // put the current one following them\n aliasOrder.push(aliasName);\n }\n}\n\nexport function generateAliases(\n aliases: AliasMap,\n options: CppCodegenOptions,\n): string {\n const aliasCode: AliasCodeMap = {};\n const aliasOrder: string[] = [];\n generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options);\n\n // aliasOrder now has the correct order of C++ struct code\n let traversedAliasedStructs = '';\n for (const aliasName of aliasOrder) {\n traversedAliasedStructs = `${traversedAliasedStructs}${aliasCode[aliasName]}`;\n }\n return traversedAliasedStructs;\n}\n"]}
1
+ {"version":3,"file":"AliasGen.js","sourceRoot":"","sources":["../../src/generators/AliasGen.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 NativeModuleBaseTypeAnnotation,\n NativeModuleObjectTypeAnnotation,\n NamedShape,\n Nullable,\n} from '@react-native/codegen/lib/CodegenSchema';\nimport {AliasMap, getAliasCppName} from './AliasManaging';\nimport {CppCodegenOptions, translateField} from './ObjectTypes';\n\nfunction translateObjectMembersDefinition(\n type: NativeModuleObjectTypeAnnotation,\n aliases: AliasMap,\n baseAliasName: string,\n prefix: string,\n options: CppCodegenOptions,\n) {\n return type.properties\n .map((prop: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>) => {\n let propType = prop.typeAnnotation;\n if (prop.optional && propType.type !== 'NullableTypeAnnotation') {\n propType = {type: 'NullableTypeAnnotation', typeAnnotation: propType};\n }\n return `${prefix}${translateField(\n propType,\n aliases,\n `${baseAliasName}_${prop.name}`,\n options,\n )} ${prop.name};`;\n })\n .join('\\n');\n}\n\nfunction translateObjectMembersReflection(\n type: NativeModuleObjectTypeAnnotation,\n aliasCppName: string,\n prefix: string,\n) {\n return type.properties\n .map((prop: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>) => {\n return `${prefix}{L\"${prop.name}\", &${aliasCppName}::${prop.name}},`;\n })\n .join('\\n');\n}\n\nexport function createAliasMap(nativeModuleAliases: {\n [name: string]: NativeModuleObjectTypeAnnotation;\n}): AliasMap {\n const aliases: AliasMap = {types: {}, jobs: Object.keys(nativeModuleAliases)};\n for (const aliasName of aliases.jobs) {\n aliases.types[aliasName] = nativeModuleAliases[aliasName];\n }\n return aliases;\n}\n\ninterface AliasCode {\n definition: string;\n reflection: string;\n}\n\ninterface AliasCodeMap {\n [name: string]: AliasCode;\n}\n\nfunction generateSingleAlias(\n aliases: AliasMap,\n aliasName: string,\n aliasCode: AliasCodeMap,\n options: CppCodegenOptions,\n): void {\n const aliasCppName = getAliasCppName(aliasName);\n const aliasType = <NativeModuleObjectTypeAnnotation>aliases.types[aliasName];\n const definition = `\nstruct ${aliasCppName} {\n${translateObjectMembersDefinition(\n aliasType,\n aliases,\n aliasName,\n ' ',\n options,\n)}\n};\n`;\n const reflection = `\ninline winrt::Microsoft::ReactNative::FieldMap GetStructInfo(${aliasCppName}*) noexcept {\n winrt::Microsoft::ReactNative::FieldMap fieldMap {\n${translateObjectMembersReflection(aliasType, aliasCppName, ' ')}\n };\n return fieldMap;\n}\n`;\n aliasCode[aliasName] = {definition, reflection};\n}\n\nfunction generateNestedAliasesInCorrectOrder(\n aliases: AliasMap,\n aliasCode: AliasCodeMap,\n aliasOrder: string[],\n options: CppCodegenOptions,\n): void {\n // retrieve and clean all ungenerated aliases\n const jobs = aliases.jobs;\n aliases.jobs = [];\n\n // generate each one in its found order\n for (const aliasName of jobs) {\n // generate a new struct and all fields will be examined\n // new anonymous objects could be found\n // they will be stored in aliases.jobs\n generateSingleAlias(aliases, aliasName, aliasCode, options);\n // nested C++ structs must be put before the current C++ struct\n // as they will be used in the current C++ struct\n // the order will be perfectly and easily ensured by doing this recursively\n generateNestedAliasesInCorrectOrder(\n aliases,\n aliasCode,\n aliasOrder,\n options,\n );\n // all referenced C++ structs are generated\n // put the current one following them\n aliasOrder.push(aliasName);\n }\n}\n\nexport function generateAliases(\n aliases: AliasMap,\n options: CppCodegenOptions,\n): [string, string] {\n const aliasCode: AliasCodeMap = {};\n const aliasOrder: string[] = [];\n generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options);\n\n // aliasOrder now has the correct order of C++ struct code\n let customTypes = '';\n let customReflection = '';\n for (const aliasName of aliasOrder) {\n customTypes = `${customTypes}${aliasCode[aliasName].definition}`;\n customReflection = `${customReflection}${aliasCode[aliasName].reflection}`;\n }\n return [customTypes, customReflection];\n}\n"]}
@@ -20,11 +20,12 @@ const moduleTemplate = `
20
20
  */
21
21
  #pragma once
22
22
 
23
- #include "NativeModules.h"
23
+ #include <NativeModules.h>
24
24
  #include <tuple>
25
25
 
26
26
  namespace ::_NAMESPACE_:: {
27
- ::_MODULE_ALIASED_STRUCTS_::
27
+ ::_MODULE_CUSTPM_TYPES_::
28
+ ::_MODULE_CUSTPM_TYPES_REFLECTION_::
28
29
  struct ::_MODULE_NAME_::Spec : winrt::Microsoft::ReactNative::TurboModuleSpec {
29
30
  ::_MODULE_MEMBERS_TUPLES_::
30
31
 
@@ -79,11 +80,12 @@ ${constants[0]}
79
80
  ${errors}`;
80
81
  }
81
82
  // generate code for structs
82
- const traversedAliasedStructs = (0, AliasGen_1.generateAliases)(aliases, {
83
+ const [customTypes, customReflection] = (0, AliasGen_1.generateAliases)(aliases, {
83
84
  cppStringType,
84
85
  });
85
86
  files.set(`Native${preferredModuleName}Spec.g.h`, moduleTemplate
86
- .replace(/::_MODULE_ALIASED_STRUCTS_::/g, traversedAliasedStructs)
87
+ .replace(/::_MODULE_CUSTPM_TYPES_::/g, customTypes)
88
+ .replace(/::_MODULE_CUSTPM_TYPES_REFLECTION_::/g, customReflection)
87
89
  .replace(/::_MODULE_MEMBERS_TUPLES_::/g, tuples.substring(1))
88
90
  .replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substring(1))
89
91
  .replace(/::_MODULE_MEMBERS_ERRORS_::/g, errors)
@@ -1 +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;AAO1D,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BtB,CAAC;AAEF,SAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,SAAS,EACT,aAAa,GAKd;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,QAAQ,CAAC,CAAC;gBAEhE,kBAAkB;gBAClB,MAAM,OAAO,GAAG,IAAA,yCAAuB,EAAC,YAAY,EAAE,OAAO,EAAE;oBAC7D,aAAa;iBACd,CAAC,CAAC;gBACH,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,EAAE;oBACvD,aAAa;iBACd,CAAC,CAAC;gBAEH,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;AA9ED,gDA8EC","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/codegen/lib/CodegenSchema';\nimport {AliasMap, setPreferredModuleName} from './AliasManaging';\nimport {createAliasMap, generateAliases} from './AliasGen';\nimport {generateValidateConstants} from './ValidateConstants';\nimport {generateValidateMethods} from './ValidateMethods';\nimport type {CppStringTypes} from './ObjectTypes';\n\nexport type {CppStringTypes} from './ObjectTypes';\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 methodOnly,\n namespace,\n cppStringType,\n}: {\n methodOnly: boolean;\n namespace: string;\n cppStringType: CppStringTypes;\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.aliasMap);\n\n // prepare methods\n const methods = generateValidateMethods(nativeModule, aliases, {\n cppStringType,\n });\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 cppStringType,\n });\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"]}
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;AAO1D,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BtB,CAAC;AAEF,SAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,SAAS,EACT,aAAa,GAKd;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,QAAQ,CAAC,CAAC;gBAEhE,kBAAkB;gBAClB,MAAM,OAAO,GAAG,IAAA,yCAAuB,EAAC,YAAY,EAAE,OAAO,EAAE;oBAC7D,aAAa;iBACd,CAAC,CAAC;gBACH,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,CAAC,WAAW,EAAE,gBAAgB,CAAC,GAAG,IAAA,0BAAe,EAAC,OAAO,EAAE;oBAC/D,aAAa;iBACd,CAAC,CAAC;gBAEH,KAAK,CAAC,GAAG,CACP,SAAS,mBAAmB,UAAU,EACtC,cAAc;qBACX,OAAO,CAAC,4BAA4B,EAAE,WAAW,CAAC;qBAClD,OAAO,CAAC,uCAAuC,EAAE,gBAAgB,CAAC;qBAClE,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;AA/ED,gDA+EC","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/codegen/lib/CodegenSchema';\nimport {AliasMap, setPreferredModuleName} from './AliasManaging';\nimport {createAliasMap, generateAliases} from './AliasGen';\nimport {generateValidateConstants} from './ValidateConstants';\nimport {generateValidateMethods} from './ValidateMethods';\nimport type {CppStringTypes} from './ObjectTypes';\n\nexport type {CppStringTypes} from './ObjectTypes';\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_CUSTPM_TYPES_::\n::_MODULE_CUSTPM_TYPES_REFLECTION_::\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 methodOnly,\n namespace,\n cppStringType,\n}: {\n methodOnly: boolean;\n namespace: string;\n cppStringType: CppStringTypes;\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.aliasMap);\n\n // prepare methods\n const methods = generateValidateMethods(nativeModule, aliases, {\n cppStringType,\n });\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 [customTypes, customReflection] = generateAliases(aliases, {\n cppStringType,\n });\n\n files.set(\n `Native${preferredModuleName}Spec.g.h`,\n moduleTemplate\n .replace(/::_MODULE_CUSTPM_TYPES_::/g, customTypes)\n .replace(/::_MODULE_CUSTPM_TYPES_REFLECTION_::/g, customReflection)\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native-windows/codegen",
3
- "version": "0.0.0-canary.65",
3
+ "version": "0.0.0-canary.67",
4
4
  "description": "Generators for react-native-codegen targeting react-native-windows",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "repository": {
@@ -22,7 +22,7 @@
22
22
  "react-native-windows-codegen": "./bin.js"
23
23
  },
24
24
  "dependencies": {
25
- "@react-native-windows/fs": "^0.0.0-canary.26",
25
+ "@react-native-windows/fs": "^0.0.0-canary.27",
26
26
  "chalk": "^4.1.0",
27
27
  "globby": "^11.0.4",
28
28
  "mustache": "^4.0.1",
@@ -32,7 +32,7 @@
32
32
  "devDependencies": {
33
33
  "@rnw-scripts/eslint-config": "1.2.2",
34
34
  "@rnw-scripts/jest-unittest-config": "1.5.6",
35
- "@rnw-scripts/just-task": "2.3.14",
35
+ "@rnw-scripts/just-task": "2.3.15",
36
36
  "@rnw-scripts/ts-config": "2.0.5",
37
37
  "@types/chalk": "^2.2.0",
38
38
  "@types/jest": "^29.2.2",
@@ -15,7 +15,7 @@ import type {
15
15
  import {AliasMap, getAliasCppName} from './AliasManaging';
16
16
  import {CppCodegenOptions, translateField} from './ObjectTypes';
17
17
 
18
- function translateObjectBody(
18
+ function translateObjectMembersDefinition(
19
19
  type: NativeModuleObjectTypeAnnotation,
20
20
  aliases: AliasMap,
21
21
  baseAliasName: string,
@@ -28,14 +28,24 @@ function translateObjectBody(
28
28
  if (prop.optional && propType.type !== 'NullableTypeAnnotation') {
29
29
  propType = {type: 'NullableTypeAnnotation', typeAnnotation: propType};
30
30
  }
31
- const first = `${prefix}REACT_FIELD(${prop.name})`;
32
- const second = `${prefix}${translateField(
31
+ return `${prefix}${translateField(
33
32
  propType,
34
33
  aliases,
35
34
  `${baseAliasName}_${prop.name}`,
36
35
  options,
37
36
  )} ${prop.name};`;
38
- return `${first}\n${second}`;
37
+ })
38
+ .join('\n');
39
+ }
40
+
41
+ function translateObjectMembersReflection(
42
+ type: NativeModuleObjectTypeAnnotation,
43
+ aliasCppName: string,
44
+ prefix: string,
45
+ ) {
46
+ return type.properties
47
+ .map((prop: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>) => {
48
+ return `${prefix}{L"${prop.name}", &${aliasCppName}::${prop.name}},`;
39
49
  })
40
50
  .join('\n');
41
51
  }
@@ -50,8 +60,13 @@ export function createAliasMap(nativeModuleAliases: {
50
60
  return aliases;
51
61
  }
52
62
 
63
+ interface AliasCode {
64
+ definition: string;
65
+ reflection: string;
66
+ }
67
+
53
68
  interface AliasCodeMap {
54
- [name: string]: string;
69
+ [name: string]: AliasCode;
55
70
  }
56
71
 
57
72
  function generateSingleAlias(
@@ -60,13 +75,28 @@ function generateSingleAlias(
60
75
  aliasCode: AliasCodeMap,
61
76
  options: CppCodegenOptions,
62
77
  ): void {
78
+ const aliasCppName = getAliasCppName(aliasName);
63
79
  const aliasType = <NativeModuleObjectTypeAnnotation>aliases.types[aliasName];
64
- aliasCode[aliasName] = `
65
- REACT_STRUCT(${getAliasCppName(aliasName)})
66
- struct ${getAliasCppName(aliasName)} {
67
- ${translateObjectBody(aliasType, aliases, aliasName, ' ', options)}
80
+ const definition = `
81
+ struct ${aliasCppName} {
82
+ ${translateObjectMembersDefinition(
83
+ aliasType,
84
+ aliases,
85
+ aliasName,
86
+ ' ',
87
+ options,
88
+ )}
68
89
  };
69
90
  `;
91
+ const reflection = `
92
+ inline winrt::Microsoft::ReactNative::FieldMap GetStructInfo(${aliasCppName}*) noexcept {
93
+ winrt::Microsoft::ReactNative::FieldMap fieldMap {
94
+ ${translateObjectMembersReflection(aliasType, aliasCppName, ' ')}
95
+ };
96
+ return fieldMap;
97
+ }
98
+ `;
99
+ aliasCode[aliasName] = {definition, reflection};
70
100
  }
71
101
 
72
102
  function generateNestedAliasesInCorrectOrder(
@@ -103,15 +133,17 @@ function generateNestedAliasesInCorrectOrder(
103
133
  export function generateAliases(
104
134
  aliases: AliasMap,
105
135
  options: CppCodegenOptions,
106
- ): string {
136
+ ): [string, string] {
107
137
  const aliasCode: AliasCodeMap = {};
108
138
  const aliasOrder: string[] = [];
109
139
  generateNestedAliasesInCorrectOrder(aliases, aliasCode, aliasOrder, options);
110
140
 
111
141
  // aliasOrder now has the correct order of C++ struct code
112
- let traversedAliasedStructs = '';
142
+ let customTypes = '';
143
+ let customReflection = '';
113
144
  for (const aliasName of aliasOrder) {
114
- traversedAliasedStructs = `${traversedAliasedStructs}${aliasCode[aliasName]}`;
145
+ customTypes = `${customTypes}${aliasCode[aliasName].definition}`;
146
+ customReflection = `${customReflection}${aliasCode[aliasName].reflection}`;
115
147
  }
116
- return traversedAliasedStructs;
148
+ return [customTypes, customReflection];
117
149
  }
@@ -27,11 +27,12 @@ const moduleTemplate = `
27
27
  */
28
28
  #pragma once
29
29
 
30
- #include "NativeModules.h"
30
+ #include <NativeModules.h>
31
31
  #include <tuple>
32
32
 
33
33
  namespace ::_NAMESPACE_:: {
34
- ::_MODULE_ALIASED_STRUCTS_::
34
+ ::_MODULE_CUSTPM_TYPES_::
35
+ ::_MODULE_CUSTPM_TYPES_REFLECTION_::
35
36
  struct ::_MODULE_NAME_::Spec : winrt::Microsoft::ReactNative::TurboModuleSpec {
36
37
  ::_MODULE_MEMBERS_TUPLES_::
37
38
 
@@ -105,14 +106,15 @@ ${errors}`;
105
106
  }
106
107
 
107
108
  // generate code for structs
108
- const traversedAliasedStructs = generateAliases(aliases, {
109
+ const [customTypes, customReflection] = generateAliases(aliases, {
109
110
  cppStringType,
110
111
  });
111
112
 
112
113
  files.set(
113
114
  `Native${preferredModuleName}Spec.g.h`,
114
115
  moduleTemplate
115
- .replace(/::_MODULE_ALIASED_STRUCTS_::/g, traversedAliasedStructs)
116
+ .replace(/::_MODULE_CUSTPM_TYPES_::/g, customTypes)
117
+ .replace(/::_MODULE_CUSTPM_TYPES_REFLECTION_::/g, customReflection)
116
118
  .replace(/::_MODULE_MEMBERS_TUPLES_::/g, tuples.substring(1))
117
119
  .replace(/::_MODULE_MEMBERS_CHECKS_::/g, checks.substring(1))
118
120
  .replace(/::_MODULE_MEMBERS_ERRORS_::/g, errors)