create-brainerce-store 1.18.0 → 1.20.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 (67) hide show
  1. package/LICENSE +0 -0
  2. package/dist/index.js +31 -9
  3. package/messages/en.json +366 -362
  4. package/messages/he.json +366 -362
  5. package/package.json +8 -8
  6. package/templates/nextjs/base/next.config.ts +31 -31
  7. package/templates/nextjs/base/scripts/fetch-store-info.mjs +81 -81
  8. package/templates/nextjs/base/src/app/.well-known/apple-developer-merchantid-domain-association/route.ts +26 -26
  9. package/templates/nextjs/base/src/app/account/layout.tsx +9 -9
  10. package/templates/nextjs/base/src/app/account/page.tsx +122 -122
  11. package/templates/nextjs/base/src/app/api/auth/logout/route.ts +14 -14
  12. package/templates/nextjs/base/src/app/api/auth/me/route.ts +56 -56
  13. package/templates/nextjs/base/src/app/api/auth/oauth-callback/route.ts +59 -59
  14. package/templates/nextjs/base/src/app/api/auth/reset-callback/route.ts +41 -41
  15. package/templates/nextjs/base/src/app/api/auth/reset-password/route.ts +77 -77
  16. package/templates/nextjs/base/src/app/api/store/[...path]/route.ts +198 -198
  17. package/templates/nextjs/base/src/app/auth/callback/page.tsx +92 -92
  18. package/templates/nextjs/base/src/app/cart/layout.tsx +9 -9
  19. package/templates/nextjs/base/src/app/cart/page.tsx +204 -204
  20. package/templates/nextjs/base/src/app/checkout/layout.tsx +9 -9
  21. package/templates/nextjs/base/src/app/checkout/page.tsx +860 -860
  22. package/templates/nextjs/base/src/app/forgot-password/page.tsx +112 -112
  23. package/templates/nextjs/base/src/app/layout.tsx.ejs +75 -0
  24. package/templates/nextjs/base/src/app/login/layout.tsx +9 -9
  25. package/templates/nextjs/base/src/app/login/page.tsx +59 -59
  26. package/templates/nextjs/base/src/app/order-confirmation/layout.tsx +9 -9
  27. package/templates/nextjs/base/src/app/order-confirmation/page.tsx +17 -0
  28. package/templates/nextjs/base/src/app/payment-complete/page.tsx +59 -0
  29. package/templates/nextjs/base/src/app/products/[slug]/page.tsx +67 -67
  30. package/templates/nextjs/base/src/app/products/[slug]/product-client-section.tsx +486 -486
  31. package/templates/nextjs/base/src/app/products/layout.tsx +18 -18
  32. package/templates/nextjs/base/src/app/products/page.tsx +431 -431
  33. package/templates/nextjs/base/src/app/register/layout.tsx +9 -9
  34. package/templates/nextjs/base/src/app/register/page.tsx +65 -65
  35. package/templates/nextjs/base/src/app/reset-password/page.tsx +132 -132
  36. package/templates/nextjs/base/src/app/robots.ts +14 -14
  37. package/templates/nextjs/base/src/app/sitemap.ts +25 -25
  38. package/templates/nextjs/base/src/app/verify-email/page.tsx +258 -258
  39. package/templates/nextjs/base/src/components/account/address-book.tsx +432 -432
  40. package/templates/nextjs/base/src/components/account/order-history.tsx +350 -350
  41. package/templates/nextjs/base/src/components/auth/oauth-buttons.tsx +137 -137
  42. package/templates/nextjs/base/src/components/auth/register-form.tsx +232 -232
  43. package/templates/nextjs/base/src/components/cart/cart-bundle-offer.tsx +247 -111
  44. package/templates/nextjs/base/src/components/cart/cart-item.tsx +153 -153
  45. package/templates/nextjs/base/src/components/cart/cart-upgrade-banner.tsx +142 -142
  46. package/templates/nextjs/base/src/components/cart/free-shipping-bar.tsx +59 -59
  47. package/templates/nextjs/base/src/components/checkout/checkout-form.tsx +415 -415
  48. package/templates/nextjs/base/src/components/checkout/order-bump-card.tsx +243 -83
  49. package/templates/nextjs/base/src/components/checkout/payment-step.tsx +49 -3
  50. package/templates/nextjs/base/src/components/layout/footer.tsx +41 -41
  51. package/templates/nextjs/base/src/components/layout/header.tsx +336 -336
  52. package/templates/nextjs/base/src/components/layout/language-switcher.tsx.ejs +63 -0
  53. package/templates/nextjs/base/src/components/products/discount-badge.tsx +22 -22
  54. package/templates/nextjs/base/src/components/products/frequently-bought-together.tsx +202 -202
  55. package/templates/nextjs/base/src/components/products/product-card.tsx +218 -218
  56. package/templates/nextjs/base/src/components/products/recommendation-section.tsx +107 -107
  57. package/templates/nextjs/base/src/components/products/stock-badge.tsx +63 -63
  58. package/templates/nextjs/base/src/components/products/variant-selector.tsx +292 -292
  59. package/templates/nextjs/base/src/components/seo/product-json-ld.tsx +72 -72
  60. package/templates/nextjs/base/src/i18n.ts.ejs +21 -0
  61. package/templates/nextjs/base/src/lib/auth.ts +149 -149
  62. package/templates/nextjs/base/src/lib/brainerce.ts.ejs +9 -0
  63. package/templates/nextjs/base/src/lib/translations.ts.ejs +31 -0
  64. package/templates/nextjs/base/src/middleware.ts.ejs +81 -0
  65. package/templates/nextjs/base/src/providers/store-provider.tsx.ejs +41 -0
  66. package/templates/nextjs/base/src/lib/translations.ts +0 -11
  67. package/templates/nextjs/base/src/middleware.ts +0 -25
package/LICENSE ADDED
File without changes
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.18.0",
34
+ version: "1.20.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) {