@akinon/projectzero 2.0.0-beta.8 → 2.0.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 (290) hide show
  1. package/CHANGELOG.md +187 -15
  2. package/app-template/.env.example +3 -0
  3. package/app-template/.github/instructions/account.instructions.md +749 -0
  4. package/app-template/.github/instructions/checkout.instructions.md +678 -0
  5. package/app-template/.github/instructions/default.instructions.md +279 -0
  6. package/app-template/.github/instructions/edge-cases.instructions.md +73 -0
  7. package/app-template/.github/instructions/routing.instructions.md +603 -0
  8. package/app-template/.github/instructions/settings.instructions.md +338 -0
  9. package/app-template/.gitignore +3 -0
  10. package/app-template/AGENTS.md +7 -0
  11. package/app-template/CHANGELOG.md +2013 -186
  12. package/app-template/Procfile +1 -1
  13. package/app-template/akinon.json +1 -4
  14. package/app-template/build.sh +10 -0
  15. package/app-template/docs/advanced-usage.md +111 -0
  16. package/app-template/docs/plugins.md +60 -25
  17. package/app-template/docs/sentry-usage.md +35 -0
  18. package/app-template/jest.config.ts +2 -2
  19. package/app-template/next-env.d.ts +1 -0
  20. package/app-template/{next.config.ts → next.config.mjs} +6 -7
  21. package/app-template/package.json +58 -50
  22. package/app-template/postcss.config.mjs +1 -4
  23. package/app-template/public/amex.svg +12 -0
  24. package/app-template/public/apple-pay.svg +16 -0
  25. package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
  26. package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
  27. package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
  28. package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
  29. package/app-template/public/google-pay.svg +16 -0
  30. package/app-template/public/locales/en/account.json +9 -4
  31. package/app-template/public/locales/en/auth.json +6 -7
  32. package/app-template/public/locales/en/basket.json +6 -6
  33. package/app-template/public/locales/en/blog.json +7 -0
  34. package/app-template/public/locales/en/category.json +3 -1
  35. package/app-template/public/locales/en/checkout.json +17 -4
  36. package/app-template/public/locales/en/common.json +61 -3
  37. package/app-template/public/locales/en/forgot_password.json +6 -7
  38. package/app-template/public/locales/en/product.json +84 -4
  39. package/app-template/public/locales/tr/account.json +9 -4
  40. package/app-template/public/locales/tr/auth.json +16 -17
  41. package/app-template/public/locales/tr/basket.json +4 -4
  42. package/app-template/public/locales/tr/blog.json +7 -0
  43. package/app-template/public/locales/tr/category.json +3 -1
  44. package/app-template/public/locales/tr/checkout.json +48 -36
  45. package/app-template/public/locales/tr/common.json +60 -2
  46. package/app-template/public/locales/tr/forgot_password.json +12 -13
  47. package/app-template/public/locales/tr/product.json +82 -0
  48. package/app-template/public/logo.svg +3 -27
  49. package/app-template/public/mastercard.svg +14 -0
  50. package/app-template/public/masterpass-javascript-sdk-web.min.js +1 -0
  51. package/app-template/public/promotion-banner.jpg +0 -0
  52. package/app-template/public/shop-pay.svg +12 -0
  53. package/app-template/public/visa.svg +12 -0
  54. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/[...prettyurl]/page.tsx +11 -11
  55. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/layout.tsx +4 -3
  56. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/cancellation/page.tsx +13 -10
  57. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/page.tsx +73 -51
  58. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/page.tsx +1 -1
  59. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/profile/page.tsx +2 -2
  60. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/address/stores/page.tsx +2 -2
  61. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/page.tsx +1 -1
  62. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket/page.tsx +2 -2
  63. package/app-template/src/app/[pz]/blog/[slug]/page.tsx +120 -0
  64. package/app-template/src/app/[pz]/category/[pk]/page.tsx +37 -0
  65. package/app-template/src/app/[pz]/flat-page/[pk]/page.tsx +23 -0
  66. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/forms/[pk]/generate/page.tsx +2 -3
  67. package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +93 -0
  68. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/page.tsx +2 -4
  69. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/layout.tsx +6 -11
  70. package/app-template/src/app/[pz]/list/page.tsx +26 -0
  71. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/not-found.tsx +5 -7
  72. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/page.tsx +6 -4
  73. package/app-template/src/app/[pz]/page.tsx +28 -0
  74. package/app-template/src/app/[pz]/pages/[slug]/page.tsx +19 -0
  75. package/app-template/src/app/[pz]/product/[pk]/page.tsx +102 -0
  76. package/app-template/src/app/[pz]/special-page/[pk]/page.tsx +35 -0
  77. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/email-set-primary/[[...id]]/page.tsx +3 -4
  78. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/registration/account-confirm-email/[[...id]]/page.tsx +3 -3
  79. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/reset/[[...id]]/page.tsx +41 -5
  80. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/[node]/route.ts +8 -6
  81. package/app-template/src/app/api/auth/[...nextauth]/route.ts +3 -0
  82. package/app-template/src/app/api/barcode-search/route.ts +1 -0
  83. package/app-template/src/app/api/cache/route.ts +1 -1
  84. package/app-template/src/app/api/form/[...id]/route.ts +1 -7
  85. package/app-template/src/app/api/image-proxy/route.ts +1 -0
  86. package/app-template/src/app/api/logout/route.ts +1 -1
  87. package/app-template/src/app/api/product-categories/route.ts +1 -0
  88. package/app-template/src/app/api/similar-product-list/route.ts +1 -0
  89. package/app-template/src/app/api/similar-products/route.ts +1 -0
  90. package/app-template/src/app/api/theme-settings/route.ts +12 -0
  91. package/app-template/src/app/api/virtual-try-on/limited-categories/route.ts +1 -0
  92. package/app-template/src/app/api/virtual-try-on/route.ts +1 -0
  93. package/app-template/src/app/api/web-vitals/route.ts +1 -1
  94. package/app-template/src/assets/fonts/pz-icon.css +211 -49
  95. package/app-template/src/assets/fonts/pz-icon.eot +0 -0
  96. package/app-template/src/assets/fonts/pz-icon.html +486 -0
  97. package/app-template/src/assets/fonts/pz-icon.scss +373 -49
  98. package/app-template/src/assets/fonts/pz-icon.svg +215 -53
  99. package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
  100. package/app-template/src/assets/fonts/pz-icon.woff +0 -0
  101. package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
  102. package/app-template/src/assets/globals.scss +8 -133
  103. package/app-template/src/assets/icons/arrow-right.svg +3 -0
  104. package/app-template/src/assets/icons/cart.svg +4 -12
  105. package/app-template/src/assets/icons/check.svg +2 -18
  106. package/app-template/src/assets/icons/chevron-down.svg +2 -7
  107. package/app-template/src/assets/icons/delete.svg +3 -0
  108. package/app-template/src/assets/icons/facebook.svg +2 -8
  109. package/app-template/src/assets/icons/fav-off.svg +5 -0
  110. package/app-template/src/assets/icons/fav-on.svg +5 -0
  111. package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
  112. package/app-template/src/assets/icons/heart.svg +3 -0
  113. package/app-template/src/assets/icons/instagram.svg +2 -13
  114. package/app-template/src/assets/icons/materials.svg +3 -0
  115. package/app-template/src/assets/icons/person.svg +4 -0
  116. package/app-template/src/assets/icons/pinterest.svg +5 -11
  117. package/app-template/src/assets/icons/ruler.svg +3 -0
  118. package/app-template/src/assets/icons/search.svg +8 -11
  119. package/app-template/src/assets/icons/share.svg +2 -9
  120. package/app-template/src/assets/icons/snapchat.svg +3 -0
  121. package/app-template/src/assets/icons/tiktok.svg +3 -0
  122. package/app-template/src/assets/icons/tumblr.svg +6 -0
  123. package/app-template/src/assets/icons/twitter.svg +2 -10
  124. package/app-template/src/assets/icons/vimeo.svg +3 -0
  125. package/app-template/src/assets/icons/youtube.svg +3 -0
  126. package/app-template/src/assets/icons/zoom.svg +8 -0
  127. package/app-template/src/auth.ts +3 -0
  128. package/app-template/src/components/__tests__/badge.test.tsx +2 -2
  129. package/app-template/src/components/__tests__/link.test.tsx +2 -0
  130. package/app-template/src/components/accordion.tsx +48 -23
  131. package/app-template/src/components/action-tooltip.tsx +160 -0
  132. package/app-template/src/components/button.tsx +1 -1
  133. package/app-template/src/components/carousel-core.tsx +4 -11
  134. package/app-template/src/components/checkbox.tsx +2 -1
  135. package/app-template/src/components/currency-select.tsx +150 -4
  136. package/app-template/src/components/file-input.tsx +27 -7
  137. package/app-template/src/components/generate-form-fields.tsx +49 -10
  138. package/app-template/src/components/icon.tsx +5 -6
  139. package/app-template/src/components/index.ts +4 -1
  140. package/app-template/src/components/input.tsx +11 -5
  141. package/app-template/src/components/language-select.tsx +88 -2
  142. package/app-template/src/components/modal.tsx +34 -16
  143. package/app-template/src/components/pagination.tsx +133 -20
  144. package/app-template/src/components/price.tsx +1 -1
  145. package/app-template/src/components/pwa-tags.tsx +1 -0
  146. package/app-template/src/components/quantity-input.tsx +63 -0
  147. package/app-template/src/components/quantity-selector.tsx +215 -0
  148. package/app-template/src/components/route-handler.tsx +50 -0
  149. package/app-template/src/components/select.tsx +86 -54
  150. package/app-template/src/components/shimmer.tsx +1 -1
  151. package/app-template/src/components/types/index.ts +51 -1
  152. package/app-template/src/components/widget-content.tsx +323 -0
  153. package/app-template/src/data/server/theme.ts +70 -0
  154. package/app-template/src/hooks/use-fav-button.tsx +9 -10
  155. package/app-template/src/hooks/use-product-cart.ts +80 -0
  156. package/app-template/src/hooks/use-stock-alert.ts +74 -0
  157. package/app-template/src/hooks/use-theme-settings.ts +42 -0
  158. package/app-template/src/lib/fonts.ts +149 -0
  159. package/app-template/src/plugins.js +12 -2
  160. package/app-template/src/{middleware.ts → proxy.ts} +3 -3
  161. package/app-template/src/redux/middlewares/category.ts +5 -4
  162. package/app-template/src/redux/store.ts +21 -1
  163. package/app-template/src/routes/index.ts +8 -7
  164. package/app-template/src/settings.js +6 -3
  165. package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
  166. package/app-template/src/types/index.ts +74 -3
  167. package/app-template/src/types/next-auth.d.ts +2 -2
  168. package/app-template/src/types/widget.ts +169 -0
  169. package/app-template/src/utils/__tests__/theme-page-context.test.ts +145 -0
  170. package/app-template/src/utils/formatDate.ts +48 -0
  171. package/app-template/src/utils/styles.ts +71 -0
  172. package/app-template/src/utils/theme-page-context.ts +309 -0
  173. package/app-template/src/utils/variant-validation.ts +41 -0
  174. package/app-template/src/views/account/address-form.tsx +8 -4
  175. package/app-template/src/views/account/contact-form.tsx +148 -131
  176. package/app-template/src/views/account/content-header.tsx +4 -3
  177. package/app-template/src/views/account/faq/faq-tabs.tsx +8 -2
  178. package/app-template/src/views/account/favorite-item.tsx +1 -1
  179. package/app-template/src/views/account/order.tsx +11 -9
  180. package/app-template/src/views/account/orders/order-cancellation-item.tsx +1 -1
  181. package/app-template/src/views/account/orders/order-detail-header.tsx +1 -1
  182. package/app-template/src/views/anonymous-tracking/order-detail/index.tsx +45 -38
  183. package/app-template/src/views/basket/basket-item.tsx +6 -1
  184. package/app-template/src/views/basket/summary.tsx +16 -0
  185. package/app-template/src/views/breadcrumb.tsx +2 -2
  186. package/app-template/src/views/category/category-banner.tsx +4 -23
  187. package/app-template/src/views/category/category-info.tsx +2 -1
  188. package/app-template/src/views/category/filters/filter-item.tsx +138 -42
  189. package/app-template/src/views/category/filters/index.tsx +1 -1
  190. package/app-template/src/views/category/layout.tsx +1 -0
  191. package/app-template/src/views/checkout/auth.tsx +64 -40
  192. package/app-template/src/views/checkout/layout/header.tsx +10 -6
  193. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +22 -6
  194. package/app-template/src/views/checkout/steps/payment/options/funds-transfer.tsx +25 -5
  195. package/app-template/src/views/checkout/steps/payment/options/loyalty.tsx +21 -2
  196. package/app-template/src/views/checkout/steps/payment/options/redirection.tsx +27 -5
  197. package/app-template/src/views/checkout/steps/payment/options/store-credit.tsx +464 -0
  198. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +4 -4
  199. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +33 -20
  200. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +2 -2
  201. package/app-template/src/views/checkout/summary.tsx +12 -2
  202. package/app-template/src/views/find-in-store/index.tsx +2 -2
  203. package/app-template/src/views/guest-login/index.tsx +62 -58
  204. package/app-template/src/views/header/action-menu.tsx +1 -1
  205. package/app-template/src/views/header/band.tsx +2 -2
  206. package/app-template/src/views/header/index.tsx +1 -1
  207. package/app-template/src/views/header/mini-basket.tsx +3 -3
  208. package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
  209. package/app-template/src/views/header/mobile-menu.tsx +18 -6
  210. package/app-template/src/views/header/navbar.tsx +1 -1
  211. package/app-template/src/views/header/pwa-back-button.tsx +1 -1
  212. package/app-template/src/views/header/search/index.tsx +13 -3
  213. package/app-template/src/views/header/search/results.tsx +1 -1
  214. package/app-template/src/views/header/user-menu.tsx +1 -3
  215. package/app-template/src/views/login/index.tsx +66 -57
  216. package/app-template/src/views/otp-login/index.tsx +11 -6
  217. package/app-template/src/views/product/index.ts +1 -0
  218. package/app-template/src/views/product/layout.tsx +26 -6
  219. package/app-template/src/views/product/price-wrapper.tsx +3 -24
  220. package/app-template/src/views/product/product-actions.tsx +165 -0
  221. package/app-template/src/views/product/product-info.tsx +76 -238
  222. package/app-template/src/views/product/product-share.tsx +58 -0
  223. package/app-template/src/views/product/product-variants.tsx +26 -0
  224. package/app-template/src/views/product/slider.tsx +22 -1
  225. package/app-template/src/views/product/variant.tsx +69 -41
  226. package/app-template/src/views/product-pointer-banner-item.tsx +1 -1
  227. package/app-template/src/views/register/index.tsx +31 -46
  228. package/app-template/src/views/sales-contract-modal/index.tsx +17 -17
  229. package/app-template/src/views/share/index.tsx +9 -6
  230. package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
  231. package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
  232. package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
  233. package/app-template/src/widgets/footer-info.tsx +1 -1
  234. package/app-template/src/widgets/footer-menu.tsx +7 -3
  235. package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
  236. package/app-template/src/widgets/footer-subscription/index.tsx +1 -1
  237. package/app-template/src/widgets/home-stories-eng.tsx +43 -35
  238. package/app-template/src/widgets/index.ts +7 -0
  239. package/app-template/src/widgets/schemas/about-us.json +46 -0
  240. package/app-template/src/widgets/schemas/blog-list.json +37 -0
  241. package/app-template/src/widgets/schemas/blog.json +29 -0
  242. package/app-template/tailwind.config.js +155 -7
  243. package/app-template/tsconfig.json +29 -11
  244. package/codemods/migrate-auth-v5/index.js +339 -0
  245. package/codemods/migrate-auth-v5/transform.js +86 -0
  246. package/codemods/migrate-segments/index.js +591 -0
  247. package/codemods/update-tailwind-config/index.js +30 -0
  248. package/codemods/update-tailwind-config/transform.js +102 -0
  249. package/codemods/upgrade-to-2/index.js +549 -0
  250. package/commands/codemod.ts +0 -1
  251. package/commands/plugins.ts +111 -46
  252. package/dist/commands/codemod.js +0 -1
  253. package/dist/commands/plugins.js +104 -36
  254. package/package.json +3 -2
  255. package/app-template/src/app/[commerce]/[locale]/[currency]/category/[pk]/page.tsx +0 -22
  256. package/app-template/src/app/[commerce]/[locale]/[currency]/flat-page/[pk]/page.tsx +0 -20
  257. package/app-template/src/app/[commerce]/[locale]/[currency]/group-product/[pk]/page.tsx +0 -74
  258. package/app-template/src/app/[commerce]/[locale]/[currency]/list/page.tsx +0 -18
  259. package/app-template/src/app/[commerce]/[locale]/[currency]/page.tsx +0 -50
  260. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/page.tsx +0 -84
  261. package/app-template/src/app/[commerce]/[locale]/[currency]/special-page/[pk]/page.tsx +0 -27
  262. package/app-template/src/pages/api/auth/[...nextauth].ts +0 -3
  263. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/address/page.tsx +0 -0
  264. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-email/page.tsx +0 -0
  265. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-password/page.tsx +0 -0
  266. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/contact/page.tsx +0 -0
  267. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/coupons/page.tsx +0 -0
  268. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/email-verification/page.tsx +0 -0
  269. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/faq/page.tsx +0 -0
  270. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/favourite-products/page.tsx +0 -0
  271. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/my-quotations/page.tsx +0 -0
  272. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/layout.tsx +0 -0
  273. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/page.tsx +0 -0
  274. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/anonymous-tracking/page.tsx +0 -0
  275. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/oauth-login/page.tsx +0 -0
  276. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket-b2b/page.tsx +0 -0
  277. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/category/[pk]/loading.tsx +0 -0
  278. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/client-root.tsx +0 -0
  279. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/contact-us/page.tsx +0 -0
  280. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/error.tsx +0 -0
  281. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/flat-page/[pk]/loading.tsx +0 -0
  282. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/group-product/[pk]/loading.tsx +0 -0
  283. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/loading.tsx +0 -0
  284. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/list/loading.tsx +0 -0
  285. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/checkout/page.tsx +0 -0
  286. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/layout.tsx +0 -0
  287. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/special-page/[pk]/loading.tsx +0 -0
  288. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/template.tsx +0 -0
  289. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/password/reset/page.tsx +0 -0
  290. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/route.ts +0 -0
