spree_core 4.10.1 → 5.0.0.rc1

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 (476) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/spree_core_manifest.js +4 -0
  3. data/app/assets/images/google_on_white_hdpi.png +0 -0
  4. data/app/controllers/spree/base_controller.rb +1 -4
  5. data/app/finders/spree/orders/find_complete.rb +14 -2
  6. data/app/finders/spree/products/find.rb +74 -23
  7. data/app/finders/spree/stores/find_current.rb +6 -2
  8. data/app/helpers/spree/addresses_helper.rb +106 -0
  9. data/app/helpers/spree/base_helper.rb +83 -55
  10. data/app/helpers/spree/currency_helper.rb +12 -0
  11. data/app/helpers/spree/images_helper.rb +18 -0
  12. data/app/helpers/spree/mail_helper.rb +24 -0
  13. data/app/helpers/spree/products_helper.rb +1 -20
  14. data/app/javascript/spree/core/controllers/address_autocomplete_controller.js +233 -0
  15. data/app/javascript/spree/core/controllers/address_form_controller.js +98 -0
  16. data/app/javascript/spree/core/controllers/enable_button_controller.js +29 -0
  17. data/app/javascript/spree/core/helpers/address_autocomplete/google_places_suggestions_provider.js +179 -0
  18. data/app/javascript/spree/core/helpers/debounce.js +9 -0
  19. data/app/javascript/spree/core/helpers/scroll_lock.js +25 -0
  20. data/app/jobs/spree/addresses/geocode_address_job.rb +31 -0
  21. data/app/jobs/spree/base_job.rb +1 -0
  22. data/app/jobs/spree/coupon_codes/bulk_generate_job.rb +17 -0
  23. data/app/jobs/spree/exports/generate_job.rb +12 -0
  24. data/app/jobs/spree/products/auto_match_taxons_job.rb +14 -0
  25. data/app/jobs/spree/products/touch_taxons_job.rb +12 -0
  26. data/app/jobs/spree/reports/generate_job.rb +12 -0
  27. data/app/jobs/spree/stock_locations/stock_items/create_job.rb +1 -1
  28. data/app/jobs/spree/themes/duplicate_components_job.rb +59 -0
  29. data/app/jobs/spree/themes/screenshot_job.rb +81 -0
  30. data/app/jobs/spree/variants/remove_from_incomplete_orders_job.rb +2 -0
  31. data/app/jobs/spree/variants/remove_line_item_job.rb +2 -0
  32. data/app/mailers/spree/base_mailer.rb +51 -0
  33. data/app/mailers/spree/export_mailer.rb +19 -0
  34. data/app/mailers/spree/report_mailer.rb +20 -0
  35. data/app/mailers/spree/test_mailer.rb +8 -0
  36. data/app/models/action_text/rich_text_decorator.rb +11 -0
  37. data/app/models/action_text/video_embed.rb +13 -0
  38. data/app/models/acts_as_taggable_on/tag_decorator.rb +10 -0
  39. data/app/models/concerns/spree/calculated_adjustments.rb +2 -0
  40. data/app/models/concerns/spree/display_on.rb +13 -0
  41. data/app/models/concerns/spree/has_one_link.rb +42 -0
  42. data/app/models/concerns/spree/has_page_links.rb +53 -0
  43. data/app/models/concerns/spree/metadata.rb +3 -7
  44. data/app/models/concerns/spree/multi_searchable.rb +21 -0
  45. data/app/models/concerns/spree/multi_store_resource.rb +9 -0
  46. data/app/models/concerns/spree/number_as_param.rb +4 -2
  47. data/app/models/concerns/spree/parameterizable_name.rb +21 -0
  48. data/app/models/concerns/spree/previewable.rb +17 -0
  49. data/app/models/concerns/spree/product_scopes.rb +7 -7
  50. data/app/models/concerns/spree/stores/setup.rb +52 -0
  51. data/app/models/concerns/spree/stores/socials.rb +68 -0
  52. data/app/models/concerns/spree/user_address.rb +4 -0
  53. data/app/models/concerns/spree/user_methods.rb +61 -11
  54. data/app/models/concerns/spree/user_reporting.rb +14 -6
  55. data/app/models/concerns/spree/user_roles.rb +1 -1
  56. data/app/models/spree/ability.rb +4 -2
  57. data/app/models/spree/address.rb +122 -28
  58. data/app/models/spree/adjustment.rb +4 -1
  59. data/app/models/spree/asset/support/active_storage.rb +1 -1
  60. data/app/models/spree/asset.rb +18 -6
  61. data/app/models/spree/base.rb +38 -7
  62. data/app/models/spree/base_analytics_event_handler.rb +49 -0
  63. data/app/models/spree/calculator.rb +1 -1
  64. data/app/models/spree/classification.rb +10 -1
  65. data/app/models/spree/country.rb +1 -1
  66. data/app/models/spree/coupon_code.rb +38 -0
  67. data/app/models/spree/credit_card.rb +4 -3
  68. data/app/models/spree/current.rb +9 -0
  69. data/app/models/spree/custom_domain.rb +53 -0
  70. data/app/models/spree/customer_return.rb +13 -1
  71. data/app/models/spree/data_feed.rb +1 -1
  72. data/app/models/spree/digital.rb +5 -6
  73. data/app/models/spree/digital_link.rb +11 -6
  74. data/app/models/spree/export.rb +172 -0
  75. data/app/models/spree/exports/orders.rb +23 -0
  76. data/app/models/spree/exports/products.rb +35 -0
  77. data/app/models/spree/gateway/bogus.rb +5 -0
  78. data/app/models/spree/gateway.rb +14 -4
  79. data/app/models/spree/gateway_customer.rb +13 -0
  80. data/app/models/spree/image/configuration/active_storage.rb +1 -1
  81. data/app/models/spree/inventory_unit.rb +1 -1
  82. data/app/models/spree/legacy_user.rb +3 -1
  83. data/app/models/spree/line_item.rb +37 -2
  84. data/app/models/spree/log_entry.rb +1 -1
  85. data/app/models/spree/option_type.rb +40 -6
  86. data/app/models/spree/option_type_prototype.rb +1 -1
  87. data/app/models/spree/option_value.rb +35 -5
  88. data/app/models/spree/option_value_variant.rb +2 -2
  89. data/app/models/spree/order/address_book.rb +34 -15
  90. data/app/models/spree/order/checkout.rb +12 -2
  91. data/app/models/spree/order/currency_updater.rb +1 -1
  92. data/app/models/spree/order/digital.rb +14 -3
  93. data/app/models/spree/order/emails.rb +1 -1
  94. data/app/models/spree/order/payments.rb +1 -13
  95. data/app/models/spree/order/store_credit.rb +17 -5
  96. data/app/models/spree/order/webhooks.rb +1 -1
  97. data/app/models/spree/order.rb +179 -49
  98. data/app/models/spree/order_promotion.rb +1 -1
  99. data/app/models/spree/order_updater.rb +9 -3
  100. data/app/models/spree/page.rb +184 -0
  101. data/app/models/spree/page_block.rb +69 -0
  102. data/app/models/spree/page_blocks/buttons.rb +29 -0
  103. data/app/models/spree/page_blocks/heading.rb +18 -0
  104. data/app/models/spree/page_blocks/image.rb +17 -0
  105. data/app/models/spree/page_blocks/link.rb +21 -0
  106. data/app/models/spree/page_blocks/mega_nav.rb +33 -0
  107. data/app/models/spree/page_blocks/mega_nav_with_subcategories.rb +32 -0
  108. data/app/models/spree/page_blocks/nav.rb +15 -0
  109. data/app/models/spree/page_blocks/newsletter_form.rb +18 -0
  110. data/app/models/spree/page_blocks/products/buy_buttons.rb +12 -0
  111. data/app/models/spree/page_blocks/products/price.rb +18 -0
  112. data/app/models/spree/page_blocks/products/quantity_selector.rb +12 -0
  113. data/app/models/spree/page_blocks/products/share.rb +8 -0
  114. data/app/models/spree/page_blocks/products/title.rb +15 -0
  115. data/app/models/spree/page_blocks/products/variant_picker.rb +9 -0
  116. data/app/models/spree/page_blocks/subheading.rb +17 -0
  117. data/app/models/spree/page_blocks/text.rb +16 -0
  118. data/app/models/spree/page_link.rb +59 -0
  119. data/app/models/spree/page_section.rb +215 -0
  120. data/app/models/spree/page_sections/announcement_bar.rb +30 -0
  121. data/app/models/spree/page_sections/collection_banner.rb +18 -0
  122. data/app/models/spree/page_sections/custom_code.rb +11 -0
  123. data/app/models/spree/page_sections/featured_posts.rb +43 -0
  124. data/app/models/spree/page_sections/featured_product.rb +46 -0
  125. data/app/models/spree/page_sections/featured_taxon.rb +88 -0
  126. data/app/models/spree/page_sections/featured_taxons.rb +45 -0
  127. data/app/models/spree/page_sections/footer.rb +94 -0
  128. data/app/models/spree/page_sections/header.rb +62 -0
  129. data/app/models/spree/page_sections/image_banner.rb +38 -0
  130. data/app/models/spree/page_sections/image_with_text.rb +48 -0
  131. data/app/models/spree/page_sections/main_password_footer.rb +18 -0
  132. data/app/models/spree/page_sections/main_password_header.rb +20 -0
  133. data/app/models/spree/page_sections/newsletter.rb +47 -0
  134. data/app/models/spree/page_sections/page_title.rb +19 -0
  135. data/app/models/spree/page_sections/post_details.rb +19 -0
  136. data/app/models/spree/page_sections/post_grid.rb +19 -0
  137. data/app/models/spree/page_sections/product_details.rb +16 -0
  138. data/app/models/spree/page_sections/product_grid.rb +13 -0
  139. data/app/models/spree/page_sections/related_products.rb +60 -0
  140. data/app/models/spree/page_sections/rich_text.rb +20 -0
  141. data/app/models/spree/page_sections/taxon_banner.rb +18 -0
  142. data/app/models/spree/page_sections/taxon_grid.rb +17 -0
  143. data/app/models/spree/page_sections/video.rb +99 -0
  144. data/app/models/spree/pages/account.rb +15 -0
  145. data/app/models/spree/pages/cart.rb +9 -0
  146. data/app/models/spree/pages/checkout.rb +9 -0
  147. data/app/models/spree/pages/custom.rb +34 -0
  148. data/app/models/spree/pages/homepage.rb +68 -0
  149. data/app/models/spree/pages/login.rb +15 -0
  150. data/app/models/spree/pages/password.rb +57 -0
  151. data/app/models/spree/pages/post.rb +27 -0
  152. data/app/models/spree/pages/post_list.rb +32 -0
  153. data/app/models/spree/pages/product_details.rb +29 -0
  154. data/app/models/spree/pages/search_results.rb +43 -0
  155. data/app/models/spree/pages/shop_all.rb +36 -0
  156. data/app/models/spree/pages/taxon.rb +29 -0
  157. data/app/models/spree/pages/taxon_list.rb +41 -0
  158. data/app/models/spree/pages/wishlist.rb +11 -0
  159. data/app/models/spree/payment/gateway_options.rb +13 -15
  160. data/app/models/spree/payment/processing.rb +1 -1
  161. data/app/models/spree/payment/webhooks.rb +1 -1
  162. data/app/models/spree/payment.rb +61 -12
  163. data/app/models/spree/payment_capture_event.rb +1 -1
  164. data/app/models/spree/payment_method/store_credit.rb +9 -1
  165. data/app/models/spree/payment_method.rb +26 -8
  166. data/app/models/spree/payment_source.rb +2 -2
  167. data/app/models/spree/post.rb +108 -0
  168. data/app/models/spree/post_category.rb +33 -0
  169. data/app/models/spree/preference.rb +1 -1
  170. data/app/models/spree/price.rb +10 -3
  171. data/app/models/spree/product/webhooks.rb +1 -1
  172. data/app/models/spree/product.rb +325 -54
  173. data/app/models/spree/product_option_type.rb +1 -1
  174. data/app/models/spree/product_promotion_rule.rb +1 -1
  175. data/app/models/spree/product_property.rb +4 -1
  176. data/app/models/spree/promotion/actions/create_line_items.rb +37 -2
  177. data/app/models/spree/promotion/rules/country.rb +22 -4
  178. data/app/models/spree/promotion/rules/currency.rb +21 -0
  179. data/app/models/spree/promotion/rules/item_total.rb +12 -3
  180. data/app/models/spree/promotion/rules/option_value.rb +5 -20
  181. data/app/models/spree/promotion/rules/product.rb +33 -1
  182. data/app/models/spree/promotion/rules/taxon.rb +31 -0
  183. data/app/models/spree/promotion/rules/user.rb +33 -4
  184. data/app/models/spree/promotion.rb +136 -15
  185. data/app/models/spree/promotion_action.rb +31 -1
  186. data/app/models/spree/promotion_action_line_item.rb +1 -1
  187. data/app/models/spree/promotion_category.rb +1 -1
  188. data/app/models/spree/promotion_handler/cart.rb +1 -1
  189. data/app/models/spree/promotion_handler/coupon.rb +46 -8
  190. data/app/models/spree/promotion_handler/free_shipping.rb +1 -1
  191. data/app/models/spree/promotion_handler/promotion_duplicator.rb +6 -5
  192. data/app/models/spree/promotion_rule.rb +23 -1
  193. data/app/models/spree/promotion_rule_taxon.rb +1 -1
  194. data/app/models/spree/promotion_rule_user.rb +1 -1
  195. data/app/models/spree/property.rb +11 -3
  196. data/app/models/spree/property_prototype.rb +1 -1
  197. data/app/models/spree/prototype.rb +1 -1
  198. data/app/models/spree/prototype_taxon.rb +1 -1
  199. data/app/models/spree/refund.rb +24 -4
  200. data/app/models/spree/refund_reason.rb +12 -2
  201. data/app/models/spree/reimbursement/credit.rb +1 -1
  202. data/app/models/spree/reimbursement/emails.rb +1 -1
  203. data/app/models/spree/reimbursement.rb +5 -3
  204. data/app/models/spree/reimbursement_type.rb +1 -1
  205. data/app/models/spree/report.rb +110 -0
  206. data/app/models/spree/report_line_item.rb +27 -0
  207. data/app/models/spree/report_line_items/products_performance.rb +76 -0
  208. data/app/models/spree/report_line_items/sales_total.rb +49 -0
  209. data/app/models/spree/reports/products_performance.rb +44 -0
  210. data/app/models/spree/reports/sales_total.rb +14 -0
  211. data/app/models/spree/return_authorization.rb +4 -1
  212. data/app/models/spree/return_authorization_reason.rb +1 -1
  213. data/app/models/spree/return_item.rb +2 -1
  214. data/app/models/spree/role.rb +5 -2
  215. data/app/models/spree/role_user.rb +2 -2
  216. data/app/models/spree/shipment/emails.rb +1 -1
  217. data/app/models/spree/shipment/webhooks.rb +1 -1
  218. data/app/models/spree/shipment.rb +14 -4
  219. data/app/models/spree/shipping_category.rb +1 -1
  220. data/app/models/spree/shipping_method.rb +48 -8
  221. data/app/models/spree/shipping_method_category.rb +1 -1
  222. data/app/models/spree/shipping_method_zone.rb +1 -1
  223. data/app/models/spree/shipping_rate.rb +21 -3
  224. data/app/models/spree/state.rb +1 -1
  225. data/app/models/spree/state_change.rb +1 -1
  226. data/app/models/spree/stock_item/webhooks.rb +1 -1
  227. data/app/models/spree/stock_item.rb +9 -6
  228. data/app/models/spree/stock_location.rb +35 -8
  229. data/app/models/spree/stock_movement/webhooks.rb +1 -1
  230. data/app/models/spree/stock_movement.rb +9 -3
  231. data/app/models/spree/stock_transfer.rb +41 -3
  232. data/app/models/spree/store.rb +345 -72
  233. data/app/models/spree/store_credit.rb +12 -4
  234. data/app/models/spree/store_credit_category.rb +1 -1
  235. data/app/models/spree/store_credit_event.rb +21 -1
  236. data/app/models/spree/store_credit_type.rb +1 -1
  237. data/app/models/spree/store_payment_method.rb +1 -1
  238. data/app/models/spree/store_product.rb +1 -1
  239. data/app/models/spree/store_promotion.rb +1 -1
  240. data/app/models/spree/tax_category.rb +15 -1
  241. data/app/models/spree/tax_rate.rb +1 -1
  242. data/app/models/spree/taxon.rb +210 -27
  243. data/app/models/spree/taxon_image/configuration/active_storage.rb +1 -1
  244. data/app/models/spree/taxon_rule.rb +25 -0
  245. data/app/models/spree/taxon_rules/available_on.rb +20 -0
  246. data/app/models/spree/taxon_rules/sale.rb +16 -0
  247. data/app/models/spree/taxon_rules/tag.rb +19 -0
  248. data/app/models/spree/taxonomy.rb +3 -2
  249. data/app/models/spree/theme.rb +200 -0
  250. data/app/models/spree/themes/default.rb +94 -0
  251. data/app/models/spree/variant/webhooks.rb +1 -1
  252. data/app/models/spree/variant.rb +211 -62
  253. data/app/models/spree/wished_item.rb +1 -1
  254. data/app/models/spree/wishlist.rb +1 -1
  255. data/app/models/spree/zone.rb +1 -1
  256. data/app/models/spree/zone_member.rb +1 -1
  257. data/app/presenters/spree/csv/order_line_item_presenter.rb +145 -0
  258. data/app/presenters/spree/csv/product_presenter.rb +63 -0
  259. data/app/presenters/spree/csv/product_variant_presenter.rb +130 -0
  260. data/app/services/spree/addresses/create.rb +31 -6
  261. data/app/services/spree/addresses/helper.rb +7 -4
  262. data/app/services/spree/addresses/update.rb +79 -12
  263. data/app/services/spree/cart/remove_out_of_stock_items.rb +56 -0
  264. data/app/services/spree/checkout/add_store_credit.rb +6 -1
  265. data/app/services/spree/checkout/advance.rb +44 -4
  266. data/app/services/spree/checkout/select_shipping_method.rb +2 -0
  267. data/app/services/spree/coupon_codes/bulk_generate.rb +37 -0
  268. data/app/services/spree/coupon_codes/coupon_codes_handler.rb +34 -0
  269. data/app/services/spree/orders/create_user_account.rb +70 -0
  270. data/app/services/spree/orders/update_contact_information.rb +19 -0
  271. data/app/services/spree/products/auto_match_taxons.rb +64 -0
  272. data/app/services/spree/products/duplicator.rb +121 -0
  273. data/app/services/spree/products/prepare_nested_attributes.rb +169 -0
  274. data/app/services/spree/seeds/admin_user.rb +22 -0
  275. data/app/services/spree/seeds/all.rb +1 -0
  276. data/app/services/spree/seeds/stores.rb +5 -10
  277. data/app/services/spree/seeds/zones.rb +2 -0
  278. data/app/services/spree/tags/bulk_add.rb +38 -0
  279. data/app/services/spree/tags/bulk_remove.rb +24 -0
  280. data/app/services/spree/taxons/add_products.rb +39 -0
  281. data/app/services/spree/taxons/regenerate_products.rb +53 -0
  282. data/app/services/spree/taxons/remove_products.rb +53 -0
  283. data/app/services/spree/taxons/touch_featured_sections.rb +21 -0
  284. data/app/services/spree/themes/duplicator.rb +40 -0
  285. data/app/services/spree/variants/remove_line_items.rb +1 -1
  286. data/app/sorters/spree/classifications/sort.rb +68 -0
  287. data/app/sorters/spree/products/sort.rb +2 -3
  288. data/app/views/action_text/video_embeds/_thumbnail.html.erb +1 -0
  289. data/app/views/action_text/video_embeds/_video_embed.html.erb +3 -0
  290. data/app/views/active_storage/blobs/_blob.html.erb +20 -0
  291. data/app/views/layouts/action_text/contents/_content.html.erb +3 -0
  292. data/app/views/layouts/spree/base_mailer.html.erb +46 -0
  293. data/app/views/spree/addresses/_form.html.erb +58 -0
  294. data/app/views/spree/addresses/_suggestions_box.erb +14 -0
  295. data/app/views/spree/export_mailer/export_done.html.erb +15 -0
  296. data/app/views/spree/report_mailer/report_done.html.erb +15 -0
  297. data/app/views/spree/shared/_base_mailer_footer.html.erb +12 -0
  298. data/app/views/spree/shared/_base_mailer_header.html.erb +6 -0
  299. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +456 -0
  300. data/app/views/spree/shared/_google_places_api_loader.html.erb +7 -0
  301. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  302. data/app/views/spree/shared/_mailer_logo.html.erb +41 -0
  303. data/app/views/spree/shared/_payment.html.erb +41 -0
  304. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  305. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  306. data/config/i18n-tasks.yml +178 -0
  307. data/config/importmap.rb +14 -0
  308. data/config/initializers/acts_as_taggable_on.rb +2 -0
  309. data/config/initializers/inflections.rb +2 -0
  310. data/config/initializers/mobility.rb +4 -0
  311. data/config/initializers/oembed.rb +1 -0
  312. data/config/locales/en.yml +823 -413
  313. data/config/routes.rb +6 -5
  314. data/db/migrate/20210914000000_spree_four_three.rb +0 -79
  315. data/db/migrate/20240913143518_change_default_value_of_spree_option_types_filterable.rb +5 -0
  316. data/db/migrate/20240914153106_add_display_on_to_spree_properties.rb +5 -0
  317. data/db/migrate/20240915144935_add_position_to_spree_properties.rb +6 -0
  318. data/db/migrate/20241004181911_create_spree_coupon_codes.rb +15 -0
  319. data/db/migrate/20241005093437_add_multi_code_to_spree_promotions.rb +14 -0
  320. data/db/migrate/20241014140140_translate_rich_texts.rb +17 -0
  321. data/db/migrate/20241030134309_create_spree_exports.rb +23 -0
  322. data/db/migrate/20241104083457_migrate_spree_promotion_rules_option_value_eligible_values.rb +16 -0
  323. data/db/migrate/20241123110646_add_estimated_transit_fields_to_spree_shipping_methods.rb +6 -0
  324. data/db/migrate/20241127193411_create_spree_taxon_rules.rb +13 -0
  325. data/db/migrate/20241127223627_add_rules_match_policy_and_sort_order_to_spree_taxons.rb +6 -0
  326. data/db/migrate/20241128103947_add_automatic_to_spree_taxons.rb +5 -0
  327. data/db/migrate/20241218183905_add_gateway_customer_profile_id_to_spree_payment_sources.rb +5 -0
  328. data/db/migrate/20250107220432_add_accept_marketing_and_signup_for_an_account_to_spree_orders.rb +6 -0
  329. data/db/migrate/20250110171203_add_quick_checkout_to_spree_addresses.rb +6 -0
  330. data/db/migrate/20250113180019_add_preferences_to_spree_stores.rb +5 -0
  331. data/db/migrate/20250114193857_add_metadata_to_spree_stores.rb +13 -0
  332. data/db/migrate/20250119165904_create_spree_custom_domains.rb +22 -0
  333. data/db/migrate/20250120094216_create_page_builder_models.rb +78 -0
  334. data/db/migrate/20250120152208_add_default_locale_to_action_text_rich_texts.rb +7 -0
  335. data/db/migrate/20250121160028_create_spree_posts_and_spree_post_categories.rb +33 -0
  336. data/db/migrate/20250122113708_add_first_and_last_name_to_spree_admin_class.rb +9 -0
  337. data/db/migrate/20250123135358_add_custom_code_fields_to_spree_store.rb +7 -0
  338. data/db/migrate/20250127083740_add_kind_to_spree_properties.rb +5 -0
  339. data/db/migrate/20250127112758_add_latitude_and_longitude_to_spree_addresses.rb +6 -0
  340. data/db/migrate/20250127151258_add_phone_to_spree_users.rb +5 -0
  341. data/db/migrate/20250204162453_create_spree_reports.rb +13 -0
  342. data/db/migrate/20250207084000_add_accepts_email_marketing_field_to_spree_users_table.rb +6 -0
  343. data/db/migrate/20250217171018_create_action_text_video_embeds.rb +11 -0
  344. data/db/migrate/20250304115943_add_performed_by_to_spree_reimbursements.rb +5 -0
  345. data/db/migrate/20250305121352_remove_page_builder_indices.rb +11 -0
  346. data/db/migrate/20250305121657_remove_spree_posts_indices.rb +7 -0
  347. data/db/migrate/20250311105934_create_spree_gateway_customers.rb +18 -0
  348. data/db/migrate/20250312202705_add_unique_index_on_promotion_rules_associations.rb +75 -0
  349. data/db/migrate/20250313104226_add_user_type_to_spree_role_users.rb +18 -0
  350. data/db/migrate/20250313175830_add_unique_index_on_promotion_action_line_items.rb +29 -0
  351. data/db/migrate/20250314144210_create_spree_taggings_and_spree_tags.rb +38 -0
  352. data/lib/generators/spree/authentication/custom/custom_generator.rb +49 -0
  353. data/lib/generators/spree/authentication/custom/templates/authentication_helpers.rb.tt +50 -0
  354. data/lib/generators/spree/authentication/devise/devise_generator.rb +57 -0
  355. data/lib/generators/spree/authentication/devise/templates/authentication_helpers.rb.tt +50 -0
  356. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  357. data/lib/generators/spree/dummy/templates/rails/database.yml +1 -0
  358. data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
  359. data/lib/generators/spree/install/install_generator.rb +21 -36
  360. data/lib/generators/spree/install/templates/config/initializers/spree.rb +40 -6
  361. data/lib/normalize_string.rb +18 -0
  362. data/lib/spree/analytics.rb +11 -0
  363. data/lib/spree/core/components.rb +1 -1
  364. data/lib/spree/core/configuration.rb +14 -11
  365. data/lib/spree/core/controller_helpers/auth.rb +0 -26
  366. data/lib/spree/core/controller_helpers/order.rb +77 -12
  367. data/lib/spree/core/controller_helpers/search.rb +2 -0
  368. data/lib/spree/core/controller_helpers/store.rb +0 -5
  369. data/lib/spree/core/controller_helpers/strong_parameters.rb +4 -0
  370. data/lib/spree/core/controller_helpers/turbo.rb +19 -0
  371. data/lib/spree/core/dependencies.rb +3 -5
  372. data/lib/spree/core/engine.rb +158 -7
  373. data/lib/spree/core/preferences/configuration.rb +2 -44
  374. data/lib/spree/core/preferences/preferable.rb +9 -0
  375. data/lib/spree/core/preferences/preferable_class_methods.rb +11 -1
  376. data/lib/spree/core/preferences/runtime_configuration.rb +13 -2
  377. data/lib/spree/core/search/base.rb +2 -0
  378. data/lib/spree/core/version.rb +1 -1
  379. data/lib/spree/core.rb +61 -11
  380. data/lib/spree/i18n.rb +5 -8
  381. data/lib/spree/migrations.rb +1 -1
  382. data/lib/spree/permitted_attributes.rb +24 -15
  383. data/lib/spree/testing_support/authorization_helpers.rb +9 -6
  384. data/lib/spree/testing_support/capybara_config.rb +11 -0
  385. data/lib/spree/testing_support/common_rake.rb +20 -12
  386. data/lib/spree/testing_support/factories/calculator_factory.rb +16 -0
  387. data/lib/spree/testing_support/factories/country_factory.rb +8 -0
  388. data/lib/spree/testing_support/factories/coupon_code_factory.rb +7 -0
  389. data/lib/spree/testing_support/factories/custom_domain_factory.rb +7 -0
  390. data/lib/spree/testing_support/factories/export_factory.rb +32 -0
  391. data/lib/spree/testing_support/factories/gateway_customer_factory.rb +7 -0
  392. data/lib/spree/testing_support/factories/order_factory.rb +14 -3
  393. data/lib/spree/testing_support/factories/page_block_factory.rb +21 -0
  394. data/lib/spree/testing_support/factories/page_factory.rb +33 -0
  395. data/lib/spree/testing_support/factories/page_link_factory.rb +7 -0
  396. data/lib/spree/testing_support/factories/page_section_factory.rb +24 -0
  397. data/lib/spree/testing_support/factories/payment_factory.rb +2 -2
  398. data/lib/spree/testing_support/factories/post_category_factory.rb +7 -0
  399. data/lib/spree/testing_support/factories/post_factory.rb +10 -0
  400. data/lib/spree/testing_support/factories/product_factory.rb +3 -8
  401. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  402. data/lib/spree/testing_support/factories/promotion_action_factory.rb +5 -0
  403. data/lib/spree/testing_support/factories/promotion_factory.rb +7 -9
  404. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +12 -0
  405. data/lib/spree/testing_support/factories/property_factory.rb +1 -1
  406. data/lib/spree/testing_support/factories/report_factory.rb +33 -0
  407. data/lib/spree/testing_support/factories/role_user_factory.rb +7 -0
  408. data/lib/spree/testing_support/factories/shipping_method_factory.rb +9 -0
  409. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +5 -2
  410. data/lib/spree/testing_support/factories/store_factory.rb +6 -9
  411. data/lib/spree/testing_support/factories/taxon_factory.rb +13 -0
  412. data/lib/spree/testing_support/factories/taxon_rule_factory.rb +38 -0
  413. data/lib/spree/testing_support/factories/theme_factory.rb +14 -0
  414. data/lib/spree/testing_support/factories/user_factory.rb +13 -11
  415. data/lib/spree/testing_support/factories/variant_factory.rb +23 -5
  416. data/lib/spree/testing_support/jobs.rb +1 -7
  417. data/lib/spree/testing_support/metadata.rb +13 -1
  418. data/lib/spree/testing_support/order_walkthrough.rb +1 -7
  419. data/lib/spree/testing_support/preferences.rb +1 -4
  420. data/lib/spree/testing_support/store.rb +26 -0
  421. data/lib/spree_core.rb +1 -0
  422. data/vendor/javascript/@rails--request.js.js +4 -0
  423. data/vendor/javascript/@stimulus-components--auto-submit.js +4 -0
  424. data/vendor/javascript/stimulus-reveal-controller.js +4 -0
  425. data/vendor/javascript/tailwindcss-stimulus-components.js +4 -0
  426. metadata +340 -197
  427. data/Gemfile +0 -3
  428. data/app/finders/spree/cms_pages/find.rb +0 -41
  429. data/app/finders/spree/menus/find.rb +0 -11
  430. data/app/models/concerns/spree/display_link.rb +0 -30
  431. data/app/models/spree/cms/pages/feature_page.rb +0 -7
  432. data/app/models/spree/cms/pages/homepage.rb +0 -20
  433. data/app/models/spree/cms/pages/standard_page.rb +0 -4
  434. data/app/models/spree/cms/sections/featured_article.rb +0 -22
  435. data/app/models/spree/cms/sections/hero_image.rb +0 -38
  436. data/app/models/spree/cms/sections/image_gallery.rb +0 -97
  437. data/app/models/spree/cms/sections/product_carousel.rb +0 -14
  438. data/app/models/spree/cms/sections/rich_text_content.rb +0 -13
  439. data/app/models/spree/cms/sections/side_by_side_images.rb +0 -68
  440. data/app/models/spree/cms_page.rb +0 -70
  441. data/app/models/spree/cms_section.rb +0 -69
  442. data/app/models/spree/cms_section_image.rb +0 -9
  443. data/app/models/spree/cms_section_image_one.rb +0 -4
  444. data/app/models/spree/cms_section_image_three.rb +0 -4
  445. data/app/models/spree/cms_section_image_two.rb +0 -4
  446. data/app/models/spree/icon.rb +0 -7
  447. data/app/models/spree/linkable/homepage.rb +0 -3
  448. data/app/models/spree/linkable/uri.rb +0 -3
  449. data/app/models/spree/menu.rb +0 -66
  450. data/app/models/spree/menu_item.rb +0 -72
  451. data/brakeman.ignore +0 -328
  452. data/db/migrate/20211201202851_update_linkable_resource_types.rb +0 -10
  453. data/db/migrate/20220329113557_fix_cms_pages_unique_indexes.rb +0 -8
  454. data/lib/generators/spree/custom_authentication/custom_authentication_generator.rb +0 -23
  455. data/lib/generators/spree/custom_authentication/templates/authentication_helpers.rb.tt +0 -23
  456. data/lib/generators/spree/custom_user/custom_user_generator.rb +0 -46
  457. data/lib/generators/spree/custom_user/templates/current_user_helpers.rb.tt +0 -15
  458. data/lib/generators/spree/custom_user/templates/initializer.rb.tt +0 -1
  459. data/lib/generators/spree/custom_user/templates/migration.rb.tt +0 -7
  460. data/lib/generators/spree/dummy/templates/package.json +0 -12
  461. data/lib/spree/core/product_duplicator.rb +0 -85
  462. data/lib/spree/core/runtime_configuration.rb +0 -10
  463. data/lib/spree/testing_support/factories/cms_page_factory.rb +0 -20
  464. data/lib/spree/testing_support/factories/cms_section_factory.rb +0 -31
  465. data/lib/spree/testing_support/factories/icon_factory.rb +0 -9
  466. data/lib/spree/testing_support/factories/menu_factory.rb +0 -16
  467. data/lib/spree/testing_support/factories/menu_item_factory.rb +0 -10
  468. data/script/rails +0 -9
  469. data/spec/fixtures/favicon.ico +0 -0
  470. data/spec/fixtures/files/icon_256x256.gif +0 -0
  471. data/spec/fixtures/files/icon_256x256.png +0 -0
  472. data/spec/fixtures/files/icon_512x512.png +0 -0
  473. data/spec/fixtures/files/img_256x128.png +0 -0
  474. data/spec/fixtures/text-file.txt +0 -1
  475. data/spec/fixtures/thinking-cat.jpg +0 -0
  476. data/spree_core.gemspec +0 -62
