@graphprotocol/graph-cli 0.37.3 → 0.37.4-alpha-20230117095424-b5750b1

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.
Files changed (352) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/bin.js +6 -0
  3. package/dist/cli.js +26 -0
  4. package/dist/codegen/schema.js +244 -0
  5. package/dist/codegen/schema.test.js +455 -0
  6. package/dist/codegen/template.js +66 -0
  7. package/dist/codegen/types/conversions.js +335 -0
  8. package/dist/codegen/types/index.js +71 -0
  9. package/dist/codegen/types/index.test.js +563 -0
  10. package/dist/codegen/typescript.js +200 -0
  11. package/dist/codegen/util.js +40 -0
  12. package/dist/codegen/util.test.js +93 -0
  13. package/dist/command-helpers/abi.js +76 -0
  14. package/dist/command-helpers/auth.js +76 -0
  15. package/dist/command-helpers/compiler.js +66 -0
  16. package/dist/command-helpers/data-sources.js +29 -0
  17. package/dist/command-helpers/fs.js +9 -0
  18. package/dist/command-helpers/gluegun.js +48 -0
  19. package/dist/command-helpers/ipfs.js +5 -0
  20. package/dist/command-helpers/jsonrpc.js +27 -0
  21. package/dist/command-helpers/network.js +90 -0
  22. package/dist/command-helpers/network.test.js +86 -0
  23. package/dist/command-helpers/node.js +40 -0
  24. package/dist/command-helpers/scaffold.js +110 -0
  25. package/dist/command-helpers/spinner.js +80 -0
  26. package/dist/command-helpers/studio.js +14 -0
  27. package/dist/command-helpers/studio.test.js +41 -0
  28. package/dist/command-helpers/subgraph.js +22 -0
  29. package/dist/command-helpers/version.js +66 -0
  30. package/dist/command-helpers/version.test.js +186 -0
  31. package/dist/commands/add.js +187 -0
  32. package/dist/commands/auth.js +122 -0
  33. package/dist/commands/build.js +136 -0
  34. package/dist/commands/codegen.js +128 -0
  35. package/dist/commands/create.js +94 -0
  36. package/dist/commands/deploy.js +335 -0
  37. package/dist/commands/init.js +800 -0
  38. package/dist/commands/local.js +380 -0
  39. package/dist/commands/remove.js +95 -0
  40. package/dist/commands/test.js +293 -0
  41. package/dist/compiler/asc.js +83 -0
  42. package/dist/compiler/index.js +466 -0
  43. package/dist/debug.js +16 -0
  44. package/dist/migrations/mapping_api_version_0_0_1.js +83 -0
  45. package/dist/migrations/mapping_api_version_0_0_2.js +83 -0
  46. package/dist/migrations/mapping_api_version_0_0_3.js +83 -0
  47. package/dist/migrations/mapping_api_version_0_0_4.js +85 -0
  48. package/dist/migrations/mapping_api_version_0_0_5.js +85 -0
  49. package/dist/migrations/spec_version_0_0_2.js +45 -0
  50. package/dist/migrations/spec_version_0_0_3.js +50 -0
  51. package/dist/migrations/util/load-manifest.js +16 -0
  52. package/dist/migrations/util/versions.js +28 -0
  53. package/dist/migrations.js +54 -0
  54. package/{src → dist}/protocols/arweave/manifest.graphql +0 -0
  55. package/{src/protocols/arweave/scaffold/manifest.ts → dist/protocols/arweave/scaffold/manifest.js} +7 -3
  56. package/{src/protocols/arweave/scaffold/mapping.ts → dist/protocols/arweave/scaffold/mapping.js} +5 -2
  57. package/dist/protocols/arweave/subgraph.js +23 -0
  58. package/dist/protocols/contract.js +2 -0
  59. package/{src → dist}/protocols/cosmos/manifest.graphql +0 -0
  60. package/dist/protocols/cosmos/scaffold/manifest.js +15 -0
  61. package/{src/protocols/cosmos/scaffold/mapping.ts → dist/protocols/cosmos/scaffold/mapping.js} +5 -2
  62. package/dist/protocols/cosmos/subgraph.js +28 -0
  63. package/dist/protocols/ethereum/abi.js +138 -0
  64. package/dist/protocols/ethereum/codegen/abi.js +474 -0
  65. package/dist/protocols/ethereum/codegen/abi.test.js +325 -0
  66. package/dist/protocols/ethereum/codegen/template.js +52 -0
  67. package/dist/protocols/ethereum/contract.js +22 -0
  68. package/{src → dist}/protocols/ethereum/manifest.graphql +0 -0
  69. package/dist/protocols/ethereum/scaffold/manifest.js +32 -0
  70. package/{src/protocols/ethereum/scaffold/mapping.ts → dist/protocols/ethereum/scaffold/mapping.js} +18 -29
  71. package/dist/protocols/ethereum/subgraph.js +172 -0
  72. package/dist/protocols/ethereum/type-generator.js +123 -0
  73. package/dist/protocols/index.js +266 -0
  74. package/dist/protocols/ipfs/codegen/file_template.js +53 -0
  75. package/dist/protocols/near/contract.js +41 -0
  76. package/{src → dist}/protocols/near/manifest.graphql +0 -0
  77. package/dist/protocols/near/scaffold/manifest.js +16 -0
  78. package/{src/protocols/near/scaffold/mapping.ts → dist/protocols/near/scaffold/mapping.js} +5 -2
  79. package/dist/protocols/near/subgraph.js +23 -0
  80. package/dist/protocols/subgraph.js +2 -0
  81. package/{src → dist}/protocols/substreams/manifest.graphql +0 -0
  82. package/dist/protocols/substreams/scaffold/manifest.js +12 -0
  83. package/dist/protocols/substreams/subgraph.js +23 -0
  84. package/{src/scaffold/cosmos.test.ts → dist/scaffold/cosmos.test.js} +21 -22
  85. package/{src/scaffold/ethereum.test.ts → dist/scaffold/ethereum.test.js} +85 -101
  86. package/dist/scaffold/index.js +133 -0
  87. package/dist/scaffold/mapping.js +57 -0
  88. package/{src/scaffold/near.test.ts → dist/scaffold/near.test.js} +22 -23
  89. package/dist/scaffold/schema.js +86 -0
  90. package/dist/scaffold/tests.js +179 -0
  91. package/dist/schema.js +54 -0
  92. package/dist/subgraph.js +243 -0
  93. package/dist/type-generator.js +225 -0
  94. package/dist/validation/contract.js +44 -0
  95. package/dist/validation/index.js +10 -0
  96. package/dist/validation/manifest.js +266 -0
  97. package/dist/validation/schema.js +768 -0
  98. package/dist/validation/schema.test.js +35 -0
  99. package/dist/watcher.js +79 -0
  100. package/package.json +5 -1
  101. package/babel.config.js +0 -3
  102. package/jest.config.js +0 -175
  103. package/src/bin.ts +0 -6
  104. package/src/cli.ts +0 -30
  105. package/src/codegen/schema.test.ts +0 -460
  106. package/src/codegen/schema.ts +0 -299
  107. package/src/codegen/template.ts +0 -45
  108. package/src/codegen/types/conversions.ts +0 -358
  109. package/src/codegen/types/index.test.ts +0 -715
  110. package/src/codegen/types/index.ts +0 -111
  111. package/src/codegen/typescript.ts +0 -224
  112. package/src/codegen/util.test.ts +0 -112
  113. package/src/codegen/util.ts +0 -54
  114. package/src/command-helpers/abi.ts +0 -99
  115. package/src/command-helpers/auth.ts +0 -46
  116. package/src/command-helpers/compiler.ts +0 -60
  117. package/src/command-helpers/data-sources.ts +0 -36
  118. package/src/command-helpers/fs.ts +0 -5
  119. package/src/command-helpers/gluegun.ts +0 -52
  120. package/src/command-helpers/ipfs-http-client.d.ts +0 -1
  121. package/src/command-helpers/ipfs.ts +0 -3
  122. package/src/command-helpers/jsonrpc.ts +0 -22
  123. package/src/command-helpers/network.test.ts +0 -85
  124. package/src/command-helpers/network.ts +0 -133
  125. package/src/command-helpers/node.ts +0 -46
  126. package/src/command-helpers/scaffold.ts +0 -174
  127. package/src/command-helpers/spinner.ts +0 -60
  128. package/src/command-helpers/studio.test.ts +0 -84
  129. package/src/command-helpers/studio.ts +0 -25
  130. package/src/command-helpers/subgraph.ts +0 -21
  131. package/src/command-helpers/version.test.ts +0 -241
  132. package/src/command-helpers/version.ts +0 -53
  133. package/src/commands/add.ts +0 -220
  134. package/src/commands/auth.ts +0 -138
  135. package/src/commands/binary-install-raw.d.ts +0 -1
  136. package/src/commands/build.ts +0 -147
  137. package/src/commands/codegen.ts +0 -123
  138. package/src/commands/create.ts +0 -109
  139. package/src/commands/deploy.ts +0 -388
  140. package/src/commands/init.ts +0 -1060
  141. package/src/commands/local.ts +0 -539
  142. package/src/commands/remove.ts +0 -110
  143. package/src/commands/test.ts +0 -369
  144. package/src/compiler/asc.ts +0 -77
  145. package/src/compiler/index.ts +0 -677
  146. package/src/debug.ts +0 -15
  147. package/src/migrations/mapping_api_version_0_0_1.ts +0 -75
  148. package/src/migrations/mapping_api_version_0_0_2.ts +0 -75
  149. package/src/migrations/mapping_api_version_0_0_3.ts +0 -75
  150. package/src/migrations/mapping_api_version_0_0_4.ts +0 -77
  151. package/src/migrations/mapping_api_version_0_0_5.ts +0 -77
  152. package/src/migrations/spec_version_0_0_2.ts +0 -24
  153. package/src/migrations/spec_version_0_0_3.ts +0 -29
  154. package/src/migrations/util/load-manifest.ts +0 -10
  155. package/src/migrations/util/versions.ts +0 -27
  156. package/src/migrations.ts +0 -33
  157. package/src/protocols/arweave/subgraph.ts +0 -22
  158. package/src/protocols/contract.ts +0 -9
  159. package/src/protocols/cosmos/scaffold/manifest.ts +0 -11
  160. package/src/protocols/cosmos/subgraph.ts +0 -27
  161. package/src/protocols/ethereum/abi.ts +0 -153
  162. package/src/protocols/ethereum/codegen/abi.test.ts +0 -330
  163. package/src/protocols/ethereum/codegen/abi.ts +0 -719
  164. package/src/protocols/ethereum/codegen/template.ts +0 -41
  165. package/src/protocols/ethereum/contract.ts +0 -24
  166. package/src/protocols/ethereum/scaffold/manifest.ts +0 -28
  167. package/src/protocols/ethereum/subgraph.ts +0 -189
  168. package/src/protocols/ethereum/type-generator.ts +0 -191
  169. package/src/protocols/index.ts +0 -287
  170. package/src/protocols/ipfs/codegen/file_template.ts +0 -43
  171. package/src/protocols/near/contract.ts +0 -47
  172. package/src/protocols/near/scaffold/manifest.ts +0 -13
  173. package/src/protocols/near/subgraph.ts +0 -22
  174. package/src/protocols/subgraph.ts +0 -12
  175. package/src/protocols/substreams/scaffold/manifest.ts +0 -8
  176. package/src/protocols/substreams/subgraph.ts +0 -22
  177. package/src/scaffold/index.ts +0 -172
  178. package/src/scaffold/mapping.ts +0 -44
  179. package/src/scaffold/schema.ts +0 -89
  180. package/src/scaffold/tests.ts +0 -217
  181. package/src/schema.ts +0 -26
  182. package/src/subgraph.ts +0 -302
  183. package/src/type-generator.ts +0 -266
  184. package/src/validation/contract.ts +0 -51
  185. package/src/validation/index.ts +0 -5
  186. package/src/validation/manifest.ts +0 -360
  187. package/src/validation/schema.test.ts +0 -38
  188. package/src/validation/schema.ts +0 -957
  189. package/src/watcher.ts +0 -96
  190. package/tests/cli/globalSetup.ts +0 -8
  191. package/tests/cli/globalTeardown.ts +0 -8
  192. package/tests/cli/init/ethereum/abis/Marketplace.json +0 -408
  193. package/tests/cli/init/ethereum/abis/OverloadedElements.json +0 -91
  194. package/tests/cli/init/ethereum/abis/SoloMargin.json +0 -2729
  195. package/tests/cli/init/ethereum/from-contract-with-abi-and-structs.stderr +0 -14
  196. package/tests/cli/init/ethereum/from-contract-with-abi-and-structs.stdout +0 -12
  197. package/tests/cli/init/ethereum/from-contract-with-abi.stderr +0 -14
  198. package/tests/cli/init/ethereum/from-contract-with-abi.stdout +0 -12
  199. package/tests/cli/init/ethereum/from-contract-with-overloaded-elements.stderr +0 -14
  200. package/tests/cli/init/ethereum/from-contract-with-overloaded-elements.stdout +0 -12
  201. package/tests/cli/init/ethereum/from-contract.stderr +0 -16
  202. package/tests/cli/init/ethereum/from-contract.stdout +0 -12
  203. package/tests/cli/init/ethereum/from-example.stderr +0 -12
  204. package/tests/cli/init/ethereum/from-example.stdout +0 -12
  205. package/tests/cli/init/near/from-contract.stderr +0 -14
  206. package/tests/cli/init/near/from-contract.stdout +0 -12
  207. package/tests/cli/init.test.ts +0 -157
  208. package/tests/cli/spawn-command.d.ts +0 -7
  209. package/tests/cli/util.ts +0 -132
  210. package/tests/cli/validation/abi-not-found/Abi.json +0 -7
  211. package/tests/cli/validation/abi-not-found/mapping.ts +0 -0
  212. package/tests/cli/validation/abi-not-found/schema.graphql +0 -3
  213. package/tests/cli/validation/abi-not-found/subgraph.yaml +0 -42
  214. package/tests/cli/validation/abi-not-found copy.stderr +0 -13
  215. package/tests/cli/validation/big-decimal-is-valid/Abi.json +0 -7
  216. package/tests/cli/validation/big-decimal-is-valid/mapping.ts +0 -0
  217. package/tests/cli/validation/big-decimal-is-valid/schema.graphql +0 -4
  218. package/tests/cli/validation/big-decimal-is-valid/subgraph.yaml +0 -23
  219. package/tests/cli/validation/call-function-not-found/Abi.json +0 -57
  220. package/tests/cli/validation/call-function-not-found/mapping.ts +0 -0
  221. package/tests/cli/validation/call-function-not-found/schema.graphql +0 -3
  222. package/tests/cli/validation/call-function-not-found/subgraph.yaml +0 -22
  223. package/tests/cli/validation/call-function-not-found.stderr +0 -10
  224. package/tests/cli/validation/call-handler-with-tuple/Abi.json +0 -24
  225. package/tests/cli/validation/call-handler-with-tuple/generated/schema.ts +0 -44
  226. package/tests/cli/validation/call-handler-with-tuple/mapping.ts +0 -0
  227. package/tests/cli/validation/call-handler-with-tuple/schema.graphql +0 -3
  228. package/tests/cli/validation/call-handler-with-tuple/subgraph.yaml +0 -22
  229. package/tests/cli/validation/call-handler-with-tuple.stderr +0 -24
  230. package/tests/cli/validation/conflicting-network-names/Abi.json +0 -7
  231. package/tests/cli/validation/conflicting-network-names/mapping.ts +0 -0
  232. package/tests/cli/validation/conflicting-network-names/schema.graphql +0 -3
  233. package/tests/cli/validation/conflicting-network-names/subgraph.yaml +0 -41
  234. package/tests/cli/validation/conflicting-network-names.stderr +0 -10
  235. package/tests/cli/validation/conflicting-protocol-names/Abi.json +0 -7
  236. package/tests/cli/validation/conflicting-protocol-names/mapping.ts +0 -0
  237. package/tests/cli/validation/conflicting-protocol-names/schema.graphql +0 -3
  238. package/tests/cli/validation/conflicting-protocol-names/subgraph.yaml +0 -41
  239. package/tests/cli/validation/conflicting-protocol-names.stderr +0 -10
  240. package/tests/cli/validation/derived-from-target-type-missing/Abi.json +0 -6
  241. package/tests/cli/validation/derived-from-target-type-missing/mapping.ts +0 -0
  242. package/tests/cli/validation/derived-from-target-type-missing/schema.graphql +0 -4
  243. package/tests/cli/validation/derived-from-target-type-missing/subgraph.yaml +0 -22
  244. package/tests/cli/validation/derived-from-target-type-missing.stderr +0 -5
  245. package/tests/cli/validation/derived-from-with-interface/Gravity.json +0 -1
  246. package/tests/cli/validation/derived-from-with-interface/mapping.ts +0 -22
  247. package/tests/cli/validation/derived-from-with-interface/schema.graphql +0 -19
  248. package/tests/cli/validation/derived-from-with-interface/subgraph.yaml +0 -25
  249. package/tests/cli/validation/duplicate-data-source-name/Abi.json +0 -7
  250. package/tests/cli/validation/duplicate-data-source-name/mapping.ts +0 -0
  251. package/tests/cli/validation/duplicate-data-source-name/schema.graphql +0 -4
  252. package/tests/cli/validation/duplicate-data-source-name/subgraph.yaml +0 -40
  253. package/tests/cli/validation/duplicate-data-source-name.stderr +0 -5
  254. package/tests/cli/validation/duplicate-template-name/Abi.json +0 -7
  255. package/tests/cli/validation/duplicate-template-name/mapping.ts +0 -0
  256. package/tests/cli/validation/duplicate-template-name/schema.graphql +0 -4
  257. package/tests/cli/validation/duplicate-template-name/subgraph.yaml +0 -59
  258. package/tests/cli/validation/duplicate-template-name.stderr +0 -5
  259. package/tests/cli/validation/entity-field-args/Abi.json +0 -7
  260. package/tests/cli/validation/entity-field-args/mapping.ts +0 -0
  261. package/tests/cli/validation/entity-field-args/schema.graphql +0 -4
  262. package/tests/cli/validation/entity-field-args/subgraph.yaml +0 -22
  263. package/tests/cli/validation/entity-field-args.stderr +0 -5
  264. package/tests/cli/validation/ethereum-contract-without-handlers/Abi.json +0 -7
  265. package/tests/cli/validation/ethereum-contract-without-handlers/mapping.ts +0 -0
  266. package/tests/cli/validation/ethereum-contract-without-handlers/schema.graphql +0 -3
  267. package/tests/cli/validation/ethereum-contract-without-handlers/subgraph.yaml +0 -19
  268. package/tests/cli/validation/ethereum-contract-without-handlers.stderr +0 -6
  269. package/tests/cli/validation/event-not-found/Abi.json +0 -7
  270. package/tests/cli/validation/event-not-found/mapping.ts +0 -0
  271. package/tests/cli/validation/event-not-found/schema.graphql +0 -3
  272. package/tests/cli/validation/event-not-found/subgraph.yaml +0 -40
  273. package/tests/cli/validation/event-not-found.stderr +0 -12
  274. package/tests/cli/validation/example-values-found/Abi.json +0 -7
  275. package/tests/cli/validation/example-values-found/generated/ExampleSubgraph/ExampleContract.ts +0 -35
  276. package/tests/cli/validation/example-values-found/generated/schema.ts +0 -44
  277. package/tests/cli/validation/example-values-found/mapping.ts +0 -0
  278. package/tests/cli/validation/example-values-found/schema.graphql +0 -3
  279. package/tests/cli/validation/example-values-found/subgraph.yaml +0 -24
  280. package/tests/cli/validation/example-values-found.stderr +0 -34
  281. package/tests/cli/validation/invalid-abis/InvalidAbi.json +0 -1
  282. package/tests/cli/validation/invalid-abis/mapping.ts +0 -0
  283. package/tests/cli/validation/invalid-abis/schema.graphql +0 -3
  284. package/tests/cli/validation/invalid-abis/subgraph.yaml +0 -22
  285. package/tests/cli/validation/invalid-abis.stderr +0 -5
  286. package/tests/cli/validation/invalid-contract-addresses/Abi.json +0 -7
  287. package/tests/cli/validation/invalid-contract-addresses/mapping.ts +0 -0
  288. package/tests/cli/validation/invalid-contract-addresses/schema.graphql +0 -3
  289. package/tests/cli/validation/invalid-contract-addresses/subgraph.yaml +0 -58
  290. package/tests/cli/validation/invalid-contract-addresses.stderr +0 -14
  291. package/tests/cli/validation/invalid-data-source-template/mapping.ts +0 -0
  292. package/tests/cli/validation/invalid-data-source-template/schema.graphql +0 -3
  293. package/tests/cli/validation/invalid-data-source-template/subgraph.yaml +0 -32
  294. package/tests/cli/validation/invalid-data-source-template.stderr +0 -30
  295. package/tests/cli/validation/invalid-entity-field-types/Abi.json +0 -7
  296. package/tests/cli/validation/invalid-entity-field-types/mapping.ts +0 -0
  297. package/tests/cli/validation/invalid-entity-field-types/schema.graphql +0 -157
  298. package/tests/cli/validation/invalid-entity-field-types/subgraph.yaml +0 -22
  299. package/tests/cli/validation/invalid-entity-field-types.stderr +0 -148
  300. package/tests/cli/validation/invalid-fulltext-directive/Abi.json +0 -7
  301. package/tests/cli/validation/invalid-fulltext-directive/mapping.ts +0 -0
  302. package/tests/cli/validation/invalid-fulltext-directive/schema.graphql +0 -140
  303. package/tests/cli/validation/invalid-fulltext-directive/subgraph.yaml +0 -22
  304. package/tests/cli/validation/invalid-fulltext-directive.stderr +0 -32
  305. package/tests/cli/validation/invalid-graphql-schema/Abi.json +0 -7
  306. package/tests/cli/validation/invalid-graphql-schema/mapping.ts +0 -0
  307. package/tests/cli/validation/invalid-graphql-schema/schema.graphql +0 -8
  308. package/tests/cli/validation/invalid-graphql-schema/subgraph.yaml +0 -22
  309. package/tests/cli/validation/invalid-graphql-schema.stderr +0 -25
  310. package/tests/cli/validation/invalid-manifest/subgraph.yaml +0 -13
  311. package/tests/cli/validation/invalid-manifest-cannot-infer-protocol/subgraph.yaml +0 -12
  312. package/tests/cli/validation/invalid-manifest-cannot-infer-protocol.stderr +0 -5
  313. package/tests/cli/validation/invalid-manifest.stderr +0 -28
  314. package/tests/cli/validation/missing-entity-id/Abi.json +0 -7
  315. package/tests/cli/validation/missing-entity-id/mapping.ts +0 -0
  316. package/tests/cli/validation/missing-entity-id/schema.graphql +0 -3
  317. package/tests/cli/validation/missing-entity-id/subgraph.yaml +0 -22
  318. package/tests/cli/validation/missing-entity-id/types/ExampleSubgraph/ExampleContract.ts +0 -35
  319. package/tests/cli/validation/missing-entity-id/types/schema.ts +0 -27
  320. package/tests/cli/validation/missing-entity-id.stderr +0 -5
  321. package/tests/cli/validation/missing-or-invalid-derived-from-fields/Abi.json +0 -7
  322. package/tests/cli/validation/missing-or-invalid-derived-from-fields/mapping.ts +0 -0
  323. package/tests/cli/validation/missing-or-invalid-derived-from-fields/schema.graphql +0 -40
  324. package/tests/cli/validation/missing-or-invalid-derived-from-fields/subgraph.yaml +0 -22
  325. package/tests/cli/validation/missing-or-invalid-derived-from-fields.stderr +0 -10
  326. package/tests/cli/validation/missing-or-invalid-derived-from-fields.stdout +0 -0
  327. package/tests/cli/validation/near-is-valid/mapping.ts +0 -0
  328. package/tests/cli/validation/near-is-valid/schema.graphql +0 -8
  329. package/tests/cli/validation/near-is-valid/subgraph.yaml +0 -30
  330. package/tests/cli/validation/nested-template-nice-error/Abi.json +0 -7
  331. package/tests/cli/validation/nested-template-nice-error/mapping.ts +0 -0
  332. package/tests/cli/validation/nested-template-nice-error/schema.graphql +0 -3
  333. package/tests/cli/validation/nested-template-nice-error/subgraph.yaml +0 -35
  334. package/tests/cli/validation/nested-template-nice-error.stderr +0 -5
  335. package/tests/cli/validation/no-network-names/Abi.json +0 -7
  336. package/tests/cli/validation/no-network-names/mapping.ts +0 -0
  337. package/tests/cli/validation/no-network-names/schema.graphql +0 -3
  338. package/tests/cli/validation/no-network-names/subgraph.yaml +0 -40
  339. package/tests/cli/validation/no-network-names.stderr +0 -34
  340. package/tests/cli/validation/source-without-address-is-valid/Abi.json +0 -7
  341. package/tests/cli/validation/source-without-address-is-valid/generated/ExampleSubgraph/ExampleContract.ts +0 -35
  342. package/tests/cli/validation/source-without-address-is-valid/mapping.ts +0 -0
  343. package/tests/cli/validation/source-without-address-is-valid/schema.graphql +0 -3
  344. package/tests/cli/validation/source-without-address-is-valid/subgraph.yaml +0 -23
  345. package/tests/cli/validation/source-without-address-is-valid.stderr +0 -24
  346. package/tests/cli/validation/topic0-is-valid/Abi.json +0 -7
  347. package/tests/cli/validation/topic0-is-valid/mapping.ts +0 -0
  348. package/tests/cli/validation/topic0-is-valid/schema.graphql +0 -4
  349. package/tests/cli/validation/topic0-is-valid/subgraph.yaml +0 -24
  350. package/tests/cli/validation.test.ts +0 -226
  351. package/tsconfig.build.json +0 -4
  352. package/tsconfig.json +0 -19
