@shopify/cli-hydrogen 3.33.0 → 3.35.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 (37) hide show
  1. package/dist/cli/commands/hydrogen/add/eslint.js +3 -2
  2. package/dist/cli/commands/hydrogen/add/eslint.js.map +1 -1
  3. package/dist/cli/commands/hydrogen/add/tailwind.js +3 -2
  4. package/dist/cli/commands/hydrogen/add/tailwind.js.map +1 -1
  5. package/dist/cli/commands/hydrogen/build.js +4 -3
  6. package/dist/cli/commands/hydrogen/build.js.map +1 -1
  7. package/dist/cli/commands/hydrogen/deploy.js +6 -4
  8. package/dist/cli/commands/hydrogen/deploy.js.map +1 -1
  9. package/dist/cli/commands/hydrogen/dev.js +4 -3
  10. package/dist/cli/commands/hydrogen/dev.js.map +1 -1
  11. package/dist/cli/commands/hydrogen/info.js +4 -3
  12. package/dist/cli/commands/hydrogen/info.js.map +1 -1
  13. package/dist/cli/commands/hydrogen/preview.js +4 -3
  14. package/dist/cli/commands/hydrogen/preview.js.map +1 -1
  15. package/dist/cli/models/hydrogen.js +6 -5
  16. package/dist/cli/models/hydrogen.js.map +1 -1
  17. package/dist/cli/services/build/check-lockfile.js +5 -3
  18. package/dist/cli/services/build/check-lockfile.js.map +1 -1
  19. package/dist/cli/services/build.js +3 -2
  20. package/dist/cli/services/build.js.map +1 -1
  21. package/dist/cli/services/deploy/config.js +16 -12
  22. package/dist/cli/services/deploy/config.js.map +1 -1
  23. package/dist/cli/services/deploy/upload.js +4 -3
  24. package/dist/cli/services/deploy/upload.js.map +1 -1
  25. package/dist/cli/services/deploy.js +8 -7
  26. package/dist/cli/services/deploy.js.map +1 -1
  27. package/dist/cli/services/dev/check-version.js +2 -2
  28. package/dist/cli/services/dev/check-version.js.map +1 -1
  29. package/dist/cli/services/eslint.js +8 -6
  30. package/dist/cli/services/eslint.js.map +1 -1
  31. package/dist/cli/services/preview.js +9 -7
  32. package/dist/cli/services/preview.js.map +1 -1
  33. package/dist/cli/services/tailwind.js +14 -12
  34. package/dist/cli/services/tailwind.js.map +1 -1
  35. package/dist/tsconfig.tsbuildinfo +1 -1
  36. package/oclif.manifest.json +1 -1
  37. package/package.json +2 -2
@@ -1,8 +1,9 @@
1
1
  import { createDeployment, healthCheck, uploadDeployment } from './deploy/upload.js';
2
2
  import { buildTaskList } from './build.js';
3
3
  import { validateProject, fillDeployConfig } from './deploy/config.js';
4
- import { environment, system, ui } from '@shopify/cli-kit';
5
- const isUnitTest = environment.local.isUnitTest();
4
+ import { ui } from '@shopify/cli-kit';
5
+ import { sleep } from '@shopify/cli-kit/node/system';
6
+ import { isUnitTest } from '@shopify/cli-kit/node/environment/local';
6
7
  const backoffPolicy = [5, 10, 15, 30, 60];
7
8
  export async function deployToOxygen(_config) {
8
9
  await validateProject(_config);
@@ -65,8 +66,8 @@ export async function deployToOxygen(_config) {
65
66
  "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.";
66
67
  return;
67
68
  }
68
- if (retryCount && !isUnitTest)
69
- await system.sleep(backoffPolicy[retryCount - 1]);
69
+ if (retryCount && !isUnitTest())
70
+ await sleep(backoffPolicy[retryCount - 1]);
70
71
  await healthCheck(ctx.previewURL);
71
72
  task.title = '✅ Deployed successfully';
72
73
  },
@@ -78,7 +79,7 @@ export async function deployToOxygen(_config) {
78
79
  const list = ui.newListr(tasks, {
79
80
  concurrent: false,
80
81
  rendererOptions: { collapse: false },
81
- rendererSilent: isUnitTest,
82
+ rendererSilent: isUnitTest(),
82
83
  });
83
84
  return list.run();
84
85
  }
@@ -97,7 +98,7 @@ task, errorMessage) {
97
98
  }
98
99
  }
99
100
  }
