PluginProbe
Core Framework / trunk
Core Framework vtrunk
2.0.2 2.0.1 2.0.0 1.10.4 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.3.10 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.1.1 1.5.2 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.8.0 All 32 releases
core-framework / wp / Common / Utils / Vite.php

Vite.php in Core Framework trunk, at wp/Common/Utils/Vite.php

179 lines 4.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * CoreFramework
4 *
5 * @package CoreFramework
6 * @author Core Framework <hello@coreframework.com>
7 * @copyright 2023 Core Framework
8 * @license MIT
9 * @link https://coreframework.com
10 */
11
12 declare (strict_types = 1);
13
14 namespace CoreFramework\Common\Utils;
15
16 use CoreFramework\Config\Plugin;
17
18 /**
19 * Class Vite
20 *
21 * @package CoreFramework\App\Backend
22 * @since 0.0.0
23 */
24 class Vite {
25
26 /**
27 * Enqueue Vita files
28 *
29 * @since 0.0.0
30 */
31 public static function getPluginData(): array {
32 return Plugin::init()->data(); // CoreFramework()->getData()->version
33 }
34
35 private static function getDevFullPath(): string {
36 return 'https://' . CoreFramework()->getDevURL() . ':5173/';
37 }
38
39 public static function useVite( string $script = '', array $args = array() ) {
40 if ( ! $script ) {
41 return;
42 }
43
44 $has_js = $args['js'];
45 $has_style = $args['css'];
46
47 $has_js && self::jsPreloadImports( $script );
48 $has_style && self::cssTag( $script );
49 $has_js && self::enqueue( $script, $args['js_dep'], $args['in_footer'] );
50 return 'module/' . CORE_FRAMEWORK_ASSETS_PREFIX . $script;
51 }
52
53 /**
54 * Add preload links for vite files
55 *
56 * @param string $entry
57 * @return void
58 */
59 private static function jsPreloadImports( string $entry ): void {
60 unset( $entry );
61
62 /**
63 * Allows HMR to work properly. Only needed in development.
64 */
65 if ( self::getPluginData()['development'] ) {
66 \add_action(
67 'wp_print_scripts',
68 function (): void {
69 $url = self::getDevFullPath();
70 $refresh_runtime = \wp_json_encode( $url . '@react-refresh' );
71 $preamble = "import RefreshRuntime from {$refresh_runtime};\n"
72 . "window.RefreshRuntime = RefreshRuntime;\n"
73 . "RefreshRuntime.injectIntoGlobalHook(window);\n"
74 . "window.\$RefreshReg\$ = () => {};\n"
75 . "window.\$RefreshSig\$ = () => (type) => type;\n"
76 . 'window.__vite_plugin_react_preamble_installed__ = true;';
77
78 \wp_print_inline_script_tag( $preamble, array( 'type' => 'module' ) );
79 \wp_print_script_tag(
80 array(
81 'type' => 'module',
82 'src' => \esc_url( $url . '@vite/client' ),
83 )
84 );
85 },
86 99
87 );
88 }
89 }
90
91 private static function cssTag( string $entry ): string {
92 // not needed on dev, it's inject by Vite
93 // prettier-ignore
94 if ( self::getPluginData()['development'] ) {
95 return '';
96 }
97
98 $tags = '';
99 foreach ( self::cssUrls( $entry ) as $url ) {
100 \wp_enqueue_style(
101 CORE_FRAMEWORK_ASSETS_PREFIX . $entry,
102 $url,
103 array(),
104 self::getPluginData()['version']
105 );
106 }
107
108 return $tags;
109 }
110
111 private static function enqueue( $entry, $deps, $in_footer ) {
112 $url = self::getPluginData()['development'] ? self::getDevFullPath() . $entry : self::assetUrl( $entry );
113
114 // prettier-ignore
115 if ( ! $url ) {
116 return '';
117 }
118
119 \wp_enqueue_script(
120 'module/' . CORE_FRAMEWORK_ASSETS_PREFIX . $entry,
121 $url,
122 $deps,
123 self::getPluginData()['development'] ?? self::getPluginData()['version'],
124 $in_footer
125 );
126 }
127
128 // ? Helpers to locate files
129
130 private static function getManifest(): array {
131 $fName = '.vite/manifest.json';
132 $fPath = CORE_FRAMEWORK_DIR_ROOT . 'dist/' . $fName;
133 if ( file_exists( $fPath ) ) {
134 $content = file_get_contents( $fPath );
135 return json_decode( $content, true, 512, JSON_THROW_ON_ERROR );
136 }
137
138 return array();
139 }
140
141 private static function assetUrl( string $entry ): string {
142 $manifest = self::getManifest();
143 return isset( $manifest[ $entry ] )
144 ? CORE_FRAMEWORK_DIR_URL . 'dist/' . $manifest[ $entry ]['file']
145 : CORE_FRAMEWORK_DIR_URL . 'dist/' . $entry;
146 }
147
148 private static function getPublicURLBase() {
149 // return IS_DEVELOPMENT ? '/dist/' : CORE_FRAMEWORK_DIR_URL . 'dist/';
150 return self::getPluginData()['development'] ? '/' : CORE_FRAMEWORK_DIR_URL . 'dist/';
151 }
152
153 private static function importsUrls( string $entry ): array {
154 $urls = array();
155 $manifest = self::getManifest();
156
157 if ( ! empty( $manifest[ $entry ]['imports'] ) ) {
158 foreach ( $manifest[ $entry ]['imports'] as $imports ) {
159 $urls[] = self::getPublicURLBase() . $manifest[ $imports ]['file'];
160 }
161 }
162
163 return $urls;
164 }
165
166 private static function cssUrls( string $entry ): array {
167 $urls = array();
168 $manifest = self::getManifest();
169
170 if ( ! empty( $manifest[ $entry ]['css'] ) ) {
171 foreach ( $manifest[ $entry ]['css'] as $file ) {
172 $urls[] = self::getPublicURLBase() . $file;
173 }
174 }
175
176 return $urls;
177 }
178 }
179