create-brainerce-store 1.17.0 → 1.19.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 (65) hide show
  1. package/dist/index.js +31 -9
  2. package/messages/en.json +366 -359
  3. package/messages/he.json +366 -359
  4. package/package.json +45 -45
  5. package/templates/nextjs/base/next.config.ts +31 -31
  6. package/templates/nextjs/base/scripts/fetch-store-info.mjs +81 -81
  7. package/templates/nextjs/base/src/app/.well-known/apple-developer-merchantid-domain-association/route.ts +26 -26
  8. package/templates/nextjs/base/src/app/account/layout.tsx +9 -9
  9. package/templates/nextjs/base/src/app/account/page.tsx +122 -122
  10. package/templates/nextjs/base/src/app/api/auth/logout/route.ts +14 -14
  11. package/templates/nextjs/base/src/app/api/auth/me/route.ts +56 -56
  12. package/templates/nextjs/base/src/app/api/auth/oauth-callback/route.ts +59 -59
  13. package/templates/nextjs/base/src/app/api/auth/reset-callback/route.ts +41 -41
  14. package/templates/nextjs/base/src/app/api/auth/reset-password/route.ts +77 -77
  15. package/templates/nextjs/base/src/app/api/store/[...path]/route.ts +198 -198
  16. package/templates/nextjs/base/src/app/auth/callback/page.tsx +92 -92
  17. package/templates/nextjs/base/src/app/cart/layout.tsx +9 -9
  18. package/templates/nextjs/base/src/app/cart/page.tsx +204 -199
  19. package/templates/nextjs/base/src/app/checkout/layout.tsx +9 -9
  20. package/templates/nextjs/base/src/app/checkout/page.tsx +860 -860
  21. package/templates/nextjs/base/src/app/forgot-password/page.tsx +112 -112
  22. package/templates/nextjs/base/src/app/layout.tsx.ejs +75 -0
  23. package/templates/nextjs/base/src/app/login/layout.tsx +9 -9
  24. package/templates/nextjs/base/src/app/login/page.tsx +59 -59
  25. package/templates/nextjs/base/src/app/order-confirmation/layout.tsx +9 -9
  26. package/templates/nextjs/base/src/app/order-confirmation/page.tsx +254 -254
  27. package/templates/nextjs/base/src/app/products/[slug]/page.tsx +67 -67
  28. package/templates/nextjs/base/src/app/products/[slug]/product-client-section.tsx +486 -486
  29. package/templates/nextjs/base/src/app/products/layout.tsx +18 -18
  30. package/templates/nextjs/base/src/app/products/page.tsx +431 -431
  31. package/templates/nextjs/base/src/app/register/layout.tsx +9 -9
  32. package/templates/nextjs/base/src/app/register/page.tsx +65 -65
  33. package/templates/nextjs/base/src/app/reset-password/page.tsx +132 -132
  34. package/templates/nextjs/base/src/app/robots.ts +14 -14
  35. package/templates/nextjs/base/src/app/sitemap.ts +25 -25
  36. package/templates/nextjs/base/src/app/verify-email/page.tsx +258 -258
  37. package/templates/nextjs/base/src/components/account/address-book.tsx +432 -432
  38. package/templates/nextjs/base/src/components/account/order-history.tsx +350 -350
  39. package/templates/nextjs/base/src/components/auth/oauth-buttons.tsx +137 -137
  40. package/templates/nextjs/base/src/components/auth/register-form.tsx +232 -232
  41. package/templates/nextjs/base/src/components/cart/cart-bundle-offer.tsx +247 -111
  42. package/templates/nextjs/base/src/components/cart/cart-item.tsx +153 -153
  43. package/templates/nextjs/base/src/components/cart/cart-upgrade-banner.tsx +142 -142
  44. package/templates/nextjs/base/src/components/cart/free-shipping-bar.tsx +59 -59
  45. package/templates/nextjs/base/src/components/checkout/checkout-form.tsx +415 -415
  46. package/templates/nextjs/base/src/components/checkout/order-bump-card.tsx +243 -83
  47. package/templates/nextjs/base/src/components/checkout/payment-step.tsx +519 -473
  48. package/templates/nextjs/base/src/components/layout/footer.tsx +41 -41
  49. package/templates/nextjs/base/src/components/layout/header.tsx +336 -336
  50. package/templates/nextjs/base/src/components/layout/language-switcher.tsx.ejs +63 -0
  51. package/templates/nextjs/base/src/components/products/discount-badge.tsx +22 -22
  52. package/templates/nextjs/base/src/components/products/frequently-bought-together.tsx +202 -202
  53. package/templates/nextjs/base/src/components/products/product-card.tsx +218 -218
  54. package/templates/nextjs/base/src/components/products/recommendation-section.tsx +107 -107
  55. package/templates/nextjs/base/src/components/products/stock-badge.tsx +63 -63
  56. package/templates/nextjs/base/src/components/products/variant-selector.tsx +292 -292
  57. package/templates/nextjs/base/src/components/seo/product-json-ld.tsx +72 -72
  58. package/templates/nextjs/base/src/i18n.ts.ejs +21 -0
  59. package/templates/nextjs/base/src/lib/auth.ts +149 -149
  60. package/templates/nextjs/base/src/lib/brainerce.ts.ejs +9 -0
  61. package/templates/nextjs/base/src/lib/translations.ts.ejs +31 -0
  62. package/templates/nextjs/base/src/middleware.ts.ejs +81 -0
  63. package/templates/nextjs/base/src/providers/store-provider.tsx.ejs +41 -0
  64. package/templates/nextjs/base/src/lib/translations.ts +0 -11
  65. package/templates/nextjs/base/src/middleware.ts +0 -25
