Visitar URL original
chore: clean up internals · nuxt-modules/shopify@f3ef51c · GitHub
Skip to content

Commit f3ef51c

Browse files
committed
chore: clean up internals
Signed-off-by: Frederik Bußmann <frederik@bussmann.io>
1 parent 1544c8b commit f3ef51c

68 files changed

Lines changed: 605 additions & 558 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎package.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
"minimatch": "^11.0.5",
108108
"nitropack": "^2.13.4",
109109
"ohash": "^2.0.12",
110+
"pathe": "^2.0.3",
110111
"scule": "^1.3.0",
111112
"ufo": "^1.6.4",
112113
"unstorage": "^1.17.5",

‎pnpm-lock.yaml‎

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎src/commands/webhooks.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import type { WebhookSubscription } from '../utils/webhooks'
33
import { defineCommand } from 'citty'
44
import log from 'consola'
55

6+
import { parseGid } from '../runtime/utils/functions'
67
import {
7-
WEBHOOK_GID_PREFIX,
88
getShopifyConfig,
99
getSubscribedWebhooks,
1010
subscribeWebhooks,
@@ -14,7 +14,7 @@ import {
1414
const ACTIONS = ['list', 'subscribe', 'unsubscribe']
1515

1616
const toRow = (subscription: WebhookSubscription) => ({
17-
id: subscription.id.replace(WEBHOOK_GID_PREFIX, ''),
17+
id: parseGid(subscription.id),
1818
topic: subscription.topic,
1919
uri: subscription.uri,
2020
})

‎src/module.ts‎

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ import setupExplorer from './setup/explorer'
1919
import setupVite from './setup/vite'
2020
import setupWebhooks from './setup/webhooks'
2121

22-
import { configSchema } from './schemas'
23-
import { warnPublicOptions, warnUnrecognizedOptions } from './schemas/resolve'
24-
import { findInvalidFeatures, withoutFeatures } from './runtime/utils/config'
25-
import { getConfiguredClients } from './utils/clients'
22+
import { CONFIGURATION_DOCS_URL, resolveConfig, warnPublicOptions, warnUnrecognizedOptions } from './schemas/resolve'
23+
import { configObjectSchema, findInvalidFeatures, withoutFeatures } from './runtime/utils/config'
2624
import { initLogger } from './utils/log'
2725

2826
export default defineNuxtModule<ModuleOptions>({
@@ -55,7 +53,7 @@ export default defineNuxtModule<ModuleOptions>({
5553

5654
let input = rawConfig
5755

58-
let moduleOptions = await configSchema.safeParseAsync({ ...input, _nuxt: nuxt })
56+
let moduleOptions = configObjectSchema.safeParse(input)
5957

6058
const invalidFeatures = !moduleOptions.success && (nuxt.options.dev || nuxt.options._prepare)
6159
? findInvalidFeatures(moduleOptions.error)
@@ -65,18 +63,17 @@ export default defineNuxtModule<ModuleOptions>({
6563
logger.error(`Skipping ${invalidFeatures.map(feature => `\`${feature.join('.')}\``).join(', ')}: invalid configuration\n${z.prettifyError(moduleOptions.error)}`)
6664

6765
input = withoutFeatures(input, invalidFeatures)
68-
moduleOptions = await configSchema.safeParseAsync({ ...input, _nuxt: nuxt })
66+
moduleOptions = configObjectSchema.safeParse(input)
6967
}
7068

7169
if (moduleOptions.success) {
7270
logger.start('Starting setup')
7371

74-
const config = moduleOptions.data
72+
warnUnrecognizedOptions(input, moduleOptions.data)
7573

76-
warnUnrecognizedOptions(input)
77-
warnPublicOptions(runtimeConfig.public.shopify, config)
74+
const config = await resolveConfig(moduleOptions.data, nuxt)
7875

79-
logger.debug(`Configured clients: ${getConfiguredClients(config).join(', ') || 'none'}`)
76+
warnPublicOptions(runtimeConfig.public.shopify, config)
8077

8178
await nuxt.callHook('shopify:config', { nuxt, config })
8279

@@ -97,7 +94,7 @@ export default defineNuxtModule<ModuleOptions>({
9794
logger.success('Finished setup')
9895
}
9996
else if (Object.keys(rawConfig ?? {}).length) {
100-
const reference = 'See the module configuration reference: https://shopify.nuxtjs.org/essentials/configuration'
97+
const reference = `See the module configuration reference: ${CONFIGURATION_DOCS_URL}`
10198

10299
if (!nuxt.options.dev && !nuxt.options._prepare) {
103100
throw new Error(`[shopify] Invalid module configuration\n${z.prettifyError(moduleOptions.error)}\n${reference}`)
@@ -108,7 +105,7 @@ export default defineNuxtModule<ModuleOptions>({
108105
}
109106
else {
110107
logger.info('Skipping setup: no module configuration provided')
111-
logger.info('See the module configuration reference: https://shopify.nuxtjs.org/essentials/configuration')
108+
logger.info(`See the module configuration reference: ${CONFIGURATION_DOCS_URL}`)
112109
}
113110
},
114111
})

‎src/runtime/plugins/scripts.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { defineNuxtPlugin, useHead, useNuxtApp, useRequestEvent, useRouter, useR
88
import { useStorefront } from '../composables/storefront/client'
99
import { createLogger } from '../utils/log'
1010
import { trackPageViews } from '../utils/analytics/page-view'
11-
import { createNavigation, toScriptsHead, toScriptsOptions } from '../utils/analytics/scripts'
12-
import { createShopResolver } from '../utils/analytics/shop'
11+
import { createNavigation, toScriptsHead, toScriptsOptions } from '../utils/scripts'
12+
import { createShopResolver } from '../utils/shop'
1313

1414
type ConsentMode = NonNullable<ConsentConfig['mode']>
1515

‎src/runtime/plugins/storefront/cache.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import defu from 'defu'
21
import { createStorage } from 'unstorage'
32
import lruCacheDriver from '../../utils/lru-driver'
43

@@ -8,8 +7,6 @@ export default defineNuxtPlugin({
87
name: 'shopify:storefront:cache',
98

109
async setup(nuxtApp) {
11-
if (import.meta.server) return
12-
1310
const { _shopify } = useRuntimeConfig().public
1411

1512
const storefrontCache = _shopify?.clients.storefront?.cache
@@ -27,10 +24,6 @@ export default defineNuxtPlugin({
2724
}),
2825
})
2926

30-
const shopifyContext = nuxtApp.$shopify as { cache?: { storefront?: typeof storage } } ?? {}
31-
32-
shopifyContext.cache = defu({ storefront: storage }, shopifyContext.cache)
33-
34-
if (!nuxtApp.$shopify) nuxtApp.$shopify = shopifyContext
27+
nuxtApp.$shopify = { cache: { storefront: storage } }
3528
},
3629
})

‎src/runtime/server/middleware/routes.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ import { withQuery } from 'ufo'
1313
import { useRuntimeConfig } from '#imports'
1414
import { assertSameSite } from '../utils/csrf'
1515
import { customerAccountContext } from '../utils/customer-account/auth'
16-
import { createCustomerSessionManager, getCustomerSession, requireCustomerAccountConfig } from '../utils/customer-account/session'
16+
import { createCustomerSessionManager, getHydrogenCustomerSession, requireCustomerAccountConfig } from '../utils/customer-account/session'
1717
import { createLogger } from '../utils/log'
1818
import {
1919
applyShopifyResponseHeaders,
20-
createShopifyStorefrontClient,
20+
createHydrogenStorefrontClient,
2121
getShopifyRedirect,
2222
getShopifyRequestContext,
2323
isCartEndpoint,
@@ -80,7 +80,7 @@ function withAuthHooks(event: H3Event, customerSession: CustomerSession, { autho
8080
function handleCustomerAccountRoutes(event: H3Event, config: ShopifyConfig, routes: ShopifyRoutes) {
8181
const { afterLogin, afterLogout } = requireCustomerAccountConfig(config)
8282

83-
const customerSession = getCustomerSession(config)
83+
const customerSession = getHydrogenCustomerSession(config)
8484
const sessionManager = createCustomerSessionManager(event)
8585

8686
const redirects = {
@@ -164,7 +164,7 @@ export default defineEventHandler(async (event) => {
164164
const routes = {
165165
request: toShopifyRequest(event, _shopify.clients.storefront?.publicAccessToken || undefined),
166166
requestContext,
167-
storefrontClient: createShopifyStorefrontClient(requestContext, _shopify),
167+
storefrontClient: createHydrogenStorefrontClient(requestContext, _shopify),
168168
routeTemplates: _shopify.routeTemplates,
169169
}
170170

‎src/runtime/server/utils/csrf.ts‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
import type { H3Event } from 'h3'
22

3-
import { createError, getRequestHeader, getRequestHost, getRequestIP, getRequestURL } from 'h3'
4-
5-
const LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '[::1]', '::1', 'local.tryhydrogen.dev']
6-
7-
const LOOPBACK_ADDRESS = /^(?:127(?:\.\d{1,3}){3}|::1|::ffff:127(?:\.\d{1,3}){3})$/
3+
import { createError, getRequestHeader, getRequestHost } from 'h3'
84

95
function isCrossOrigin(event: H3Event): boolean {
106
const origin = getRequestHeader(event, 'origin')
@@ -34,13 +30,3 @@ export function assertSameSite(event: H3Event) {
3430
message: '[shopify] Cross-origin requests are not allowed',
3531
})
3632
}
37-
38-
export function assertLocalRequest(event: H3Event) {
39-
if (LOCAL_HOSTNAMES.includes(getRequestURL(event).hostname) && LOOPBACK_ADDRESS.test(getRequestIP(event) ?? '')) return
40-
41-
throw createError({
42-
status: 403,
43-
statusText: 'Forbidden',
44-
message: '[shopify] This endpoint is only available on localhost',
45-
})
46-
}

‎src/runtime/server/utils/customer-account/auth.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useNitroApp } from 'nitropack/runtime'
77
import { useRuntimeConfig } from '#imports'
88

99
import { getShopifyRequestContext } from '../routes'
10-
import { createCustomerSessionManager, getCustomerAccountSession, getCustomerSession } from './session'
10+
import { createCustomerSessionManager, getCustomerAccountSession, getHydrogenCustomerSession } from './session'
1111

1212
export async function getValidCustomerAccessToken(event?: H3Event): Promise<string> {
1313
if (!event) {
@@ -16,7 +16,7 @@ export async function getValidCustomerAccessToken(event?: H3Event): Promise<stri
1616

1717
const { _shopify } = useRuntimeConfig(event)
1818

19-
const customerSession = getCustomerSession(_shopify)
19+
const customerSession = getHydrogenCustomerSession(_shopify)
2020
const sessionManager = createCustomerSessionManager(event)
2121
const requestContext = await getShopifyRequestContext(event)
2222

‎src/runtime/server/utils/customer-account/session.ts‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { getRouteRules, useStorage } from 'nitropack/runtime'
1010
import { hash } from 'ohash'
1111
import { useRuntimeConfig } from '#imports'
1212

13-
import { SESSION_DEFAULT_NAME, SESSION_PASSWORD_ENV, SESSION_PASSWORD_MIN_LENGTH, isUsableSessionPassword } from '../../../utils/session'
13+
import { DEFAULT_SESSION_NAME, SESSION_PASSWORD_ENV, SESSION_PASSWORD_MIN_LENGTH, isUsableSessionPassword } from '../../../utils/session'
1414
import { getPublicRequestURL, getShopifyRequestContext } from '../routes'
1515

1616
const HYDROGEN_SESSION_KEY = 'customerAccount'
@@ -40,7 +40,7 @@ export function requireCustomerAccountConfig(config?: ShopifyConfig): NonNullabl
4040
return customerAccount
4141
}
4242

43-
export function getCustomerSession(config?: ShopifyConfig): CustomerSessionWithInternals {
43+
export function getHydrogenCustomerSession(config?: ShopifyConfig): CustomerSessionWithInternals {
4444
const customerAccount = requireCustomerAccountConfig(config)
4545
const shopId = config?.shopId
4646

@@ -83,7 +83,7 @@ export function getSessionConfig(config?: ShopifyConfig): SessionConfig {
8383
}
8484

8585
return {
86-
name: session?.name || SESSION_DEFAULT_NAME,
86+
name: session?.name || DEFAULT_SESSION_NAME,
8787
password,
8888
maxAge: session?.maxAge,
8989
sessionHeader: false,
@@ -98,7 +98,7 @@ export function getSessionConfig(config?: ShopifyConfig): SessionConfig {
9898
function hasSessionCookie(event: H3Event, config: SessionConfig): boolean {
9999
const { cache, isr } = getRouteRules(event)
100100

101-
return !(cache || isr) && !!getCookie(event, config.name || SESSION_DEFAULT_NAME)
101+
return !(cache || isr) && !!getCookie(event, config.name || DEFAULT_SESSION_NAME)
102102
}
103103

104104
async function readSession(event: H3Event, config: SessionConfig) {
@@ -234,7 +234,7 @@ export function createCustomerSessionManager(event: H3Event): WritableCustomerSe
234234
*
235235
* @param event the current request event
236236
*
237-
* @returns whether the customer is signed in
237+
* @returns the session, `{ isLoggedIn }`, which tells whether the customer is signed in
238238
*/
239239
export async function getCustomerAccountSession(event: H3Event): Promise<ShopifyCustomerAccountSession> {
240240
const { _shopify } = useRuntimeConfig(event)
@@ -243,7 +243,7 @@ export async function getCustomerAccountSession(event: H3Event): Promise<Shopify
243243

244244
if (!session || !holdsTokens(session.data)) return { isLoggedIn: false }
245245

246-
return { isLoggedIn: await getCustomerSession(_shopify).isLoggedIn(createCustomerSessionManager(event), await getShopifyRequestContext(event)) }
246+
return { isLoggedIn: await getHydrogenCustomerSession(_shopify).isLoggedIn(createCustomerSessionManager(event), await getShopifyRequestContext(event)) }
247247
}
248248

249249
/**
@@ -262,7 +262,7 @@ export async function requireCustomerAccountSession(event: H3Event): Promise<Sho
262262
throw createError({
263263
status: 401,
264264
statusText: 'Unauthorized',
265-
message: '[shopify] No authenticated customer account session',
265+
message: '[shopify] No customer account session: the customer is not logged in',
266266
})
267267
}
268268

0 commit comments

Comments
 (0)