@shopify/cli-hydrogen 3.23.0 → 3.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @shopify/cli-hydrogen
2
2
 
3
+ ## 3.24.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [7e5c492a]
8
+ - @shopify/cli-kit@3.24.1
9
+
10
+ ## 3.24.0
11
+
12
+ ### Patch Changes
13
+
14
+ - fe1d4fe4: `hydrogen dev` will now check for new versions of Hydrogen
15
+ - 8a56de53: `hydrogen build` will now warn when there is a problem with lockfiles
16
+ - Updated dependencies [d47a6e80]
17
+ - Updated dependencies [a9d4be9e]
18
+ - Updated dependencies [aca90638]
19
+ - Updated dependencies [cb0990df]
20
+ - @shopify/cli-kit@3.24.0
21
+
3
22
  ## 3.23.0
4
23
 
5
24
  ### Patch Changes
package/README.md CHANGED
@@ -22,7 +22,7 @@ Install the latest version of [Node.js](https://nodejs.org/en/download/) and [n
22
22
  When you’re building a Shopify app, you can initialize your project using your preferred package manager. A single command will install all the dependencies you need — including Shopify CLI itself.
23
23
 
24
24
  Initialize your project using one of the following commands:
25
- - `npx @shopify/create-app@latest` (installed by default with Node)
25
+ - `npm init @shopify/app@latest` (installed by default with Node)
26
26
  - `pnpm create @shopify/create-app@latest`
27
27
  - `yarn create @shopify/app`
28
28
 
@@ -0,0 +1,3 @@
1
+ declare type LockFileStatus = 'missing' | 'multiple' | 'ignored' | 'ok';
2
+ export declare function checkLockfileStatus(directory: string): Promise<LockFileStatus>;
3
+ export {};
@@ -0,0 +1,80 @@
1
+ import { file, git, path } from '@shopify/cli-kit';
2
+ import { renderWarning } from '@shopify/cli-kit/node/ui';
3
+ import { lockfiles } from '@shopify/cli-kit/node/node-package-manager';
4
+ function missingLockfileWarning() {
5
+ renderWarning({
6
+ headline: 'No lockfile found',
7
+ body: `If you don’t commit a lockfile, then your app might install the wrong ` +
8
+ `package versions when deploying. To avoid versioning issues, generate a ` +
9
+ `new lockfile and commit it to your repository.`,
10
+ nextSteps: [
11
+ [
12
+ 'Generate a lockfile. Run',
13
+ {
14
+ command: 'npm|yarn|pnpm install',
15
+ },
16
+ ],
17
+ 'Commit the new file to your repository',
18
+ ],
19
+ });
20
+ }
21
+ function multipleLockfilesWarning(lockfiles) {
22
+ const packageManagers = {
23
+ 'yarn.lock': 'yarn',
24
+ 'package-lock.json': 'npm',
25
+ 'pnpm-lock.yaml': 'pnpm',
26
+ };
27
+ const lockfileList = lockfiles.map((lockfile) => {
28
+ return `• ${lockfile} (created by ${packageManagers[lockfile]})`;
29
+ });
30
+ renderWarning({
31
+ headline: 'Multiple lockfiles found',
32
+ body: [
33
+ `Your project contains more than one lockfile. This can cause version ` +
34
+ `conflicts when installing and deploying your app. The following ` +
35
+ `lockfiles were detected:\n\n`,
36
+ lockfileList.join('\n '),
37
+ ],
38
+ nextSteps: ['Delete any unneeded lockfiles', 'Commit the change to your repository'],
39
+ });
40
+ }
41
+ function lockfileIgnoredWarning(lockfile) {
42
+ renderWarning({
43
+ headline: 'Lockfile ignored by Git',
44
+ body: `Your project’s lockfile isn’t being tracked by Git. If you don’t commit ` +
45
+ `a lockfile, then your app might install the wrong package versions when ` +
46
+ `deploying.`,
47
+ nextSteps: [
48
+ `In your project’s .gitignore file, delete any references to ${lockfile}`,
49
+ 'Commit the change to your repository',
50
+ ],
51
+ });
52
+ }
53
+ export async function checkLockfileStatus(directory) {
54
+ const availableLockfiles = await lockfiles.reduce(async (acc, lockFileName) => {
55
+ const lockfilePath = path.resolve(directory, lockFileName);
56
+ if (await file.exists(lockfilePath)) {
57
+ return (await acc).concat(lockFileName);
58
+ }
59
+ else {
60
+ return acc;
61
+ }
62
+ }, Promise.resolve([]));
63
+ if (!availableLockfiles.length) {
64
+ missingLockfileWarning();
65
+ return 'missing';
66
+ }
67
+ if (availableLockfiles.length > 1) {
68
+ multipleLockfilesWarning(availableLockfiles);
69
+ return 'multiple';
70
+ }
71
+ const repo = git.factory(directory);
72
+ const lockfile = availableLockfiles[0];
73
+ const ignoredLockfile = await repo.checkIgnore([lockfile]);
74
+ if (ignoredLockfile.length) {
75
+ lockfileIgnoredWarning(lockfile);
76
+ return 'ignored';
77
+ }
78
+ return 'ok';
79
+ }
80
+ //# sourceMappingURL=check-lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-lockfile.js","sourceRoot":"","sources":["../../../../src/cli/services/build/check-lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAC,SAAS,EAAC,MAAM,4CAA4C,CAAA;AAGpE,SAAS,sBAAsB;IAC7B,aAAa,CAAC;QACZ,QAAQ,EAAE,mBAAmB;QAC7B,IAAI,EACF,wEAAwE;YACxE,0EAA0E;YAC1E,gDAAgD;QAClD,SAAS,EAAE;YACT;gBACE,0BAA0B;gBAC1B;oBACE,OAAO,EAAE,uBAAuB;iBACjC;aACF;YACD,wCAAwC;SACzC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,SAAqB;IACrD,MAAM,eAAe,GAAG;QACtB,WAAW,EAAE,MAAM;QACnB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,MAAM;KACzB,CAAA;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9C,OAAO,KAAK,QAAQ,gBAAgB,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,aAAa,CAAC;QACZ,QAAQ,EAAE,0BAA0B;QACpC,IAAI,EAAE;YACJ,uEAAuE;gBACrE,kEAAkE;gBAClE,8BAA8B;YAChC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;SACzB;QACD,SAAS,EAAE,CAAC,+BAA+B,EAAE,sCAAsC,CAAC;KACrF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,aAAa,CAAC;QACZ,QAAQ,EAAE,yBAAyB;QACnC,IAAI,EACF,0EAA0E;YAC1E,0EAA0E;YAC1E,YAAY;QACd,SAAS,EAAE;YACT,+DAA+D,QAAQ,EAAE;YACzE,sCAAsC;SACvC;KACF,CAAC,CAAA;AACJ,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACzD,MAAM,kBAAkB,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE;QAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QAC1D,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;YACnC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;SACxC;aAAM;YACL,OAAO,GAAG,CAAA;SACX;IACH,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAgB,CAAC,CAAC,CAAA;IAErC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;QAC9B,sBAAsB,EAAE,CAAA;QACxB,OAAO,SAAS,CAAA;KACjB;IAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;QACjC,wBAAwB,CAAC,kBAAkB,CAAC,CAAA;QAC5C,OAAO,UAAU,CAAA;KAClB;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAE,CAAA;IACvC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IAE1D,IAAI,eAAe,CAAC,MAAM,EAAE;QAC1B,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QAChC,OAAO,SAAS,CAAA;KACjB;IAED,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import {file, git, path} from '@shopify/cli-kit'\nimport {renderWarning} from '@shopify/cli-kit/node/ui'\nimport {lockfiles} from '@shopify/cli-kit/node/node-package-manager'\nimport type {Lockfile} from '@shopify/cli-kit/node/node-package-manager'\n\nfunction missingLockfileWarning() {\n renderWarning({\n headline: 'No lockfile found',\n body:\n `If you don’t commit a lockfile, then your app might install the wrong ` +\n `package versions when deploying. To avoid versioning issues, generate a ` +\n `new lockfile and commit it to your repository.`,\n nextSteps: [\n [\n 'Generate a lockfile. Run',\n {\n command: 'npm|yarn|pnpm install',\n },\n ],\n 'Commit the new file to your repository',\n ],\n })\n}\n\nfunction multipleLockfilesWarning(lockfiles: Lockfile[]) {\n const packageManagers = {\n 'yarn.lock': 'yarn',\n 'package-lock.json': 'npm',\n 'pnpm-lock.yaml': 'pnpm',\n }\n\n const lockfileList = lockfiles.map((lockfile) => {\n return `• ${lockfile} (created by ${packageManagers[lockfile]})`\n })\n\n renderWarning({\n headline: 'Multiple lockfiles found',\n body: [\n `Your project contains more than one lockfile. This can cause version ` +\n `conflicts when installing and deploying your app. The following ` +\n `lockfiles were detected:\\n\\n`,\n lockfileList.join('\\n '),\n ],\n nextSteps: ['Delete any unneeded lockfiles', 'Commit the change to your repository'],\n })\n}\n\nfunction lockfileIgnoredWarning(lockfile: string) {\n renderWarning({\n headline: 'Lockfile ignored by Git',\n body:\n `Your project’s lockfile isn’t being tracked by Git. If you don’t commit ` +\n `a lockfile, then your app might install the wrong package versions when ` +\n `deploying.`,\n nextSteps: [\n `In your project’s .gitignore file, delete any references to ${lockfile}`,\n 'Commit the change to your repository',\n ],\n })\n}\n\ntype LockFileStatus = 'missing' | 'multiple' | 'ignored' | 'ok'\n\nexport async function checkLockfileStatus(directory: string): Promise<LockFileStatus> {\n const availableLockfiles = await lockfiles.reduce(async (acc, lockFileName) => {\n const lockfilePath = path.resolve(directory, lockFileName)\n if (await file.exists(lockfilePath)) {\n return (await acc).concat(lockFileName)\n } else {\n return acc\n }\n }, Promise.resolve([] as Lockfile[]))\n\n if (!availableLockfiles.length) {\n missingLockfileWarning()\n return 'missing'\n }\n\n if (availableLockfiles.length > 1) {\n multipleLockfilesWarning(availableLockfiles)\n return 'multiple'\n }\n\n const repo = git.factory(directory)\n const lockfile = availableLockfiles[0]!\n const ignoredLockfile = await repo.checkIgnore([lockfile])\n\n if (ignoredLockfile.length) {\n lockfileIgnoredWarning(lockfile)\n return 'ignored'\n }\n\n return 'ok'\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { checkLockfileStatus } from './build/check-lockfile.js';
1
2
  import { build as viteBuild } from 'vite';
2
3
  import { ui, environment, error as kitError } from '@shopify/cli-kit';
3
4
  export function buildTaskList({ directory, targets, base, assetBaseURL, verbose }) {
@@ -35,6 +36,7 @@ export function buildTaskList({ directory, targets, base, assetBaseURL, verbose
35
36
  }));
36
37
  }