package/dist/index.js CHANGED
@@ -31,7 +31,7 @@ var require_package = __commonJS({
31
31
  "package.json"(exports2, module2) {
32
32
  module2.exports = {
33
33
  name: "create-brainerce-store",
34
- version: "1.16.0",
34
+ version: "1.19.0",
35
35
  description: "Scaffold a production-ready e-commerce storefront connected to Brainerce",
36
36
  bin: {
37
37
  "create-brainerce-store": "dist/index.js"
@@ -289,6 +289,9 @@ async function scaffold(options) {
289
289
  const direction = getDirection(options.language);
290
290
  const fontConfig = getFontConfig(options.language);
291
291
  const ogLocale = options.language === "he" ? "he_IL" : "en_US";
292
+ const isMultiLocale = options.i18n?.enabled === true && options.i18n.supportedLocales.length > 1;
293
+ const supportedLocales = options.i18n?.supportedLocales || [options.language];
294
+ const defaultLocale = options.i18n?.defaultLocale || options.language;
292
295
  const templateVars = {
293
296
  projectName: options.projectName,
294
297
  connectionId: options.connectionId,
@@ -299,16 +302,32 @@ async function scaffold(options) {
299
302
  fontImport: fontConfig.fontImport,
300
303
  fontVariable: fontConfig.fontVariable,
301
304
  ogLocale,
302
- apiBaseUrl: "https://api.brainerce.com"
305
+ apiBaseUrl: "https://api.brainerce.com",
306
+ i18nEnabled: isMultiLocale,
307
+ supportedLocales: JSON.stringify(supportedLocales),
308
+ defaultLocale
303
309
  };
304
310
  await copyWithEjs(baseDir, targetDir, templateVars);
305
311
  const messagesRoot = findMessagesDir(__dirname);
306
312
  const targetMessages = import_path.default.join(targetDir, "messages");
307
313
  await import_fs_extra.default.ensureDir(targetMessages);
308
- await import_fs_extra.default.copy(
309
- import_path.default.join(messagesRoot, `${options.language}.json`),
310
- import_path.default.join(targetMessages, `${options.language}.json`)
311
- );
314
+ if (isMultiLocale) {
315
+ for (const locale of supportedLocales) {
316
+ const srcFile = import_path.default.join(messagesRoot, `${locale}.json`);
317
+ if (await import_fs_extra.default.pathExists(srcFile)) {
318
+ await import_fs_extra.default.copy(srcFile, import_path.default.join(targetMessages, `${locale}.json`));
319
+ }
320
+ }
321
+ const defaultFile = import_path.default.join(targetMessages, `${defaultLocale}.json`);
322
+ if (!await import_fs_extra.default.pathExists(defaultFile)) {
323
+ await import_fs_extra.default.copy(import_path.default.join(messagesRoot, `${options.language}.json`), defaultFile);
324
+ }
325
+ } else {
326
+ await import_fs_extra.default.copy(
327
+ import_path.default.join(messagesRoot, `${options.language}.json`),
328
+ import_path.default.join(targetMessages, `${options.language}.json`)
329
+ );
330
+ }
312
331
  if (await import_fs_extra.default.pathExists(themeDir)) {
313
332
  const themeCss = import_path.default.join(themeDir, "globals.css");
314
333
  if (await import_fs_extra.default.pathExists(themeCss)) {
@@ -392,7 +411,8 @@ async function fetchStoreInfo(connectionId, baseUrl = "https://api.brainerce.com
392
411
  resolve({
393
412
  name: json.name || json.storeName || "My Store",
394
413
  currency: json.currency || "USD",
395
- language: json.language || "en"
414
+ language: json.language || "en",
415
+ ...json.i18n ? { i18n: json.i18n } : {}
396
416
  });
397
417
  } catch {
398
418
  reject(new Error("Invalid response from API"));
@@ -530,8 +550,9 @@ program.name("create-brainerce-store").description("Scaffold a production-ready
530
550
  let storeInfo;
531
551
  try {
532
552
  storeInfo = await fetchStoreInfo(connectionId);
553
+ const i18nStatus = storeInfo.i18n?.enabled && storeInfo.i18n.supportedLocales.length > 1 ? ` | i18n: ${storeInfo.i18n.supportedLocales.join(", ")}` : "";
533
554
  spinner.succeed(
534
- `Store: "${storeInfo.name}" | ${storeInfo.currency} | ${storeInfo.language}`
555
+ `Store: "${storeInfo.name}" | ${storeInfo.currency} | ${storeInfo.language}${i18nStatus}`
535
556
  );
536
557
  } catch (err) {
537
558
  spinner.fail("Could not fetch store info");
@@ -552,7 +573,8 @@ program.name("create-brainerce-store").description("Scaffold a production-ready
552
573
  theme,
553
574
  storeName: storeInfo.name,
554
575
  currency: storeInfo.currency,
555
- language: language || storeInfo.language
576
+ language: language || storeInfo.language,
577
+ i18n: storeInfo.i18n
556
578
  });
557
579
  scaffoldSpinner.succeed(`Scaffolded into ./${projectName}`);
558
580
  if (!skipGit) {