@graphprotocol/graph-cli 0.38.1-alpha-20230208032550-ddc8362 → 0.38.1-alpha-20230208163101-9fe7a07

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @graphprotocol/graph-cli
2
2
 
3
- ## 0.38.1-alpha-20230208032550-ddc8362
3
+ ## 0.38.1-alpha-20230208163101-9fe7a07
4
4
 
5
5
  ### Patch Changes
6
6
 
@@ -1,122 +1,57 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const chalk_1 = __importDefault(require("chalk"));
3
+ const core_1 = require("@oclif/core");
7
4
  const auth_1 = require("../command-helpers/auth");
8
- const gluegun_1 = require("../command-helpers/gluegun");
9
5
  const node_1 = require("../command-helpers/node");
10
- const HELP = `
11
- ${chalk_1.default.bold('graph auth')} [options] ${chalk_1.default.bold('<node>')} ${chalk_1.default.bold('<deploy-key>')}
12
-
13
- ${chalk_1.default.dim('Options:')}
14
-
15
- --product <subgraph-studio|hosted-service>
16
- Selects the product for which to authenticate
17
- --studio Shortcut for --product subgraph-studio
18
- -h, --help Show usage information
19
- `;
20
- const processForm = async (toolbox, { product, studio, node, deployKey }) => {
21
- const questions = [
22
- {
23
- type: 'select',
24
- name: 'product',
25
- message: 'Product for which to initialize',
26
- choices: ['subgraph-studio', 'hosted-service'],
27
- skip: product === 'subgraph-studio' ||
28
- product === 'hosted-service' ||
29
- studio !== undefined ||
30
- node !== undefined,
31
- },
32
- {
33
- type: 'password',
34
- name: 'deployKey',
35
- message: 'Deploy key',
36
- skip: deployKey !== undefined,
37
- },
38
- ];
39
- try {
40
- const answers = await toolbox.prompt.ask(questions);
41
- return answers;
42
- }
43
- catch (e) {
44
- return undefined;
45
- }
46
- };
47
- exports.default = {
48
- description: 'Sets the deploy key to use when deploying to a Graph node',
49
- run: async (toolbox) => {
50
- // Obtain tools
51
- const { print } = toolbox;
52
- // Read CLI parameters
53
- const { product, studio, h, help } = toolbox.parameters.options;
54
- // Show help text if requested
55
- if (help || h) {
56
- print.info(HELP);
57
- return;
58
- }
59
- let firstParam, secondParam;
60
- try {
61
- [firstParam, secondParam] = (0, gluegun_1.fixParameters)(toolbox.parameters, {
62
- h,
63
- help,
64
- studio,
65
- });
66
- }
67
- catch (e) {
68
- print.error(e.message);
69
- process.exitCode = 1;
70
- return;
71
- }
6
+ class AuthCommand extends core_1.Command {
7
+ async run() {
8
+ const { args: { node: nodeOrDeployKey, 'deploy-key': deployKeyFlag }, flags: { product, studio }, } = await this.parse(AuthCommand);
72
9
  // if user specifies --product or --studio then deployKey is the first parameter
73
- let node;
74
- let deployKey;
10
+ let node = nodeOrDeployKey;
11
+ let deployKey = deployKeyFlag;
75
12
  if (product || studio) {
76
13
  ({ node } = (0, node_1.chooseNodeUrl)({ product, studio, node }));
77
- deployKey = firstParam;
78
- }
79
- else {
80
- node = firstParam;
81
- deployKey = secondParam;
14
+ deployKey = nodeOrDeployKey;
82
15
  }
83
- if (!node || !deployKey) {
84
- const inputs = await processForm(toolbox, {
85
- product,
86
- studio,
87
- node,
88
- deployKey,
89
- });
90
- if (inputs === undefined) {
91
- process.exit(1);
92
- }
93
- if (!node) {
94
- ({ node } = (0, node_1.chooseNodeUrl)({
95
- product: inputs.product,
96
- studio,
97
- node,
16
+ // eslint-disable-next-line -- prettier has problems with ||=
17
+ node =
18
+ node ||
19
+ (await core_1.ux.prompt('Which product to initialize?', {
20
+ required: true,
21
+ }));
22
+ // eslint-disable-next-line -- prettier has problems with ||=
23
+ deployKey =
24
+ deployKey ||
25
+ (await core_1.ux.prompt('What is the deploy key?', {
26
+ required: true,
27
+ type: 'mask',
98
28
  }));
99
- }
100
- deployKey || (deployKey = inputs.deployKey);
101
- }
102
- if (!deployKey) {
103
- print.error(`No deploy key provided`);
104
- print.info(HELP);
105
- process.exitCode = 1;
106
- return;
107
- }
108
29
  if (deployKey.length > 200) {
109
- print.error(`Deploy key must not exceed 200 characters`);
110
- process.exitCode = 1;
111
- return;
30
+ this.error('✖ Deploy key must not exceed 200 characters', { exit: 1 });
112
31
  }
32
+ core_1.ux.action.start(`Setting deploy key for "${node}"...`);
113
33
  try {
114
34
  await (0, auth_1.saveDeployKey)(node, deployKey);
115
- print.success(`Deploy key set for ${node}`);
35
+ core_1.ux.action.stop(`✔ Deploy key set for "${node}"!`);
116
36
  }
117
37
  catch (e) {
118
- print.error(e);
119
- process.exitCode = 1;
38
+ this.error(e);
120
39
  }
121
- },
40
+ }
41
+ }
42
+ exports.default = AuthCommand;
43
+ AuthCommand.description = 'Sets the deploy key to use when deploying to a Graph node.';
44
+ AuthCommand.args = {
45
+ node: core_1.Args.string(),
46
+ 'deploy-key': core_1.Args.string(),
47
+ };
48
+ AuthCommand.flags = {
49
+ product: core_1.Flags.string({
50
+ summary: 'Select a product for which to authenticate.',
51
+ options: ['subgraph-studio', 'hosted-service'],
52
+ }),
53
+ studio: core_1.Flags.boolean({
54
+ summary: 'Shortcut for "--product subgraph-studio".',
55
+ exclusive: ['product'],
56
+ }),
122
57
  };
@@ -7,77 +7,30 @@ const child_process_1 = require("child_process");
7
7
  const http_1 = __importDefault(require("http"));
8
8
  const net_1 = __importDefault(require("net"));
9
9
  const path_1 = __importDefault(require("path"));
10
- const chalk_1 = __importDefault(require("chalk"));
10
+ const core_1 = require("@oclif/core");
11
11
  const docker_compose_1 = __importDefault(require("docker-compose"));
12
+ const gluegun_1 = require("gluegun");
12
13
  const strip_ansi_1 = __importDefault(require("strip-ansi"));
13
14
  const tmp_promise_1 = __importDefault(require("tmp-promise"));
14
- const gluegun_1 = require("../command-helpers/gluegun");
15
15
  const spinner_1 = require("../command-helpers/spinner");
16
16
  // Clean up temporary files even when an uncaught exception occurs
17
17
  tmp_promise_1.default.setGracefulCleanup();
18
- const HELP = `
19
- ${chalk_1.default.bold('graph local')} [options] ${chalk_1.default.bold('<local-command>')}
20
-
21
- Options:
22
-
23
- -h, --help Show usage information
24
- --node-logs Print the Graph Node logs (optional)
25
- --ethereum-logs Print the Ethereum logs (optional)
26
- --compose-file <file> Custom Docker Compose file for additional services (optional)
27
- --node-image <image> Custom Graph Node image to test against (default: graphprotocol/graph-node:latest)
28
- --standalone-node <cmd> Use a standalone Graph Node outside Docker Compose (optional)
29
- --standalone-node-args Custom arguments to be passed to the standalone Graph Node (optional)
30
- --skip-wait-for-ipfs Don't wait for IPFS to be up at localhost:15001 (optional)
31
- --skip-wait-for-ethereum Don't wait for Ethereum to be up at localhost:18545 (optional)
32
- --skip-wait-for-postgres Don't wait for Postgres to be up at localhost:15432 (optional)
33
- --timeout Time to wait for service containers. (optional, defaults to 120000 milliseconds)
34
- `;
35
- exports.default = {
36
- description: 'Runs local tests against a Graph Node environment (using Ganache by default)',
37
- run: async (toolbox) => {
38
- // Obtain tools
39
- const { filesystem, print } = toolbox;
40
- // Parse CLI parameters
41
- let { composeFile, ethereumLogs, h, help, nodeImage, nodeLogs, skipWaitForEthereum, skipWaitForIpfs, skipWaitForPostgres, standaloneNode, standaloneNodeArgs, timeout, } = toolbox.parameters.options;
42
- // Support both short and long option variants
43
- help || (help = h);
44
- // Extract test command
45
- const params = (0, gluegun_1.fixParameters)(toolbox.parameters, {
46
- ethereumLogs,
47
- h,
48
- help,
49
- nodeLogs,
50
- skipWaitForEthereum,
51
- skipWaitForIpfs,
52
- skipWaitForPostgres,
53
- });
54
- // Show help text if requested
55
- if (help) {
56
- print.info(HELP);
57
- return;
58
- }
59
- if (params.length == 0) {
60
- print.error(`Test command not provided as the last argument`);
61
- process.exitCode = 1;
62
- return;
63
- }
64
- const testCommand = params[0];
18
+ class LocalCommand extends core_1.Command {
19
+ async run() {
20
+ const { args: { 'local-command': testCommand }, flags: { 'compose-file': composeFileFlag, 'ethereum-logs': ethereumLogsFlag, 'node-image': nodeImage, 'node-logs': nodeLogsFlag, 'skip-wait-for-etherium': skipWaitForEthereum, 'skip-wait-for-ipfs': skipWaitForIpfs, 'skip-wait-for-postgres': skipWaitForPostgres, 'standalone-node': standaloneNode, 'standalone-node-args': standaloneNodeArgs, timeout, }, } = await this.parse(LocalCommand);
65
21
  // Obtain the Docker Compose file for services that the tests run against
66
- composeFile || (composeFile = path_1.default.join(__dirname, '..', '..', 'resources', 'test', standaloneNode ? 'docker-compose-standalone-node.yml' : 'docker-compose.yml'));
67
- // parse timeout. Defaults to 120 seconds
68
- timeout = Math.abs(parseInt(timeout)) || 120000;
69
- if (!filesystem.exists(composeFile)) {
70
- print.error(`Docker Compose file \`${composeFile}\` not found`);
71
- process.exitCode = 1;
72
- return;
22
+ const composeFile = composeFileFlag ||
23
+ path_1.default.join(__dirname, '..', '..', 'resources', 'test', standaloneNode ? 'docker-compose-standalone-node.yml' : 'docker-compose.yml');
24
+ if (!gluegun_1.filesystem.exists(composeFile)) {
25
+ this.error(`Docker Compose file "${composeFile}" not found`, { exit: 1 });
73
26
  }
74
27
  // Create temporary directory to operate in
75
28
  const { path: tempdir } = await tmp_promise_1.default.dir({ prefix: 'graph-test', unsafeCleanup: true });
76
29
  try {
77
- await configureTestEnvironment(toolbox, tempdir, composeFile, nodeImage);
30
+ await configureTestEnvironment(tempdir, composeFile, nodeImage);
78
31
  }
79
32
  catch (e) {
80
- process.exitCode = 1;
33
+ this.exit(1);
81
34
  return;
82
35
  }
83
36
  // Bring up test environment
@@ -85,9 +38,7 @@ exports.default = {
85
38
  await startTestEnvironment(tempdir);
86
39
  }
87
40
  catch (e) {
88
- print.error(e);
89
- process.exitCode = 1;
90
- return;
41
+ this.error(e, { exit: 1 });
91
42
  }
92
43
  // Wait for test environment to come up
93
44
  try {
@@ -100,7 +51,7 @@ exports.default = {
100
51
  }
101
52
  catch (e) {
102
53
  await stopTestEnvironment(tempdir);
103
- process.exitCode = 1;
54
+ this.exit(1);
104
55
  return;
105
56
  }
106
57
  // Bring up Graph Node separately, if a standalone node is used
@@ -111,14 +62,13 @@ exports.default = {
111
62
  nodeProcess = await startGraphNode(standaloneNode, standaloneNodeArgs, nodeOutputChunks);
112
63
  }
113
64
  catch (e) {
114
- toolbox.print.error('');
115
- toolbox.print.error(' Graph Node');
116
- toolbox.print.error(' ----------');
117
- toolbox.print.error(indent(' ', Buffer.concat(nodeOutputChunks).toString('utf-8')));
118
- toolbox.print.error('');
119
65
  await stopTestEnvironment(tempdir);
120
- process.exitCode = 1;
121
- return;
66
+ let errorMessage = '\n';
67
+ errorMessage += ' Graph Node';
68
+ errorMessage += ' ----------';
69
+ errorMessage += indent(' ', Buffer.concat(nodeOutputChunks).toString('utf-8'));
70
+ errorMessage += '\n';
71
+ this.error(errorMessage, { exit: 1 });
122
72
  }
123
73
  }
124
74
  // Wait for Graph Node to come up
@@ -126,14 +76,13 @@ exports.default = {
126
76
  await waitForGraphNode(timeout);
127
77
  }
128
78
  catch (e) {
129
- toolbox.print.error('');
130
- toolbox.print.error(' Graph Node');
131
- toolbox.print.error(' ----------');
132
- toolbox.print.error(indent(' ', await collectGraphNodeLogs(tempdir, standaloneNode, nodeOutputChunks)));
133
- toolbox.print.error('');
134
79
  await stopTestEnvironment(tempdir);
135
- process.exitCode = 1;
136
- return;
80
+ let errorMessage = '\n';
81
+ errorMessage += ' Graph Node';
82
+ errorMessage += ' ----------';
83
+ errorMessage += indent(' ', await collectGraphNodeLogs(tempdir, standaloneNode, nodeOutputChunks));
84
+ errorMessage += '\n';
85
+ this.error(errorMessage, { exit: 1 });
137
86
  }
138
87
  // Run tests
139
88
  const result = await runTests(testCommand);
@@ -147,17 +96,16 @@ exports.default = {
147
96
  }
148
97
  }
149
98
  if (result.exitCode == 0) {
150
- toolbox.print.success('✔ Tests passed');
99
+ this.log('✔ Tests passed');
151
100
  }
152
101
  else {
153
- toolbox.print.error('✖ Tests failed');
102
+ this.log('✖ Tests failed');
154
103
  }
155
104
  // Capture logs
156
- nodeLogs =
157
- nodeLogs || result.exitCode !== 0
158
- ? await collectGraphNodeLogs(tempdir, standaloneNode, nodeOutputChunks)
159
- : undefined;
160
- ethereumLogs = ethereumLogs ? await collectEthereumLogs(tempdir) : undefined;
105
+ const nodeLogs = nodeLogsFlag || result.exitCode !== 0
106
+ ? await collectGraphNodeLogs(tempdir, standaloneNode, nodeOutputChunks)
107
+ : undefined;
108
+ const ethereumLogs = ethereumLogsFlag ? await collectEthereumLogs(tempdir) : undefined;
161
109
  // Bring down the test environment
162
110
  try {
163
111
  await stopTestEnvironment(tempdir);
@@ -166,28 +114,70 @@ exports.default = {
166
114
  // do nothing (the spinner already logs the problem)
167
115
  }
168
116
  if (nodeLogs) {
169
- toolbox.print.info('');
170
- toolbox.print.info(' Graph node');
171
- toolbox.print.info(' ----------');
172
- toolbox.print.info('');
173
- toolbox.print.info(indent(' ', nodeLogs));
117
+ this.log('');
118
+ this.log(' Graph node');
119
+ this.log(' ----------');
120
+ this.log('');
121
+ this.log(indent(' ', nodeLogs));
174
122
  }
175
123
  if (ethereumLogs) {
176
- toolbox.print.info('');
177
- toolbox.print.info(' Ethereum');
178
- toolbox.print.info(' --------');
179
- toolbox.print.info('');
180
- toolbox.print.info(indent(' ', ethereumLogs));
124
+ this.log('');
125
+ this.log(' Ethereum');
126
+ this.log(' --------');
127
+ this.log('');
128
+ this.log(indent(' ', ethereumLogs));
181
129
  }
182
130
  // Always print the test output
183
- toolbox.print.info('');
184
- toolbox.print.info(' Output');
185
- toolbox.print.info(' ------');
186
- toolbox.print.info('');
187
- toolbox.print.info(indent(' ', result.output));
131
+ this.log('');
132
+ this.log(' Output');
133
+ this.log(' ------');
134
+ this.log('');
135
+ this.log(indent(' ', result.output));
188
136
  // Propagate the exit code from the test run
189
- process.exitCode = result.exitCode;
190
- },
137
+ this.exit(result.exitCode);
138
+ }
139
+ }
140
+ exports.default = LocalCommand;
141
+ LocalCommand.description = 'Runs local tests against a Graph Node environment (using Ganache by default).';
142
+ LocalCommand.args = {
143
+ 'local-command': core_1.Args.string({
144
+ required: true,
145
+ }),
146
+ };
147
+ LocalCommand.flags = {
148
+ 'node-logs': core_1.Flags.boolean({
149
+ summary: 'Print the Graph Node logs.',
150
+ }),
151
+ 'ethereum-logs': core_1.Flags.boolean({
152
+ summary: 'Print the Ethereum logs.',
153
+ }),
154
+ 'compose-file': core_1.Flags.string({
155
+ summary: 'Custom Docker Compose file for additional services.',
156
+ }),
157
+ 'node-image': core_1.Flags.string({
158
+ summary: 'Custom Graph Node image to test against.',
159
+ default: 'graphprotocol/graph-node:latest',
160
+ }),
161
+ 'standalone-node': core_1.Flags.string({
162
+ summary: 'Use a standalone Graph Node outside Docker Compose.',
163
+ }),
164
+ 'standalone-node-args': core_1.Flags.string({
165
+ summary: 'Custom arguments to be passed to the standalone Graph Node.',
166
+ dependsOn: ['standalone-node'],
167
+ }),
168
+ 'skip-wait-for-ipfs': core_1.Flags.boolean({
169
+ summary: "Don't wait for IPFS to be up at localhost:15001",
170
+ }),
171
+ 'skip-wait-for-etherium': core_1.Flags.boolean({
172
+ summary: "Don't wait for Ethereum to be up at localhost:18545",
173
+ }),
174
+ 'skip-wait-for-postgres': core_1.Flags.boolean({
175
+ summary: "Don't wait for Postgres to be up at localhost:15432",
176
+ }),
177
+ timeout: core_1.Flags.integer({
178
+ summary: 'Time to wait for service containers in milliseconds.',
179
+ default: 120000,
180
+ }),
191
181
  };
192
182
  /**
193
183
  * Indents all lines of a string
@@ -198,14 +188,14 @@ const indent = (indentation, str) => str
198
188
  // Remove whitespace from empty lines
199
189
  .map(s => s.replace(/^\s+$/g, ''))
200
190
  .join('\n');
201
- const configureTestEnvironment = async (toolbox, tempdir, composeFile, nodeImage) => await (0, spinner_1.withSpinner)(`Configure test environment`, `Failed to configure test environment`, `Warnings configuring test environment`, async () => {
191
+ const configureTestEnvironment = async (tempdir, composeFile, nodeImage) => await (0, spinner_1.withSpinner)(`Configure test environment`, `Failed to configure test environment`, `Warnings configuring test environment`, async () => {
202
192
  // Temporary compose file
203
193
  const tempComposeFile = path_1.default.join(tempdir, 'compose', 'docker-compose.yml');
204
194
  // Copy the compose file to the temporary directory
205
- toolbox.filesystem.copy(composeFile, tempComposeFile);
195
+ gluegun_1.filesystem.copy(composeFile, tempComposeFile);
206
196
  // Substitute the graph-node image with the custom one, if appropriate
207
197
  if (nodeImage) {
208
- await toolbox.patching.replace(tempComposeFile, 'graphprotocol/graph-node:latest', nodeImage);
198
+ await gluegun_1.patching.replace(tempComposeFile, 'graphprotocol/graph-node:latest', nodeImage);
209
199
  }
210
200
  });
211
201
  const waitFor = async (timeout, testFn) => {
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.38.1-alpha-20230208032550-ddc8362",
2
+ "version": "0.38.1-alpha-20230208163101-9fe7a07",
3
3
  "commands": {
4
4
  "add": {
5
5
  "id": "add",
@@ -52,13 +52,41 @@
52
52
  },
53
53
  "auth": {
54
54
  "id": "auth",
55
- "description": "Sets the deploy key to use when deploying to a Graph node",
55
+ "description": "Sets the deploy key to use when deploying to a Graph node.",
56
+ "strict": true,
56
57
  "pluginName": "@graphprotocol/graph-cli",
57
58
  "pluginAlias": "@graphprotocol/graph-cli",
58
59
  "pluginType": "core",
59
60
  "aliases": [],
60
- "flags": {},
61
- "args": {}
61
+ "flags": {
62
+ "product": {
63
+ "name": "product",
64
+ "type": "option",
65
+ "summary": "Select a product for which to authenticate.",
66
+ "multiple": false,
67
+ "options": [
68
+ "subgraph-studio",
69
+ "hosted-service"
70
+ ]
71
+ },
72
+ "studio": {
73
+ "name": "studio",
74
+ "type": "boolean",
75
+ "summary": "Shortcut for \"--product subgraph-studio\".",
76
+ "allowNo": false,
77
+ "exclusive": [
78
+ "product"
79
+ ]
80
+ }
81
+ },
82
+ "args": {
83
+ "node": {
84
+ "name": "node"
85
+ },
86
+ "deploy-key": {
87
+ "name": "deploy-key"
88
+ }
89
+ }
62
90
  },
63
91
  "build": {
64
92
  "id": "build",
@@ -364,13 +392,85 @@
364
392
  },
365
393
  "local": {
366
394
  "id": "local",
367
- "description": "Runs local tests against a Graph Node environment (using Ganache by default)",
395
+ "description": "Runs local tests against a Graph Node environment (using Ganache by default).",
396
+ "strict": true,
368
397
  "pluginName": "@graphprotocol/graph-cli",
369
398
  "pluginAlias": "@graphprotocol/graph-cli",
370
399
  "pluginType": "core",
371
400
  "aliases": [],
372
- "flags": {},
373
- "args": {}
401
+ "flags": {
402
+ "node-logs": {
403
+ "name": "node-logs",
404
+ "type": "boolean",
405
+ "summary": "Print the Graph Node logs.",
406
+ "allowNo": false
407
+ },
408
+ "ethereum-logs": {
409
+ "name": "ethereum-logs",
410
+ "type": "boolean",
411
+ "summary": "Print the Ethereum logs.",
412
+ "allowNo": false
413
+ },
414
+ "compose-file": {
415
+ "name": "compose-file",
416
+ "type": "option",
417
+ "summary": "Custom Docker Compose file for additional services.",
418
+ "multiple": false
419
+ },
420
+ "node-image": {
421
+ "name": "node-image",
422
+ "type": "option",
423
+ "summary": "Custom Graph Node image to test against.",
424
+ "multiple": false,
425
+ "default": "graphprotocol/graph-node:latest"
426
+ },
427
+ "standalone-node": {
428
+ "name": "standalone-node",
429
+ "type": "option",
430
+ "summary": "Use a standalone Graph Node outside Docker Compose.",
431
+ "multiple": false
432
+ },
433
+ "standalone-node-args": {
434
+ "name": "standalone-node-args",
435
+ "type": "option",
436
+ "summary": "Custom arguments to be passed to the standalone Graph Node.",
437
+ "multiple": false,
438
+ "dependsOn": [
439
+ "standalone-node"
440
+ ]
441
+ },
442
+ "skip-wait-for-ipfs": {
443
+ "name": "skip-wait-for-ipfs",
444
+ "type": "boolean",
445
+ "summary": "Don't wait for IPFS to be up at localhost:15001",
446
+ "allowNo": false
447
+ },
448
+ "skip-wait-for-etherium": {
449
+ "name": "skip-wait-for-etherium",
450
+ "type": "boolean",
451
+ "summary": "Don't wait for Ethereum to be up at localhost:18545",
452
+ "allowNo": false
453
+ },
454
+ "skip-wait-for-postgres": {
455
+ "name": "skip-wait-for-postgres",
456
+ "type": "boolean",
457
+ "summary": "Don't wait for Postgres to be up at localhost:15432",
458
+ "allowNo": false
459
+ },
460
+ "timeout": {
461
+ "name": "timeout",
462
+ "type": "option",
463
+ "summary": "Time to wait for service containers in milliseconds.",
464
+ "multiple": false,
465
+ "default": 120000
466
+ }
467
+ },
468
+ "args": {
469
+ "local-command": {
470
+ "name": "local-command",
471
+ "required": true
472
+ }
473
+ }
374
474
  },
375
475
  "remove": {
376
476
  "id": "remove",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphprotocol/graph-cli",
3
- "version": "0.38.1-alpha-20230208032550-ddc8362",
3
+ "version": "0.38.1-alpha-20230208163101-9fe7a07",
4
4
  "description": "CLI for building for and deploying to The Graph",
5
5
  "license": "(Apache-2.0 OR MIT)",
6
6
  "engines": {