bunki 0.18.0 → 0.18.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/README.md CHANGED
@@ -806,10 +806,12 @@ Bunki supports incremental builds for significantly faster rebuild times during
806
806
  ### Performance Impact
807
807
 
808
808
  **Large site example (455 posts):**
809
+
809
810
  - Full build: 3,128ms
810
811
  - Incremental build (no changes): 985ms (**3.2x faster**)
811
812
 
812
813
  **Speedup breakdown:**
814
+
813
815
  - Markdown parsing: 1,202ms → 55ms (**22x faster**)
814
816
  - CSS processing: 1,024ms → 1ms (**1024x faster**)
815
817
  - Overall: **68% faster builds**
@@ -873,11 +875,13 @@ echo ".bunki-cache.json" >> .gitignore
873
875
  ### When to Use
874
876
 
875
877
  **Recommended for:**
878
+
876
879
  - Large sites (100+ posts)
877
880
  - Development workflow with frequent rebuilds
878
881
  - Sites with slow CSS processing (Tailwind, PostCSS)
879
882
 
880
883
  **Not needed for:**
884
+
881
885
  - Small sites (<50 posts) - already fast enough
882
886
  - CI/CD builds - prefer clean full builds
883
887
  - Production deployments - always use full builds
@@ -912,6 +916,7 @@ Version 2.0.0 cache structure:
912
916
  ### Future Optimizations
913
917
 
914
918
  Current implementation (v0.18.0) optimizes parsing and CSS processing. Future versions may add:
919
+
915
920
  - Selective page regeneration (only rebuild changed posts)
916
921
  - Incremental sitemap/RSS updates
917
922
  - Smart index page regeneration
@@ -1092,7 +1097,20 @@ bunki/
1092
1097
 
1093
1098
  ## Changelog
1094
1099
 
1095
- ### v0.18.0 (Current)
1100
+ ### v0.18.1 (Current)
1101
+
1102
+ - **Page Generation Optimization**: Cache JSON-LD schemas and metadata during initialization
1103
+ - Eliminates 910 redundant operations per build (455 posts × 2)
1104
+ - `extractFirstImageUrl()` called once during initialization, cached in `post.image`
1105
+ - Word count calculated once, cached in `post.wordCount`
1106
+ - JSON-LD schemas pre-generated and cached in `post.jsonLd`
1107
+ - Removed duplicate schema generation from page and feed generators
1108
+ - **Deployment Optimization**: All deploy commands now use incremental builds by default
1109
+ - `deploy:all` now builds incrementally for faster deployments
1110
+ - Individual site deployments also use incremental builds
1111
+ - Full builds available via `build:full` when needed
1112
+
1113
+ ### v0.18.0
1096
1114
 
1097
1115
  - **Incremental Builds**: Smart caching for 3.2x faster development builds
1098
1116
  - File change detection using content hashing and modification times
package/dist/cli.js CHANGED
@@ -21506,7 +21506,7 @@ var require_picocolors = __commonJS((exports, module) => {
21506
21506
  module.exports.createColors = createColors;
21507
21507
  });
21508
21508
 
