@shopify/cli-hydrogen 3.0.16 → 3.0.19

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,5 +1,37 @@
1
1
  # @shopify/cli-hydrogen
2
2
 
3
+ ## 3.0.19
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [d73ea66a]
8
+ - Updated dependencies [45866b2a]
9
+ - Updated dependencies [3c9519fa]
10
+ - Updated dependencies [0550cb31]
11
+ - Updated dependencies [fd254893]
12
+ - Updated dependencies [cc4c0151]
13
+ - @shopify/cli-kit@3.0.19
14
+
15
+ ## 3.0.18
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies [84438079]
20
+ - Updated dependencies [fa518a0d]
21
+ - Updated dependencies [fd10fc01]
22
+ - Updated dependencies [0243890b]
23
+ - Updated dependencies [cb1caa7c]
24
+ - @shopify/cli-kit@3.0.18
25
+
26
+ ## 3.0.17
27
+
28
+ ### Patch Changes
29
+
30
+ - 64d4b6a8: Report Vite errors as aborts to not get them reported to Bugsnag
31
+ - Updated dependencies [df0d0347]
32
+ - Updated dependencies [6657a57c]
33
+ - @shopify/cli-kit@3.0.17
34
+
3
35
  ## 3.0.16
4
36
 
5
37
  ### Patch Changes
@@ -1,9 +1,11 @@
1
1
  import { h as hydrogenFlags } from '../../../flags-39d1e3c2.js';
2
- import { g as genericConfigurationFileNames, l as load } from '../../../hydrogen-9efd5ae6.js';
2
+ import { g as genericConfigurationFileNames, l as load } from '../../../hydrogen-21276a42.js';
3
3
  import { ui, dependency, path, file, error, npm, vscode, cli } from '@shopify/cli-kit';
4
4
  import stream from 'node:stream';
5
5
  import { Flags, Command } from '@oclif/core';
6
6
  import 'vite';
7
+ import 'path';
8
+ import 'fs';
7
9
 
