@graphprotocol/graph-cli 0.37.2 → 0.37.3-alpha-20230110163550-d64bef6

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 (206) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/babel.config.js +3 -0
  3. package/dist/bin.js +6 -0
  4. package/dist/cli.js +32 -0
  5. package/dist/codegen/schema.js +250 -0
  6. package/dist/codegen/schema.test.js +458 -0
  7. package/dist/codegen/template.js +65 -0
  8. package/dist/codegen/types/conversions.js +359 -0
  9. package/dist/codegen/types/index.js +71 -0
  10. package/dist/codegen/types/index.test.js +563 -0
  11. package/dist/codegen/typescript.js +200 -0
  12. package/dist/codegen/util.js +46 -0
  13. package/dist/codegen/util.test.js +93 -0
  14. package/dist/command-helpers/abi.js +78 -0
  15. package/dist/command-helpers/auth.js +77 -0
  16. package/dist/command-helpers/compiler.js +66 -0
  17. package/dist/command-helpers/data-sources.js +29 -0
  18. package/dist/command-helpers/fs.js +9 -0
  19. package/dist/command-helpers/gluegun.js +49 -0
  20. package/dist/command-helpers/ipfs.js +5 -0
  21. package/dist/command-helpers/jsonrpc.js +29 -0
  22. package/dist/command-helpers/network.js +93 -0
  23. package/dist/command-helpers/network.test.js +86 -0
  24. package/dist/command-helpers/node.js +40 -0
  25. package/dist/command-helpers/scaffold.js +112 -0
  26. package/dist/command-helpers/spinner.js +84 -0
  27. package/dist/command-helpers/studio.js +13 -0
  28. package/dist/command-helpers/studio.test.js +41 -0
  29. package/dist/command-helpers/subgraph.js +24 -0
  30. package/dist/command-helpers/version.js +74 -0
  31. package/dist/command-helpers/version.test.js +179 -0
  32. package/dist/commands/add.js +190 -0
  33. package/dist/commands/auth.js +127 -0
  34. package/dist/commands/build.js +140 -0
  35. package/dist/commands/codegen.js +135 -0
  36. package/dist/commands/create.js +86 -0
  37. package/dist/commands/deploy.js +334 -0
  38. package/dist/commands/init.js +788 -0
  39. package/dist/commands/local.js +387 -0
  40. package/dist/commands/remove.js +86 -0
  41. package/dist/commands/test.js +295 -0
  42. package/dist/compiler/asc.js +83 -0
  43. package/dist/compiler/index.js +474 -0
  44. package/dist/debug.js +16 -0
  45. package/dist/migrations/mapping_api_version_0_0_1.js +78 -0
  46. package/dist/migrations/mapping_api_version_0_0_2.js +76 -0
  47. package/dist/migrations/mapping_api_version_0_0_3.js +78 -0
  48. package/dist/migrations/mapping_api_version_0_0_4.js +80 -0
  49. package/dist/migrations/mapping_api_version_0_0_5.js +80 -0
  50. package/dist/migrations/spec_version_0_0_2.js +49 -0
  51. package/dist/migrations/spec_version_0_0_3.js +54 -0
  52. package/dist/migrations/util/load-manifest.js +18 -0
  53. package/dist/migrations/util/versions.js +29 -0
  54. package/dist/migrations.js +56 -0
  55. package/dist/protocols/arweave/manifest.graphql +57 -0
  56. package/dist/protocols/arweave/scaffold/manifest.js +18 -0
  57. package/dist/protocols/arweave/scaffold/mapping.js +52 -0
  58. package/dist/protocols/arweave/subgraph.js +23 -0
  59. package/dist/protocols/cosmos/manifest.graphql +76 -0
  60. package/dist/protocols/cosmos/scaffold/manifest.js +15 -0
  61. package/dist/protocols/cosmos/scaffold/mapping.js +38 -0
  62. package/dist/protocols/cosmos/subgraph.js +25 -0
  63. package/dist/protocols/ethereum/abi.js +140 -0
  64. package/dist/protocols/ethereum/codegen/abi.js +451 -0
  65. package/dist/protocols/ethereum/codegen/abi.test.js +328 -0
  66. package/dist/protocols/ethereum/codegen/template.js +50 -0
  67. package/dist/protocols/ethereum/contract.js +20 -0
  68. package/dist/protocols/ethereum/manifest.graphql +94 -0
  69. package/dist/protocols/ethereum/scaffold/manifest.js +32 -0
  70. package/dist/protocols/ethereum/scaffold/mapping.js +65 -0
  71. package/dist/protocols/ethereum/subgraph.js +171 -0
  72. package/dist/protocols/ethereum/type-generator.js +125 -0
  73. package/dist/protocols/index.js +268 -0
  74. package/dist/protocols/ipfs/codegen/file_template.js +50 -0
  75. package/dist/protocols/near/contract.js +41 -0
  76. package/dist/protocols/near/manifest.graphql +64 -0
  77. package/dist/protocols/near/scaffold/manifest.js +16 -0
  78. package/dist/protocols/near/scaffold/mapping.js +38 -0
  79. package/dist/protocols/near/subgraph.js +20 -0
  80. package/dist/protocols/subgraph.js +2 -0
  81. package/dist/protocols/substreams/manifest.graphql +45 -0
  82. package/dist/protocols/substreams/scaffold/manifest.js +12 -0
  83. package/dist/protocols/substreams/subgraph.js +23 -0
  84. package/dist/scaffold/cosmos.test.js +83 -0
  85. package/dist/scaffold/ethereum.test.js +505 -0
  86. package/dist/scaffold/index.js +128 -0
  87. package/dist/scaffold/mapping.js +61 -0
  88. package/dist/scaffold/near.test.js +86 -0
  89. package/dist/scaffold/schema.js +83 -0
  90. package/dist/scaffold/tests.js +175 -0
  91. package/dist/schema.js +54 -0
  92. package/dist/subgraph.js +249 -0
  93. package/dist/type-generator.js +224 -0
  94. package/dist/validation/contract.js +46 -0
  95. package/dist/validation/index.js +8 -0
  96. package/dist/validation/manifest.js +271 -0
  97. package/dist/validation/schema.js +796 -0
  98. package/dist/validation/schema.test.js +35 -0
  99. package/dist/watcher.js +79 -0
  100. package/jest.config.js +1 -1
  101. package/package.json +16 -9
  102. package/{bin/graph → src/bin.ts} +2 -1
  103. package/src/cli.ts +36 -0
  104. package/src/codegen/schema.js +23 -22
  105. package/src/codegen/schema.test.js +33 -27
  106. package/src/codegen/{template.js → template.ts} +8 -6
  107. package/src/codegen/types/conversions.ts +382 -0
  108. package/src/codegen/types/index.js +4 -7
  109. package/src/codegen/types/index.test.js +10 -4
  110. package/src/codegen/{typescript.js → typescript.ts} +44 -26
  111. package/src/codegen/util.js +1 -1
  112. package/src/codegen/util.test.js +5 -2
  113. package/src/command-helpers/abi.js +46 -30
  114. package/src/command-helpers/auth.js +6 -9
  115. package/src/command-helpers/compiler.js +4 -6
  116. package/src/command-helpers/data-sources.js +8 -11
  117. package/src/command-helpers/fs.ts +5 -0
  118. package/src/command-helpers/gluegun.js +2 -4
  119. package/src/command-helpers/ipfs.ts +3 -0
  120. package/src/command-helpers/{jsonrpc.js → jsonrpc.ts} +11 -16
  121. package/src/command-helpers/network.js +58 -44
  122. package/src/command-helpers/network.test.js +23 -19
  123. package/src/command-helpers/node.js +3 -7
  124. package/src/command-helpers/scaffold.js +34 -25
  125. package/src/command-helpers/{spinner.js → spinner.ts} +10 -10
  126. package/src/command-helpers/studio.test.js +61 -30
  127. package/src/command-helpers/studio.ts +20 -0
  128. package/src/command-helpers/{subgraph.js → subgraph.ts} +6 -6
  129. package/src/command-helpers/version.js +11 -16
  130. package/src/command-helpers/version.test.js +111 -82
  131. package/src/commands/add.js +49 -35
  132. package/src/commands/auth.js +13 -25
  133. package/src/commands/build.js +9 -9
  134. package/src/commands/codegen.js +12 -12
  135. package/src/commands/create.js +22 -22
  136. package/src/commands/deploy.js +39 -34
  137. package/src/commands/init.js +21 -24
  138. package/src/commands/local.js +15 -14
  139. package/src/commands/remove.js +22 -22
  140. package/src/commands/test.js +86 -70
  141. package/src/compiler/{asc.js → asc.ts} +29 -16
  142. package/src/compiler/index.js +18 -18
  143. package/src/{debug.js → debug.ts} +2 -2
  144. package/src/migrations/mapping_api_version_0_0_1.js +7 -7
  145. package/src/migrations/mapping_api_version_0_0_2.js +5 -5
  146. package/src/migrations/mapping_api_version_0_0_3.js +7 -7
  147. package/src/migrations/mapping_api_version_0_0_4.js +7 -7
  148. package/src/migrations/mapping_api_version_0_0_5.js +7 -7
  149. package/src/migrations/spec_version_0_0_2.js +5 -5
  150. package/src/migrations/spec_version_0_0_3.js +5 -5
  151. package/src/migrations/util/load-manifest.js +6 -9
  152. package/src/migrations/util/versions.js +5 -10
  153. package/src/{migrations.js → migrations.ts} +14 -15
  154. package/src/protocols/arweave/scaffold/manifest.js +1 -4
  155. package/src/protocols/arweave/scaffold/mapping.js +1 -3
  156. package/src/protocols/arweave/subgraph.ts +22 -0
  157. package/src/protocols/cosmos/scaffold/manifest.js +1 -4
  158. package/src/protocols/cosmos/scaffold/mapping.js +1 -3
  159. package/src/protocols/cosmos/subgraph.js +2 -2
  160. package/src/protocols/ethereum/abi.js +7 -13
  161. package/src/protocols/ethereum/codegen/abi.js +219 -222
  162. package/src/protocols/ethereum/codegen/abi.test.js +6 -6
  163. package/src/protocols/ethereum/codegen/template.js +3 -5
  164. package/src/protocols/ethereum/contract.js +3 -2
  165. package/src/protocols/ethereum/scaffold/manifest.js +4 -7
  166. package/src/protocols/ethereum/scaffold/mapping.js +4 -11
  167. package/src/protocols/ethereum/subgraph.js +21 -20
  168. package/src/protocols/ethereum/type-generator.js +24 -30
  169. package/src/protocols/{index.js → index.ts} +65 -46
  170. package/src/protocols/ipfs/codegen/file_template.js +2 -2
  171. package/src/protocols/near/{contract.js → contract.ts} +16 -12
  172. package/src/protocols/near/scaffold/manifest.js +2 -5
  173. package/src/protocols/near/scaffold/mapping.js +1 -3
  174. package/src/protocols/near/subgraph.js +3 -6
  175. package/src/protocols/subgraph.ts +12 -0
  176. package/src/protocols/substreams/scaffold/{manifest.js → manifest.ts} +2 -7
  177. package/src/protocols/substreams/subgraph.ts +22 -0
  178. package/src/scaffold/cosmos.test.js +3 -3
  179. package/src/scaffold/ethereum.test.js +4 -4
  180. package/src/scaffold/index.js +7 -7
  181. package/src/scaffold/mapping.js +3 -3
  182. package/src/scaffold/near.test.js +3 -3
  183. package/src/scaffold/schema.js +4 -4
  184. package/src/scaffold/tests.js +72 -58
  185. package/src/schema.ts +26 -0
  186. package/src/{subgraph.js → subgraph.ts} +80 -60
  187. package/src/type-generator.js +20 -20
  188. package/src/validation/contract.js +2 -6
  189. package/src/validation/index.js +1 -1
  190. package/src/validation/manifest.js +24 -22
  191. package/src/validation/schema.test.js +1 -1
  192. package/src/validation/{schema.js → schema.ts} +268 -221
  193. package/src/{watcher.js → watcher.ts} +23 -12
  194. package/tests/cli/globalSetup.js +2 -2
  195. package/tests/cli/globalTeardown.js +2 -2
  196. package/tests/cli/init.test.js +2 -2
  197. package/tests/cli/util.js +7 -13
  198. package/tsconfig.json +18 -0
  199. package/src/cli.js +0 -38
  200. package/src/codegen/types/conversions.js +0 -329
  201. package/src/command-helpers/fs.js +0 -8
  202. package/src/command-helpers/ipfs.js +0 -6
  203. package/src/command-helpers/studio.js +0 -15
  204. package/src/protocols/arweave/subgraph.js +0 -20
  205. package/src/protocols/substreams/subgraph.js +0 -17
  206. package/src/schema.js +0 -23
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GENERATED_FILE_NOTE = exports.moduleImports = exports.nullableType = exports.param = exports.staticMethod = exports.method = exports.klassMember = exports.klass = exports.arrayType = exports.namedType = exports.ModuleImports = exports.ArrayType = exports.NullableType = exports.NamedType = exports.ClassMember = exports.Class = exports.StaticMethod = exports.Method = exports.Param = void 0;
4
+ class Param {
5
+ name;
6
+ type;
7
+ constructor(name, type) {
8
+ this.name = name;
9
+ this.type = type;
10
+ this.name = name;
11
+ this.type = type;
12
+ }
13
+ toString() {
14
+ return `${this.name}: ${this.type.toString()}`;
15
+ }
16
+ }
17
+ exports.Param = Param;
18
+ class Method {
19
+ name;
20
+ params;
21
+ returnType;
22
+ body;
23
+ constructor(name, params, returnType, body) {
24
+ this.name = name;
25
+ this.params = params;
26
+ this.returnType = returnType;
27
+ this.body = body;
28
+ this.name = name;
29
+ this.params = params || [];
30
+ this.returnType = returnType;
31
+ this.body = body || '';
32
+ }
33
+ toString() {
34
+ return `
35
+ ${this.name}(${this.params.map(param => param.toString()).join(', ')})${this.returnType ? `: ${this.returnType.toString()}` : ''} {${this.body}
36
+ }
37
+ `;
38
+ }
39
+ }
40
+ exports.Method = Method;
41
+ class StaticMethod {
42
+ name;
43
+ params;
44
+ returnType;
45
+ body;
46
+ constructor(name, params, returnType, body) {
47
+ this.name = name;
48
+ this.params = params;
49
+ this.returnType = returnType;
50
+ this.body = body;
51
+ this.name = name;
52
+ this.params = params || [];
53
+ this.returnType = returnType || 'void';
54
+ this.body = body || '';
55
+ }
56
+ toString() {
57
+ return `
58
+ static ${this.name}(${this.params.map(param => param.toString()).join(', ')})${this.returnType ? `: ${this.returnType.toString()}` : ''} {${this.body}
59
+ }
60
+ `;
61
+ }
62
+ }
63
+ exports.StaticMethod = StaticMethod;
64
+ class Class {
65
+ name;
66
+ extends;
67
+ methods;
68
+ members;
69
+ export;
70
+ constructor(name, options) {
71
+ this.name = name;
72
+ this.name = name;
73
+ this.extends = options.extends;
74
+ this.methods = [];
75
+ this.members = [];
76
+ this.export = options.export || false;
77
+ }
78
+ addMember(member) {
79
+ this.members.push(member);
80
+ }
81
+ addMethod(method) {
82
+ this.methods.push(method);
83
+ }
84
+ toString() {
85
+ return `
86
+ ${this.export ? 'export' : ''} class ${this.name}${this.extends ? ` extends ${this.extends}` : ''} {
87
+ ${this.members.map(member => member.toString()).join('\n')}
88
+ ${this.methods.map(method => method.toString()).join('')}
89
+ }
90
+ `;
91
+ }
92
+ }
93
+ exports.Class = Class;
94
+ class ClassMember {
95
+ name;
96
+ type;
97
+ constructor(name, type) {
98
+ this.name = name;
99
+ this.type = type;
100
+ this.name = name;
101
+ this.type = type;
102
+ }
103
+ toString() {
104
+ return ` ${this.name}: ${this.type.toString()}`;
105
+ }
106
+ }
107
+ exports.ClassMember = ClassMember;
108
+ class NamedType {
109
+ name;
110
+ constructor(name) {
111
+ this.name = name;
112
+ this.name = name;
113
+ }
114
+ toString() {
115
+ return this.name;
116
+ }
117
+ capitalize() {
118
+ this.name = this.name.charAt(0).toUpperCase() + this.name.slice(1);
119
+ return this;
120
+ }
121
+ isPrimitive() {
122
+ let primitives = [
123
+ 'boolean',
124
+ 'u8',
125
+ 'i8',
126
+ 'u16',
127
+ 'i16',
128
+ 'u32',
129
+ 'i32',
130
+ 'u64',
131
+ 'i64',
132
+ 'f32',
133
+ 'f64',
134
+ 'usize',
135
+ 'isize',
136
+ ];
137
+ return primitives.includes(this.name);
138
+ }
139
+ }
140
+ exports.NamedType = NamedType;
141
+ class ArrayType {
142
+ inner;
143
+ name;
144
+ constructor(inner) {
145
+ this.inner = inner;
146
+ this.inner = inner;
147
+ this.name = `Array<${inner.toString()}>`;
148
+ }
149
+ toString() {
150
+ return this.name;
151
+ }
152
+ }
153
+ exports.ArrayType = ArrayType;
154
+ class NullableType {
155
+ inner;
156
+ constructor(inner) {
157
+ this.inner = inner;
158
+ this.inner = inner;
159
+ }
160
+ toString() {
161
+ return `${this.inner.toString()} | null`;
162
+ }
163
+ }
164
+ exports.NullableType = NullableType;
165
+ class ModuleImports {
166
+ nameOrNames;
167
+ module;
168
+ constructor(nameOrNames, module) {
169
+ this.nameOrNames = nameOrNames;
170
+ this.module = module;
171
+ this.nameOrNames = nameOrNames;
172
+ this.module = module;
173
+ }
174
+ toString() {
175
+ return `import { ${typeof this.nameOrNames === 'string' ? this.nameOrNames : this.nameOrNames.join(',')} } from "${this.module}"`;
176
+ }
177
+ }
178
+ exports.ModuleImports = ModuleImports;
179
+ const namedType = (name) => new NamedType(name);
180
+ exports.namedType = namedType;
181
+ const arrayType = (name) => new ArrayType(name);
182
+ exports.arrayType = arrayType;
183
+ const param = (name, type) => new Param(name, type);
184
+ exports.param = param;
185
+ const method = (name, params, returnType, body) => new Method(name, params, returnType, body);
186
+ exports.method = method;
187
+ const staticMethod = (name, params, returnType, body) => new StaticMethod(name, params, returnType, body);
188
+ exports.staticMethod = staticMethod;
189
+ const klass = (name, options) => new Class(name, options);
190
+ exports.klass = klass;
191
+ const klassMember = (name, type) => new ClassMember(name, type);
192
+ exports.klassMember = klassMember;
193
+ const nullableType = (type) => new NullableType(type);
194
+ exports.nullableType = nullableType;
195
+ const moduleImports = (nameOrNames, module) => new ModuleImports(nameOrNames, module);
196
+ exports.moduleImports = moduleImports;
197
+ const GENERATED_FILE_NOTE = `
198
+ // THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
199
+ `;
200
+ exports.GENERATED_FILE_NOTE = GENERATED_FILE_NOTE;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unrollTuple = exports.isTupleMatrixType = exports.isTupleArrayType = exports.isTupleType = exports.disambiguateNames = exports.containsTupleType = void 0;
4
+ const disambiguateNames = ({ values, getName, setName }) => {
5
+ let collisionCounter = new Map();
6
+ return values.map((value, index) => {
7
+ let name = getName(value, index);
8
+ let counter = collisionCounter.get(name);
9
+ if (counter === undefined) {
10
+ collisionCounter.set(name, 1);
11
+ return setName(value, name);
12
+ }
13
+ else {
14
+ collisionCounter.set(name, counter + 1);
15
+ return setName(value, `${name}${counter}`);
16
+ }
17
+ });
18
+ };
19
+ exports.disambiguateNames = disambiguateNames;
20
+ const isTupleType = t => {
21
+ return t === 'tuple';
22
+ };
23
+ exports.isTupleType = isTupleType;
24
+ const containsTupleType = t => {
25
+ return isTupleType(t) || isTupleArrayType(t) || isTupleMatrixType(t);
26
+ };
27
+ exports.containsTupleType = containsTupleType;
28
+ const isTupleArrayType = t => {
29
+ return t.match(/^tuple\[([0-9]+)?\]$/);
30
+ };
31
+ exports.isTupleArrayType = isTupleArrayType;
32
+ const isTupleMatrixType = t => {
33
+ return t.match(/^tuple\[([0-9]+)?\]\[([0-9]+)?\]$/);
34
+ };
35
+ exports.isTupleMatrixType = isTupleMatrixType;
36
+ const unrollTuple = ({ path, index, value }) => value.components.reduce((acc, component, index) => {
37
+ let name = component.name || `value${index}`;
38
+ return acc.concat(component.type === 'tuple'
39
+ ? unrollTuple({
40
+ path: [...path, name],
41
+ index,
42
+ value: component,
43
+ })
44
+ : [{ path: [...path, name], type: component.type }]);
45
+ }, []);
46
+ exports.unrollTuple = unrollTuple;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const util_1 = require("./util");
4
+ describe('Codegen utilities', () => {
5
+ test('Name disambiguation', () => {
6
+ expect((0, util_1.disambiguateNames)({
7
+ values: ['a', 'b', 'c'],
8
+ getName: x => x,
9
+ setName: (x, name) => name,
10
+ })).toEqual(['a', 'b', 'c']);
11
+ expect((0, util_1.disambiguateNames)({
12
+ values: ['a', 'a', 'a'],
13
+ getName: x => x,
14
+ setName: (x, name) => name,
15
+ })).toEqual(['a', 'a1', 'a2']);
16
+ expect((0, util_1.disambiguateNames)({
17
+ values: [
18
+ { name: 'ExampleEvent', inputs: [] },
19
+ { name: 'ExampleEvent', inputs: [{ type: 'uint256' }] },
20
+ { name: 'ExampleEvent', inputs: [{ type: 'uint96' }] },
21
+ ],
22
+ getName: event => event.name,
23
+ setName: (event, name) => {
24
+ event.name = name;
25
+ return event;
26
+ },
27
+ })).toEqual([
28
+ { name: 'ExampleEvent', inputs: [] },
29
+ { name: 'ExampleEvent1', inputs: [{ type: 'uint256' }] },
30
+ { name: 'ExampleEvent2', inputs: [{ type: 'uint96' }] },
31
+ ]);
32
+ });
33
+ test('Tuple unrolling', () => {
34
+ expect((0, util_1.unrollTuple)({
35
+ value: { type: 'tuple', name: 'value', components: [] },
36
+ path: ['value'],
37
+ index: 0,
38
+ })).toEqual([]);
39
+ expect((0, util_1.unrollTuple)({
40
+ value: {
41
+ type: 'tuple',
42
+ name: 'value',
43
+ components: [{ name: 'a', type: 'string' }],
44
+ },
45
+ path: ['value'],
46
+ index: 0,
47
+ })).toEqual([{ path: ['value', 'a'], type: 'string' }]);
48
+ expect((0, util_1.unrollTuple)({
49
+ value: {
50
+ type: 'tuple',
51
+ name: 'value',
52
+ components: [
53
+ { name: 'a', type: 'string' },
54
+ { name: 'b', type: 'uint256' },
55
+ ],
56
+ },
57
+ path: ['value'],
58
+ index: 0,
59
+ })).toEqual([
60
+ { path: ['value', 'a'], type: 'string' },
61
+ { path: ['value', 'b'], type: 'uint256' },
62
+ ]);
63
+ expect((0, util_1.unrollTuple)({
64
+ value: {
65
+ type: 'tuple',
66
+ name: 'value',
67
+ components: [
68
+ { name: 'a', type: 'string' },
69
+ { name: 'b', type: 'uint256' },
70
+ {
71
+ name: 'c',
72
+ type: 'tuple',
73
+ components: [
74
+ { type: 'bytes32' },
75
+ {
76
+ name: 'd',
77
+ type: 'tuple',
78
+ components: [{ name: 'd1', type: 'uint72' }],
79
+ },
80
+ ],
81
+ },
82
+ ],
83
+ },
84
+ path: ['value'],
85
+ index: 1,
86
+ })).toEqual([
87
+ { path: ['value', 'a'], type: 'string' },
88
+ { path: ['value', 'b'], type: 'uint256' },
89
+ { path: ['value', 'c', 'value0'], type: 'bytes32' },
90
+ { path: ['value', 'c', 'd', 'd1'], type: 'uint72' },
91
+ ]);
92
+ });
93
+ });
@@ -0,0 +1,78 @@
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.loadAbiFromBlockScout = exports.loadAbiFromEtherscan = void 0;
7
+ const spinner_1 = require("./spinner");
8
+ const node_fetch_1 = __importDefault(require("node-fetch"));
9
+ const immutable_1 = __importDefault(require("immutable"));
10
+ const loadAbiFromEtherscan = async (ABI, network, address) => await (0, spinner_1.withSpinner)(`Fetching ABI from Etherscan`, `Failed to fetch ABI from Etherscan`, `Warnings while fetching ABI from Etherscan`, async (spinner) => {
11
+ const scanApiUrl = getEtherscanLikeAPIUrl(network);
12
+ let result = await (0, node_fetch_1.default)(`${scanApiUrl}?module=contract&action=getabi&address=${address}`);
13
+ let json = await result.json();
14
+ // Etherscan returns a JSON object that has a `status`, a `message` and
15
+ // a `result` field. The `status` is '0' in case of errors and '1' in
16
+ // case of success
17
+ if (json.status === '1') {
18
+ return new ABI('Contract', undefined, immutable_1.default.fromJS(JSON.parse(json.result)));
19
+ }
20
+ else {
21
+ throw new Error('ABI not found, try loading it from a local file');
22
+ }
23
+ });
24
+ exports.loadAbiFromEtherscan = loadAbiFromEtherscan;
25
+ const loadAbiFromBlockScout = async (ABI, network, address) => await (0, spinner_1.withSpinner)(`Fetching ABI from BlockScout`, `Failed to fetch ABI from BlockScout`, `Warnings while fetching ABI from BlockScout`, async (spinner) => {
26
+ let result = await (0, node_fetch_1.default)(`https://blockscout.com/${network.replace('-', '/')}/api?module=contract&action=getabi&address=${address}`);
27
+ let json = await result.json();
28
+ // BlockScout returns a JSON object that has a `status`, a `message` and
29
+ // a `result` field. The `status` is '0' in case of errors and '1' in
30
+ // case of success
31
+ if (json.status === '1') {
32
+ return new ABI('Contract', undefined, immutable_1.default.fromJS(JSON.parse(json.result)));
33
+ }
34
+ else {
35
+ throw new Error('ABI not found, try loading it from a local file');
36
+ }
37
+ });
38
+ exports.loadAbiFromBlockScout = loadAbiFromBlockScout;
39
+ const getEtherscanLikeAPIUrl = network => {
40
+ switch (network) {
41
+ case 'mainnet':
42
+ return `https://api.etherscan.io/api`;
43
+ case 'arbitrum-one':
44
+ return `https://api.arbiscan.io/api`;
45
+ case 'bsc':
46
+ return `https://api.bscscan.com/api`;
47
+ case 'matic':
48
+ return `https://api.polygonscan.com/api`;
49
+ case 'mumbai':
50
+ return `https://api-testnet.polygonscan.com/api`;
51
+ case 'aurora':
52
+ return `https://api.aurorascan.dev/api`;
53
+ case 'aurora-testnet':
54
+ return `https://api-testnet.aurorascan.dev/api`;
55
+ case 'optimism-kovan':
56
+ return `https://api-kovan-optimistic.etherscan.io/api`;
57
+ case 'optimism':
58
+ return `https://api-optimistic.etherscan.io/api`;
59
+ case 'moonbeam':
60
+ return `https://api-moonbeam.moonscan.io/api`;
61
+ case 'moonriver':
62
+ return `https://api-moonriver.moonscan.io/api`;
63
+ case 'mbase':
64
+ return `https://api-moonbase.moonscan.io/api`;
65
+ case 'avalanche':
66
+ return `https://api.snowtrace.io/api`;
67
+ case 'fuji':
68
+ return `https://api-testnet.snowtrace.io/api`;
69
+ case 'gnosis':
70
+ return `https://api.gnosisscan.io/api`;
71
+ case 'fantom':
72
+ return `https://api.ftmscan.com/api`;
73
+ case 'fantom-testnet':
74
+ return `https://api-testnet.ftmscan.com/api`;
75
+ default:
76
+ return `https://api-${network}.etherscan.io/api`;
77
+ }
78
+ };
@@ -0,0 +1,77 @@
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
+ exports.saveDeployKey = exports.identifyDeployKey = void 0;
30
+ const toolbox = __importStar(require("gluegun/toolbox"));
31
+ const node_1 = require("./node");
32
+ const fs_1 = __importDefault(require("fs"));
33
+ const path_1 = __importDefault(require("path"));
34
+ const homedir = require('os').homedir();
35
+ const CONFIG_PATH = path_1.default.join(homedir, '/.graph-cli.json');
36
+ const getConfig = () => {
37
+ let config;
38
+ try {
39
+ config = JSON.parse(fs_1.default.readFileSync(CONFIG_PATH));
40
+ }
41
+ catch {
42
+ config = {};
43
+ }
44
+ return config;
45
+ };
46
+ const identifyDeployKey = async (node, deployKey) => {
47
+ // Determine the deploy key to use, if any:
48
+ // - First try using --deploy-key, if provided
49
+ // - Then see if we have a deploy key set for the Graph node
50
+ if (deployKey !== undefined) {
51
+ return deployKey;
52
+ }
53
+ else {
54
+ try {
55
+ node = (0, node_1.normalizeNodeUrl)(node);
56
+ const config = getConfig();
57
+ return config[node];
58
+ }
59
+ catch (e) {
60
+ toolbox.print.warning(`Could not get deploy key: ${e.message}`);
61
+ toolbox.print.info(`Continuing without a deploy key\n`);
62
+ }
63
+ }
64
+ };
65
+ exports.identifyDeployKey = identifyDeployKey;
66
+ const saveDeployKey = async (node, deployKey) => {
67
+ try {
68
+ node = (0, node_1.normalizeNodeUrl)(node);
69
+ const config = getConfig();
70
+ config[node] = deployKey;
71
+ fs_1.default.writeFileSync(CONFIG_PATH, JSON.stringify(config));
72
+ }
73
+ catch (e) {
74
+ throw new Error(`Error storing deploy key: ${e.message}`);
75
+ }
76
+ };
77
+ exports.saveDeployKey = saveDeployKey;
@@ -0,0 +1,66 @@
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
+ exports.createCompiler = void 0;
30
+ const URL = require('url').URL;
31
+ const ipfs_http_client_1 = __importDefault(require("ipfs-http-client"));
32
+ const toolbox = __importStar(require("gluegun/toolbox"));
33
+ const compiler_1 = __importDefault(require("../compiler"));
34
+ // Helper function to construct a subgraph compiler
35
+ const createCompiler = (manifest, { ipfs, headers, outputDir, outputFormat, skipMigrations, blockIpfsMethods, protocol }) => {
36
+ // Parse the IPFS URL
37
+ let url;
38
+ try {
39
+ url = ipfs ? new URL(ipfs) : undefined;
40
+ }
41
+ catch (e) {
42
+ toolbox.print.error(`Invalid IPFS URL: ${ipfs}
43
+ The IPFS URL must be of the following format: http(s)://host[:port]/[path]`);
44
+ return null;
45
+ }
46
+ // Connect to the IPFS node (if a node address was provided)
47
+ ipfs = ipfs
48
+ ? (0, ipfs_http_client_1.default)({
49
+ protocol: url.protocol.replace(/[:]+$/, ''),
50
+ host: url.hostname,
51
+ port: url.port,
52
+ 'api-path': url.pathname.replace(/\/$/, '') + '/api/v0/',
53
+ headers,
54
+ })
55
+ : undefined;
56
+ return new compiler_1.default({
57
+ ipfs,
58
+ subgraphManifest: manifest,
59
+ outputDir: outputDir,
60
+ outputFormat: outputFormat,
61
+ skipMigrations,
62
+ blockIpfsMethods,
63
+ protocol,
64
+ });
65
+ };
66
+ exports.createCompiler = createCompiler;
@@ -0,0 +1,29 @@
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.fromManifest = exports.fromFilePath = void 0;
7
+ const immutable_1 = __importDefault(require("immutable"));
8
+ const load_manifest_1 = require("../migrations/util/load-manifest");
9
+ // Loads manifest from file path and returns all:
10
+ // - data sources
11
+ // - templates
12
+ // In a single list.
13
+ const fromFilePath = async (manifestPath) => {
14
+ const { dataSources = [], templates = [] } = await (0, load_manifest_1.loadManifest)(manifestPath);
15
+ return dataSources.concat(templates);
16
+ };
17
+ exports.fromFilePath = fromFilePath;
18
+ const extractDataSourceByType = (manifest, dataSourceType, protocol) => manifest
19
+ .get(dataSourceType, immutable_1.default.List())
20
+ .reduce((dataSources, dataSource, dataSourceIndex) => protocol.isValidKindName(dataSource.get('kind'))
21
+ ? dataSources.push(immutable_1.default.Map({ path: [dataSourceType, dataSourceIndex], dataSource }))
22
+ : dataSources, immutable_1.default.List());
23
+ // Extracts data sources and templates from a immutable manifest data structure
24
+ const fromManifest = (manifest, protocol) => {
25
+ const dataSources = extractDataSourceByType(manifest, 'dataSources', protocol);
26
+ const templates = extractDataSourceByType(manifest, 'templates', protocol);
27
+ return dataSources.concat(templates);
28
+ };
29
+ exports.fromManifest = fromManifest;
@@ -0,0 +1,9 @@
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.displayPath = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const displayPath = (p) => path_1.default.relative(process.cwd(), p);
9
+ exports.displayPath = displayPath;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fixParameters = void 0;
4
+ // Workaround for https://github.com/infinitered/gluegun/pull/464.
5
+ //
6
+ // There is currently no way in Gluegun to define command-line options
7
+ // that take no arguments (like `--watch`). As a consequence, boolean
8
+ // options like `--watch` will consume the immediately following argument,
9
+ // leading to confusing behavior.
10
+ //
11
+ // E.g. `graph deploy --watch subgraph/name
12
+ //
13
+ // Will result in
14
+ // ```
15
+ // toolbox.parameters.options === { watch: 'subgraph/name' }
16
+ // toolbox.parameters.first === undefined
17
+ // toolbox.parameters.array === []
18
+ // ```
19
+ // where what we really want is
20
+ // ```
21
+ // toolbox.parameters.options === { watch: true }
22
+ // toolbox.parameters.first = 'subgraph/name'
23
+ // toolbox.parameters.array = ['subgraph/name']
24
+ // ```
25
+ //
26
+ // The `fixParameters` function checks if any of the provided boolean
27
+ // options has a string value; if so, it pushes it to the front of the
28
+ // parameters array and returns the result of that.
29
+ //
30
+ const fixParameters = (parameters, booleanOptions) => {
31
+ let unexpectedStringOptions = Object.keys(booleanOptions)
32
+ .filter(key => typeof booleanOptions[key] === 'string')
33
+ .map(key => ({ key, value: booleanOptions[key] }));
34
+ let optionNames = unexpectedStringOptions
35
+ .map(({ key }) => `--` + key.replace(/([A-Z])/, '-$1').toLowerCase())
36
+ .join(', ');
37
+ if (unexpectedStringOptions.length > 1) {
38
+ throw new Error(`Unexpected value provided for one or more of ${optionNames}. See --help for more information.`);
39
+ }
40
+ else if (unexpectedStringOptions.length == 1) {
41
+ let params = parameters.array;
42
+ params.unshift(unexpectedStringOptions[0].value);
43
+ return params;
44
+ }
45
+ else {
46
+ return parameters.array;
47
+ }
48
+ };
49
+ exports.fixParameters = fixParameters;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_IPFS_URL = void 0;
4
+ const DEFAULT_IPFS_URL = 'https://api.thegraph.com/ipfs/';
5
+ exports.DEFAULT_IPFS_URL = DEFAULT_IPFS_URL;