21509
- // node_modules/sanitize-html/node_modules/postcss/lib/tokenize.js
21509
+ // node_modules/postcss/lib/tokenize.js
21510
21510
  var require_tokenize = __commonJS((exports, module) => {
21511
21511
  var SINGLE_QUOTE = 39;
21512
21512
  var DOUBLE_QUOTE = 34;
@@ -21720,7 +21720,7 @@ var require_tokenize = __commonJS((exports, module) => {
21720
21720
  };
21721
21721
  });
21722
21722
 
21723
- // node_modules/sanitize-html/node_modules/postcss/lib/terminal-highlight.js
21723
+ // node_modules/postcss/lib/terminal-highlight.js
21724
21724
  var require_terminal_highlight = __commonJS((exports, module) => {
21725
21725
  var pico = require_picocolors();
21726
21726
  var tokenizer = require_tokenize();
@@ -21781,7 +21781,7 @@ var require_terminal_highlight = __commonJS((exports, module) => {
21781
21781
  module.exports = terminalHighlight;
21782
21782
  });
21783
21783
 
21784
- // node_modules/sanitize-html/node_modules/postcss/lib/css-syntax-error.js
21784
+ // node_modules/postcss/lib/css-syntax-error.js
21785
21785
  var require_css_syntax_error = __commonJS((exports, module) => {
21786
21786
  var pico = require_picocolors();
21787
21787
  var terminalHighlight = require_terminal_highlight();
@@ -21881,7 +21881,7 @@ var require_css_syntax_error = __commonJS((exports, module) => {
21881
21881
  CssSyntaxError.default = CssSyntaxError;
21882
21882
  });
21883
21883
 
21884
- // node_modules/sanitize-html/node_modules/postcss/lib/stringifier.js
21884
+ // node_modules/postcss/lib/stringifier.js
21885
21885
  var require_stringifier = __commonJS((exports, module) => {
21886
21886
  var DEFAULT_RAW = {
21887
21887
  after: `
@@ -22210,7 +22210,7 @@ var require_stringifier = __commonJS((exports, module) => {
22210
22210
  Stringifier.default = Stringifier;
22211
22211
  });
22212
22212
 
22213
- // node_modules/sanitize-html/node_modules/postcss/lib/stringify.js
22213
+ // node_modules/postcss/lib/stringify.js
22214
22214
  var require_stringify4 = __commonJS((exports, module) => {
22215
22215
  var Stringifier = require_stringifier();
22216
22216
  function stringify(node, builder) {
@@ -22221,13 +22221,13 @@ var require_stringify4 = __commonJS((exports, module) => {
22221
22221
  stringify.default = stringify;
22222
22222
  });
22223
22223
 
22224
- // node_modules/sanitize-html/node_modules/postcss/lib/symbols.js
22224
+ // node_modules/postcss/lib/symbols.js
22225
22225
  var require_symbols = __commonJS((exports, module) => {
22226
22226
  exports.isClean = Symbol("isClean");
22227
22227
  exports.my = Symbol("my");
22228
22228
  });
22229
22229
 
22230
- // node_modules/sanitize-html/node_modules/postcss/lib/node.js
22230
+ // node_modules/postcss/lib/node.js
22231
22231
  var require_node2 = __commonJS((exports, module) => {
22232
22232
  var CssSyntaxError = require_css_syntax_error();
22233
22233
  var Stringifier = require_stringifier();
@@ -22396,7 +22396,7 @@ var require_node2 = __commonJS((exports, module) => {
22396
22396
  let index = this.parent.index(this);
22397
22397
  return this.parent.nodes[index + 1];
22398
22398
  }
22399
- positionBy(opts) {
22399
+ positionBy(opts = {}) {
22400
22400
  let pos = this.source.start;
22401
22401
  if (opts.index) {
22402
22402
  pos = this.positionInside(opts.index);
@@ -22424,7 +22424,7 @@ var require_node2 = __commonJS((exports, module) => {
22424
22424
  column += 1;
22425
22425
  }
22426
22426
  }
22427
- return { column, line };
22427
+ return { column, line, offset: end };
22428
22428
  }
22429
22429
  prev() {
22430
22430
  if (!this.parent)
@@ -22432,20 +22432,23 @@ var require_node2 = __commonJS((exports, module) => {
22432
22432
  let index = this.parent.index(this);
22433
22433
  return this.parent.nodes[index - 1];
22434
22434
  }
22435
- rangeBy(opts) {
22435
+ rangeBy(opts = {}) {
22436
+ let inputString = "document" in this.source.input ? this.source.input.document : this.source.input.css;
22436
22437
  let start = {
22437
22438
  column: this.source.start.column,
22438
- line: this.source.start.line
22439
+ line: this.source.start.line,
22440
+ offset: sourceOffset(inputString, this.source.start)
22439
22441
  };
22440
22442
  let end = this.source.end ? {
22441
22443
  column: this.source.end.column + 1,
22442
- line: this.source.end.line
22444
+ line: this.source.end.line,
22445
+ offset: typeof this.source.end.offset === "number" ? this.source.end.offset : sourceOffset(inputString, this.source.end) + 1
22443
22446
  } : {
22444
22447
  column: start.column + 1,
22445
- line: start.line
22448
+ line: start.line,
22449
+ offset: start.offset + 1
22446
22450
  };
22447
22451
  if (opts.word) {
22448
- let inputString = "document" in this.source.input ? this.source.input.document : this.source.input.css;
22449
22452
  let stringRepresentation = inputString.slice(sourceOffset(inputString, this.source.start), sourceOffset(inputString, this.source.end));
22450
22453
  let index = stringRepresentation.indexOf(opts.word);
22451
22454
  if (index !== -1) {
@@ -22456,7 +22459,8 @@ var require_node2 = __commonJS((exports, module) => {
22456
22459
  if (opts.start) {
22457
22460
  start = {
22458
22461
  column: opts.start.column,
22459
- line: opts.start.line
22462
+ line: opts.start.line,
22463
+ offset: sourceOffset(inputString, opts.start)
22460
22464
  };
22461
22465
  } else if (opts.index) {
22462
22466
  start = this.positionInside(opts.index);
@@ -22464,7 +22468,8 @@ var require_node2 = __commonJS((exports, module) => {
22464
22468
  if (opts.end) {
22465
22469
  end = {
22466
22470
  column: opts.end.column,
22467
- line: opts.end.line
22471
+ line: opts.end.line,
22472
+ offset: sourceOffset(inputString, opts.end)
22468
22473
  };
22469
22474
  } else if (typeof opts.endIndex === "number") {
22470
22475
  end = this.positionInside(opts.endIndex);
@@ -22473,7 +22478,11 @@ var require_node2 = __commonJS((exports, module) => {
22473
22478
  }
22474
22479
  }
22475
22480
  if (end.line < start.line || end.line === start.line && end.column <= start.column) {
22476
- end = { column: start.column + 1, line: start.line };
22481
+ end = {
22482
+ column: start.column + 1,
22483
+ line: start.line,
22484
+ offset: start.offset + 1
22485
+ };
22477
22486
  }
22478
22487
  return { end, start };
22479
22488
  }
@@ -22538,6 +22547,8 @@ var require_node2 = __commonJS((exports, module) => {
22538
22547
  } else if (typeof value === "object" && value.toJSON) {
22539
22548
  fixed[name] = value.toJSON(null, inputs);
22540
22549
  } else if (name === "source") {
22550
+ if (value == null)
22551
+ continue;
22541
22552
  let inputId = inputs.get(value.input);
22542
22553
  if (inputId == null) {
22543
22554
  inputId = inputsNextIndex;
@@ -22573,7 +22584,7 @@ var require_node2 = __commonJS((exports, module) => {
22573
22584
  });
22574
22585
  return result;
22575
22586
  }
22576
- warn(result, text, opts) {
22587
+ warn(result, text, opts = {}) {
22577
22588
  let data = { node: this };
22578
22589
  for (let i in opts)
22579
22590
  data[i] = opts[i];
@@ -22584,7 +22595,7 @@ var require_node2 = __commonJS((exports, module) => {
22584
22595
  Node.default = Node;
22585
22596
  });
22586
22597
 
22587
- // node_modules/sanitize-html/node_modules/postcss/lib/comment.js
22598
+ // node_modules/postcss/lib/comment.js
22588
22599
  var require_comment = __commonJS((exports, module) => {
22589
22600
  var Node = require_node2();
22590
22601
 
@@ -22598,7 +22609,7 @@ var require_comment = __commonJS((exports, module) => {
22598
22609
  Comment.default = Comment;
22599
22610
  });
22600
22611
 
22601
- // node_modules/sanitize-html/node_modules/postcss/lib/declaration.js
22612
+ // node_modules/postcss/lib/declaration.js
22602
22613
  var require_declaration = __commonJS((exports, module) => {
22603
22614
  var Node = require_node2();
22604
22615
 
@@ -22618,7 +22629,7 @@ var require_declaration = __commonJS((exports, module) => {
22618
22629
  Declaration.default = Declaration;
22619
22630
  });
22620
22631
 
22621
- // node_modules/sanitize-html/node_modules/postcss/lib/container.js
22632
+ // node_modules/postcss/lib/container.js
22622
22633
  var require_container = __commonJS((exports, module) => {
22623
22634
  var Comment = require_comment();
22624
22635
  var Declaration = require_declaration();
@@ -23017,7 +23028,7 @@ var require_container = __commonJS((exports, module) => {
23017
23028
  };
23018
23029
  });
23019
23030
 
23020
- // node_modules/sanitize-html/node_modules/postcss/lib/at-rule.js
23031
+ // node_modules/postcss/lib/at-rule.js
23021
23032
  var require_at_rule = __commonJS((exports, module) => {
23022
23033
  var Container = require_container();
23023
23034
 
@@ -23042,7 +23053,7 @@ var require_at_rule = __commonJS((exports, module) => {
23042
23053
  Container.registerAtRule(AtRule);
23043
23054
  });
23044
23055
 
23045
- // node_modules/sanitize-html/node_modules/postcss/lib/document.js
23056
+ // node_modules/postcss/lib/document.js
23046
23057
  var require_document = __commonJS((exports, module) => {
23047
23058
  var Container = require_container();
23048
23059
  var LazyResult;
@@ -24927,7 +24938,7 @@ var require_source_map = __commonJS((exports) => {
24927
24938
  exports.SourceNode = require_source_node().SourceNode;
24928
24939
  });
24929
24940
 
24930
- // node_modules/sanitize-html/node_modules/postcss/lib/previous-map.js
24941
+ // node_modules/postcss/lib/previous-map.js
24931
24942
  var require_previous_map = __commonJS((exports, module) => {
24932
24943
  var { existsSync, readFileSync } = __require("fs");
24933
24944
  var { dirname, join } = __require("path");
@@ -25049,7 +25060,7 @@ var require_previous_map = __commonJS((exports, module) => {
25049
25060
  PreviousMap.default = PreviousMap;
25050
25061
  });
25051
25062
 
25052
- // node_modules/sanitize-html/node_modules/postcss/lib/input.js
25063
+ // node_modules/postcss/lib/input.js
25053
25064
  var require_input = __commonJS((exports, module) => {
25054
25065
  var { nanoid } = require_non_secure();
25055
25066
  var { isAbsolute, resolve } = __require("path");
@@ -25058,9 +25069,23 @@ var require_input = __commonJS((exports, module) => {
25058
25069
  var CssSyntaxError = require_css_syntax_error();
25059
25070
  var PreviousMap = require_previous_map();
25060
25071
  var terminalHighlight = require_terminal_highlight();
25061
- var fromOffsetCache = Symbol("fromOffsetCache");
25072
+ var lineToIndexCache = Symbol("lineToIndexCache");
25062
25073
  var sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator);
25063
25074
  var pathAvailable = Boolean(resolve && isAbsolute);
25075
+ function getLineToIndex(input) {
25076
+ if (input[lineToIndexCache])
25077
+ return input[lineToIndexCache];
25078
+ let lines = input.css.split(`
25079
+ `);
25080
+ let lineToIndex = new Array(lines.length);
25081
+ let prevIndex = 0;
25082
+ for (let i = 0, l = lines.length;i < l; i++) {
25083
+ lineToIndex[i] = prevIndex;
25084
+ prevIndex += lines[i].length + 1;
25085
+ }
25086
+ input[lineToIndexCache] = lineToIndex;
25087
+ return lineToIndex;
25088
+ }
25064
25089
 
25065
25090
  class Input {
25066
25091
  get from() {
@@ -25103,30 +25128,37 @@ var require_input = __commonJS((exports, module) => {
25103
25128
  this.map.file = this.from;
25104
25129
  }
25105
25130
  error(message, line, column, opts = {}) {
25106
- let endColumn, endLine, result;
25131
+ let endColumn, endLine, endOffset, offset, result;
25107
25132
  if (line && typeof line === "object") {
25108
25133
  let start = line;
25109
25134
  let end = column;
25110
25135
  if (typeof start.offset === "number") {
25111
- let pos = this.fromOffset(start.offset);
25136
+ offset = start.offset;
25137
+ let pos = this.fromOffset(offset);
25112
25138
  line = pos.line;
25113
25139
  column = pos.col;
25114
25140
  } else {
25115
25141
  line = start.line;
25116
25142
  column = start.column;
25143
+ offset = this.fromLineAndColumn(line, column);
25117
25144
  }
25118
25145
  if (typeof end.offset === "number") {
25119
- let pos = this.fromOffset(end.offset);
25146
+ endOffset = end.offset;
25147
+ let pos = this.fromOffset(endOffset);
25120
25148
  endLine = pos.line;
25121
25149
  endColumn = pos.col;
25122
25150
  } else {
25123
25151
  endLine = end.line;
25124
25152
  endColumn = end.column;
25153
+ endOffset = this.fromLineAndColumn(end.line, end.column);
25125
25154
  }
25126
25155
  } else if (!column) {
25127
- let pos = this.fromOffset(line);
25156
+ offset = line;
25157
+ let pos = this.fromOffset(offset);
25128
25158
  line = pos.line;
25129
25159
  column = pos.col;
25160
+ } else {
25161
+ offset = this.fromLineAndColumn(line, column);
25130
25162
  }
25131
25163
  let origin = this.origin(line, column, endLine, endColumn);
25132
25164
  if (origin) {
@@ -25134,7 +25166,7 @@ var require_input = __commonJS((exports, module) => {
25134
25166
  } else {
25135
25167
  result = new CssSyntaxError(message, endLine === undefined ? line : { column, line }, endLine === undefined ? column : { column: endColumn, line: endLine }, this.css, this.file, opts.plugin);
25136
25168
  }
25137
- result.input = { column, endColumn, endLine, line, source: this.css };
25169
+ result.input = { column, endColumn, endLine, endOffset, line, offset, source: this.css };
25138
25170
  if (this.file) {
25139
25171
  if (pathToFileURL) {
25140
25172
  result.input.url = pathToFileURL(this.file).toString();
@@ -25143,22 +25175,14 @@ var require_input = __commonJS((exports, module) => {
25143
25175
  }
25144
25176
  return result;
25145
25177
  }
25178
+ fromLineAndColumn(line, column) {
25179
+ let lineToIndex = getLineToIndex(this);
25180
+ let index = lineToIndex[line - 1];
25181
+ return index + column - 1;
25182
+ }
25146
25183
  fromOffset(offset) {
25147
- let lastLine, lineToIndex;
25148
- if (!this[fromOffsetCache]) {
25149
- let lines = this.css.split(`
25150
- `);
25151
- lineToIndex = new Array(lines.length);
25152
- let prevIndex = 0;
25153
- for (let i = 0, l = lines.length;i < l; i++) {
25154
- lineToIndex[i] = prevIndex;
25155
- prevIndex += lines[i].length + 1;
25156
- }
25157
- this[fromOffsetCache] = lineToIndex;
25158
- } else {
25159
- lineToIndex = this[fromOffsetCache];
25160
- }
25161
- lastLine = lineToIndex[lineToIndex.length - 1];
25184
+ let lineToIndex = getLineToIndex(this);
25185
+ let lastLine = lineToIndex[lineToIndex.length - 1];
25162
25186
  let min = 0;
25163
25187
  if (offset >= lastLine) {
25164
25188
  min = lineToIndex.length - 1;
@@ -25247,7 +25271,7 @@ var require_input = __commonJS((exports, module) => {
25247
25271
  }
25248
25272
  });
25249
25273
 
25250
- // node_modules/sanitize-html/node_modules/postcss/lib/root.js
25274
+ // node_modules/postcss/lib/root.js
25251
25275
  var require_root = __commonJS((exports, module) => {
25252
25276
  var Container = require_container();
25253
25277
  var LazyResult;
@@ -25300,7 +25324,7 @@ var require_root = __commonJS((exports, module) => {
25300
25324
  Container.registerRoot(Root);
25301
25325
  });
25302
25326
 
25303
- // node_modules/sanitize-html/node_modules/postcss/lib/list.js
25327
+ // node_modules/postcss/lib/list.js
25304
25328
  var require_list = __commonJS((exports, module) => {
25305
25329
  var list = {
25306
25330
  comma(string) {
@@ -25358,7 +25382,7 @@ var require_list = __commonJS((exports, module) => {
25358
25382
  list.default = list;
25359
25383
  });
25360
25384
 
25361
- // node_modules/sanitize-html/node_modules/postcss/lib/rule.js
25385
+ // node_modules/postcss/lib/rule.js
25362
25386
  var require_rule = __commonJS((exports, module) => {
25363
25387
  var Container = require_container();
25364
25388
  var list = require_list();
@@ -25384,7 +25408,7 @@ var require_rule = __commonJS((exports, module) => {
25384
25408
  Container.registerRule(Rule);
25385
25409
  });
25386
25410
 
25387
- // node_modules/sanitize-html/node_modules/postcss/lib/fromJSON.js
25411
+ // node_modules/postcss/lib/fromJSON.js
25388
25412
  var require_fromJSON = __commonJS((exports, module) => {
25389
25413
  var AtRule = require_at_rule();
25390
25414
  var Comment = require_comment();
@@ -25438,7 +25462,7 @@ var require_fromJSON = __commonJS((exports, module) => {
25438
25462
  fromJSON.default = fromJSON;
25439
25463
  });
25440
25464
 
25441
- // node_modules/sanitize-html/node_modules/postcss/lib/map-generator.js
25465
+ // node_modules/postcss/lib/map-generator.js
25442
25466
  var require_map_generator = __commonJS((exports, module) => {
25443
25467
  var { dirname, relative, resolve, sep } = __require("path");
25444
25468
  var { SourceMapConsumer, SourceMapGenerator } = require_source_map();
@@ -25768,7 +25792,7 @@ var require_map_generator = __commonJS((exports, module) => {
25768
25792
  module.exports = MapGenerator;
25769
25793
  });
25770
25794
 
25771
- // node_modules/sanitize-html/node_modules/postcss/lib/parser.js
25795
+ // node_modules/postcss/lib/parser.js
25772
25796
  var require_parser2 = __commonJS((exports, module) => {
25773
25797
  var AtRule = require_at_rule();
25774
25798
  var Comment = require_comment();
@@ -26289,7 +26313,7 @@ var require_parser2 = __commonJS((exports, module) => {
26289
26313
  module.exports = Parser;
26290
26314
  });
26291
26315
 
26292
- // node_modules/sanitize-html/node_modules/postcss/lib/parse.js
26316
+ // node_modules/postcss/lib/parse.js
26293
26317
  var require_parse4 = __commonJS((exports, module) => {
26294
26318
  var Container = require_container();
26295
26319
  var Input = require_input();
@@ -26323,7 +26347,7 @@ You tried to parse Less with ` + "the standard CSS parser; " + "try again with t
26323
26347
  Container.registerParse(parse2);
26324
26348
  });
26325
26349
 
26326
- // node_modules/sanitize-html/node_modules/postcss/lib/warning.js
26350
+ // node_modules/postcss/lib/warning.js
26327
26351
  var require_warning = __commonJS((exports, module) => {
26328
26352
  class Warning {
26329
26353
  constructor(text, opts = {}) {
@@ -26357,7 +26381,7 @@ var require_warning = __commonJS((exports, module) => {
26357
26381
  Warning.default = Warning;
26358
26382
  });
26359
26383
 
26360
- // node_modules/sanitize-html/node_modules/postcss/lib/result.js
26384
+ // node_modules/postcss/lib/result.js
26361
26385
  var require_result = __commonJS((exports, module) => {
26362
26386
  var Warning = require_warning();
26363
26387
 
@@ -26370,7 +26394,7 @@ var require_result = __commonJS((exports, module) => {
26370
26394
  this.messages = [];
26371
26395
  this.root = root;
26372
26396
  this.opts = opts;
26373
- this.css = undefined;
26397
+ this.css = "";
26374
26398
  this.map = undefined;
26375
26399
  }
26376
26400
  toString() {
@@ -26394,7 +26418,7 @@ var require_result = __commonJS((exports, module) => {
26394
26418
  Result.default = Result;
26395
26419
  });
26396
26420
 
26397
- // node_modules/sanitize-html/node_modules/postcss/lib/warn-once.js
26421
+ // node_modules/postcss/lib/warn-once.js
26398
26422
  var require_warn_once = __commonJS((exports, module) => {
26399
26423
  var printed = {};
26400
26424
  module.exports = function warnOnce(message) {
@@ -26407,7 +26431,7 @@ var require_warn_once = __commonJS((exports, module) => {
26407
26431
  };
26408
26432
  });
26409
26433
 
26410
- // node_modules/sanitize-html/node_modules/postcss/lib/lazy-result.js
26434
+ // node_modules/postcss/lib/lazy-result.js
26411
26435
  var require_lazy_result = __commonJS((exports, module) => {
26412
26436
  var Container = require_container();
26413
26437
  var Document = require_document();
@@ -26885,7 +26909,7 @@ var require_lazy_result = __commonJS((exports, module) => {
26885
26909
  Document.registerLazyResult(LazyResult);
26886
26910
  });
26887
26911
 
26888
- // node_modules/sanitize-html/node_modules/postcss/lib/no-work-result.js
26912
+ // node_modules/postcss/lib/no-work-result.js
26889
26913
  var require_no_work_result = __commonJS((exports, module) => {
26890
26914
  var MapGenerator = require_map_generator();
26891
26915
  var parse2 = require_parse4();
@@ -26999,7 +27023,7 @@ var require_no_work_result = __commonJS((exports, module) => {
26999
27023
  NoWorkResult.default = NoWorkResult;
27000
27024
  });
27001
27025
 
27002
- // node_modules/sanitize-html/node_modules/postcss/lib/processor.js
27026
+ // node_modules/postcss/lib/processor.js
27003
27027
  var require_processor = __commonJS((exports, module) => {
27004
27028
  var Document = require_document();
27005
27029
  var LazyResult = require_lazy_result();
@@ -27008,7 +27032,7 @@ var require_processor = __commonJS((exports, module) => {
27008
27032
 
27009
27033
  class Processor {
27010
27034
  constructor(plugins = []) {
27011
- this.version = "8.5.3";
27035
+ this.version = "8.5.6";
27012
27036
  this.plugins = this.normalize(plugins);
27013
27037
  }
27014
27038
  normalize(plugins) {
@@ -27053,7 +27077,7 @@ var require_processor = __commonJS((exports, module) => {
27053
27077
  Document.registerProcessor(Processor);
27054
27078
  });
27055
27079
 
27056
- // node_modules/sanitize-html/node_modules/postcss/lib/postcss.js
27080
+ // node_modules/postcss/lib/postcss.js
27057
27081
  var require_postcss = __commonJS((exports, module) => {
27058
27082
  var AtRule = require_at_rule();
27059
27083
  var Comment = require_comment();
@@ -27672,6 +27696,15 @@ and ensure you are accounting for this risk.
27672
27696
  }, options2.parser);
27673
27697
  parser.write(html);
27674
27698
  parser.end();
27699
+ if (options2.disallowedTagsMode === "escape" || options2.disallowedTagsMode === "recursiveEscape") {
27700
+ const lastParsedIndex = parser.endIndex;
27701
+ if (lastParsedIndex != null && lastParsedIndex >= 0 && lastParsedIndex < html.length) {
27702
+ const unparsed = html.substring(lastParsedIndex);
27703
+ result += escapeHtml(unparsed);
27704
+ } else if ((lastParsedIndex == null || lastParsedIndex < 0) && html.length > 0 && result === "") {
27705
+ result = escapeHtml(html);
27706
+ }
27707
+ }
27675
27708
  return result;
27676
27709
  function initializeState() {
27677
27710
  result = "";
@@ -32320,7 +32353,7 @@ ${e}</tr>
32320
32353
  if (i === null)
32321
32354
  return O(n);
32322
32355
  e = i;
32323
- let s = `<img src="${e}" alt="${n}"`;
32356
+ let s = `<img src="${e}" alt="${O(n)}"`;
32324
32357
  return t && (s += ` title="${O(t)}"`), s += ">", s;
32325
32358
  }
32326
32359
  text(e) {
@@ -33538,9 +33571,8 @@ function generateBlogPostingSchema(options2) {
33538
33571
  if (post.tags && post.tags.length > 0) {
33539
33572
  blogPosting.articleSection = post.tags[0];
33540
33573
  }
33541
- if (post.content) {
33542
- const wordCount = post.content.split(/\s+/).length;
33543
- blogPosting.wordCount = wordCount;
33574
+ if (post.wordCount) {
33575
+ blogPosting.wordCount = post.wordCount;
33544
33576
  }
33545
33577
  blogPosting.inLanguage = site.rssLanguage || "en-US";
33546
33578
  return blogPosting;
@@ -33899,11 +33931,6 @@ function getTotalPages(totalItems, pageSize) {
33899
33931
  }
33900
33932
 
33901
33933
  // src/generators/feeds.ts
33902
- function extractFirstImageUrl2(html) {
33903
- const imgRegex = /<img[^>]+src=["']([^"']+)["']/;
33904
- const match = html.match(imgRegex);
33905
- return match ? match[1] : null;
33906
- }
33907
33934
  function makeAbsoluteUrl(imageUrl, baseUrl) {
33908
33935
  return imageUrl.startsWith("http") ? imageUrl : `${baseUrl}${imageUrl}`;
33909
33936
  }
@@ -33918,8 +33945,7 @@ function generateRSSFeed(site, config) {
33918
33945
  const rssItems = posts.map((post) => {
33919
33946
  const postUrl = `${config.baseUrl}${post.url}`;
33920
33947
  const pubDate = formatRSSDate(post.date);
33921
- const featuredImage = extractFirstImageUrl2(post.html);
33922
- const absoluteImageUrl = featuredImage ? makeAbsoluteUrl(featuredImage, config.baseUrl) : null;
33948
+ const absoluteImageUrl = post.image ? makeAbsoluteUrl(post.image, config.baseUrl) : null;
33923
33949
  const author = config.authorEmail && config.authorName ? `${config.authorEmail} (${config.authorName})` : config.authorEmail || undefined;
33924
33950
  return buildRSSItem({
33925
33951
  title: post.title,
@@ -34083,18 +34109,10 @@ async function generatePostPages(site, config, outputDir) {
34083
34109
  const batch = site.posts.slice(i, i + batchSize);
34084
34110
  await Promise.all(batch.map(async (post) => {
34085
34111
  const postPath = post.url.substring(1);
34086
- const imageUrl = extractFirstImageUrl(post.html, config.baseUrl);
34087
- const schemas = generatePostPageSchemas({
34088
- post,
34089
- site: config,
34090
- imageUrl
34091
- });
34092
- const jsonLd = schemas.map((schema) => toScriptTag(schema)).join(`
34093
- `);
34094
34112
  const postHtml = import_nunjucks.default.render("post.njk", {
34095
34113
  site: config,
34096
34114
  post,
34097
- jsonLd
34115
+ jsonLd: post.jsonLd || ""
34098
34116
  });
34099
34117
  await writeHtmlFile(outputDir, `${postPath}index.html`, postHtml);
34100
34118
  }));
@@ -34452,6 +34470,16 @@ class SiteGenerator {
34452
34470
  if (imageUrl) {
34453
34471
  post.image = imageUrl;
34454
34472
  }
34473
+ if (post.content) {
34474
+ post.wordCount = post.content.split(/\s+/).length;
34475
+ }
34476
+ const schemas = generatePostPageSchemas({
34477
+ post,
34478
+ site: this.options.config,
34479
+ imageUrl: post.image
34480
+ });
34481
+ post.jsonLd = schemas.map((schema) => toScriptTag(schema)).join(`
34482
+ `);
34455
34483
  post.tags.forEach((tagName) => {
34456
34484
  const tagSlug = import_slugify.default(tagName, { lower: true, strict: true });
34457
34485
  post.tagSlugs[tagName] = tagSlug;
package/dist/index.js CHANGED
@@ -8797,7 +8797,7 @@ var require_picocolors = __commonJS((exports, module) => {
8797
8797
  module.exports.createColors = createColors;
8798
8798
  });
8799
8799
 
8800
- // node_modules/sanitize-html/node_modules/postcss/lib/tokenize.js
8800
+ // node_modules/postcss/lib/tokenize.js
8801
8801
  var require_tokenize = __commonJS((exports, module) => {
8802
8802
  var SINGLE_QUOTE = 39;
8803
8803
  var DOUBLE_QUOTE = 34;
@@ -9011,7 +9011,7 @@ var require_tokenize = __commonJS((exports, module) => {
9011
9011
  };
9012
9012
  });
9013
9013
 
9014
- // node_modules/sanitize-html/node_modules/postcss/lib/terminal-highlight.js
9014
+ // node_modules/postcss/lib/terminal-highlight.js
9015
9015
  var require_terminal_highlight = __commonJS((exports, module) => {
9016
9016
  var pico = require_picocolors();
9017
9017
  var tokenizer = require_tokenize();
@@ -9072,7 +9072,7 @@ var require_terminal_highlight = __commonJS((exports, module) => {
9072
9072
  module.exports = terminalHighlight;
9073
9073
  });
9074
9074
 
9075
- // node_modules/sanitize-html/node_modules/postcss/lib/css-syntax-error.js
9075
+ // node_modules/postcss/lib/css-syntax-error.js
9076
9076
  var require_css_syntax_error = __commonJS((exports, module) => {
9077
9077
  var pico = require_picocolors();
9078
9078
  var terminalHighlight = require_terminal_highlight();
@@ -9172,7 +9172,7 @@ var require_css_syntax_error = __commonJS((exports, module) => {
9172
9172
  CssSyntaxError.default = CssSyntaxError;
9173
9173
  });
9174
9174
 
9175
- // node_modules/sanitize-html/node_modules/postcss/lib/stringifier.js
9175
+ // node_modules/postcss/lib/stringifier.js
9176
9176
  var require_stringifier = __commonJS((exports, module) => {
9177
9177
  var DEFAULT_RAW = {
9178
9178
  after: `
@@ -9501,7 +9501,7 @@ var require_stringifier = __commonJS((exports, module) => {
9501
9501
  Stringifier.default = Stringifier;
9502
9502
  });
9503
9503
 
9504
- // node_modules/sanitize-html/node_modules/postcss/lib/stringify.js
9504
+ // node_modules/postcss/lib/stringify.js
9505
9505
  var require_stringify3 = __commonJS((exports, module) => {
9506
9506
  var Stringifier = require_stringifier();
9507
9507
  function stringify(node, builder) {
@@ -9512,13 +9512,13 @@ var require_stringify3 = __commonJS((exports, module) => {
9512
9512
  stringify.default = stringify;
9513
9513
  });
9514
9514
 
9515
- // node_modules/sanitize-html/node_modules/postcss/lib/symbols.js
9515
+ // node_modules/postcss/lib/symbols.js
9516
9516
  var require_symbols = __commonJS((exports, module) => {
9517
9517
  exports.isClean = Symbol("isClean");
9518
9518
  exports.my = Symbol("my");
9519
9519
  });
9520
9520
 
9521
- // node_modules/sanitize-html/node_modules/postcss/lib/node.js
9521
+ // node_modules/postcss/lib/node.js
9522
9522
  var require_node2 = __commonJS((exports, module) => {
9523
9523
  var CssSyntaxError = require_css_syntax_error();
9524
9524
  var Stringifier = require_stringifier();
@@ -9687,7 +9687,7 @@ var require_node2 = __commonJS((exports, module) => {
9687
9687
  let index = this.parent.index(this);
9688
9688
  return this.parent.nodes[index + 1];
9689
9689
  }
9690
- positionBy(opts) {
9690
+ positionBy(opts = {}) {
9691
9691
  let pos = this.source.start;
9692
9692
  if (opts.index) {
9693
9693
  pos = this.positionInside(opts.index);
@@ -9715,7 +9715,7 @@ var require_node2 = __commonJS((exports, module) => {
9715
9715
  column += 1;
9716
9716
  }
9717
9717
  }
9718
- return { column, line };
9718
+ return { column, line, offset: end };
9719
9719
  }
9720
9720
  prev() {
9721
9721
  if (!this.parent)
@@ -9723,20 +9723,23 @@ var require_node2 = __commonJS((exports, module) => {
9723
9723
  let index = this.parent.index(this);
9724
9724
  return this.parent.nodes[index - 1];
9725
9725
  }
9726
- rangeBy(opts) {
9726
+ rangeBy(opts = {}) {
9727
+ let inputString = "document" in this.source.input ? this.source.input.document : this.source.input.css;
9727
9728
  let start = {
9728
9729
  column: this.source.start.column,
9729
- line: this.source.start.line
9730
+ line: this.source.start.line,
9731
+ offset: sourceOffset(inputString, this.source.start)
9730
9732
  };
9731
9733
  let end = this.source.end ? {
9732
9734
  column: this.source.end.column + 1,
9733
- line: this.source.end.line
9735
+ line: this.source.end.line,
9736
+ offset: typeof this.source.end.offset === "number" ? this.source.end.offset : sourceOffset(inputString, this.source.end) + 1
9734
9737
  } : {
9735
9738
  column: start.column + 1,
9736
- line: start.line
9739
+ line: start.line,
9740
+ offset: start.offset + 1
9737
9741
  };
9738
9742
  if (opts.word) {
9739
- let inputString = "document" in this.source.input ? this.source.input.document : this.source.input.css;
9740
9743
  let stringRepresentation = inputString.slice(sourceOffset(inputString, this.source.start), sourceOffset(inputString, this.source.end));
9741
9744
  let index = stringRepresentation.indexOf(opts.word);
9742
9745
  if (index !== -1) {
@@ -9747,7 +9750,8 @@ var require_node2 = __commonJS((exports, module) => {
9747
9750
  if (opts.start) {
9748
9751
  start = {
9749
9752
  column: opts.start.column,
9750
- line: opts.start.line
9753
+ line: opts.start.line,
9754
+ offset: sourceOffset(inputString, opts.start)
9751
9755
  };
9752
9756
  } else if (opts.index) {
9753
9757
  start = this.positionInside(opts.index);
@@ -9755,7 +9759,8 @@ var require_node2 = __commonJS((exports, module) => {
9755
9759
  if (opts.end) {
9756
9760
  end = {
9757
9761
  column: opts.end.column,
9758
- line: opts.end.line
9762
+ line: opts.end.line,
9763
+ offset: sourceOffset(inputString, opts.end)
9759
9764
  };
9760
9765
  } else if (typeof opts.endIndex === "number") {
9761
9766
  end = this.positionInside(opts.endIndex);
@@ -9764,7 +9769,11 @@ var require_node2 = __commonJS((exports, module) => {
9764
9769
  }
9765
9770
  }
9766
9771
  if (end.line < start.line || end.line === start.line && end.column <= start.column) {
9767
- end = { column: start.column + 1, line: start.line };
9772
+ end = {
9773
+ column: start.column + 1,
9774
+ line: start.line,
9775
+ offset: start.offset + 1
9776
+ };
9768
9777
  }
9769
9778
  return { end, start };
9770
9779
  }
@@ -9829,6 +9838,8 @@ var require_node2 = __commonJS((exports, module) => {
9829
9838
  } else if (typeof value === "object" && value.toJSON) {
9830
9839
  fixed[name] = value.toJSON(null, inputs);
9831
9840
  } else if (name === "source") {
9841
+ if (value == null)
9842
+ continue;
9832
9843
  let inputId = inputs.get(value.input);
9833
9844
  if (inputId == null) {
9834
9845
  inputId = inputsNextIndex;
@@ -9864,7 +9875,7 @@ var require_node2 = __commonJS((exports, module) => {
9864
9875
  });
9865
9876
  return result;
9866
9877
  }
9867
- warn(result, text, opts) {
9878
+ warn(result, text, opts = {}) {
9868
9879
  let data = { node: this };
9869
9880
  for (let i in opts)
9870
9881
  data[i] = opts[i];
@@ -9875,7 +9886,7 @@ var require_node2 = __commonJS((exports, module) => {
9875
9886
  Node.default = Node;
9876
9887
  });
9877
9888
 
9878
- // node_modules/sanitize-html/node_modules/postcss/lib/comment.js
9889
+ // node_modules/postcss/lib/comment.js
9879
9890
  var require_comment = __commonJS((exports, module) => {
9880
9891
  var Node = require_node2();
9881
9892
 
@@ -9889,7 +9900,7 @@ var require_comment = __commonJS((exports, module) => {
9889
9900
  Comment.default = Comment;
9890
9901
  });
9891
9902
 
9892
- // node_modules/sanitize-html/node_modules/postcss/lib/declaration.js
9903
+ // node_modules/postcss/lib/declaration.js
9893
9904
  var require_declaration = __commonJS((exports, module) => {
9894
9905
  var Node = require_node2();
9895
9906
 
@@ -9909,7 +9920,7 @@ var require_declaration = __commonJS((exports, module) => {
9909
9920
  Declaration.default = Declaration;
9910
9921
  });
9911
9922
 
9912
- // node_modules/sanitize-html/node_modules/postcss/lib/container.js
9923
+ // node_modules/postcss/lib/container.js
9913
9924
  var require_container = __commonJS((exports, module) => {
9914
9925
  var Comment = require_comment();
9915
9926
  var Declaration = require_declaration();
@@ -10308,7 +10319,7 @@ var require_container = __commonJS((exports, module) => {
10308
10319
  };
10309
10320
  });
10310
10321
 
10311
- // node_modules/sanitize-html/node_modules/postcss/lib/at-rule.js
10322
+ // node_modules/postcss/lib/at-rule.js
10312
10323
  var require_at_rule = __commonJS((exports, module) => {
10313
10324
  var Container = require_container();
10314
10325
 
@@ -10333,7 +10344,7 @@ var require_at_rule = __commonJS((exports, module) => {
10333
10344
  Container.registerAtRule(AtRule);
10334
10345
  });
10335
10346
 
10336
- // node_modules/sanitize-html/node_modules/postcss/lib/document.js
10347
+ // node_modules/postcss/lib/document.js
10337
10348
  var require_document = __commonJS((exports, module) => {
10338
10349
  var Container = require_container();
10339
10350
  var LazyResult;
@@ -12218,7 +12229,7 @@ var require_source_map = __commonJS((exports) => {
12218
12229
  exports.SourceNode = require_source_node().SourceNode;
12219
12230
  });
12220
12231
 
12221
- // node_modules/sanitize-html/node_modules/postcss/lib/previous-map.js
12232
+ // node_modules/postcss/lib/previous-map.js
12222
12233
  var require_previous_map = __commonJS((exports, module) => {
12223
12234
  var { existsSync, readFileSync } = __require("fs");
12224
12235
  var { dirname, join } = __require("path");
@@ -12340,7 +12351,7 @@ var require_previous_map = __commonJS((exports, module) => {
12340
12351
  PreviousMap.default = PreviousMap;
12341
12352
  });
12342
12353
 
12343
- // node_modules/sanitize-html/node_modules/postcss/lib/input.js
12354
+ // node_modules/postcss/lib/input.js
12344
12355
  var require_input = __commonJS((exports, module) => {
12345
12356
  var { nanoid } = require_non_secure();
12346
12357
  var { isAbsolute, resolve } = __require("path");
@@ -12349,9 +12360,23 @@ var require_input = __commonJS((exports, module) => {
12349
12360
  var CssSyntaxError = require_css_syntax_error();
12350
12361
  var PreviousMap = require_previous_map();
12351
12362
  var terminalHighlight = require_terminal_highlight();
12352
- var fromOffsetCache = Symbol("fromOffsetCache");
12363
+ var lineToIndexCache = Symbol("lineToIndexCache");
12353
12364
  var sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator);
12354
12365
  var pathAvailable = Boolean(resolve && isAbsolute);
12366
+ function getLineToIndex(input) {
12367
+ if (input[lineToIndexCache])
12368
+ return input[lineToIndexCache];
12369
+ let lines = input.css.split(`
12370
+ `);
12371
+ let lineToIndex = new Array(lines.length);
12372
+ let prevIndex = 0;
12373
+ for (let i = 0, l = lines.length;i < l; i++) {
12374
+ lineToIndex[i] = prevIndex;
12375
+ prevIndex += lines[i].length + 1;
12376
+ }
12377
+ input[lineToIndexCache] = lineToIndex;
12378
+ return lineToIndex;
12379
+ }
12355
12380
 
12356
12381
  class Input {
12357
12382
  get from() {
@@ -12394,30 +12419,37 @@ var require_input = __commonJS((exports, module) => {
12394
12419
  this.map.file = this.from;
12395
12420
  }
12396
12421
  error(message, line, column, opts = {}) {
12397
- let endColumn, endLine, result;
12422
+ let endColumn, endLine, endOffset, offset, result;
12398
12423
  if (line && typeof line === "object") {
12399
12424
  let start = line;
12400
12425
  let end = column;
12401
12426
  if (typeof start.offset === "number") {
12402
- let pos = this.fromOffset(start.offset);
12427
+ offset = start.offset;
12428
+ let pos = this.fromOffset(offset);
12403
12429
  line = pos.line;
12404
12430
  column = pos.col;
12405
12431
  } else {
12406
12432
  line = start.line;
12407
12433
  column = start.column;
12434
+ offset = this.fromLineAndColumn(line, column);
12408
12435
  }
12409
12436
  if (typeof end.offset === "number") {
12410
- let pos = this.fromOffset(end.offset);
12437
+ endOffset = end.offset;
12438
+ let pos = this.fromOffset(endOffset);
12411
12439
  endLine = pos.line;
12412
12440
  endColumn = pos.col;
12413
12441
  } else {
12414
12442
  endLine = end.line;
12415
12443
  endColumn = end.column;
12444
+ endOffset = this.fromLineAndColumn(end.line, end.column);
12416
12445
  }
12417
12446
  } else if (!column) {
12418
- let pos = this.fromOffset(line);
12447
+ offset = line;
12448
+ let pos = this.fromOffset(offset);
12419
12449
  line = pos.line;
12420
12450
  column = pos.col;
12451
+ } else {
12452
+ offset = this.fromLineAndColumn(line, column);
12421
12453
  }
12422
12454
  let origin = this.origin(line, column, endLine, endColumn);
12423
12455
  if (origin) {
@@ -12425,7 +12457,7 @@ var require_input = __commonJS((exports, module) => {
12425
12457
  } else {
12426
12458
  result = new CssSyntaxError(message, endLine === undefined ? line : { column, line }, endLine === undefined ? column : { column: endColumn, line: endLine }, this.css, this.file, opts.plugin);
12427
12459
  }
12428
- result.input = { column, endColumn, endLine, line, source: this.css };
12460
+ result.input = { column, endColumn, endLine, endOffset, line, offset, source: this.css };
12429
12461
  if (this.file) {
12430
12462
  if (pathToFileURL) {
12431
12463
  result.input.url = pathToFileURL(this.file).toString();
@@ -12434,22 +12466,14 @@ var require_input = __commonJS((exports, module) => {
12434
12466
  }
12435
12467
  return result;
12436
12468
  }
12469
+ fromLineAndColumn(line, column) {
12470
+ let lineToIndex = getLineToIndex(this);
12471
+ let index = lineToIndex[line - 1];
12472
+ return index + column - 1;
12473
+ }
12437
12474
  fromOffset(offset) {
12438
- let lastLine, lineToIndex;
12439
- if (!this[fromOffsetCache]) {
12440
- let lines = this.css.split(`
12441
- `);
12442
- lineToIndex = new Array(lines.length);
12443
- let prevIndex = 0;
12444
- for (let i = 0, l = lines.length;i < l; i++) {
12445
- lineToIndex[i] = prevIndex;
12446
- prevIndex += lines[i].length + 1;
12447
- }
12448
- this[fromOffsetCache] = lineToIndex;
12449
- } else {
12450
- lineToIndex = this[fromOffsetCache];
12451
- }
12452
- lastLine = lineToIndex[lineToIndex.length - 1];
12475
+ let lineToIndex = getLineToIndex(this);
12476
+ let lastLine = lineToIndex[lineToIndex.length - 1];
12453
12477
  let min = 0;
12454
12478
  if (offset >= lastLine) {
12455
12479
  min = lineToIndex.length - 1;
@@ -12538,7 +12562,7 @@ var require_input = __commonJS((exports, module) => {
12538
12562
  }
12539
12563
  });
12540
12564
 
12541
- // node_modules/sanitize-html/node_modules/postcss/lib/root.js
12565
+ // node_modules/postcss/lib/root.js
12542
12566
  var require_root = __commonJS((exports, module) => {
12543
12567
  var Container = require_container();
12544
12568
  var LazyResult;
@@ -12591,7 +12615,7 @@ var require_root = __commonJS((exports, module) => {
12591
12615
  Container.registerRoot(Root);
12592
12616
  });
12593
12617
 
12594
- // node_modules/sanitize-html/node_modules/postcss/lib/list.js
12618
+ // node_modules/postcss/lib/list.js
12595
12619
  var require_list = __commonJS((exports, module) => {
12596
12620
  var list = {
12597
12621
  comma(string) {
@@ -12649,7 +12673,7 @@ var require_list = __commonJS((exports, module) => {
12649
12673
  list.default = list;
12650
12674
  });
12651
12675
 
12652
- // node_modules/sanitize-html/node_modules/postcss/lib/rule.js
12676
+ // node_modules/postcss/lib/rule.js
12653
12677
  var require_rule = __commonJS((exports, module) => {
12654
12678
  var Container = require_container();
12655
12679
  var list = require_list();
@@ -12675,7 +12699,7 @@ var require_rule = __commonJS((exports, module) => {
12675
12699
  Container.registerRule(Rule);
12676
12700
  });
12677
12701
 
12678
- // node_modules/sanitize-html/node_modules/postcss/lib/fromJSON.js
12702
+ // node_modules/postcss/lib/fromJSON.js
12679
12703
  var require_fromJSON = __commonJS((exports, module) => {
12680
12704
  var AtRule = require_at_rule();
12681
12705
  var Comment = require_comment();
@@ -12729,7 +12753,7 @@ var require_fromJSON = __commonJS((exports, module) => {
12729
12753
  fromJSON.default = fromJSON;
12730
12754
  });
12731
12755
 
12732
- // node_modules/sanitize-html/node_modules/postcss/lib/map-generator.js
12756
+ // node_modules/postcss/lib/map-generator.js
12733
12757
  var require_map_generator = __commonJS((exports, module) => {
12734
12758
  var { dirname, relative, resolve, sep } = __require("path");
12735
12759
  var { SourceMapConsumer, SourceMapGenerator } = require_source_map();
@@ -13059,7 +13083,7 @@ var require_map_generator = __commonJS((exports, module) => {
13059
13083
  module.exports = MapGenerator;
13060
13084
  });
13061
13085
 
13062
- // node_modules/sanitize-html/node_modules/postcss/lib/parser.js
13086
+ // node_modules/postcss/lib/parser.js
13063
13087
  var require_parser = __commonJS((exports, module) => {
13064
13088
  var AtRule = require_at_rule();
13065
13089
  var Comment = require_comment();
@@ -13580,7 +13604,7 @@ var require_parser = __commonJS((exports, module) => {
13580
13604
  module.exports = Parser;
13581
13605
  });
13582
13606
 
13583
- // node_modules/sanitize-html/node_modules/postcss/lib/parse.js
13607
+ // node_modules/postcss/lib/parse.js
13584
13608
  var require_parse2 = __commonJS((exports, module) => {
13585
13609
  var Container = require_container();
13586
13610
  var Input = require_input();
@@ -13614,7 +13638,7 @@ You tried to parse Less with ` + "the standard CSS parser; " + "try again with t
13614
13638
  Container.registerParse(parse2);
13615
13639
  });
13616
13640
 
13617
- // node_modules/sanitize-html/node_modules/postcss/lib/warning.js
13641
+ // node_modules/postcss/lib/warning.js
13618
13642
  var require_warning = __commonJS((exports, module) => {
13619
13643
  class Warning {
13620
13644
  constructor(text, opts = {}) {
@@ -13648,7 +13672,7 @@ var require_warning = __commonJS((exports, module) => {
13648
13672
  Warning.default = Warning;
13649
13673
  });
13650
13674
 
13651
- // node_modules/sanitize-html/node_modules/postcss/lib/result.js
13675
+ // node_modules/postcss/lib/result.js
13652
13676
  var require_result = __commonJS((exports, module) => {
13653
13677
  var Warning = require_warning();
13654
13678
 
@@ -13661,7 +13685,7 @@ var require_result = __commonJS((exports, module) => {
13661
13685
  this.messages = [];
13662
13686
  this.root = root;
13663
13687
  this.opts = opts;
13664
- this.css = undefined;
13688
+ this.css = "";
13665
13689
  this.map = undefined;
13666
13690
  }
13667
13691
  toString() {
@@ -13685,7 +13709,7 @@ var require_result = __commonJS((exports, module) => {
13685
13709
  Result.default = Result;
13686
13710
  });
13687
13711
 
13688
- // node_modules/sanitize-html/node_modules/postcss/lib/warn-once.js
13712
+ // node_modules/postcss/lib/warn-once.js
13689
13713
  var require_warn_once = __commonJS((exports, module) => {
13690
13714
  var printed = {};
13691
13715
  module.exports = function warnOnce(message) {
@@ -13698,7 +13722,7 @@ var require_warn_once = __commonJS((exports, module) => {
13698
13722
  };
13699
13723
  });
13700
13724
 
13701
- // node_modules/sanitize-html/node_modules/postcss/lib/lazy-result.js
13725
+ // node_modules/postcss/lib/lazy-result.js
13702
13726
  var require_lazy_result = __commonJS((exports, module) => {
13703
13727
  var Container = require_container();
13704
13728
  var Document = require_document();
@@ -14176,7 +14200,7 @@ var require_lazy_result = __commonJS((exports, module) => {
14176
14200
  Document.registerLazyResult(LazyResult);
14177
14201
  });
14178
14202
 
14179
- // node_modules/sanitize-html/node_modules/postcss/lib/no-work-result.js
14203
+ // node_modules/postcss/lib/no-work-result.js
14180
14204
  var require_no_work_result = __commonJS((exports, module) => {
14181
14205
  var MapGenerator = require_map_generator();
14182
14206
  var parse2 = require_parse2();
@@ -14290,7 +14314,7 @@ var require_no_work_result = __commonJS((exports, module) => {
14290
14314
  NoWorkResult.default = NoWorkResult;
14291
14315
  });
14292
14316
 
14293
- // node_modules/sanitize-html/node_modules/postcss/lib/processor.js
14317
+ // node_modules/postcss/lib/processor.js
14294
14318
  var require_processor = __commonJS((exports, module) => {
14295
14319
  var Document = require_document();
14296
14320
  var LazyResult = require_lazy_result();
@@ -14299,7 +14323,7 @@ var require_processor = __commonJS((exports, module) => {
14299
14323
 
14300
14324
  class Processor {
14301
14325
  constructor(plugins = []) {
14302
- this.version = "8.5.3";
14326
+ this.version = "8.5.6";
14303
14327
  this.plugins = this.normalize(plugins);
14304
14328
  }
14305
14329
  normalize(plugins) {
@@ -14344,7 +14368,7 @@ var require_processor = __commonJS((exports, module) => {
14344
14368
  Document.registerProcessor(Processor);
14345
14369
  });
14346
14370
 
14347
- // node_modules/sanitize-html/node_modules/postcss/lib/postcss.js
14371
+ // node_modules/postcss/lib/postcss.js
14348
14372
  var require_postcss = __commonJS((exports, module) => {
14349
14373
  var AtRule = require_at_rule();
14350
14374
  var Comment = require_comment();
@@ -14963,6 +14987,15 @@ and ensure you are accounting for this risk.
14963
14987
  }, options2.parser);
14964
14988
  parser.write(html);
14965
14989
  parser.end();
14990
+ if (options2.disallowedTagsMode === "escape" || options2.disallowedTagsMode === "recursiveEscape") {
14991
+ const lastParsedIndex = parser.endIndex;
14992
+ if (lastParsedIndex != null && lastParsedIndex >= 0 && lastParsedIndex < html.length) {
14993
+ const unparsed = html.substring(lastParsedIndex);
14994
+ result += escapeHtml(unparsed);
14995
+ } else if ((lastParsedIndex == null || lastParsedIndex < 0) && html.length > 0 && result === "") {
14996
+ result = escapeHtml(html);
14997
+ }
14998
+ }
14966
14999
  return result;
14967
15000
  function initializeState() {
14968
15001
  result = "";
@@ -29913,7 +29946,7 @@ ${e}</tr>
29913
29946
  if (i === null)
29914
29947
  return O(n);
29915
29948
  e = i;
29916
- let s = `<img src="${e}" alt="${n}"`;
29949
+ let s = `<img src="${e}" alt="${O(n)}"`;
29917
29950
  return t && (s += ` title="${O(t)}"`), s += ">", s;
29918
29951
  }
29919
29952
  text(e) {
@@ -31385,9 +31418,8 @@ function generateBlogPostingSchema(options2) {
31385
31418
  if (post.tags && post.tags.length > 0) {
31386
31419
  blogPosting.articleSection = post.tags[0];
31387
31420
  }
31388
- if (post.content) {
31389
- const wordCount = post.content.split(/\s+/).length;
31390
- blogPosting.wordCount = wordCount;
31421
+ if (post.wordCount) {
31422
+ blogPosting.wordCount = post.wordCount;
31391
31423
  }
31392
31424
  blogPosting.inLanguage = site.rssLanguage || "en-US";
31393
31425
  return blogPosting;
@@ -31746,11 +31778,6 @@ function getTotalPages(totalItems, pageSize) {
31746
31778
  }
31747
31779
 
31748
31780
  // src/generators/feeds.ts
31749
- function extractFirstImageUrl2(html) {
31750
- const imgRegex = /<img[^>]+src=["']([^"']+)["']/;
31751
- const match = html.match(imgRegex);
31752
- return match ? match[1] : null;
31753
- }
31754
31781
  function makeAbsoluteUrl(imageUrl, baseUrl) {
31755
31782
  return imageUrl.startsWith("http") ? imageUrl : `${baseUrl}${imageUrl}`;
31756
31783
  }
@@ -31765,8 +31792,7 @@ function generateRSSFeed(site, config) {
31765
31792
  const rssItems = posts.map((post) => {
31766
31793
  const postUrl = `${config.baseUrl}${post.url}`;
31767
31794
  const pubDate = formatRSSDate(post.date);
31768
- const featuredImage = extractFirstImageUrl2(post.html);
31769
- const absoluteImageUrl = featuredImage ? makeAbsoluteUrl(featuredImage, config.baseUrl) : null;
31795
+ const absoluteImageUrl = post.image ? makeAbsoluteUrl(post.image, config.baseUrl) : null;
31770
31796
  const author = config.authorEmail && config.authorName ? `${config.authorEmail} (${config.authorName})` : config.authorEmail || undefined;
31771
31797
  return buildRSSItem({
31772
31798
  title: post.title,
@@ -31930,18 +31956,10 @@ async function generatePostPages(site, config, outputDir) {
31930
31956
  const batch = site.posts.slice(i, i + batchSize);
31931
31957
  await Promise.all(batch.map(async (post) => {
31932
31958
  const postPath = post.url.substring(1);
31933
- const imageUrl = extractFirstImageUrl(post.html, config.baseUrl);
31934
- const schemas = generatePostPageSchemas({
31935
- post,
31936
- site: config,
31937
- imageUrl
31938
- });
31939
- const jsonLd = schemas.map((schema) => toScriptTag(schema)).join(`
31940
- `);
31941
31959
  const postHtml = import_nunjucks.default.render("post.njk", {
31942
31960
  site: config,
31943
31961
  post,
31944
- jsonLd
31962
+ jsonLd: post.jsonLd || ""
31945
31963
  });
31946
31964
  await writeHtmlFile(outputDir, `${postPath}index.html`, postHtml);
31947
31965
  }));
@@ -32398,6 +32416,16 @@ class SiteGenerator {
32398
32416
  if (imageUrl) {
32399
32417
  post.image = imageUrl;
32400
32418
  }
32419
+ if (post.content) {
32420
+ post.wordCount = post.content.split(/\s+/).length;
32421
+ }
32422
+ const schemas = generatePostPageSchemas({
32423
+ post,
32424
+ site: this.options.config,
32425
+ imageUrl: post.image
32426
+ });
32427
+ post.jsonLd = schemas.map((schema) => toScriptTag(schema)).join(`
32428
+ `);
32401
32429
  post.tags.forEach((tagName) => {
32402
32430
  const tagSlug = import_slugify.default(tagName, { lower: true, strict: true });
32403
32431
  post.tagSlugs[tagName] = tagSlug;
package/dist/types.d.ts CHANGED
@@ -64,6 +64,10 @@ export interface Post {
64
64
  business?: Business;
65
65
  /** Optional image URL (first image from post content, used for thumbnails and social sharing) */
66
66
  image?: string;
67
+ /** Word count calculated from content (used for reading time and schema.org) */
68
+ wordCount?: number;
69
+ /** Cached JSON-LD structured data (pre-generated during initialization) */
70
+ jsonLd?: string;
67
71
  }
68
72
  /**
69
73
  * Configuration for CSS processing
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunki",
3
- "version": "0.18.0",
3
+ "version": "0.18.1",
4
4
  "description": "An opinionated static site generator built with Bun featuring PostCSS integration and modern web development workflows",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -50,13 +50,13 @@
50
50
  "commander": "^14.0.3",
51
51
  "gray-matter": "^4.0.3",
52
52
  "highlight.js": "^11.11.1",
53
- "marked": "^17.0.2",
53
+ "marked": "17.0.3",
54
54
  "marked-alert": "^2.1.2",
55
55
  "marked-highlight": "^2.2.3",
56
56
  "nunjucks": "^3.2.4",
57
57
  "postcss": "^8.5.6",
58
58
  "postcss-cli": "^11.0.1",
59
- "sanitize-html": "2.17.0",
59
+ "sanitize-html": "2.17.1",
60
60
  "slugify": "^1.6.6"
61
61
  },
62
62
  "devDependencies": {
@@ -86,7 +86,7 @@
86
86
  ],
87
87
  "engines": {
88
88
  "bun": ">=1.3.9",
89
- "node": ">=18.0.0"
89
+ "node": ">=24.0.0"
90
90
  },
91
91
  "engineStrict": true,
92
92
  "publishConfig": {