From ca94b41ee559b6e2550a9323750f971195056f02 Mon Sep 17 00:00:00 2001 From: Durga Date: Wed, 22 Jul 2026 13:41:10 -0400 Subject: [PATCH] Bundle shopify-dev-tools with Shopify CLI Assisted-By: devx/22639ada-bb5c-40ca-975b-7d13753f1353 --- packages/cli/bin/bundle.js | 15 ++++++ packages/cli/bin/shopify-dev-tools-data.js | 30 ++++++++++++ .../cli/bin/shopify-dev-tools-data.test.js | 46 +++++++++++++++++++ packages/cli/package.json | 1 + packages/cli/project.json | 3 +- pnpm-lock.yaml | 3 ++ 6 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 packages/cli/bin/shopify-dev-tools-data.js create mode 100644 packages/cli/bin/shopify-dev-tools-data.test.js diff --git a/packages/cli/bin/bundle.js b/packages/cli/bin/bundle.js index 0e8463f6ef0..6fa67a97d25 100644 --- a/packages/cli/bin/bundle.js +++ b/packages/cli/bin/bundle.js @@ -11,6 +11,7 @@ import ShopifyStacktraceyPlugin from '../../../bin/bundling/esbuild-plugin-stack import ShopifyVSCodePlugin from '../../../bin/bundling/esbuild-plugin-vscode.js' import GraphiQLImportsPlugin from '../../../bin/bundling/esbuild-plugin-graphiql-imports.js' import CliKitDedupPlugin from '../../../bin/bundling/esbuild-plugin-dedup-cli-kit.js' +import {shopifyDevToolsDataPlugin} from './shopify-dev-tools-data.js' const require = createRequire(import.meta.url) @@ -39,6 +40,15 @@ const themeUpdaterDataPath = joinPath(themeUpdaterPath, '..', '..', 'data/*') const hydrogenPath = dirname(require.resolve('@shopify/cli-hydrogen/package.json')) const hydrogenAssets = joinPath(hydrogenPath, 'dist/assets/hydrogen/**/*') +const shopifyDevToolsDataPath = joinPath(process.cwd(), '../shopify-dev-tools/dist/data') +const shopifyDevToolsInternalApiIdsPath = joinPath( + process.cwd(), + '../shopify-dev-tools/src/internal/internal-api-ids.json', +) +const shopifyDevToolsInternalApiIds = Object.values( + JSON.parse(readFileSync(shopifyDevToolsInternalApiIdsPath, 'utf8')), +) + const commandEntryPoints = glob.sync('./src/cli/commands/**/*.ts', { ignore: ['**/*.test.ts', '**/*.d.ts'], }) @@ -109,6 +119,11 @@ esBuild({ GraphiQLImportsPlugin, ShopifyStacktraceyPlugin, CliKitDedupPlugin({require}), + shopifyDevToolsDataPlugin({ + sourceDataDirectory: shopifyDevToolsDataPath, + targetDataDirectory: joinPath(process.cwd(), 'dist/data'), + internalApiIds: shopifyDevToolsInternalApiIds, + }), copy({ // this is equal to process.cwd(), which means we use cwd path as base path to resolve `to` path // if not specified, this plugin uses ESBuild.build outdir/outfile options as base path. diff --git a/packages/cli/bin/shopify-dev-tools-data.js b/packages/cli/bin/shopify-dev-tools-data.js new file mode 100644 index 00000000000..790ba7cd85d --- /dev/null +++ b/packages/cli/bin/shopify-dev-tools-data.js @@ -0,0 +1,30 @@ +import {cpSync, mkdirSync, rmSync, statSync} from 'fs' +import {basename} from 'path' + +const shouldCopyDataPath = (sourcePath, internalApiIds) => { + const sourceName = basename(sourcePath) + + if (internalApiIds.some((apiId) => sourceName.includes(apiId))) return false + if (statSync(sourcePath).isDirectory()) return true + + return sourceName === 'supported-versions-schema.json' || sourceName === 'index.json' || sourceName.endsWith('.gz') +} + +export const copyShopifyDevToolsData = ({sourceDataDirectory, targetDataDirectory, internalApiIds}) => { + rmSync(targetDataDirectory, {recursive: true, force: true}) + mkdirSync(targetDataDirectory, {recursive: true}) + cpSync(sourceDataDirectory, targetDataDirectory, { + recursive: true, + filter: (sourcePath) => shouldCopyDataPath(sourcePath, internalApiIds), + }) +} + +export const shopifyDevToolsDataPlugin = ({sourceDataDirectory, targetDataDirectory, internalApiIds}) => ({ + name: 'copy-shopify-dev-tools-data', + setup(build) { + build.onEnd(({errors}) => { + if (errors.length > 0) return + copyShopifyDevToolsData({sourceDataDirectory, targetDataDirectory, internalApiIds}) + }) + }, +}) diff --git a/packages/cli/bin/shopify-dev-tools-data.test.js b/packages/cli/bin/shopify-dev-tools-data.test.js new file mode 100644 index 00000000000..2fc4044361e --- /dev/null +++ b/packages/cli/bin/shopify-dev-tools-data.test.js @@ -0,0 +1,46 @@ +import {existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync} from 'fs' +import {tmpdir} from 'os' +import {join} from 'path' + +// eslint-disable-next-line import-x/no-extraneous-dependencies +import {describe, expect, test} from 'vitest' + +import {copyShopifyDevToolsData} from './shopify-dev-tools-data.js' + +describe('copyShopifyDevToolsData', () => { + test('copies runtime data without raw or internal schemas', () => { + const temporaryDirectory = mkdtempSync(join(tmpdir(), 'shopify-dev-tools-data-')) + const sourceDataDirectory = join(temporaryDirectory, 'source') + const targetDataDirectory = join(temporaryDirectory, 'target') + + try { + mkdirSync(join(sourceDataDirectory, 'types', 'graphql'), {recursive: true}) + writeFileSync(join(sourceDataDirectory, 'supported-versions-schema.json'), '{}') + writeFileSync(join(sourceDataDirectory, 'admin_2026-07.json.gz'), 'public schema') + writeFileSync(join(sourceDataDirectory, 'admin_2026-07.json'), 'raw public schema') + writeFileSync(join(sourceDataDirectory, 'bourgeois_unstable.json.gz'), 'internal schema') + writeFileSync(join(sourceDataDirectory, 'types', 'index.json'), '{}') + writeFileSync(join(sourceDataDirectory, 'types', 'graphql', 'index.d.ts.gz'), 'type declarations') + writeFileSync(join(sourceDataDirectory, 'types', 'graphql', 'index.d.ts'), 'raw type declarations') + mkdirSync(targetDataDirectory, {recursive: true}) + writeFileSync(join(targetDataDirectory, 'stale.json.gz'), 'stale data') + + copyShopifyDevToolsData({ + sourceDataDirectory, + targetDataDirectory, + internalApiIds: ['bourgeois'], + }) + + expect(existsSync(join(targetDataDirectory, 'supported-versions-schema.json'))).toBe(true) + expect(existsSync(join(targetDataDirectory, 'admin_2026-07.json.gz'))).toBe(true) + expect(existsSync(join(targetDataDirectory, 'admin_2026-07.json'))).toBe(false) + expect(existsSync(join(targetDataDirectory, 'bourgeois_unstable.json.gz'))).toBe(false) + expect(existsSync(join(targetDataDirectory, 'types', 'index.json'))).toBe(true) + expect(existsSync(join(targetDataDirectory, 'types', 'graphql', 'index.d.ts.gz'))).toBe(true) + expect(existsSync(join(targetDataDirectory, 'types', 'graphql', 'index.d.ts'))).toBe(false) + expect(existsSync(join(targetDataDirectory, 'stale.json.gz'))).toBe(false) + } finally { + rmSync(temporaryDirectory, {recursive: true, force: true}) + } + }) +}) diff --git a/packages/cli/package.json b/packages/cli/package.json index 598d2ade186..b8054656c12 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -65,6 +65,7 @@ "@shopify/cli-kit": "4.5.0", "@shopify/plugin-cloudflare": "4.5.0", "@shopify/plugin-did-you-mean": "4.5.0", + "@shopify/shopify-dev-tools": "workspace:*", "@shopify/theme": "4.5.0", "@shopify/cli-hydrogen": "13.0.2", "@types/global-agent": "3.0.0", diff --git a/packages/cli/project.json b/packages/cli/project.json index 188763bf0ee..3c26929df6f 100644 --- a/packages/cli/project.json +++ b/packages/cli/project.json @@ -28,7 +28,8 @@ "build", "cli-kit:generate-version", "app:build", - "theme:build" + "theme:build", + "shopify-dev-tools:build" ], "options": { "command": "node bin/bundle", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3b2534ef75..53d9532801c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -334,6 +334,9 @@ importers: '@shopify/plugin-did-you-mean': specifier: 4.5.0 version: link:../plugin-did-you-mean + '@shopify/shopify-dev-tools': + specifier: workspace:* + version: link:../shopify-dev-tools '@shopify/store': specifier: 4.5.0 version: link:../store