@shopify/oxygen-cli 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -107,7 +107,6 @@ class Deploy extends Command {
107
107
  const config = {
108
108
  assetsDir: normalizePath(flags.assetsFolder),
109
109
  buildCommand: flags.buildCommand,
110
- buildOutput: true,
111
110
  deploymentToken: parseToken(flags.token),
112
111
  environmentTag: flags.environmentTag,
113
112
  deploymentUrl,
@@ -2,12 +2,19 @@ import { spawn } from 'child_process';
2
2
 
3
3
  async function buildProject(options) {
4
4
  const { config, assetPath, hooks } = options;
5
- hooks?.onBuildStart?.();
5
+ if (hooks?.buildFunction) {
6
+ try {
7
+ await hooks.buildFunction(assetPath);
8
+ } catch (error) {
9
+ throw new Error(`Build function failed with error: ${error}`);
10
+ }
11
+ return;
12
+ }
6
13
  const assetPathEnvironment = assetPath ? { HYDROGEN_ASSET_BASE_URL: assetPath } : {};
7
14
  try {
8
15
  await new Promise((resolve, reject) => {
9
16
  const buildCommand = spawn(config.buildCommand, [], {
10
- stdio: config.buildOutput ? ["inherit", "pipe", "inherit"] : ["ignore", "ignore", "pipe"],
17
+ stdio: ["inherit", process.stderr, "inherit"],
11
18
  env: {
12
19
  // eslint-disable-next-line no-process-env
13
20
  ...process.env,
@@ -16,22 +23,11 @@ async function buildProject(options) {
16
23
  cwd: config.rootPath,
17
24
  shell: true
18
25
  });
19
- let stderrOutput = "";
20
- if (buildCommand.stderr) {
21
- buildCommand.stderr.on("data", (data) => {
22
- stderrOutput += data;
23
- });
24
- }
25
- if (config.buildOutput && buildCommand.stdout) {
26
- buildCommand.stdout.pipe(process.stderr);
27
- }
28
26
  buildCommand.on("close", (code) => {
29
27
  if (code !== 0) {
30
- hooks?.onBuildError?.(new Error(stderrOutput));
31
28
  reject(code);
32
29
  return;
33
30
  }
34
- hooks?.onBuildComplete?.();
35
31
  resolve(code);
36
32
  });
37
33
  });
@@ -30,32 +30,39 @@ test("BuildProject builds the project successfully", async () => {
30
30
  buildCommand: "npm run build"
31
31
  };
32
32
  const assetPath = "https://example.com/assets";
33
- const hooks = {
34
- onBuildStart: vi.fn(),
35
- onBuildComplete: vi.fn()
36
- };
37
- await buildProject({ config, assetPath, hooks });
33
+ await buildProject({ config, assetPath });
38
34
  expect(spawn).toBeCalledWith("npm run build", [], {
39
35
  cwd: "rootFolder",
40
36
  shell: true,
41
- stdio: ["inherit", "pipe", "inherit"],
37
+ stdio: ["inherit", process.stderr, "inherit"],
42
38
  env: {
43
39
  // eslint-disable-next-line no-process-env
44
40
  ...process.env,
45
41
  HYDROGEN_ASSET_BASE_URL: "https://example.com/assets"
46
42
  }
47
43
  });
48
- expect(hooks.onBuildStart).toBeCalled();
49
- expect(hooks.onBuildComplete).toBeCalled();
50
44
  });
51
45
  test("should throw error on build command failure", async () => {
52
46
  returnCode = 1;
53
- const hooks = {
54
- onBuildError: vi.fn()
55
- };
56
47
  const assetPath = "https://example.com/assets";
57
48
  await expect(
58
- () => buildProject({ config: testConfig, assetPath, hooks })
49
+ () => buildProject({ config: testConfig, assetPath })
59
50
  ).rejects.toThrow("Build failed with error code: 1");
60
- expect(hooks.onBuildError).toBeCalled();
51
+ });
52
+ test("should call buildFunction hook if provided", async () => {
53
+ const buildFunction = vi.fn().mockResolvedValue(void 0);
54
+ const hooks = { buildFunction };
55
+ const assetPath = "https://example.com/assets";
56
+ await buildProject({ config: testConfig, assetPath, hooks });
57
+ expect(buildFunction).toBeCalledWith(assetPath);
58
+ });
59
+ test("should throw error if buildFunction hook fails", async () => {
60
+ const buildFunction = vi.fn().mockRejectedValue(new Error("Oops! I tripped over a cable."));
61
+ const hooks = { buildFunction };
62
+ const assetPath = "https://example.com/assets";
63
+ await expect(
64
+ () => buildProject({ config: testConfig, assetPath, hooks })
65
+ ).rejects.toThrow(
66
+ "Build function failed with error: Error: Oops! I tripped over a cable."
67
+ );
61
68
  });
@@ -49,7 +49,12 @@ async function createDeploy(options) {
49
49
  input: deploymentInitiateInput,
50
50
  logger
51
51
  });
52
- await uploadFiles({ config, targets: deployment.deploymentTargets, logger });
52
+ await uploadFiles({
53
+ config,
54
+ targets: deployment.deploymentTargets,
55
+ hooks,
56
+ logger
57
+ });
53
58
  const deploymentCompleteOp = await deploymentComplete(
54
59
  config,
55
60
  deployment.deployment.id
@@ -6,9 +6,7 @@ interface ClientError extends Error {
6
6
  statusCode: number;
7
7
  }
8
8
  interface DeploymentHooks {
9
- onBuildStart?: () => void;
10
- onBuildComplete?: () => void;
11
- onBuildError?: (error: Error) => void;
9
+ buildFunction?: (urlPath?: string) => Promise<void>;
12
10
  onHealthCheckStart?: () => void;
13
11
  onHealthCheckComplete?: () => void;
14
12
  onHealthCheckError?: (error: Error) => void;
@@ -17,8 +15,7 @@ interface DeploymentHooks {
17
15
  }
18
16
  interface DeploymentConfig {
19
17
  assetsDir?: string;
20
- buildCommand: string;
21
- buildOutput: boolean;
18
+ buildCommand?: string;
22
19
  deploymentToken: DeploymentToken;
23
20
  deploymentUrl: string;
24
21
  environmentTag?: string;
@@ -13,7 +13,6 @@ function createTestConfig(rootFolder) {
13
13
  return {
14
14
  assetsDir: "/assets/",
15
15
  buildCommand: String(deployDefaults.buildCommandDefault),
16
- buildOutput: true,
17
16
  deploymentToken: testToken,
18
17
  environmentTag: "environment",
19
18
  deploymentUrl: "https://localhost:3000",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.6.0",
2
+ "version": "1.7.0",
3
3
  "commands": {
4
4
  "oxygen:deploy": {
5
5
  "id": "oxygen:deploy",
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "@shopify:registry": "https://registry.npmjs.org"
6
6
  },
7
7
  "license": "MIT",
8
- "version": "1.6.0",
8
+ "version": "1.7.0",
9
9
  "type": "module",
10
10
  "scripts": {
11
11
  "build": "tsup --clean --config ./tsup.config.ts && oclif manifest",
@@ -40,14 +40,14 @@
40
40
  "@shopify/eslint-plugin": "^42.1.0",
41
41
  "@shopify/prettier-config": "^1.1.2",
42
42
  "@types/async": "^3.2.18",
43
- "@types/node": "^20.4.2",
43
+ "@types/node": "^20.4.4",
44
44
  "@types/prettier": "^2.7.3",
45
45
  "eslint": "^8.45.0",
46
46
  "node-fetch": "^3.3.1",
47
47
  "oclif": "^3",
48
48
  "tsup": "^7.1.0",
49
49
  "typescript": "^5.1.3",
50
- "vite": "^4.4.4",
50
+ "vite": "^4.4.6",
51
51
  "vitest": "^0.33.0"
52
52
  },
53
53
  "prettier": "@shopify/prettier-config",