@@ -1,72 +0,0 @@
1
- module Spree
2
- class MenuItem < Spree::Base
3
- include Spree::DisplayLink
4
- if defined?(Spree::Webhooks::HasWebhooks)
5
- include Spree::Webhooks::HasWebhooks
6
- end
7
-
8
- acts_as_nested_set dependent: :destroy
9
-
10
- ITEM_TYPE = %w[Link Container]
11
- LINKED_RESOURCE_TYPE = ['Spree::Linkable::Uri', 'Spree::Linkable::Homepage', 'Spree::Product', 'Spree::Taxon', 'Spree::CmsPage']
12
-
13
- belongs_to :menu, touch: true
14
-
15
- before_create :ensure_item_belongs_to_root
16
- before_update :reset_link_attributes
17
- before_save :paremeterize_code
18
-
19
- after_save :touch_ancestors_and_menu
20
- after_touch :touch_ancestors_and_menu
21
-
22
- validates :name, :menu, presence: true
23
- validates :item_type, inclusion: { in: ITEM_TYPE }
24
- validates :linked_resource_type, inclusion: { in: LINKED_RESOURCE_TYPE }
25
-
26
- has_one :icon, as: :viewable, dependent: :destroy, class_name: 'Spree::Icon'
27
- accepts_nested_attributes_for :icon, reject_if: :all_blank
28
-
29
- def container?
30
- item_type == 'Container'
31
- end
32
-
33
- def code?(item_code = nil)
34
- if item_code
35
- code == item_code
36
- else
37
- code.present?
38
- end
39
- end
40
-
41
- private
42
-
43
- def reset_link_attributes
44
- if linked_resource_type_changed? || item_type == 'Container'
45
- self.linked_resource_id = nil
46
- self.destination = nil
47
- self.new_window = false
48
-
49
- self.linked_resource_type = 'Spree::Linkable::Uri' if item_type == 'Container'
50
- end
51
- end
52
-
53
- def ensure_item_belongs_to_root
54
- if menu.try(:root).present? && parent_id.nil?
55
- self.parent = menu.root
56
-
57
- store_new_parent
58
- end
59
- end
60
-
61
- def touch_ancestors_and_menu
62
- ancestors.update_all(updated_at: Time.current)
63
- menu.try!(:touch)
64
- end
65
-
66
- def paremeterize_code
67
- return if code.blank?
68
-
69
- self.code = code.parameterize
70
- end
71
- end
72
- end
data/brakeman.ignore DELETED
@@ -1,328 +0,0 @@
1
- {
2
- "ignored_warnings": [
3
- {
4
- "warning_type": "SQL Injection",
5
- "warning_code": 0,
6
- "fingerprint": "011b2643940ba1112f7a737e403abe3616ad91764703c801cc35a48d36b721da",
7
- "check_name": "SQL",
8
- "message": "Possible SQL injection",
9
- "file": "app/models/concerns/spree/product_scopes.rb",
10
- "line": 64,
11
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
12
- "code": "where(\"#{price_table_name}.amount <= ?\", price)",
13
- "render_path": null,
14
- "location": {
15
- "type": "method",
16
- "class": "Spree",
17
- "method": null
18
- },
19
- "user_input": "price_table_name",
20
- "confidence": "Medium",
21
- "cwe_id": [
22
- 89
23
- ],
24
- "note": "interpolating table name"
25
- },
26
- {
27
- "warning_type": "Redirect",
28
- "warning_code": 18,
29
- "fingerprint": "05d3870f66d650510c859a8949d5686b05eb028825083b096d0f65fedf80b118",
30
- "check_name": "Redirect",
31
- "message": "Possible unprotected redirect",
32
- "file": "lib/spree/core/controller_helpers/auth.rb",
33
- "line": 25,
34
- "link": "https://brakemanscanner.org/docs/warning_types/redirect/",
35
- "code": "redirect_to((session[\"spree_user_return_to\"] or (request.env[\"HTTP_REFERER\"] or default)))",
36
- "render_path": null,
37
- "location": {
38
- "type": "method",
39
- "class": "Spree::Core::ControllerHelpers::Auth",
40
- "method": "redirect_back_or_default"
41
- },
42
- "user_input": "request.env[\"HTTP_REFERER\"]",
43
- "confidence": "High",
44
- "cwe_id": [
45
- 601
46
- ],
47
- "note": ""
48
- },
49
- {
50
- "warning_type": "SQL Injection",
51
- "warning_code": 0,
52
- "fingerprint": "1c12fcb833b0ddffa07880acb7e604922c0d1d52de598316186241baf16551cd",
53
- "check_name": "SQL",
54
- "message": "Possible SQL injection",
55
- "file": "app/finders/spree/taxons/find.rb",
56
- "line": 75,
57
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
58
- "code": "taxons.joins(\"INNER JOIN #{Spree::Taxon.table_name} AS parent_taxon ON parent_taxon.id = #{Spree::Taxon.table_name}.parent_id\").join_translation_table(Taxon, \"parent_taxon\").where([\"#{Taxon.translation_table_alias}.permalink = ?\", parent_permalink])",
59
- "render_path": null,
60
- "location": {
61
- "type": "method",
62
- "class": "Spree::Taxons::Find",
63
- "method": "by_parent_permalink"
64
- },
65
- "user_input": "Taxon.translation_table_alias",
66
- "confidence": "Weak",
67
- "cwe_id": [
68
- 89
69
- ],
70
- "note": ""
71
- },
72
- {
73
- "warning_type": "SQL Injection",
74
- "warning_code": 0,
75
- "fingerprint": "1f02952550c2f54d044c9577a45e7ba7c7990c8b8a59d1dac83a96790237f507",
76
- "check_name": "SQL",
77
- "message": "Possible SQL injection",
78
- "file": "app/models/concerns/spree/product_scopes.rb",
79
- "line": 139,
80
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
81
- "code": "joins(:properties).join_translation_table(Property).join_translation_table(ProductProperty).where(\"#{ProductProperty.translation_table_alias}.value = ?\", value)",
82
- "render_path": null,
83
- "location": {
84
- "type": "method",
85
- "class": "Spree::ProductScopes",
86
- "method": null
87
- },
88
- "user_input": "ProductProperty.translation_table_alias",
89
- "confidence": "Weak",
90
- "cwe_id": [
91
- 89
92
- ],
93
- "note": ""
94
- },
95
- {
96
- "warning_type": "SQL Injection",
97
- "warning_code": 0,
98
- "fingerprint": "7928c0813a0bf084ead091b4554ef6abea9ae9c7167936f5c62da9e328b9f736",
99
- "check_name": "SQL",
100
- "message": "Possible SQL injection",
101
- "file": "app/models/concerns/spree/product_scopes.rb",
102
- "line": 139,
103
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
104
- "code": "joins(:properties).join_translation_table(Property).join_translation_table(ProductProperty).where(\"#{ProductProperty.translation_table_alias}.value = ?\", value)",
105
- "render_path": null,
106
- "location": {
107
- "type": "method",
108
- "class": "Spree",
109
- "method": null
110
- },
111
- "user_input": "ProductProperty.translation_table_alias",
112
- "confidence": "Weak",
113
- "cwe_id": [
114
- 89
115
- ],
116
- "note": ""
117
- },
118
- {
119
- "warning_type": "SQL Injection",
120
- "warning_code": 0,
121
- "fingerprint": "857c335935a00f584137f31dbcb1a4532af5c8bb5cf53a86058b4af98c6597dc",
122
- "check_name": "SQL",
123
- "message": "Possible SQL injection",
124
- "file": "lib/spree/translation_migrations.rb",
125
- "line": 21,
126
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
127
- "code": "ActiveRecord::Base.connection.execute(\"\\n UPDATE #{resource_class.table_name}\\n SET #{resource_class.translatable_fields.map do\n \"#{f}=null\"\n end.join(\", \")};\\n \")",
128
- "render_path": null,
129
- "location": {
130
- "type": "method",
131
- "class": "Spree::TranslationMigrations",
132
- "method": "transfer_translation_data"
133
- },
134
- "user_input": "resource_class.translatable_fields.map do\n \"#{f}=null\"\n end.join(\", \")",
135
- "confidence": "Medium",
136
- "cwe_id": [
137
- 89
138
- ],
139
- "note": ""
140
- },
141
- {
142
- "warning_type": "SQL Injection",
143
- "warning_code": 0,
144
- "fingerprint": "965d3919f811ab63b7b8d62da528559a7f38dc122c57efea7136e7ec5ef1f062",
145
- "check_name": "SQL",
146
- "message": "Possible SQL injection",
147
- "file": "app/models/concerns/spree/product_scopes.rb",
148
- "line": 68,
149
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
150
- "code": "where(\"#{price_table_name}.amount >= ?\", price)",
151
- "render_path": null,
152
- "location": {
153
- "type": "method",
154
- "class": "Spree::ProductScopes",
155
- "method": null
156
- },
157
- "user_input": "price_table_name",
158
- "confidence": "Medium",
159
- "cwe_id": [
160
- 89
161
- ],
162
- "note": "interpolating table name"
163
- },
164
- {
165
- "warning_type": "SQL Injection",
166
- "warning_code": 0,
167
- "fingerprint": "98607ecfb86c2d3c2567390f813861edbc42d6ffa9f482afb7c0b3464eaf6e73",
168
- "check_name": "SQL",
169
- "message": "Possible SQL injection",
170
- "file": "app/models/concerns/spree/translatable_resource_scopes.rb",
171
- "line": 18,
172
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
173
- "code": "joins(\"LEFT OUTER JOIN #{translatable_class::Translation.table_name} #{translatable_class.translation_table_alias}\\n ON #{translatable_class.translation_table_alias}.#{\"#{translatable_class.table_name.singularize}_id\"} = #{(translatable_class.table_name or join_on_table_alias)}.id\\n AND #{translatable_class.translation_table_alias}.locale = '#{Mobility.locale}'\")",
174
- "render_path": null,
175
- "location": {
176
- "type": "method",
177
- "class": "Spree::TranslatableResourceScopes",
178
- "method": "join_translation_table"
179
- },
180
- "user_input": "translatable_class.translation_table_alias",
181
- "confidence": "Medium",
182
- "cwe_id": [
183
- 89
184
- ],
185
- "note": ""
186
- },
187
- {
188
- "warning_type": "SQL Injection",
189
- "warning_code": 0,
190
- "fingerprint": "abd8e90e7a7dfbcdcd6d44fd3fb550598aee6d7a9ef2bb132ad1a18a3c50be30",
191
- "check_name": "SQL",
192
- "message": "Possible SQL injection",
193
- "file": "app/models/concerns/spree/product_scopes.rb",
194
- "line": 64,
195
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
196
- "code": "where(\"#{price_table_name}.amount <= ?\", price)",
197
- "render_path": null,
198
- "location": {
199
- "type": "method",
200
- "class": "Spree::ProductScopes",
201
- "method": null
202
- },
203
- "user_input": "price_table_name",
204
- "confidence": "Medium",
205
- "cwe_id": [
206
- 89
207
- ],
208
- "note": "interpolating table name"
209
- },
210
- {
211
- "warning_type": "SQL Injection",
212
- "warning_code": 0,
213
- "fingerprint": "c1c97347a2d74ea41d46519e3bfbd94c511a1bd9c285f3f2a1fa0cb7e624d232",
214
- "check_name": "SQL",
215
- "message": "Possible SQL injection",
216
- "file": "lib/spree/translation_migrations.rb",
217
- "line": 32,
218
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
219
- "code": "ActiveRecord::Base.connection.execute(\"\\n UPDATE #{resource_class.table_name}\\n SET (#{resource_class.translatable_fields.join(\", \")}) = #{(\"ROW\" or \"\")}(#{resource_class.translatable_fields.map do\n \"#{resource_class::Translation.table_name}.#{f}\"\n end.join(\", \")})\\n FROM #{resource_class::Translation.table_name}\\n WHERE #{resource_class::Translation.table_name}.#{\"#{resource_class.table_name.singularize}_id\"} = #{resource_class.table_name}.id\\n \")",
220
- "render_path": null,
221
- "location": {
222
- "type": "method",
223
- "class": "Spree::TranslationMigrations",
224
- "method": "revert_translation_data_transfer"
225
- },
226
- "user_input": "resource_class.translatable_fields.join(\", \")",
227
- "confidence": "Medium",
228
- "cwe_id": [
229
- 89
230
- ],
231
- "note": ""
232
- },
233
- {
234
- "warning_type": "SQL Injection",
235
- "warning_code": 0,
236
- "fingerprint": "c2bc48d98076b7c4fc3314c6a85f7bd1132efe5fcc346da4d28df7c25f93633f",
237
- "check_name": "SQL",
238
- "message": "Possible SQL injection",
239
- "file": "app/models/spree/variant.rb",
240
- "line": 126,
241
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
242
- "code": "joins(:product).join_translation_table(Product).where(\"LOWER(#{Product.translation_table_alias}.name) LIKE LOWER(:query)\\n OR LOWER(sku) LIKE LOWER(:query)\", :query => (\"%#{query}%\"))",
243
- "render_path": null,
244
- "location": {
245
- "type": "method",
246
- "class": "Spree::Variant",
247
- "method": "Spree::Variant.product_name_or_sku_cont"
248
- },
249
- "user_input": "Product.translation_table_alias",
250
- "confidence": "Weak",
251
- "cwe_id": [
252
- 89
253
- ],
254
- "note": ""
255
- },
256
- {
257
- "warning_type": "SQL Injection",
258
- "warning_code": 0,
259
- "fingerprint": "ed253ae6b1b4ea3fe3d87d3652380fecab80133319b1ed041d98d163fd16b815",
260
- "check_name": "SQL",
261
- "message": "Possible SQL injection",
262
- "file": "app/finders/spree/taxons/find.rb",
263
- "line": 71,
264
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
265
- "code": "taxons.joins(:parent).join_translation_table(Taxon, \"parents_spree_taxons\").where([\"#{Taxon.translation_table_alias}.permalink = ?\", parent_permalink])",
266
- "render_path": null,
267
- "location": {
268
- "type": "method",
269
- "class": "Spree::Taxons::Find",
270
- "method": "by_parent_permalink"
271
- },
272
- "user_input": "Taxon.translation_table_alias",
273
- "confidence": "Weak",
274
- "cwe_id": [
275
- 89
276
- ],
277
- "note": ""
278
- },
279
- {
280
- "warning_type": "SQL Injection",
281
- "warning_code": 0,
282
- "fingerprint": "efcc57e1a5648d7db59d1beaf5e399d2278539a8667b19c520b305a6ca7e15e8",
283
- "check_name": "SQL",
284
- "message": "Possible SQL injection",
285
- "file": "app/models/concerns/spree/product_scopes.rb",
286
- "line": 68,
287
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
288
- "code": "where(\"#{price_table_name}.amount >= ?\", price)",
289
- "render_path": null,
290
- "location": {
291
- "type": "method",
292
- "class": "Spree",
293
- "method": null
294
- },
295
- "user_input": "price_table_name",
296
- "confidence": "Medium",
297
- "cwe_id": [
298
- 89
299
- ],
300
- "note": "interpolating table name"
301
- },
302
- {
303
- "warning_type": "SQL Injection",
304
- "warning_code": 0,
305
- "fingerprint": "f14dd62fac0dd1e9d5532dd5efc770e2eb873a8db80faf366b6295378634754a",
306
- "check_name": "SQL",
307
- "message": "Possible SQL injection",
308
- "file": "lib/spree/translation_migrations.rb",
309
- "line": 16,
310
- "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
311
- "code": "ActiveRecord::Base.connection.execute(\"\\n INSERT INTO #{resource_class::Translation.table_name} (#{resource_class.translatable_fields.join(\", \")}, #{\"#{resource_class.table_name.singularize}_id\"}, locale, created_at, updated_at)\\n SELECT #{resource_class.translatable_fields.join(\", \")}, id, '#{default_locale}' as locale, created_at, updated_at FROM #{resource_class.table_name};\\n \")",
312
- "render_path": null,
313
- "location": {
314
- "type": "method",
315
- "class": "Spree::TranslationMigrations",
316
- "method": "transfer_translation_data"
317
- },
318
- "user_input": "resource_class.translatable_fields.join(\", \")",
319
- "confidence": "Medium",
320
- "cwe_id": [
321
- 89
322
- ],
323
- "note": ""
324
- }
325
- ],
326
- "updated": "2023-03-22 20:11:32 +0100",
327
- "brakeman_version": "5.4.1"
328
- }
@@ -1,10 +0,0 @@
1
- class UpdateLinkableResourceTypes < ActiveRecord::Migration[5.2]
2
- def change
3
- change_column_default :spree_menu_items, :linked_resource_type, 'Spree::Linkable::Uri'
4
-
5
- Spree::MenuItem.where(linked_resource_type: 'URL').update_all(linked_resource_type: 'Spree::Linkable::Uri')
6
- Spree::CmsSection.where(linked_resource_type: 'URL').update_all(linked_resource_type: 'Spree::Linkable::Uri')
7
- Spree::MenuItem.where(linked_resource_type: 'Home Page').update_all(linked_resource_type: 'Spree::Linkable::Homepage')
8
- Spree::CmsSection.where(linked_resource_type: 'Home Page').update_all(linked_resource_type: 'Spree::Linkable::Homepage')
9
- end
10
- end
@@ -1,8 +0,0 @@
1
- class FixCmsPagesUniqueIndexes < ActiveRecord::Migration[5.2]
2
- def change
3
- remove_index :spree_cms_pages, [:slug, :store_id, :deleted_at]
4
- remove_index :spree_cms_pages, [:slug, :store_id], unique: true
5
-
6
- add_index :spree_cms_pages, [:slug, :store_id, :deleted_at], unique: true
7
- end
8
- end
@@ -1,23 +0,0 @@
1
- module Spree
2
- class CustomAuthenticationGenerator < Rails::Generators::Base
3
- desc 'Set up a Spree installation with a custom authentication helpers'
4
-
5
- def self.source_paths
6
- paths = superclass.source_paths
7
- paths << File.expand_path('templates', __dir__)
8
- paths.flatten
9
- end
10
-
11
- def generate
12
- template 'authentication_helpers.rb.tt', 'lib/spree/authentication_helpers.rb'
13
-
14
- file_action = File.exist?('config/initializers/spree.rb') ? :append_file : :create_file
15
- send(file_action, 'config/initializers/spree.rb') do
16
- %Q{
17
- Rails.application.config.to_prepare do
18
- require_dependency 'spree/authentication_helpers'
19
- end\n}
20
- end
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- module Spree
2
- module AuthenticationHelpers
3
- def self.included(receiver)
4
- receiver.send :helper_method, :spree_login_path
5
- receiver.send :helper_method, :spree_signup_path
6
- receiver.send :helper_method, :spree_logout_path
7
- end
8
-
9
- def spree_login_path
10
- main_app.login_path
11
- end
12
-
13
- def spree_signup_path
14
- main_app.signup_path
15
- end
16
-
17
- def spree_logout_path
18
- main_app.logout_path
19
- end
20
- end
21
- end
22
-
23
- ApplicationController.include Spree::AuthenticationHelpers if defined?(ApplicationController)
@@ -1,46 +0,0 @@
1
- module Spree
2
- class CustomUserGenerator < Rails::Generators::NamedBase
3
- include Rails::Generators::ResourceHelpers
4
- include Rails::Generators::Migration
5
-
6
- desc 'Set up a Spree installation with a custom User class'
7
-
8
- def self.source_paths
9
- paths = superclass.source_paths
10
- paths << File.expand_path('templates', __dir__)
11
- paths.flatten
12
- end
13
-
14
- def check_for_constant
15
- klass
16
- rescue NameError
17
- @shell.say "Couldn't find #{class_name}. Are you sure that this class exists within your application and is loaded?", :red
18
- exit(1)
19
- end
20
-
21
- def generate
22
- migration_template 'migration.rb.tt', 'db/migrate/add_spree_fields_to_custom_user_table.rb'
23
- template 'current_user_helpers.rb.tt', 'lib/spree/current_user_helpers.rb'
24
-
25
- file_action = File.exist?('config/initializers/spree.rb') ? :append_file : :create_file
26
- send(file_action, 'config/initializers/spree.rb') do
27
- %Q{
28
- Rails.application.config.to_prepare do
29
- require_dependency 'spree/current_user_helpers'
30
- end\n}
31
- end
32
- end
33
-
34
- def self.next_migration_number(dirname)
35
- format('%.3d', (current_migration_number(dirname) + 1))
36
- end
37
-
38
- def klass
39
- class_name.constantize
40
- end
41
-
42
- def table_name
43
- klass.table_name
44
- end
45
- end
46
- end
@@ -1,15 +0,0 @@
1
- module Spree
2
- module CurrentUserHelpers
3
- def self.included(receiver)
4
- receiver.send :helper_method, :spree_current_user
5
- end
6
-
7
- def spree_current_user
8
- current_user
9
- end
10
- end
11
- end
12
-
13
-
14
- ApplicationController.include Spree::CurrentUserHelpers if defined?(ApplicationController)
15
- Spree::Api::BaseController.include Spree::CurrentUserHelpers if defined?(Spree::Api::BaseController)
@@ -1 +0,0 @@
1
- Spree.user_class = "<%= class_name %>"
@@ -1,7 +0,0 @@
1
- class AddSpreeFieldsToCustomUserTable < ActiveRecord::Migration[4.2]
2
- def up
3
- add_column <%= table_name.inspect %>, :spree_api_key, :string, limit: 48
4
- add_column <%= table_name.inspect %>, :ship_address_id, :bigint
5
- add_column <%= table_name.inspect %>, :bill_address_id, :bigint
6
- end
7
- end
@@ -1,12 +0,0 @@
1
- {
2
- "name": "app",
3
- "private": "true",
4
- "dependencies": {
5
- "@hotwired/turbo-rails": "^7.2.0",
6
- "@spree/dashboard": "^0.2.1",
7
- "esbuild": "^0.15.10"
8
- },
9
- "scripts": {
10
- "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds"
11
- }
12
- }
@@ -1,85 +0,0 @@
1
- module Spree
2
- class ProductDuplicator
3
- attr_accessor :product
4
-
5
- @@clone_images_default = true
6
- mattr_accessor :clone_images_default
7
-
8
- def initialize(product, include_images = @@clone_images_default)
9
- @product = product
10
- @include_images = include_images
11
- end
12
-
13
- def duplicate
14
- new_product = duplicate_product
15
-
16
- # don't dup the actual variants, just the characterising types
17
- new_product.option_types = product.option_types if product.has_variants?
18
-
19
- # allow site to do some customization
20
- new_product.send(:duplicate_extra, product) if new_product.respond_to?(:duplicate_extra)
21
- new_product.save!
22
- new_product
23
- end
24
-
25
- protected
26
-
27
- def duplicate_product
28
- product.dup.tap do |new_product|
29
- new_product.translations.each do |t|
30
- t.name = "COPY OF #{t.name}"
31
- t.slug = nil
32
- end
33
-
34
- new_product.name = "COPY OF #{product.name}"
35
- new_product.taxons = product.taxons
36
- new_product.stores = product.stores
37
- new_product.created_at = nil
38
- new_product.deleted_at = nil
39
- new_product.updated_at = nil
40
- new_product.product_properties = reset_properties
41
- new_product.master = duplicate_master
42
- new_product.variants = product.variants.map { |variant| duplicate_variant variant }
43
- end
44
- end
45
-
46
- def duplicate_master
47
- master = product.master
48
- master.dup.tap do |new_master|
49
- new_master.sku = sku_generator(master.sku)
50
- new_master.deleted_at = nil
51
- new_master.images = master.images.map { |image| duplicate_image image } if @include_images
52
- new_master.price = master.price
53
- new_master.currency = master.currency
54
- end
55
- end
56
-
57
- def duplicate_variant(variant)
58
- new_variant = variant.dup
59
- new_variant.sku = sku_generator(new_variant.sku)
60
- new_variant.deleted_at = nil
61
- new_variant.option_values = variant.option_values.map { |option_value| option_value }
62
- new_variant
63
- end
64
-
65
- def duplicate_image(image)
66
- new_image = image.dup
67
- new_image.attachment.attach(image.attachment.blob)
68
- new_image.save!
69
- new_image
70
- end
71
-
72
- def reset_properties
73
- product.product_properties.map do |prop|
74
- prop.dup.tap do |new_prop|
75
- new_prop.created_at = nil
76
- new_prop.updated_at = nil
77
- end
78
- end
79
- end
80
-
81
- def sku_generator(sku)
82
- "COPY OF #{Variant.unscoped.where('sku like ?', "%#{sku}").order(:created_at).last.sku}"
83
- end
84
- end
85
- end
@@ -1,10 +0,0 @@
1
- require 'spree/core/preferences/runtime_configuration'
2
-
3
- module Spree
4
- module Core
5
- class RuntimeConfiguration < Preferences::RuntimeConfiguration
6
- preference :always_use_translations, :boolean, default: false
7
- preference :allow_empty_price_amount, :boolean, default: false
8
- end
9
- end
10
- end
@@ -1,20 +0,0 @@
1
- FactoryBot.define do
2
- factory :base_cms_page, class: Spree::CmsPage do
3
- title { generate(:random_string) }
4
- locale { 'en' }
5
-
6
- store
7
-
8
- factory :cms_homepage do
9
- type { 'Spree::Cms::Pages::Homepage' }
10
- end
11
-
12
- factory :cms_standard_page do
13
- type { 'Spree::Cms::Pages::StandardPage' }
14
- end
15
-
16
- factory :cms_feature_page do
17
- type { 'Spree::Cms::Pages::FeaturePage' }
18
- end
19
- end
20
- end