@shopify/cli-hydrogen 8.3.0 → 8.4.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/assets/hydrogen/i18n/domains.ts +4 -11
- package/dist/assets/hydrogen/i18n/mock-i18n-types.ts +4 -2
- package/dist/assets/hydrogen/i18n/subdomains.ts +4 -11
- package/dist/assets/hydrogen/i18n/subfolders.ts +4 -11
- package/dist/assets/hydrogen/starter/CHANGELOG.md +165 -0
- package/dist/assets/hydrogen/starter/app/components/CartLineItem.tsx +5 -2
- package/dist/assets/hydrogen/starter/app/components/CartMain.tsx +2 -2
- package/dist/assets/hydrogen/starter/app/components/PageLayout.tsx +65 -19
- package/dist/assets/hydrogen/starter/app/components/PaginatedResourceSection.tsx +42 -0
- package/dist/assets/hydrogen/starter/app/components/SearchForm.tsx +68 -0
- package/dist/assets/hydrogen/starter/app/components/SearchFormPredictive.tsx +76 -0
- package/dist/assets/hydrogen/starter/app/components/SearchResults.tsx +164 -0
- package/dist/assets/hydrogen/starter/app/components/SearchResultsPredictive.tsx +322 -0
- package/dist/assets/hydrogen/starter/app/entry.client.tsx +10 -8
- package/dist/assets/hydrogen/starter/app/entry.server.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/lib/context.ts +43 -0
- package/dist/assets/hydrogen/starter/app/lib/fragments.ts +53 -0
- package/dist/assets/hydrogen/starter/app/lib/search.ts +74 -24
- package/dist/assets/hydrogen/starter/app/root.tsx +4 -7
- package/dist/assets/hydrogen/starter/app/routes/account.addresses.tsx +2 -3
- package/dist/assets/hydrogen/starter/app/routes/account.orders._index.tsx +5 -19
- package/dist/assets/hydrogen/starter/app/routes/blogs.$blogHandle._index.tsx +11 -24
- package/dist/assets/hydrogen/starter/app/routes/blogs._index.tsx +14 -27
- package/dist/assets/hydrogen/starter/app/routes/collections.$handle.tsx +12 -30
- package/dist/assets/hydrogen/starter/app/routes/collections._index.tsx +13 -27
- package/dist/assets/hydrogen/starter/app/routes/collections.all.tsx +9 -31
- package/dist/assets/hydrogen/starter/app/routes/search.tsx +312 -73
- package/dist/assets/hydrogen/starter/app/styles/reset.css +12 -2
- package/dist/assets/hydrogen/starter/env.d.ts +11 -30
- package/dist/assets/hydrogen/starter/guides/predictiveSearch/predictiveSearch.jpg +0 -0
- package/dist/assets/hydrogen/starter/guides/predictiveSearch/predictiveSearch.md +391 -0
- package/dist/assets/hydrogen/starter/guides/search/search.jpg +0 -0
- package/dist/assets/hydrogen/starter/guides/search/search.md +333 -0
- package/dist/assets/hydrogen/starter/package.json +4 -4
- package/dist/assets/hydrogen/starter/server.ts +18 -74
- package/dist/assets/hydrogen/starter/storefrontapi.generated.d.ts +242 -172
- package/dist/assets/hydrogen/virtual-routes/components/{PageLayout.jsx → Layout.jsx} +2 -2
- package/dist/assets/hydrogen/virtual-routes/virtual-root.jsx +7 -6
- package/dist/commands/hydrogen/build.js +4 -2
- package/dist/commands/hydrogen/codegen.js +11 -3
- package/dist/commands/hydrogen/debug/cpu.js +2 -3
- package/dist/commands/hydrogen/deploy.js +8 -6
- package/dist/commands/hydrogen/dev.js +13 -11
- package/dist/commands/hydrogen/env/pull.js +5 -3
- package/dist/commands/hydrogen/env/push.js +2 -5
- package/dist/commands/hydrogen/preview.js +11 -7
- package/dist/commands/hydrogen/setup.js +2 -4
- package/dist/index.d.ts +5 -1
- package/dist/lib/classic-compiler/dev.js +8 -4
- package/dist/lib/codegen.js +1 -0
- package/dist/lib/dev-shared.js +17 -15
- package/dist/lib/environment-variables.js +5 -4
- package/dist/lib/flags.js +7 -0
- package/dist/lib/log.js +1 -7
- package/dist/lib/onboarding/local.js +22 -7
- package/dist/lib/remix-config.js +8 -3
- package/dist/lib/setups/css/replacers.js +2 -2
- package/dist/lib/setups/i18n/index.js +3 -6
- package/dist/lib/setups/i18n/replacers.js +62 -134
- package/dist/lib/template-diff.js +15 -0
- package/dist/lib/transpile/morph/functions.js +3 -2
- package/dist/lib/transpile/morph/typedefs.js +4 -1
- package/dist/lib/vite-config.js +13 -1
- package/oclif.manifest.json +39 -2
- package/package.json +3 -3
- package/dist/assets/hydrogen/starter/app/components/Search.tsx +0 -514
- package/dist/assets/hydrogen/starter/app/routes/api.predictive-search.tsx +0 -318
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
import {json, type LoaderFunctionArgs} from '@shopify/remix-oxygen';
|
|
2
|
-
import type {
|
|
3
|
-
NormalizedPredictiveSearch,
|
|
4
|
-
NormalizedPredictiveSearchResults,
|
|
5
|
-
} from '~/components/Search';
|
|
6
|
-
import {NO_PREDICTIVE_SEARCH_RESULTS} from '~/components/Search';
|
|
7
|
-
import {applyTrackingParams} from '~/lib/search';
|
|
8
|
-
|
|
9
|
-
import type {
|
|
10
|
-
PredictiveArticleFragment,
|
|
11
|
-
PredictiveCollectionFragment,
|
|
12
|
-
PredictivePageFragment,
|
|
13
|
-
PredictiveProductFragment,
|
|
14
|
-
PredictiveQueryFragment,
|
|
15
|
-
PredictiveSearchQuery,
|
|
16
|
-
} from 'storefrontapi.generated';
|
|
17
|
-
|
|
18
|
-
type PredictiveSearchTypes =
|
|
19
|
-
| 'ARTICLE'
|
|
20
|
-
| 'COLLECTION'
|
|
21
|
-
| 'PAGE'
|
|
22
|
-
| 'PRODUCT'
|
|
23
|
-
| 'QUERY';
|
|
24
|
-
|
|
25
|
-
const DEFAULT_SEARCH_TYPES: PredictiveSearchTypes[] = [
|
|
26
|
-
'ARTICLE',
|
|
27
|
-
'COLLECTION',
|
|
28
|
-
'PAGE',
|
|
29
|
-
'PRODUCT',
|
|
30
|
-
'QUERY',
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
export type PredictiveSearchAPILoader = typeof loader;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Fetches the search results from the predictive search API
|
|
37
|
-
* requested by the SearchForm component
|
|
38
|
-
*/
|
|
39
|
-
export async function loader({request, params, context}: LoaderFunctionArgs) {
|
|
40
|
-
const search = await fetchPredictiveSearchResults({
|
|
41
|
-
params,
|
|
42
|
-
request,
|
|
43
|
-
context,
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
return json(search, {
|
|
47
|
-
headers: {'Cache-Control': `max-age=${search.searchTerm ? 60 : 3600}`},
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function fetchPredictiveSearchResults({
|
|
52
|
-
params,
|
|
53
|
-
request,
|
|
54
|
-
context,
|
|
55
|
-
}: Pick<LoaderFunctionArgs, 'params' | 'context' | 'request'>) {
|
|
56
|
-
const url = new URL(request.url);
|
|
57
|
-
const searchParams = new URLSearchParams(url.search);
|
|
58
|
-
const searchTerm = searchParams.get('q') || '';
|
|
59
|
-
const limit = Number(searchParams.get('limit') || 10);
|
|
60
|
-
const rawTypes = String(searchParams.get('type') || 'ANY');
|
|
61
|
-
|
|
62
|
-
const searchTypes =
|
|
63
|
-
rawTypes === 'ANY'
|
|
64
|
-
? DEFAULT_SEARCH_TYPES
|
|
65
|
-
: rawTypes
|
|
66
|
-
.split(',')
|
|
67
|
-
.map((t) => t.toUpperCase() as PredictiveSearchTypes)
|
|
68
|
-
.filter((t) => DEFAULT_SEARCH_TYPES.includes(t));
|
|
69
|
-
|
|
70
|
-
if (!searchTerm) {
|
|
71
|
-
return {
|
|
72
|
-
searchResults: {results: null, totalResults: 0},
|
|
73
|
-
searchTerm,
|
|
74
|
-
searchTypes,
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const data = await context.storefront.query(PREDICTIVE_SEARCH_QUERY, {
|
|
79
|
-
variables: {
|
|
80
|
-
limit,
|
|
81
|
-
limitScope: 'EACH',
|
|
82
|
-
searchTerm,
|
|
83
|
-
types: searchTypes,
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
if (!data) {
|
|
88
|
-
throw new Error('No data returned from Shopify API');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const searchResults = normalizePredictiveSearchResults(
|
|
92
|
-
data.predictiveSearch,
|
|
93
|
-
params.locale,
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
return {searchResults, searchTerm, searchTypes};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Normalize results and apply tracking qurery parameters to each result url
|
|
101
|
-
*/
|
|
102
|
-
export function normalizePredictiveSearchResults(
|
|
103
|
-
predictiveSearch: PredictiveSearchQuery['predictiveSearch'],
|
|
104
|
-
locale: LoaderFunctionArgs['params']['locale'],
|
|
105
|
-
): NormalizedPredictiveSearch {
|
|
106
|
-
let totalResults = 0;
|
|
107
|
-
if (!predictiveSearch) {
|
|
108
|
-
return {
|
|
109
|
-
results: NO_PREDICTIVE_SEARCH_RESULTS,
|
|
110
|
-
totalResults,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const localePrefix = locale ? `/${locale}` : '';
|
|
115
|
-
const results: NormalizedPredictiveSearchResults = [];
|
|
116
|
-
|
|
117
|
-
if (predictiveSearch.queries.length) {
|
|
118
|
-
results.push({
|
|
119
|
-
type: 'queries',
|
|
120
|
-
items: predictiveSearch.queries.map((query: PredictiveQueryFragment) => {
|
|
121
|
-
const trackingParams = applyTrackingParams(
|
|
122
|
-
query,
|
|
123
|
-
`q=${encodeURIComponent(query.text)}`,
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
totalResults++;
|
|
127
|
-
return {
|
|
128
|
-
__typename: query.__typename,
|
|
129
|
-
handle: '',
|
|
130
|
-
id: query.text,
|
|
131
|
-
image: undefined,
|
|
132
|
-
title: query.text,
|
|
133
|
-
styledTitle: query.styledText,
|
|
134
|
-
url: `${localePrefix}/search${trackingParams}`,
|
|
135
|
-
};
|
|
136
|
-
}),
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (predictiveSearch.products.length) {
|
|
141
|
-
results.push({
|
|
142
|
-
type: 'products',
|
|
143
|
-
items: predictiveSearch.products.map(
|
|
144
|
-
(product: PredictiveProductFragment) => {
|
|
145
|
-
totalResults++;
|
|
146
|
-
const trackingParams = applyTrackingParams(product);
|
|
147
|
-
return {
|
|
148
|
-
__typename: product.__typename,
|
|
149
|
-
handle: product.handle,
|
|
150
|
-
id: product.id,
|
|
151
|
-
image: product.variants?.nodes?.[0]?.image,
|
|
152
|
-
title: product.title,
|
|
153
|
-
url: `${localePrefix}/products/${product.handle}${trackingParams}`,
|
|
154
|
-
price: product.variants.nodes[0].price,
|
|
155
|
-
};
|
|
156
|
-
},
|
|
157
|
-
),
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (predictiveSearch.collections.length) {
|
|
162
|
-
results.push({
|
|
163
|
-
type: 'collections',
|
|
164
|
-
items: predictiveSearch.collections.map(
|
|
165
|
-
(collection: PredictiveCollectionFragment) => {
|
|
166
|
-
totalResults++;
|
|
167
|
-
const trackingParams = applyTrackingParams(collection);
|
|
168
|
-
return {
|
|
169
|
-
__typename: collection.__typename,
|
|
170
|
-
handle: collection.handle,
|
|
171
|
-
id: collection.id,
|
|
172
|
-
image: collection.image,
|
|
173
|
-
title: collection.title,
|
|
174
|
-
url: `${localePrefix}/collections/${collection.handle}${trackingParams}`,
|
|
175
|
-
};
|
|
176
|
-
},
|
|
177
|
-
),
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
if (predictiveSearch.pages.length) {
|
|
182
|
-
results.push({
|
|
183
|
-
type: 'pages',
|
|
184
|
-
items: predictiveSearch.pages.map((page: PredictivePageFragment) => {
|
|
185
|
-
totalResults++;
|
|
186
|
-
const trackingParams = applyTrackingParams(page);
|
|
187
|
-
return {
|
|
188
|
-
__typename: page.__typename,
|
|
189
|
-
handle: page.handle,
|
|
190
|
-
id: page.id,
|
|
191
|
-
image: undefined,
|
|
192
|
-
title: page.title,
|
|
193
|
-
url: `${localePrefix}/pages/${page.handle}${trackingParams}`,
|
|
194
|
-
};
|
|
195
|
-
}),
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
if (predictiveSearch.articles.length) {
|
|
200
|
-
results.push({
|
|
201
|
-
type: 'articles',
|
|
202
|
-
items: predictiveSearch.articles.map(
|
|
203
|
-
(article: PredictiveArticleFragment) => {
|
|
204
|
-
totalResults++;
|
|
205
|
-
const trackingParams = applyTrackingParams(article);
|
|
206
|
-
return {
|
|
207
|
-
__typename: article.__typename,
|
|
208
|
-
handle: article.handle,
|
|
209
|
-
id: article.id,
|
|
210
|
-
image: article.image,
|
|
211
|
-
title: article.title,
|
|
212
|
-
url: `${localePrefix}/blogs/${article.blog.handle}/${article.handle}/${trackingParams}`,
|
|
213
|
-
};
|
|
214
|
-
},
|
|
215
|
-
),
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
return {results, totalResults};
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
const PREDICTIVE_SEARCH_QUERY = `#graphql
|
|
223
|
-
fragment PredictiveArticle on Article {
|
|
224
|
-
__typename
|
|
225
|
-
id
|
|
226
|
-
title
|
|
227
|
-
handle
|
|
228
|
-
blog {
|
|
229
|
-
handle
|
|
230
|
-
}
|
|
231
|
-
image {
|
|
232
|
-
url
|
|
233
|
-
altText
|
|
234
|
-
width
|
|
235
|
-
height
|
|
236
|
-
}
|
|
237
|
-
trackingParameters
|
|
238
|
-
}
|
|
239
|
-
fragment PredictiveCollection on Collection {
|
|
240
|
-
__typename
|
|
241
|
-
id
|
|
242
|
-
title
|
|
243
|
-
handle
|
|
244
|
-
image {
|
|
245
|
-
url
|
|
246
|
-
altText
|
|
247
|
-
width
|
|
248
|
-
height
|
|
249
|
-
}
|
|
250
|
-
trackingParameters
|
|
251
|
-
}
|
|
252
|
-
fragment PredictivePage on Page {
|
|
253
|
-
__typename
|
|
254
|
-
id
|
|
255
|
-
title
|
|
256
|
-
handle
|
|
257
|
-
trackingParameters
|
|
258
|
-
}
|
|
259
|
-
fragment PredictiveProduct on Product {
|
|
260
|
-
__typename
|
|
261
|
-
id
|
|
262
|
-
title
|
|
263
|
-
handle
|
|
264
|
-
trackingParameters
|
|
265
|
-
variants(first: 1) {
|
|
266
|
-
nodes {
|
|
267
|
-
id
|
|
268
|
-
image {
|
|
269
|
-
url
|
|
270
|
-
altText
|
|
271
|
-
width
|
|
272
|
-
height
|
|
273
|
-
}
|
|
274
|
-
price {
|
|
275
|
-
amount
|
|
276
|
-
currencyCode
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
fragment PredictiveQuery on SearchQuerySuggestion {
|
|
282
|
-
__typename
|
|
283
|
-
text
|
|
284
|
-
styledText
|
|
285
|
-
trackingParameters
|
|
286
|
-
}
|
|
287
|
-
query predictiveSearch(
|
|
288
|
-
$country: CountryCode
|
|
289
|
-
$language: LanguageCode
|
|
290
|
-
$limit: Int!
|
|
291
|
-
$limitScope: PredictiveSearchLimitScope!
|
|
292
|
-
$searchTerm: String!
|
|
293
|
-
$types: [PredictiveSearchType!]
|
|
294
|
-
) @inContext(country: $country, language: $language) {
|
|
295
|
-
predictiveSearch(
|
|
296
|
-
limit: $limit,
|
|
297
|
-
limitScope: $limitScope,
|
|
298
|
-
query: $searchTerm,
|
|
299
|
-
types: $types,
|
|
300
|
-
) {
|
|
301
|
-
articles {
|
|
302
|
-
...PredictiveArticle
|
|
303
|
-
}
|
|
304
|
-
collections {
|
|
305
|
-
...PredictiveCollection
|
|
306
|
-
}
|
|
307
|
-
pages {
|
|
308
|
-
...PredictivePage
|
|
309
|
-
}
|
|
310
|
-
products {
|
|
311
|
-
...PredictiveProduct
|
|
312
|
-
}
|
|
313
|
-
queries {
|
|
314
|
-
...PredictiveQuery
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
` as const;
|