From b2ed0a3ae651387faa622abe8439371329af6732 Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Wed, 15 Jan 2025 12:37:29 -0500 Subject: [PATCH 1/4] Fix `import.meta.url` not being parsed as path properly Using `import.meta.url` to resolve local file path and directories can lead to issues when special characters are percent-encoded in the url. This fix uses the `fileURLToPath` native method to properly parse local urls to file paths. --- packages/cli/src/command-helpers/network.test.ts | 3 ++- packages/cli/src/commands/local.ts | 3 ++- packages/cli/src/subgraph.ts | 3 ++- packages/cli/src/version.ts | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/command-helpers/network.test.ts b/packages/cli/src/command-helpers/network.test.ts index 8edcc6a84..7441c8b35 100644 --- a/packages/cli/src/command-helpers/network.test.ts +++ b/packages/cli/src/command-helpers/network.test.ts @@ -1,11 +1,12 @@ import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import * as toolbox from 'gluegun'; import { afterAll, beforeAll, describe, expect, test } from 'vitest'; import yaml from 'yaml'; import { initNetworksConfig, updateSubgraphNetwork } from './network.js'; const SUBGRAPH_PATH_BASE = path.join( - `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(import.meta.url)![1]}`, + `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(fileURLToPath(import.meta.url))![1]}`, '..', '..', '..', diff --git a/packages/cli/src/commands/local.ts b/packages/cli/src/commands/local.ts index 6551de54e..eb19d1f82 100644 --- a/packages/cli/src/commands/local.ts +++ b/packages/cli/src/commands/local.ts @@ -2,6 +2,7 @@ import { ChildProcess, spawn } from 'node:child_process'; import http from 'node:http'; import net from 'node:net'; import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import compose from 'docker-compose'; import { filesystem, patching } from 'gluegun'; import stripAnsi from 'strip-ansi'; @@ -94,7 +95,7 @@ export default class LocalCommand extends Command { composeFileFlag || path.join( `${process.platform === 'win32' ? '' : '/'}${ - /file:\/{2,3}(.+)\/[^/]/.exec(import.meta.url)![1] + /file:\/{2,3}(.+)\/[^/]/.exec(fileURLToPath(import.meta.url))![1] }`, '..', '..', diff --git a/packages/cli/src/subgraph.ts b/packages/cli/src/subgraph.ts index cdd59cffa..39bec0ff4 100644 --- a/packages/cli/src/subgraph.ts +++ b/packages/cli/src/subgraph.ts @@ -1,4 +1,5 @@ import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import fs from 'fs-extra'; import * as graphql from 'graphql/language/index.js'; import immutable from 'immutable'; @@ -53,7 +54,7 @@ export default class Subgraph { const schema = graphql.parse( await fs.readFile( path.join( - `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(import.meta.url)![1]}`, + `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(fileURLToPath(import.meta.url))![1]}`, 'protocols', // TODO: substreams/triggers is a special case, should be handled better protocol.name === 'substreams/triggers' ? 'substreams' : protocol.name, diff --git a/packages/cli/src/version.ts b/packages/cli/src/version.ts index 26971c752..b4f6426da 100644 --- a/packages/cli/src/version.ts +++ b/packages/cli/src/version.ts @@ -1,12 +1,13 @@ import fs from 'node:fs'; import path from 'node:path'; +import { fileURLToPath } from 'node:url'; const packageJson = JSON.parse( fs .readFileSync( // works even when bundled/built because the path to package.json is the same path.join( - `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(import.meta.url)![1]}`, + `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(fileURLToPath(import.meta.url))![1]}`, '..', 'package.json', ), From c612aab88d0bd6864d73ecc1f87f3ab5eb6683fd Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Wed, 15 Jan 2025 12:39:49 -0500 Subject: [PATCH 2/4] Add changeset --- .changeset/flat-spiders-grin.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/flat-spiders-grin.md diff --git a/.changeset/flat-spiders-grin.md b/.changeset/flat-spiders-grin.md new file mode 100644 index 000000000..4459ba58f --- /dev/null +++ b/.changeset/flat-spiders-grin.md @@ -0,0 +1,5 @@ +--- +'@graphprotocol/graph-cli': patch +--- + +Fix `import.meta.url` not being parsed as path properly From 9e36d8e9886d52167d7dc501799eacbca2c06ef4 Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Wed, 15 Jan 2025 14:56:17 -0500 Subject: [PATCH 3/4] Remove regex and adjust path --- packages/cli/src/command-helpers/network.test.ts | 3 ++- packages/cli/src/commands/local.ts | 5 ++--- packages/cli/src/subgraph.ts | 3 ++- packages/cli/src/version.ts | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/command-helpers/network.test.ts b/packages/cli/src/command-helpers/network.test.ts index 7441c8b35..9d7cfc4d3 100644 --- a/packages/cli/src/command-helpers/network.test.ts +++ b/packages/cli/src/command-helpers/network.test.ts @@ -6,7 +6,8 @@ import yaml from 'yaml'; import { initNetworksConfig, updateSubgraphNetwork } from './network.js'; const SUBGRAPH_PATH_BASE = path.join( - `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(fileURLToPath(import.meta.url))![1]}`, + `${process.platform === 'win32' ? '' : '/'}${fileURLToPath(import.meta.url)}`, + '..', '..', '..', '..', diff --git a/packages/cli/src/commands/local.ts b/packages/cli/src/commands/local.ts index eb19d1f82..7cc96197d 100644 --- a/packages/cli/src/commands/local.ts +++ b/packages/cli/src/commands/local.ts @@ -94,9 +94,8 @@ export default class LocalCommand extends Command { const composeFile = composeFileFlag || path.join( - `${process.platform === 'win32' ? '' : '/'}${ - /file:\/{2,3}(.+)\/[^/]/.exec(fileURLToPath(import.meta.url))![1] - }`, + `${process.platform === 'win32' ? '' : '/'}${fileURLToPath(import.meta.url)}`, + '..', '..', '..', 'resources', diff --git a/packages/cli/src/subgraph.ts b/packages/cli/src/subgraph.ts index 39bec0ff4..d36761b65 100644 --- a/packages/cli/src/subgraph.ts +++ b/packages/cli/src/subgraph.ts @@ -54,7 +54,8 @@ export default class Subgraph { const schema = graphql.parse( await fs.readFile( path.join( - `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(fileURLToPath(import.meta.url))![1]}`, + `${process.platform === 'win32' ? '' : '/'}${fileURLToPath(import.meta.url)}`, + '..', 'protocols', // TODO: substreams/triggers is a special case, should be handled better protocol.name === 'substreams/triggers' ? 'substreams' : protocol.name, diff --git a/packages/cli/src/version.ts b/packages/cli/src/version.ts index b4f6426da..27932ee86 100644 --- a/packages/cli/src/version.ts +++ b/packages/cli/src/version.ts @@ -7,7 +7,8 @@ const packageJson = JSON.parse( .readFileSync( // works even when bundled/built because the path to package.json is the same path.join( - `${process.platform === 'win32' ? '' : '/'}${/file:\/{2,3}(.+)\/[^/]/.exec(fileURLToPath(import.meta.url))![1]}`, + `${process.platform === 'win32' ? '' : '/'}${fileURLToPath(import.meta.url)}`, + '..', '..', 'package.json', ), From 85e72bb2ff8700cae4f454d21af4bc6d2323af23 Mon Sep 17 00:00:00 2001 From: YaroShkvorets Date: Thu, 16 Jan 2025 16:12:26 -0500 Subject: [PATCH 4/4] remove unnecessary platform check --- packages/cli/src/command-helpers/network.test.ts | 2 +- packages/cli/src/commands/local.ts | 2 +- packages/cli/src/subgraph.ts | 2 +- packages/cli/src/version.ts | 7 +------ 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/command-helpers/network.test.ts b/packages/cli/src/command-helpers/network.test.ts index 9d7cfc4d3..bc222be9c 100644 --- a/packages/cli/src/command-helpers/network.test.ts +++ b/packages/cli/src/command-helpers/network.test.ts @@ -6,7 +6,7 @@ import yaml from 'yaml'; import { initNetworksConfig, updateSubgraphNetwork } from './network.js'; const SUBGRAPH_PATH_BASE = path.join( - `${process.platform === 'win32' ? '' : '/'}${fileURLToPath(import.meta.url)}`, + fileURLToPath(import.meta.url), '..', '..', '..', diff --git a/packages/cli/src/commands/local.ts b/packages/cli/src/commands/local.ts index 7cc96197d..b9bd3b8db 100644 --- a/packages/cli/src/commands/local.ts +++ b/packages/cli/src/commands/local.ts @@ -94,7 +94,7 @@ export default class LocalCommand extends Command { const composeFile = composeFileFlag || path.join( - `${process.platform === 'win32' ? '' : '/'}${fileURLToPath(import.meta.url)}`, + fileURLToPath(import.meta.url), '..', '..', '..', diff --git a/packages/cli/src/subgraph.ts b/packages/cli/src/subgraph.ts index d36761b65..93b84fcf4 100644 --- a/packages/cli/src/subgraph.ts +++ b/packages/cli/src/subgraph.ts @@ -54,7 +54,7 @@ export default class Subgraph { const schema = graphql.parse( await fs.readFile( path.join( - `${process.platform === 'win32' ? '' : '/'}${fileURLToPath(import.meta.url)}`, + fileURLToPath(import.meta.url), '..', 'protocols', // TODO: substreams/triggers is a special case, should be handled better diff --git a/packages/cli/src/version.ts b/packages/cli/src/version.ts index 27932ee86..e9fee6872 100644 --- a/packages/cli/src/version.ts +++ b/packages/cli/src/version.ts @@ -6,12 +6,7 @@ const packageJson = JSON.parse( fs .readFileSync( // works even when bundled/built because the path to package.json is the same - path.join( - `${process.platform === 'win32' ? '' : '/'}${fileURLToPath(import.meta.url)}`, - '..', - '..', - 'package.json', - ), + path.join(fileURLToPath(import.meta.url), '..', '..', 'package.json'), ) .toString(), );