@shopify/cli-hydrogen 3.36.0 → 3.36.2

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.
Files changed (37) hide show
  1. package/dist/cli/commands/hydrogen/add/eslint.js +2 -2
  2. package/dist/cli/commands/hydrogen/add/eslint.js.map +1 -1
  3. package/dist/cli/commands/hydrogen/add/tailwind.js +2 -2
  4. package/dist/cli/commands/hydrogen/add/tailwind.js.map +1 -1
  5. package/dist/cli/commands/hydrogen/build.js +2 -2
  6. package/dist/cli/commands/hydrogen/build.js.map +1 -1
  7. package/dist/cli/commands/hydrogen/deploy.js +2 -2
  8. package/dist/cli/commands/hydrogen/deploy.js.map +1 -1
  9. package/dist/cli/commands/hydrogen/dev.js +2 -2
  10. package/dist/cli/commands/hydrogen/dev.js.map +1 -1
  11. package/dist/cli/commands/hydrogen/info.js +2 -2
  12. package/dist/cli/commands/hydrogen/info.js.map +1 -1
  13. package/dist/cli/commands/hydrogen/preview.js +2 -2
  14. package/dist/cli/commands/hydrogen/preview.js.map +1 -1
  15. package/dist/cli/models/hydrogen.js +3 -3
  16. package/dist/cli/models/hydrogen.js.map +1 -1
  17. package/dist/cli/services/build.js +3 -2
  18. package/dist/cli/services/build.js.map +1 -1
  19. package/dist/cli/services/deploy/config.js +2 -2
  20. package/dist/cli/services/deploy/config.js.map +1 -1
  21. package/dist/cli/services/deploy/upload.js +10 -10
  22. package/dist/cli/services/deploy/upload.js.map +1 -1
  23. package/dist/cli/services/dev.js +2 -2
  24. package/dist/cli/services/dev.js.map +1 -1
  25. package/dist/cli/services/eslint.js +3 -2
  26. package/dist/cli/services/eslint.js.map +1 -1
  27. package/dist/cli/services/preview.d.ts +2 -2
  28. package/dist/cli/services/preview.js +3 -2
  29. package/dist/cli/services/preview.js.map +1 -1
  30. package/dist/cli/services/tailwind.js +4 -3
  31. package/dist/cli/services/tailwind.js.map +1 -1
  32. package/dist/tsconfig.tsbuildinfo +1 -1
  33. package/oclif.manifest.json +1 -1
  34. package/package.json +2 -2
  35. package/dist/cli/services/deploy/error.d.ts +0 -4
  36. package/dist/cli/services/deploy/error.js +0 -11
  37. package/dist/cli/services/deploy/error.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { error } from '@shopify/cli-kit';
1
+ import { BugError } from '@shopify/cli-kit/node/error';
2
2
  interface PreviewOptions {
3
3
  directory: string;
4
4
  port: number;
@@ -8,5 +8,5 @@ interface PreviewOptionsWorker extends PreviewOptions {
8
8
  }
9
9
  export declare function previewInNode({ directory, port }: PreviewOptions): Promise<void>;
10
10
  export declare function previewInWorker({ directory, port, envPath }: PreviewOptionsWorker): Promise<void>;
11
- export declare const OxygenPreviewExecutableNotFound: error.Bug;
11
+ export declare const OxygenPreviewExecutableNotFound: BugError;
12
12
  export {};
@@ -1,8 +1,9 @@
1
- import { error, output } from '@shopify/cli-kit';
1
+ import { output } from '@shopify/cli-kit';
2
2
  import { readAndParseDotEnv } from '@shopify/cli-kit/node/dot-env';
3
3
  import { fileExists, removeFileSync, writeFile, findPathUp } from '@shopify/cli-kit/node/fs';
4
4
  import { exec } from '@shopify/cli-kit/node/system';
5
5
  import { resolvePath, dirname } from '@shopify/cli-kit/node/path';
6
+ import { BugError } from '@shopify/cli-kit/node/error';
6
7
  import { fileURLToPath } from 'url';
7
8
  export async function previewInNode({ directory, port }) {
8
9
  const buildOutputPath = await resolvePath(directory, 'dist/node');
@@ -54,7 +55,7 @@ export async function previewInWorker({ directory, port, envPath }) {
54
55
  stderr: process.stderr,
55
56
  });
56
57
  }
