@graphprotocol/graph-cli 0.37.4 → 0.37.5

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 (100) 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/dist/protocols/arweave/manifest.graphql +57 -0
  55. package/dist/protocols/arweave/scaffold/manifest.js +18 -0
  56. package/dist/protocols/arweave/scaffold/mapping.js +52 -0
  57. package/dist/protocols/arweave/subgraph.js +23 -0
  58. package/dist/protocols/contract.js +2 -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 +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/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 +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/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 +23 -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 +82 -0
  85. package/dist/scaffold/ethereum.test.js +496 -0
  86. package/dist/scaffold/index.js +133 -0
  87. package/dist/scaffold/mapping.js +57 -0
  88. package/dist/scaffold/near.test.js +85 -0
  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 +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @graphprotocol/graph-cli
2
2
 
3
+ ## 0.37.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1035](https://github.com/graphprotocol/graph-cli/pull/1035)
8
+ [`d6fee92`](https://github.com/graphprotocol/graph-cli/commit/d6fee92d6de9b0addf9e24fd33e8820979f9f310)
9
+ Thanks [@enisdenjo](https://github.com/enisdenjo)! - Build before release
10
+
3
11
  ## 0.37.4
4
12
 
5
13
  ### Patch Changes
package/dist/bin.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ // run the CLI with the current process arguments
5
+ const cli_1 = require("./cli");
6
+ (0, cli_1.run)(process.argv);
package/dist/cli.js ADDED
@@ -0,0 +1,26 @@
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.run = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const gluegun_1 = require("gluegun");
9
+ const run = async (argv) => {
10
+ let builder = (0, gluegun_1.build)().brand('graph').src(__dirname);
11
+ const pluginDirs = [];
12
+ await Promise.all(['npm root -g', 'npm root', 'yarn global dir'].map(async (cmd) => {
13
+ try {
14
+ const dir = await gluegun_1.system.run(cmd, { trim: true });
15
+ pluginDirs.push(dir);
16
+ }
17
+ catch (_) {
18
+ // noop
19
+ }
20
+ }));
21
+ // Inject potential plugin directories
22
+ builder = pluginDirs.reduce((cli, dir) => cli.plugin(path_1.default.join(dir, '@graphprotocol', 'indexer-cli', 'dist')), builder);
23
+ const cli = builder.help().version().defaultCommand().create();
24
+ return await cli.run(argv);
25
+ };
26
+ exports.run = run;
@@ -0,0 +1,244 @@
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 immutable_1 = __importDefault(require("immutable"));
30
+ const typesCodegen = __importStar(require("./types"));
31
+ const tsCodegen = __importStar(require("./typescript"));
32
+ class IdField {
33
+ static BYTES = Symbol('Bytes');
34
+ static STRING = Symbol('String');
35
+ kind;
36
+ constructor(idField) {
37
+ const typeName = idField.getIn(['type', 'type', 'name', 'value']);
38
+ this.kind = typeName === 'Bytes' ? IdField.BYTES : IdField.STRING;
39
+ }
40
+ typeName() {
41
+ return this.kind === IdField.BYTES ? 'Bytes' : 'string';
42
+ }
43
+ gqlTypeName() {
44
+ return this.kind === IdField.BYTES ? 'Bytes' : 'String';
45
+ }
46
+ tsNamedType() {
47
+ return tsCodegen.namedType(this.typeName());
48
+ }
49
+ tsValueFrom() {
50
+ return this.kind === IdField.BYTES ? 'Value.fromBytes(id)' : 'Value.fromString(id)';
51
+ }
52
+ tsValueKind() {
53
+ return this.kind === IdField.BYTES ? 'ValueKind.BYTES' : 'ValueKind.STRING';
54
+ }
55
+ tsValueToString() {
56
+ return this.kind == IdField.BYTES ? 'id.toBytes().toHexString()' : 'id.toString()';
57
+ }
58
+ tsToString() {
59
+ return this.kind == IdField.BYTES ? 'id.toHexString()' : 'id';
60
+ }
61
+ static fromFields(fields) {
62
+ const idField = fields.find(field => field.getIn(['name', 'value']) === 'id');
63
+ return new IdField(idField);
64
+ }
65
+ static fromTypeDef(def) {
66
+ return IdField.fromFields(def.get('fields'));
67
+ }
68
+ }
69
+ class SchemaCodeGenerator {
70
+ schema;
71
+ constructor(schema) {
72
+ this.schema = schema;
73
+ this.schema = schema;
74
+ }
75
+ generateModuleImports() {
76
+ return [
77
+ tsCodegen.moduleImports([
78
+ // Base classes
79
+ 'TypedMap',
80
+ 'Entity',
81
+ 'Value',
82
+ 'ValueKind',
83
+ // APIs
84
+ 'store',
85
+ // Basic Scalar types
86
+ 'Bytes',
87
+ 'BigInt',
88
+ 'BigDecimal',
89
+ ], '@graphprotocol/graph-ts'),
90
+ ];
91
+ }
92
+ generateTypes() {
93
+ return this.schema.ast
94
+ .get('definitions')
95
+ .filter((def) => this._isEntityTypeDefinition(def))
96
+ .map((def) => this._generateEntityType(def));
97
+ }
98
+ _isEntityTypeDefinition(def) {
99
+ return (def.get('kind') === 'ObjectTypeDefinition' &&
100
+ def
101
+ .get('directives')
102
+ .find((directive) => directive.getIn(['name', 'value']) === 'entity') !== undefined);
103
+ }
104
+ _isInterfaceDefinition(def) {
105
+ return def.get('kind') === 'InterfaceTypeDefinition';
106
+ }
107
+ _generateEntityType(def) {
108
+ const name = def.getIn(['name', 'value']);
109
+ const klass = tsCodegen.klass(name, { export: true, extends: 'Entity' });
110
+ const fields = def.get('fields');
111
+ const idField = IdField.fromFields(fields);
112
+ // Generate and add a constructor
113
+ klass.addMethod(this._generateConstructor(name, fields));
114
+ // Generate and add save() and getById() methods
115
+ this._generateStoreMethods(name, idField).forEach(method => klass.addMethod(method));
116
+ // Generate and add entity field getters and setters
117
+ def
118
+ .get('fields')
119
+ .reduce((methods, field) => methods.concat(this._generateEntityFieldMethods(def, field)), immutable_1.default.List())
120
+ .forEach((method) => klass.addMethod(method));
121
+ return klass;
122
+ }
123
+ _generateConstructor(_entityName, fields) {
124
+ const idField = IdField.fromFields(fields);
125
+ return tsCodegen.method('constructor', [tsCodegen.param('id', idField.tsNamedType())], undefined, `
126
+ super()
127
+ this.set('id', ${idField.tsValueFrom()})
128
+ `);
129
+ }
130
+ _generateStoreMethods(entityName, idField) {
131
+ return immutable_1.default.List.of(tsCodegen.method('save', [], tsCodegen.namedType('void'), `
132
+ let id = this.get('id')
133
+ assert(id != null,
134
+ 'Cannot save ${entityName} entity without an ID')
135
+ if (id) {
136
+ assert(id.kind == ${idField.tsValueKind()},
137
+ \`Entities of type ${entityName} must have an ID of type ${idField.gqlTypeName()} but the id '\${id.displayData()}' is of type \${id.displayKind()}\`)
138
+ store.set('${entityName}', ${idField.tsValueToString()}, this)
139
+ }`), tsCodegen.staticMethod('load', [tsCodegen.param('id', tsCodegen.namedType(idField.typeName()))], tsCodegen.nullableType(tsCodegen.namedType(entityName)), `
140
+ return changetype<${entityName} | null>(store.get('${entityName}', ${idField.tsToString()}))
141
+ `));
142
+ }
143
+ _generateEntityFieldMethods(entityDef, fieldDef) {
144
+ return immutable_1.default.List([
145
+ this._generateEntityFieldGetter(entityDef, fieldDef),
146
+ this._generateEntityFieldSetter(entityDef, fieldDef),
147
+ ]);
148
+ }
149
+ _generateEntityFieldGetter(_entityDef, fieldDef) {
150
+ const name = fieldDef.getIn(['name', 'value']);
151
+ const gqlType = fieldDef.get('type');
152
+ const fieldValueType = this._valueTypeFromGraphQl(gqlType);
153
+ const returnType = this._typeFromGraphQl(gqlType);
154
+ const isNullable = returnType instanceof tsCodegen.NullableType;
155
+ const getNonNullable = `return ${typesCodegen.valueToAsc('value!', fieldValueType)}`;
156
+ const getNullable = `if (!value || value.kind == ValueKind.NULL) {
157
+ return null
158
+ } else {
159
+ return ${typesCodegen.valueToAsc('value', fieldValueType)}
160
+ }`;
161
+ return tsCodegen.method(`get ${name}`, [], returnType, `
162
+ let value = this.get('${name}')
163
+ ${isNullable ? getNullable : getNonNullable}
164
+ `);
165
+ }
166
+ _generateEntityFieldSetter(_entityDef, fieldDef) {
167
+ const name = fieldDef.getIn(['name', 'value']);
168
+ const gqlType = fieldDef.get('type');
169
+ const fieldValueType = this._valueTypeFromGraphQl(gqlType);
170
+ const paramType = this._typeFromGraphQl(gqlType);
171
+ const isNullable = paramType instanceof tsCodegen.NullableType;
172
+ const paramTypeString = isNullable ? paramType.inner.toString() : paramType.toString();
173
+ const isArray = paramType instanceof tsCodegen.ArrayType;
174
+ if (isArray && paramType.inner instanceof tsCodegen.NullableType) {
175
+ const baseType = this._baseType(gqlType);
176
+ throw new Error(`
177
+ GraphQL schema can't have List's with Nullable members.
178
+ Error in '${name}' field of type '[${baseType}]'.
179
+ Suggestion: add an '!' to the member type of the List, change from '[${baseType}]' to '[${baseType}!]'`);
180
+ }
181
+ const setNonNullable = `
182
+ this.set('${name}', ${typesCodegen.valueFromAsc(`value`, fieldValueType)})
183
+ `;
184
+ const setNullable = `
185
+ if (!value) {
186
+ this.unset('${name}')
187
+ } else {
188
+ this.set('${name}', ${typesCodegen.valueFromAsc(`<${paramTypeString}>value`, fieldValueType)})
189
+ }
190
+ `;
191
+ return tsCodegen.method(`set ${name}`, [tsCodegen.param('value', paramType)], undefined, isNullable ? setNullable : setNonNullable);
192
+ }
193
+ _resolveFieldType(gqlType) {
194
+ const typeName = gqlType.getIn(['name', 'value']);
195
+ // If this is a reference to another type, the field has the type of
196
+ // the referred type's id field
197
+ const typeDef = this.schema.ast
198
+ .get('definitions')
199
+ .find((def) => (this._isEntityTypeDefinition(def) || this._isInterfaceDefinition(def)) &&
200
+ def.getIn(['name', 'value']) === typeName);
201
+ if (typeDef) {
202
+ return IdField.fromTypeDef(typeDef).typeName();
203
+ }
204
+ return typeName;
205
+ }
206
+ /** Return the type that values for this field must have. For scalar
207
+ * types, that's the type from the subgraph schema. For references to
208
+ * other entity types, this is the same as the type of the id of the
209
+ * referred type, i.e., `string` or `Bytes`*/
210
+ _valueTypeFromGraphQl(gqlType) {
211
+ if (gqlType.get('kind') === 'NonNullType') {
212
+ return this._valueTypeFromGraphQl(gqlType.get('type'));
213
+ }
214
+ if (gqlType.get('kind') === 'ListType') {
215
+ return '[' + this._valueTypeFromGraphQl(gqlType.get('type')) + ']';
216
+ }
217
+ return this._resolveFieldType(gqlType);
218
+ }
219
+ /** Determine the base type of `gqlType` by removing any non-null
220
+ * constraints and using the type of elements of lists */
221
+ _baseType(gqlType) {
222
+ if (gqlType.get('kind') === 'NonNullType') {
223
+ return this._baseType(gqlType.get('type'));
224
+ }
225
+ if (gqlType.get('kind') === 'ListType') {
226
+ return this._baseType(gqlType.get('type'));
227
+ }
228
+ return gqlType.getIn(['name', 'value']);
229
+ }
230
+ _typeFromGraphQl(gqlType, nullable = true) {
231
+ if (gqlType.get('kind') === 'NonNullType') {
232
+ return this._typeFromGraphQl(gqlType.get('type'), false);
233
+ }
234
+ if (gqlType.get('kind') === 'ListType') {
235
+ const type = tsCodegen.arrayType(this._typeFromGraphQl(gqlType.get('type')));
236
+ return nullable ? tsCodegen.nullableType(type) : type;
237
+ }
238
+ // NamedType
239
+ const type = tsCodegen.namedType(typesCodegen.ascTypeForValue(this._resolveFieldType(gqlType)));
240
+ // In AssemblyScript, primitives cannot be nullable.
241
+ return nullable && !type.isPrimitive() ? tsCodegen.nullableType(type) : type;
242
+ }
243
+ }
244
+ exports.default = SchemaCodeGenerator;