Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 278db9b

Browse files
authored
Cleanup for --formats, templateFormats config, and setTemplateFormats addTemplateFormats configuration API methods (#3255)
2 parents 4c5d44d + db71034 commit 278db9b

34 files changed

Lines changed: 518 additions & 136 deletions

cmd.cjs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ const debug = require("debug")("Eleventy:cmd");
8080
// reuse ErrorHandler instance in Eleventy
8181
errorHandler = elev.errorHandler;
8282

83+
// Before init
84+
elev.setFormats(argv.formats);
85+
8386
// careful, we can’t use async/await here to error properly
8487
// with old node versions in `please-upgrade-node` above.
8588
elev
@@ -92,7 +95,6 @@ const debug = require("debug")("Eleventy:cmd");
9295

9396
elev.setIgnoreInitial(argv["ignore-initial"]);
9497
elev.setIncrementalBuild(argv.incremental);
95-
elev.setFormats(argv.formats);
9698

9799
try {
98100
if (argv.serve) {

src/Data/TemplateData.js

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import path from "node:path";
2+
import semver from "semver";
23

34
import lodash from "@11ty/lodash-custom";
45
import { TemplatePath, isPlainObject } from "@11ty/eleventy-utils";
@@ -10,15 +11,12 @@ import TemplateGlob from "../TemplateGlob.js";
1011
import EleventyExtensionMap from "../EleventyExtensionMap.js";
1112
import EleventyBaseError from "../Errors/EleventyBaseError.js";
1213
import TemplateDataInitialGlobalData from "./TemplateDataInitialGlobalData.js";
13-
import { getEleventyPackageJson } from "../Util/ImportJsonSync.js";
14-
import {
15-
EleventyImport,
16-
EleventyLoadContent,
17-
normalizeFilePathInEleventyPackage,
18-
} from "../Util/Require.js";
14+
import { getEleventyPackageJson, getWorkingProjectPackageJson } from "../Util/ImportJsonSync.js";
15+
import { EleventyImport, EleventyLoadContent } from "../Util/Require.js";
1916
import { DeepFreeze } from "../Util/DeepFreeze.js";
2017

2118
const { set: lodashSet, get: lodashGet } = lodash;
19+
2220
const debugWarn = debugUtil("Eleventy:Warnings");
2321
const debug = debugUtil("Eleventy:TemplateData");
2422
const debugDev = debugUtil("Dev:Eleventy:TemplateData");
@@ -85,7 +83,8 @@ class TemplateData {
8583

8684
get extensionMap() {
8785
if (!this._extensionMap) {
88-
this._extensionMap = new EleventyExtensionMap([], this.eleventyConfig);
86+
this._extensionMap = new EleventyExtensionMap(this.eleventyConfig);
87+
this._extensionMap.setFormats([]);
8988
}
9089
return this._extensionMap;
9190
}
@@ -108,16 +107,24 @@ class TemplateData {
108107
}
109108

110109
getRawImports() {
110+
if (!this.config.keys.package) {
111+
debug(
112+
"Opted-out of package.json assignment for global data with falsy value for `keys.package` configuration.",
113+
);
114+
return this.rawImports;
115+
} else if (Object.keys(this.rawImports).length > 0) {
116+
return this.rawImports;
117+
}
118+
111119
try {
112-
let pkgJson = getEleventyPackageJson();
120+
let pkgJson = getWorkingProjectPackageJson();
113121
this.rawImports[this.config.keys.package] = pkgJson;
114122

115123
if (this.config.freezeReservedData) {
116124
DeepFreeze(this.rawImports);
117125
}
118126
} catch (e) {
119-
let pkgPath = normalizeFilePathInEleventyPackage("package.json");
120-
debug("Could not find and/or require package.json for data preprocessing at %o", pkgPath);
127+
debug("Could not find or require package.json import for global data.");
121128
}
122129

123130
return this.rawImports;
@@ -311,6 +318,15 @@ class TemplateData {
311318
this.configApiGlobalData = new Promise(async (resolve) => {
312319
let globalData = await this.initialGlobalData.getData();
313320

321+
if (!("eleventy" in globalData)) {
322+
globalData.eleventy = {};
323+
}
324+
325+
// #2293 for meta[name=generator]
326+
const pkg = getEleventyPackageJson();
327+
globalData.eleventy.version = semver.coerce(pkg.version).toString();
328+
globalData.eleventy.generator = `Eleventy v${globalData.eleventy.version}`;
329+
314330
if (this.environmentVariables) {
315331
if (!("env" in globalData.eleventy)) {
316332
globalData.eleventy.env = {};

src/Data/TemplateDataInitialGlobalData.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import semver from "semver";
21
import lodash from "@11ty/lodash-custom";
32

43
import EleventyBaseError from "../Errors/EleventyBaseError.js";
5-
import { getEleventyPackageJson } from "../Util/ImportJsonSync.js";
64

75
const { set: lodashSet } = lodash;
8-
const pkg = getEleventyPackageJson();
96

107
class TemplateDataConfigError extends EleventyBaseError {}
118

@@ -35,13 +32,6 @@ class TemplateDataInitialGlobalData {
3532
}
3633
}
3734

38-
if (!("eleventy" in globalData)) {
39-
globalData.eleventy = {};
40-
}
41-
// #2293 for meta[name=generator]
42-
globalData.eleventy.version = semver.coerce(pkg.version).toString();
43-
globalData.eleventy.generator = `Eleventy v${globalData.eleventy.version}`;
44-
4535
return globalData;
4636
}
4737
}

src/Eleventy.js

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import RenderPlugin, * as RenderPluginExtras from "./Plugins/RenderPlugin.js";
2626
import I18nPlugin, * as I18nPluginExtras from "./Plugins/I18nPlugin.js";
2727
import HtmlBasePlugin, * as HtmlBasePluginExtras from "./Plugins/HtmlBasePlugin.js";
2828
import { TransformPlugin as InputPathToUrlTransformPlugin } from "./Plugins/InputPathToUrl.js";
29+
import ProjectTemplateFormats from "./Util/ProjectTemplateFormats.js";
2930

3031
const pkg = getEleventyPackageJson();
3132
const debug = debugUtil("Eleventy");
@@ -42,8 +43,9 @@ const debug = debugUtil("Eleventy");
4243
* @returns {module:11ty/eleventy/Eleventy~Eleventy}
4344
*/
4445
class Eleventy {
45-
#directories; /* ProjectDirectories instance */
4646
#projectPackageJson; /* userspace package.json file contents */
47+
#directories; /* ProjectDirectories instance */
48+
#templateFormats; /* ProjectTemplateFormats instance */
4749

4850
constructor(input, output, options = {}, eleventyConfig = null) {
4951
/** @member {String} - Holds the path to the input (might be a file or folder) */
@@ -97,12 +99,6 @@ class Eleventy {
9799
*/
98100
this.needsInit = true;
99101

100-
/**
101-
* @member {Array<String>} - Subset of template types.
102-
* @default null
103-
*/
104-
this.formatsOverride = null;
105-
106102
/**
107103
* @member {Boolean} - Is this an incremental build? (only operates on a subset of input files)
108104
* @default false
@@ -139,6 +135,7 @@ class Eleventy {
139135
this.eleventyConfig.setProjectUsingEsm(this.isEsm);
140136
this.eleventyConfig.setLogger(this.logger);
141137
this.eleventyConfig.setDirectories(this.directories);
138+
this.eleventyConfig.setTemplateFormats(this.templateFormats);
142139

143140
if (this.pathPrefix || this.pathPrefix === "") {
144141
this.eleventyConfig.setPathPrefix(this.pathPrefix);
@@ -423,8 +420,10 @@ class Eleventy {
423420
await this.config.events.emit("eleventy.env", this.env);
424421
}
425422

426-
let formats = this.formatsOverride || this.config.templateFormats;
427-
this.extensionMap = new EleventyExtensionMap(formats, this.eleventyConfig);
423+
let formats = this.templateFormats.getTemplateFormats();
424+
425+
this.extensionMap = new EleventyExtensionMap(this.eleventyConfig);
426+
this.extensionMap.setFormats(formats);
428427
await this.config.events.emit("eleventy.extensionmap", this.extensionMap);
429428

430429
// eleventyServe is always available, even when not in --serve mode
@@ -617,16 +616,23 @@ Verbose Output: ${this.verboseMode}`;
617616
this.eleventyConfig.verbose = isVerbose;
618617
}
619618

619+
get templateFormats() {
620+
if (!this.#templateFormats) {
621+
let tf = new ProjectTemplateFormats();
622+
this.#templateFormats = tf;
623+
}
624+
625+
return this.#templateFormats;
626+
}
627+
620628
/**
621629
* Updates the template formats of Eleventy.
622630
*
623631
* @method
624632
* @param {String} formats - The new template formats.
625633
*/
626634
setFormats(formats) {
627-
if (formats && formats !== "*") {
628-
this.formatsOverride = formats.split(",");
629-
}
635+
this.templateFormats.setViaCommandLine(formats);
630636
}
631637

632638
/**

src/EleventyExtensionMap.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@ import EleventyBaseError from "./Errors/EleventyBaseError.js";
66
class EleventyExtensionMapConfigError extends EleventyBaseError {}
77

88
class EleventyExtensionMap {
9-
constructor(formatKeys, config) {
9+
constructor(config) {
1010
this.config = config;
1111

12-
this.formatKeys = formatKeys;
13-
14-
this.setFormats(formatKeys);
15-
1612
this._spiderJsDepsCache = {};
1713
}
1814

1915
setFormats(formatKeys = []) {
16+
// raw
17+
this.formatKeys = formatKeys;
18+
2019
this.unfilteredFormatKeys = formatKeys.map(function (key) {
2120
return key.trim().toLowerCase();
2221
});
@@ -251,6 +250,10 @@ class EleventyExtensionMap {
251250
return this._extensionToKeyMap;
252251
}
253252

253+
getAllTemplateKeys() {
254+
return Object.keys(this.extensionToKeyMap);
255+
}
256+
254257
getReadableFileExtensions() {
255258
return Object.keys(this.extensionToKeyMap).join(" ");
256259
}

src/EleventyFiles.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ class EleventyFiles {
130130
get extensionMap() {
131131
// for tests
132132
if (!this._extensionMap) {
133-
this._extensionMap = new EleventyExtensionMap(this.formats, this.eleventyConfig);
133+
this._extensionMap = new EleventyExtensionMap(this.eleventyConfig);
134+
this._extensionMap.setFormats(this.formats);
134135
this._extensionMap.config = this.eleventyConfig;
135136
}
136137
return this._extensionMap;

src/Engines/TemplateEngine.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ class TemplateEngine {
5555

5656
get extensionMap() {
5757
if (!this._extensionMap) {
58-
this._extensionMap = new EleventyExtensionMap([], this.eleventyConfig);
58+
this._extensionMap = new EleventyExtensionMap(this.eleventyConfig);
59+
this._extensionMap.setFormats([]);
5960
}
6061
return this._extensionMap;
6162
}

src/TemplateConfig.js

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import UserConfig from "./UserConfig.js";
99
import GlobalDependencyMap from "./GlobalDependencyMap.js";
1010
import ExistsCache from "./Util/ExistsCache.js";
1111
import merge from "./Util/Merge.js";
12-
import unique from "./Util/Unique.js";
1312
import eventBus from "./EventBus.js";
13+
import ProjectTemplateFormats from "./Util/ProjectTemplateFormats.js";
1414

1515
const debug = debugUtil("Eleventy:TemplateConfig");
1616
const debugDev = debugUtil("Dev:Eleventy:TemplateConfig");
@@ -50,6 +50,8 @@ class EleventyPluginError extends EleventyBaseError {}
5050
* @param {String} projectConfigPath - Path to local project config.
5151
*/
5252
class TemplateConfig {
53+
#templateFormats;
54+
5355
constructor(customRootConfig, projectConfigPath) {
5456
this.userConfig = new UserConfig();
5557

@@ -101,6 +103,18 @@ class TemplateConfig {
101103
this.userConfig.directories = directories.getUserspaceInstance();
102104
}
103105

106+
/* Setter for TemplateFormats instance */
107+
setTemplateFormats(templateFormats) {
108+
this.#templateFormats = templateFormats;
109+
}
110+
111+
get templateFormats() {
112+
if (!this.#templateFormats) {
113+
this.#templateFormats = new ProjectTemplateFormats();
114+
}
115+
return this.#templateFormats;
116+
}
117+
104118
/* Backwards compat */
105119
get inputDir() {
106120
return this.directories.input;
@@ -335,8 +349,6 @@ class TemplateConfig {
335349
this.directories.setViaConfigObject(exportedConfigObject.dir);
336350
}
337351

338-
// TODO (config) sync `exportedConfigObject` to the rest of `userConfig` (e.g. templateFormats)
339-
340352
if (typeof configDefaultReturn === "function") {
341353
localConfig = await configDefaultReturn(this.userConfig);
342354
} else {
@@ -399,20 +411,28 @@ class TemplateConfig {
399411
}
400412
}
401413

402-
// Template Formats:
403-
// 1. Root Config (usually defaultConfig.js)
404-
// 2. Local Config return object (project .eleventy.js)
405-
// 3.
406-
let templateFormats = this.rootConfig.templateFormats || [];
407-
if (localConfig && localConfig.templateFormats) {
408-
templateFormats = localConfig.templateFormats;
409-
delete localConfig.templateFormats;
414+
// `templateFormats` is an override via `setTemplateFormats`
415+
if (this.userConfig && this.userConfig.templateFormats) {
416+
this.templateFormats.setViaConfig(this.userConfig.templateFormats);
417+
} else if (localConfig?.templateFormats || this.rootConfig?.templateFormats) {
418+
// Local project config or defaultConfig.js
419+
this.templateFormats.setViaConfig(
420+
localConfig.templateFormats || this.rootConfig?.templateFormats,
421+
);
422+
}
423+
424+
// `templateFormatsAdded` is additive via `addTemplateFormats`
425+
if (this.userConfig && this.userConfig.templateFormatsAdded) {
426+
this.templateFormats.addViaConfig(this.userConfig.templateFormatsAdded);
410427
}
411428

412429
let mergedConfig = merge({}, this.rootConfig, localConfig);
413430

414431
// Setup a few properties for plugins:
415432

433+
// Set frozen templateFormats
434+
mergedConfig.templateFormats = Object.freeze(this.templateFormats.getTemplateFormats());
435+
416436
// Setup pathPrefix set via command line for plugin consumption
417437
if (this.overrides.pathPrefix) {
418438
mergedConfig.pathPrefix = this.overrides.pathPrefix;
@@ -433,9 +453,6 @@ class TemplateConfig {
433453
// But BEFORE the rest of the config options are merged
434454
// this way we can pass directories and other template information to plugins
435455

436-
// Temporarily restore templateFormats
437-
mergedConfig.templateFormats = templateFormats;
438-
439456
await this.userConfig.events.emit("eleventy.beforeConfig", this.userConfig);
440457

441458
let benchmarkManager = this.userConfig.benchmarkManager.get("Aggregate");
@@ -444,30 +461,17 @@ class TemplateConfig {
444461
await this.processPlugins(mergedConfig);
445462
pluginsBench.after();
446463

447-
delete mergedConfig.templateFormats;
448-
449464
let eleventyConfigApiMergingObject = this.userConfig.getMergingConfigObject();
450465

451-
// `templateFormats` is an override via `setTemplateFormats`
452-
// `templateFormatsAdded` is additive via `addTemplateFormats`
453-
if (eleventyConfigApiMergingObject && eleventyConfigApiMergingObject.templateFormats) {
454-
templateFormats = eleventyConfigApiMergingObject.templateFormats;
455-
delete eleventyConfigApiMergingObject.templateFormats;
466+
if ("templateFormats" in eleventyConfigApiMergingObject) {
467+
throw new Error(
468+
"Internal error: templateFormats should not return from `getMergingConfigObject`",
469+
);
456470
}
457471

458-
let templateFormatsAdded = eleventyConfigApiMergingObject.templateFormatsAdded || [];
459-
delete eleventyConfigApiMergingObject.templateFormatsAdded;
460-
461-
templateFormats = unique([...templateFormats, ...templateFormatsAdded]);
462-
463-
merge(mergedConfig, eleventyConfigApiMergingObject);
464-
465-
// Apply overrides, currently only pathPrefix uses this I think!
472+
// Overrides are only used by pathPrefix
466473
debug("Configuration overrides: %o", this.overrides);
467-
merge(mergedConfig, this.overrides);
468-
469-
// Restore templateFormats
470-
mergedConfig.templateFormats = templateFormats;
474+
merge(mergedConfig, eleventyConfigApiMergingObject, this.overrides);
471475

472476
debug("Current configuration: %o", mergedConfig);
473477

src/TemplateContent.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ class TemplateContent {
8181
/* Used by tests */
8282
get extensionMap() {
8383
if (!this._extensionMap) {
84-
this._extensionMap = new EleventyExtensionMap([], this.eleventyConfig);
84+
this._extensionMap = new EleventyExtensionMap(this.eleventyConfig);
85+
this._extensionMap.setFormats([]);
8586
}
8687
return this._extensionMap;
8788
}

0 commit comments

Comments
 (0)