@shopify/cli-hydrogen 3.12.0 → 3.13.0

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 (41) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cli/commands/hydrogen/build.js +2 -2
  3. package/dist/cli/commands/hydrogen/build.js.map +1 -1
  4. package/dist/cli/commands/hydrogen/deploy.d.ts +17 -0
  5. package/dist/cli/commands/hydrogen/deploy.js +53 -0
  6. package/dist/cli/commands/hydrogen/deploy.js.map +1 -0
  7. package/dist/cli/commands/hydrogen/preview.d.ts +1 -0
  8. package/dist/cli/commands/hydrogen/preview.js +9 -1
  9. package/dist/cli/commands/hydrogen/preview.js.map +1 -1
  10. package/dist/cli/prompts/git-init.d.ts +1 -0
  11. package/dist/cli/prompts/git-init.js +16 -0
  12. package/dist/cli/prompts/git-init.js.map +1 -0
  13. package/dist/cli/services/build.d.ts +6 -3
  14. package/dist/cli/services/build.js +34 -31
  15. package/dist/cli/services/build.js.map +1 -1
  16. package/dist/cli/services/deploy/config.d.ts +4 -0
  17. package/dist/cli/services/deploy/config.js +48 -0
  18. package/dist/cli/services/deploy/config.js.map +1 -0
  19. package/dist/cli/services/deploy/error.d.ts +2 -0
  20. package/dist/cli/services/deploy/error.js +5 -0
  21. package/dist/cli/services/deploy/error.js.map +1 -0
  22. package/dist/cli/services/deploy/graphql/create_deployment.d.ts +10 -0
  23. package/dist/cli/services/deploy/graphql/create_deployment.js +15 -0
  24. package/dist/cli/services/deploy/graphql/create_deployment.js.map +1 -0
  25. package/dist/cli/services/deploy/graphql/upload_deployment.d.ts +1 -0
  26. package/dist/cli/services/deploy/graphql/upload_deployment.js +11 -0
  27. package/dist/cli/services/deploy/graphql/upload_deployment.js.map +1 -0
  28. package/dist/cli/services/deploy/types.d.ts +27 -0
  29. package/dist/cli/services/deploy/types.js +2 -0
  30. package/dist/cli/services/deploy/types.js.map +1 -0
  31. package/dist/cli/services/deploy/upload.d.ts +5 -0
  32. package/dist/cli/services/deploy/upload.js +61 -0
  33. package/dist/cli/services/deploy/upload.js.map +1 -0
  34. package/dist/cli/services/deploy.d.ts +2 -0
  35. package/dist/cli/services/deploy.js +82 -0
  36. package/dist/cli/services/deploy.js.map +1 -0
  37. package/dist/cli/services/preview.d.ts +4 -1
  38. package/dist/cli/services/preview.js +9 -1
  39. package/dist/cli/services/preview.js.map +1 -1
  40. package/dist/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +4 -3
