@shopify/cli-hydrogen 8.0.3 → 8.1.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 (165) hide show
  1. package/dist/{lib/setups/i18n/templates → assets/hydrogen/i18n}/domains.ts +1 -1
  2. package/dist/assets/hydrogen/i18n/mock-i18n-types.ts +3 -0
  3. package/dist/{lib/setups/i18n/templates → assets/hydrogen/i18n}/subdomains.ts +1 -1
  4. package/dist/{lib/setups/i18n/templates → assets/hydrogen/i18n}/subfolders.ts +1 -1
  5. package/dist/{generator-templates → assets/hydrogen}/starter/.eslintrc.cjs +1 -0
  6. package/dist/{generator-templates → assets/hydrogen}/starter/CHANGELOG.md +24 -0
  7. package/dist/assets/hydrogen/starter/app/components/Aside.tsx +76 -0
  8. package/dist/{generator-templates → assets/hydrogen}/starter/app/components/Cart.tsx +38 -14
  9. package/dist/{generator-templates → assets/hydrogen}/starter/app/components/Footer.tsx +30 -13
  10. package/dist/{generator-templates → assets/hydrogen}/starter/app/components/Header.tsx +52 -12
  11. package/dist/{generator-templates/starter/app/components/Layout.tsx → assets/hydrogen/starter/app/components/PageLayout.tsx} +38 -28
  12. package/dist/{generator-templates → assets/hydrogen}/starter/app/components/Search.tsx +5 -3
  13. package/dist/{generator-templates → assets/hydrogen}/starter/app/entry.server.tsx +8 -2
  14. package/dist/{generator-templates → assets/hydrogen}/starter/app/lib/fragments.ts +70 -0
  15. package/dist/assets/hydrogen/starter/app/root.tsx +204 -0
  16. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/_index.tsx +62 -25
  17. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.addresses.tsx +0 -1
  18. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.orders.$id.tsx +2 -2
  19. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.profile.tsx +0 -1
  20. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/api.predictive-search.tsx +6 -1
  21. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/blogs.$blogHandle.$articleHandle.tsx +34 -8
  22. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/blogs.$blogHandle._index.tsx +36 -10
  23. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/blogs._index.tsx +35 -12
  24. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/cart.tsx +7 -7
  25. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/collections.$handle.tsx +49 -7
  26. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/collections._index.tsx +32 -6
  27. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/collections.all.tsx +31 -6
  28. package/dist/assets/hydrogen/starter/app/routes/pages.$handle.tsx +84 -0
  29. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/products.$handle.tsx +83 -30
  30. package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/search.tsx +4 -1
  31. package/dist/{generator-templates → assets/hydrogen}/starter/app/styles/app.css +22 -4
  32. package/dist/{generator-templates → assets/hydrogen}/starter/customer-accountapi.generated.d.ts +1 -1
  33. package/dist/{generator-templates → assets/hydrogen}/starter/env.d.ts +1 -0
  34. package/dist/{generator-templates → assets/hydrogen}/starter/package.json +11 -11
  35. package/dist/{generator-templates → assets/hydrogen}/starter/storefrontapi.generated.d.ts +4 -2
  36. package/dist/{generator-templates → assets/hydrogen}/starter/vite.config.ts +15 -0
  37. package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/routes/index.jsx +0 -10
  38. package/dist/{generator-templates/assets → assets/hydrogen}/vite/vite.config.js +15 -0
  39. package/dist/commands/hydrogen/build.js +171 -111
  40. package/dist/commands/hydrogen/debug/cpu.js +74 -64
  41. package/dist/commands/hydrogen/deploy.js +6 -6
  42. package/dist/commands/hydrogen/dev.js +246 -233
  43. package/dist/{init.d.ts → commands/hydrogen/init.d.ts} +5 -5
  44. package/dist/commands/hydrogen/init.js +19 -18
  45. package/dist/commands/hydrogen/preview.js +101 -13
  46. package/dist/commands/hydrogen/setup/vite.js +2 -2
  47. package/dist/commands/hydrogen/setup.js +1 -1
  48. package/dist/commands/hydrogen/upgrade.js +98 -82
  49. package/dist/index.d.ts +403 -0
  50. package/dist/index.js +61 -0
  51. package/dist/lib/build.js +48 -37
  52. package/dist/lib/bundle/analyzer.js +2 -4
  53. package/dist/lib/check-version.js +38 -18
  54. package/dist/lib/classic-compiler/build.js +139 -0
  55. package/dist/lib/classic-compiler/debug-cpu.js +52 -0
  56. package/dist/lib/classic-compiler/dev.js +269 -0
  57. package/dist/lib/codegen.js +34 -9
  58. package/dist/lib/cpu-profiler.js +29 -12
  59. package/dist/lib/defer.js +13 -7
  60. package/dist/lib/deps-optimizer.js +146 -0
  61. package/dist/lib/flags.js +3 -8
  62. package/dist/lib/format-code.js +1 -2
  63. package/dist/lib/import-utils.js +21 -0
  64. package/dist/lib/live-reload.js +15 -5
  65. package/dist/lib/log.js +24 -2
  66. package/dist/lib/mini-oxygen/index.js +6 -2
  67. package/dist/lib/mini-oxygen/node.js +18 -4
  68. package/dist/lib/mini-oxygen/workerd.js +18 -5
  69. package/dist/lib/onboarding/index.js +16 -2
  70. package/dist/lib/onboarding/local.js +1 -1
  71. package/dist/lib/onboarding/setup-template.mocks.js +68 -0
  72. package/dist/lib/remix-config.js +11 -9
  73. package/dist/lib/remix-version-check.js +8 -13
  74. package/dist/lib/resource-cleanup.js +13 -0
  75. package/dist/lib/setups/css/assets.js +3 -3
  76. package/dist/lib/setups/css/css-modules.js +2 -2
  77. package/dist/lib/setups/css/postcss.js +2 -2
  78. package/dist/lib/setups/css/tailwind.js +2 -2
  79. package/dist/lib/setups/css/vanilla-extract.js +2 -2
  80. package/dist/lib/setups/i18n/index.js +3 -5
  81. package/dist/lib/setups/routes/generate.js +17 -16
  82. package/dist/lib/template-diff.js +127 -45
  83. package/dist/lib/template-downloader.js +6 -11
  84. package/dist/lib/transpile/morph/typedefs.js +17 -0
  85. package/dist/lib/virtual-routes.js +2 -2
  86. package/dist/lib/vite-config.js +2 -1
  87. package/oclif.manifest.json +120 -241
  88. package/package.json +14 -10
  89. package/dist/commands/hydrogen/build-vite.js +0 -140
  90. package/dist/commands/hydrogen/dev-vite.js +0 -228
  91. package/dist/generator-templates/starter/app/components/Aside.tsx +0 -47
  92. package/dist/generator-templates/starter/app/lib/root-data.ts +0 -11
  93. package/dist/generator-templates/starter/app/root.tsx +0 -227
  94. package/dist/generator-templates/starter/app/routes/pages.$handle.tsx +0 -56
  95. package/dist/lib/setups/i18n/mock-i18n-types.js +0 -1
  96. package/dist/lib/setups/i18n/templates/domains.js +0 -14
  97. package/dist/lib/setups/i18n/templates/subdomains.js +0 -14
  98. package/dist/lib/setups/i18n/templates/subfolders.js +0 -13
  99. package/dist/lib/setups/routes/templates/locale-check.js +0 -9
  100. package/dist/virtual-routes/components/IconDiscord.jsx +0 -21
  101. /package/dist/{lib/bundle/bundle-analyzer.html → assets/hydrogen/bundle/analyzer.html} +0 -0
  102. /package/dist/{generator-templates/assets → assets/hydrogen}/css-modules/package.json +0 -0
  103. /package/dist/{generator-templates/assets → assets/hydrogen}/postcss/package.json +0 -0
  104. /package/dist/{generator-templates/assets → assets/hydrogen}/postcss/postcss.config.js +0 -0
  105. /package/dist/{lib/setups/routes/templates → assets/hydrogen/routes}/locale-check.ts +0 -0
  106. /package/dist/{generator-templates → assets/hydrogen}/starter/.eslintignore +0 -0
  107. /package/dist/{generator-templates → assets/hydrogen}/starter/.graphqlrc.yml +0 -0
  108. /package/dist/{generator-templates → assets/hydrogen}/starter/README.md +0 -0
  109. /package/dist/{generator-templates → assets/hydrogen}/starter/app/assets/favicon.svg +0 -0
  110. /package/dist/{generator-templates → assets/hydrogen}/starter/app/entry.client.tsx +0 -0
  111. /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerAddressMutations.ts +0 -0
  112. /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerDetailsQuery.ts +0 -0
  113. /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerOrderQuery.ts +0 -0
  114. /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerOrdersQuery.ts +0 -0
  115. /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerUpdateMutation.ts +0 -0
  116. /package/dist/{generator-templates → assets/hydrogen}/starter/app/lib/search.ts +0 -0
  117. /package/dist/{generator-templates → assets/hydrogen}/starter/app/lib/session.ts +0 -0
  118. /package/dist/{generator-templates → assets/hydrogen}/starter/app/lib/variants.ts +0 -0
  119. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/$.tsx +0 -0
  120. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/[robots.txt].tsx +0 -0
  121. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/[sitemap.xml].tsx +0 -0
  122. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.$.tsx +0 -0
  123. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account._index.tsx +0 -0
  124. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.orders._index.tsx +0 -0
  125. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.tsx +0 -0
  126. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account_.authorize.tsx +0 -0
  127. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account_.login.tsx +0 -0
  128. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account_.logout.tsx +0 -0
  129. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/cart.$lines.tsx +0 -0
  130. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/discount.$code.tsx +0 -0
  131. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/policies.$handle.tsx +0 -0
  132. /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/policies._index.tsx +0 -0
  133. /package/dist/{generator-templates → assets/hydrogen}/starter/app/styles/reset.css +0 -0
  134. /package/dist/{generator-templates → assets/hydrogen}/starter/public/.gitkeep +0 -0
  135. /package/dist/{generator-templates → assets/hydrogen}/starter/server.ts +0 -0
  136. /package/dist/{generator-templates → assets/hydrogen}/starter/tsconfig.json +0 -0
  137. /package/dist/{generator-templates/assets → assets/hydrogen}/tailwind/package.json +0 -0
  138. /package/dist/{generator-templates/assets → assets/hydrogen}/tailwind/postcss.config.js +0 -0
  139. /package/dist/{generator-templates/assets → assets/hydrogen}/tailwind/tailwind.config.js +0 -0
  140. /package/dist/{generator-templates/assets → assets/hydrogen}/tailwind/tailwind.css +0 -0
  141. /package/dist/{generator-templates/assets → assets/hydrogen}/vanilla-extract/package.json +0 -0
  142. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/debug-network.css +0 -0
  143. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/favicon-dark.svg +0 -0
  144. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/favicon.svg +0 -0
  145. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/inter-variable-font.woff2 +0 -0
  146. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/jetbrainsmono-variable-font.woff2 +0 -0
  147. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/styles.css +0 -0
  148. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/FlameChartWrapper.jsx +0 -0
  149. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/HydrogenLogoBaseBW.jsx +0 -0
  150. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/HydrogenLogoBaseColor.jsx +0 -0
  151. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconBanner.jsx +0 -0
  152. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconClose.jsx +0 -0
  153. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconDiscard.jsx +0 -0
  154. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconError.jsx +0 -0
  155. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconGithub.jsx +0 -0
  156. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconTwitter.jsx +0 -0
  157. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/Layout.jsx +0 -0
  158. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/RequestDetails.jsx +0 -0
  159. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/RequestTable.jsx +0 -0
  160. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/RequestWaterfall.jsx +0 -0
  161. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/lib/useDebugNetworkServer.jsx +0 -0
  162. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/routes/graphiql.jsx +0 -0
  163. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/routes/subrequest-profiler.jsx +0 -0
  164. /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/virtual-root.jsx +0 -0
  165. /package/dist/{generator-templates/assets → assets/hydrogen}/vite/package.json +0 -0