@@ -1,4 +1,6 @@
1
+ const getAkinonNextContent = require('@akinon/next/tailwind/content');
1
2
  const deepMerge = require('@akinon/next/utils/deep-merge');
3
+ const defaultTheme = require('tailwindcss/defaultTheme');
2
4
  const plugins = require('./src/plugins');
3
5
  const fs = require('fs');
4
6
  const path = require('path');
@@ -18,13 +20,159 @@ if (themeName !== 'default' && fs.existsSync(themeConfigPath)) {
18
20
 
19
21
  const defaultConfig = {
20
22
  content: [
21
- ...plugins
22
- .map((plugin) => [
23
- `./node_modules/@akinon/${plugin}/**/*.{js,ts,jsx,tsx}`,
24
- `../../node_modules/@akinon/${plugin}/**/*.{js,ts,jsx,tsx}`
25
- ])
26
- .flat()
27
- ]
23
+ './node_modules/@akinon/next/**/*.{js,ts,jsx,tsx}',
24
+ '../../node_modules/@akinon/next/**/*.{js,ts,jsx,tsx}',
25
+ './src/app/**/*.{js,ts,jsx,tsx}',
26
+ './src/pages/**/*.{js,ts,jsx,tsx}',
27
+ './src/components/**/*.{js,ts,jsx,tsx}',
28
+ './src/views/**/*.{js,ts,jsx,tsx}',
29
+ './src/widgets/**/*.{js,ts,jsx,tsx}',
30
+ './src/hooks/**/*.{js,ts,jsx,tsx}',
31
+ './src/utils/**/*.{js,ts,jsx,tsx}',
32
+ ...getAkinonNextContent(plugins)
33
+ ],
34
+ theme: {
35
+ extend: {
36
+ fontSize: {
37
+ '2xs': '0.5rem'
38
+ },
39
+ outline: {
40
+ off: 'none'
41
+ },
42
+ width: {
43
+ '1/10': '10%',
44
+ '2/10': '20%',
45
+ '3/10': '30%',
46
+ '4/10': '40%',
47
+ '5/10': '50%',
48
+ '6/10': '60%',
49
+ '7/10': '70%',
50
+ '8/10': '80%',
51
+ '9/10': '90%'
52
+ },
53
+ transitionProperty: {
54
+ 'max-width': 'max-width'
55
+ },
56
+ backgroundImage: {
57
+ 'skeleton-shimmer':
58
+ 'linear-gradient(90deg, #d7d7d7 0%, #ebebeb 40%, #eeeeee 60%, #d7d7d7)'
59
+ },
60
+ keyframes: {
61
+ 'skeleton-shimmer': {
62
+ '100%': {
63
+ transform: 'translateX(100%)'
64
+ }
65
+ },
66
+ 'slide-in': {
67
+ '0%': { transform: 'translateX(100%)' },
68
+ '100%': { transform: 'translateX(0)' }
69
+ },
70
+ 'slide-out': {
71
+ '0%': { transform: 'translateX(0)' },
72
+ '100%': { transform: 'translateX(-100%)' }
73
+ }
74
+ },
75
+ animation: {
76
+ 'skeleton-shimmer': 'skeleton-shimmer 2s linear infinite',
77
+ 'slide-in': 'slide-in 0.4s ease-out forwards',
78
+ 'slide-out': 'slide-out 0.4s ease-out forwards'
79
+ }
80
+ },
81
+ colors: {
82
+ transparent: 'transparent',
83
+ white: '#ffffff',
84
+ primary: {
85
+ DEFAULT: '#000000',
86
+ hover: '#181818',
87
+ foreground: '#ffffff',
88
+ 100: '#525252',
89
+ 200: '#404040',
90
+ 300: '#3d3d3d',
91
+ 400: '#333333',
92
+ 500: '#2d2d2d',
93
+ 600: '#292929',
94
+ 700: '#2b2b2b',
95
+ 800: '#181818',
96
+ 900: '#000000'
97
+ },
98
+ secondary: {
99
+ DEFAULT: '#e95151',
100
+ hover: '#d03838',
101
+ foreground: '#ffffff',
102
+ 100: '#ffb7b7',
103
+ 200: '#ff9e9e',
104
+ 300: '#ff8484',
105
+ 400: '#ff6b6b',
106
+ 500: '#e95151',
107
+ 600: '#d72b01',
108
+ 700: '#b61e1e',
109
+ 800: '#9d0505',
110
+ 900: '#830000'
111
+ },
112
+ black: {
113
+ DEFAULT: '#000000',
114
+ 100: '#525252',
115
+ 200: '#404040',
116
+ 300: '#3d3d3d',
117
+ 400: '#333333',
118
+ 500: '#2d2d2d',
119
+ 600: '#292929',
120
+ 700: '#2b2b2b',
121
+ 750: '#121212',
122
+ 800: '#181818',
123
+ 850: '#0a0a0a',
124
+ 900: '#000000'
125
+ },
126
+ gray: {
127
+ DEFAULT: '#ebebeb',
128
+ 25: '#fdfdfd',
129
+ 30: '#fafafa',
130
+ 50: '#f7f7f7',
131
+ 100: '#f5f5f5',
132
+ 150: '#f4f4f4',
133
+ 200: '#eeeeee',
134
+ 300: '#ebebeb',
135
+ 400: '#d7d7d7',
136
+ 450: '#d4d4d4',
137
+ 500: '#c9c9c9',
138
+ 600: '#9d9d9d',
139
+ 650: '#7d7d7d',
140
+ 700: '#686868',
141
+ 800: '#615f62',
142
+ 850: '#58585a',
143
+ 900: '#4a4f54',
144
+ 950: '#424242'
145
+ },
146
+ error: {
147
+ DEFAULT: '#d72b01',
148
+ 100: '#e20008'
149
+ },
150
+ success: {
151
+ DEFAULT: '#7b9d76',
152
+ 100: '#7b9d76'
153
+ }
154
+ },
155
+ container: {
156
+ center: true,
157
+ padding: {
158
+ DEFAULT: '0rem',
159
+ sm: '2rem',
160
+ '2xl': '0rem'
161
+ }
162
+ },
163
+ fontFamily: {
164
+ sans: ['Jost'].concat(defaultTheme.fontFamily.sans)
165
+ },
166
+ screens: {
167
+ xs: '575px',
168
+ sm: '640px',
169
+ md: '768px',
170
+ lg: '1024px',
171
+ xl: '1170px',
172
+ '2xl': '1370px'
173
+ }
174
+ },
175
+ plugins: [require('@tailwindcss/typography')]
28
176
  };
