@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.
- package/dist/{lib/setups/i18n/templates → assets/hydrogen/i18n}/domains.ts +1 -1
- package/dist/assets/hydrogen/i18n/mock-i18n-types.ts +3 -0
- package/dist/{lib/setups/i18n/templates → assets/hydrogen/i18n}/subdomains.ts +1 -1
- package/dist/{lib/setups/i18n/templates → assets/hydrogen/i18n}/subfolders.ts +1 -1
- package/dist/{generator-templates → assets/hydrogen}/starter/.eslintrc.cjs +1 -0
- package/dist/{generator-templates → assets/hydrogen}/starter/CHANGELOG.md +24 -0
- package/dist/assets/hydrogen/starter/app/components/Aside.tsx +76 -0
- package/dist/{generator-templates → assets/hydrogen}/starter/app/components/Cart.tsx +38 -14
- package/dist/{generator-templates → assets/hydrogen}/starter/app/components/Footer.tsx +30 -13
- package/dist/{generator-templates → assets/hydrogen}/starter/app/components/Header.tsx +52 -12
- package/dist/{generator-templates/starter/app/components/Layout.tsx → assets/hydrogen/starter/app/components/PageLayout.tsx} +38 -28
- package/dist/{generator-templates → assets/hydrogen}/starter/app/components/Search.tsx +5 -3
- package/dist/{generator-templates → assets/hydrogen}/starter/app/entry.server.tsx +8 -2
- package/dist/{generator-templates → assets/hydrogen}/starter/app/lib/fragments.ts +70 -0
- package/dist/assets/hydrogen/starter/app/root.tsx +204 -0
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/_index.tsx +62 -25
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.addresses.tsx +0 -1
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.orders.$id.tsx +2 -2
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.profile.tsx +0 -1
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/api.predictive-search.tsx +6 -1
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/blogs.$blogHandle.$articleHandle.tsx +34 -8
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/blogs.$blogHandle._index.tsx +36 -10
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/blogs._index.tsx +35 -12
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/cart.tsx +7 -7
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/collections.$handle.tsx +49 -7
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/collections._index.tsx +32 -6
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/collections.all.tsx +31 -6
- package/dist/assets/hydrogen/starter/app/routes/pages.$handle.tsx +84 -0
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/products.$handle.tsx +83 -30
- package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/search.tsx +4 -1
- package/dist/{generator-templates → assets/hydrogen}/starter/app/styles/app.css +22 -4
- package/dist/{generator-templates → assets/hydrogen}/starter/customer-accountapi.generated.d.ts +1 -1
- package/dist/{generator-templates → assets/hydrogen}/starter/env.d.ts +1 -0
- package/dist/{generator-templates → assets/hydrogen}/starter/package.json +11 -11
- package/dist/{generator-templates → assets/hydrogen}/starter/storefrontapi.generated.d.ts +4 -2
- package/dist/{generator-templates → assets/hydrogen}/starter/vite.config.ts +15 -0
- package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/routes/index.jsx +0 -10
- package/dist/{generator-templates/assets → assets/hydrogen}/vite/vite.config.js +15 -0
- package/dist/commands/hydrogen/build.js +171 -111
- package/dist/commands/hydrogen/debug/cpu.js +74 -64
- package/dist/commands/hydrogen/deploy.js +6 -6
- package/dist/commands/hydrogen/dev.js +246 -233
- package/dist/{init.d.ts → commands/hydrogen/init.d.ts} +5 -5
- package/dist/commands/hydrogen/init.js +19 -18
- package/dist/commands/hydrogen/preview.js +101 -13
- package/dist/commands/hydrogen/setup/vite.js +2 -2
- package/dist/commands/hydrogen/setup.js +1 -1
- package/dist/commands/hydrogen/upgrade.js +98 -82
- package/dist/index.d.ts +403 -0
- package/dist/index.js +61 -0
- package/dist/lib/build.js +48 -37
- package/dist/lib/bundle/analyzer.js +2 -4
- package/dist/lib/check-version.js +38 -18
- package/dist/lib/classic-compiler/build.js +139 -0
- package/dist/lib/classic-compiler/debug-cpu.js +52 -0
- package/dist/lib/classic-compiler/dev.js +269 -0
- package/dist/lib/codegen.js +34 -9
- package/dist/lib/cpu-profiler.js +29 -12
- package/dist/lib/defer.js +13 -7
- package/dist/lib/deps-optimizer.js +146 -0
- package/dist/lib/flags.js +3 -8
- package/dist/lib/format-code.js +1 -2
- package/dist/lib/import-utils.js +21 -0
- package/dist/lib/live-reload.js +15 -5
- package/dist/lib/log.js +24 -2
- package/dist/lib/mini-oxygen/index.js +6 -2
- package/dist/lib/mini-oxygen/node.js +18 -4
- package/dist/lib/mini-oxygen/workerd.js +18 -5
- package/dist/lib/onboarding/index.js +16 -2
- package/dist/lib/onboarding/local.js +1 -1
- package/dist/lib/onboarding/setup-template.mocks.js +68 -0
- package/dist/lib/remix-config.js +11 -9
- package/dist/lib/remix-version-check.js +8 -13
- package/dist/lib/resource-cleanup.js +13 -0
- package/dist/lib/setups/css/assets.js +3 -3
- package/dist/lib/setups/css/css-modules.js +2 -2
- package/dist/lib/setups/css/postcss.js +2 -2
- package/dist/lib/setups/css/tailwind.js +2 -2
- package/dist/lib/setups/css/vanilla-extract.js +2 -2
- package/dist/lib/setups/i18n/index.js +3 -5
- package/dist/lib/setups/routes/generate.js +17 -16
- package/dist/lib/template-diff.js +127 -45
- package/dist/lib/template-downloader.js +6 -11
- package/dist/lib/transpile/morph/typedefs.js +17 -0
- package/dist/lib/virtual-routes.js +2 -2
- package/dist/lib/vite-config.js +2 -1
- package/oclif.manifest.json +120 -241
- package/package.json +14 -10
- package/dist/commands/hydrogen/build-vite.js +0 -140
- package/dist/commands/hydrogen/dev-vite.js +0 -228
- package/dist/generator-templates/starter/app/components/Aside.tsx +0 -47
- package/dist/generator-templates/starter/app/lib/root-data.ts +0 -11
- package/dist/generator-templates/starter/app/root.tsx +0 -227
- package/dist/generator-templates/starter/app/routes/pages.$handle.tsx +0 -56
- package/dist/lib/setups/i18n/mock-i18n-types.js +0 -1
- package/dist/lib/setups/i18n/templates/domains.js +0 -14
- package/dist/lib/setups/i18n/templates/subdomains.js +0 -14
- package/dist/lib/setups/i18n/templates/subfolders.js +0 -13
- package/dist/lib/setups/routes/templates/locale-check.js +0 -9
- package/dist/virtual-routes/components/IconDiscord.jsx +0 -21
- /package/dist/{lib/bundle/bundle-analyzer.html → assets/hydrogen/bundle/analyzer.html} +0 -0
- /package/dist/{generator-templates/assets → assets/hydrogen}/css-modules/package.json +0 -0
- /package/dist/{generator-templates/assets → assets/hydrogen}/postcss/package.json +0 -0
- /package/dist/{generator-templates/assets → assets/hydrogen}/postcss/postcss.config.js +0 -0
- /package/dist/{lib/setups/routes/templates → assets/hydrogen/routes}/locale-check.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/.eslintignore +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/.graphqlrc.yml +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/README.md +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/assets/favicon.svg +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/entry.client.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerAddressMutations.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerDetailsQuery.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerOrderQuery.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerOrdersQuery.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/graphql/customer-account/CustomerUpdateMutation.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/lib/search.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/lib/session.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/lib/variants.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/$.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/[robots.txt].tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/[sitemap.xml].tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.$.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account._index.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.orders._index.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account_.authorize.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account_.login.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/account_.logout.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/cart.$lines.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/discount.$code.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/policies.$handle.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/routes/policies._index.tsx +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/app/styles/reset.css +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/public/.gitkeep +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/server.ts +0 -0
- /package/dist/{generator-templates → assets/hydrogen}/starter/tsconfig.json +0 -0
- /package/dist/{generator-templates/assets → assets/hydrogen}/tailwind/package.json +0 -0
- /package/dist/{generator-templates/assets → assets/hydrogen}/tailwind/postcss.config.js +0 -0
- /package/dist/{generator-templates/assets → assets/hydrogen}/tailwind/tailwind.config.js +0 -0
- /package/dist/{generator-templates/assets → assets/hydrogen}/tailwind/tailwind.css +0 -0
- /package/dist/{generator-templates/assets → assets/hydrogen}/vanilla-extract/package.json +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/debug-network.css +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/favicon-dark.svg +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/favicon.svg +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/inter-variable-font.woff2 +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/jetbrainsmono-variable-font.woff2 +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/assets/styles.css +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/FlameChartWrapper.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/HydrogenLogoBaseBW.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/HydrogenLogoBaseColor.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconBanner.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconClose.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconDiscard.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconError.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconGithub.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/IconTwitter.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/Layout.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/RequestDetails.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/RequestTable.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/components/RequestWaterfall.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/lib/useDebugNetworkServer.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/routes/graphiql.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/routes/subrequest-profiler.jsx +0 -0
- /package/dist/{virtual-routes → assets/hydrogen/virtual-routes}/virtual-root.jsx +0 -0
- /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
|
-
×
|
|
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 +0,0 @@
|
|
|
1
|
-
|
|
@@ -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
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|