@@ -1,228 +0,0 @@
1
- import path from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- import { setH2OVerbose, isH2Verbose, muteDevLogs, enhanceH2Logs } from '../../lib/log.js';
4
- import { commonFlags, overrideFlag, flagsToCamelObject, DEFAULT_INSPECTOR_PORT, DEFAULT_APP_PORT } from '../../lib/flags.js';
5
- import Command from '@shopify/cli-kit/node/base-command';
6
- import colors from '@shopify/cli-kit/node/colors';
7
- import { collectLog } from '@shopify/cli-kit/node/output';
8
- import { renderSuccess } from '@shopify/cli-kit/node/ui';
9
- import { AbortError } from '@shopify/cli-kit/node/error';
10
- import { Flags } from '@oclif/core';
11
- import { spawnCodegenProcess } from '../../lib/codegen.js';
12
- import { getAllEnvironmentVariables } from '../../lib/environment-variables.js';
13
- import { displayDevUpgradeNotice } from './upgrade.js';
14
- import { prepareDiffDirectory } from '../../lib/template-diff.js';
15
- import { getDevConfigInBackground, TUNNEL_DOMAIN, startTunnelAndPushConfig, getUtilityBannerlines, getDebugBannerLine, isMockShop, notifyIssueWithTunnelAndMockShop } from '../../lib/dev-shared.js';
16
- import { getCliCommand } from '../../lib/shell.js';
17
- import { findPort } from '../../lib/find-port.js';
18
- import { logRequestLine } from '../../lib/mini-oxygen/common.js';
19
- import { findHydrogenPlugin, findOxygenPlugin } from '../../lib/vite-config.js';
20
-
21
- class DevVite extends Command {
22
- static description = "Runs Hydrogen storefront in an Oxygen worker for development.";
23
- static flags = {
24
- ...commonFlags.path,
25
- ...commonFlags.entry,
26
- ...overrideFlag(commonFlags.port, {
27
- port: { default: void 0, required: false }
28
- }),
29
- ...commonFlags.codegen,
30
- "disable-virtual-routes": Flags.boolean({
31
- description: "Disable rendering fallback routes when a route file doesn't exist.",
32
- env: "SHOPIFY_HYDROGEN_FLAG_DISABLE_VIRTUAL_ROUTES"
33
- }),
34
- ...commonFlags.debug,
35
- ...commonFlags.inspectorPort,
36
- host: Flags.boolean({
37
- description: "Expose the server to the network",
38
- default: false,
39
- required: false
40
- }),
41
- ...commonFlags.env,
42
- ...commonFlags.envBranch,
43
- "disable-version-check": Flags.boolean({
44
- description: "Skip the version check when running `hydrogen dev`",
45
- default: false,
46
- required: false
47
- }),
48
- ...commonFlags.diff,
49
- ...commonFlags.customerAccountPush,
50
- ...commonFlags.verbose
51
- };
52
- static hidden = true;
53
- async run() {
54
- const { flags } = await this.parse(DevVite);
55
- let directory = flags.path ? path.resolve(flags.path) : process.cwd();
56
- if (flags.diff) {
57
- directory = await prepareDiffDirectory(directory, true);
58
- }
59
- await runViteDev({
60
- ...flagsToCamelObject(flags),
61
- customerAccountPush: flags["customer-account-push__unstable"],
62
- path: directory,
63
- isLocalDev: flags.diff,
64
- cliConfig: this.config
65
- });
66
- }
67
- }
68
- async function runViteDev({
69
- entry: ssrEntry,
70
- port: appPort,
71
- path: appPath,
72
- host,
73
- codegen: useCodegen = false,
74
- codegenConfigPath,
75
- disableVirtualRoutes,
76
- envBranch,
77
- env: envHandle,
78
- debug = false,
79
- disableVersionCheck = false,
80
- inspectorPort,
81
- isLocalDev = false,
82
- customerAccountPush: customerAccountPushFlag = false,
83
- cliConfig,
84
- verbose
85
- }) {
86
- if (!process.env.NODE_ENV)
87
- process.env.NODE_ENV = "development";
88
- if (verbose)
89
- setH2OVerbose();
90
- if (!isH2Verbose())
91
- muteDevLogs();
92
- const root = appPath ?? process.cwd();
93
- const cliCommandPromise = getCliCommand(root);
94
- const backgroundPromise = getDevConfigInBackground(
95
- root,
96
- customerAccountPushFlag
97
- );
98
- const envPromise = backgroundPromise.then(
99
- ({ fetchRemote, localVariables }) => getAllEnvironmentVariables({
100
- root,
101
- envBranch,
102
- envHandle,
103
- fetchRemote,
104
- localVariables
105
- })
106
- );
107
- if (debug && !inspectorPort) {
108
- inspectorPort = await findPort(DEFAULT_INSPECTOR_PORT);
109
- }
110
- const vite = await import('vite');
111
- const fs = isLocalDev ? { allow: [root, fileURLToPath(new URL("../../../../", import.meta.url))] } : void 0;
112
- const customLogger = vite.createLogger();
113
- if (process.env.SHOPIFY_UNIT_TEST) {
114
- customLogger.info = (msg) => collectLog("info", msg);
115
- customLogger.warn = (msg) => collectLog("warn", msg);
116
- customLogger.error = (msg) => collectLog("error", msg);
117
- }
118
- const viteServer = await vite.createServer({
119
- root,
120
- customLogger,
121
- clearScreen: false,
122
- server: { fs, host: host ? true : void 0 },
123
- plugins: [
124
- {
125
- name: "hydrogen:cli",
126
- configResolved(config) {
127
- findHydrogenPlugin(config)?.api?.registerPluginOptions({
128
- disableVirtualRoutes
129
- });
130
- findOxygenPlugin(config)?.api?.registerPluginOptions({
131
- debug,
132
- entry: ssrEntry,
133
- envPromise: envPromise.then(({ allVariables: allVariables2 }) => allVariables2),
134
- inspectorPort,
135
- logRequestLine
136
- });
137
- },
138
- configureServer: (viteDevServer) => {
139
- if (customerAccountPushFlag) {
140
- viteDevServer.middlewares.use((req, res, next) => {
141
- const host2 = req.headers.host;
142
- if (host2?.includes(TUNNEL_DOMAIN.ORIGINAL)) {
143
- req.headers.host = host2.replace(
144
- TUNNEL_DOMAIN.ORIGINAL,
145
- TUNNEL_DOMAIN.REBRANDED
146
- );
147
- }
148
- next();
149
- });
150
- }
151
- }
152
- }
153
- ]
154
- });
155
- const h2Plugin = findHydrogenPlugin(viteServer.config);
156
- if (!h2Plugin) {
157
- await viteServer.close();
158
- throw new AbortError(
159
- "Hydrogen plugin not found.",
160
- "Add `hydrogen()` plugin to your Vite config."
161
- );
162
- }
163
- const h2PluginOptions = h2Plugin.api?.getPluginOptions?.();
164
- const codegenProcess = useCodegen ? spawnCodegenProcess({
165
- rootDirectory: root,
166
- configFilePath: codegenConfigPath,
167
- appDirectory: h2PluginOptions?.remixConfig?.appDirectory
168
- }) : void 0;
169
- process.on("unhandledRejection", (err) => {
170
- console.log("Unhandled Rejection: ", err);
171
- });
172
- const publicPort = appPort ?? viteServer.config.server.port ?? DEFAULT_APP_PORT;
173
- const [tunnel, cliCommand] = await Promise.all([
174
- backgroundPromise.then(
175
- ({ customerAccountPush, storefrontId }) => customerAccountPush ? startTunnelAndPushConfig(root, cliConfig, publicPort, storefrontId) : void 0
176
- ),
177
- cliCommandPromise,
178
- viteServer.listen(publicPort)
179
- ]);
180
- const publicUrl = new URL(
181
- viteServer.resolvedUrls.local[0] ?? viteServer.resolvedUrls.network[0]
182
- );
183
- const finalHost = tunnel?.host || publicUrl.toString() || publicUrl.origin;
184
- enhanceH2Logs({
185
- rootDirectory: root,
186
- host: finalHost,
187
- cliCommand
188
- });
189
- const { logInjectedVariables, allVariables } = await envPromise;
190
- logInjectedVariables();
191
- console.log("");
192
- viteServer.printUrls();
193
- viteServer.bindCLIShortcuts({ print: true });
194
- console.log("\n");
195
- const customSections = [];
196
- if (!h2PluginOptions?.disableVirtualRoutes) {
197
- customSections.push({ body: getUtilityBannerlines(finalHost) });
198
- }
199
- if (debug && inspectorPort) {
200
- customSections.push({
201
- body: { warn: getDebugBannerLine(inspectorPort) }
202
- });
203
- }
204
- const { storefrontTitle } = await backgroundPromise;
205
- renderSuccess({
206
- body: [
207
- `View ${storefrontTitle ? colors.cyan(storefrontTitle) : "Hydrogen"} app:`,
208
- { link: { url: finalHost } }
209
- ],
210
- customSections
211
- });
212
- if (!disableVersionCheck) {
213
- displayDevUpgradeNotice({ targetPath: root });
214
- }
215
- if (customerAccountPushFlag && isMockShop(allVariables)) {
216
- notifyIssueWithTunnelAndMockShop(cliCommand);
217
- }
218
- return {
219
- getUrl: () => finalHost,
220
- async close() {
221
- codegenProcess?.removeAllListeners("close");
222
- codegenProcess?.kill("SIGINT");
223
- await Promise.allSettled([viteServer.close(), tunnel?.cleanup?.()]);
224
- }
225
- };
226
- }
227
-
228
- export { DevVite as default, runViteDev };
@@ -1,47 +0,0 @@
1
- /**
2
- * A side bar component with Overlay that works without JavaScript.
3
- * @example
4
- * ```jsx
5
- * <Aside id="search-aside" heading="SEARCH">
6
- * <input type="search" />
7
- * ...
8
- * </Aside>
9
- * ```
10
- */
11
- export function Aside({
12
- children,
13
- heading,
14
- id = 'aside',
15
- }: {
16
- children?: React.ReactNode;
17
- heading: React.ReactNode;
18
- id?: string;
19
- }) {
20
- return (
21
- <div aria-modal className="overlay" id={id} role="dialog">
22
- <button
23
- className="close-outside"
24
- onClick={() => {
25
- history.go(-1);
26
- window.location.hash = '';
27
- }}
28
- />
29
- <aside>
30
- <header>
31
- <h3>{heading}</h3>
32
- <CloseAside />
33
- </header>
34
- <main>{children}</main>
35
- </aside>
36
- </div>
37
- );
38
- }
39
-
40
- function CloseAside() {
41
- return (
42
- /* eslint-disable-next-line jsx-a11y/anchor-is-valid */
43
- <a className="close" href="#" onChange={() => history.go(-1)}>
44
- &times;
45
- </a>
46
- );
47
- }
@@ -1,11 +0,0 @@
1
- import {useMatches} from '@remix-run/react';
2
- import type {SerializeFrom} from '@shopify/remix-oxygen';
3
- import type {loader} from '~/root';
4
-
5
- /**
6
- * Access the result of the root loader from a React component.
7
- */
8
- export function useRootLoaderData() {
9
- const [root] = useMatches();
10
- return root?.data as SerializeFrom<typeof loader>;
11
- }
@@ -1,227 +0,0 @@
1
- import {useNonce} from '@shopify/hydrogen';
2
- import {defer, type LoaderFunctionArgs} from '@shopify/remix-oxygen';
3
- import {
4
- Links,
5
- Meta,
6
- Outlet,
7
- Scripts,
8
- useRouteError,
9
- useLoaderData,
10
- ScrollRestoration,
11
- isRouteErrorResponse,
12
- type ShouldRevalidateFunction,
13
- } from '@remix-run/react';
14
- import favicon from './assets/favicon.svg';
15
- import resetStyles from './styles/reset.css?url';
16
- import appStyles from './styles/app.css?url';
17
- import {Layout} from '~/components/Layout';
18
-
19
- /**
20
- * This is important to avoid re-fetching root queries on sub-navigations
21
- */
22
- export const shouldRevalidate: ShouldRevalidateFunction = ({
23
- formMethod,
24
- currentUrl,
25
- nextUrl,
26
- }) => {
27
- // revalidate when a mutation is performed e.g add to cart, login...
28
- if (formMethod && formMethod !== 'GET') {
29
- return true;
30
- }
31
-
32
- // revalidate when manually revalidating via useRevalidator
33
- if (currentUrl.toString() === nextUrl.toString()) {
34
- return true;
35
- }
36
-
37
- return false;
38
- };
39
-
40
- export function links() {
41
- return [
42
- {rel: 'stylesheet', href: resetStyles},
43
- {rel: 'stylesheet', href: appStyles},
44
- {
45
- rel: 'preconnect',
46
- href: 'https://cdn.shopify.com',
47
- },
48
- {
49
- rel: 'preconnect',
50
- href: 'https://shop.app',
51
- },
52
- {rel: 'icon', type: 'image/svg+xml', href: favicon},
53
- ];
54
- }
55
-
56
- export async function loader({context}: LoaderFunctionArgs) {
57
- const {storefront, customerAccount, cart} = context;
58
- const publicStoreDomain = context.env.PUBLIC_STORE_DOMAIN;
59
-
60
- const isLoggedInPromise = customerAccount.isLoggedIn();
61
- const cartPromise = cart.get();
62
-
63
- // defer the footer query (below the fold)
64
- const footerPromise = storefront.query(FOOTER_QUERY, {
65
- cache: storefront.CacheLong(),
66
- variables: {
67
- footerMenuHandle: 'footer', // Adjust to your footer menu handle
68
- },
69
- });
70
-
71
- // await the header query (above the fold)
72
- const headerPromise = storefront.query(HEADER_QUERY, {
73
- cache: storefront.CacheLong(),
74
- variables: {
75
- headerMenuHandle: 'main-menu', // Adjust to your header menu handle
76
- },
77
- });
78
-
79
- return defer(
80
- {
81
- cart: cartPromise,
82
- footer: footerPromise,
83
- header: await headerPromise,
84
- isLoggedIn: isLoggedInPromise,
85
- publicStoreDomain,
86
- },
87
- {
88
- headers: {
89
- 'Set-Cookie': await context.session.commit(),
90
- },
91
- },
92
- );
93
- }
94
-
95
- export default function App() {
96
- const nonce = useNonce();
97
- const data = useLoaderData<typeof loader>();
98
-
99
- return (
100
- <html lang="en">
101
- <head>
102
- <meta charSet="utf-8" />
103
- <meta name="viewport" content="width=device-width,initial-scale=1" />
104
- <Meta />
105
- <Links />
106
- </head>
107
- <body>
108
- <Layout {...data}>
109
- <Outlet />
110
- </Layout>
111
- <ScrollRestoration nonce={nonce} />
112
- <Scripts nonce={nonce} />
113
- </body>
114
- </html>
115
- );
116
- }
117
-
118
- export function ErrorBoundary() {
119
- const error = useRouteError();
120
- const rootData = useLoaderData<typeof loader>();
121
- const nonce = useNonce();
122
- let errorMessage = 'Unknown error';
123
- let errorStatus = 500;
124
-
125
- if (isRouteErrorResponse(error)) {
126
- errorMessage = error?.data?.message ?? error.data;
127
- errorStatus = error.status;
128
- } else if (error instanceof Error) {
129
- errorMessage = error.message;
130
- }
131
-
132
- return (
133
- <html lang="en">
134
- <head>
135
- <meta charSet="utf-8" />
136
- <meta name="viewport" content="width=device-width,initial-scale=1" />
137
- <Meta />
138
- <Links />
139
- </head>
140
- <body>
141
- <Layout {...rootData}>
142
- <div className="route-error">
143
- <h1>Oops</h1>
144
- <h2>{errorStatus}</h2>
145
- {errorMessage && (
146
- <fieldset>
147
- <pre>{errorMessage}</pre>
148
- </fieldset>
149
- )}
150
- </div>
151
- </Layout>
152
- <ScrollRestoration nonce={nonce} />
153
- <Scripts nonce={nonce} />
154
- </body>
155
- </html>
156
- );
157
- }
158
-
159
- const MENU_FRAGMENT = `#graphql
160
- fragment MenuItem on MenuItem {
161
- id
162
- resourceId
163
- tags
164
- title
165
- type
166
- url
167
- }
168
- fragment ChildMenuItem on MenuItem {
169
- ...MenuItem
170
- }
171
- fragment ParentMenuItem on MenuItem {
172
- ...MenuItem
173
- items {
174
- ...ChildMenuItem
175
- }
176
- }
177
- fragment Menu on Menu {
178
- id
179
- items {
180
- ...ParentMenuItem
181
- }
182
- }
183
- ` as const;
184
-
185
- const HEADER_QUERY = `#graphql
186
- fragment Shop on Shop {
187
- id
188
- name
189
- description
190
- primaryDomain {
191
- url
192
- }
193
- brand {
194
- logo {
195
- image {
196
- url
197
- }
198
- }
199
- }
200
- }
201
- query Header(
202
- $country: CountryCode
203
- $headerMenuHandle: String!
204
- $language: LanguageCode
205
- ) @inContext(language: $language, country: $country) {
206
- shop {
207
- ...Shop
208
- }
209
- menu(handle: $headerMenuHandle) {
210
- ...Menu
211
- }
212
- }
213
- ${MENU_FRAGMENT}
214
- ` as const;
215
-
216
- const FOOTER_QUERY = `#graphql
217
- query Footer(
218
- $country: CountryCode
219
- $footerMenuHandle: String!
220
- $language: LanguageCode
221
- ) @inContext(language: $language, country: $country) {
222
- menu(handle: $footerMenuHandle) {
223
- ...Menu
224
- }
225
- }
226
- ${MENU_FRAGMENT}
227
- ` as const;
@@ -1,56 +0,0 @@
1
- import {json, type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {useLoaderData, type MetaFunction} from '@remix-run/react';
3
-
4
- export const meta: MetaFunction<typeof loader> = ({data}) => {
5
- return [{title: `Hydrogen | ${data?.page.title ?? ''}`}];
6
- };
7
-
8
- export async function loader({params, context}: LoaderFunctionArgs) {
9
- if (!params.handle) {
10
- throw new Error('Missing page handle');
11
- }
12
-
13
- const {page} = await context.storefront.query(PAGE_QUERY, {
14
- variables: {
15
- handle: params.handle,
16
- },
17
- });
18
-
19
- if (!page) {
20
- throw new Response('Not Found', {status: 404});
21
- }
22
-
23
- return json({page});
24
- }
25
-
26
- export default function Page() {
27
- const {page} = useLoaderData<typeof loader>();
28
-
29
- return (
30
- <div className="page">
31
- <header>
32
- <h1>{page.title}</h1>
33
- </header>
34
- <main dangerouslySetInnerHTML={{__html: page.body}} />
35
- </div>
36
- );
37
- }
38
-
39
- const PAGE_QUERY = `#graphql
40
- query Page(
41
- $language: LanguageCode,
42
- $country: CountryCode,
43
- $handle: String!
44
- )
45
- @inContext(language: $language, country: $country) {
46
- page(handle: $handle) {
47
- id
48
- title
49
- body
50
- seo {
51
- description
52
- title
53
- }
54
- }
55
- }
56
- ` as const;
@@ -1,14 +0,0 @@
1
- function getLocaleFromRequest(request) {
2
- const defaultLocale = { language: "EN", country: "US" };
3
- const supportedLocales = {
4
- ES: "ES",
5
- FR: "FR",
6
- DE: "DE",
7
- JP: "JA"
8
- };
9
- const url = new URL(request.url);
10
- const domain = url.hostname.split(".").pop()?.toUpperCase();
11
- return domain && supportedLocales[domain] ? { language: supportedLocales[domain], country: domain } : defaultLocale;
12
- }
13
-
14
- export { getLocaleFromRequest };
@@ -1,14 +0,0 @@
1
- function getLocaleFromRequest(request) {
2
- const defaultLocale = { language: "EN", country: "US" };
3
- const supportedLocales = {
4
- ES: "ES",
5
- FR: "FR",
6
- DE: "DE",
7
- JP: "JA"
8
- };
9
- const url = new URL(request.url);
10
- const firstSubdomain = url.hostname.split(".")[0]?.toUpperCase();
11
- return supportedLocales[firstSubdomain] ? { language: supportedLocales[firstSubdomain], country: firstSubdomain } : defaultLocale;
12
- }
13
-
14
- export { getLocaleFromRequest };
@@ -1,13 +0,0 @@
1
- function getLocaleFromRequest(request) {
2
- const url = new URL(request.url);
3
- const firstPathPart = url.pathname.split("/")[1]?.toUpperCase() ?? "";
4
- let pathPrefix = "";
5
- let [language, country] = ["EN", "US"];
6
- if (/^[A-Z]{2}-[A-Z]{2}$/i.test(firstPathPart)) {
7
- pathPrefix = "/" + firstPathPart;
8
- [language, country] = firstPathPart.split("-");
9
- }
10
- return { language, country, pathPrefix };
11
- }
12
-
13
- export { getLocaleFromRequest };
@@ -1,9 +0,0 @@
1
- async function loader({ params, context }) {
2
- const { language, country } = context.storefront.i18n;
3
- if (params.locale && params.locale.toLowerCase() !== `${language}-${country}`.toLowerCase()) {
4
- throw new Response(null, { status: 404 });
5
- }
6
- return null;
7
- }
8
-
9
- export { loader };
@@ -1,21 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- const IconDiscord = (props) => /* @__PURE__ */ jsx(
3
- "svg",
4
- {
5
- width: 26,
6
- height: 20,
7
- fill: "none",
8
- xmlns: "http://www.w3.org/2000/svg",
9
- ...props,
10
- children: /* @__PURE__ */ jsx(
11
- "path",
12
- {
13
- d: "M21.19 1.675A19.91 19.91 0 0 0 16.03 0c-.223.415-.482.973-.661 1.418a18.355 18.355 0 0 0-5.72 0A15.367 15.367 0 0 0 8.98 0a19.844 19.844 0 0 0-5.165 1.68C.55 6.776-.336 11.747.106 16.647c2.167 1.67 4.266 2.686 6.33 3.35.51-.724.964-1.495 1.356-2.306a13.149 13.149 0 0 1-2.135-1.073c.179-.137.354-.28.523-.428 4.116 1.989 8.588 1.989 12.655 0 .172.148.347.291.524.428a13.12 13.12 0 0 1-2.139 1.075c.392.81.844 1.582 1.356 2.306 2.066-.664 4.167-1.68 6.333-3.352.52-5.68-.887-10.606-3.718-14.973ZM8.353 13.635c-1.235 0-2.249-1.192-2.249-2.643 0-1.45.992-2.644 2.25-2.644 1.257 0 2.27 1.191 2.248 2.644.002 1.45-.991 2.642-2.249 2.642Zm8.311 0c-1.235 0-2.249-1.192-2.249-2.643 0-1.45.992-2.644 2.25-2.644 1.257 0 2.27 1.191 2.248 2.644 0 1.45-.991 2.642-2.249 2.642Z",
14
- fill: "#5C5F62"
15
- }
16
- )
17
- }
18
- );
19
- export {
20
- IconDiscord
21
- };