generateRegistryJson.ts 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Conversion of Joystream types into @polkadot/typegen compatible RegistryTypes json file
  2. import { types } from '../index'
  3. import { Constructor, Codec, RegistryTypes, Registry } from '@polkadot/types/types'
  4. import { TypeRegistry } from '@polkadot/types'
  5. import fs from 'fs'
  6. import path from 'path'
  7. const OUTPUT_PATH = path.join(__dirname, '../../augment/all/defs.json')
  8. function normalizeDef(registry: Registry, defOrConstructor: any, typeName: string): RegistryTypes[string] {
  9. if (typeof defOrConstructor === 'string') {
  10. // Replace unhandled BTreeSet with Vec
  11. defOrConstructor = defOrConstructor.replace('BTreeSet<', 'Vec<')
  12. // Workaround for "Unhandled type VecFixed"
  13. defOrConstructor = defOrConstructor.replace('[u8;32]', 'Hash')
  14. return defOrConstructor
  15. } else if (typeof defOrConstructor === 'function') {
  16. const defString = new (defOrConstructor as Constructor<Codec>)(registry).toRawType().toString()
  17. let obj: any
  18. try {
  19. obj = JSON.parse(defString)
  20. } catch (e) {
  21. // def if just a type name:
  22. return defString
  23. }
  24. // def is an object:
  25. const normalizedObj: any = {}
  26. if (obj._enum && Array.isArray(obj._enum)) {
  27. // Enum as array - No need to normalize
  28. return obj
  29. } else if (obj._enum && !Array.isArray(obj._enum)) {
  30. // Enum as object - normalize properties
  31. normalizedObj._enum = {}
  32. Object.entries(obj._enum).forEach(([key, value]) => {
  33. const normalizedValue = normalizeDef(registry, value, `${typeName}[${key}]`)
  34. if (typeof normalizedValue !== 'string') {
  35. throw new Error(
  36. `Too many nested definitions in ${typeName} enum. Did you forget to expose some types in the registry?`
  37. )
  38. }
  39. normalizedObj._enum[key] = normalizedValue
  40. })
  41. } else if (obj._set) {
  42. // Set - we don't need those now, but perhaps worth looking into at some point
  43. throw new Error('_set definitions are not supported yet!')
  44. } else {
  45. // Struct - normalize properties
  46. for (const [key, value] of Object.entries(obj)) {
  47. // Prevent interface clashes
  48. const normalizedValue = normalizeDef(registry, value, `${typeName}[${key}]`)
  49. if (typeof normalizedValue !== 'string') {
  50. throw new Error(
  51. `Too many nested definitions in ${typeName} struct. Did you forget to expose some types in the registry?`
  52. )
  53. }
  54. normalizedObj[key] = normalizedValue
  55. }
  56. }
  57. return normalizedObj
  58. }
  59. throw new Error(`Unkown type entry for ${typeName} found in registry!`)
  60. }
  61. function defsFromTypes(types: RegistryTypes) {
  62. const registry = new TypeRegistry()
  63. registry.setKnownTypes({ types })
  64. registry.register(types)
  65. const defs: RegistryTypes = {}
  66. Object.entries(registry.knownTypes.types as any).forEach(([typeName, defOrConstructor]) => {
  67. const def = normalizeDef(registry, defOrConstructor, typeName)
  68. defs[typeName] = def
  69. })
  70. return defs
  71. }
  72. const defs = defsFromTypes(types)
  73. fs.writeFileSync(OUTPUT_PATH, JSON.stringify(defs, undefined, 4))