@plaudit/webpack-extensions 2.55.1 → 2.56.1
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/build/plugins/BlockJSONManagingPlugin.d.ts +0 -2
- package/build/plugins/BlockJSONManagingPlugin.js +2 -4
- package/build/plugins/PlainEntrypointsConfigFileGeneratorPlugin.js +24 -1
- package/build/shared.d.ts +9 -2
- package/build/shared.js +9 -1
- package/build/utils/common-config-helpers.d.ts +3 -7
- package/build/utils/common-config-helpers.js +8 -15
- package/build/wordpress-scripts-wrapper.js +108 -29
- package/package.json +1 -1
|
@@ -5,8 +5,6 @@ export declare class BlockJSONManagingPlugin implements WebpackPluginInstance {
|
|
|
5
5
|
private readonly blocksDest;
|
|
6
6
|
static readonly mappableModuleKeys: readonly ["viewScriptModule", "scriptModule"];
|
|
7
7
|
static readonly mappableNonModuleKeys: readonly ["editorScript", "script", "viewScript", "editorStyle", "style", "viewStyle"];
|
|
8
|
-
private static readonly styleExtensionPattern;
|
|
9
|
-
private static readonly scriptExtensionPattern;
|
|
10
8
|
private static readonly mappableKeys;
|
|
11
9
|
private static readonly blockJsonToEntrypointsMap;
|
|
12
10
|
private static readonly blockJsonRawDependenciesMap;
|
|
@@ -15,8 +15,6 @@ class BlockJSONManagingPlugin {
|
|
|
15
15
|
blocksDest;
|
|
16
16
|
static mappableModuleKeys = ["viewScriptModule", "scriptModule"];
|
|
17
17
|
static mappableNonModuleKeys = ["editorScript", "script", "viewScript", "editorStyle", "style", "viewStyle"];
|
|
18
|
-
static styleExtensionPattern = /\.(p?c|sa)ss$/i;
|
|
19
|
-
static scriptExtensionPattern = /\.m?[tj]sx?$/i;
|
|
20
18
|
static mappableKeys = [...BlockJSONManagingPlugin.mappableNonModuleKeys, ...BlockJSONManagingPlugin.mappableModuleKeys];
|
|
21
19
|
static blockJsonToEntrypointsMap = new Map();
|
|
22
20
|
static blockJsonRawDependenciesMap = new Map();
|
|
@@ -178,9 +176,9 @@ class BlockJSONManagingPlugin {
|
|
|
178
176
|
const prefix = value.startsWith("./", 5) ? "./" : "";
|
|
179
177
|
const relativePath = node_path_1.default.relative(node_path_1.default.dirname(name), entryMeta.path);
|
|
180
178
|
const res = [`file:${prefix}${relativePath}`, entryMeta.hash];
|
|
181
|
-
if (
|
|
179
|
+
if (shared_1.styleExtension.test(entryMeta.path)) {
|
|
182
180
|
return [res,
|
|
183
|
-
derivedFiles.filter(derivedFile => !
|
|
181
|
+
derivedFiles.filter(derivedFile => !shared_1.scriptExtension.test(derivedFile))
|
|
184
182
|
.map(derivedFile => `file:./${node_path_1.default.relative(node_path_1.default.dirname(name), derivedFile)}`)
|
|
185
183
|
];
|
|
186
184
|
}
|
|
@@ -116,10 +116,33 @@ class PlainEntrypointsConfigFileGeneratorPlugin {
|
|
|
116
116
|
customizer: [],
|
|
117
117
|
analytics: []
|
|
118
118
|
};
|
|
119
|
+
const allNamedHandles = (PlainEntrypointsConfigFileGeneratorPlugin.cache?.assets ?? [])
|
|
120
|
+
.flatMap(({ handles }) => handles)
|
|
121
|
+
.filter((handle) => !!handle.handleName)
|
|
122
|
+
.sort((a, b) => a.src.localeCompare(b.src));
|
|
123
|
+
const usedScriptHandleNames = Object.fromEntries(allNamedHandles
|
|
124
|
+
.filter(handle => handle.isScript)
|
|
125
|
+
.map(handle => [handle.handleName, handle.src]));
|
|
126
|
+
const usedStyleHandleNames = Object.fromEntries(allNamedHandles
|
|
127
|
+
.filter(handle => !handle.isScript)
|
|
128
|
+
.map(handle => [handle.handleName, handle.src]));
|
|
119
129
|
const plainEntrypointsConfig = { scriptHandles: {}, styleHandles: {} };
|
|
120
130
|
for (const { handles, handlePrefix } of PlainEntrypointsConfigFileGeneratorPlugin.cache?.assets ?? []) {
|
|
121
131
|
for (const { src, rest, locations, isScript, handleName } of handles) {
|
|
122
|
-
|
|
132
|
+
let finalHandleName;
|
|
133
|
+
if (handleName) {
|
|
134
|
+
finalHandleName = handleName;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
const basename = node_path_1.default.basename(src).replace(/_(?:script(?:-\d+)?\.js|style(?:-\d+)?\.css)$|(?<!_(script|style))\.(js|css)$/, "");
|
|
138
|
+
const baseFinalHandleName = `${handlePrefix}.${kebabCase(basename)}`;
|
|
139
|
+
const handleNameMap = (isScript ? usedScriptHandleNames : usedStyleHandleNames);
|
|
140
|
+
finalHandleName = baseFinalHandleName;
|
|
141
|
+
for (let count = 0; finalHandleName in handleNameMap && handleNameMap[finalHandleName] !== src;) {
|
|
142
|
+
finalHandleName = `${baseFinalHandleName}-${++count}`;
|
|
143
|
+
}
|
|
144
|
+
handleNameMap[finalHandleName] = src;
|
|
145
|
+
}
|
|
123
146
|
plainEntrypointsConfig[isScript ? 'scriptHandles' : 'styleHandles'][finalHandleName] = {
|
|
124
147
|
src,
|
|
125
148
|
rest,
|
package/build/shared.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ export type Externals = {
|
|
|
39
39
|
[dep: string]: IndividualExternalDepConfig;
|
|
40
40
|
};
|
|
41
41
|
export type AdvancedOutputConfig = {
|
|
42
|
-
destination
|
|
42
|
+
destination?: string;
|
|
43
43
|
withLegacyBlocksIn?: string | undefined;
|
|
44
44
|
additionalDependencies?: string[];
|
|
45
45
|
directoryLayout?: SourceType;
|
|
@@ -48,11 +48,12 @@ export type AdvancedOutputConfig = {
|
|
|
48
48
|
bundleAnalyzer?: boolean;
|
|
49
49
|
locations?: UsageLocations;
|
|
50
50
|
};
|
|
51
|
+
export type VerifiedAdvancedOutputConfig = Omit<AdvancedOutputConfig, 'destination'> & Required<Pick<AdvancedOutputConfig, 'destination'>>;
|
|
51
52
|
export type PlauditWordpressWebpackConfig = {
|
|
52
53
|
standaloneBlocks?: boolean;
|
|
53
54
|
variables?: Record<string, any>;
|
|
54
55
|
verbose?: boolean;
|
|
55
|
-
src: string[] | Record<string, string | AdvancedOutputConfig>;
|
|
56
|
+
src: string[] | Record<string, string | AdvancedOutputConfig | boolean>;
|
|
56
57
|
stats?: Configuration['stats'];
|
|
57
58
|
postcss?: {
|
|
58
59
|
functions?: (variables: (name: string) => unknown) => PostcssFunctionsOptions['functions'];
|
|
@@ -67,6 +68,7 @@ export type PlauditWordpressWebpackConfig = {
|
|
|
67
68
|
plainEntrypointsHandlePrefix?: string;
|
|
68
69
|
plainEntrypointsVersion?: 1 | 2;
|
|
69
70
|
srcDir?: string;
|
|
71
|
+
srcPrefixes?: string[];
|
|
70
72
|
};
|
|
71
73
|
export declare function makeEmittableConfigPHP(data: any): string;
|
|
72
74
|
export type Sync<V> = {
|
|
@@ -85,4 +87,9 @@ export declare class SyncsManager<V> {
|
|
|
85
87
|
private makeSync;
|
|
86
88
|
}
|
|
87
89
|
export declare function leadingSlashIt(pathOrSomething: string): string;
|
|
90
|
+
export declare const scriptExtension: RegExp;
|
|
91
|
+
export declare const scriptWithoutModuleExtension: RegExp;
|
|
92
|
+
export declare const scriptWithModuleExtension: RegExp;
|
|
93
|
+
export declare const styleExtension: RegExp;
|
|
94
|
+
export declare function scriptOrStyleTest(entryPath: string, scriptExtension: RegExp): "" | "script" | "style";
|
|
88
95
|
export {};
|
package/build/shared.js
CHANGED
|
@@ -3,11 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SyncsManager = exports.standardLocationNames = void 0;
|
|
6
|
+
exports.styleExtension = exports.scriptWithModuleExtension = exports.scriptWithoutModuleExtension = exports.scriptExtension = exports.SyncsManager = exports.standardLocationNames = void 0;
|
|
7
7
|
exports.isRawAssetData = isRawAssetData;
|
|
8
8
|
exports.determineCurrentSourceType = determineCurrentSourceType;
|
|
9
9
|
exports.makeEmittableConfigPHP = makeEmittableConfigPHP;
|
|
10
10
|
exports.leadingSlashIt = leadingSlashIt;
|
|
11
|
+
exports.scriptOrStyleTest = scriptOrStyleTest;
|
|
11
12
|
const json_to_php_but_with____injection_1 = __importDefault(require("./utils/json-to-php-but-with-__-injection"));
|
|
12
13
|
function isRawAssetData(thing) {
|
|
13
14
|
if (!thing || typeof thing !== 'object') {
|
|
@@ -70,3 +71,10 @@ exports.SyncsManager = SyncsManager;
|
|
|
70
71
|
function leadingSlashIt(pathOrSomething) {
|
|
71
72
|
return pathOrSomething.startsWith('/') ? pathOrSomething : ('/' + pathOrSomething);
|
|
72
73
|
}
|
|
74
|
+
exports.scriptExtension = /(?<filename>.+)(?<extension>\.m?[jt]sx?)$/i;
|
|
75
|
+
exports.scriptWithoutModuleExtension = /(?<filename>.+)(?<extension>\.[jt]sx?)$/i;
|
|
76
|
+
exports.scriptWithModuleExtension = /(?<filename>.+)(?<extension>\.m[jt]sx?)$/i;
|
|
77
|
+
exports.styleExtension = /(?<filename>.+)(?<extension>\.(p?c|sa)ss)$/i;
|
|
78
|
+
function scriptOrStyleTest(entryPath, scriptExtension) {
|
|
79
|
+
return scriptExtension.test(entryPath) ? "script" : (exports.styleExtension.test(entryPath) ? "style" : "");
|
|
80
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { PlauditWordpressWebpackConfig, VerifiedAdvancedOutputConfig } from "../shared";
|
|
2
2
|
import type { Compiler, Configuration, EntryObject, WebpackPluginInstance } from "webpack";
|
|
3
3
|
import type WebpackRemoveEmptyScriptsPlugin from "webpack-remove-empty-scripts";
|
|
4
4
|
export type VerifiedPlauditWordpressWebpackConfig = Required<Omit<PlauditWordpressWebpackConfig, 'variables' | 'src' | 'externals'>> & {
|
|
@@ -16,11 +16,7 @@ export type CommonConfigProcessingResult = {
|
|
|
16
16
|
scriptExtension: RegExp;
|
|
17
17
|
updateCurrentVariables: (value: VerifiedPlauditWordpressWebpackConfig['currentVariables']) => unknown;
|
|
18
18
|
};
|
|
19
|
-
export declare const scriptWithoutModuleExtension: RegExp;
|
|
20
|
-
export declare const scriptWithModuleExtension: RegExp;
|
|
21
|
-
export declare const styleExtension: RegExp;
|
|
22
|
-
export declare function scriptOrStyleTest(entryPath: string, scriptExtension: RegExp): "" | "script" | "style";
|
|
23
19
|
export declare function joinPossiblyAbsolutePaths(...paths: (string | undefined)[]): string;
|
|
24
20
|
export declare function groupEntrypointsByAssetFile<T>(entrypoints: T[], entrypointNameExtractor: (t: T) => string): Map<string, T[]>;
|
|
25
|
-
export declare function resolveEntryFromDirectory(commonConfig: CommonConfigProcessingResult, srcRoot: string, dest:
|
|
26
|
-
export declare function commonMakeWebpackConfig(config: VerifiedPlauditWordpressWebpackConfig, commonConfig: CommonConfigProcessingResult, webpackConfig: Configuration, srcIsDirectory: boolean, dest:
|
|
21
|
+
export declare function resolveEntryFromDirectory(commonConfig: CommonConfigProcessingResult, srcRoot: string, dest: VerifiedAdvancedOutputConfig): () => Promise<EntryObject>;
|
|
22
|
+
export declare function commonMakeWebpackConfig(config: VerifiedPlauditWordpressWebpackConfig, commonConfig: CommonConfigProcessingResult, webpackConfig: Configuration, srcIsDirectory: boolean, dest: VerifiedAdvancedOutputConfig, src: string, srcRoot: string | string[], entry: () => Promise<EntryObject> | EntryObject, plugins: CommonPluginConfig['plugins']): Configuration;
|
|
@@ -3,23 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.styleExtension = exports.scriptWithModuleExtension = exports.scriptWithoutModuleExtension = void 0;
|
|
7
|
-
exports.scriptOrStyleTest = scriptOrStyleTest;
|
|
8
6
|
exports.joinPossiblyAbsolutePaths = joinPossiblyAbsolutePaths;
|
|
9
7
|
exports.groupEntrypointsByAssetFile = groupEntrypointsByAssetFile;
|
|
10
8
|
exports.resolveEntryFromDirectory = resolveEntryFromDirectory;
|
|
11
9
|
exports.commonMakeWebpackConfig = commonMakeWebpackConfig;
|
|
12
10
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
13
11
|
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const shared_1 = require("../shared");
|
|
14
13
|
const copy_webpack_plugin_1 = __importDefault(require("copy-webpack-plugin"));
|
|
15
14
|
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
16
15
|
const BlockJSONManagingPlugin_1 = require("../plugins/BlockJSONManagingPlugin");
|
|
17
|
-
exports.scriptWithoutModuleExtension = /\.[jt]sx?$/;
|
|
18
|
-
exports.scriptWithModuleExtension = /\.m[jt]sx?$/;
|
|
19
|
-
exports.styleExtension = /\.(p?c|sa)ss$/;
|
|
20
|
-
function scriptOrStyleTest(entryPath, scriptExtension) {
|
|
21
|
-
return scriptExtension.test(entryPath) ? "script" : (exports.styleExtension.test(entryPath) ? "style" : "");
|
|
22
|
-
}
|
|
23
16
|
let isInThemeCache = undefined;
|
|
24
17
|
function isInTheme() {
|
|
25
18
|
return isInThemeCache ?? (isInThemeCache = node_fs_1.default.existsSync(node_path_1.default.join(process.cwd(), "theme.json")));
|
|
@@ -77,21 +70,21 @@ function parseEntrypointsJSON(dir, dest) {
|
|
|
77
70
|
}
|
|
78
71
|
}
|
|
79
72
|
function determineEntrypointType(entrypoint, scriptExtension) {
|
|
80
|
-
let res = scriptOrStyleTest(entrypoint[0], scriptExtension);
|
|
73
|
+
let res = (0, shared_1.scriptOrStyleTest)(entrypoint[0], scriptExtension);
|
|
81
74
|
if (res) {
|
|
82
75
|
return res;
|
|
83
76
|
}
|
|
84
77
|
if (typeof entrypoint[1] === 'string') {
|
|
85
|
-
return scriptOrStyleTest(entrypoint[1], scriptExtension);
|
|
78
|
+
return (0, shared_1.scriptOrStyleTest)(entrypoint[1], scriptExtension);
|
|
86
79
|
}
|
|
87
80
|
else if (Array.isArray(entrypoint[1])) {
|
|
88
|
-
return entrypoint[1].reduce((prior, ep) => prior || scriptOrStyleTest(ep, scriptExtension), "");
|
|
81
|
+
return entrypoint[1].reduce((prior, ep) => prior || (0, shared_1.scriptOrStyleTest)(ep, scriptExtension), "");
|
|
89
82
|
}
|
|
90
83
|
else if (typeof entrypoint[1].import === 'string') {
|
|
91
|
-
return scriptOrStyleTest(entrypoint[1].import, scriptExtension);
|
|
84
|
+
return (0, shared_1.scriptOrStyleTest)(entrypoint[1].import, scriptExtension);
|
|
92
85
|
}
|
|
93
86
|
else {
|
|
94
|
-
return entrypoint[1].import.reduce((prior, ep) => prior || scriptOrStyleTest(ep, scriptExtension), "");
|
|
87
|
+
return entrypoint[1].import.reduce((prior, ep) => prior || (0, shared_1.scriptOrStyleTest)(ep, scriptExtension), "");
|
|
95
88
|
}
|
|
96
89
|
}
|
|
97
90
|
function injectTypeAndCountToEntrypointName(entrypointName, type, typeCounts) {
|
|
@@ -260,13 +253,13 @@ function commonMakeWebpackConfig(config, commonConfig, webpackConfig, srcIsDirec
|
|
|
260
253
|
else {
|
|
261
254
|
outputLibrary = webpackConfig.output?.library;
|
|
262
255
|
}
|
|
263
|
-
const canCopyFiles = srcIsDirectory && src !== dest;
|
|
256
|
+
const canCopyFiles = srcIsDirectory && src !== dest.destination;
|
|
264
257
|
const possiblePlugins = canCopyFiles
|
|
265
258
|
? plugins.map(plugin => !processingModules && plugin.constructor.name === 'CopyPlugin'
|
|
266
259
|
? new copy_webpack_plugin_1.default({
|
|
267
260
|
patterns: [{
|
|
268
261
|
from: standaloneBlocks ? '**/(block.json|*.(php|twig|svg))' : '**/(block.json|*.(asset\.php|svg))',
|
|
269
|
-
to:
|
|
262
|
+
to: dest.destination,
|
|
270
263
|
context: srcRoot /* canCopyFiles can only be true if srcRoot is a string, so this is safe */, noErrorOnMissing: true
|
|
271
264
|
}]
|
|
272
265
|
})
|
|
@@ -36,8 +36,10 @@ function resolveLegacyBlockScriptsInFolder(folder) {
|
|
|
36
36
|
}
|
|
37
37
|
return blockScriptEntrypoints;
|
|
38
38
|
}
|
|
39
|
-
function testForDuplicatedEntryPaths(
|
|
40
|
-
const seenPaths = (0, common_config_helpers_1.groupEntrypointsByAssetFile)(Array.isArray(
|
|
39
|
+
function testForDuplicatedEntryPaths(sources) {
|
|
40
|
+
const seenPaths = (0, common_config_helpers_1.groupEntrypointsByAssetFile)(Array.isArray(sources)
|
|
41
|
+
? sources.map(s => typeof s === 'string' ? s : s[1].destination)
|
|
42
|
+
: Object.values(sources).map(bn => typeof bn === 'string' ? bn : bn.destination), bn => bn);
|
|
41
43
|
let projectPrefix = undefined;
|
|
42
44
|
let duplicatedPaths = "";
|
|
43
45
|
for (const sameNamePaths of seenPaths.values()) {
|
|
@@ -166,8 +168,15 @@ function injectSupportForInliningSVGsAsStrings(rules) {
|
|
|
166
168
|
});
|
|
167
169
|
}
|
|
168
170
|
function buildVerifiedConfig(config) {
|
|
169
|
-
testForDuplicatedEntryPaths(config);
|
|
170
171
|
const { standaloneBlocks = false, stats = 'errors-warnings', variables: rawVariables, verbose = process.argv.includes('--verbose') || process.env['VERBOSE'] === 'true', postcss = {}, externals, assumeGlobalizedPlauditLibraries = true, processTranslationConfigs = true, combineAssetMetadata = true, useWebpackResourceFiltering = true, outputDir = "", extensionsVersion = 1, plainEntrypointsHandlePrefix = "", plainEntrypointsVersion = 1, srcDir = "" } = config;
|
|
172
|
+
let srcPrefixes;
|
|
173
|
+
const trailingSlashedSrcDir = srcDir && !srcDir.endsWith("/") ? srcDir + "/" : srcDir;
|
|
174
|
+
if (config.srcPrefixes === undefined) {
|
|
175
|
+
srcPrefixes = srcDir ? [trailingSlashedSrcDir] : ["src/"];
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
srcPrefixes = (srcDir && !config.srcPrefixes.includes(trailingSlashedSrcDir) ? [...config.srcPrefixes, trailingSlashedSrcDir] : config.srcPrefixes);
|
|
179
|
+
}
|
|
171
180
|
if (plainEntrypointsVersion > 1) {
|
|
172
181
|
if (!plainEntrypointsHandlePrefix) {
|
|
173
182
|
throw new Error("Plain Entrypoints V2 and higher require 'plainEntrypointsHandlePrefix' to be set");
|
|
@@ -176,6 +185,47 @@ function buildVerifiedConfig(config) {
|
|
|
176
185
|
throw new Error("Plain Entrypoints V2 and higher require 'outputDir' to be set");
|
|
177
186
|
}
|
|
178
187
|
}
|
|
188
|
+
const normalizeSrcAndDestination = ([src, dest]) => {
|
|
189
|
+
if (srcDir) {
|
|
190
|
+
src = node_path_1.default.join(srcDir, src);
|
|
191
|
+
}
|
|
192
|
+
src = node_path_1.default.isAbsolute(src) ? node_path_1.default.relative(process.cwd(), src) : src;
|
|
193
|
+
if (dest.destination !== undefined && node_path_1.default.isAbsolute(dest.destination)) {
|
|
194
|
+
dest = { ...dest, destination: node_path_1.default.relative(process.cwd(), dest.destination) };
|
|
195
|
+
}
|
|
196
|
+
return [src, dest];
|
|
197
|
+
};
|
|
198
|
+
const rawSources = Array.isArray(config.src)
|
|
199
|
+
? config.src.map(s => normalizeSrcAndDestination([s, { destination: s }]))
|
|
200
|
+
: Object.entries(config.src)
|
|
201
|
+
.map(([k, v]) => {
|
|
202
|
+
return normalizeSrcAndDestination([k, typeof v === 'boolean' ? {} : (typeof v === 'string' ? { destination: v } : v)]);
|
|
203
|
+
});
|
|
204
|
+
// Destination -> source map
|
|
205
|
+
const allocatedDestinations = {};
|
|
206
|
+
const partiallyVerifiedSources = rawSources.map(rawSource => {
|
|
207
|
+
const destination = rawSource[1].destination;
|
|
208
|
+
if (destination !== undefined) {
|
|
209
|
+
const effectiveDestination = toEffectiveWebpackDestination(destination);
|
|
210
|
+
allocatedDestinations[effectiveDestination] = rawSource[0]; // We need to pre-populate the allocatedDestinations map with statically-declared destinations
|
|
211
|
+
return [rawSource[0], { ...rawSource[1], destination, effectiveDestination, staticallyDeclaredDestination: true }];
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
const naiveDestination = deriveNaiveDestinationFromUnverifiedSourceEntry(rawSource, srcPrefixes);
|
|
215
|
+
const effectiveDestination = toEffectiveWebpackDestination(naiveDestination);
|
|
216
|
+
return [rawSource[0], { ...rawSource[1], destination: naiveDestination, effectiveDestination, staticallyDeclaredDestination: false }];
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
const dynamicEffectiveDestinationsWithExpectedNaiveDuplicates = partiallyVerifiedSources
|
|
220
|
+
.filter(entry => !entry[1].staticallyDeclaredDestination)
|
|
221
|
+
.map(entry => entry[1].effectiveDestination)
|
|
222
|
+
.reduce((a, dest) => {
|
|
223
|
+
a[dest] = (a[dest] !== undefined); // If it's undefined, then this is the first instance, otherwise, it's not the first instance and, therefore, is expected to be a duplicate
|
|
224
|
+
return a;
|
|
225
|
+
}, {});
|
|
226
|
+
const sources = partiallyVerifiedSources
|
|
227
|
+
.map(entry => finalizeEntryDestination(entry, dynamicEffectiveDestinationsWithExpectedNaiveDuplicates, allocatedDestinations));
|
|
228
|
+
testForDuplicatedEntryPaths(sources);
|
|
179
229
|
let variablesFilePath = undefined;
|
|
180
230
|
const currentVariables = rawVariables ?? {};
|
|
181
231
|
if (!rawVariables) {
|
|
@@ -183,22 +233,52 @@ function buildVerifiedConfig(config) {
|
|
|
183
233
|
}
|
|
184
234
|
const cfg = {
|
|
185
235
|
currentVariables, postcss, standaloneBlocks, stats, variablesFilePath, verbose, externals, assumeGlobalizedPlauditLibraries, processTranslationConfigs, combineAssetMetadata,
|
|
186
|
-
useWebpackResourceFiltering, outputDir, extensionsVersion, plainEntrypointsVersion, plainEntrypointsHandlePrefix, srcDir
|
|
236
|
+
useWebpackResourceFiltering, outputDir, extensionsVersion, plainEntrypointsVersion, plainEntrypointsHandlePrefix, srcDir, srcPrefixes
|
|
187
237
|
};
|
|
188
|
-
const sources = (Array.isArray(config.src) ? config.src.map(s => [s, s]) : Object.entries(config.src))
|
|
189
|
-
.map(entry => {
|
|
190
|
-
let dest = typeof entry[1] === 'string' ? { destination: entry[1] } : entry[1];
|
|
191
|
-
if (srcDir) {
|
|
192
|
-
return [node_path_1.default.join(srcDir, entry[0]), dest];
|
|
193
|
-
}
|
|
194
|
-
const relativeSrc = node_path_1.default.isAbsolute(entry[0]) ? node_path_1.default.relative(process.cwd(), entry[0]) : entry[0];
|
|
195
|
-
if (node_path_1.default.isAbsolute(dest.destination)) {
|
|
196
|
-
dest = { ...dest, destination: node_path_1.default.relative(process.cwd(), dest.destination) };
|
|
197
|
-
}
|
|
198
|
-
return [relativeSrc, dest];
|
|
199
|
-
});
|
|
200
238
|
return cfg.outputDir ? { cfg, sources } : withDerivedOutputDir(cfg, sources);
|
|
201
239
|
}
|
|
240
|
+
function toEffectiveWebpackDestination(destination) {
|
|
241
|
+
const pathParts = node_path_1.default.parse(destination);
|
|
242
|
+
return node_path_1.default.join(pathParts.dir, pathParts.name);
|
|
243
|
+
}
|
|
244
|
+
function deriveNaiveDestinationFromUnverifiedSourceEntry([src, { destination }], srcPrefixes) {
|
|
245
|
+
if (destination !== undefined) {
|
|
246
|
+
return destination;
|
|
247
|
+
}
|
|
248
|
+
const commaIndex = src.indexOf(',');
|
|
249
|
+
const primarySource = stripSrcPrefix(commaIndex > -1 ? src.substring(0, commaIndex).trim() : src, srcPrefixes);
|
|
250
|
+
const scriptParts = shared_1.scriptExtension.exec(primarySource);
|
|
251
|
+
if (scriptParts !== null) {
|
|
252
|
+
return `${scriptParts.groups['filename']}.js`; // filename is always defined here
|
|
253
|
+
}
|
|
254
|
+
const styleParts = shared_1.styleExtension.exec(primarySource);
|
|
255
|
+
if (styleParts !== null) {
|
|
256
|
+
return `${styleParts.groups['filename']}.css`; // filename is always defined here
|
|
257
|
+
}
|
|
258
|
+
return primarySource;
|
|
259
|
+
}
|
|
260
|
+
function stripSrcPrefix(src, srcPrefixes) {
|
|
261
|
+
const prefix = srcPrefixes.find(sp => src.startsWith(sp));
|
|
262
|
+
if (!prefix) {
|
|
263
|
+
return src;
|
|
264
|
+
}
|
|
265
|
+
return src[prefix.length] === '/' ? src.substring(prefix.length + 1) : src.substring(prefix.length);
|
|
266
|
+
}
|
|
267
|
+
function finalizeEntryDestination(entry, dynamicEffectiveDestinationsWithExpectedNaiveDuplicates, allocatedDestinations) {
|
|
268
|
+
if (entry[1].staticallyDeclaredDestination) {
|
|
269
|
+
return entry;
|
|
270
|
+
}
|
|
271
|
+
const extension = node_path_1.default.extname(entry[1].destination);
|
|
272
|
+
const filename = dynamicEffectiveDestinationsWithExpectedNaiveDuplicates[entry[1].effectiveDestination]
|
|
273
|
+
? entry[1].effectiveDestination + (extension === '.css' ? "_style" : "_script")
|
|
274
|
+
: entry[1].effectiveDestination;
|
|
275
|
+
let count = 0, derivedDestination = filename + extension;
|
|
276
|
+
while (derivedDestination in allocatedDestinations && allocatedDestinations[derivedDestination] !== entry[0]) {
|
|
277
|
+
derivedDestination = `${filename}_${++count}${extension}`; // We don't want to add deduplication indexes unless absolutely necessary
|
|
278
|
+
}
|
|
279
|
+
allocatedDestinations[derivedDestination] = entry[0];
|
|
280
|
+
return [entry[0], { ...entry[1], destination: derivedDestination }];
|
|
281
|
+
}
|
|
202
282
|
function withDerivedOutputDir(cfg, sources) {
|
|
203
283
|
const destinations = sources.map(([_, { destination }]) => destination.split(/[\/\\]/g));
|
|
204
284
|
if (destinations.length < 2) {
|
|
@@ -220,7 +300,7 @@ function withDerivedOutputDir(cfg, sources) {
|
|
|
220
300
|
function handleDisablingTSCheckerIfNecessary(srcRoot, scriptExtension, plugins) {
|
|
221
301
|
if (process.env["NO_TS_CHECKER"] !== "true") {
|
|
222
302
|
const include = (Array.isArray(srcRoot) ? srcRoot : [srcRoot])
|
|
223
|
-
.filter(sr => node_path_1.default.extname(sr).length === 0 || (0,
|
|
303
|
+
.filter(sr => node_path_1.default.extname(sr).length === 0 || (0, shared_1.scriptOrStyleTest)(sr, scriptExtension) === "script")
|
|
224
304
|
.map(sr => node_path_1.default.extname(sr).length > 0 ? sr : node_path_1.default.join(sr, "**", "*"));
|
|
225
305
|
if (include.length > 0) {
|
|
226
306
|
plugins.push(new fork_ts_checker_webpack_plugin_1.default({
|
|
@@ -264,7 +344,7 @@ function buildCommonPluginConfig(srcRoot, scriptExtension, webpackConfig, dest,
|
|
|
264
344
|
})
|
|
265
345
|
?? [];
|
|
266
346
|
plugins.splice(0, 0, new PackageConfigSanityChecker_1.PackageConfigSanityChecker());
|
|
267
|
-
if (
|
|
347
|
+
if (dest.bundleAnalyzer) {
|
|
268
348
|
plugins.splice(0, 0, new (require("webpack-bundle-analyzer").BundleAnalyzerPlugin)({ analyzerMode: 'static' }));
|
|
269
349
|
}
|
|
270
350
|
handleDisablingTSCheckerIfNecessary(srcRoot, scriptExtension, plugins);
|
|
@@ -279,19 +359,19 @@ function buildCommonPluginConfig(srcRoot, scriptExtension, webpackConfig, dest,
|
|
|
279
359
|
if (variablesFilePath) {
|
|
280
360
|
plugins.push(new VariablesJSMonitorPlugin_1.VariablesJSMonitorPlugin(variablesFilePath));
|
|
281
361
|
}
|
|
282
|
-
const
|
|
283
|
-
if (
|
|
362
|
+
const dependencyExtractionPluginIndex = plugins.findIndex(plugin => plugin instanceof dependency_extraction_webpack_plugin_1.default);
|
|
363
|
+
if (dependencyExtractionPluginIndex === -1) {
|
|
284
364
|
console.error("Cannot apply externals when they have been disabled via CLI flag. This will greatly increase bundle size and will likely cause the build to fail");
|
|
285
365
|
}
|
|
286
366
|
else {
|
|
287
|
-
const localAssumeGlobalizedPlauditLibraries =
|
|
367
|
+
const localAssumeGlobalizedPlauditLibraries = dest.assumeGlobalizedPlauditLibraries ?? assumeGlobalizedPlauditLibraries;
|
|
288
368
|
const wantsGroupedDepData = combineAssetMetadata
|
|
289
369
|
&& ((!processingModules && sourceType === "blocks" /* SourceType.blocks */)
|
|
290
370
|
|| (extensionsVersion > 1 && sourceType === "extensions" /* SourceType.extensions */)
|
|
291
371
|
|| (plainEntrypointsVersion > 1 && sourceType === "plain" /* SourceType.plain */));
|
|
292
|
-
const builtDependencyExtractionWebpackPlugin = (0, dependency_extraction_webpack_plugin_config_builder_1.makeDependencyExtractionPlugin)(externals, localAssumeGlobalizedPlauditLibraries, wantsGroupedDepData,
|
|
293
|
-
plugins[
|
|
294
|
-
plugins.push(new AdditionalDependencyInjectorPlugin_1.AdditionalDependencyInjectorPlugin(
|
|
372
|
+
const builtDependencyExtractionWebpackPlugin = (0, dependency_extraction_webpack_plugin_config_builder_1.makeDependencyExtractionPlugin)(externals, localAssumeGlobalizedPlauditLibraries, wantsGroupedDepData, dest.externalize);
|
|
373
|
+
plugins[dependencyExtractionPluginIndex] = builtDependencyExtractionWebpackPlugin.instance;
|
|
374
|
+
plugins.push(new AdditionalDependencyInjectorPlugin_1.AdditionalDependencyInjectorPlugin(dest.additionalDependencies ? dest.additionalDependencies : [], processingModules, builtDependencyExtractionWebpackPlugin.addExternalizedDep));
|
|
295
375
|
}
|
|
296
376
|
if (process.argv.includes('--browser-sync') || process.env['BROWSER_SYNC'] === 'true') {
|
|
297
377
|
plugins.push(new BrowserSyncPlugin_1.BrowserSyncPlugin());
|
|
@@ -303,11 +383,11 @@ function commonConfigProcessingPrep(config, webpackConfig) {
|
|
|
303
383
|
let entrypointFields;
|
|
304
384
|
const processingModules = webpackConfig.output?.module;
|
|
305
385
|
if (processingModules) {
|
|
306
|
-
scriptExtension =
|
|
386
|
+
scriptExtension = shared_1.scriptWithModuleExtension;
|
|
307
387
|
entrypointFields = ["viewScriptModule", "scriptModule"];
|
|
308
388
|
}
|
|
309
389
|
else {
|
|
310
|
-
scriptExtension =
|
|
390
|
+
scriptExtension = shared_1.scriptWithoutModuleExtension;
|
|
311
391
|
entrypointFields = ["editorStyle", "viewStyle", "style", "editorScript", "viewScript", "script"];
|
|
312
392
|
}
|
|
313
393
|
let currentVariables = config.currentVariables;
|
|
@@ -333,7 +413,6 @@ function commonConfigProcessingPrep(config, webpackConfig) {
|
|
|
333
413
|
updateCurrentVariables: (value) => currentVariables = value
|
|
334
414
|
};
|
|
335
415
|
}
|
|
336
|
-
//TODO: Implement path deduplication w/ the same code we use for block.json (only for plain v2 w/ specified handles
|
|
337
416
|
//TODO: Try using context to avoid needing to cobble dest paths together?
|
|
338
417
|
function processIndividualWebpackConfig(config, webpackConfig, sources) {
|
|
339
418
|
const commonConfig = commonConfigProcessingPrep(config, webpackConfig);
|
|
@@ -341,7 +420,7 @@ function processIndividualWebpackConfig(config, webpackConfig, sources) {
|
|
|
341
420
|
return sources.map(([src, dest]) => {
|
|
342
421
|
const srcRoots = (dest.withLegacyBlocksIn
|
|
343
422
|
? [...src.split(','), ...resolveLegacyBlockScriptsInFolder(node_path_1.default.join(config.srcDir, dest.withLegacyBlocksIn))]
|
|
344
|
-
: src.split(',')).filter(s => s.endsWith(".json") || !s.substring(s.lastIndexOf('/')).includes('.') || processingModules ===
|
|
423
|
+
: src.split(',')).filter(s => s.endsWith(".json") || !s.substring(s.lastIndexOf('/')).includes('.') || processingModules === shared_1.scriptWithModuleExtension.test(s));
|
|
345
424
|
const srcRoot = srcRoots.length < 2 ? (0, common_config_helpers_1.joinPossiblyAbsolutePaths)(process.cwd(), src) : srcRoots.map(s => (0, common_config_helpers_1.joinPossiblyAbsolutePaths)(process.cwd(), s));
|
|
346
425
|
const srcIsDirectory = !Array.isArray(srcRoot) && node_fs_1.default.lstatSync(srcRoot, { throwIfNoEntry: false })?.isDirectory();
|
|
347
426
|
if (srcIsDirectory === undefined) {
|
|
@@ -388,7 +467,7 @@ function makeExtensionsWebpackConfig(config, commonConfig, webpackConfig, dest,
|
|
|
388
467
|
const rawEntrypoints = [];
|
|
389
468
|
for await (const dirent of await promises_1.default.opendir(srcRoot)) {
|
|
390
469
|
if (dirent.isFile() && !dirent.name.startsWith("~")) {
|
|
391
|
-
if (commonConfig.scriptExtension.test(dirent.name) ||
|
|
470
|
+
if (commonConfig.scriptExtension.test(dirent.name) || shared_1.styleExtension.test(dirent.name)) {
|
|
392
471
|
const file = (0, common_config_helpers_1.joinPossiblyAbsolutePaths)(srcRoot, dirent.name);
|
|
393
472
|
rawEntrypoints.push([node_path_1.default.join(dest.destination, node_path_1.default.basename(file, node_path_1.default.extname(file))), file]);
|
|
394
473
|
}
|