37
38
  export async function build(options) {
39
+ await checkLockfileStatus(options.directory);
38
40
  const tasks = await buildTaskList(options);
39
41
  const list = ui.newListr(tasks, { rendererSilent: environment.local.isUnitTest() });
40
42
  await list.run();
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/services/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,IAAI,SAAS,EAAC,MAAM,MAAM,CAAA;AACvC,OAAO,EAAC,EAAE,EAAE,WAAW,EAAE,KAAK,IAAI,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAYnE,MAAM,UAAU,aAAa,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAa;IACzF,MAAM,YAAY,GAAG,EAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,CAAA;IAE5C,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;SAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,KAAK,EAAE,YAAY,GAAG,OAAO;QAC7B,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YACtB,IAAI,GAAG,KAAK,QAAQ,EAAE;gBACpB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAA;aAC5B;YACD,IAAI,YAAY,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,YAAY,CAAA;aACnD;YAED,IAAI;gBACF,MAAM,SAAS,CAAC;oBACd,GAAG,YAAY;oBACf,KAAK,EAAE;wBACL,MAAM,EAAE,QAAQ,GAAG,EAAE;wBACrB,GAAG,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;wBAClD,QAAQ,EAAE,GAAG,KAAK,QAAQ;qBAC3B;oBACD,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;iBACtC,CAAC,CAAA;gBACF,8DAA8D;aAC/D;YAAC,OAAO,KAAU,EAAE;gBACnB,MAAM,UAAU,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBACpD,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;gBAC9B,MAAM,UAAU,CAAA;aACjB;YAED,IAAI,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,CAAA;QAClC,CAAC;KACF,CAAC,CAAC,CAAA;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAmB;IAC7C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IAE1C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAC,cAAc,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,EAAC,CAAC,CAAA;IAEjF,MAAM,IAAI,CAAC,GAAG,EAAE,CAAA;AAClB,CAAC","sourcesContent":["import {build as viteBuild} from 'vite'\nimport {ui, environment, error as kitError} from '@shopify/cli-kit'\n\ntype Target = 'node' | 'client' | 'worker'\n\ninterface DevOptions {\n directory: string\n targets: {[key in Target]: boolean | string}\n base?: string\n assetBaseURL?: string\n verbose?: boolean\n}\n\nexport function buildTaskList({directory, targets, base, assetBaseURL, verbose}: DevOptions): ui.ListrTask[] {\n const commonConfig = {base, root: directory}\n\n return Object.entries(targets)\n .filter(([_, value]) => value)\n .map(([key, value]) => ({\n title: `Building ${key} code`,\n task: async (_, task) => {\n if (key === 'worker') {\n process.env.WORKER = 'true'\n }\n if (assetBaseURL) {\n process.env.HYDROGEN_ASSET_BASE_URL = assetBaseURL\n }\n\n try {\n await viteBuild({\n ...commonConfig,\n build: {\n outDir: `dist/${key}`,\n ssr: typeof value === 'string' ? value : undefined,\n manifest: key === 'client',\n },\n logLevel: verbose ? 'info' : 'silent',\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const abortError = new kitError.Abort(error.message)\n abortError.stack = error.stack\n throw abortError\n }\n\n task.title = `Built ${key} code`\n },\n }))\n}\n\nexport async function build(options: DevOptions) {\n const tasks = await buildTaskList(options)\n\n const list = ui.newListr(tasks, {rendererSilent: environment.local.isUnitTest()})\n\n await list.run()\n}\n"]}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/services/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAC,KAAK,IAAI,SAAS,EAAC,MAAM,MAAM,CAAA;AACvC,OAAO,EAAC,EAAE,EAAE,WAAW,EAAE,KAAK,IAAI,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAYnE,MAAM,UAAU,aAAa,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAa;IACzF,MAAM,YAAY,GAAG,EAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,CAAA;IAE5C,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;SAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,KAAK,EAAE,YAAY,GAAG,OAAO;QAC7B,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YACtB,IAAI,GAAG,KAAK,QAAQ,EAAE;gBACpB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAA;aAC5B;YACD,IAAI,YAAY,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,YAAY,CAAA;aACnD;YAED,IAAI;gBACF,MAAM,SAAS,CAAC;oBACd,GAAG,YAAY;oBACf,KAAK,EAAE;wBACL,MAAM,EAAE,QAAQ,GAAG,EAAE;wBACrB,GAAG,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;wBAClD,QAAQ,EAAE,GAAG,KAAK,QAAQ;qBAC3B;oBACD,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;iBACtC,CAAC,CAAA;gBACF,8DAA8D;aAC/D;YAAC,OAAO,KAAU,EAAE;gBACnB,MAAM,UAAU,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBACpD,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;gBAC9B,MAAM,UAAU,CAAA;aACjB;YAED,IAAI,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,CAAA;QAClC,CAAC;KACF,CAAC,CAAC,CAAA;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAmB;IAC7C,MAAM,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAE5C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IAE1C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAC,cAAc,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,EAAC,CAAC,CAAA;IAEjF,MAAM,IAAI,CAAC,GAAG,EAAE,CAAA;AAClB,CAAC","sourcesContent":["import {checkLockfileStatus} from './build/check-lockfile.js'\nimport {build as viteBuild} from 'vite'\nimport {ui, environment, error as kitError} from '@shopify/cli-kit'\n\ntype Target = 'node' | 'client' | 'worker'\n\ninterface DevOptions {\n directory: string\n targets: {[key in Target]: boolean | string}\n base?: string\n assetBaseURL?: string\n verbose?: boolean\n}\n\nexport function buildTaskList({directory, targets, base, assetBaseURL, verbose}: DevOptions): ui.ListrTask[] {\n const commonConfig = {base, root: directory}\n\n return Object.entries(targets)\n .filter(([_, value]) => value)\n .map(([key, value]) => ({\n title: `Building ${key} code`,\n task: async (_, task) => {\n if (key === 'worker') {\n process.env.WORKER = 'true'\n }\n if (assetBaseURL) {\n process.env.HYDROGEN_ASSET_BASE_URL = assetBaseURL\n }\n\n try {\n await viteBuild({\n ...commonConfig,\n build: {\n outDir: `dist/${key}`,\n ssr: typeof value === 'string' ? value : undefined,\n manifest: key === 'client',\n },\n logLevel: verbose ? 'info' : 'silent',\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const abortError = new kitError.Abort(error.message)\n abortError.stack = error.stack\n throw abortError\n }\n\n task.title = `Built ${key} code`\n },\n }))\n}\n\nexport async function build(options: DevOptions) {\n await checkLockfileStatus(options.directory)\n\n const tasks = await buildTaskList(options)\n\n const list = ui.newListr(tasks, {rendererSilent: environment.local.isUnitTest()})\n\n await list.run()\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function checkHydrogenVersion(directory: string): Promise<string | undefined>;
@@ -0,0 +1,30 @@
1
+ import { system } from '@shopify/cli-kit';
2
+ import { checkForNewVersion } from '@shopify/cli-kit/node/node-package-manager';
3
+ import { renderInfo } from '@shopify/cli-kit/node/ui';
4
+ const PACKAGE_NAME = '@shopify/hydrogen';
5
+ export async function checkHydrogenVersion(directory) {
6
+ const currentVersion = await system.captureOutput('node', ['-p', `require('./node_modules/${PACKAGE_NAME}/package.json').version`], {
7
+ cwd: directory,
8
+ });
9
+ if (!currentVersion) {
10
+ return;
11
+ }
12
+ const newVersionAvailable = await checkForNewVersion(PACKAGE_NAME, currentVersion);
13
+ if (newVersionAvailable) {
14
+ renderInfo({
15
+ headline: 'Upgrade available',
16
+ body: `Version ${newVersionAvailable} of ${PACKAGE_NAME} is now available.\n\n` +
17
+ `You are currently running v${currentVersion}.`,
18
+ reference: [
19
+ {
20
+ link: {
21
+ label: 'Hydrogen releases',
22
+ url: 'https://github.com/Shopify/hydrogen/releases',
23
+ },
24
+ },
25
+ ],
26
+ });
27
+ return newVersionAvailable;
28
+ }
29
+ }
30
+ //# sourceMappingURL=check-version.js.map
@@ -0,0 +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,7 +1,9 @@
1
+ import { checkHydrogenVersion } from './dev/check-version.js';
1
2
  import { createServer } from 'vite';
2
3
  import { analytics, error as kitError } from '@shopify/cli-kit';
3
4
  async function dev({ commandConfig, directory, force, host, open }) {
4
5
  try {
6
+ await checkHydrogenVersion(directory);
5
7
  const server = await createServer({
6
8
  root: directory,
7
9
  server: {
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/services/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAgB,MAAM,MAAM,CAAA;AAChD,OAAO,EAAC,SAAS,EAAE,KAAK,IAAI,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAW7D,KAAK,UAAU,GAAG,CAAC,EAAC,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAa;IAC1E,IAAI;QACF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,IAAI,EAAE,SAAS;YACf,MAAM,EAAE;gBACN,IAAI;gBACJ,KAAK;gBACL,IAAI;aACL;SACF,CAAC,CAAA;QACF,MAAM,MAAM,CAAC,MAAM,EAAE,CAAA;QACrB,MAAM,CAAC,SAAS,EAAE,CAAA;QAClB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7B,MAAM,SAAS,CAAC,WAAW,CAAC,EAAC,MAAM,EAAE,aAAa,EAAC,CAAC,CAAA;QACpD,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;QACxB,8DAA8D;KAC/D;IAAC,OAAO,KAAU,EAAE;QACnB,MAAM,UAAU,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACpD,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QAC9B,MAAM,UAAU,CAAA;KACjB;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAqB;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,OAAO,OAAO,EAAE,CAAA;QAClB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,eAAe,GAAG,CAAA","sourcesContent":["import {createServer, ViteDevServer} from 'vite'\nimport {analytics, error as kitError} from '@shopify/cli-kit'\nimport {Config} from '@oclif/core'\n\ninterface DevOptions {\n commandConfig: Config\n directory: string\n force: boolean\n host: boolean\n open: boolean\n}\n\nasync function dev({commandConfig, directory, force, host, open}: DevOptions) {\n try {\n const server = await createServer({\n root: directory,\n server: {\n open,\n force,\n host,\n },\n })\n await server.listen()\n server.printUrls()\n server.config.logger.info('')\n await analytics.reportEvent({config: commandConfig})\n await closeEvent(server)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const abortError = new kitError.Abort(error.message)\n abortError.stack = error.stack\n throw abortError\n }\n}\n\nfunction closeEvent(server: ViteDevServer): Promise<void> {\n return new Promise((resolve) => {\n server.ws.on('close', () => {\n return resolve()\n })\n })\n}\n\nexport default dev\n"]}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/services/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAC,YAAY,EAAgB,MAAM,MAAM,CAAA;AAChD,OAAO,EAAC,SAAS,EAAE,KAAK,IAAI,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAW7D,KAAK,UAAU,GAAG,CAAC,EAAC,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAa;IAC1E,IAAI;QACF,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAErC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,IAAI,EAAE,SAAS;YACf,MAAM,EAAE;gBACN,IAAI;gBACJ,KAAK;gBACL,IAAI;aACL;SACF,CAAC,CAAA;QACF,MAAM,MAAM,CAAC,MAAM,EAAE,CAAA;QACrB,MAAM,CAAC,SAAS,EAAE,CAAA;QAClB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7B,MAAM,SAAS,CAAC,WAAW,CAAC,EAAC,MAAM,EAAE,aAAa,EAAC,CAAC,CAAA;QACpD,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;QACxB,8DAA8D;KAC/D;IAAC,OAAO,KAAU,EAAE;QACnB,MAAM,UAAU,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACpD,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QAC9B,MAAM,UAAU,CAAA;KACjB;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAqB;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,OAAO,OAAO,EAAE,CAAA;QAClB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,eAAe,GAAG,CAAA","sourcesContent":["import {checkHydrogenVersion} from './dev/check-version.js'\nimport {createServer, ViteDevServer} from 'vite'\nimport {analytics, error as kitError} from '@shopify/cli-kit'\nimport {Config} from '@oclif/core'\n\ninterface DevOptions {\n commandConfig: Config\n directory: string\n force: boolean\n host: boolean\n open: boolean\n}\n\nasync function dev({commandConfig, directory, force, host, open}: DevOptions) {\n try {\n await checkHydrogenVersion(directory)\n\n const server = await createServer({\n root: directory,\n server: {\n open,\n force,\n host,\n },\n })\n await server.listen()\n server.printUrls()\n server.config.logger.info('')\n await analytics.reportEvent({config: commandConfig})\n await closeEvent(server)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const abortError = new kitError.Abort(error.message)\n abortError.stack = error.stack\n throw abortError\n }\n}\n\nfunction closeEvent(server: ViteDevServer): Promise<void> {\n return new Promise((resolve) => {\n server.ws.on('close', () => {\n return resolve()\n })\n })\n}\n\nexport default dev\n"]}