PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.13.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.13.0
4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / WordPress / Assets / PreloadService.php
surecart / app / src / WordPress / Assets Last commit date
AssetsService.php 2 years ago AssetsServiceProvider.php 3 years ago BlockAssetsLoadService.php 3 years ago PreloadService.php 3 years ago ScriptsService.php 2 years ago StylesService.php 3 years ago
PreloadService.php
138 lines
1 <?php
2 namespace SureCart\WordPress\Assets;
3
4 use SureCart\Support\Arrays;
5
6 /**
7 * Handles the preloading functionality for components.
8 */
9 class PreloadService {
10 /**
11 * The stats file path.
12 *
13 * @var string
14 */
15 protected $stats_file;
16
17 /**
18 * Components to preload.
19 *
20 * @var array
21 */
22 protected $components = [];
23
24 /**
25 * Get the stats file path
26 *
27 * @param string $stats_file The stats file path.
28 */
29 public function __construct( $stats_file ) {
30 $this->stats_file = $stats_file;
31 }
32
33 /**
34 * Bootstrap the preload.
35 *
36 * @return void
37 */
38 public function bootstrap() {
39 // add preload tags to head, footer as fallback.
40 add_action( 'wp_head', [ $this, 'renderComponents' ] );
41 add_action( 'wp_footer', [ $this, 'renderComponents' ] );
42 }
43
44 /**
45 * Get the bundle stats file.
46 *
47 * @return object|false;
48 */
49 protected function getStatsFile() {
50 if ( ! file_exists( $this->stats_file ) ) {
51 return false;
52 }
53 return wp_json_file_decode( $this->stats_file, [ 'associative' => true ] );
54 }
55
56 /**
57 * Get the filenames from the stats.
58 *
59 * @param array $components An array of component names.
60 * @param string $format The format we are using.
61 *
62 * @return array
63 */
64 public function getFileNames( $components, $format = 'esmBrowser' ) {
65 $json = $this->getStatsFile();
66 $entries = $json['formats'][ $format ] ?? [];
67
68 $set = array_map(
69 function( $element ) use ( $entries ) {
70 $files = [];
71 $collection_bundles = array_filter(
72 $entries,
73 function( $entry ) use ( $element ) {
74 return in_array( $element, $entry['components'], true );
75 }
76 );
77
78 foreach ( $collection_bundles as $bundle ) {
79 $files = array_merge( [ $bundle['fileName'] ], $bundle['imports'] );
80 }
81
82 return $files;
83 },
84 $components
85 );
86
87 return array_unique( Arrays::flatten( $set ) );
88 }
89
90 /**
91 * Render the components
92 *
93 * @return void
94 */
95 public function renderComponents() {
96 if ( ! empty( $this->components ) ) {
97 $this->renderTag( $this->components );
98 $this->components = [];
99 }
100 }
101
102 /**
103 * Render the preload tags.
104 *
105 * @param array $components An array of components.
106 * @param string $format The format.
107 * @param string $path The path to the component javascript file.
108 *
109 * @return void
110 */
111 public function renderTag( $components, $format = 'esmBrowser', $path = 'dist/components/surecart/' ) {
112 if ( empty( $components ) ) {
113 return;
114 }
115
116 $names = $this->getFileNames( $components, $format );
117
118 if ( empty( $names ) ) {
119 return;
120 }
121
122 foreach ( $names as $name ) {
123 echo "<link rel='preload' href='" . esc_url( trailingslashit( \SureCart::core()->assets()->getUrl() ) . trailingslashit( $path ) . $name ) . "' as='script' crossorigin />\n";
124 }
125 }
126
127 /**
128 * Add preload components.
129 *
130 * @param array $components Component names.
131 *
132 * @return void
133 */
134 public function add( $components ) {
135 $this->components = array_filter( array_unique( array_merge( $this->components, $components ) ) );
136 }
137 }
138