57
- export const OxygenPreviewExecutableNotFound = new error.Bug('Could not locate the executable file to run Oxygen locally.');
58
+ export const OxygenPreviewExecutableNotFound = new BugError('Could not locate the executable file to run Oxygen locally.');
58
59
  async function oxygenPreviewExecutable() {
59
60
  const cwd = dirname(fileURLToPath(import.meta.url));
60
61
  const executablePath = await findPathUp('node_modules/.bin/oxygen-preview', {
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/cli/services/preview.ts"],"names":[],"mappings":"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","sourcesContent":["import {error, output} from '@shopify/cli-kit'\nimport {readAndParseDotEnv, DotEnvFile} from '@shopify/cli-kit/node/dot-env'\nimport {fileExists, removeFileSync, writeFile, findPathUp} from '@shopify/cli-kit/node/fs'\nimport {exec} from '@shopify/cli-kit/node/system'\nimport {resolvePath, dirname} from '@shopify/cli-kit/node/path'\nimport {fileURLToPath} from 'url'\n\ninterface PreviewOptions {\n directory: string\n port: number\n}\n\ninterface PreviewOptionsWorker extends PreviewOptions {\n envPath: string | undefined\n}\n\ninterface EnvConfig {\n env: DotEnvFile['variables']\n}\n\nexport async function previewInNode({directory, port}: PreviewOptions) {\n const buildOutputPath = await resolvePath(directory, 'dist/node')\n\n if (!(await fileExists(buildOutputPath))) {\n output.info(\n output.content`Couldn’t find a Node.js server build for this project. Running ${output.token.packagejsonScript(\n 'yarn',\n 'shopify hydrogen build',\n '--target=node',\n )} to create one.`,\n )\n\n await exec('yarn', ['shopify', 'hydrogen', 'build', '--target=node'], {\n cwd: directory,\n stdout: process.stdout,\n stderr: process.stderr,\n })\n }\n\n await exec('node', ['--enable-source-maps', buildOutputPath], {\n env: {PORT: `${port}`},\n cwd: directory,\n stdout: process.stdout,\n stderr: process.stderr,\n })\n}\n\nexport async function previewInWorker({directory, port, envPath}: PreviewOptionsWorker) {\n const config = {\n port,\n workerFile: 'dist/worker/index.js',\n assetsDir: 'dist/client',\n buildCommand: 'yarn build',\n modules: true,\n watch: true,\n buildWatchPaths: ['./src'],\n autoReload: true,\n ...(envPath && (await parseEnvPath(envPath))),\n }\n\n await writeFile(resolvePath(directory, 'mini-oxygen.config.json'), JSON.stringify(config, null, 2))\n\n function cleanUp(options: {exit: boolean}) {\n if (options.exit) {\n removeFileSync(resolvePath(directory, 'mini-oxygen.config.json'))\n }\n }\n\n async function parseEnvPath(envPath: string): Promise<EnvConfig> {\n const {variables} = await readAndParseDotEnv(envPath)\n return {\n env: variables,\n }\n }\n\n process.on('SIGINT', cleanUp.bind(null, {exit: true}))\n\n const executable = await oxygenPreviewExecutable()\n\n await exec(executable, [], {\n env: {NODE_OPTIONS: '--experimental-vm-modules'},\n cwd: directory,\n stdout: process.stdout,\n stderr: process.stderr,\n })\n}\n\nexport const OxygenPreviewExecutableNotFound = new error.Bug(\n 'Could not locate the executable file to run Oxygen locally.',\n)\n\nasync function oxygenPreviewExecutable(): Promise<string> {\n const cwd = dirname(fileURLToPath(import.meta.url))\n const executablePath = await findPathUp('node_modules/.bin/oxygen-preview', {\n type: 'file',\n cwd,\n allowSymlinks: true,\n })\n if (!executablePath) {\n throw OxygenPreviewExecutableNotFound\n }\n return executablePath\n}\n"]}
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/cli/services/preview.ts"],"names":[],"mappings":"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","sourcesContent":["import {output} from '@shopify/cli-kit'\nimport {readAndParseDotEnv, DotEnvFile} from '@shopify/cli-kit/node/dot-env'\nimport {fileExists, removeFileSync, writeFile, findPathUp} from '@shopify/cli-kit/node/fs'\nimport {exec} from '@shopify/cli-kit/node/system'\nimport {resolvePath, dirname} from '@shopify/cli-kit/node/path'\nimport {BugError} from '@shopify/cli-kit/node/error'\nimport {fileURLToPath} from 'url'\n\ninterface PreviewOptions {\n directory: string\n port: number\n}\n\ninterface PreviewOptionsWorker extends PreviewOptions {\n envPath: string | undefined\n}\n\ninterface EnvConfig {\n env: DotEnvFile['variables']\n}\n\nexport async function previewInNode({directory, port}: PreviewOptions) {\n const buildOutputPath = await resolvePath(directory, 'dist/node')\n\n if (!(await fileExists(buildOutputPath))) {\n output.info(\n output.content`Couldn’t find a Node.js server build for this project. Running ${output.token.packagejsonScript(\n 'yarn',\n 'shopify hydrogen build',\n '--target=node',\n )} to create one.`,\n )\n\n await exec('yarn', ['shopify', 'hydrogen', 'build', '--target=node'], {\n cwd: directory,\n stdout: process.stdout,\n stderr: process.stderr,\n })\n }\n\n await exec('node', ['--enable-source-maps', buildOutputPath], {\n env: {PORT: `${port}`},\n cwd: directory,\n stdout: process.stdout,\n stderr: process.stderr,\n })\n}\n\nexport async function previewInWorker({directory, port, envPath}: PreviewOptionsWorker) {\n const config = {\n port,\n workerFile: 'dist/worker/index.js',\n assetsDir: 'dist/client',\n buildCommand: 'yarn build',\n modules: true,\n watch: true,\n buildWatchPaths: ['./src'],\n autoReload: true,\n ...(envPath && (await parseEnvPath(envPath))),\n }\n\n await writeFile(resolvePath(directory, 'mini-oxygen.config.json'), JSON.stringify(config, null, 2))\n\n function cleanUp(options: {exit: boolean}) {\n if (options.exit) {\n removeFileSync(resolvePath(directory, 'mini-oxygen.config.json'))\n }\n }\n\n async function parseEnvPath(envPath: string): Promise<EnvConfig> {\n const {variables} = await readAndParseDotEnv(envPath)\n return {\n env: variables,\n }\n }\n\n process.on('SIGINT', cleanUp.bind(null, {exit: true}))\n\n const executable = await oxygenPreviewExecutable()\n\n await exec(executable, [], {\n env: {NODE_OPTIONS: '--experimental-vm-modules'},\n cwd: directory,\n stdout: process.stdout,\n stderr: process.stderr,\n })\n}\n\nexport const OxygenPreviewExecutableNotFound = new BugError(\n 'Could not locate the executable file to run Oxygen locally.',\n)\n\nasync function oxygenPreviewExecutable(): Promise<string> {\n const cwd = dirname(fileURLToPath(import.meta.url))\n const executablePath = await findPathUp('node_modules/.bin/oxygen-preview', {\n type: 'file',\n cwd,\n allowSymlinks: true,\n })\n if (!executablePath) {\n throw OxygenPreviewExecutableNotFound\n }\n return executablePath\n}\n"]}
@@ -1,9 +1,10 @@
1
- import { ui, error } from '@shopify/cli-kit';
1
+ import { ui } from '@shopify/cli-kit';
2
2
  import { addNPMDependenciesWithoutVersionIfNeeded } from '@shopify/cli-kit/node/node-package-manager';
3
3
  import { addRecommendedExtensions } from '@shopify/cli-kit/node/vscode';
4
4
  import { exec } from '@shopify/cli-kit/node/system';
5
5
  import { writeFile, fileExists, removeFile, fileContentPrettyFormat, readFile } from '@shopify/cli-kit/node/fs';
6
6
  import { joinPath } from '@shopify/cli-kit/node/path';
7
+ import { AbortError } from '@shopify/cli-kit/node/error';
7
8
  import stream from 'stream';
8
9
  const tailwindImports = [
9
10
  "@import 'tailwindcss/base';",
@@ -47,7 +48,7 @@ export async function addTailwind({ app, force, install, directory }) {
47
48
  await removeFile(postCSSConfiguration);
48
49
  }
49
50
  else {
50
- throw new error.Abort('PostCSS config already exists.\nUse --force to override existing config.');
51
+ throw new AbortError('PostCSS config already exists.\nUse --force to override existing config.');
51
52
  }
52
53
  }
53
54
  const postCSSConfig = await fileContentPrettyFormat(['module.exports = {', 'plugins: {', 'tailwindcss: {},', 'autoprefixer: {},', '},', ' };'].join('\n'), { path: 'postcss.config.js' });
@@ -64,7 +65,7 @@ export async function addTailwind({ app, force, install, directory }) {
64
65
  await removeFile(tailwindConfigurationPath);
65
66
  }
66
67
  else {
67
- throw new error.Abort('Tailwind config already exists.\nUse --force to override existing config.');
68
+ throw new AbortError('Tailwind config already exists.\nUse --force to override existing config.');
68
69
  }
69
70
  }
70
71
  await exec(app.packageManager, ['tailwindcss', 'init', tailwindConfigurationPath], {
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind.js","sourceRoot":"","sources":["../../../src/cli/services/tailwind.ts"],"names":[],"mappings":"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","sourcesContent":["import {HydrogenApp} from '../models/hydrogen.js'\nimport {ui, error} from '@shopify/cli-kit'\nimport {addNPMDependenciesWithoutVersionIfNeeded} from '@shopify/cli-kit/node/node-package-manager'\nimport {addRecommendedExtensions} from '@shopify/cli-kit/node/vscode'\nimport {exec} from '@shopify/cli-kit/node/system'\nimport {writeFile, fileExists, removeFile, fileContentPrettyFormat, readFile} from '@shopify/cli-kit/node/fs'\nimport {joinPath} from '@shopify/cli-kit/node/path'\nimport stream from '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 = ui.newListr([\n {\n title: 'Installing additional dependencies',\n skip: () => !install,\n task: async (_, task) => {\n const requiredDependencies = ['postcss', 'postcss-loader', 'tailwindcss', 'autoprefixer']\n await addNPMDependenciesWithoutVersionIfNeeded(requiredDependencies, {\n packageManager: app.packageManager,\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 = joinPath(directory, 'postcss.config.js')\n\n if (await fileExists(postCSSConfiguration)) {\n if (force) {\n await removeFile(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 fileContentPrettyFormat(\n ['module.exports = {', 'plugins: {', 'tailwindcss: {},', 'autoprefixer: {},', '},', ' };'].join('\\n'),\n {path: 'postcss.config.js'},\n )\n\n await writeFile(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 = joinPath(directory, 'tailwind.config.js')\n\n if (await fileExists(tailwindConfigurationPath)) {\n if (force) {\n await removeFile(tailwindConfigurationPath)\n } else {\n throw new error.Abort('Tailwind config already exists.\\nUse --force to override existing config.')\n }\n }\n\n await exec(app.packageManager, ['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 = joinPath(directory, 'src', 'index.css')\n const indexCSS = await readFile(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 writeFile(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 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 readFile(filepath)\n const modified = original.replace(find, replace)\n await writeFile(filepath, modified)\n}\n"]}
1
+ {"version":3,"file":"tailwind.js","sourceRoot":"","sources":["../../../src/cli/services/tailwind.ts"],"names":[],"mappings":"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","sourcesContent":["import {HydrogenApp} from '../models/hydrogen.js'\nimport {ui} from '@shopify/cli-kit'\nimport {addNPMDependenciesWithoutVersionIfNeeded} from '@shopify/cli-kit/node/node-package-manager'\nimport {addRecommendedExtensions} from '@shopify/cli-kit/node/vscode'\nimport {exec} from '@shopify/cli-kit/node/system'\nimport {writeFile, fileExists, removeFile, fileContentPrettyFormat, readFile} from '@shopify/cli-kit/node/fs'\nimport {joinPath} from '@shopify/cli-kit/node/path'\nimport {AbortError} from '@shopify/cli-kit/node/error'\nimport stream from '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 = ui.newListr([\n {\n title: 'Installing additional dependencies',\n skip: () => !install,\n task: async (_, task) => {\n const requiredDependencies = ['postcss', 'postcss-loader', 'tailwindcss', 'autoprefixer']\n await addNPMDependenciesWithoutVersionIfNeeded(requiredDependencies, {\n packageManager: app.packageManager,\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 = joinPath(directory, 'postcss.config.js')\n\n if (await fileExists(postCSSConfiguration)) {\n if (force) {\n await removeFile(postCSSConfiguration)\n } else {\n throw new AbortError('PostCSS config already exists.\\nUse --force to override existing config.')\n }\n }\n\n const postCSSConfig = await fileContentPrettyFormat(\n ['module.exports = {', 'plugins: {', 'tailwindcss: {},', 'autoprefixer: {},', '},', ' };'].join('\\n'),\n {path: 'postcss.config.js'},\n )\n\n await writeFile(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 = joinPath(directory, 'tailwind.config.js')\n\n if (await fileExists(tailwindConfigurationPath)) {\n if (force) {\n await removeFile(tailwindConfigurationPath)\n } else {\n throw new AbortError('Tailwind config already exists.\\nUse --force to override existing config.')\n }\n }\n\n await exec(app.packageManager, ['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 = joinPath(directory, 'src', 'index.css')\n const indexCSS = await readFile(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 writeFile(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 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 readFile(filepath)\n const modified = original.replace(find, replace)\n await writeFile(filepath, modified)\n}\n"]}