8
10
  async function addESLint({ app, force, install }) {
9
11
  const list = new ui.Listr([
@@ -12,7 +14,7 @@ async function addESLint({ app, force, install }) {
12
14
  skip: () => !install,
13
15
  task: async (_, task) => {
14
16
  const requiredDependencies = ["eslint", "eslint-plugin-hydrogen", "prettier", "@shopify/prettier-config"];
15
- await dependency.addNPMDependenciesIfNeeded(requiredDependencies, {
17
+ await dependency.addNPMDependenciesWithoutVersionIfNeeded(requiredDependencies, {
16
18
  dependencyManager: app.dependencyManager,
17
19
  type: "prod",
18
20
  directory: app.directory,
@@ -1 +1 @@
1
- {"version":3,"file":"eslint.js","sources":["../../../../src/cli/services/eslint.ts","../../../../src/cli/commands/hydrogen/add/eslint.ts"],"sourcesContent":["import {HydrogenApp} from '../models/hydrogen'\nimport {genericConfigurationFileNames} from '../constants'\nimport {ui, vscode, npm, file, dependency, path, error} from '@shopify/cli-kit'\nimport stream from 'node:stream'\n\ninterface AddESlintOptions {\n app: HydrogenApp\n force: boolean\n install: boolean\n}\n\nexport async function addESLint({app, force, install}: AddESlintOptions) {\n const list = new ui.Listr([\n {\n title: 'Installing additional dependencies',\n skip: () => !install,\n task: async (_, task) => {\n const requiredDependencies = ['eslint', 'eslint-plugin-hydrogen', 'prettier', '@shopify/prettier-config']\n await dependency.addNPMDependenciesIfNeeded(requiredDependencies, {\n dependencyManager: app.dependencyManager,\n type: 'prod',\n directory: app.directory,\n stderr: new stream.Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n }),\n stdout: new stream.Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n }),\n })\n task.title = 'Dependencies installed'\n },\n },\n\n {\n title: 'Adding ESLint configuration',\n task: async (_, task) => {\n const eslintConfigPath = path.join(app.directory, genericConfigurationFileNames.eslint)\n\n if (await file.exists(eslintConfigPath)) {\n if (force) {\n await file.remove(eslintConfigPath)\n } else {\n throw new error.Abort('ESLint config already exists.', 'Use --force to override existing config.')\n }\n }\n\n const eslintConfig = await file.format(\n ['module.exports = {', 'extends: [', `'plugin:hydrogen/recommended'`, ' ],', ' };'].join('\\n'),\n {path: genericConfigurationFileNames.eslint},\n )\n\n await file.write(eslintConfigPath, eslintConfig)\n\n task.title = 'ESLint configuration added'\n },\n },\n {\n title: 'Updating package.json',\n task: async (_, task) => {\n const packageJSON = await npm.readPackageJSON(app.directory)\n\n packageJSON.scripts.lint = `eslint --ext .js,.ts,.jsx,.tsx src/`\n\n packageJSON.prettier = '@shopify/prettier-config'\n\n await npm.writePackageJSON(app.directory, packageJSON)\n\n task.title = 'Package.json updated'\n },\n },\n {\n title: 'Adding editor plugin recommendations',\n skip: async () => !(await vscode.isVSCode(app.directory)),\n task: async (_, task) => {\n await vscode.addRecommendedExtensions(app.directory, ['dbaeumer.vscode-eslint'])\n task.title = 'Editor plugin recommendations added'\n },\n },\n ])\n await list.run()\n}\n","import {hydrogenFlags} from '../../../flags'\nimport {addESLint} from '../../../services/eslint'\nimport {load as loadApp, HydrogenApp} from '../../../models/hydrogen'\nimport {Command, Flags} from '@oclif/core'\nimport {cli, path} from '@shopify/cli-kit'\n\nexport default class AddESLint extends Command {\n static flags = {\n ...cli.globalFlags,\n ...hydrogenFlags,\n force: Flags.boolean({\n hidden: false,\n char: 'f',\n description: 'Overwrite existing configuration',\n default: false,\n env: 'SHOPIFY_FLAG_FORCE',\n }),\n }\n\n public async run(): Promise<void> {\n const {\n flags: {path: pathFlag, install, force},\n } = await this.parse(AddESLint)\n const directory = pathFlag ? path.resolve(pathFlag) : process.cwd()\n\n const app: HydrogenApp = await loadApp(directory)\n\n await addESLint({app, install, force})\n }\n}\n"],"names":["loadApp"],"mappings":"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"}
1
+ {"version":3,"file":"eslint.js","sources":["../../../../src/cli/services/eslint.ts","../../../../src/cli/commands/hydrogen/add/eslint.ts"],"sourcesContent":["import {HydrogenApp} from '../models/hydrogen'\nimport {genericConfigurationFileNames} from '../constants'\nimport {ui, vscode, npm, file, dependency, path, error} from '@shopify/cli-kit'\nimport stream from 'node:stream'\n\ninterface AddESlintOptions {\n app: HydrogenApp\n force: boolean\n install: boolean\n}\n\nexport async function addESLint({app, force, install}: AddESlintOptions) {\n const list = new ui.Listr([\n {\n title: 'Installing additional dependencies',\n skip: () => !install,\n task: async (_, task) => {\n const requiredDependencies = ['eslint', 'eslint-plugin-hydrogen', 'prettier', '@shopify/prettier-config']\n await dependency.addNPMDependenciesWithoutVersionIfNeeded(requiredDependencies, {\n dependencyManager: app.dependencyManager,\n type: 'prod',\n directory: app.directory,\n stderr: new stream.Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n }),\n stdout: new stream.Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n }),\n })\n task.title = 'Dependencies installed'\n },\n },\n\n {\n title: 'Adding ESLint configuration',\n task: async (_, task) => {\n const eslintConfigPath = path.join(app.directory, genericConfigurationFileNames.eslint)\n\n if (await file.exists(eslintConfigPath)) {\n if (force) {\n await file.remove(eslintConfigPath)\n } else {\n throw new error.Abort('ESLint config already exists.', 'Use --force to override existing config.')\n }\n }\n\n const eslintConfig = await file.format(\n ['module.exports = {', 'extends: [', `'plugin:hydrogen/recommended'`, ' ],', ' };'].join('\\n'),\n {path: genericConfigurationFileNames.eslint},\n )\n\n await file.write(eslintConfigPath, eslintConfig)\n\n task.title = 'ESLint configuration added'\n },\n },\n {\n title: 'Updating package.json',\n task: async (_, task) => {\n const packageJSON = await npm.readPackageJSON(app.directory)\n\n packageJSON.scripts.lint = `eslint --ext .js,.ts,.jsx,.tsx src/`\n\n packageJSON.prettier = '@shopify/prettier-config'\n\n await npm.writePackageJSON(app.directory, packageJSON)\n\n task.title = 'Package.json updated'\n },\n },\n {\n title: 'Adding editor plugin recommendations',\n skip: async () => !(await vscode.isVSCode(app.directory)),\n task: async (_, task) => {\n await vscode.addRecommendedExtensions(app.directory, ['dbaeumer.vscode-eslint'])\n task.title = 'Editor plugin recommendations added'\n },\n },\n ])\n await list.run()\n}\n","import {hydrogenFlags} from '../../../flags'\nimport {addESLint} from '../../../services/eslint'\nimport {load as loadApp, HydrogenApp} from '../../../models/hydrogen'\nimport {Command, Flags} from '@oclif/core'\nimport {cli, path} from '@shopify/cli-kit'\n\nexport default class AddESLint extends Command {\n static flags = {\n ...cli.globalFlags,\n ...hydrogenFlags,\n force: Flags.boolean({\n hidden: false,\n char: 'f',\n description: 'Overwrite existing configuration',\n default: false,\n env: 'SHOPIFY_FLAG_FORCE',\n }),\n }\n\n public async run(): Promise<void> {\n const {\n flags: {path: pathFlag, install, force},\n } = await this.parse(AddESLint)\n const directory = pathFlag ? path.resolve(pathFlag) : process.cwd()\n\n const app: HydrogenApp = await loadApp(directory)\n\n await addESLint({app, install, force})\n }\n}\n"],"names":["loadApp"],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import { h as hydrogenFlags } from '../../../flags-39d1e3c2.js';
2
2
  import { ui, dependency, path, file, error, system, vscode, cli } from '@shopify/cli-kit';
3
3
  import stream from 'node:stream';
4
- import { l as load } from '../../../hydrogen-9efd5ae6.js';
4
+ import { l as load } from '../../../hydrogen-21276a42.js';
5
5
  import { Flags, Command } from '@oclif/core';
6
6
  import 'vite';
7
+ import 'path';
8
+ import 'fs';
7
9
 
8
10
  const tailwindImports = [
9
11
  "@import 'tailwindcss/base';",
@@ -18,7 +20,7 @@ async function addTailwind({ app, force, install, directory }) {
18
20
  skip: () => !install,
19
21
  task: async (_, task) => {
20
22
  const requiredDependencies = ["postcss", "postcss-loader", "tailwindcss", "autoprefixer"];
21
- await dependency.addNPMDependenciesIfNeeded(requiredDependencies, {
23
+ await dependency.addNPMDependenciesWithoutVersionIfNeeded(requiredDependencies, {
22
24
  dependencyManager: app.dependencyManager,
23
25
  type: "prod",
24
26
  directory: app.directory,
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind.js","sources":["../../../../src/cli/services/tailwind.ts","../../../../src/cli/commands/hydrogen/add/tailwind.ts"],"sourcesContent":["import {HydrogenApp} from '../models/hydrogen'\nimport {ui, vscode, system, path, file, error, dependency} from '@shopify/cli-kit'\nimport stream from 'node:stream'\n\ninterface AddTailwindOptions {\n app: HydrogenApp\n force: boolean\n directory: string\n install: boolean\n}\n\nconst tailwindImports = [\n \"@import 'tailwindcss/base';\",\n \"@import 'tailwindcss/components';\",\n \"@import 'tailwindcss/utilities';\",\n]\n\nconst tailwindImportsExist = (indexCSS: string) =>\n tailwindImports.map((el) => new RegExp(el)).every((tailwindDirective) => tailwindDirective.test(indexCSS))\n\nexport async function addTailwind({app, force, install, directory}: AddTailwindOptions) {\n const list = new ui.Listr([\n {\n title: 'Installing additional dependencies',\n skip: () => !install,\n task: async (_, task) => {\n const requiredDependencies = ['postcss', 'postcss-loader', 'tailwindcss', 'autoprefixer']\n await dependency.addNPMDependenciesIfNeeded(requiredDependencies, {\n dependencyManager: app.dependencyManager,\n type: 'prod',\n directory: app.directory,\n stderr: new stream.Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n }),\n stdout: new stream.Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n }),\n })\n task.title = 'Dependencies installed'\n },\n },\n\n {\n title: 'Adding PostCSS configuration',\n task: async (_, task) => {\n const postCSSConfiguration = path.join(directory, 'postcss.config.js')\n\n if (await file.exists(postCSSConfiguration)) {\n if (force) {\n await file.remove(postCSSConfiguration)\n } else {\n throw new error.Abort('PostCSS config already exists.\\nUse --force to override existing config.')\n }\n }\n\n const postCSSConfig = await file.format(\n ['module.exports = {', 'plugins: {', 'tailwindcss: {},', 'autoprefixer: {},', '},', ' };'].join('\\n'),\n {path: 'postcss.config.js'},\n )\n\n await file.write(postCSSConfiguration, postCSSConfig)\n\n task.title = 'PostCSS configuration added'\n },\n },\n\n {\n title: 'Initializing Tailwind CSS...',\n task: async (_, task) => {\n const tailwindConfigurationPath = path.join(directory, 'tailwind.config.js')\n\n if (await file.exists(tailwindConfigurationPath)) {\n if (force) {\n await file.remove(tailwindConfigurationPath)\n } else {\n throw new error.Abort('Tailwind config already exists.\\nUse --force to override existing config.')\n }\n }\n\n await system.exec(app.dependencyManager, ['tailwindcss', 'init', tailwindConfigurationPath], {\n cwd: directory,\n })\n\n await replace(\n 'content: []',\n \"content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}']\",\n tailwindConfigurationPath,\n )\n\n task.title = 'Tailwind configuration added'\n },\n },\n {\n title: 'Importing Tailwind CSS in index.css',\n task: async (_ctx, task) => {\n const indexCSSPath = path.join(directory, 'src', 'index.css')\n const indexCSS = await file.read(indexCSSPath)\n\n if (tailwindImportsExist(indexCSS)) {\n task.skip('Imports already exist in index.css')\n } else {\n const newIndexCSS = tailwindImports.join('\\n') + indexCSS\n\n await file.write(indexCSSPath, newIndexCSS)\n }\n\n task.title = 'Tailwind imports added'\n },\n },\n {\n title: 'Adding editor plugin recommendations',\n task: async (_, task) => {\n await vscode.addRecommendedExtensions(directory, ['csstools.postcss', 'bradlc.vscode-tailwindcss'])\n task.title = 'Editor plugin recommendations added'\n },\n },\n ])\n await list.run()\n}\n\nasync function replace(find: string | RegExp, replace: string, filepath: string) {\n const original = await file.read(filepath)\n const modified = original.replace(find, replace)\n await file.write(filepath, modified)\n}\n","import {hydrogenFlags} from '../../../flags'\nimport {addTailwind} from '../../../services/tailwind'\nimport {load as loadApp, HydrogenApp} from '../../../models/hydrogen'\nimport {Command, Flags} from '@oclif/core'\nimport {path, cli} from '@shopify/cli-kit'\n\nexport default class AddTailwind extends Command {\n static flags = {\n ...cli.globalFlags,\n ...hydrogenFlags,\n force: Flags.boolean({\n hidden: false,\n char: 'f',\n description: 'overwrite existing configuration',\n default: false,\n env: 'SHOPIFY_FLAG_FORCE',\n }),\n }\n\n public async run(): Promise<void> {\n const {\n flags: {path: pathFlag, install, force},\n } = await this.parse(AddTailwind)\n const directory = pathFlag ? path.resolve(pathFlag) : process.cwd()\n\n const app: HydrogenApp = await loadApp(directory)\n\n await addTailwind({app, directory, install, force})\n }\n}\n"],"names":["loadApp"],"mappings":"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"}
1
+ {"version":3,"file":"tailwind.js","sources":["../../../../src/cli/services/tailwind.ts","../../../../src/cli/commands/hydrogen/add/tailwind.ts"],"sourcesContent":["import {HydrogenApp} from '../models/hydrogen'\nimport {ui, vscode, system, path, file, error, dependency} from '@shopify/cli-kit'\nimport stream from 'node:stream'\n\ninterface AddTailwindOptions {\n app: HydrogenApp\n force: boolean\n directory: string\n install: boolean\n}\n\nconst tailwindImports = [\n \"@import 'tailwindcss/base';\",\n \"@import 'tailwindcss/components';\",\n \"@import 'tailwindcss/utilities';\",\n]\n\nconst tailwindImportsExist = (indexCSS: string) =>\n tailwindImports.map((el) => new RegExp(el)).every((tailwindDirective) => tailwindDirective.test(indexCSS))\n\nexport async function addTailwind({app, force, install, directory}: AddTailwindOptions) {\n const list = new ui.Listr([\n {\n title: 'Installing additional dependencies',\n skip: () => !install,\n task: async (_, task) => {\n const requiredDependencies = ['postcss', 'postcss-loader', 'tailwindcss', 'autoprefixer']\n await dependency.addNPMDependenciesWithoutVersionIfNeeded(requiredDependencies, {\n dependencyManager: app.dependencyManager,\n type: 'prod',\n directory: app.directory,\n stderr: new stream.Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n }),\n stdout: new stream.Writable({\n write(chunk, encoding, next) {\n task.output = chunk.toString()\n next()\n },\n }),\n })\n task.title = 'Dependencies installed'\n },\n },\n\n {\n title: 'Adding PostCSS configuration',\n task: async (_, task) => {\n const postCSSConfiguration = path.join(directory, 'postcss.config.js')\n\n if (await file.exists(postCSSConfiguration)) {\n if (force) {\n await file.remove(postCSSConfiguration)\n } else {\n throw new error.Abort('PostCSS config already exists.\\nUse --force to override existing config.')\n }\n }\n\n const postCSSConfig = await file.format(\n ['module.exports = {', 'plugins: {', 'tailwindcss: {},', 'autoprefixer: {},', '},', ' };'].join('\\n'),\n {path: 'postcss.config.js'},\n )\n\n await file.write(postCSSConfiguration, postCSSConfig)\n\n task.title = 'PostCSS configuration added'\n },\n },\n\n {\n title: 'Initializing Tailwind CSS...',\n task: async (_, task) => {\n const tailwindConfigurationPath = path.join(directory, 'tailwind.config.js')\n\n if (await file.exists(tailwindConfigurationPath)) {\n if (force) {\n await file.remove(tailwindConfigurationPath)\n } else {\n throw new error.Abort('Tailwind config already exists.\\nUse --force to override existing config.')\n }\n }\n\n await system.exec(app.dependencyManager, ['tailwindcss', 'init', tailwindConfigurationPath], {\n cwd: directory,\n })\n\n await replace(\n 'content: []',\n \"content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}']\",\n tailwindConfigurationPath,\n )\n\n task.title = 'Tailwind configuration added'\n },\n },\n {\n title: 'Importing Tailwind CSS in index.css',\n task: async (_ctx, task) => {\n const indexCSSPath = path.join(directory, 'src', 'index.css')\n const indexCSS = await file.read(indexCSSPath)\n\n if (tailwindImportsExist(indexCSS)) {\n task.skip('Imports already exist in index.css')\n } else {\n const newIndexCSS = tailwindImports.join('\\n') + indexCSS\n\n await file.write(indexCSSPath, newIndexCSS)\n }\n\n task.title = 'Tailwind imports added'\n },\n },\n {\n title: 'Adding editor plugin recommendations',\n task: async (_, task) => {\n await vscode.addRecommendedExtensions(directory, ['csstools.postcss', 'bradlc.vscode-tailwindcss'])\n task.title = 'Editor plugin recommendations added'\n },\n },\n ])\n await list.run()\n}\n\nasync function replace(find: string | RegExp, replace: string, filepath: string) {\n const original = await file.read(filepath)\n const modified = original.replace(find, replace)\n await file.write(filepath, modified)\n}\n","import {hydrogenFlags} from '../../../flags'\nimport {addTailwind} from '../../../services/tailwind'\nimport {load as loadApp, HydrogenApp} from '../../../models/hydrogen'\nimport {Command, Flags} from '@oclif/core'\nimport {path, cli} from '@shopify/cli-kit'\n\nexport default class AddTailwind extends Command {\n static flags = {\n ...cli.globalFlags,\n ...hydrogenFlags,\n force: Flags.boolean({\n hidden: false,\n char: 'f',\n description: 'overwrite existing configuration',\n default: false,\n env: 'SHOPIFY_FLAG_FORCE',\n }),\n }\n\n public async run(): Promise<void> {\n const {\n flags: {path: pathFlag, install, force},\n } = await this.parse(AddTailwind)\n const directory = pathFlag ? path.resolve(pathFlag) : process.cwd()\n\n const app: HydrogenApp = await loadApp(directory)\n\n await addTailwind({app, directory, install, force})\n }\n}\n"],"names":["loadApp"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { createServer } from 'vite';
2
+ import { error, cli, path } from '@shopify/cli-kit';
2
3
  import { h as hydrogenFlags } from '../../flags-39d1e3c2.js';
3
- import { cli, path } from '@shopify/cli-kit';
4
4
  import { Flags, Command } from '@oclif/core';
5
5
 
6
6
  async function dev({ directory, force, host }) {
@@ -12,9 +12,15 @@ async function dev({ directory, force, host }) {
12
12
  host
13
13
  }
14
14
  });
15
- await server.listen();
16
- server.printUrls();
17
- server.config.logger.info("");
15
+ try {
16
+ await server.listen();
17
+ server.printUrls();
18
+ server.config.logger.info("");
19
+ } catch (error$1) {
20
+ const abortError = new error.Abort(error$1.message);
21
+ abortError.stack = error$1.stack;
22
+ throw abortError;
23
+ }
18
24
  }
19
25
 
20
26
  const _Dev = class extends Command {
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sources":["../../../src/cli/services/dev.ts","../../../src/cli/commands/hydrogen/dev.ts"],"sourcesContent":["import {createServer} from 'vite'\n\ninterface DevOptions {\n directory: string\n force: boolean\n host: boolean\n}\n\nasync function dev({directory, force, host}: DevOptions) {\n const server = await createServer({\n root: directory,\n server: {\n open: true,\n force,\n host,\n },\n })\n\n await server.listen()\n server.printUrls()\n server.config.logger.info('')\n}\n\nexport default dev\n","import devService from '../../services/dev'\nimport {hydrogenFlags} from '../../flags'\nimport {path, cli} from '@shopify/cli-kit'\nimport {Command, Flags} from '@oclif/core'\n\nexport default class Dev extends Command {\n static description = 'Run a Hydrogen storefront locally for development'\n static flags = {\n ...cli.globalFlags,\n path: hydrogenFlags.path,\n force: Flags.boolean({\n description: 'force dependency pre-bundling.',\n env: 'SHOPIFY_FLAG_DEV_FORCE',\n }),\n host: Flags.boolean({\n description: 'listen on all addresses, including LAN and public addresses.',\n env: 'SHOPIFY_FLAG_DEV_HOST',\n }),\n }\n\n async run(): Promise<void> {\n const {flags} = await this.parse(Dev)\n const directory = flags.path ? path.resolve(flags.path) : process.cwd()\n\n await devService({directory, ...flags})\n }\n}\n"],"names":["devService"],"mappings":";;;;;AAQA,eAAmB,GAAA,CAAA,EAAC,SAAW,EAAA,KAAA,EAAO,IAAmB,EAAA,EAAA;AACvD,EAAM,MAAA,MAAA,GAAS,MAAM,YAAa,CAAA;AAAA,IAChC,IAAM,EAAA,SAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,IAAM,EAAA,IAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,OAAO,MAAO,EAAA,CAAA;AACpB,EAAA,MAAA,CAAO,SAAU,EAAA,CAAA;AACjB,EAAO,MAAA,CAAA,MAAA,CAAO,MAAO,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAC9B;;AChBA,MAAqB,IAAA,GAArB,cAAiC,OAAQ,CAAA;AAAA,EAevC,MAAM,GAAqB,GAAA;AACzB,IAAA,MAAM,EAAC,KAAA,EAAA,GAAS,MAAM,IAAA,CAAK,MAAM,IAAG,CAAA,CAAA;AACpC,IAAM,MAAA,SAAA,GAAY,MAAM,IAAO,GAAA,IAAA,CAAK,QAAQ,KAAM,CAAA,IAAI,CAAI,GAAA,OAAA,CAAQ,GAAI,EAAA,CAAA;AAEtE,IAAA,MAAMA,GAAW,CAAA,EAAC,SAAW,EAAA,GAAG,OAAM,CAAA,CAAA;AAAA,GACxC;AACF,CAAA,CAAA;AArBA,IAAqB,GAArB,GAAA,KAAA;AAAqB,IACZ,WAAc,GAAA,mDAAA,CAAA;AADF,IAEZ,KAAQ,GAAA;AAAA,EACb,GAAG,GAAI,CAAA,WAAA;AAAA,EACP,MAAM,aAAc,CAAA,IAAA;AAAA,EACpB,KAAA,EAAO,MAAM,OAAQ,CAAA;AAAA,IACnB,WAAa,EAAA,gCAAA;AAAA,IACb,GAAK,EAAA,wBAAA;AAAA,GACN,CAAA;AAAA,EACD,IAAA,EAAM,MAAM,OAAQ,CAAA;AAAA,IAClB,WAAa,EAAA,8DAAA;AAAA,IACb,GAAK,EAAA,uBAAA;AAAA,GACN,CAAA;AACH,CAAA;;;;"}
1
+ {"version":3,"file":"dev.js","sources":["../../../src/cli/services/dev.ts","../../../src/cli/commands/hydrogen/dev.ts"],"sourcesContent":["import {createServer} from 'vite'\nimport {error as kitError} from '@shopify/cli-kit'\n\ninterface DevOptions {\n directory: string\n force: boolean\n host: boolean\n}\n\nasync function dev({directory, force, host}: DevOptions) {\n const server = await createServer({\n root: directory,\n server: {\n open: true,\n force,\n host,\n },\n })\n\n try {\n await server.listen()\n server.printUrls()\n server.config.logger.info('')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const abortError = new kitError.Abort(error.message)\n abortError.stack = error.stack\n throw abortError\n }\n}\n\nexport default dev\n","import devService from '../../services/dev'\nimport {hydrogenFlags} from '../../flags'\nimport {path, cli} from '@shopify/cli-kit'\nimport {Command, Flags} from '@oclif/core'\n\nexport default class Dev extends Command {\n static description = 'Run a Hydrogen storefront locally for development'\n static flags = {\n ...cli.globalFlags,\n path: hydrogenFlags.path,\n force: Flags.boolean({\n description: 'force dependency pre-bundling.',\n env: 'SHOPIFY_FLAG_DEV_FORCE',\n }),\n host: Flags.boolean({\n description: 'listen on all addresses, including LAN and public addresses.',\n env: 'SHOPIFY_FLAG_DEV_HOST',\n }),\n }\n\n async run(): Promise<void> {\n const {flags} = await this.parse(Dev)\n const directory = flags.path ? path.resolve(flags.path) : process.cwd()\n\n await devService({directory, ...flags})\n }\n}\n"],"names":["error","kitError","devService"],"mappings":";;;;;AASA,eAAmB,GAAA,CAAA,EAAC,SAAW,EAAA,KAAA,EAAO,IAAmB,EAAA,EAAA;AACvD,EAAM,MAAA,MAAA,GAAS,MAAM,YAAa,CAAA;AAAA,IAChC,IAAM,EAAA,SAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,IAAM,EAAA,IAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AAED,EAAI,IAAA;AACF,IAAA,MAAM,OAAO,MAAO,EAAA,CAAA;AACpB,IAAA,MAAA,CAAO,SAAU,EAAA,CAAA;AACjB,IAAO,MAAA,CAAA,MAAA,CAAO,MAAO,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,WAErBA,OAAP,EAAA;AACA,IAAA,MAAM,UAAa,GAAA,IAAIC,KAAS,CAAA,KAAA,CAAMD,QAAM,OAAO,CAAA,CAAA;AACnD,IAAA,UAAA,CAAW,QAAQA,OAAM,CAAA,KAAA,CAAA;AACzB,IAAM,MAAA,UAAA,CAAA;AAAA,GACR;AACF;;ACxBA,MAAqB,IAAA,GAArB,cAAiC,OAAQ,CAAA;AAAA,EAevC,MAAM,GAAqB,GAAA;AACzB,IAAA,MAAM,EAAC,KAAA,EAAA,GAAS,MAAM,IAAA,CAAK,MAAM,IAAG,CAAA,CAAA;AACpC,IAAM,MAAA,SAAA,GAAY,MAAM,IAAO,GAAA,IAAA,CAAK,QAAQ,KAAM,CAAA,IAAI,CAAI,GAAA,OAAA,CAAQ,GAAI,EAAA,CAAA;AAEtE,IAAA,MAAME,GAAW,CAAA,EAAC,SAAW,EAAA,GAAG,OAAM,CAAA,CAAA;AAAA,GACxC;AACF,CAAA,CAAA;AArBA,IAAqB,GAArB,GAAA,KAAA;AAAqB,IACZ,WAAc,GAAA,mDAAA,CAAA;AADF,IAEZ,KAAQ,GAAA;AAAA,EACb,GAAG,GAAI,CAAA,WAAA;AAAA,EACP,MAAM,aAAc,CAAA,IAAA;AAAA,EACpB,KAAA,EAAO,MAAM,OAAQ,CAAA;AAAA,IACnB,WAAa,EAAA,gCAAA;AAAA,IACb,GAAK,EAAA,wBAAA;AAAA,GACN,CAAA;AAAA,EACD,IAAA,EAAM,MAAM,OAAQ,CAAA;AAAA,IAClB,WAAa,EAAA,8DAAA;AAAA,IACb,GAAK,EAAA,uBAAA;AAAA,GACN,CAAA;AACH,CAAA;;;;"}
@@ -1,16 +1,14 @@
1
1
  import { output, string, os, cli, path } from '@shopify/cli-kit';
2
- import { l as load } from '../../hydrogen-9efd5ae6.js';
2
+ import { l as load } from '../../hydrogen-21276a42.js';
3
3
  import { h as hydrogenFlags } from '../../flags-39d1e3c2.js';
4
4
  import { Flags, Command } from '@oclif/core';
5
5
  import 'vite';
6
+ import 'path';
7
+ import 'fs';
6
8
 
7
- function info(app, { format }) {
8
- if (format === "json") {
9
- return output.content`${JSON.stringify(app, null, 2)}`;
10
- } else {
11
- const appInfo = new HydrogenAppInfo(app);
12
- return appInfo.output();
13
- }
9
+ function info(app, { showPrivateData }) {
10
+ const appInfo = new HydrogenAppInfo(app);
11
+ return appInfo.output({ showPrivateData });
14
12
  }
15
13
  const NOT_FOUND_TEXT = output.content`${output.token.italic("Not found")}`.value;
16
14
  const NOT_CONFIGURED_TEXT = output.content`${output.token.italic("Not yet configured")}`.value;
@@ -18,10 +16,10 @@ class AppInfo {
18
16
  constructor(app) {
19
17
  this.app = app;
20
18
  }
21
- output() {
19
+ output({ showPrivateData }) {
22
20
  const sections = [
23
21
  this.projectSettingsSection(),
24
- this.storefrontSettingsSection(),
22
+ this.storefrontSettingsSection({ showPrivateData }),
25
23
  this.eslintSection(),
26
24
  this.systemInfoSection()
27
25
  ];
@@ -31,18 +29,25 @@ class AppInfo {
31
29
  const title = "Your Project";
32
30
  const lines = [
33
31
  ["Name", this.app.name],
34
- ["Project location", this.app.directory]
32
+ ["Project location", this.app.directory],
33
+ ["Language", this.app.language]
35
34
  ];
36
35
  const projectInfo = this.linesToColumns(lines);
37
36
  return [title, projectInfo];
38
37
  }
39
- storefrontSettingsSection() {
38
+ storefrontSettingsSection({ showPrivateData }) {
40
39
  const errors = [];
41
40
  const title = "Storefront";
42
41
  if (this.app.configuration.shopify && typeof this.app.configuration.shopify === "function") {
43
42
  return [title, "Storefront settings defined as a function are not supported in this command."];
44
43
  }
45
- const storefrontInfo = this.configurationCheck(["storeDomain", "storefrontApiVersion", "storefrontToken"], this.app.configuration.shopify);
44
+ const privateFields = showPrivateData ? ["storefrontToken"] : [];
45
+ const fields = [
46
+ "storeDomain",
47
+ "storefrontApiVersion",
48
+ ...privateFields
49
+ ];
50
+ const storefrontInfo = this.configurationCheck(fields, this.app.configuration.shopify);
46
51
  if (!this.app.configuration.shopify?.storeDomain.endsWith(".myshopify.com")) {
47
52
  const error = "StoreDomain must be a valid shopify domain";
48
53
  errors.push(error);
@@ -69,7 +74,7 @@ ${errors.map(this.formattedError).join("\n")}`;
69
74
  const result = keys.reduce((acc, key2) => {
70
75
  const found = configObject[key2];
71
76
  if (typeof found === "string") {
72
- const result3 = [string.capitalize(key2), found];
77
+ const result3 = [string.capitalize(key2.toString()), found];
73
78
  return [...acc, result3];
74
79
  }
75
80
  const result2 = [key2, NOT_CONFIGURED_TEXT];
@@ -133,8 +138,8 @@ const _Info = class extends Command {
133
138
  async run() {
134
139
  const { flags } = await this.parse(_Info);
135
140
  const directory = flags.path ? path.resolve(flags.path) : process.cwd();
136
- const app = await load(directory, "report");
137
- output.info(info(app, { format: flags.format }));
141
+ const app = await load(directory);
142
+ output.info(info(app, { showPrivateData: flags.showToken }));
138
143
  if (app.errors)
139
144
  process.exit(2);
140
145
  }
@@ -144,13 +149,11 @@ Info.description = "Print basic information about your hydrogen app";
144
149
  Info.flags = {
145
150
  ...cli.globalFlags,
146
151
  ...hydrogenFlags,
147
- format: Flags.string({
152
+ showToken: Flags.boolean({
148
153
  hidden: false,
149
- char: "f",
150
- description: "output format",
151
- options: ["json", "text"],
152
- default: "text",
153
- env: "SHOPIFY_FLAG_FORMAT"
154
+ description: "Show storefront API token",
155
+ default: false,
156
+ env: "SHOPIFY_HYDROGEN_FLAG_SHOW_TOKEN"
154
157
  })
155
158
  };
156
159
 
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sources":["../../../src/cli/services/info.ts","../../../src/cli/commands/hydrogen/info.ts"],"sourcesContent":["import {HydrogenApp} from '../models/hydrogen'\nimport {HydrogenConfig} from '@shopify/hydrogen/config'\n\nimport {output, string, os} from '@shopify/cli-kit'\n\nexport type Format = 'json' | 'text'\n\ninterface InfoOptions {\n format: Format\n}\n\nexport function info(app: HydrogenApp, {format}: InfoOptions): output.Message {\n if (format === 'json') {\n return output.content`${JSON.stringify(app, null, 2)}`\n } else {\n const appInfo = new HydrogenAppInfo(app)\n\n return appInfo.output()\n }\n}\n\nconst NOT_FOUND_TEXT = output.content`${output.token.italic('Not found')}`.value\nconst NOT_CONFIGURED_TEXT = output.content`${output.token.italic('Not yet configured')}`.value\n\nclass AppInfo {\n private app: HydrogenApp\n constructor(app: HydrogenApp) {\n this.app = app\n }\n\n output(): string {\n const sections: [string, string][] = [\n this.projectSettingsSection(),\n this.storefrontSettingsSection(),\n this.eslintSection(),\n this.systemInfoSection(),\n ]\n return sections.map((sectionContents: [string, string]) => this.section(...sectionContents)).join('\\n\\n')\n }\n\n projectSettingsSection(): [string, string] {\n const title = 'Your Project'\n\n const lines = [\n ['Name', this.app.name],\n ['Project location', this.app.directory],\n ]\n\n const projectInfo = this.linesToColumns(lines)\n return [title, projectInfo]\n }\n\n storefrontSettingsSection(): [string, string] {\n const errors: string[] = []\n const title = 'Storefront'\n\n if (this.app.configuration.shopify && typeof this.app.configuration.shopify === 'function') {\n return [title, 'Storefront settings defined as a function are not supported in this command.']\n }\n\n const storefrontInfo = this.configurationCheck(\n ['storeDomain', 'storefrontApiVersion', 'storefrontToken'] as unknown as keyof HydrogenConfig['shopify'][],\n this.app.configuration.shopify,\n )\n\n if (!this.app.configuration.shopify?.storeDomain.endsWith('.myshopify.com')) {\n const error = 'StoreDomain must be a valid shopify domain'\n\n errors.push(error)\n this.app.errors?.addError('storeDomain', error)\n }\n\n let errorContent = `\\n${errors.map(this.formattedError).join('\\n')}`\n\n if (errorContent.trim() === '') errorContent = ''\n\n return [title, `${this.linesToColumns(storefrontInfo)}${errorContent}`]\n }\n\n eslintSection(): [string, string] {\n const errors: string[] = []\n const title = 'ESLint'\n const dependencyResults = this.dependencyCheck(['eslint', 'eslint-plugin-hydrogen'])\n\n let errorContent = `\\n${errors.map(this.formattedError).join('\\n')}`\n\n if (errorContent.trim() === '') errorContent = ''\n\n return [title, `${this.linesToColumns(dependencyResults)}${errorContent}`]\n }\n\n configurationCheck(\n key: keyof HydrogenConfig | keyof HydrogenConfig[],\n configObject: HydrogenConfig | HydrogenConfig['shopify'] = this.app.configuration,\n ): string[][] {\n const keys = Array.isArray(key) ? key : [key]\n\n const result = (keys as [keyof HydrogenConfig]).reduce((acc: string[][], key: keyof HydrogenConfig) => {\n const found = configObject[key as keyof HydrogenConfig & keyof HydrogenConfig['shopify']]\n\n if (typeof found === 'string') {\n const result = [string.capitalize(key), found]\n return [...acc, result]\n }\n\n const result = [key, NOT_CONFIGURED_TEXT]\n return [...acc, result]\n }, [])\n\n return result\n }\n\n dependencyCheck(dependency: string | string[]): string[][] {\n const dependencies = Array.isArray(dependency) ? dependency : [dependency]\n\n const result = dependencies.reduce<string[][]>((acc, dependency) => {\n const found = this.app.nodeDependencies[dependency]\n if (found) {\n const result = [dependency, found]\n return [...acc, result]\n }\n\n const result = [dependency, NOT_FOUND_TEXT]\n return [...acc, result]\n }, [])\n\n return result\n }\n\n formattedError(str: string): string {\n const [errorFirstLine, ...errorRemainingLines] = str.split('\\n')\n const errorLines = [`! ${errorFirstLine}`, ...errorRemainingLines.map((line) => ` ${line}`)]\n return output.content`${output.token.errorText(errorLines.join('\\n'))}`.value\n }\n\n systemInfoSection(): [string, string] {\n const title = 'Tooling and System'\n const {platform, arch} = os.platformAndArch()\n const dependencyResults = this.dependencyCheck(['eslint', 'eslint-plugin-hydrogen'])\n\n const lines: string[][] = [\n ...this.dependencyCheck(['@shopify/hydrogen', '@shopify/cli-hydrogen', '@shopify/cli']),\n ['Package manager', this.app.dependencyManager],\n ['OS', `${platform}-${arch}`],\n ['Shell', process.env.SHELL || 'unknown'],\n ['Node.js version', process.version],\n ]\n\n return [title, this.linesToColumns(lines)]\n }\n\n linesToColumns(lines: string[][]): string {\n const widths: number[] = []\n for (let i = 0; lines[0] && i < lines[0].length; i++) {\n const columnRows = lines.map((line) => line[i])\n widths.push(Math.max(...columnRows.map((row) => output.unstyled(row).length)))\n }\n const paddedLines = lines\n .map((line) => {\n return line\n .map((col, index) => {\n return `${col}${' '.repeat(widths[index] - output.unstyled(col).length)}`\n })\n .join(' ')\n .trimEnd()\n })\n .join('\\n')\n return paddedLines\n }\n\n section(title: string, body: string): string {\n const formattedTitle = `${title.toUpperCase()}${' '.repeat(35 - title.length)}`\n return output.content`${output.token.heading(formattedTitle)}\\n${body}`.value\n }\n}\n\nclass HydrogenAppInfo extends AppInfo {}\n","import {Format, info} from '../../services/info'\nimport {load as loadApp, HydrogenApp} from '../../models/hydrogen'\nimport {hydrogenFlags} from '../../flags'\nimport {Command, Flags} from '@oclif/core'\nimport {output, path, cli} from '@shopify/cli-kit'\n\nexport default class Info extends Command {\n static description = 'Print basic information about your hydrogen app'\n\n static flags = {\n ...cli.globalFlags,\n ...hydrogenFlags,\n format: Flags.string({\n hidden: false,\n char: 'f',\n description: 'output format',\n options: ['json', 'text'],\n default: 'text',\n env: 'SHOPIFY_FLAG_FORMAT',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(Info)\n const directory = flags.path ? path.resolve(flags.path) : process.cwd()\n const app: HydrogenApp = await loadApp(directory, 'report')\n\n output.info(info(app, {format: flags.format as Format}))\n if (app.errors) process.exit(2)\n }\n}\n"],"names":["loadApp"],"mappings":"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"}
1
+ {"version":3,"file":"info.js","sources":["../../../src/cli/services/info.ts","../../../src/cli/commands/hydrogen/info.ts"],"sourcesContent":["import {HydrogenApp} from '../models/hydrogen'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport {HydrogenConfig} from '@shopify/hydrogen/config'\nimport {output, string, os} from '@shopify/cli-kit'\n\ninterface InfoOptions {\n showPrivateData: boolean\n}\n\nexport function info(app: HydrogenApp, {showPrivateData}: InfoOptions): output.Message {\n const appInfo = new HydrogenAppInfo(app)\n\n return appInfo.output({showPrivateData})\n}\n\nconst NOT_FOUND_TEXT = output.content`${output.token.italic('Not found')}`.value\nconst NOT_CONFIGURED_TEXT = output.content`${output.token.italic('Not yet configured')}`.value\n\nclass AppInfo {\n private app: HydrogenApp\n constructor(app: HydrogenApp) {\n this.app = app\n }\n\n output({showPrivateData}: InfoOptions): string {\n const sections: [string, string][] = [\n this.projectSettingsSection(),\n this.storefrontSettingsSection({showPrivateData}),\n this.eslintSection(),\n this.systemInfoSection(),\n ]\n return sections.map((sectionContents: [string, string]) => this.section(...sectionContents)).join('\\n\\n')\n }\n\n projectSettingsSection(): [string, string] {\n const title = 'Your Project'\n\n const lines = [\n ['Name', this.app.name],\n ['Project location', this.app.directory],\n ['Language', this.app.language],\n ]\n\n const projectInfo = this.linesToColumns(lines)\n return [title, projectInfo]\n }\n\n storefrontSettingsSection({showPrivateData}: InfoOptions): [string, string] {\n const errors: string[] = []\n const title = 'Storefront'\n\n if (this.app.configuration.shopify && typeof this.app.configuration.shopify === 'function') {\n return [title, 'Storefront settings defined as a function are not supported in this command.']\n }\n\n const privateFields = showPrivateData ? ['storefrontToken'] : []\n\n const fields = [\n 'storeDomain',\n 'storefrontApiVersion',\n ...privateFields,\n ] as unknown as keyof HydrogenConfig['shopify'][]\n\n const storefrontInfo = this.configurationCheck(fields, this.app.configuration.shopify)\n\n if (!this.app.configuration.shopify?.storeDomain.endsWith('.myshopify.com')) {\n const error = 'StoreDomain must be a valid shopify domain'\n\n errors.push(error)\n this.app.errors?.addError('storeDomain', error)\n }\n\n let errorContent = `\\n${errors.map(this.formattedError).join('\\n')}`\n\n if (errorContent.trim() === '') errorContent = ''\n\n return [title, `${this.linesToColumns(storefrontInfo)}${errorContent}`]\n }\n\n eslintSection(): [string, string] {\n const errors: string[] = []\n const title = 'ESLint'\n const dependencyResults = this.dependencyCheck(['eslint', 'eslint-plugin-hydrogen'])\n\n let errorContent = `\\n${errors.map(this.formattedError).join('\\n')}`\n\n if (errorContent.trim() === '') errorContent = ''\n\n return [title, `${this.linesToColumns(dependencyResults)}${errorContent}`]\n }\n\n configurationCheck(\n key: keyof HydrogenConfig | keyof HydrogenConfig[],\n configObject: HydrogenConfig | HydrogenConfig['shopify'] = this.app.configuration,\n ): string[][] {\n const keys = Array.isArray(key) ? key : [key]\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const result = keys.reduce((acc, key) => {\n const found = configObject[key as keyof HydrogenConfig & keyof HydrogenConfig['shopify']]\n\n if (typeof found === 'string') {\n const result = [string.capitalize(key.toString()), found]\n return [...acc, result]\n }\n\n const result = [key, NOT_CONFIGURED_TEXT]\n return [...acc, result]\n }, [])\n\n return result\n }\n\n dependencyCheck(dependency: string | string[]): string[][] {\n const dependencies = Array.isArray(dependency) ? dependency : [dependency]\n\n const result = dependencies.reduce<string[][]>((acc, dependency) => {\n const found = this.app.nodeDependencies[dependency]\n if (found) {\n const result = [dependency, found]\n return [...acc, result]\n }\n\n const result = [dependency, NOT_FOUND_TEXT]\n return [...acc, result]\n }, [])\n\n return result\n }\n\n formattedError(str: string): string {\n const [errorFirstLine, ...errorRemainingLines] = str.split('\\n')\n const errorLines = [`! ${errorFirstLine}`, ...errorRemainingLines.map((line) => ` ${line}`)]\n return output.content`${output.token.errorText(errorLines.join('\\n'))}`.value\n }\n\n systemInfoSection(): [string, string] {\n const title = 'Tooling and System'\n const {platform, arch} = os.platformAndArch()\n const dependencyResults = this.dependencyCheck(['eslint', 'eslint-plugin-hydrogen'])\n\n const lines: string[][] = [\n ...this.dependencyCheck(['@shopify/hydrogen', '@shopify/cli-hydrogen', '@shopify/cli']),\n ['Package manager', this.app.dependencyManager],\n ['OS', `${platform}-${arch}`],\n ['Shell', process.env.SHELL || 'unknown'],\n ['Node.js version', process.version],\n ]\n\n return [title, this.linesToColumns(lines)]\n }\n\n linesToColumns(lines: string[][]): string {\n const widths: number[] = []\n for (let i = 0; lines[0] && i < lines[0].length; i++) {\n const columnRows = lines.map((line) => line[i])\n widths.push(Math.max(...columnRows.map((row) => output.unstyled(row).length)))\n }\n const paddedLines = lines\n .map((line) => {\n return line\n .map((col, index) => {\n return `${col}${' '.repeat(widths[index] - output.unstyled(col).length)}`\n })\n .join(' ')\n .trimEnd()\n })\n .join('\\n')\n return paddedLines\n }\n\n section(title: string, body: string): string {\n const formattedTitle = `${title.toUpperCase()}${' '.repeat(35 - title.length)}`\n return output.content`${output.token.heading(formattedTitle)}\\n${body}`.value\n }\n}\n\nclass HydrogenAppInfo extends AppInfo {}\n","import {info} from '../../services/info'\nimport {load as loadApp, HydrogenApp} from '../../models/hydrogen'\nimport {hydrogenFlags} from '../../flags'\nimport {Command, Flags} from '@oclif/core'\nimport {output, path, cli} from '@shopify/cli-kit'\n\nexport default class Info extends Command {\n static description = 'Print basic information about your hydrogen app'\n\n static flags = {\n ...cli.globalFlags,\n ...hydrogenFlags,\n showToken: Flags.boolean({\n hidden: false,\n description: 'Show storefront API token',\n default: false,\n env: 'SHOPIFY_HYDROGEN_FLAG_SHOW_TOKEN',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(Info)\n const directory = flags.path ? path.resolve(flags.path) : process.cwd()\n const app: HydrogenApp = await loadApp(directory)\n\n output.info(info(app, {showPrivateData: flags.showToken}))\n if (app.errors) process.exit(2)\n }\n}\n"],"names":["loadApp"],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { dependency, file, error, path } from '@shopify/cli-kit';
2
+ import { createServer } from 'vite';
3
+ import 'path';
4
+ import 'fs';
5
+
6
+ const genericConfigurationFileNames = {
7
+ tailwind: "tailwind.config",
8
+ postCSS: "postcss.config",
9
+ eslint: ".eslintrc.js",
10
+ typescript: {
11
+ config: "tsconfig.json"
12
+ },
13
+ ...dependency.genericConfigurationFileNames
14
+ };
15
+
16
+ async function viteception(paths, options) {
17
+ const isWorker = process.env.WORKER;
18
+ delete process.env.WORKER;
19
+ const server = await createServer({
20
+ clearScreen: false,
21
+ server: { middlewareMode: 'ssr' },
22
+ ...options,
23
+ });
24
+ if (isWorker) {
25
+ process.env.WORKER = isWorker;
26
+ }
27
+ const loaded = await Promise.all(paths.map((path) => server.ssrLoadModule(path)));
28
+ await server.close();
29
+ return { server, loaded };
30
+ }
31
+
32
+ process.env.HYDROGEN_SERVER_ENTRY || '/src/App.server';
33
+ // The character ":" breaks Vite with Node >= 16.15. Use "_" instead
34
+ const VIRTUAL_PREFIX = 'virtual__';
35
+ const PROXY_PREFIX = 'proxy__';
36
+ const HYDROGEN_CONFIG_ID = 'hydrogen.config.ts';
37
+ const VIRTUAL_PROXY_HYDROGEN_CONFIG_ID = VIRTUAL_PREFIX + PROXY_PREFIX + HYDROGEN_CONFIG_ID;
38
+
39
+ // Provide Hydrogen config loader to external tools like the CLI
40
+ async function loadConfig(options = { root: process.cwd() }) {
41
+ const { loaded } = await viteception([VIRTUAL_PROXY_HYDROGEN_CONFIG_ID], options);
42
+ return {
43
+ configuration: loaded[0].default,
44
+ configurationPath: loaded[0].configPath,
45
+ };
46
+ }
47
+
48
+ class AppErrors {
49
+ constructor() {
50
+ this.errors = {};
51
+ }
52
+ addError(path2, message) {
53
+ this.errors[path2] = message;
54
+ }
55
+ getError(path2) {
56
+ return this.errors[path2];
57
+ }
58
+ isEmpty() {
59
+ return Object.keys(this.errors).length === 0;
60
+ }
61
+ toJSON() {
62
+ return Object.values(this.errors);
63
+ }
64
+ }
65
+ class HydrogenAppLoader {
66
+ constructor({ directory }) {
67
+ this.errors = new AppErrors();
68
+ this.directory = directory;
69
+ }
70
+ async loaded() {
71
+ if (!await file.exists(this.directory)) {
72
+ throw new error.Abort(`Couldn't find directory ${this.directory}`);
73
+ }
74
+ const { configuration } = await this.loadConfig();
75
+ const yarnLockPath = path.join(this.directory, genericConfigurationFileNames.yarn.lockfile);
76
+ const yarnLockExists = await file.exists(yarnLockPath);
77
+ const pnpmLockPath = path.join(this.directory, genericConfigurationFileNames.pnpm.lockfile);
78
+ const pnpmLockExists = await file.exists(pnpmLockPath);
79
+ const packageJSONPath = path.join(this.directory, "package.json");
80
+ const name = await dependency.getPackageName(packageJSONPath);
81
+ const nodeDependencies = await dependency.getDependencies(packageJSONPath);
82
+ const tsConfigExists = await file.exists(path.join(this.directory, "tsconfig.json"));
83
+ const language = tsConfigExists && nodeDependencies.typescript ? "TypeScript" : "JavaScript";
84
+ let dependencyManager;
85
+ if (yarnLockExists) {
86
+ dependencyManager = "yarn";
87
+ } else if (pnpmLockExists) {
88
+ dependencyManager = "pnpm";
89
+ } else {
90
+ dependencyManager = "npm";
91
+ }
92
+ const app = {
93
+ name,
94
+ directory: this.directory,
95
+ configuration,
96
+ dependencyManager,
97
+ nodeDependencies,
98
+ language
99
+ };
100
+ if (!this.errors.isEmpty())
101
+ app.errors = this.errors;
102
+ return app;
103
+ }
104
+ async loadConfig() {
105
+ const abortError = new error.Abort(`Couldn't find hydrogen configuration file`);
106
+ try {
107
+ const config = await loadConfig({ root: this.directory });
108
+ if (!config) {
109
+ throw abortError;
110
+ }
111
+ return config;
112
+ } catch (error) {
113
+ abortError.stack = error.stack;
114
+ throw abortError;
115
+ }
116
+ }
117
+ }
118
+ async function load(directory) {
119
+ const loader = new HydrogenAppLoader({ directory });
120
+ return loader.loaded();
121
+ }
122
+
123
+ export { genericConfigurationFileNames as g, load as l };
124
+ //# sourceMappingURL=hydrogen-21276a42.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrogen-21276a42.js","sources":["../src/cli/constants.ts","../../../node_modules/@shopify/hydrogen/dist/esnext/framework/viteception.js","../../../node_modules/@shopify/hydrogen/dist/esnext/framework/plugins/vite-plugin-hydrogen-virtual-files.js","../../../node_modules/@shopify/hydrogen/dist/esnext/framework/load-config.js","../src/cli/models/hydrogen.ts"],"sourcesContent":["import {dependency} from '@shopify/cli-kit'\n\nexport const configurationFileNames = {\n hydrogen: 'hydrogen.config',\n} as const\n\nexport const supportedConfigExtensions = ['ts', 'js', 'mjs', 'cjs', 'json']\n\nexport const dotEnvFileNames = {\n production: '.env',\n}\n\nexport const genericConfigurationFileNames = {\n tailwind: 'tailwind.config',\n postCSS: 'postcss.config',\n eslint: '.eslintrc.js',\n typescript: {\n config: 'tsconfig.json',\n },\n ...dependency.genericConfigurationFileNames,\n} as const\n","import { createServer } from 'vite';\nexport async function viteception(paths, options) {\n const isWorker = process.env.WORKER;\n delete process.env.WORKER;\n const server = await createServer({\n clearScreen: false,\n server: { middlewareMode: 'ssr' },\n ...options,\n });\n if (isWorker) {\n process.env.WORKER = isWorker;\n }\n const loaded = await Promise.all(paths.map((path) => server.ssrLoadModule(path)));\n await server.close();\n return { server, loaded };\n}\n","import { normalizePath } from 'vite';\nimport path from 'path';\nimport { promises as fs } from 'fs';\nimport { viteception } from '../viteception';\nexport const HYDROGEN_DEFAULT_SERVER_ENTRY = process.env.HYDROGEN_SERVER_ENTRY || '/src/App.server';\n// The character \":\" breaks Vite with Node >= 16.15. Use \"_\" instead\nconst VIRTUAL_PREFIX = 'virtual__';\nconst PROXY_PREFIX = 'proxy__';\nconst HYDROGEN_CONFIG_ID = 'hydrogen.config.ts';\nconst VIRTUAL_HYDROGEN_CONFIG_ID = VIRTUAL_PREFIX + HYDROGEN_CONFIG_ID;\nexport const VIRTUAL_PROXY_HYDROGEN_CONFIG_ID = VIRTUAL_PREFIX + PROXY_PREFIX + HYDROGEN_CONFIG_ID;\nconst HYDROGEN_ROUTES_ID = 'hydrogen-routes.server.jsx';\nconst VIRTUAL_HYDROGEN_ROUTES_ID = VIRTUAL_PREFIX + HYDROGEN_ROUTES_ID;\nexport const VIRTUAL_PROXY_HYDROGEN_ROUTES_ID = VIRTUAL_PREFIX + PROXY_PREFIX + HYDROGEN_ROUTES_ID;\nexport default (pluginOptions) => {\n let config;\n let server;\n let resolvedConfigPath;\n return {\n name: 'hydrogen:virtual-files',\n configResolved(_config) {\n config = _config;\n // @ts-ignore\n config.plugins.push(addPathToConfigProxy());\n },\n configureServer(_server) {\n server = _server;\n },\n resolveId(source, importer) {\n if (source === VIRTUAL_HYDROGEN_CONFIG_ID) {\n return findHydrogenConfigPath(config.root, pluginOptions.configPath).then((hcPath) => {\n resolvedConfigPath = hcPath;\n // This direct dependency on a real file\n // makes HMR work for the virtual module.\n return this.resolve(hcPath, importer, { skipSelf: true });\n });\n }\n if ([\n VIRTUAL_PROXY_HYDROGEN_CONFIG_ID,\n VIRTUAL_PROXY_HYDROGEN_ROUTES_ID,\n VIRTUAL_HYDROGEN_ROUTES_ID,\n ].includes(source)) {\n // Virtual modules convention\n // https://vitejs.dev/guide/api-plugin.html#virtual-modules-convention\n return '\\0' + source;\n }\n },\n load(id) {\n // Likely due to a bug in Vite, but virtual modules cannot be loaded\n // directly using ssrLoadModule from a Vite plugin. It needs to be proxied as follows:\n if (id === '\\0' + VIRTUAL_PROXY_HYDROGEN_CONFIG_ID) {\n return `import hc from '${VIRTUAL_HYDROGEN_CONFIG_ID}'; export default hc;`;\n }\n if (id === '\\0' + VIRTUAL_PROXY_HYDROGEN_ROUTES_ID) {\n return `import hr from '${VIRTUAL_HYDROGEN_ROUTES_ID}'; export default hr;`;\n }\n if (id === '\\0' + VIRTUAL_HYDROGEN_ROUTES_ID) {\n return importHydrogenConfig().then((hc) => {\n let routesPath = (typeof hc.routes === 'string' ? hc.routes : hc.routes?.files) ??\n '/src/routes';\n if (routesPath.startsWith('./')) {\n routesPath = routesPath.slice(1);\n }\n if (!routesPath.includes('*')) {\n if (!routesPath.endsWith('/')) {\n routesPath += '/';\n }\n routesPath += '**/*.server.[jt](s|sx)';\n }\n const [dirPrefix] = routesPath.split('/*');\n let code = `export default {\\n dirPrefix: '${dirPrefix}',\\n basePath: '${hc.routes?.basePath ?? ''}',\\n files: import.meta.globEager('${routesPath}')\\n};`;\n if (config.command === 'serve') {\n // Add dependency on Hydrogen config for HMR\n code += `\\nimport '${VIRTUAL_HYDROGEN_CONFIG_ID}';`;\n }\n return { code };\n });\n }\n },\n };\n async function importHydrogenConfig() {\n if (server) {\n const loaded = await server.ssrLoadModule(VIRTUAL_PROXY_HYDROGEN_CONFIG_ID);\n return loaded.default;\n }\n const { loaded } = await viteception([VIRTUAL_PROXY_HYDROGEN_CONFIG_ID]);\n return loaded[0].default;\n }\n function addPathToConfigProxy() {\n return {\n name: 'hydrogen:virtual-files-post',\n enforce: 'post',\n transform(code, id) {\n if (id === '\\0' + VIRTUAL_PROXY_HYDROGEN_CONFIG_ID) {\n // The CLI needs to import the Hydrogen config path\n return (code + ` export const configPath = '${resolvedConfigPath || ''}';`);\n }\n },\n };\n }\n};\nasync function findHydrogenConfigPath(root, userProvidedPath) {\n let configPath = userProvidedPath;\n if (!configPath) {\n // Find the config file in the project root\n const files = await fs.readdir(root);\n configPath = files.find((file) => /^hydrogen\\.config\\.[jt]s$/.test(file));\n }\n if (configPath) {\n configPath = normalizePath(configPath);\n if (!configPath.startsWith('/'))\n configPath = path.resolve(root, configPath);\n }\n return (configPath ||\n require.resolve(\n // eslint-disable-next-line node/no-missing-require\n '@shopify/hydrogen/utilities/empty-hydrogen-config'));\n}\n","// Provide Hydrogen config loader to external tools like the CLI\nimport { VIRTUAL_PROXY_HYDROGEN_CONFIG_ID } from './plugins/vite-plugin-hydrogen-virtual-files';\nimport { viteception } from './viteception';\nexport async function loadConfig(options = { root: process.cwd() }) {\n const { loaded } = await viteception([VIRTUAL_PROXY_HYDROGEN_CONFIG_ID], options);\n return {\n configuration: loaded[0].default,\n configurationPath: loaded[0].configPath,\n };\n}\n","import {genericConfigurationFileNames} from '../constants'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport {HydrogenConfig} from '@shopify/hydrogen/config'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport {loadConfig} from '@shopify/hydrogen/load-config'\nimport {dependency, path, error as kitError, file} from '@shopify/cli-kit'\n\nexport interface HydrogenApp {\n name: string\n directory: string\n dependencyManager: dependency.DependencyManager\n configuration: HydrogenConfig\n nodeDependencies: {[key: string]: string}\n language: 'JavaScript' | 'TypeScript'\n errors?: AppErrors\n}\n\ninterface AppLoaderConstructorArgs {\n directory: string\n}\n\nclass AppErrors {\n private errors: {\n [key: string]: string\n } = {}\n\n addError(path: string, message: string): void {\n this.errors[path] = message\n }\n\n getError(path: string): string {\n return this.errors[path]\n }\n\n isEmpty() {\n return Object.keys(this.errors).length === 0\n }\n\n toJSON(): string[] {\n return Object.values(this.errors)\n }\n}\n\nclass HydrogenAppLoader {\n private directory: string\n private errors: AppErrors = new AppErrors()\n\n constructor({directory}: AppLoaderConstructorArgs) {\n this.directory = directory\n }\n\n async loaded() {\n if (!(await file.exists(this.directory))) {\n throw new kitError.Abort(`Couldn't find directory ${this.directory}`)\n }\n\n const {configuration} = await this.loadConfig()\n\n const yarnLockPath = path.join(this.directory, genericConfigurationFileNames.yarn.lockfile)\n const yarnLockExists = await file.exists(yarnLockPath)\n const pnpmLockPath = path.join(this.directory, genericConfigurationFileNames.pnpm.lockfile)\n const pnpmLockExists = await file.exists(pnpmLockPath)\n const packageJSONPath = path.join(this.directory, 'package.json')\n const name = await dependency.getPackageName(packageJSONPath)\n const nodeDependencies = await dependency.getDependencies(packageJSONPath)\n const tsConfigExists = await file.exists(path.join(this.directory, 'tsconfig.json'))\n const language = tsConfigExists && nodeDependencies.typescript ? 'TypeScript' : 'JavaScript'\n\n let dependencyManager: dependency.DependencyManager\n if (yarnLockExists) {\n dependencyManager = 'yarn'\n } else if (pnpmLockExists) {\n dependencyManager = 'pnpm'\n } else {\n dependencyManager = 'npm'\n }\n\n const app: HydrogenApp = {\n name,\n directory: this.directory,\n configuration,\n dependencyManager,\n nodeDependencies,\n language,\n }\n\n if (!this.errors.isEmpty()) app.errors = this.errors\n\n return app\n }\n\n async loadConfig() {\n const abortError = new kitError.Abort(`Couldn't find hydrogen configuration file`)\n\n try {\n const config = await loadConfig({root: this.directory})\n\n if (!config) {\n throw abortError\n }\n\n return config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n abortError.stack = error.stack\n throw abortError\n }\n }\n}\n\nexport async function load(directory: string): Promise<HydrogenApp> {\n const loader = new HydrogenAppLoader({directory})\n\n return loader.loaded()\n}\n"],"names":["kitError"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/cli-hydrogen",
3
- "version": "3.0.16",
3
+ "version": "3.0.19",
4
4
  "private": false,
5
5
  "description": "Commands for building Hydrogen storefronts",
6
6
  "type": "module",
@@ -34,49 +34,22 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@oclif/core": "^1.0.0",
37
- "@shopify/hydrogen": "^0.22.1",
37
+ "@shopify/hydrogen": "^0.26.0",
38
38
  "@shopify/mini-oxygen": "^0.0.5",
39
39
  "@types/prettier": "^2.6.3",
40
40
  "prettier": "^2.6.1",
41
41
  "vite": "^2.9.9",
42
- "@shopify/cli-kit": "^3.0.16"
42
+ "@shopify/cli-kit": "^3.0.19"
43
43
  },
44
44
  "devDependencies": {
45
- "@babel/core": "^7.17.10",
46
- "@shopify/ast-utilities": "^1.3.4",
47
- "@shopify/cli-testing": "3.0.16",
45
+ "@shopify/cli-testing": "3.0.19",
48
46
  "@shopify/prettier-config": "^1.1.2",
49
- "@types/change-case": "^2.3.1",
50
- "@types/connect": "^3.4.35",
51
- "@types/debug": "^4.1.7",
52
- "@types/degit": "^2.8.3",
53
- "@types/faker": "^5.5.7",
54
47
  "@types/fs-extra": "^9.0.12",
55
- "@types/inquirer": "^7.3.3",
56
- "@types/mime": "^2.0.3",
57
- "@types/minimist": "^1.2.2",
58
- "@types/semver": "^7.3.9",
59
- "ajv": "^8.11.0",
60
- "ajv-formats": "^2.1.1",
61
- "chalk": "^4.1.2",
62
- "change-case": "^4.1.2",
63
- "conf": "^10.1.2",
64
- "connect": "^3.7.0",
65
- "cosmiconfig": "^7.0.1",
66
- "debug": "^4.3.4",
67
- "degit": "^2.8.4",
68
- "faker": "^5.5.3",
69
48
  "fast-glob": "^3.2.11",
70
49
  "fs-extra": "^10.0.0",
71
- "get-port": "^5.1.1",
72
- "inquirer": "^8.2.4",
73
- "mime": "^3.0.0",
74
- "minimist": "^1.2.6",
75
- "semver": "^7.3.5",
76
- "sirv": "^1.0.14",
77
50
  "typescript": "^4.6.4",
78
51
  "vite": "^2.9.9",
79
- "vitest": "0.13.1"
52
+ "vitest": "^0.15.1"
80
53
  },
81
54
  "engine-strict": true,
82
55
  "engines": {
@@ -1,121 +0,0 @@
1
- import { dependency, path, file, error } from '@shopify/cli-kit';
2
- import { createServer } from 'vite';
3
-
4
- const configurationFileNames = {
5
- hydrogen: "hydrogen.config"
6
- };
7
- const supportedConfigExtensions = ["ts", "js", "mjs", "cjs", "json"];
8
- const genericConfigurationFileNames = {
9
- tailwind: "tailwind.config",
10
- postCSS: "postcss.config",
11
- eslint: ".eslintrc.js",
12
- typescript: {
13
- config: "tsconfig.json"
14
- },
15
- ...dependency.genericConfigurationFileNames
16
- };
17
-
18
- class AppErrors {
19
- constructor() {
20
- this.errors = {};
21
- }
22
- addError(path2, message) {
23
- this.errors[path2] = message;
24
- }
25
- getError(path2) {
26
- return this.errors[path2];
27
- }
28
- isEmpty() {
29
- return Object.keys(this.errors).length === 0;
30
- }
31
- toJSON() {
32
- return Object.values(this.errors);
33
- }
34
- }
35
- class AppLoader {
36
- constructor({ directory, mode }) {
37
- this.appDirectory = "";
38
- this.configurationPath = "";
39
- this.errors = new AppErrors();
40
- this.mode = mode;
41
- this.directory = directory;
42
- }
43
- async loaded() {
44
- this.appDirectory = await this.findAppDirectory();
45
- const configurationPath = await this.getConfigurationPath();
46
- const configuration = await this.loadConfigurationFile(configurationPath);
47
- const yarnLockPath = path.join(this.appDirectory, genericConfigurationFileNames.yarn.lockfile);
48
- const yarnLockExists = await file.exists(yarnLockPath);
49
- const pnpmLockPath = path.join(this.appDirectory, genericConfigurationFileNames.pnpm.lockfile);
50
- const pnpmLockExists = await file.exists(pnpmLockPath);
51
- const packageJSONPath = path.join(this.appDirectory, "package.json");
52
- const name = await dependency.getPackageName(packageJSONPath);
53
- const nodeDependencies = await dependency.getDependencies(packageJSONPath);
54
- const tsConfigExists = await file.exists(path.join(this.appDirectory, "tsconfig.json"));
55
- const language = tsConfigExists && nodeDependencies.typescript ? "typescript" : "javascript";
56
- let dependencyManager;
57
- if (yarnLockExists) {
58
- dependencyManager = "yarn";
59
- } else if (pnpmLockExists) {
60
- dependencyManager = "pnpm";
61
- } else {
62
- dependencyManager = "npm";
63
- }
64
- const app = {
65
- name,
66
- directory: this.appDirectory,
67
- configuration,
68
- configurationPath,
69
- dependencyManager,
70
- nodeDependencies,
71
- language
72
- };
73
- if (!this.errors.isEmpty())
74
- app.errors = this.errors;
75
- return app;
76
- }
77
- async findAppDirectory() {
78
- if (!await file.exists(this.directory)) {
79
- throw new error.Abort(`Couldn't find directory ${this.directory}`);
80
- }
81
- return path.dirname(await this.getConfigurationPath());
82
- }
83
- async getConfigurationPath() {
84
- if (this.configurationPath)
85
- return this.configurationPath;
86
- const promises = supportedConfigExtensions.map((ext) => path.findUp([configurationFileNames.hydrogen, ext].join("."), {
87
- cwd: this.directory,
88
- type: "file"
89
- }));
90
- const configurationPathResults = await Promise.all(promises);
91
- const configurationPath = configurationPathResults.find((result) => result !== void 0);
92
- if (!configurationPath) {
93
- throw new error.Abort(`Couldn't find the configuration file for ${this.directory}, are you in an app directory?`);
94
- }
95
- this.configurationPath = configurationPath;
96
- return configurationPath;
97
- }
98
- async loadConfigurationFile(filepath) {
99
- const server = await createServer({
100
- server: { middlewareMode: "ssr" }
101
- });
102
- const config = (await server.ssrLoadModule(filepath)).default;
103
- await server.close();
104
- return config;
105
- }
106
- abortOrReport(errorMessage, fallback, configurationPath) {
107
- if (this.mode === "strict") {
108
- throw new error.Abort(errorMessage);
109
- } else {
110
- this.errors.addError(configurationPath, errorMessage);
111
- return fallback;
112
- }
113
- }
114
- }
115
- async function load(directory, mode = "strict") {
116
- const loader = new AppLoader({ directory, mode });
117
- return loader.loaded();
118
- }
119
-
120
- export { genericConfigurationFileNames as g, load as l };
121
- //# sourceMappingURL=hydrogen-9efd5ae6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hydrogen-9efd5ae6.js","sources":["../src/cli/constants.ts","../src/cli/models/hydrogen.ts"],"sourcesContent":["import {dependency} from '@shopify/cli-kit'\n\nexport const configurationFileNames = {\n hydrogen: 'hydrogen.config',\n} as const\n\nexport const supportedConfigExtensions = ['ts', 'js', 'mjs', 'cjs', 'json']\n\nexport const dotEnvFileNames = {\n production: '.env',\n}\n\nexport const genericConfigurationFileNames = {\n tailwind: 'tailwind.config',\n postCSS: 'postcss.config',\n eslint: '.eslintrc.js',\n typescript: {\n config: 'tsconfig.json',\n },\n ...dependency.genericConfigurationFileNames,\n} as const\n","import {configurationFileNames, genericConfigurationFileNames, supportedConfigExtensions} from '../constants'\nimport {HydrogenConfig} from '@shopify/hydrogen/config'\nimport {dependency, path, file, error} from '@shopify/cli-kit'\nimport {createServer} from 'vite'\n\nexport interface HydrogenApp {\n name: string\n directory: string\n dependencyManager: dependency.DependencyManager\n configuration: HydrogenConfig\n configurationPath: string\n nodeDependencies: {[key: string]: string}\n language: 'javascript' | 'typescript'\n errors?: AppErrors\n}\n\nexport type AppLoaderMode = 'strict' | 'report'\n\ninterface AppLoaderConstructorArgs {\n directory: string\n mode: AppLoaderMode\n}\n\nclass AppErrors {\n private errors: {\n [key: string]: string\n } = {}\n\n addError(path: string, message: string): void {\n this.errors[path] = message\n }\n\n getError(path: string): string {\n return this.errors[path]\n }\n\n isEmpty() {\n return Object.keys(this.errors).length === 0\n }\n\n toJSON(): string[] {\n return Object.values(this.errors)\n }\n}\n\nclass AppLoader {\n private directory: string\n private mode: AppLoaderMode\n private appDirectory = ''\n private configurationPath = ''\n private errors: AppErrors = new AppErrors()\n\n constructor({directory, mode}: AppLoaderConstructorArgs) {\n this.mode = mode\n this.directory = directory\n }\n\n async loaded() {\n this.appDirectory = await this.findAppDirectory()\n const configurationPath = await this.getConfigurationPath()\n const configuration = await this.loadConfigurationFile<HydrogenConfig>(configurationPath)\n const yarnLockPath = path.join(this.appDirectory, genericConfigurationFileNames.yarn.lockfile)\n const yarnLockExists = await file.exists(yarnLockPath)\n const pnpmLockPath = path.join(this.appDirectory, genericConfigurationFileNames.pnpm.lockfile)\n const pnpmLockExists = await file.exists(pnpmLockPath)\n const packageJSONPath = path.join(this.appDirectory, 'package.json')\n const name = await dependency.getPackageName(packageJSONPath)\n const nodeDependencies = await dependency.getDependencies(packageJSONPath)\n const tsConfigExists = await file.exists(path.join(this.appDirectory, 'tsconfig.json'))\n const language = tsConfigExists && nodeDependencies.typescript ? 'typescript' : 'javascript'\n\n let dependencyManager: dependency.DependencyManager\n if (yarnLockExists) {\n dependencyManager = 'yarn'\n } else if (pnpmLockExists) {\n dependencyManager = 'pnpm'\n } else {\n dependencyManager = 'npm'\n }\n\n const app: HydrogenApp = {\n name,\n directory: this.appDirectory,\n configuration,\n configurationPath,\n dependencyManager,\n nodeDependencies,\n language,\n }\n if (!this.errors.isEmpty()) app.errors = this.errors\n\n return app\n }\n\n async findAppDirectory() {\n if (!(await file.exists(this.directory))) {\n throw new error.Abort(`Couldn't find directory ${this.directory}`)\n }\n return path.dirname(await this.getConfigurationPath())\n }\n\n async getConfigurationPath() {\n if (this.configurationPath) return this.configurationPath\n\n const promises = supportedConfigExtensions.map((ext) =>\n path.findUp([configurationFileNames.hydrogen, ext].join('.'), {\n cwd: this.directory,\n type: 'file',\n }),\n )\n\n const configurationPathResults = await Promise.all(promises)\n\n const configurationPath = configurationPathResults.find((result) => result !== undefined)\n\n if (!configurationPath) {\n throw new error.Abort(`Couldn't find the configuration file for ${this.directory}, are you in an app directory?`)\n }\n\n this.configurationPath = configurationPath\n return configurationPath\n }\n\n async loadConfigurationFile<T>(filepath: string): Promise<T> {\n const server = await createServer({\n server: {middlewareMode: 'ssr'},\n })\n\n const config = (await server.ssrLoadModule(filepath)).default\n\n await server.close()\n\n return config\n }\n\n abortOrReport<T>(errorMessage: string, fallback: T, configurationPath: string): T {\n if (this.mode === 'strict') {\n throw new error.Abort(errorMessage)\n } else {\n this.errors.addError(configurationPath, errorMessage)\n return fallback\n }\n }\n}\n\nexport async function load(directory: string, mode: AppLoaderMode = 'strict'): Promise<HydrogenApp> {\n const loader = new AppLoader({directory, mode})\n return loader.loaded()\n}\n"],"names":[],"mappings":"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"}