100
- if (retryCount && !isUnitTest)
101
- await system.sleep(backoffPolicy[retryCount - 1]);
101
+ if (retryCount && !isUnitTest())
102
+ await sleep(backoffPolicy[retryCount - 1]);
102
103
  }
103
104
  //# sourceMappingURL=deploy.js.map
@@ -1 +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()\nconst backoffPolicy = [5, 10, 15, 30, 60]\n\nexport async function deployToOxygen(_config: DeployConfig) {\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 await shouldRetryOxygenCall(task, 'Could not create deployment on Oxygen.')\n\n const {deploymentID, assetBaseURL} = await createDeployment(ctx.config)\n ctx.assetBaseURL = assetBaseURL\n ctx.deploymentID = deploymentID\n task.title = '✨ Deployment initialized'\n },\n retry: backoffPolicy.length,\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 skip: (ctx) => ctx.config.pathToBuild,\n },\n {\n title: '🚀 Uploading deployment files',\n task: async (ctx, task) => {\n await shouldRetryOxygenCall(task, 'Uploading files to Oxygen failed.')\n\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: backoffPolicy.length,\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\nasync function shouldRetryOxygenCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n task: ui.ListrTaskWrapper<TaskContext, any>,\n errorMessage: string,\n) {\n const retryCount = task.isRetrying()?.count\n if (retryCount === backoffPolicy.length) {\n throw new Error(`${errorMessage} ${task.errors[task.errors.length - 1]?.message}`)\n }\n if (retryCount) {\n if (task.errors.length > 0) {\n const unrecoverableError = task.errors.find((error) => error.message.includes('Unrecoverable'))\n if (unrecoverableError) {\n throw new Error(unrecoverableError.message)\n }\n }\n }\n if (retryCount && !isUnitTest) await system.sleep(backoffPolicy[retryCount - 1]!)\n}\n"]}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/cli/services/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAClF,OAAO,EAAC,aAAa,EAAC,MAAM,YAAY,CAAA;AACxC,OAAO,EAAC,eAAe,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAC,EAAE,EAAC,MAAM,kBAAkB,CAAA;AACnC,OAAO,EAAC,KAAK,EAAC,MAAM,8BAA8B,CAAA;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,yCAAyC,CAAA;AASlE,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAqB;IACxD,MAAM,eAAe,CAAC,OAAO,CAAC,CAAA;IAE9B,2CAA2C;IAC3C,MAAM,KAAK,GAAgC;QACzC;YACE,KAAK,EAAE,8BAA8B;YACrC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,GAAG,CAAC,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAA;gBAC5C,IAAI,CAAC,KAAK,GAAG,6BAA6B,CAAA;YAC5C,CAAC;SACF;QACD;YACE,KAAK,EAAE,4BAA4B;YACnC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,qBAAqB,CAAC,IAAI,EAAE,wCAAwC,CAAC,CAAA;gBAE3E,MAAM,EAAC,YAAY,EAAE,YAAY,EAAC,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBACvE,GAAG,CAAC,YAAY,GAAG,YAAY,CAAA;gBAC/B,GAAG,CAAC,YAAY,GAAG,YAAY,CAAA;gBAC/B,IAAI,CAAC,KAAK,GAAG,0BAA0B,CAAA;YACzC,CAAC;YACD,KAAK,EAAE,aAAa,CAAC,MAAM;SAC5B;QACD;YACE,KAAK,EAAE,qBAAqB;YAC5B,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,QAAQ,GAAG,aAAa,CAAC;oBAC7B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBAC1B,OAAO,EAAE;wBACP,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,oCAAoC;wBAC5C,IAAI,EAAE,KAAK;qBACZ;oBACD,YAAY,EAAE,GAAG,CAAC,YAAY;iBAC/B,CAAC,CAAA;gBAEF,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC;YACD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW;SACtC;QACD;YACE,KAAK,EAAE,+BAA+B;YACtC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,qBAAqB,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAA;gBAEtE,GAAG,CAAC,UAAU,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,CAAA;gBACrE,IAAI,CAAC,MAAM,GAAG,gBAAgB,GAAG,CAAC,UAAU,EAAE,CAAA;gBAC9C,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAAA;YAClC,CAAC;YACD,OAAO,EAAE;gBACP,SAAS,EAAE,QAAQ;gBACnB,gBAAgB,EAAE,IAAI;aACvB;YACD,KAAK,EAAE,aAAa,CAAC,MAAM;SAC5B;QACD;YACE,KAAK,EAAE,+BAA+B;YACtC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAA;gBAE3C,IAAI,UAAU,KAAK,aAAa,CAAC,MAAM,EAAE;oBACvC,IAAI,CAAC,KAAK;wBACR,iKAAiK,CAAA;oBACnK,OAAM;iBACP;gBACD,IAAI,UAAU,IAAI,CAAC,UAAU,EAAE;oBAAE,MAAM,KAAK,CAAC,aAAa,CAAC,UAAU,GAAG,CAAC,CAAE,CAAC,CAAA;gBAE5E,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACjC,IAAI,CAAC,KAAK,GAAG,yBAAyB,CAAA;YACxC,CAAC;YACD,KAAK,EAAE,aAAa,CAAC,MAAM;YAC3B,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW;SACvC;KACF,CAAA;IACD,0CAA0C;IAE1C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;QAC9B,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAC;QAClC,cAAc,EAAE,UAAU,EAAE;KAC7B,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,qBAAqB;AAClC,8DAA8D;AAC9D,IAA2C,EAC3C,YAAoB;IAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAA;IAC3C,IAAI,UAAU,KAAK,aAAa,CAAC,MAAM,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;KACnF;IACD,IAAI,UAAU,EAAE;QACd,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAA;YAC/F,IAAI,kBAAkB,EAAE;gBACtB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;aAC5C;SACF;KACF;IACD,IAAI,UAAU,IAAI,CAAC,UAAU,EAAE;QAAE,MAAM,KAAK,CAAC,aAAa,CAAC,UAAU,GAAG,CAAC,CAAE,CAAC,CAAA;AAC9E,CAAC","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 {ui} from '@shopify/cli-kit'\nimport {sleep} from '@shopify/cli-kit/node/system'\nimport {isUnitTest} from '@shopify/cli-kit/node/environment/local'\n\ninterface TaskContext {\n config: ReqDeployConfig\n deploymentID: string\n assetBaseURL: string\n previewURL: string\n}\n\nconst backoffPolicy = [5, 10, 15, 30, 60]\n\nexport async function deployToOxygen(_config: DeployConfig) {\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 await shouldRetryOxygenCall(task, 'Could not create deployment on Oxygen.')\n\n const {deploymentID, assetBaseURL} = await createDeployment(ctx.config)\n ctx.assetBaseURL = assetBaseURL\n ctx.deploymentID = deploymentID\n task.title = '✨ Deployment initialized'\n },\n retry: backoffPolicy.length,\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 skip: (ctx) => ctx.config.pathToBuild,\n },\n {\n title: '🚀 Uploading deployment files',\n task: async (ctx, task) => {\n await shouldRetryOxygenCall(task, 'Uploading files to Oxygen failed.')\n\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: backoffPolicy.length,\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 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\nasync function shouldRetryOxygenCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n task: ui.ListrTaskWrapper<TaskContext, any>,\n errorMessage: string,\n) {\n const retryCount = task.isRetrying()?.count\n if (retryCount === backoffPolicy.length) {\n throw new Error(`${errorMessage} ${task.errors[task.errors.length - 1]?.message}`)\n }\n if (retryCount) {\n if (task.errors.length > 0) {\n const unrecoverableError = task.errors.find((error) => error.message.includes('Unrecoverable'))\n if (unrecoverableError) {\n throw new Error(unrecoverableError.message)\n }\n }\n }\n if (retryCount && !isUnitTest()) await sleep(backoffPolicy[retryCount - 1]!)\n}\n"]}
@@ -1,9 +1,9 @@
1
- import { system } from '@shopify/cli-kit';
2
1
  import { checkForNewVersion } from '@shopify/cli-kit/node/node-package-manager';