@@ -0,0 +1,82 @@
1
+ import { createDeployment, healthCheck, uploadDeployment } from './deploy/upload.js';
2
+ import { buildTaskList } from './build.js';
3
+ import { validateProject, fillDeployConfig } from './deploy/config.js';
4
+ import { environment, system, ui } from '@shopify/cli-kit';
5
+ const isUnitTest = environment.local.isUnitTest();
6
+ export async function deployToOxygen(_config) {
7
+ const backoffPolicy = [5, 10, 15, 30, 60];
8
+ await validateProject(_config);
9
+ /* eslint-disable require-atomic-updates */
10
+ const tasks = [
11
+ {
12
+ title: '📝 Getting deployment config',
13
+ task: async (ctx, task) => {
14
+ ctx.config = await fillDeployConfig(_config);
15
+ task.title = '📝 Deployment config parsed';
16
+ },
17
+ },
18
+ {
19
+ title: '💡 Initializing deployment',
20
+ task: async (ctx, task) => {
21
+ const { deploymentID, assetBaseURL } = await createDeployment(ctx.config);
22
+ ctx.assetBaseURL = assetBaseURL;
23
+ ctx.deploymentID = deploymentID;
24
+ task.title = '✨ Deployment initialized';
25
+ },
26
+ retry: 2,
27
+ },
28
+ {
29
+ title: '🛠 Building project',
30
+ task: async (ctx, task) => {
31
+ const subTasks = buildTaskList({
32
+ directory: ctx.config.path,
33
+ targets: {
34
+ client: true,
35
+ worker: '@shopify/hydrogen/platforms/worker',
36
+ node: false,
37
+ },
38
+ assetBaseURL: ctx.assetBaseURL,
39
+ });
40
+ return task.newListr(subTasks);
41
+ },
42
+ },
43
+ {
44
+ title: '🚀 Uploading deployment files',
45
+ task: async (ctx, task) => {
46
+ ctx.previewURL = await uploadDeployment(ctx.config, ctx.deploymentID);
47
+ task.output = `Preview URL: ${ctx.previewURL}`;
48
+ task.title = '🚀 Files uploaded';
49
+ },
50
+ options: {
51
+ bottomBar: Infinity,
52
+ persistentOutput: true,
53
+ },
54
+ retry: 2,
55
+ },
56
+ {
57
+ title: '📡 Checking deployment health',
58
+ task: async (ctx, task) => {
59
+ const retryCount = task.isRetrying()?.count;
60
+ if (retryCount === backoffPolicy.length) {
61
+ task.title =
62
+ "The deployment uploaded but hasn't become reachable within 2 minutes. Check the preview URL to see if deployment succeeded. If it didn't, then try again later.";
63
+ return;
64
+ }
65
+ if (retryCount && !isUnitTest)
66
+ await system.sleep(backoffPolicy[retryCount - 1]);
67
+ await healthCheck(ctx.previewURL);
68
+ task.title = '✅ Deployed successfully';
69
+ },
70
+ retry: backoffPolicy.length,
71
+ skip: (ctx) => !ctx.config.healthCheck,
72
+ },
73
+ ];
74
+ /* eslint-enable require-atomic-updates */
75
+ const list = ui.newListr(tasks, {
76
+ concurrent: false,
77
+ rendererOptions: { collapse: false },
78
+ rendererSilent: isUnitTest,
79
+ });
80
+ return list.run();
81
+ }
82
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/cli/services/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["import {DeployConfig, ReqDeployConfig} from './deploy/types.js'\nimport {createDeployment, healthCheck, uploadDeployment} from './deploy/upload.js'\nimport {buildTaskList} from './build.js'\nimport {validateProject, fillDeployConfig} from './deploy/config.js'\nimport {environment, system, ui} from '@shopify/cli-kit'\n\ninterface TaskContext {\n config: ReqDeployConfig\n deploymentID: string\n assetBaseURL: string\n previewURL: string\n}\n\nconst isUnitTest = environment.local.isUnitTest()\n\nexport async function deployToOxygen(_config: DeployConfig) {\n const backoffPolicy = [5, 10, 15, 30, 60]\n\n await validateProject(_config)\n\n /* eslint-disable require-atomic-updates */\n const tasks: ui.ListrTask<TaskContext>[] = [\n {\n title: '📝 Getting deployment config',\n task: async (ctx, task) => {\n ctx.config = await fillDeployConfig(_config)\n task.title = '📝 Deployment config parsed'\n },\n },\n {\n title: '💡 Initializing deployment',\n task: async (ctx, task) => {\n const {deploymentID, assetBaseURL} = await createDeployment(ctx.config)\n ctx.assetBaseURL = assetBaseURL\n ctx.deploymentID = deploymentID\n task.title = '✨ Deployment initialized'\n },\n retry: 2,\n },\n {\n title: '🛠 Building project',\n task: async (ctx, task) => {\n const subTasks = buildTaskList({\n directory: ctx.config.path,\n targets: {\n client: true,\n worker: '@shopify/hydrogen/platforms/worker',\n node: false,\n },\n assetBaseURL: ctx.assetBaseURL,\n })\n\n return task.newListr(subTasks)\n },\n },\n {\n title: '🚀 Uploading deployment files',\n task: async (ctx, task) => {\n ctx.previewURL = await uploadDeployment(ctx.config, ctx.deploymentID)\n task.output = `Preview URL: ${ctx.previewURL}`\n task.title = '🚀 Files uploaded'\n },\n options: {\n bottomBar: Infinity,\n persistentOutput: true,\n },\n retry: 2,\n },\n {\n title: '📡 Checking deployment health',\n task: async (ctx, task) => {\n const retryCount = task.isRetrying()?.count\n\n if (retryCount === backoffPolicy.length) {\n task.title =\n \"The deployment uploaded but hasn't become reachable within 2 minutes. Check the preview URL to see if deployment succeeded. If it didn't, then try again later.\"\n return\n }\n if (retryCount && !isUnitTest) await system.sleep(backoffPolicy[retryCount - 1]!)\n\n await healthCheck(ctx.previewURL)\n task.title = '✅ Deployed successfully'\n },\n retry: backoffPolicy.length,\n skip: (ctx) => !ctx.config.healthCheck,\n },\n ]\n /* eslint-enable require-atomic-updates */\n\n const list = ui.newListr(tasks, {\n concurrent: false,\n rendererOptions: {collapse: false},\n rendererSilent: isUnitTest,\n })\n\n return list.run()\n}\n"]}
@@ -3,7 +3,10 @@ interface PreviewOptions {
3
3
  directory: string;
4
4
  port: number;
5
5
  }