29
177
 
30
178
  if (Object.keys(themeOverrides).length === 0) {
@@ -4,17 +4,27 @@
4
4
  "compilerOptions": {
5
5
  "baseUrl": "./src",
6
6
  "paths": {
7
- "@theme/*": ["./*"],
8
- "@root/*": ["./app/[commerce]/[locale]/[currency]/*"],
9
- "@product/*": ["./app/[commerce]/[locale]/[currency]/product/*"],
7
+ "@theme/*": [
8
+ "./*"
9
+ ],
10
+ "@root/*": [
11
+ "./app/[pz]/*"
12
+ ],
13
+ "@product/*": [
14
+ "./app/[pz]/product/*"
15
+ ],
10
16
  "@group-product/*": [
11
- "./app/[commerce]/[locale]/[currency]/group-product/*"
17
+ "./app/[pz]/group-product/*"
18
+ ],
19
+ "@category/*": [
20
+ "./app/[pz]/category/*"
12
21
  ],
13
- "@category/*": ["./app/[commerce]/[locale]/[currency]/category/*"],
14
22
  "@special-page/*": [
15
- "./app/[commerce]/[locale]/[currency]/special-page/*"
23
+ "./app/[pz]/special-page/*"
16
24
  ],
17
- "@flat-page/*": ["./app/[commerce]/[locale]/[currency]/flat-page/*"]
25
+ "@flat-page/*": [
26
+ "./app/[pz]/flat-page/*"
27
+ ]
18
28
  },
19
29
  "allowSyntheticDefaultImports": true,
20
30
  "composite": false,
@@ -26,7 +36,11 @@
26
36
  "noUnusedParameters": false,
27
37
  "preserveWatchOutput": true,
28
38
  "target": "es5",
29
- "lib": ["dom", "dom.iterable", "esnext"],
39
+ "lib": [
40
+ "dom",
41
+ "dom.iterable",
42
+ "esnext"
43
+ ],
30
44
  "allowJs": true,
31
45
  "skipLibCheck": true,
32
46
  "strict": false,
@@ -37,7 +51,7 @@
37
51
  "module": "esnext",
38
52
  "resolveJsonModule": true,
39
53
  "isolatedModules": true,
40
- "jsx": "preserve",
54
+ "jsx": "react-jsx",
41
55
  "plugins": [
42
56
  {
43
57
  "name": "next"
@@ -50,7 +64,11 @@
50
64
  "**/*.ts",
51
65
  "**/*.tsx",
52
66
  ".next/types/**/*.ts",
53
- "../../packages/**/*"
67
+ "../../packages/**/*",
68
+ ".next/dev/types/**/*.ts"
54
69
  ],
55
- "exclude": ["node_modules", "../../packages/projectzero/app-template"]
70
+ "exclude": [
71
+ "node_modules",
72
+ "../../packages/projectzero/app-template"
73
+ ]
56
74
  }
@@ -0,0 +1,339 @@
1
+ /**
2
+ * next-auth v4 -> v5 migration codemod for Project Zero brands.
3
+ *
4
+ * Handles two brand patterns:
5
+ * Tip A (re-export only): brand's [...nextauth].ts is a 3-line
6
+ * `import Auth from '@akinon/next/api/auth'; export default Auth;`
7
+ * → fully automated; brand's auth.ts + route.ts are generated.
8
+ *
9
+ * Tip B (custom nextAuthOptions): brand has its own config using
10
+ * Pages API req/res. Skeleton is generated and original logic is
11
+ * transferred with TODO markers. Manual conversion of req/res to
12
+ * cookies()/headers() is required afterwards.
13
+ *
14
+ * In both cases, client usage `getServerSession` is rewritten to `auth`
15
+ * via the sibling `transform.js` jscodeshift script.
16
+ *
17
+ * Usage:
18
+ * cd <brand-root>
19
+ * node <pz-next>/packages/projectzero/codemods/migrate-auth-v5/index.js [--dry-run]
20
+ *
21
+ * Or via the projectzero CLI:
22
+ * npx @akinon/projectzero codemod --codemod=migrate-auth-v5
23
+ */
24
+
25
+ const path = require('path');
26
+ const fs = require('fs');
27
+ const jscodeshift = require('jscodeshift/src/Runner');
28
+
29
+ const TIP_A_SIZE_LIMIT = 256;
30
+
31
+ const TIP_A_AUTH_CONTENT = `import { createAuth } from '@akinon/next/api/auth';
32
+
33
+ export const { handlers, auth, signIn, signOut } = createAuth();
34
+ `;
35
+
36
+ const ROUTE_CONTENT = `import { handlers } from 'auth';
37
+
38
+ export const { GET, POST } = handlers;
39
+ `;
40
+
41
+ const TIP_B_HEADER = `/**
42
+ * NOTE: This file was generated by \`migrate-auth-v5\`.
43
+ * It replaces \`src/pages/api/auth/[...nextauth].ts\` which used
44
+ * the Pages API \`req\`/\`res\` objects that next-auth v5 (App Router)
45
+ * no longer provides.
46
+ *
47
+ * MANUAL MIGRATION STEPS (required before first run):
48
+ *
49
+ * 1. \`req.cookies['X']\`
50
+ * -> \`(await cookies()).get('X')?.value\`
51
+ *
52
+ * 2. \`req.headers['X']\` or \`req.headers.X\`
53
+ * -> \`(await headers()).get('X') ?? ''\`
54
+ *
55
+ * 3. \`res.setHeader('Set-Cookie', ['name=value; Path=/; HttpOnly; ...'])\`
56
+ * -> \`(await cookies()).set('name', value, { path: '/', httpOnly: true, secure: true, maxAge })\`
57
+ *
58
+ * 4. \`throw new Error(JSON.stringify(errors))\`
59
+ * -> \`class PzCredentialsError extends CredentialsSignin { constructor(errs) { super(); this.code = JSON.stringify(errs); } }\`
60
+ * -> \`throw new PzCredentialsError(errors)\`
61
+ * (Import \`CredentialsSignin\` from \`'next-auth'\`.)
62
+ *
63
+ * 5. Each \`authorize\` callback is now \`async\` and no longer receives
64
+ * the outer \`req\`/\`res\`. Wrap cookie/header reads in \`await\`.
65
+ *
66
+ * Reference implementation (copy the shape as needed):
67
+ * packages/akinon-next/api/auth.ts on the pz-next beta branch.
68
+ *
69
+ * Search for \`TODO:v5\` markers below for spots that definitely need work.
70
+ */`;
71
+
72
+ function log(msg) {
73
+ const ts = new Date().toISOString().replace('T', ' ').slice(0, 19);
74
+ console.log(`[${ts}] ${msg}`);
75
+ }
76
+
77
+ function detectAuthType(cwd) {
78
+ const oldPath = path.join(cwd, 'src', 'pages', 'api', 'auth', '[...nextauth].ts');
79
+ if (!fs.existsSync(oldPath)) {
80
+ return { type: null, oldPath };
81
+ }
82
+
83
+ const stats = fs.statSync(oldPath);
84
+ const content = fs.readFileSync(oldPath, 'utf-8');
85
+
86
+ const isReExport =
87
+ stats.size < TIP_A_SIZE_LIMIT &&
88
+ /from\s+['"]@akinon\/next\/api\/auth['"]/.test(content) &&
89
+ /export\s+default\s+Auth/.test(content);
90
+
91
+ return { type: isReExport ? 'A' : 'B', oldPath, content };
92
+ }
93
+
94
+ function ensureParentDir(filePath, { dryRun }) {
95
+ const dir = path.dirname(filePath);
96
+ if (!fs.existsSync(dir)) {
97
+ if (dryRun) {
98
+ log(`[DRY] mkdir -p ${dir}`);
99
+ } else {
100
+ fs.mkdirSync(dir, { recursive: true });
101
+ }
102
+ }
103
+ }
104
+
105
+ function writeFileSafe(filePath, content, { dryRun }) {
106
+ ensureParentDir(filePath, { dryRun });
107
+ if (dryRun) {
108
+ log(`[DRY] CREATE ${filePath} (${content.length} bytes)`);
109
+ return;
110
+ }
111
+ if (fs.existsSync(filePath)) {
112
+ log(` WARN: ${filePath} already exists; overwriting`);
113
+ }
114
+ fs.writeFileSync(filePath, content, 'utf-8');
115
+ log(` CREATE ${filePath}`);
116
+ }
117
+
118
+ function deleteFileSafe(filePath, { dryRun }) {
119
+ if (!fs.existsSync(filePath)) return;
120
+ if (dryRun) {
121
+ log(`[DRY] DELETE ${filePath}`);
122
+ return;
123
+ }
124
+ fs.unlinkSync(filePath);
125
+ log(` DELETE ${filePath}`);
126
+ }
127
+
128
+ function cleanupEmptyAuthPagesDir(cwd, { dryRun }) {
129
+ const authDir = path.join(cwd, 'src', 'pages', 'api', 'auth');
130
+ if (!fs.existsSync(authDir)) return;
131
+ const remaining = fs.readdirSync(authDir);
132
+ if (remaining.length > 0) return;
133
+ if (dryRun) {
134
+ log(`[DRY] rmdir ${authDir}`);
135
+ return;
136
+ }
137
+ fs.rmdirSync(authDir);
138
+ log(` RMDIR ${authDir}`);
139
+ }
140
+
141
+ function migrateTipA(cwd, { dryRun, oldPath }) {
142
+ const authPath = path.join(cwd, 'src', 'auth.ts');
143
+ const routePath = path.join(
144
+ cwd,
145
+ 'src',
146
+ 'app',
147
+ 'api',
148
+ 'auth',
149
+ '[...nextauth]',
150
+ 'route.ts'
151
+ );
152
+
153
+ log(`Tip A migration`);
154
+ deleteFileSafe(oldPath, { dryRun });
155
+ writeFileSafe(authPath, TIP_A_AUTH_CONTENT, { dryRun });
156
+ writeFileSafe(routePath, ROUTE_CONTENT, { dryRun });
157
+ cleanupEmptyAuthPagesDir(cwd, { dryRun });
158
+ }
159
+
160
+ function transformTipBSource(original) {
161
+ let src = original;
162
+
163
+ src = src.replace(
164
+ /import\s*\{\s*NextApiRequest\s*,\s*NextApiResponse\s*\}\s*from\s*['"]next['"];?\s*\n/,
165
+ ''
166
+ );
167
+
168
+ src = src.replace(
169
+ /import\s+NextAuth(?:\s*,\s*\{([^}]*)\})?\s+from\s+['"]next-auth['"];?\s*\n/,
170
+ (_match, typeImports) => {
171
+ const lines = [
172
+ `import { createAuth } from '@akinon/next/api/auth';`,
173
+ `import { cookies, headers } from 'next/headers';`
174
+ ];
175
+ if (typeImports && typeImports.trim()) {
176
+ const cleaned = typeImports
177
+ .split(',')
178
+ .map((s) => s.trim())
179
+ .filter(Boolean)
180
+ .join(', ');
181
+ if (cleaned) {
182
+ lines.push(`import type { ${cleaned} } from 'next-auth';`);
183
+ }
184
+ }
185
+ return lines.join('\n') + '\n';
186
+ }
187
+ );
188
+
189
+ src = src.replace(
190
+ /const\s+nextAuthOptions\s*=\s*\(\s*req\s*:\s*NextApiRequest\s*,\s*res\s*:\s*NextApiResponse\s*\)\s*=>\s*\{/,
191
+ `const getCustomAuthConfig = () => {\n // TODO:v5 See migration notes at top of file.`
192
+ );
193
+
194
+ src = src.replace(
195
+ /const\s+nextAuthOptions\s*=\s*\(\s*req\s*,\s*res\s*\)\s*=>\s*\{/,
196
+ `const getCustomAuthConfig = () => {\n // TODO:v5 See migration notes at top of file.`
197
+ );
198
+
199
+ src = src.replace(
200
+ /const\s+Auth\s*=\s*\(\s*req[^)]*\)\s*=>\s*\{\s*return\s+NextAuth\(\s*req\s*,\s*res\s*,\s*nextAuthOptions\(\s*req\s*,\s*res\s*\)\s*\);\s*\};?\s*\n/,
201
+ ''
202
+ );
203
+
204
+ src = src.replace(
205
+ /const\s+Auth\s*=\s*\(\s*req[^)]*\)\s*=>\s*NextAuth\([^;]*\);\s*\n/,
206
+ ''
207
+ );
208
+
209
+ src = src.replace(
210
+ /export\s+default\s+Auth\s*;?\s*$/m,
211
+ `export const { handlers, auth, signIn, signOut } = createAuth(getCustomAuthConfig);\n`
212
+ );
213
+
214
+ src = src.replace(
215
+ /\b(req\.cookies(?:\?\.|\.)[a-zA-Z_$][\w$]*|req\.cookies\[[^\]]+\])/g,
216
+ '/* TODO:v5 cookies() */ $1'
217
+ );
218
+ src = src.replace(
219
+ /\b(req\.headers(?:\?\.|\.)[a-zA-Z_$][\w$]*|req\.headers\[[^\]]+\])/g,
220
+ '/* TODO:v5 headers() */ $1'
221
+ );
222
+ src = src.replace(
223
+ /\b(req\.body(?:\?\.|\.)?[a-zA-Z_$]?[\w$]*)/g,
224
+ '/* TODO:v5 read body via credentials */ $1'
225
+ );
226
+ src = src.replace(
227
+ /\b(res\.[a-zA-Z_$][\w$]*\()/g,
228
+ '/* TODO:v5 cookies().set */ $1'
229
+ );
230
+ src = src.replace(
231
+ /\bthrow\s+new\s+Error\(JSON\.stringify\(errors\)\)/g,
232
+ '/* TODO:v5 CredentialsSignin */ throw new Error(JSON.stringify(errors))'
233
+ );
234
+
235
+ return `${TIP_B_HEADER}\n\n${src}`;
236
+ }
237
+
238
+ function migrateTipB(cwd, { dryRun, oldPath, content }) {
239
+ const authPath = path.join(cwd, 'src', 'auth.ts');
240
+ const routePath = path.join(
241
+ cwd,
242
+ 'src',
243
+ 'app',
244
+ 'api',
245
+ 'auth',
246
+ '[...nextauth]',
247
+ 'route.ts'
248
+ );
249
+
250
+ log(`Tip B migration (${content.length} bytes to transfer)`);
251
+
252
+ const newAuthContent = transformTipBSource(content);
253
+
254
+ writeFileSafe(authPath, newAuthContent, { dryRun });
255
+ writeFileSafe(routePath, ROUTE_CONTENT, { dryRun });
256
+ deleteFileSafe(oldPath, { dryRun });
257
+ cleanupEmptyAuthPagesDir(cwd, { dryRun });
258
+
259
+ log(` Manual work left: req/res -> cookies()/headers() conversions inside ${authPath}`);
260
+ log(` Grep for 'TODO:v5' to find spots.`);
261
+ }
262
+
263
+ function runClientTransform(cwd, { dryRun }) {
264
+ const transformPath = path.resolve(__dirname, 'transform.js');
265
+ const targets = ['src'].map((d) => path.join(cwd, d)).filter(fs.existsSync);
266
+ if (targets.length === 0) {
267
+ log(`No src/ directory found, skipping client transform`);
268
+ return Promise.resolve();
269
+ }
270
+
271
+ log(`Running client transform (getServerSession -> auth)`);
272
+
273
+ return jscodeshift
274
+ .run(transformPath, targets, {
275
+ verbose: 0,
276
+ dry: Boolean(dryRun),
277
+ print: Boolean(dryRun),
278
+ extensions: 'ts,tsx',
279
+ parser: 'tsx',
280
+ ignorePattern: '**/node_modules/**',
281
+ silent: true
282
+ })
283
+ .then(
284
+ (stats) => {
285
+ log(
286
+ ` Client transform: ${stats.ok} changed, ${stats.nochange} unchanged, ${stats.error} errored`
287
+ );
288
+ },
289
+ (err) => {
290
+ log(` Client transform error: ${err.message}`);
291
+ }
292
+ );
293
+ }
294
+
295
+ const transform = () => {
296
+ const workingDir = path.resolve(process.cwd());
297
+ const dryRun = process.argv.includes('--dry-run');
298
+
299
+ log(
300
+ `migrate-auth-v5 starting in ${workingDir}${dryRun ? ' (DRY RUN)' : ''}`
301
+ );
302
+
303
+ const detection = detectAuthType(workingDir);
304
+
305
+ if (!detection.type) {
306
+ log(`No src/pages/api/auth/[...nextauth].ts found, nothing to migrate.`);
307
+ return Promise.resolve();
308
+ }
309
+
310
+ log(`Detected pattern: Tip ${detection.type}`);
311
+
312
+ if (detection.type === 'A') {
313
+ migrateTipA(workingDir, { dryRun, oldPath: detection.oldPath });
314
+ } else {
315
+ migrateTipB(workingDir, {
316
+ dryRun,
317
+ oldPath: detection.oldPath,
318
+ content: detection.content
319
+ });
320
+ }
321
+
322
+ return runClientTransform(workingDir, { dryRun }).then(() => {
323
+ log(`migrate-auth-v5 done`);
324
+ });
325
+ };
326
+
327
+ module.exports = {
328
+ transform
329
+ };
330
+
331
+ if (require.main === module) {
332
+ const result = transform();
333
+ if (result && typeof result.then === 'function') {
334
+ result.catch((err) => {
335
+ console.error(err);
336
+ process.exit(1);
337
+ });
338
+ }
339
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * jscodeshift transform: client-side next-auth v4 -> v5 migration.
3
+ *
4
+ * Converts:
5
+ * import { getServerSession } from 'next-auth/next';
6
+ * const session = await getServerSession();
7
+ *
8
+ * Into:
9
+ * import { auth } from 'auth';
10
+ * const session = await auth();
11
+ *
12
+ * Arguments passed to `getServerSession(authOptions, ...)` are dropped,
13
+ * since `auth()` needs none when using the root `src/auth.ts` config.
14
+ */
15
+
16
+ const AUTH_IMPORT_SOURCES = ['next-auth/next', 'next-auth'];
17
+
18
+ function transform(fileInfo, api) {
19
+ const j = api.jscodeshift;
20
+ const root = j(fileInfo.source);
21
+ let changed = false;
22
+
23
+ AUTH_IMPORT_SOURCES.forEach((sourceValue) => {
24
+ const imports = root.find(j.ImportDeclaration, {
25
+ source: { value: sourceValue }
26
+ });
27
+
28
+ imports.forEach((pathNode) => {
29
+ const specifiers = pathNode.node.specifiers || [];
30
+ const getServerSessionSpec = specifiers.find(
31
+ (s) =>
32
+ s.type === 'ImportSpecifier' &&
33
+ s.imported &&
34
+ s.imported.name === 'getServerSession'
35
+ );
36
+
37
+ if (!getServerSessionSpec) {
38
+ return;
39
+ }
40
+
41
+ const localName = getServerSessionSpec.local
42
+ ? getServerSessionSpec.local.name
43
+ : 'getServerSession';
44
+
45
+ const otherSpecs = specifiers.filter((s) => s !== getServerSessionSpec);
46
+
47
+ if (otherSpecs.length === 0) {
48
+ pathNode.node.specifiers = [
49
+ j.importSpecifier(j.identifier('auth'))
50
+ ];
51
+ pathNode.node.source = j.literal('auth');
52
+ } else {
53
+ pathNode.node.specifiers = otherSpecs;
54
+ const authImport = j.importDeclaration(
55
+ [j.importSpecifier(j.identifier('auth'))],
56
+ j.literal('auth')
57
+ );
58
+ pathNode.insertAfter(authImport);
59
+ }
60
+
61
+ root
62
+ .find(j.CallExpression, { callee: { name: localName } })
63
+ .forEach((callPath) => {
64
+ callPath.node.callee = j.identifier('auth');
65
+ callPath.node.arguments = [];
66
+ });
67
+
68
+ changed = true;
69
+ });
70
+ });
71
+
72
+ AUTH_IMPORT_SOURCES.forEach((sourceValue) => {
73
+ root
74
+ .find(j.ImportDeclaration, { source: { value: sourceValue } })
75
+ .forEach((pathNode) => {
76
+ if (!pathNode.node.specifiers || pathNode.node.specifiers.length === 0) {
77
+ j(pathNode).remove();
78
+ changed = true;
79
+ }
80
+ });
81
+ });
82
+
83
+ return changed ? root.toSource({ quote: 'single' }) : null;
84
+ }
85
+
86
+ module.exports = transform;