2
+ import { captureOutput } from '@shopify/cli-kit/node/system';
3
3
  import { renderInfo } from '@shopify/cli-kit/node/ui';
4
4
  const PACKAGE_NAME = '@shopify/hydrogen';
5
5
  export async function checkHydrogenVersion(directory) {
6
- const currentVersion = await system.captureOutput('node', ['-p', `require('./node_modules/${PACKAGE_NAME}/package.json').version`], {
6
+ const currentVersion = await captureOutput('node', ['-p', `require('./node_modules/${PACKAGE_NAME}/package.json').version`], {
7
7
  cwd: directory,
8
8
  });
9
9
  if (!currentVersion) {
@@ -1 +1 @@
1
- {"version":3,"file":"check-version.js","sourceRoot":"","sources":["../../../../src/cli/services/dev/check-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAC,kBAAkB,EAAC,MAAM,4CAA4C,CAAA;AAC7E,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAA;AAEnD,MAAM,YAAY,GAAG,mBAAmB,CAAA;AAExC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IAC1D,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,aAAa,CAC/C,MAAM,EACN,CAAC,IAAI,EAAE,2BAA2B,YAAY,yBAAyB,CAAC,EACxE;QACE,GAAG,EAAE,SAAS;KACf,CACF,CAAA;IAED,IAAI,CAAC,cAAc,EAAE;QACnB,OAAM;KACP;IAED,MAAM,mBAAmB,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA;IAElF,IAAI,mBAAmB,EAAE;QACvB,UAAU,CAAC;YACT,QAAQ,EAAE,mBAAmB;YAC7B,IAAI,EACF,WAAW,mBAAmB,OAAO,YAAY,wBAAwB;gBACzE,8BAA8B,cAAc,GAAG;YACjD,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE;wBACJ,KAAK,EAAE,mBAAmB;wBAC1B,GAAG,EAAE,8CAA8C;qBACpD;iBACF;aACF;SACF,CAAC,CAAA;QAEF,OAAO,mBAAmB,CAAA;KAC3B;AACH,CAAC","sourcesContent":["import {system} from '@shopify/cli-kit'\nimport {checkForNewVersion} from '@shopify/cli-kit/node/node-package-manager'\nimport {renderInfo} from '@shopify/cli-kit/node/ui'\n\nconst PACKAGE_NAME = '@shopify/hydrogen'\n\nexport async function checkHydrogenVersion(directory: string): Promise<string | undefined> {\n const currentVersion = await system.captureOutput(\n 'node',\n ['-p', `require('./node_modules/${PACKAGE_NAME}/package.json').version`],\n {\n cwd: directory,\n },\n )\n\n if (!currentVersion) {\n return\n }\n\n const newVersionAvailable = await checkForNewVersion(PACKAGE_NAME, currentVersion)\n\n if (newVersionAvailable) {\n renderInfo({\n headline: 'Upgrade available',\n body:\n `Version ${newVersionAvailable} of ${PACKAGE_NAME} is now available.\\n\\n` +\n `You are currently running v${currentVersion}.`,\n reference: [\n {\n link: {\n label: 'Hydrogen releases',\n url: 'https://github.com/Shopify/hydrogen/releases',\n },\n },\n ],\n })\n\n return newVersionAvailable\n }\n}\n"]}
1
+ {"version":3,"file":"check-version.js","sourceRoot":"","sources":["../../../../src/cli/services/dev/check-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,4CAA4C,CAAA;AAC7E,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAA;AAEnD,MAAM,YAAY,GAAG,mBAAmB,CAAA;AAExC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IAC1D,MAAM,cAAc,GAAG,MAAM,aAAa,CACxC,MAAM,EACN,CAAC,IAAI,EAAE,2BAA2B,YAAY,yBAAyB,CAAC,EACxE;QACE,GAAG,EAAE,SAAS;KACf,CACF,CAAA;IAED,IAAI,CAAC,cAAc,EAAE;QACnB,OAAM;KACP;IAED,MAAM,mBAAmB,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA;IAElF,IAAI,mBAAmB,EAAE;QACvB,UAAU,CAAC;YACT,QAAQ,EAAE,mBAAmB;YAC7B,IAAI,EACF,WAAW,mBAAmB,OAAO,YAAY,wBAAwB;gBACzE,8BAA8B,cAAc,GAAG;YACjD,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE;wBACJ,KAAK,EAAE,mBAAmB;wBAC1B,GAAG,EAAE,8CAA8C;qBACpD;iBACF;aACF;SACF,CAAC,CAAA;QAEF,OAAO,mBAAmB,CAAA;KAC3B;AACH,CAAC","sourcesContent":["import {checkForNewVersion} from '@shopify/cli-kit/node/node-package-manager'\nimport {captureOutput} from '@shopify/cli-kit/node/system'\nimport {renderInfo} from '@shopify/cli-kit/node/ui'\n\nconst PACKAGE_NAME = '@shopify/hydrogen'\n\nexport async function checkHydrogenVersion(directory: string): Promise<string | undefined> {\n const currentVersion = await captureOutput(\n 'node',\n ['-p', `require('./node_modules/${PACKAGE_NAME}/package.json').version`],\n {\n cwd: directory,\n },\n )\n\n if (!currentVersion) {\n return\n }\n\n const newVersionAvailable = await checkForNewVersion(PACKAGE_NAME, currentVersion)\n\n if (newVersionAvailable) {\n renderInfo({\n headline: 'Upgrade available',\n body:\n `Version ${newVersionAvailable} of ${PACKAGE_NAME} is now available.\\n\\n` +\n `You are currently running v${currentVersion}.`,\n reference: [\n {\n link: {\n label: 'Hydrogen releases',\n url: 'https://github.com/Shopify/hydrogen/releases',\n },\n },\n ],\n })\n\n return newVersionAvailable\n }\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  import { genericConfigurationFileNames } from '../constants.js';
2
- import { ui, npm, file, path, error, environment } from '@shopify/cli-kit';
2
+ import { ui, npm, path, error } from '@shopify/cli-kit';
3
3
  import { addNPMDependenciesWithoutVersionIfNeeded } from '@shopify/cli-kit/node/node-package-manager';
4
4
  import { addRecommendedExtensions, isVSCode } from '@shopify/cli-kit/node/vscode';
5
+ import { isUnitTest } from '@shopify/cli-kit/node/environment/local';
6
+ import { writeFile, fileExists, removeFile, fileContentPrettyFormat } from '@shopify/cli-kit/node/fs';
5
7
  import stream from 'stream';
6
8
  export async function addESLint({ app, force, install }) {
7
9
  const list = ui.newListr([
@@ -34,9 +36,9 @@ export async function addESLint({ app, force, install }) {
34
36
  title: 'Adding ESLint configuration',
35
37
  task: async (_, task) => {
36
38
  const eslintConfigPath = path.join(app.directory, genericConfigurationFileNames.eslint);
37
- if (await file.exists(eslintConfigPath)) {
39
+ if (await fileExists(eslintConfigPath)) {
38
40
  if (force) {
39
- await file.remove(eslintConfigPath);
41
+ await removeFile(eslintConfigPath);
40
42
  }
41
43
  else {
42
44
  throw new error.Abort('ESLint config already exists.', 'Use --force to override existing config.');
@@ -46,8 +48,8 @@ export async function addESLint({ app, force, install }) {
46
48
  if (app.language === 'TypeScript') {
47
49
  extended.push(`'plugin:hydrogen/typescript'`);
48
50
  }
49
- const eslintConfig = await file.format(['module.exports = {', 'extends: [', `${extended.join(',')}`, ' ],', ' };'].join('\n'), { path: genericConfigurationFileNames.eslint });
50
- await file.write(eslintConfigPath, eslintConfig);
51
+ const eslintConfig = await fileContentPrettyFormat(['module.exports = {', 'extends: [', `${extended.join(',')}`, ' ],', ' };'].join('\n'), { path: genericConfigurationFileNames.eslint });
52
+ await writeFile(eslintConfigPath, eslintConfig);
51
53
  task.title = 'ESLint configuration added';
52
54
  },
53
55
  },
@@ -69,7 +71,7 @@ export async function addESLint({ app, force, install }) {
69
71
  task.title = 'Editor plugin recommendations added';
70
72
  },
71
73
  },
72
- ], { rendererSilent: environment.local.isUnitTest() });
74
+ ], { rendererSilent: isUnitTest() });
73
75
  await list.run();
74
76
  }
75
77
  //# sourceMappingURL=eslint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../../../src/cli/services/eslint.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,6BAA6B,EAAC,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAC,wCAAwC,EAAC,MAAM,4CAA4C,CAAA;AACnG,OAAO,EAAC,wBAAwB,EAAE,QAAQ,EAAC,MAAM,8BAA8B,CAAA;AAC/E,OAAO,MAAM,MAAM,QAAQ,CAAA;AAQ3B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAmB;IACrE,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CACtB;QACE;YACE,KAAK,EAAE,oCAAoC;YAC3C,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO;YACpB,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,wBAAwB,EAAE,UAAU,EAAE,0BAA0B,CAAC,CAAA;gBACzG,MAAM,wCAAwC,CAAC,oBAAoB,EAAE;oBACnE,cAAc,EAAE,GAAG,CAAC,cAAc;oBAClC,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,MAAM,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC;wBAC1B,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI;4BACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;4BAC9B,IAAI,EAAE,CAAA;wBACR,CAAC;qBACF,CAAC;oBACF,MAAM,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC;wBAC1B,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI;4BACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;4BAC9B,IAAI,EAAE,CAAA;wBACR,CAAC;qBACF,CAAC;iBACH,CAAC,CAAA;gBACF,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAA;YACvC,CAAC;SACF;QAED;YACE,KAAK,EAAE,6BAA6B;YACpC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,6BAA6B,CAAC,MAAM,CAAC,CAAA;gBAEvF,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE;oBACvC,IAAI,KAAK,EAAE;wBACT,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;qBACpC;yBAAM;wBACL,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,+BAA+B,EAAE,0CAA0C,CAAC,CAAA;qBACnG;iBACF;gBAED,MAAM,QAAQ,GAAG,CAAC,+BAA+B,CAAC,CAAA;gBAElD,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE;oBACjC,QAAQ,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;iBAC9C;gBAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CACpC,CAAC,oBAAoB,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EACtF,EAAC,IAAI,EAAE,6BAA6B,CAAC,MAAM,EAAC,CAC7C,CAAA;gBAED,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA;gBAEhD,IAAI,CAAC,KAAK,GAAG,4BAA4B,CAAA;YAC3C,CAAC;SACF;QACD;YACE,KAAK,EAAE,uBAAuB;YAC9B,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBAE5D,WAAW,CAAC,OAAO,CAAC,IAAI,GAAG,qCAAqC,CAAA;gBAEhE,WAAW,CAAC,QAAQ,GAAG,0BAA0B,CAAA;gBAEjD,MAAM,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;gBAEtD,IAAI,CAAC,KAAK,GAAG,sBAAsB,CAAA;YACrC,CAAC;SACF;QACD;YACE,KAAK,EAAE,sCAAsC;YAC7C,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,wBAAwB,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAA;gBACzE,IAAI,CAAC,KAAK,GAAG,qCAAqC,CAAA;YACpD,CAAC;SACF;KACF,EACD,EAAC,cAAc,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,EAAC,CACjD,CAAA;IACD,MAAM,IAAI,CAAC,GAAG,EAAE,CAAA;AAClB,CAAC","sourcesContent":["import {HydrogenApp} from '../models/hydrogen.js'\nimport {genericConfigurationFileNames} from '../constants.js'\nimport {ui, npm, file, path, error, environment} from '@shopify/cli-kit'\nimport {addNPMDependenciesWithoutVersionIfNeeded} from '@shopify/cli-kit/node/node-package-manager'\nimport {addRecommendedExtensions, isVSCode} from '@shopify/cli-kit/node/vscode'\nimport stream from '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 = ui.newListr(\n [\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 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 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 extended = [`'plugin:hydrogen/recommended'`]\n\n if (app.language === 'TypeScript') {\n extended.push(`'plugin:hydrogen/typescript'`)\n }\n\n const eslintConfig = await file.format(\n ['module.exports = {', 'extends: [', `${extended.join(',')}`, ' ],', ' };'].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 isVSCode(app.directory)),\n task: async (_, task) => {\n await addRecommendedExtensions(app.directory, ['dbaeumer.vscode-eslint'])\n task.title = 'Editor plugin recommendations added'\n },\n },\n ],\n {rendererSilent: environment.local.isUnitTest()},\n )\n await list.run()\n}\n"]}
1
+ {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../../../src/cli/services/eslint.ts"],"names":[],"mappings":"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","sourcesContent":["import {HydrogenApp} from '../models/hydrogen.js'\nimport {genericConfigurationFileNames} from '../constants.js'\nimport {ui, npm, path, error} from '@shopify/cli-kit'\nimport {addNPMDependenciesWithoutVersionIfNeeded} from '@shopify/cli-kit/node/node-package-manager'\nimport {addRecommendedExtensions, isVSCode} from '@shopify/cli-kit/node/vscode'\nimport {isUnitTest} from '@shopify/cli-kit/node/environment/local'\nimport {writeFile, fileExists, removeFile, fileContentPrettyFormat} from '@shopify/cli-kit/node/fs'\nimport stream from '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 = ui.newListr(\n [\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 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 ESLint configuration',\n task: async (_, task) => {\n const eslintConfigPath = path.join(app.directory, genericConfigurationFileNames.eslint)\n\n if (await fileExists(eslintConfigPath)) {\n if (force) {\n await removeFile(eslintConfigPath)\n } else {\n throw new error.Abort('ESLint config already exists.', 'Use --force to override existing config.')\n }\n }\n\n const extended = [`'plugin:hydrogen/recommended'`]\n\n if (app.language === 'TypeScript') {\n extended.push(`'plugin:hydrogen/typescript'`)\n }\n\n const eslintConfig = await fileContentPrettyFormat(\n ['module.exports = {', 'extends: [', `${extended.join(',')}`, ' ],', ' };'].join('\\n'),\n {path: genericConfigurationFileNames.eslint},\n )\n\n await writeFile(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 isVSCode(app.directory)),\n task: async (_, task) => {\n await addRecommendedExtensions(app.directory, ['dbaeumer.vscode-eslint'])\n task.title = 'Editor plugin recommendations added'\n },\n },\n ],\n {rendererSilent: isUnitTest()},\n )\n await list.run()\n}\n"]}
@@ -1,17 +1,19 @@
1
- import { path, error, system, file, output } from '@shopify/cli-kit';
1
+ import { path, error, output } from '@shopify/cli-kit';
2
2
  import { readAndParseDotEnv } from '@shopify/cli-kit/node/dot-env';
3
+ import { fileExists, removeFileSync, writeFile } from '@shopify/cli-kit/node/fs';
4
+ import { exec } from '@shopify/cli-kit/node/system';
3
5
  import { fileURLToPath } from 'url';
4
6
  export async function previewInNode({ directory, port }) {
5
7
  const buildOutputPath = await path.resolve(directory, 'dist/node');
6
- if (!(await file.exists(buildOutputPath))) {
8
+ if (!(await fileExists(buildOutputPath))) {
7
9
  output.info(output.content `Couldn’t find a Node.js server build for this project. Running ${output.token.packagejsonScript('yarn', 'shopify hydrogen build', '--target=node')} to create one.`);
8
- await system.exec('yarn', ['shopify', 'hydrogen', 'build', '--target=node'], {
10
+ await exec('yarn', ['shopify', 'hydrogen', 'build', '--target=node'], {
9
11
  cwd: directory,
10
12
  stdout: process.stdout,
11
13
  stderr: process.stderr,
12
14
  });
13
15
  }
14
- await system.exec('node', ['--enable-source-maps', buildOutputPath], {
16
+ await exec('node', ['--enable-source-maps', buildOutputPath], {
15
17
  env: { PORT: `${port}` },
16
18
  cwd: directory,
17
19
  stdout: process.stdout,
@@ -30,10 +32,10 @@ export async function previewInWorker({ directory, port, envPath }) {
30
32
  autoReload: true,
31
33
  ...(envPath && (await parseEnvPath(envPath))),
32
34
  };
33
- await file.write(path.resolve(directory, 'mini-oxygen.config.json'), JSON.stringify(config, null, 2));
35
+ await writeFile(path.resolve(directory, 'mini-oxygen.config.json'), JSON.stringify(config, null, 2));
34
36
  function cleanUp(options) {
35
37
  if (options.exit) {
36
- file.removeSync(path.resolve(directory, 'mini-oxygen.config.json'));
38
+ removeFileSync(path.resolve(directory, 'mini-oxygen.config.json'));
37
39
  }
38
40
  }
39
41
  async function parseEnvPath(envPath) {
@@ -44,7 +46,7 @@ export async function previewInWorker({ directory, port, envPath }) {
44
46
  }
45
47
  process.on('SIGINT', cleanUp.bind(null, { exit: true }));
46
48
  const executable = await oxygenPreviewExecutable();
47
- await system.exec(executable, [], {
49
+ await exec(executable, [], {
48
50
  env: { NODE_OPTIONS: '--experimental-vm-modules' },
49
51
  cwd: directory,
50
52
  stdout: process.stdout,
@@ -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 {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"]}
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/cli/services/preview.ts"],"names":[],"mappings":"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","sourcesContent":["import {path, error, output} from '@shopify/cli-kit'\nimport {readAndParseDotEnv, DotEnvFile} from '@shopify/cli-kit/node/dot-env'\nimport {fileExists, removeFileSync, writeFile} from '@shopify/cli-kit/node/fs'\nimport {exec} from '@shopify/cli-kit/node/system'\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 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(path.resolve(directory, 'mini-oxygen.config.json'), JSON.stringify(config, null, 2))\n\n function cleanUp(options: {exit: boolean}) {\n if (options.exit) {\n removeFileSync(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 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,6 +1,8 @@
1
- import { ui, system, path, file, error } from '@shopify/cli-kit';
1
+ import { ui, path, error } 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
+ import { exec } from '@shopify/cli-kit/node/system';
5
+ import { writeFile, fileExists, removeFile, fileContentPrettyFormat, readFile } from '@shopify/cli-kit/node/fs';
4
6
  import stream from 'stream';
5
7
  const tailwindImports = [
6
8
  "@import 'tailwindcss/base';",
@@ -39,16 +41,16 @@ export async function addTailwind({ app, force, install, directory }) {
39
41
  title: 'Adding PostCSS configuration',
40
42
  task: async (_, task) => {
41
43
  const postCSSConfiguration = path.join(directory, 'postcss.config.js');
42
- if (await file.exists(postCSSConfiguration)) {
44
+ if (await fileExists(postCSSConfiguration)) {
43
45
  if (force) {
44
- await file.remove(postCSSConfiguration);
46
+ await removeFile(postCSSConfiguration);
45
47
  }
46
48
  else {
47
49
  throw new error.Abort('PostCSS config already exists.\nUse --force to override existing config.');
48
50
  }
49
51
  }
50
- const postCSSConfig = await file.format(['module.exports = {', 'plugins: {', 'tailwindcss: {},', 'autoprefixer: {},', '},', ' };'].join('\n'), { path: 'postcss.config.js' });
51
- await file.write(postCSSConfiguration, postCSSConfig);
52
+ const postCSSConfig = await fileContentPrettyFormat(['module.exports = {', 'plugins: {', 'tailwindcss: {},', 'autoprefixer: {},', '},', ' };'].join('\n'), { path: 'postcss.config.js' });
53
+ await writeFile(postCSSConfiguration, postCSSConfig);
52
54
  task.title = 'PostCSS configuration added';
53
55
  },
54
56
  },
@@ -56,15 +58,15 @@ export async function addTailwind({ app, force, install, directory }) {
56
58
  title: 'Initializing Tailwind CSS...',
57
59
  task: async (_, task) => {
58
60
  const tailwindConfigurationPath = path.join(directory, 'tailwind.config.js');
59
- if (await file.exists(tailwindConfigurationPath)) {
61
+ if (await fileExists(tailwindConfigurationPath)) {
60
62
  if (force) {
61
- await file.remove(tailwindConfigurationPath);
63
+ await removeFile(tailwindConfigurationPath);
62
64
  }
63
65
  else {
64
66
  throw new error.Abort('Tailwind config already exists.\nUse --force to override existing config.');
65
67
  }
66
68
  }
67
- await system.exec(app.packageManager, ['tailwindcss', 'init', tailwindConfigurationPath], {
69
+ await exec(app.packageManager, ['tailwindcss', 'init', tailwindConfigurationPath], {
68
70
  cwd: directory,
69
71
  });
70
72
  await replace('content: []', "content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}']", tailwindConfigurationPath);
@@ -75,13 +77,13 @@ export async function addTailwind({ app, force, install, directory }) {
75
77
  title: 'Importing Tailwind CSS in index.css',
76
78
  task: async (_ctx, task) => {
77
79
  const indexCSSPath = path.join(directory, 'src', 'index.css');
78
- const indexCSS = await file.read(indexCSSPath);
80
+ const indexCSS = await readFile(indexCSSPath);
79
81
  if (tailwindImportsExist(indexCSS)) {
80
82
  task.skip('Imports already exist in index.css');
81
83
  }
82
84
  else {
83
85
  const newIndexCSS = tailwindImports.join('\n') + indexCSS;
84
- await file.write(indexCSSPath, newIndexCSS);
86
+ await writeFile(indexCSSPath, newIndexCSS);
85
87
  }
86
88
  task.title = 'Tailwind imports added';
87
89
  },
@@ -97,8 +99,8 @@ export async function addTailwind({ app, force, install, directory }) {
97
99
  await list.run();
98
100
  }
99
101
  async function replace(find, replace, filepath) {
100
- const original = await file.read(filepath);
102
+ const original = await readFile(filepath);
101
103
  const modified = original.replace(find, replace);
102
- await file.write(filepath, modified);
104
+ await writeFile(filepath, modified);
103
105
  }
104
106
  //# sourceMappingURL=tailwind.js.map
@@ -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, system, path, file, error} from '@shopify/cli-kit'\nimport {addNPMDependenciesWithoutVersionIfNeeded} from '@shopify/cli-kit/node/node-package-manager'\nimport {addRecommendedExtensions} from '@shopify/cli-kit/node/vscode'\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 = 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.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 = 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 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"]}
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, path, 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 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 = path.join(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 = path.join(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 = path.join(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"]}