6
+ interface PreviewOptionsWorker extends PreviewOptions {
7
+ envPath: string | undefined;
8
+ }
6
9
  export declare function previewInNode({ directory, port }: PreviewOptions): Promise<void>;
7
- export declare function previewInWorker({ directory, port }: PreviewOptions): Promise<void>;
10
+ export declare function previewInWorker({ directory, port, envPath }: PreviewOptionsWorker): Promise<void>;
8
11
  export declare const OxygenPreviewExecutableNotFound: error.Bug;
9
12
  export {};
@@ -1,4 +1,5 @@
1
1
  import { path, error, system, file, output } from '@shopify/cli-kit';
2
+ import { readAndParseDotEnv } from '@shopify/cli-kit/node/dot-env';
2
3
  import { fileURLToPath } from 'url';
3
4
  export async function previewInNode({ directory, port }) {
4
5
  const buildOutputPath = await path.resolve(directory, 'dist/node');
@@ -17,7 +18,7 @@ export async function previewInNode({ directory, port }) {
17
18
  stderr: process.stderr,
18
19
  });
19
20
  }
20
- export async function previewInWorker({ directory, port }) {
21
+ export async function previewInWorker({ directory, port, envPath }) {
21
22
  const config = {
22
23
  port,
23
24
  workerFile: 'dist/worker/index.js',
@@ -27,6 +28,7 @@ export async function previewInWorker({ directory, port }) {
27
28
  watch: true,
28
29
  buildWatchPaths: ['./src'],
29
30
  autoReload: true,
31
+ ...(envPath && (await parseEnvPath(envPath))),
30
32
  };
31
33
  await file.write(path.resolve(directory, 'mini-oxygen.config.json'), JSON.stringify(config, null, 2));
32
34
  function cleanUp(options) {
@@ -34,6 +36,12 @@ export async function previewInWorker({ directory, port }) {
34
36
  file.removeSync(path.resolve(directory, 'mini-oxygen.config.json'));
35
37
  }
36
38
  }
39
+ async function parseEnvPath(envPath) {
40
+ const { variables } = await readAndParseDotEnv(envPath);
41
+ return {
42
+ env: variables,
43
+ };
44
+ }
37
45
  process.on('SIGINT', cleanUp.bind(null, { exit: true }));
38
46
  const executable = await oxygenPreviewExecutable();
39
47
  await system.exec(executable, [], {
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/cli/services/preview.ts"],"names":[],"mappings":"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","sourcesContent":["import {path, error, system, file, output} from '@shopify/cli-kit'\nimport {fileURLToPath} from 'url'\n\ninterface PreviewOptions {\n directory: string\n port: number\n}\n\nexport async function previewInNode({directory, port}: PreviewOptions) {\n const buildOutputPath = await path.resolve(directory, 'dist/node')\n\n if (!(await file.exists(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 system.exec('yarn', ['shopify', 'hydrogen', 'build', '--target=node'], {\n cwd: directory,\n stdout: process.stdout,\n stderr: process.stderr,\n })\n }\n\n await system.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}: PreviewOptions) {\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 }\n\n await file.write(path.resolve(directory, 'mini-oxygen.config.json'), JSON.stringify(config, null, 2))\n\n function cleanUp(options: {exit: boolean}) {\n if (options.exit) {\n file.removeSync(path.resolve(directory, 'mini-oxygen.config.json'))\n }\n }\n\n process.on('SIGINT', cleanUp.bind(null, {exit: true}))\n\n const executable = await oxygenPreviewExecutable()\n\n await system.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 = path.dirname(fileURLToPath(import.meta.url))\n const executablePath = await path.findUp('node_modules/.bin/oxygen-preview', {type: 'file', cwd, allowSymlinks: true})\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 {path, error, system, file, output} from '@shopify/cli-kit'\nimport {readAndParseDotEnv, DotEnvFile} from '@shopify/cli-kit/node/dot-env'\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 path.resolve(directory, 'dist/node')\n\n if (!(await file.exists(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 system.exec('yarn', ['shopify', 'hydrogen', 'build', '--target=node'], {\n cwd: directory,\n stdout: process.stdout,\n stderr: process.stderr,\n })\n }\n\n await system.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 file.write(path.resolve(directory, 'mini-oxygen.config.json'), JSON.stringify(config, null, 2))\n\n function cleanUp(options: {exit: boolean}) {\n if (options.exit) {\n file.removeSync(path.resolve(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 system.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 = path.dirname(fileURLToPath(import.meta.url))\n const executablePath = await path.findUp('node_modules/.bin/oxygen-preview', {type: 'file', cwd, allowSymlinks: true})\n if (!executablePath) {\n throw OxygenPreviewExecutableNotFound\n }\n return executablePath\n}\n"]}