@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.
- package/CHANGELOG.md +8 -0
- package/dist/bin.js +6 -0
- package/dist/cli.js +26 -0
- package/dist/codegen/schema.js +244 -0
- package/dist/codegen/schema.test.js +455 -0
- package/dist/codegen/template.js +66 -0
- package/dist/codegen/types/conversions.js +335 -0
- package/dist/codegen/types/index.js +71 -0
- package/dist/codegen/types/index.test.js +563 -0
- package/dist/codegen/typescript.js +200 -0
- package/dist/codegen/util.js +40 -0
- package/dist/codegen/util.test.js +93 -0
- package/dist/command-helpers/abi.js +76 -0
- package/dist/command-helpers/auth.js +76 -0
- package/dist/command-helpers/compiler.js +66 -0
- package/dist/command-helpers/data-sources.js +29 -0
- package/dist/command-helpers/fs.js +9 -0
- package/dist/command-helpers/gluegun.js +48 -0
- package/dist/command-helpers/ipfs.js +5 -0
- package/dist/command-helpers/jsonrpc.js +27 -0
- package/dist/command-helpers/network.js +90 -0
- package/dist/command-helpers/network.test.js +86 -0
- package/dist/command-helpers/node.js +40 -0
- package/dist/command-helpers/scaffold.js +110 -0
- package/dist/command-helpers/spinner.js +80 -0
- package/dist/command-helpers/studio.js +14 -0
- package/dist/command-helpers/studio.test.js +41 -0
- package/dist/command-helpers/subgraph.js +22 -0
- package/dist/command-helpers/version.js +66 -0
- package/dist/command-helpers/version.test.js +186 -0
- package/dist/commands/add.js +187 -0
- package/dist/commands/auth.js +122 -0
- package/dist/commands/build.js +136 -0
- package/dist/commands/codegen.js +128 -0
- package/dist/commands/create.js +94 -0
- package/dist/commands/deploy.js +335 -0
- package/dist/commands/init.js +800 -0
- package/dist/commands/local.js +380 -0
- package/dist/commands/remove.js +95 -0
- package/dist/commands/test.js +293 -0
- package/dist/compiler/asc.js +83 -0
- package/dist/compiler/index.js +466 -0
- package/dist/debug.js +16 -0
- package/dist/migrations/mapping_api_version_0_0_1.js +83 -0
- package/dist/migrations/mapping_api_version_0_0_2.js +83 -0
- package/dist/migrations/mapping_api_version_0_0_3.js +83 -0
- package/dist/migrations/mapping_api_version_0_0_4.js +85 -0
- package/dist/migrations/mapping_api_version_0_0_5.js +85 -0
- package/dist/migrations/spec_version_0_0_2.js +45 -0
- package/dist/migrations/spec_version_0_0_3.js +50 -0
- package/dist/migrations/util/load-manifest.js +16 -0
- package/dist/migrations/util/versions.js +28 -0
- package/dist/migrations.js +54 -0
- package/dist/protocols/arweave/manifest.graphql +57 -0
- package/dist/protocols/arweave/scaffold/manifest.js +18 -0
- package/dist/protocols/arweave/scaffold/mapping.js +52 -0
- package/dist/protocols/arweave/subgraph.js +23 -0
- package/dist/protocols/contract.js +2 -0
- package/dist/protocols/cosmos/manifest.graphql +76 -0
- package/dist/protocols/cosmos/scaffold/manifest.js +15 -0
- package/dist/protocols/cosmos/scaffold/mapping.js +38 -0
- package/dist/protocols/cosmos/subgraph.js +28 -0
- package/dist/protocols/ethereum/abi.js +138 -0
- package/dist/protocols/ethereum/codegen/abi.js +474 -0
- package/dist/protocols/ethereum/codegen/abi.test.js +325 -0
- package/dist/protocols/ethereum/codegen/template.js +52 -0
- package/dist/protocols/ethereum/contract.js +22 -0
- package/dist/protocols/ethereum/manifest.graphql +94 -0
- package/dist/protocols/ethereum/scaffold/manifest.js +32 -0
- package/dist/protocols/ethereum/scaffold/mapping.js +65 -0
- package/dist/protocols/ethereum/subgraph.js +172 -0
- package/dist/protocols/ethereum/type-generator.js +123 -0
- package/dist/protocols/index.js +266 -0
- package/dist/protocols/ipfs/codegen/file_template.js +53 -0
- package/dist/protocols/near/contract.js +41 -0
- package/dist/protocols/near/manifest.graphql +64 -0
- package/dist/protocols/near/scaffold/manifest.js +16 -0
- package/dist/protocols/near/scaffold/mapping.js +38 -0
- package/dist/protocols/near/subgraph.js +23 -0
- package/dist/protocols/subgraph.js +2 -0
- package/dist/protocols/substreams/manifest.graphql +45 -0
- package/dist/protocols/substreams/scaffold/manifest.js +12 -0
- package/dist/protocols/substreams/subgraph.js +23 -0
- package/dist/scaffold/cosmos.test.js +82 -0
- package/dist/scaffold/ethereum.test.js +496 -0
- package/dist/scaffold/index.js +133 -0
- package/dist/scaffold/mapping.js +57 -0
- package/dist/scaffold/near.test.js +85 -0
- package/dist/scaffold/schema.js +86 -0
- package/dist/scaffold/tests.js +179 -0
- package/dist/schema.js +54 -0
- package/dist/subgraph.js +243 -0
- package/dist/type-generator.js +225 -0
- package/dist/validation/contract.js +44 -0
- package/dist/validation/index.js +10 -0
- package/dist/validation/manifest.js +266 -0
- package/dist/validation/schema.js +768 -0
- package/dist/validation/schema.test.js +35 -0
- package/dist/watcher.js +79 -0
- 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
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;
|