@@ -1,20 +1,21 @@
1
- import Protocol from '../protocols';
2
- import Scaffold from './index';
3
-
4
- const protocol = new Protocol('near');
5
-
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const protocols_1 = __importDefault(require("../protocols"));
7
+ const index_1 = __importDefault(require("./index"));
8
+ const protocol = new protocols_1.default('near');
6
9
  const scaffoldOptions = {
7
- protocol,
8
- contract: 'abc.def.near',
9
- network: 'near-mainnet',
10
- contractName: 'Contract',
10
+ protocol,
11
+ contract: 'abc.def.near',
12
+ network: 'near-mainnet',
13
+ contractName: 'Contract',
11
14
  };
12
-
13
- const scaffold = new Scaffold(scaffoldOptions);
14
-
15
+ const scaffold = new index_1.default(scaffoldOptions);
15
16
  describe('NEAR subgraph scaffolding', () => {
16
- test('Manifest', () => {
17
- expect(scaffold.generateManifest()).toEqual(`\
17
+ test('Manifest', () => {
18
+ expect(scaffold.generateManifest()).toEqual(`\
18
19
  specVersion: 0.0.5
19
20
  schema:
20
21
  file: ./schema.graphql
@@ -33,20 +34,18 @@ dataSources:
33
34
  - handler: handleReceipt
34
35
  file: ./src/contract.ts
35
36
  `);
36
- });
37
-
38
- test('Schema (default)', () => {
39
- expect(scaffold.generateSchema()).toEqual(`\
37
+ });
38
+ test('Schema (default)', () => {
39
+ expect(scaffold.generateSchema()).toEqual(`\
40
40
  type ExampleEntity @entity {
41
41
  id: ID!
42
42
  block: Bytes!
43
43
  count: BigInt!
44
44
  }
45
45
  `);
46
- });
47
-
48
- test('Mapping (default)', () => {
49
- expect(scaffold.generateMapping()).toEqual(`\
46
+ });
47
+ test('Mapping (default)', () => {
48
+ expect(scaffold.generateMapping()).toEqual(`\
50
49
  import { near, BigInt } from "@graphprotocol/graph-ts"
51
50
  import { ExampleEntity } from "../generated/schema"
52
51
 
@@ -82,5 +81,5 @@ export function handleReceipt(
82
81
  // unchanged, allowing for partial updates to be applied.
83
82
  }
84
83
  `);
85
- });
84
+ });
86
85
  });
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.generateExampleEntityType = exports.generateEventType = exports.generateEventFields = exports.generateField = exports.protocolTypeToGraphQL = exports.abiEvents = void 0;
27
+ const types_1 = require("../codegen/types");
28
+ const util = __importStar(require("../codegen/util"));
29
+ function abiEvents(abi) {
30
+ return util.disambiguateNames({
31
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
32
+ values: abi.data.filter(item => item.get('type') === 'event'),
33
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
34
+ getName: event => event.get('name'),
35
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
36
+ setName: (event, name) => event.set('_alias', name),
37
+ });
38
+ }
39
+ exports.abiEvents = abiEvents;
40
+ const protocolTypeToGraphQL = (protocol, name) => {
41
+ const ascType = (0, types_1.ascTypeForProtocol)(protocol, name);
42
+ return (0, types_1.valueTypeForAsc)(ascType);
43
+ };
44
+ exports.protocolTypeToGraphQL = protocolTypeToGraphQL;
45
+ const generateField = ({ name, type, protocolName, }) => `${name}: ${(0, exports.protocolTypeToGraphQL)(protocolName, type)}! # ${type}`;
46
+ exports.generateField = generateField;
47
+ const generateEventFields = ({ index, input, protocolName, }) => input.type == 'tuple'
48
+ ? util
49
+ .unrollTuple({ value: input, path: [input.name || `param${index}`], index })
50
+ .map(({ path, type }) => (0, exports.generateField)({ name: path.join('_'), type, protocolName }))
51
+ : [
52
+ (0, exports.generateField)({
53
+ name: input.name || `param${index}`,
54
+ type: input.type,
55
+ protocolName,
56
+ }),
57
+ ];
58
+ exports.generateEventFields = generateEventFields;
59
+ const generateEventType = (event, protocolName) => `type ${event._alias} @entity(immutable: true) {
60
+ id: Bytes!
61
+ ${event.inputs
62
+ .reduce((acc, input, index) => acc.concat((0, exports.generateEventFields)({ input, index, protocolName })), [])
63
+ .join('\n')}
64
+ blockNumber: BigInt!
65
+ blockTimestamp: BigInt!
66
+ transactionHash: Bytes!
67
+ }`;
68
+ exports.generateEventType = generateEventType;
69
+ const generateExampleEntityType = (protocol, events) => {
70
+ if (protocol.hasABIs() && events.length > 0) {
71
+ return `type ExampleEntity @entity {
72
+ id: Bytes!
73
+ count: BigInt!
74
+ ${events[0].inputs
75
+ .reduce((acc, input, index) => acc.concat((0, exports.generateEventFields)({ input, index, protocolName: protocol.name })), [])
76
+ .slice(0, 2)
77
+ .join('\n')}
78
+ }`;
79
+ }
80
+ return `type ExampleEntity @entity {
81
+ id: ID!
82
+ block: Bytes!
83
+ count: BigInt!
84
+ }`;
85
+ };
86
+ exports.generateExampleEntityType = generateExampleEntityType;
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateTestsFiles = void 0;
7
+ const gluegun_1 = require("gluegun");
8
+ const prettier_1 = __importDefault(require("prettier"));
9
+ const types_1 = require("../codegen/types");
10
+ const VARIABLES_VALUES = {
11
+ i32: 123,
12
+ BigInt: 234,
13
+ Bytes: 1234567890,
14
+ Address: '0x0000000000000000000000000000000000000001',
15
+ string: 'Example string value',
16
+ bool: true,
17
+ };
18
+ const generateTestsFiles = (contract, events, indexEvents) => {
19
+ const eventsTypes = events
20
+ .flatMap(event => event.inputs.map((input) => {
21
+ // If the asc type is Array<T> we need to check if T is a native type or a custom graph-ts type
22
+ // If we don't do that we may miss a type that should be imported from graph-ts
23
+ const ascType = (0, types_1.ascTypeForEthereum)(input.type);
24
+ const inner = fetchArrayInnerType(String(ascType));
25
+ return inner ? inner[1] : ascType;
26
+ }))
27
+ .filter(type => !type.startsWith('ethereum.') && !isNativeType(type));
28
+ const importTypes = [...new Set(eventsTypes)].join(', ');
29
+ return {
30
+ [`${gluegun_1.strings.kebabCase(contract)}.test.ts`]: prettier_1.default.format(generateExampleTest(contract, events[0], indexEvents, importTypes), { parser: 'typescript', semi: false }),
31
+ [`${gluegun_1.strings.kebabCase(contract)}-utils.ts`]: prettier_1.default.format(generateTestHelper(contract, events, importTypes), { parser: 'typescript', semi: false }),
32
+ };
33
+ };
34
+ exports.generateTestsFiles = generateTestsFiles;
35
+ /*
36
+ Generates the arguments that will be passed to the mock event function from the event inputs. Example:
37
+ let id = BigInt.fromI32(234)
38
+ let owner = Address.fromString("0x0000000000000000000000000000000000000001")
39
+ let displayName = "Example string value"
40
+ let imageUrl = "Example string value"
41
+ */
42
+ const generateArguments = (eventInputs) => {
43
+ return eventInputs
44
+ .map((input, index) => {
45
+ const ascType = (0, types_1.ascTypeForEthereum)(input.type);
46
+ return `let ${input.name || `param${index}`} = ${assignValue(ascType)}`;
47
+ })
48
+ .join('\n');
49
+ };
50
+ // Generates the value that will be assigned to a variable in generateArguments()
51
+ const assignValue = (type) => {
52
+ switch (type) {
53
+ case 'string':
54
+ return `"${VARIABLES_VALUES[type]}"`;
55
+ case 'BigInt':
56
+ return `BigInt.fromI32(${VARIABLES_VALUES[type]})`;
57
+ case 'Address':
58
+ return `Address.fromString("${VARIABLES_VALUES[type]}")`;
59
+ case 'Bytes':
60
+ return `Bytes.fromI32(${VARIABLES_VALUES[type]})`;
61
+ case fetchArrayInnerType(type)?.input: {
62
+ const innerType = fetchArrayInnerType(type)[1];
63
+ return `[${assignValue(innerType)}]`;
64
+ }
65
+ default: {
66
+ const value = VARIABLES_VALUES[type];
67
+ return value ? value : `"${type} Not implemented"`;
68
+ }
69
+ }
70
+ };
71
+ /*
72
+ Generates the assert.fieldEquals() for a given entity and event inputs. Example:
73
+ assert.fieldEquals(
74
+ "ExampleEntity",
75
+ "0xa16081f360e3847006db660bae1c6d1b2e17ec2a",
76
+ "owner",
77
+ "0x0000000000000000000000000000000000000001"
78
+ )
79
+ */
80
+ const generateFieldsAssertions = (entity, eventInputs, indexEvents) => eventInputs
81
+ .filter(input => input.name != 'id')
82
+ .map((input, index) => `assert.fieldEquals(
83
+ "${entity}",
84
+ "0xa16081f360e3847006db660bae1c6d1b2e17ec2a${indexEvents ? '-1' : ''}",
85
+ "${input.name || `param${index}`}",
86
+ "${expectedValue((0, types_1.ascTypeForEthereum)(input.type))}"
87
+ )`)
88
+ .join('\n');
89
+ // Returns the expected value for a given type in generateFieldsAssertions()
90
+ const expectedValue = (type) => {
91
+ switch (type) {
92
+ case fetchArrayInnerType(type)?.input: {
93
+ const innerType = fetchArrayInnerType(type)[1];
94
+ return `[${expectedValue(innerType)}]`;
95
+ }
96
+ default: {
97
+ const value = VARIABLES_VALUES[type];
98
+ return value ? value : `${type} Not implemented`;
99
+ }
100
+ }
101
+ };
102
+ // Checks if the type is a native AS type or should be imported from graph-ts
103
+ const isNativeType = (type) => {
104
+ const natives = [/i32/, /string/, /boolean/];
105
+ return natives.some(rx => rx.test(type));
106
+ };
107
+ const fetchArrayInnerType = (type) => type.match(/Array<(.*?)>/);
108
+ // Generates the example test.ts file
109
+ const generateExampleTest = (contract, event, indexEvents, importTypes) => {
110
+ const entity = indexEvents ? String(event._alias) : 'ExampleEntity';
111
+ const eventInputs = event.inputs;
112
+ const eventName = event._alias;
113
+ return `
114
+ import { assert, describe, test, clearStore, beforeAll, afterAll } from "matchstick-as/assembly/index"
115
+ import { ${importTypes} } from "@graphprotocol/graph-ts"
116
+ import { ${entity} } from "../generated/schema"
117
+ import { ${indexEvents ? `${eventName} as ${eventName}Event` : eventName} } from "../generated/${contract}/${contract}"
118
+ import { handle${eventName} } from "../src/${gluegun_1.strings.kebabCase(contract)}"
119
+ import { create${eventName}Event } from "./${gluegun_1.strings.kebabCase(contract)}-utils"
120
+
121
+
122
+ // Tests structure (matchstick-as >=0.5.0)
123
+ // https://thegraph.com/docs/en/developer/matchstick/#tests-structure-0-5-0
124
+
125
+ describe("Describe entity assertions", () => {
126
+ beforeAll(() => {
127
+ ${generateArguments(eventInputs)}
128
+ let new${eventName}Event = create${eventName}Event(${eventInputs
129
+ .map((input, index) => input.name || `param${index}`)
130
+ .join(', ')});
131
+ handle${eventName}(new${eventName}Event)
132
+ })
133
+
134
+ afterAll(() => {
135
+ clearStore()
136
+ })
137
+
138
+ // For more test scenarios, see:
139
+ // https://thegraph.com/docs/en/developer/matchstick/#write-a-unit-test
140
+
141
+ test("${entity} created and stored", () => {
142
+ assert.entityCount('${entity}', 1)
143
+
144
+ // 0xa16081f360e3847006db660bae1c6d1b2e17ec2a is the default address used in newMockEvent() function
145
+ ${generateFieldsAssertions(entity, eventInputs, indexEvents)}
146
+
147
+ // More assert options:
148
+ // https://thegraph.com/docs/en/developer/matchstick/#asserts
149
+ })
150
+ })
151
+ `;
152
+ };
153
+ // Generates the utils helper file
154
+ const generateTestHelper = (contract, events, importTypes) => {
155
+ const eventsNames = events.map(event => event._alias);
156
+ return `
157
+ import { newMockEvent } from 'matchstick-as';
158
+ import { ethereum, ${importTypes} } from '@graphprotocol/graph-ts';
159
+ import { ${eventsNames.join(', ')} } from '../generated/${contract}/${contract}';
160
+
161
+ ${generateMockedEvents(events).join('\n')}`;
162
+ };
163
+ const generateMockedEvents = (events) => events.reduce((acc, event) => acc.concat(generateMockedEvent(event)), []);
164
+ const generateMockedEvent = (event) => {
165
+ const varName = `${gluegun_1.strings.camelCase(event._alias)}Event`;
166
+ const fnArgs = event.inputs.map((input, index) => `${input.name || `param${index}`}: ${(0, types_1.ascTypeForEthereum)(input.type)}`);
167
+ const ascToEth = event.inputs.map((input, index) => `${varName}.parameters.push(new ethereum.EventParam("${input.name || `param${index}`}", ${(0, types_1.ethereumFromAsc)(input.name || `param${index}`, input.type)}))`);
168
+ return `
169
+ export function create${event._alias}Event(${fnArgs.join(', ')}): ${event._alias} {
170
+ let ${varName} = changetype<${event._alias}>(newMockEvent());
171
+
172
+ ${varName}.parameters = new Array();
173
+
174
+ ${ascToEth.join('\n')}
175
+
176
+ return ${varName};
177
+ }
178
+ `;
179
+ };
package/dist/schema.js ADDED
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const fs_extra_1 = __importDefault(require("fs-extra"));
30
+ const graphql = __importStar(require("graphql/language"));
31
+ const immutable_1 = __importDefault(require("immutable"));
32
+ const schema_1 = __importDefault(require("./codegen/schema"));
33
+ class Schema {
34
+ filename;
35
+ document;
36
+ ast;
37
+ constructor(filename, document, ast) {
38
+ this.filename = filename;
39
+ this.document = document;
40
+ this.ast = ast;
41
+ this.filename = filename;
42
+ this.document = document;
43
+ this.ast = ast;
44
+ }
45
+ codeGenerator() {
46
+ return new schema_1.default(this);
47
+ }
48
+ static async load(filename) {
49
+ const document = await fs_extra_1.default.readFile(filename, 'utf-8');
50
+ const ast = graphql.parse(document);
51
+ return new Schema(filename, document, immutable_1.default.fromJS(ast));
52
+ }
53
+ }
54
+ exports.default = Schema;
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const path_1 = __importDefault(require("path"));
30
+ const fs_extra_1 = __importDefault(require("fs-extra"));
31
+ const graphql = __importStar(require("graphql/language"));
32
+ const immutable_1 = __importDefault(require("immutable"));
33
+ const yaml_1 = __importDefault(require("yaml"));
34
+ const types_1 = require("yaml/types");
35
+ const debug_1 = __importDefault(require("./debug"));
36
+ const validation = __importStar(require("./validation"));
37
+ const subgraphDebug = (0, debug_1.default)('graph-cli:subgraph');
38
+ const throwCombinedError = (filename, errors) => {
39
+ throw new Error(errors.reduce((msg, e) => `${msg}
40
+
41
+ Path: ${e.get('path').size === 0 ? '/' : e.get('path').join(' > ')}
42
+ ${e.get('message').split('\n').join('\n ')}`, `Error in ${path_1.default.relative(process.cwd(), filename)}:`));
43
+ };
44
+ const buildCombinedWarning = (filename, warnings) => warnings.size > 0
45
+ ? warnings.reduce((msg, w) => `${msg}
46
+
47
+ Path: ${w.get('path').size === 0 ? '/' : w.get('path').join(' > ')}
48
+ ${w.get('message').split('\n').join('\n ')}`, `Warnings in ${path_1.default.relative(process.cwd(), filename)}:`) + '\n'
49
+ : null;
50
+ class Subgraph {
51
+ static async validate(data, protocol, { resolveFile }) {
52
+ subgraphDebug(`Validating Subgraph with protocol "%s"`, protocol);
53
+ if (protocol.name == null) {
54
+ return immutable_1.default.fromJS([
55
+ {
56
+ path: [],
57
+ message: `Unable to determine for which protocol manifest file is built for. Ensure you have at least one 'dataSources' and/or 'templates' elements defined in your subgraph.`,
58
+ },
59
+ ]);
60
+ }
61
+ // Parse the default subgraph schema
62
+ const schema = graphql.parse(await fs_extra_1.default.readFile(path_1.default.join(__dirname, 'protocols', protocol.name, `manifest.graphql`), 'utf-8'));
63
+ // Obtain the root `SubgraphManifest` type from the schema
64
+ const rootType = schema.definitions.find(definition => {
65
+ // @ts-expect-error TODO: name field does not exist on definition, really?
66
+ return definition.name.value === 'SubgraphManifest';
67
+ });
68
+ // Validate the subgraph manifest using this schema
69
+ return validation.validateManifest(data, rootType, schema, protocol, { resolveFile });
70
+ }
71
+ static validateSchema(manifest, { resolveFile }) {
72
+ const filename = resolveFile(manifest.getIn(['schema', 'file']));
73
+ const validationErrors = validation.validateSchema(filename);
74
+ let errors;
75
+ if (validationErrors.size > 0) {
76
+ errors = validationErrors.groupBy(error => error.get('entity')).sort();
77
+ const msg = errors.reduce((msg, errors, entity) => {
78
+ errors = errors.groupBy((error) => error.get('directive'));
79
+ const inner_msgs = errors.reduce((msg, errors, directive) => {
80
+ return `${msg}${directive
81
+ ? `
82
+ ${directive}:`
83
+ : ''}
84
+ ${errors
85
+ .map(error => error.get('message').split('\n').join('\n '))
86
+ .map(msg => `${directive ? ' ' : ''}- ${msg}`)
87
+ .join('\n ')}`;
88
+ }, ``);
89
+ return `${msg}
90
+
91
+ ${entity}:${inner_msgs}`;
92
+ }, `Error in ${path_1.default.relative(process.cwd(), filename)}:`);
93
+ throw new Error(msg);
94
+ }
95
+ }
96
+ static validateRepository(manifest) {
97
+ const repository = manifest.get('repository');
98
+ return /^https:\/\/github\.com\/graphprotocol\/example-subgraphs?$/.test(repository)
99
+ ? immutable_1.default.List().push(immutable_1.default.fromJS({
100
+ path: ['repository'],
101
+ message: `\
102
+ The repository is still set to ${repository}.
103
+ Please replace it with a link to your subgraph source code.`,
104
+ }))
105
+ : immutable_1.default.List();
106
+ }
107
+ static validateDescription(manifest) {
108
+ // TODO: Maybe implement this in the future for each protocol example description
109
+ return manifest.get('description', '').startsWith('Gravatar for ')
110
+ ? immutable_1.default.List().push(immutable_1.default.fromJS({
111
+ path: ['description'],
112
+ message: `\
113
+ The description is still the one from the example subgraph.
114
+ Please update it to tell users more about your subgraph.`,
115
+ }))
116
+ : immutable_1.default.List();
117
+ }
118
+ static validateHandlers(manifest, protocol, protocolSubgraph) {
119
+ return manifest
120
+ .get('dataSources')
121
+ .filter((dataSource) => protocol.isValidKindName(dataSource.get('kind')))
122
+ .reduce((errors, dataSource, dataSourceIndex) => {
123
+ const path = ['dataSources', dataSourceIndex, 'mapping'];
124
+ const mapping = dataSource.get('mapping');
125
+ const handlerTypes = protocolSubgraph.handlerTypes();
126
+ subgraphDebug('Validating dataSource "%s" handlers with %d handlers types defined for protocol', dataSource.get('name'), handlerTypes.size);
127
+ if (handlerTypes.size == 0) {
128
+ return errors;
129
+ }
130
+ const areAllHandlersEmpty = handlerTypes
131
+ .map((handlerType) => mapping.get(handlerType, immutable_1.default.List()))
132
+ .every((handlers) => handlers.isEmpty());
133
+ const handlerNamesWithoutLast = handlerTypes.pop().join(', ');
134
+ return areAllHandlersEmpty
135
+ ? errors.push(immutable_1.default.fromJS({
136
+ path,
137
+ message: `\
138
+ Mapping has no ${handlerNamesWithoutLast} or ${handlerTypes.get(-1)}.
139
+ At least one such handler must be defined.`,
140
+ }))
141
+ : errors;
142
+ }, immutable_1.default.List());
143
+ }
144
+ static validateContractValues(manifest, protocol) {
145
+ if (!protocol.hasContract()) {
146
+ return immutable_1.default.List();
147
+ }
148
+ return validation.validateContractValues(manifest, protocol);
149
+ }
150
+ // Validate that data source names are unique, so they don't overwrite each other.
151
+ static validateUniqueDataSourceNames(manifest) {
152
+ const names = [];
153
+ return manifest
154
+ .get('dataSources')
155
+ .reduce((errors, dataSource, dataSourceIndex) => {
156
+ const path = ['dataSources', dataSourceIndex, 'name'];
157
+ const name = dataSource.get('name');
158
+ if (names.includes(name)) {
159
+ errors = errors.push(immutable_1.default.fromJS({
160
+ path,
161
+ message: `\
162
+ More than one data source named '${name}', data source names must be unique.`,
163
+ }));
164
+ }
165
+ names.push(name);
166
+ return errors;
167
+ }, immutable_1.default.List());
168
+ }
169
+ static validateUniqueTemplateNames(manifest) {
170
+ const names = [];
171
+ return manifest
172
+ .get('templates', immutable_1.default.List())
173
+ .reduce((errors, template, templateIndex) => {
174
+ const path = ['templates', templateIndex, 'name'];
175
+ const name = template.get('name');
176
+ if (names.includes(name)) {
177
+ errors = errors.push(immutable_1.default.fromJS({
178
+ path,
179
+ message: `\
180
+ More than one template named '${name}', template names must be unique.`,
181
+ }));
182
+ }
183
+ names.push(name);
184
+ return errors;
185
+ }, immutable_1.default.List());
186
+ }
187
+ static dump(manifest) {
188
+ types_1.strOptions.fold.lineWidth = 90;
189
+ // @ts-expect-error TODO: plain is the value behind the TS constant
190
+ types_1.strOptions.defaultType = 'PLAIN';
191
+ return yaml_1.default.stringify(manifest.toJS());
192
+ }
193
+ static async load(filename, { protocol, skipValidation } = {
194
+ skipValidation: false,
195
+ }) {
196
+ // Load and validate the manifest
197
+ let data = null;
198
+ let has_file_data_sources = false;
199
+ if (filename.match(/.js$/)) {
200
+ data = require(path_1.default.resolve(filename));
201
+ }
202
+ else {
203
+ const raw_data = await fs_extra_1.default.readFile(filename, 'utf-8');
204
+ has_file_data_sources = raw_data.includes('kind: file');
205
+ data = yaml_1.default.parse(raw_data);
206
+ }
207
+ // Helper to resolve files relative to the subgraph manifest
208
+ const resolveFile = maybeRelativeFile => path_1.default.resolve(path_1.default.dirname(filename), maybeRelativeFile);
209
+ // TODO: Validation for file data sources
210
+ if (!has_file_data_sources) {
211
+ const manifestErrors = await Subgraph.validate(data, protocol, { resolveFile });
212
+ if (manifestErrors.size > 0) {
213
+ throwCombinedError(filename, manifestErrors);
214
+ }
215
+ }
216
+ const manifest = immutable_1.default.fromJS(data);
217
+ // Validate the schema
218
+ Subgraph.validateSchema(manifest, { resolveFile });
219
+ // Perform other validations
220
+ const protocolSubgraph = protocol.getSubgraph({
221
+ manifest,
222
+ resolveFile,
223
+ });
224
+ const errors = skipValidation
225
+ ? immutable_1.default.List()
226
+ : immutable_1.default.List.of(...protocolSubgraph.validateManifest(), ...Subgraph.validateContractValues(manifest, protocol), ...Subgraph.validateUniqueDataSourceNames(manifest), ...Subgraph.validateUniqueTemplateNames(manifest), ...Subgraph.validateHandlers(manifest, protocol, protocolSubgraph));
227
+ if (errors.size > 0) {
228
+ throwCombinedError(filename, errors);
229
+ }
230
+ // Perform warning validations
231
+ const warnings = skipValidation
232
+ ? immutable_1.default.List()
233
+ : immutable_1.default.List.of(...Subgraph.validateRepository(manifest), ...Subgraph.validateDescription(manifest));
234
+ return {
235
+ result: manifest,
236
+ warning: warnings.size > 0 ? buildCombinedWarning(filename, warnings) : null,
237
+ };
238
+ }
239
+ static async write(manifest, filename) {
240
+ await fs_extra_1.default.writeFile(filename, Subgraph.dump(manifest));
241
+ }
242
+ }
243
+ exports.default = Subgraph;