@elementor/generate-wordpress-asset-file-webpack-plugin 0.1.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.
- package/LICENSE +674 -0
- package/README.md +5 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.js +201 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +176 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +38 -0
- package/src/__tests__/__snapshots__/index.test.ts.snap +93 -0
- package/src/__tests__/index.test.ts +100 -0
- package/src/index.ts +263 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Compiler, Compilation, Chunk } from 'webpack';
|
|
2
|
+
|
|
3
|
+
type HandlesMap = {
|
|
4
|
+
exact: Record<string, string>;
|
|
5
|
+
startsWith: Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
type Options = {
|
|
8
|
+
handlePrefix: string;
|
|
9
|
+
handlesMap?: Partial<HandlesMap>;
|
|
10
|
+
apps?: string[];
|
|
11
|
+
extensions?: string[];
|
|
12
|
+
i18n?: {
|
|
13
|
+
domain: string;
|
|
14
|
+
replaceRequestedFile?: boolean;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
type NormalizedOptions = {
|
|
18
|
+
handlePrefix: string;
|
|
19
|
+
handlesMap: HandlesMap;
|
|
20
|
+
apps: string[];
|
|
21
|
+
extensions: string[];
|
|
22
|
+
i18n: {
|
|
23
|
+
domain: string | null;
|
|
24
|
+
replaceRequestedFile: boolean;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
declare class GenerateWordPressAssetFileWebpackPlugin {
|
|
28
|
+
options: NormalizedOptions;
|
|
29
|
+
constructor(options: Options);
|
|
30
|
+
apply(compiler: Compiler): void;
|
|
31
|
+
getDepsFromChunk(compilation: Compilation, chunk: Chunk): Set<string>;
|
|
32
|
+
createAssetsFileContent({ deps, i18n, entryName, }: {
|
|
33
|
+
deps: Set<string>;
|
|
34
|
+
i18n: NormalizedOptions['i18n'];
|
|
35
|
+
entryName: string;
|
|
36
|
+
}): string;
|
|
37
|
+
getLoaderFileContent(entriesData: Record<string, string>): string;
|
|
38
|
+
getEntryType(entryName: string): "extension" | "app" | "util";
|
|
39
|
+
getFileFromChunk(chunk: Chunk): string | undefined;
|
|
40
|
+
isExternalDep(request: string): boolean | "";
|
|
41
|
+
getHandleFromDep(dep: string): string;
|
|
42
|
+
generateHandleName(name: string): string;
|
|
43
|
+
generateAssetsFileName(filename: string): string;
|
|
44
|
+
normalizeOptions(options: Options): NormalizedOptions;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { GenerateWordPressAssetFileWebpackPlugin };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
GenerateWordPressAssetFileWebpackPlugin: () => GenerateWordPressAssetFileWebpackPlugin
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(src_exports);
|
|
26
|
+
var import_webpack = require("webpack");
|
|
27
|
+
var baseHandlesMap = {
|
|
28
|
+
exact: {
|
|
29
|
+
react: "react",
|
|
30
|
+
"react-dom": "react-dom"
|
|
31
|
+
},
|
|
32
|
+
startsWith: {
|
|
33
|
+
"@elementor/": "elementor-packages-",
|
|
34
|
+
"@wordpress/": "wp-"
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var GenerateWordPressAssetFileWebpackPlugin = class {
|
|
38
|
+
options;
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.options = this.normalizeOptions(options);
|
|
41
|
+
}
|
|
42
|
+
apply(compiler) {
|
|
43
|
+
compiler.hooks.thisCompilation.tap(this.constructor.name, (compilation) => {
|
|
44
|
+
let handlesAssetsMap;
|
|
45
|
+
compilation.hooks.processAssets.tap({ name: this.constructor.name }, () => {
|
|
46
|
+
handlesAssetsMap = [...compilation.entrypoints].reduce((map, [entryName, entrypoint]) => {
|
|
47
|
+
const chunk = entrypoint.chunks.find(({ name }) => name === entryName);
|
|
48
|
+
if (!chunk) {
|
|
49
|
+
return map;
|
|
50
|
+
}
|
|
51
|
+
const chunkJSFile = this.getFileFromChunk(chunk);
|
|
52
|
+
if (!chunkJSFile) {
|
|
53
|
+
return map;
|
|
54
|
+
}
|
|
55
|
+
const deps = this.getDepsFromChunk(compilation, chunk);
|
|
56
|
+
const assetFilename = this.generateAssetsFileName(
|
|
57
|
+
compilation.getPath("[file]", { filename: chunkJSFile })
|
|
58
|
+
);
|
|
59
|
+
const handle = this.generateHandleName(entryName);
|
|
60
|
+
const content = this.createAssetsFileContent({
|
|
61
|
+
deps,
|
|
62
|
+
entryName,
|
|
63
|
+
i18n: this.options.i18n
|
|
64
|
+
});
|
|
65
|
+
compilation.assets[assetFilename] = new import_webpack.sources.RawSource(content);
|
|
66
|
+
chunk.files.add(assetFilename);
|
|
67
|
+
map[handle] = assetFilename;
|
|
68
|
+
return map;
|
|
69
|
+
}, {});
|
|
70
|
+
});
|
|
71
|
+
compilation.hooks.afterProcessAssets.tap({ name: this.constructor.name }, () => {
|
|
72
|
+
const loaderFileContent = this.getLoaderFileContent(handlesAssetsMap);
|
|
73
|
+
compilation.assets["loader.php"] = new import_webpack.sources.RawSource(loaderFileContent);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
getDepsFromChunk(compilation, chunk) {
|
|
78
|
+
const depsSet = /* @__PURE__ */ new Set();
|
|
79
|
+
compilation.chunkGraph.getChunkModules(chunk).forEach((module2) => {
|
|
80
|
+
const theModule = module2;
|
|
81
|
+
[...theModule.modules || [], theModule].forEach((subModule) => {
|
|
82
|
+
if (subModule.userRequest && this.isExternalDep(subModule.userRequest)) {
|
|
83
|
+
depsSet.add(subModule.userRequest);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
return depsSet;
|
|
88
|
+
}
|
|
89
|
+
createAssetsFileContent({
|
|
90
|
+
deps,
|
|
91
|
+
i18n,
|
|
92
|
+
entryName
|
|
93
|
+
}) {
|
|
94
|
+
const handleName = this.generateHandleName(entryName);
|
|
95
|
+
const type = this.getEntryType(entryName);
|
|
96
|
+
const depsAsString = [...deps].map((dep) => this.getHandleFromDep(dep)).filter((dep) => dep !== handleName).sort().map((dep) => `'${dep}',`).join("\n ");
|
|
97
|
+
const i18nContent = i18n.domain ? `[
|
|
98
|
+
'domain' => '${i18n.domain}',
|
|
99
|
+
'replace_requested_file' => ${(i18n.replaceRequestedFile ?? false).toString()},
|
|
100
|
+
]` : "[]";
|
|
101
|
+
const content = `<?php
|
|
102
|
+
if ( ! defined( 'ABSPATH' ) ) {
|
|
103
|
+
exit;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* This file is generated by Webpack, do not edit it directly.
|
|
107
|
+
*/
|
|
108
|
+
return [
|
|
109
|
+
'handle' => '${handleName}',
|
|
110
|
+
'src' => plugins_url( '/', __FILE__ ) . '${entryName}{{MIN_SUFFIX}}.js',
|
|
111
|
+
'i18n' => ${i18nContent},
|
|
112
|
+
'type' => '${type}',
|
|
113
|
+
'deps' => [
|
|
114
|
+
${depsAsString}
|
|
115
|
+
],
|
|
116
|
+
];
|
|
117
|
+
`;
|
|
118
|
+
return content;
|
|
119
|
+
}
|
|
120
|
+
getLoaderFileContent(entriesData) {
|
|
121
|
+
const entriesContent = Object.entries(entriesData).map(([handle, assetFileName]) => {
|
|
122
|
+
return `
|
|
123
|
+
$data['${handle}'] = require __DIR__ . '/${assetFileName}';`;
|
|
124
|
+
});
|
|
125
|
+
return `<?php
|
|
126
|
+
if ( ! defined( 'ABSPATH' ) ) {
|
|
127
|
+
exit;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* This file is generated by Webpack, do not edit it directly.
|
|
131
|
+
*/
|
|
132
|
+
add_filter( 'elementor/editor-v2/packages/config', function( $data ) {
|
|
133
|
+
${entriesContent.join("\n")}
|
|
134
|
+
return $data;
|
|
135
|
+
} );
|
|
136
|
+
`;
|
|
137
|
+
}
|
|
138
|
+
getEntryType(entryName) {
|
|
139
|
+
if (this.options.extensions.includes(entryName)) {
|
|
140
|
+
return "extension";
|
|
141
|
+
}
|
|
142
|
+
if (this.options.apps.includes(entryName)) {
|
|
143
|
+
return "app";
|
|
144
|
+
}
|
|
145
|
+
return "util";
|
|
146
|
+
}
|
|
147
|
+
getFileFromChunk(chunk) {
|
|
148
|
+
return [...chunk.files].find((f) => /\.js$/i.test(f));
|
|
149
|
+
}
|
|
150
|
+
isExternalDep(request) {
|
|
151
|
+
const { startsWith, exact } = this.options.handlesMap;
|
|
152
|
+
return request && (Object.keys(exact).includes(request) || Object.keys(startsWith).some((dep) => request.startsWith(dep)));
|
|
153
|
+
}
|
|
154
|
+
getHandleFromDep(dep) {
|
|
155
|
+
const { startsWith, exact } = this.options.handlesMap;
|
|
156
|
+
if (Object.keys(exact).includes(dep)) {
|
|
157
|
+
return exact[dep];
|
|
158
|
+
}
|
|
159
|
+
for (const [key, value] of Object.entries(startsWith)) {
|
|
160
|
+
if (dep.startsWith(key)) {
|
|
161
|
+
return dep.replace(key, value);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return dep;
|
|
165
|
+
}
|
|
166
|
+
generateHandleName(name) {
|
|
167
|
+
if (this.options.handlePrefix) {
|
|
168
|
+
return `${this.options.handlePrefix}${name}`;
|
|
169
|
+
}
|
|
170
|
+
return name;
|
|
171
|
+
}
|
|
172
|
+
generateAssetsFileName(filename) {
|
|
173
|
+
return filename.replace(/(\.min)?\.js$/i, ".asset.php");
|
|
174
|
+
}
|
|
175
|
+
normalizeOptions(options) {
|
|
176
|
+
return {
|
|
177
|
+
...options,
|
|
178
|
+
handlesMap: {
|
|
179
|
+
exact: {
|
|
180
|
+
...baseHandlesMap.exact,
|
|
181
|
+
...options?.handlesMap?.exact || {}
|
|
182
|
+
},
|
|
183
|
+
startsWith: {
|
|
184
|
+
...baseHandlesMap.startsWith,
|
|
185
|
+
...options?.handlesMap?.startsWith || {}
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
apps: options?.apps || [],
|
|
189
|
+
extensions: options?.extensions || [],
|
|
190
|
+
i18n: {
|
|
191
|
+
domain: options?.i18n?.domain || null,
|
|
192
|
+
replaceRequestedFile: options?.i18n?.replaceRequestedFile ?? false
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
198
|
+
0 && (module.exports = {
|
|
199
|
+
GenerateWordPressAssetFileWebpackPlugin
|
|
200
|
+
});
|
|
201
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Inspired by \"Dependency Extraction Webpack Plugin\" by @wordpress team.\n// Link: https://github.com/WordPress/gutenberg/tree/trunk/packages/dependency-extraction-webpack-plugin\nimport { sources, Compilation, Compiler, Chunk } from 'webpack';\n\ntype HandlesMap = {\n\texact: Record<string, string>;\n\tstartsWith: Record<string, string>;\n}\n\ntype Options = {\n\thandlePrefix: string;\n\thandlesMap?: Partial<HandlesMap>\n\tapps?: string[];\n\textensions?: string[];\n\ti18n?: {\n\t\tdomain: string;\n\t\treplaceRequestedFile?: boolean;\n\t}\n}\n\ntype NormalizedOptions = {\n\thandlePrefix: string;\n\thandlesMap: HandlesMap;\n\tapps: string[];\n\textensions: string[];\n\ti18n: {\n\t\tdomain: string | null;\n\t\treplaceRequestedFile: boolean;\n\t}\n}\n\ntype Module = {\n\tuserRequest?: string;\n\tmodules?: Module[];\n}\n\nconst baseHandlesMap: HandlesMap = {\n\texact: {\n\t\treact: 'react',\n\t\t'react-dom': 'react-dom',\n\t},\n\tstartsWith: {\n\t\t'@elementor/': 'elementor-packages-',\n\t\t'@wordpress/': 'wp-',\n\t},\n};\n\nexport class GenerateWordPressAssetFileWebpackPlugin {\n\toptions: NormalizedOptions;\n\n\tconstructor( options: Options ) {\n\t\tthis.options = this.normalizeOptions( options );\n\t}\n\n\tapply( compiler: Compiler ) {\n\t\tcompiler.hooks.thisCompilation.tap( this.constructor.name, ( compilation ) => {\n\t\t\tlet handlesAssetsMap: Record<string, string>;\n\n\t\t\tcompilation.hooks.processAssets.tap( { name: this.constructor.name }, () => {\n\t\t\t\thandlesAssetsMap = [ ...compilation.entrypoints ].reduce<Record<string, string>>( ( map, [ entryName, entrypoint ] ) => {\n\t\t\t\t\tconst chunk = entrypoint.chunks.find( ( { name } ) => name === entryName );\n\n\t\t\t\t\tif ( ! chunk ) {\n\t\t\t\t\t\treturn map;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst chunkJSFile = this.getFileFromChunk( chunk );\n\n\t\t\t\t\tif ( ! chunkJSFile ) {\n\t\t\t\t\t\treturn map;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst deps = this.getDepsFromChunk( compilation, chunk );\n\n\t\t\t\t\tconst assetFilename = this.generateAssetsFileName(\n\t\t\t\t\t\tcompilation.getPath( '[file]', { filename: chunkJSFile } )\n\t\t\t\t\t);\n\n\t\t\t\t\tconst handle = this.generateHandleName( entryName );\n\n\t\t\t\t\tconst content = this.createAssetsFileContent( {\n\t\t\t\t\t\tdeps,\n\t\t\t\t\t\tentryName,\n\t\t\t\t\t\ti18n: this.options.i18n,\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Add source and file into compilation for webpack to output.\n\t\t\t\t\tcompilation.assets[ assetFilename ] = new sources.RawSource( content );\n\n\t\t\t\t\tchunk.files.add( assetFilename );\n\n\t\t\t\t\tmap[ handle ] = assetFilename;\n\n\t\t\t\t\treturn map;\n\t\t\t\t}, {} );\n\t\t\t} );\n\n\t\t\tcompilation.hooks.afterProcessAssets.tap( { name: this.constructor.name }, () => {\n\t\t\t\tconst loaderFileContent = this.getLoaderFileContent( handlesAssetsMap );\n\n\t\t\t\tcompilation.assets[ 'loader.php' ] = new sources.RawSource( loaderFileContent );\n\t\t\t} );\n\t\t} );\n\t}\n\n\tgetDepsFromChunk( compilation: Compilation, chunk: Chunk ) {\n\t\tconst depsSet = new Set<string>();\n\n\t\tcompilation.chunkGraph.getChunkModules( chunk ).forEach( ( module ) => {\n\t\t\t// There are some issues with types in webpack, so we need to cast it.\n\t\t\tconst theModule = module as Module;\n\n\t\t\t[ ...( theModule.modules || [] ), theModule ].forEach( ( subModule ) => {\n\t\t\t\tif ( subModule.userRequest && this.isExternalDep( subModule.userRequest ) ) {\n\t\t\t\t\tdepsSet.add( subModule.userRequest );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\treturn depsSet;\n\t}\n\n\tcreateAssetsFileContent( {\n\t\tdeps,\n\t\ti18n,\n\t\tentryName,\n\t}: {\n\t\tdeps: Set<string>;\n\t\ti18n: NormalizedOptions[ 'i18n' ];\n\t\tentryName: string;\n\t} ) {\n\t\tconst handleName = this.generateHandleName( entryName );\n\t\tconst type = this.getEntryType( entryName );\n\n\t\tconst depsAsString = [ ...deps ]\n\t\t\t.map( ( dep ) => this.getHandleFromDep( dep ) )\n\t\t\t.filter( ( dep ) => dep !== handleName )\n\t\t\t.sort()\n\t\t\t.map( ( dep ) => `'${ dep }',` )\n\t\t\t.join( '\\n\\t\\t' );\n\n\t\tconst i18nContent = i18n.domain ? `[\n\t\t'domain' => '${ i18n.domain }',\n\t\t'replace_requested_file' => ${ ( i18n.replaceRequestedFile ?? false ).toString() },\n\t]` : '[]';\n\n\t\tconst content =\n\t\t\t`<?php\nif ( ! defined( 'ABSPATH' ) ) {\n\texit;\n}\n/**\n * This file is generated by Webpack, do not edit it directly.\n */\nreturn [\n\t'handle' => '${ handleName }',\n\t'src' => plugins_url( '/', __FILE__ ) . '${ entryName }{{MIN_SUFFIX}}.js',\n\t'i18n' => ${ i18nContent },\n\t'type' => '${ type }',\n\t'deps' => [\n\t\t${ depsAsString }\n\t],\n];\n`;\n\n\t\treturn content;\n\t}\n\n\tgetLoaderFileContent( entriesData: Record<string, string> ) {\n\t\tconst entriesContent = Object.entries( entriesData ).map( ( [ handle, assetFileName ] ) => {\n\t\t\treturn `\n\t$data['${ handle }'] = require __DIR__ . '/${ assetFileName }';`;\n\t\t} );\n\n\t\treturn `<?php\nif ( ! defined( 'ABSPATH' ) ) {\n\texit;\n}\n/**\n * This file is generated by Webpack, do not edit it directly.\n */\nadd_filter( 'elementor/editor-v2/packages/config', function( $data ) {\n${ entriesContent.join( '\\n' ) }\n\treturn $data;\n} );\n`;\n\t}\n\n\tgetEntryType( entryName: string ) {\n\t\tif ( this.options.extensions.includes( entryName ) ) {\n\t\t\treturn 'extension';\n\t\t}\n\n\t\tif ( this.options.apps.includes( entryName ) ) {\n\t\t\treturn 'app';\n\t\t}\n\n\t\treturn 'util';\n\t}\n\n\tgetFileFromChunk( chunk: Chunk ) {\n\t\treturn [ ...chunk.files ].find( ( f ) => /\\.js$/i.test( f ) );\n\t}\n\n\tisExternalDep( request: string ) {\n\t\tconst { startsWith, exact } = this.options.handlesMap;\n\n\t\treturn request && (\n\t\t\tObject.keys( exact ).includes( request ) ||\n\t\t\tObject.keys( startsWith ).some( ( dep ) => request.startsWith( dep ) )\n\t\t);\n\t}\n\n\tgetHandleFromDep( dep: string ) {\n\t\tconst { startsWith, exact } = this.options.handlesMap;\n\n\t\tif ( Object.keys( exact ).includes( dep ) ) {\n\t\t\treturn exact[ dep ];\n\t\t}\n\n\t\tfor ( const [ key, value ] of Object.entries( startsWith ) ) {\n\t\t\tif ( dep.startsWith( key ) ) {\n\t\t\t\treturn dep.replace( key, value );\n\t\t\t}\n\t\t}\n\n\t\treturn dep;\n\t}\n\n\tgenerateHandleName( name: string ) {\n\t\tif ( this.options.handlePrefix ) {\n\t\t\treturn `${ this.options.handlePrefix }${ name }`;\n\t\t}\n\n\t\treturn name;\n\t}\n\n\tgenerateAssetsFileName( filename: string ) {\n\t\treturn filename.replace( /(\\.min)?\\.js$/i, '.asset.php' );\n\t}\n\n\tnormalizeOptions( options: Options ): NormalizedOptions {\n\t\treturn {\n\t\t\t...options,\n\t\t\thandlesMap: {\n\t\t\t\texact: {\n\t\t\t\t\t...baseHandlesMap.exact,\n\t\t\t\t\t...( options?.handlesMap?.exact || {} ),\n\t\t\t\t},\n\t\t\t\tstartsWith: {\n\t\t\t\t\t...baseHandlesMap.startsWith,\n\t\t\t\t\t...( options?.handlesMap?.startsWith || {} ),\n\t\t\t\t},\n\t\t\t},\n\t\t\tapps: options?.apps || [],\n\t\t\textensions: options?.extensions || [],\n\t\t\ti18n: {\n\t\t\t\tdomain: options?.i18n?.domain || null,\n\t\t\t\treplaceRequestedFile: options?.i18n?.replaceRequestedFile ?? false,\n\t\t\t},\n\t\t};\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAAsD;AAkCtD,IAAM,iBAA6B;AAAA,EAClC,OAAO;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACd;AAAA,EACA,YAAY;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,EAChB;AACD;AAEO,IAAM,0CAAN,MAA8C;AAAA,EACpD;AAAA,EAEA,YAAa,SAAmB;AAC/B,SAAK,UAAU,KAAK,iBAAkB,OAAQ;AAAA,EAC/C;AAAA,EAEA,MAAO,UAAqB;AAC3B,aAAS,MAAM,gBAAgB,IAAK,KAAK,YAAY,MAAM,CAAE,gBAAiB;AAC7E,UAAI;AAEJ,kBAAY,MAAM,cAAc,IAAK,EAAE,MAAM,KAAK,YAAY,KAAK,GAAG,MAAM;AAC3E,2BAAmB,CAAE,GAAG,YAAY,WAAY,EAAE,OAAgC,CAAE,KAAK,CAAE,WAAW,UAAW,MAAO;AACvH,gBAAM,QAAQ,WAAW,OAAO,KAAM,CAAE,EAAE,KAAK,MAAO,SAAS,SAAU;AAEzE,cAAK,CAAE,OAAQ;AACd,mBAAO;AAAA,UACR;AAEA,gBAAM,cAAc,KAAK,iBAAkB,KAAM;AAEjD,cAAK,CAAE,aAAc;AACpB,mBAAO;AAAA,UACR;AAEA,gBAAM,OAAO,KAAK,iBAAkB,aAAa,KAAM;AAEvD,gBAAM,gBAAgB,KAAK;AAAA,YAC1B,YAAY,QAAS,UAAU,EAAE,UAAU,YAAY,CAAE;AAAA,UAC1D;AAEA,gBAAM,SAAS,KAAK,mBAAoB,SAAU;AAElD,gBAAM,UAAU,KAAK,wBAAyB;AAAA,YAC7C;AAAA,YACA;AAAA,YACA,MAAM,KAAK,QAAQ;AAAA,UACpB,CAAE;AAGF,sBAAY,OAAQ,aAAc,IAAI,IAAI,uBAAQ,UAAW,OAAQ;AAErE,gBAAM,MAAM,IAAK,aAAc;AAE/B,cAAK,MAAO,IAAI;AAEhB,iBAAO;AAAA,QACR,GAAG,CAAC,CAAE;AAAA,MACP,CAAE;AAEF,kBAAY,MAAM,mBAAmB,IAAK,EAAE,MAAM,KAAK,YAAY,KAAK,GAAG,MAAM;AAChF,cAAM,oBAAoB,KAAK,qBAAsB,gBAAiB;AAEtE,oBAAY,OAAQ,YAAa,IAAI,IAAI,uBAAQ,UAAW,iBAAkB;AAAA,MAC/E,CAAE;AAAA,IACH,CAAE;AAAA,EACH;AAAA,EAEA,iBAAkB,aAA0B,OAAe;AAC1D,UAAM,UAAU,oBAAI,IAAY;AAEhC,gBAAY,WAAW,gBAAiB,KAAM,EAAE,QAAS,CAAEA,YAAY;AAEtE,YAAM,YAAYA;AAElB,OAAE,GAAK,UAAU,WAAW,CAAC,GAAK,SAAU,EAAE,QAAS,CAAE,cAAe;AACvE,YAAK,UAAU,eAAe,KAAK,cAAe,UAAU,WAAY,GAAI;AAC3E,kBAAQ,IAAK,UAAU,WAAY;AAAA,QACpC;AAAA,MACD,CAAE;AAAA,IACH,CAAE;AAEF,WAAO;AAAA,EACR;AAAA,EAEA,wBAAyB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACD,GAII;AACH,UAAM,aAAa,KAAK,mBAAoB,SAAU;AACtD,UAAM,OAAO,KAAK,aAAc,SAAU;AAE1C,UAAM,eAAe,CAAE,GAAG,IAAK,EAC7B,IAAK,CAAE,QAAS,KAAK,iBAAkB,GAAI,CAAE,EAC7C,OAAQ,CAAE,QAAS,QAAQ,UAAW,EACtC,KAAK,EACL,IAAK,CAAE,QAAS,IAAK,OAAS,EAC9B,KAAM,MAAS;AAEjB,UAAM,cAAc,KAAK,SAAS;AAAA,iBAClB,KAAK;AAAA,iCACY,KAAK,wBAAwB,OAAQ,SAAS;AAAA,MAC3E;AAEJ,UAAM,UACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAQc;AAAA,4CAC4B;AAAA,aAC/B;AAAA,cACC;AAAA;AAAA,IAEV;AAAA;AAAA;AAAA;AAKH,WAAO;AAAA,EACR;AAAA,EAEA,qBAAsB,aAAsC;AAC3D,UAAM,iBAAiB,OAAO,QAAS,WAAY,EAAE,IAAK,CAAE,CAAE,QAAQ,aAAc,MAAO;AAC1F,aAAO;AAAA,UACC,kCAAoC;AAAA,IAC7C,CAAE;AAEF,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQN,eAAe,KAAM,IAAK;AAAA;AAAA;AAAA;AAAA,EAI5B;AAAA,EAEA,aAAc,WAAoB;AACjC,QAAK,KAAK,QAAQ,WAAW,SAAU,SAAU,GAAI;AACpD,aAAO;AAAA,IACR;AAEA,QAAK,KAAK,QAAQ,KAAK,SAAU,SAAU,GAAI;AAC9C,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,iBAAkB,OAAe;AAChC,WAAO,CAAE,GAAG,MAAM,KAAM,EAAE,KAAM,CAAE,MAAO,SAAS,KAAM,CAAE,CAAE;AAAA,EAC7D;AAAA,EAEA,cAAe,SAAkB;AAChC,UAAM,EAAE,YAAY,MAAM,IAAI,KAAK,QAAQ;AAE3C,WAAO,YACN,OAAO,KAAM,KAAM,EAAE,SAAU,OAAQ,KACvC,OAAO,KAAM,UAAW,EAAE,KAAM,CAAE,QAAS,QAAQ,WAAY,GAAI,CAAE;AAAA,EAEvE;AAAA,EAEA,iBAAkB,KAAc;AAC/B,UAAM,EAAE,YAAY,MAAM,IAAI,KAAK,QAAQ;AAE3C,QAAK,OAAO,KAAM,KAAM,EAAE,SAAU,GAAI,GAAI;AAC3C,aAAO,MAAO,GAAI;AAAA,IACnB;AAEA,eAAY,CAAE,KAAK,KAAM,KAAK,OAAO,QAAS,UAAW,GAAI;AAC5D,UAAK,IAAI,WAAY,GAAI,GAAI;AAC5B,eAAO,IAAI,QAAS,KAAK,KAAM;AAAA,MAChC;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,mBAAoB,MAAe;AAClC,QAAK,KAAK,QAAQ,cAAe;AAChC,aAAO,GAAI,KAAK,QAAQ,eAAiB;AAAA,IAC1C;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,uBAAwB,UAAmB;AAC1C,WAAO,SAAS,QAAS,kBAAkB,YAAa;AAAA,EACzD;AAAA,EAEA,iBAAkB,SAAsC;AACvD,WAAO;AAAA,MACN,GAAG;AAAA,MACH,YAAY;AAAA,QACX,OAAO;AAAA,UACN,GAAG,eAAe;AAAA,UAClB,GAAK,SAAS,YAAY,SAAS,CAAC;AAAA,QACrC;AAAA,QACA,YAAY;AAAA,UACX,GAAG,eAAe;AAAA,UAClB,GAAK,SAAS,YAAY,cAAc,CAAC;AAAA,QAC1C;AAAA,MACD;AAAA,MACA,MAAM,SAAS,QAAQ,CAAC;AAAA,MACxB,YAAY,SAAS,cAAc,CAAC;AAAA,MACpC,MAAM;AAAA,QACL,QAAQ,SAAS,MAAM,UAAU;AAAA,QACjC,sBAAsB,SAAS,MAAM,wBAAwB;AAAA,MAC9D;AAAA,IACD;AAAA,EACD;AACD;","names":["module"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { sources } from "webpack";
|
|
3
|
+
var baseHandlesMap = {
|
|
4
|
+
exact: {
|
|
5
|
+
react: "react",
|
|
6
|
+
"react-dom": "react-dom"
|
|
7
|
+
},
|
|
8
|
+
startsWith: {
|
|
9
|
+
"@elementor/": "elementor-packages-",
|
|
10
|
+
"@wordpress/": "wp-"
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var GenerateWordPressAssetFileWebpackPlugin = class {
|
|
14
|
+
options;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.options = this.normalizeOptions(options);
|
|
17
|
+
}
|
|
18
|
+
apply(compiler) {
|
|
19
|
+
compiler.hooks.thisCompilation.tap(this.constructor.name, (compilation) => {
|
|
20
|
+
let handlesAssetsMap;
|
|
21
|
+
compilation.hooks.processAssets.tap({ name: this.constructor.name }, () => {
|
|
22
|
+
handlesAssetsMap = [...compilation.entrypoints].reduce((map, [entryName, entrypoint]) => {
|
|
23
|
+
const chunk = entrypoint.chunks.find(({ name }) => name === entryName);
|
|
24
|
+
if (!chunk) {
|
|
25
|
+
return map;
|
|
26
|
+
}
|
|
27
|
+
const chunkJSFile = this.getFileFromChunk(chunk);
|
|
28
|
+
if (!chunkJSFile) {
|
|
29
|
+
return map;
|
|
30
|
+
}
|
|
31
|
+
const deps = this.getDepsFromChunk(compilation, chunk);
|
|
32
|
+
const assetFilename = this.generateAssetsFileName(
|
|
33
|
+
compilation.getPath("[file]", { filename: chunkJSFile })
|
|
34
|
+
);
|
|
35
|
+
const handle = this.generateHandleName(entryName);
|
|
36
|
+
const content = this.createAssetsFileContent({
|
|
37
|
+
deps,
|
|
38
|
+
entryName,
|
|
39
|
+
i18n: this.options.i18n
|
|
40
|
+
});
|
|
41
|
+
compilation.assets[assetFilename] = new sources.RawSource(content);
|
|
42
|
+
chunk.files.add(assetFilename);
|
|
43
|
+
map[handle] = assetFilename;
|
|
44
|
+
return map;
|
|
45
|
+
}, {});
|
|
46
|
+
});
|
|
47
|
+
compilation.hooks.afterProcessAssets.tap({ name: this.constructor.name }, () => {
|
|
48
|
+
const loaderFileContent = this.getLoaderFileContent(handlesAssetsMap);
|
|
49
|
+
compilation.assets["loader.php"] = new sources.RawSource(loaderFileContent);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
getDepsFromChunk(compilation, chunk) {
|
|
54
|
+
const depsSet = /* @__PURE__ */ new Set();
|
|
55
|
+
compilation.chunkGraph.getChunkModules(chunk).forEach((module) => {
|
|
56
|
+
const theModule = module;
|
|
57
|
+
[...theModule.modules || [], theModule].forEach((subModule) => {
|
|
58
|
+
if (subModule.userRequest && this.isExternalDep(subModule.userRequest)) {
|
|
59
|
+
depsSet.add(subModule.userRequest);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
return depsSet;
|
|
64
|
+
}
|
|
65
|
+
createAssetsFileContent({
|
|
66
|
+
deps,
|
|
67
|
+
i18n,
|
|
68
|
+
entryName
|
|
69
|
+
}) {
|
|
70
|
+
const handleName = this.generateHandleName(entryName);
|
|
71
|
+
const type = this.getEntryType(entryName);
|
|
72
|
+
const depsAsString = [...deps].map((dep) => this.getHandleFromDep(dep)).filter((dep) => dep !== handleName).sort().map((dep) => `'${dep}',`).join("\n ");
|
|
73
|
+
const i18nContent = i18n.domain ? `[
|
|
74
|
+
'domain' => '${i18n.domain}',
|
|
75
|
+
'replace_requested_file' => ${(i18n.replaceRequestedFile ?? false).toString()},
|
|
76
|
+
]` : "[]";
|
|
77
|
+
const content = `<?php
|
|
78
|
+
if ( ! defined( 'ABSPATH' ) ) {
|
|
79
|
+
exit;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* This file is generated by Webpack, do not edit it directly.
|
|
83
|
+
*/
|
|
84
|
+
return [
|
|
85
|
+
'handle' => '${handleName}',
|
|
86
|
+
'src' => plugins_url( '/', __FILE__ ) . '${entryName}{{MIN_SUFFIX}}.js',
|
|
87
|
+
'i18n' => ${i18nContent},
|
|
88
|
+
'type' => '${type}',
|
|
89
|
+
'deps' => [
|
|
90
|
+
${depsAsString}
|
|
91
|
+
],
|
|
92
|
+
];
|
|
93
|
+
`;
|
|
94
|
+
return content;
|
|
95
|
+
}
|
|
96
|
+
getLoaderFileContent(entriesData) {
|
|
97
|
+
const entriesContent = Object.entries(entriesData).map(([handle, assetFileName]) => {
|
|
98
|
+
return `
|
|
99
|
+
$data['${handle}'] = require __DIR__ . '/${assetFileName}';`;
|
|
100
|
+
});
|
|
101
|
+
return `<?php
|
|
102
|
+
if ( ! defined( 'ABSPATH' ) ) {
|
|
103
|
+
exit;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* This file is generated by Webpack, do not edit it directly.
|
|
107
|
+
*/
|
|
108
|
+
add_filter( 'elementor/editor-v2/packages/config', function( $data ) {
|
|
109
|
+
${entriesContent.join("\n")}
|
|
110
|
+
return $data;
|
|
111
|
+
} );
|
|
112
|
+
`;
|
|
113
|
+
}
|
|
114
|
+
getEntryType(entryName) {
|
|
115
|
+
if (this.options.extensions.includes(entryName)) {
|
|
116
|
+
return "extension";
|
|
117
|
+
}
|
|
118
|
+
if (this.options.apps.includes(entryName)) {
|
|
119
|
+
return "app";
|
|
120
|
+
}
|
|
121
|
+
return "util";
|
|
122
|
+
}
|
|
123
|
+
getFileFromChunk(chunk) {
|
|
124
|
+
return [...chunk.files].find((f) => /\.js$/i.test(f));
|
|
125
|
+
}
|
|
126
|
+
isExternalDep(request) {
|
|
127
|
+
const { startsWith, exact } = this.options.handlesMap;
|
|
128
|
+
return request && (Object.keys(exact).includes(request) || Object.keys(startsWith).some((dep) => request.startsWith(dep)));
|
|
129
|
+
}
|
|
130
|
+
getHandleFromDep(dep) {
|
|
131
|
+
const { startsWith, exact } = this.options.handlesMap;
|
|
132
|
+
if (Object.keys(exact).includes(dep)) {
|
|
133
|
+
return exact[dep];
|
|
134
|
+
}
|
|
135
|
+
for (const [key, value] of Object.entries(startsWith)) {
|
|
136
|
+
if (dep.startsWith(key)) {
|
|
137
|
+
return dep.replace(key, value);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return dep;
|
|
141
|
+
}
|
|
142
|
+
generateHandleName(name) {
|
|
143
|
+
if (this.options.handlePrefix) {
|
|
144
|
+
return `${this.options.handlePrefix}${name}`;
|
|
145
|
+
}
|
|
146
|
+
return name;
|
|
147
|
+
}
|
|
148
|
+
generateAssetsFileName(filename) {
|
|
149
|
+
return filename.replace(/(\.min)?\.js$/i, ".asset.php");
|
|
150
|
+
}
|
|
151
|
+
normalizeOptions(options) {
|
|
152
|
+
return {
|
|
153
|
+
...options,
|
|
154
|
+
handlesMap: {
|
|
155
|
+
exact: {
|
|
156
|
+
...baseHandlesMap.exact,
|
|
157
|
+
...options?.handlesMap?.exact || {}
|
|
158
|
+
},
|
|
159
|
+
startsWith: {
|
|
160
|
+
...baseHandlesMap.startsWith,
|
|
161
|
+
...options?.handlesMap?.startsWith || {}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
apps: options?.apps || [],
|
|
165
|
+
extensions: options?.extensions || [],
|
|
166
|
+
i18n: {
|
|
167
|
+
domain: options?.i18n?.domain || null,
|
|
168
|
+
replaceRequestedFile: options?.i18n?.replaceRequestedFile ?? false
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
export {
|
|
174
|
+
GenerateWordPressAssetFileWebpackPlugin
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Inspired by \"Dependency Extraction Webpack Plugin\" by @wordpress team.\n// Link: https://github.com/WordPress/gutenberg/tree/trunk/packages/dependency-extraction-webpack-plugin\nimport { sources, Compilation, Compiler, Chunk } from 'webpack';\n\ntype HandlesMap = {\n\texact: Record<string, string>;\n\tstartsWith: Record<string, string>;\n}\n\ntype Options = {\n\thandlePrefix: string;\n\thandlesMap?: Partial<HandlesMap>\n\tapps?: string[];\n\textensions?: string[];\n\ti18n?: {\n\t\tdomain: string;\n\t\treplaceRequestedFile?: boolean;\n\t}\n}\n\ntype NormalizedOptions = {\n\thandlePrefix: string;\n\thandlesMap: HandlesMap;\n\tapps: string[];\n\textensions: string[];\n\ti18n: {\n\t\tdomain: string | null;\n\t\treplaceRequestedFile: boolean;\n\t}\n}\n\ntype Module = {\n\tuserRequest?: string;\n\tmodules?: Module[];\n}\n\nconst baseHandlesMap: HandlesMap = {\n\texact: {\n\t\treact: 'react',\n\t\t'react-dom': 'react-dom',\n\t},\n\tstartsWith: {\n\t\t'@elementor/': 'elementor-packages-',\n\t\t'@wordpress/': 'wp-',\n\t},\n};\n\nexport class GenerateWordPressAssetFileWebpackPlugin {\n\toptions: NormalizedOptions;\n\n\tconstructor( options: Options ) {\n\t\tthis.options = this.normalizeOptions( options );\n\t}\n\n\tapply( compiler: Compiler ) {\n\t\tcompiler.hooks.thisCompilation.tap( this.constructor.name, ( compilation ) => {\n\t\t\tlet handlesAssetsMap: Record<string, string>;\n\n\t\t\tcompilation.hooks.processAssets.tap( { name: this.constructor.name }, () => {\n\t\t\t\thandlesAssetsMap = [ ...compilation.entrypoints ].reduce<Record<string, string>>( ( map, [ entryName, entrypoint ] ) => {\n\t\t\t\t\tconst chunk = entrypoint.chunks.find( ( { name } ) => name === entryName );\n\n\t\t\t\t\tif ( ! chunk ) {\n\t\t\t\t\t\treturn map;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst chunkJSFile = this.getFileFromChunk( chunk );\n\n\t\t\t\t\tif ( ! chunkJSFile ) {\n\t\t\t\t\t\treturn map;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst deps = this.getDepsFromChunk( compilation, chunk );\n\n\t\t\t\t\tconst assetFilename = this.generateAssetsFileName(\n\t\t\t\t\t\tcompilation.getPath( '[file]', { filename: chunkJSFile } )\n\t\t\t\t\t);\n\n\t\t\t\t\tconst handle = this.generateHandleName( entryName );\n\n\t\t\t\t\tconst content = this.createAssetsFileContent( {\n\t\t\t\t\t\tdeps,\n\t\t\t\t\t\tentryName,\n\t\t\t\t\t\ti18n: this.options.i18n,\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Add source and file into compilation for webpack to output.\n\t\t\t\t\tcompilation.assets[ assetFilename ] = new sources.RawSource( content );\n\n\t\t\t\t\tchunk.files.add( assetFilename );\n\n\t\t\t\t\tmap[ handle ] = assetFilename;\n\n\t\t\t\t\treturn map;\n\t\t\t\t}, {} );\n\t\t\t} );\n\n\t\t\tcompilation.hooks.afterProcessAssets.tap( { name: this.constructor.name }, () => {\n\t\t\t\tconst loaderFileContent = this.getLoaderFileContent( handlesAssetsMap );\n\n\t\t\t\tcompilation.assets[ 'loader.php' ] = new sources.RawSource( loaderFileContent );\n\t\t\t} );\n\t\t} );\n\t}\n\n\tgetDepsFromChunk( compilation: Compilation, chunk: Chunk ) {\n\t\tconst depsSet = new Set<string>();\n\n\t\tcompilation.chunkGraph.getChunkModules( chunk ).forEach( ( module ) => {\n\t\t\t// There are some issues with types in webpack, so we need to cast it.\n\t\t\tconst theModule = module as Module;\n\n\t\t\t[ ...( theModule.modules || [] ), theModule ].forEach( ( subModule ) => {\n\t\t\t\tif ( subModule.userRequest && this.isExternalDep( subModule.userRequest ) ) {\n\t\t\t\t\tdepsSet.add( subModule.userRequest );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\treturn depsSet;\n\t}\n\n\tcreateAssetsFileContent( {\n\t\tdeps,\n\t\ti18n,\n\t\tentryName,\n\t}: {\n\t\tdeps: Set<string>;\n\t\ti18n: NormalizedOptions[ 'i18n' ];\n\t\tentryName: string;\n\t} ) {\n\t\tconst handleName = this.generateHandleName( entryName );\n\t\tconst type = this.getEntryType( entryName );\n\n\t\tconst depsAsString = [ ...deps ]\n\t\t\t.map( ( dep ) => this.getHandleFromDep( dep ) )\n\t\t\t.filter( ( dep ) => dep !== handleName )\n\t\t\t.sort()\n\t\t\t.map( ( dep ) => `'${ dep }',` )\n\t\t\t.join( '\\n\\t\\t' );\n\n\t\tconst i18nContent = i18n.domain ? `[\n\t\t'domain' => '${ i18n.domain }',\n\t\t'replace_requested_file' => ${ ( i18n.replaceRequestedFile ?? false ).toString() },\n\t]` : '[]';\n\n\t\tconst content =\n\t\t\t`<?php\nif ( ! defined( 'ABSPATH' ) ) {\n\texit;\n}\n/**\n * This file is generated by Webpack, do not edit it directly.\n */\nreturn [\n\t'handle' => '${ handleName }',\n\t'src' => plugins_url( '/', __FILE__ ) . '${ entryName }{{MIN_SUFFIX}}.js',\n\t'i18n' => ${ i18nContent },\n\t'type' => '${ type }',\n\t'deps' => [\n\t\t${ depsAsString }\n\t],\n];\n`;\n\n\t\treturn content;\n\t}\n\n\tgetLoaderFileContent( entriesData: Record<string, string> ) {\n\t\tconst entriesContent = Object.entries( entriesData ).map( ( [ handle, assetFileName ] ) => {\n\t\t\treturn `\n\t$data['${ handle }'] = require __DIR__ . '/${ assetFileName }';`;\n\t\t} );\n\n\t\treturn `<?php\nif ( ! defined( 'ABSPATH' ) ) {\n\texit;\n}\n/**\n * This file is generated by Webpack, do not edit it directly.\n */\nadd_filter( 'elementor/editor-v2/packages/config', function( $data ) {\n${ entriesContent.join( '\\n' ) }\n\treturn $data;\n} );\n`;\n\t}\n\n\tgetEntryType( entryName: string ) {\n\t\tif ( this.options.extensions.includes( entryName ) ) {\n\t\t\treturn 'extension';\n\t\t}\n\n\t\tif ( this.options.apps.includes( entryName ) ) {\n\t\t\treturn 'app';\n\t\t}\n\n\t\treturn 'util';\n\t}\n\n\tgetFileFromChunk( chunk: Chunk ) {\n\t\treturn [ ...chunk.files ].find( ( f ) => /\\.js$/i.test( f ) );\n\t}\n\n\tisExternalDep( request: string ) {\n\t\tconst { startsWith, exact } = this.options.handlesMap;\n\n\t\treturn request && (\n\t\t\tObject.keys( exact ).includes( request ) ||\n\t\t\tObject.keys( startsWith ).some( ( dep ) => request.startsWith( dep ) )\n\t\t);\n\t}\n\n\tgetHandleFromDep( dep: string ) {\n\t\tconst { startsWith, exact } = this.options.handlesMap;\n\n\t\tif ( Object.keys( exact ).includes( dep ) ) {\n\t\t\treturn exact[ dep ];\n\t\t}\n\n\t\tfor ( const [ key, value ] of Object.entries( startsWith ) ) {\n\t\t\tif ( dep.startsWith( key ) ) {\n\t\t\t\treturn dep.replace( key, value );\n\t\t\t}\n\t\t}\n\n\t\treturn dep;\n\t}\n\n\tgenerateHandleName( name: string ) {\n\t\tif ( this.options.handlePrefix ) {\n\t\t\treturn `${ this.options.handlePrefix }${ name }`;\n\t\t}\n\n\t\treturn name;\n\t}\n\n\tgenerateAssetsFileName( filename: string ) {\n\t\treturn filename.replace( /(\\.min)?\\.js$/i, '.asset.php' );\n\t}\n\n\tnormalizeOptions( options: Options ): NormalizedOptions {\n\t\treturn {\n\t\t\t...options,\n\t\t\thandlesMap: {\n\t\t\t\texact: {\n\t\t\t\t\t...baseHandlesMap.exact,\n\t\t\t\t\t...( options?.handlesMap?.exact || {} ),\n\t\t\t\t},\n\t\t\t\tstartsWith: {\n\t\t\t\t\t...baseHandlesMap.startsWith,\n\t\t\t\t\t...( options?.handlesMap?.startsWith || {} ),\n\t\t\t\t},\n\t\t\t},\n\t\t\tapps: options?.apps || [],\n\t\t\textensions: options?.extensions || [],\n\t\t\ti18n: {\n\t\t\t\tdomain: options?.i18n?.domain || null,\n\t\t\t\treplaceRequestedFile: options?.i18n?.replaceRequestedFile ?? false,\n\t\t\t},\n\t\t};\n\t}\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elementor/generate-wordpress-asset-file-webpack-plugin",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"author": "Elementor Team",
|
|
6
|
+
"homepage": "https://elementor.com/",
|
|
7
|
+
"license": "GPL-3.0-or-later",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"module": "dist/index.mjs",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.mjs",
|
|
14
|
+
"require": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./package.json": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/elementor/elementor-packages.git",
|
|
22
|
+
"directory": "packages/generated-wordpress-asset-file-webpack-plugin"
|
|
23
|
+
},
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/elementor/elementor-packages/issues"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup --config=../../tsup.build.ts",
|
|
32
|
+
"dev": "tsup --config=../../tsup.dev.ts --format=esm,cjs"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"webpack": "5.x"
|
|
36
|
+
},
|
|
37
|
+
"gitHead": "2ba9f13a9dbd085eb6ed8e6e303e9275ce626b8d"
|
|
38
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`@elementor/generate-wordpress-asset-file-webpack-plugin should generate assets files: app.asset.php 1`] = `
|
|
4
|
+
"<?php
|
|
5
|
+
if ( ! defined( 'ABSPATH' ) ) {
|
|
6
|
+
exit;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* This file is generated by Webpack, do not edit it directly.
|
|
10
|
+
*/
|
|
11
|
+
return [
|
|
12
|
+
'handle' => 'elementor-test-app',
|
|
13
|
+
'src' => plugins_url( '/', __FILE__ ) . 'app{{MIN_SUFFIX}}.js',
|
|
14
|
+
'i18n' => [
|
|
15
|
+
'domain' => 'elementor-test',
|
|
16
|
+
'replace_requested_file' => true,
|
|
17
|
+
],
|
|
18
|
+
'type' => 'app',
|
|
19
|
+
'deps' => [
|
|
20
|
+
'elementor-editor',
|
|
21
|
+
'wp-element',
|
|
22
|
+
],
|
|
23
|
+
];
|
|
24
|
+
"
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
exports[`@elementor/generate-wordpress-asset-file-webpack-plugin should generate assets files: extension.asset.php 1`] = `
|
|
28
|
+
"<?php
|
|
29
|
+
if ( ! defined( 'ABSPATH' ) ) {
|
|
30
|
+
exit;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* This file is generated by Webpack, do not edit it directly.
|
|
34
|
+
*/
|
|
35
|
+
return [
|
|
36
|
+
'handle' => 'elementor-test-extension',
|
|
37
|
+
'src' => plugins_url( '/', __FILE__ ) . 'extension{{MIN_SUFFIX}}.js',
|
|
38
|
+
'i18n' => [
|
|
39
|
+
'domain' => 'elementor-test',
|
|
40
|
+
'replace_requested_file' => true,
|
|
41
|
+
],
|
|
42
|
+
'type' => 'extension',
|
|
43
|
+
'deps' => [
|
|
44
|
+
'elementor-editor',
|
|
45
|
+
'wp-element',
|
|
46
|
+
],
|
|
47
|
+
];
|
|
48
|
+
"
|
|
49
|
+
`;
|
|
50
|
+
|
|
51
|
+
exports[`@elementor/generate-wordpress-asset-file-webpack-plugin should generate assets files: loader.php 1`] = `
|
|
52
|
+
"<?php
|
|
53
|
+
if ( ! defined( 'ABSPATH' ) ) {
|
|
54
|
+
exit;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* This file is generated by Webpack, do not edit it directly.
|
|
58
|
+
*/
|
|
59
|
+
add_filter( 'elementor/editor-v2/packages/config', function( $data ) {
|
|
60
|
+
|
|
61
|
+
$data['elementor-test-app'] = require __DIR__ . '/app.asset.php';
|
|
62
|
+
|
|
63
|
+
$data['elementor-test-extension'] = require __DIR__ . '/extension.asset.php';
|
|
64
|
+
|
|
65
|
+
$data['elementor-test-util'] = require __DIR__ . '/util.asset.php';
|
|
66
|
+
return $data;
|
|
67
|
+
} );
|
|
68
|
+
"
|
|
69
|
+
`;
|
|
70
|
+
|
|
71
|
+
exports[`@elementor/generate-wordpress-asset-file-webpack-plugin should generate assets files: util.asset.php 1`] = `
|
|
72
|
+
"<?php
|
|
73
|
+
if ( ! defined( 'ABSPATH' ) ) {
|
|
74
|
+
exit;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* This file is generated by Webpack, do not edit it directly.
|
|
78
|
+
*/
|
|
79
|
+
return [
|
|
80
|
+
'handle' => 'elementor-test-util',
|
|
81
|
+
'src' => plugins_url( '/', __FILE__ ) . 'util{{MIN_SUFFIX}}.js',
|
|
82
|
+
'i18n' => [
|
|
83
|
+
'domain' => 'elementor-test',
|
|
84
|
+
'replace_requested_file' => true,
|
|
85
|
+
],
|
|
86
|
+
'type' => 'util',
|
|
87
|
+
'deps' => [
|
|
88
|
+
'elementor-editor',
|
|
89
|
+
'wp-element',
|
|
90
|
+
],
|
|
91
|
+
];
|
|
92
|
+
"
|
|
93
|
+
`;
|