vaza-content 0.3.1 → 0.3.2
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/dist/adapters/astro/index.cjs +4 -4
- package/dist/adapters/astro/index.d.cts +1 -1
- package/dist/adapters/astro/index.d.ts +1 -1
- package/dist/adapters/astro/index.js +2 -2
- package/dist/adapters/next/index.cjs +5 -5
- package/dist/adapters/next/index.d.cts +1 -1
- package/dist/adapters/next/index.d.ts +1 -1
- package/dist/adapters/next/index.js +2 -2
- package/dist/adapters/nuxt/index.cjs +5 -5
- package/dist/adapters/nuxt/index.d.cts +1 -1
- package/dist/adapters/nuxt/index.d.ts +1 -1
- package/dist/adapters/nuxt/index.js +2 -2
- package/dist/adapters/sveltekit/index.cjs +4 -4
- package/dist/adapters/sveltekit/index.d.cts +1 -1
- package/dist/adapters/sveltekit/index.d.ts +1 -1
- package/dist/adapters/sveltekit/index.js +2 -2
- package/dist/{chunk-WMZ2V72R.cjs → chunk-DJUCNWHK.cjs} +41 -16
- package/dist/chunk-DJUCNWHK.cjs.map +1 -0
- package/dist/{chunk-ENRQYMG7.js → chunk-JKS5PF2Y.js} +78 -1
- package/dist/chunk-JKS5PF2Y.js.map +1 -0
- package/dist/{chunk-HRA5O4XV.js → chunk-PI5TLKE3.js} +30 -5
- package/dist/chunk-PI5TLKE3.js.map +1 -0
- package/dist/{chunk-XPYCZ2EO.cjs → chunk-XO56R4TD.cjs} +107 -30
- package/dist/chunk-XO56R4TD.cjs.map +1 -0
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/index.cjs +14 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -3
- package/dist/index.d.ts +24 -3
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/process-O5CGWUU7.js +7 -0
- package/dist/process-UCPFMQ6X.cjs +7 -0
- package/dist/{process-REDRQRT4.cjs.map → process-UCPFMQ6X.cjs.map} +1 -1
- package/dist/{types-DEtt_e1a.d.cts → types-By1RQiKy.d.cts} +4 -0
- package/dist/{types-DEtt_e1a.d.ts → types-By1RQiKy.d.ts} +4 -0
- package/package.json +1 -1
- package/dist/chunk-ENRQYMG7.js.map +0 -1
- package/dist/chunk-HRA5O4XV.js.map +0 -1
- package/dist/chunk-WMZ2V72R.cjs.map +0 -1
- package/dist/chunk-XPYCZ2EO.cjs.map +0 -1
- package/dist/process-BDNNMA6J.js +0 -7
- package/dist/process-REDRQRT4.cjs +0 -7
- /package/dist/{process-BDNNMA6J.js.map → process-O5CGWUU7.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../../chunk-
|
|
3
|
+
var _chunkDJUCNWHKcjs = require('../../chunk-DJUCNWHK.cjs');
|
|
4
|
+
require('../../chunk-XO56R4TD.cjs');
|
|
5
5
|
|
|
6
6
|
// src/adapters/astro/index.ts
|
|
7
7
|
function vazaContent(config) {
|
|
@@ -9,13 +9,13 @@ function vazaContent(config) {
|
|
|
9
9
|
name: "vaza-content",
|
|
10
10
|
hooks: {
|
|
11
11
|
"astro:build:start": async () => {
|
|
12
|
-
await
|
|
12
|
+
await _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, config, "public");
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
17
|
async function buildVazaContent(config) {
|
|
18
|
-
return
|
|
18
|
+
return _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, config, "public");
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkDJUCNWHKcjs = require('../../chunk-DJUCNWHK.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkXO56R4TDcjs = require('../../chunk-XO56R4TD.cjs');
|
|
7
7
|
|
|
8
8
|
// src/adapters/next/index.ts
|
|
9
9
|
var processingPromise = null;
|
|
@@ -13,9 +13,9 @@ function withVazaContent(nextConfig, vazaConfig) {
|
|
|
13
13
|
...nextConfig,
|
|
14
14
|
webpack(config, options) {
|
|
15
15
|
if (options.isServer && vazaConfig && !processingPromise) {
|
|
16
|
-
processingPromise =
|
|
16
|
+
processingPromise = _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, vazaConfig, "public");
|
|
17
17
|
processingPromise.catch((err) => {
|
|
18
|
-
|
|
18
|
+
_chunkXO56R4TDcjs.logger.error("Build error:", err);
|
|
19
19
|
process.exit(1);
|
|
20
20
|
});
|
|
21
21
|
}
|
|
@@ -27,7 +27,7 @@ function withVazaContent(nextConfig, vazaConfig) {
|
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
29
|
async function buildVazaContent(config) {
|
|
30
|
-
return
|
|
30
|
+
return _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, config, "public");
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
processAndWriteOutputs
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-PI5TLKE3.js";
|
|
4
4
|
import {
|
|
5
5
|
logger
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-JKS5PF2Y.js";
|
|
7
7
|
|
|
8
8
|
// src/adapters/next/index.ts
|
|
9
9
|
var processingPromise = null;
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../../chunk-
|
|
3
|
+
var _chunkDJUCNWHKcjs = require('../../chunk-DJUCNWHK.cjs');
|
|
4
|
+
require('../../chunk-XO56R4TD.cjs');
|
|
5
5
|
|
|
6
6
|
// src/adapters/nuxt/index.ts
|
|
7
7
|
function defineVazaContentModule(config) {
|
|
8
8
|
return async (_inlineOptions, nuxt) => {
|
|
9
9
|
if (_optionalChain([nuxt, 'optionalAccess', _ => _.hook])) {
|
|
10
10
|
nuxt.hook("build:before", async () => {
|
|
11
|
-
await
|
|
11
|
+
await _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, config, "public");
|
|
12
12
|
});
|
|
13
13
|
} else {
|
|
14
|
-
await
|
|
14
|
+
await _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, config, "public");
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
async function buildVazaContent(config) {
|
|
19
|
-
return
|
|
19
|
+
return _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, config, "public");
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../../chunk-
|
|
3
|
+
var _chunkDJUCNWHKcjs = require('../../chunk-DJUCNWHK.cjs');
|
|
4
|
+
require('../../chunk-XO56R4TD.cjs');
|
|
5
5
|
|
|
6
6
|
// src/adapters/sveltekit/index.ts
|
|
7
7
|
function vazaContent(config) {
|
|
@@ -11,12 +11,12 @@ function vazaContent(config) {
|
|
|
11
11
|
async buildStart() {
|
|
12
12
|
if (hasRun) return;
|
|
13
13
|
hasRun = true;
|
|
14
|
-
await
|
|
14
|
+
await _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, config, "static");
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
async function buildVazaContent(config) {
|
|
19
|
-
return
|
|
19
|
+
return _chunkDJUCNWHKcjs.processAndWriteOutputs.call(void 0, config, "static");
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
|
|
@@ -3,32 +3,57 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkXO56R4TDcjs = require('./chunk-XO56R4TD.cjs');
|
|
7
9
|
|
|
8
10
|
// src/adapters/shared.ts
|
|
9
11
|
var _fs = require('fs');
|
|
10
12
|
var _path = require('path');
|
|
11
13
|
async function processAndWriteOutputs(config, publicDir) {
|
|
12
|
-
const output = await
|
|
14
|
+
const output = await _chunkXO56R4TDcjs.processCollections.call(void 0, config);
|
|
13
15
|
const outDir = ".vaza-content";
|
|
16
|
+
const siteUrl = config.site.url.replace(/\/$/, "");
|
|
14
17
|
ensureDir(outDir);
|
|
15
18
|
ensureDir(publicDir);
|
|
16
19
|
if (_optionalChain([config, 'access', _ => _.sitemap, 'optionalAccess', _2 => _2.enabled]) !== false) {
|
|
17
20
|
writeJson(_path.join.call(void 0, outDir, "sitemap-data.json"), output.sitemap);
|
|
18
|
-
|
|
19
|
-
|
|
21
|
+
if (_optionalChain([config, 'access', _3 => _3.sitemap, 'optionalAccess', _4 => _4.splitByCollection])) {
|
|
22
|
+
const groups = _chunkXO56R4TDcjs.splitSitemapByCollection.call(void 0, output.sitemap, output.entries);
|
|
23
|
+
const sitemapDir = _path.join.call(void 0, publicDir, "sitemap");
|
|
24
|
+
ensureDir(sitemapDir);
|
|
25
|
+
const indexEntries = [];
|
|
26
|
+
for (const [collection, entries] of groups) {
|
|
27
|
+
const filename = `${collection}.xml`;
|
|
28
|
+
const xml = _chunkXO56R4TDcjs.renderSitemapXml.call(void 0, entries, output.hreflang);
|
|
29
|
+
_fs.writeFileSync.call(void 0, _path.join.call(void 0, sitemapDir, filename), xml, "utf-8");
|
|
30
|
+
const lastmod = entries.reduce((latest, e) => {
|
|
31
|
+
if (!e.lastmod) return latest;
|
|
32
|
+
return !latest || e.lastmod > latest ? e.lastmod : latest;
|
|
33
|
+
}, "");
|
|
34
|
+
indexEntries.push({
|
|
35
|
+
loc: `${siteUrl}/sitemap/${filename}`,
|
|
36
|
+
...lastmod && { lastmod }
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const indexXml = _chunkXO56R4TDcjs.renderSitemapIndex.call(void 0, indexEntries);
|
|
40
|
+
_fs.writeFileSync.call(void 0, _path.join.call(void 0, publicDir, "sitemap.xml"), indexXml, "utf-8");
|
|
41
|
+
} else {
|
|
42
|
+
const xml = _chunkXO56R4TDcjs.renderSitemapXml.call(void 0, output.sitemap, output.hreflang);
|
|
43
|
+
_fs.writeFileSync.call(void 0, _path.join.call(void 0, publicDir, "sitemap.xml"), xml, "utf-8");
|
|
44
|
+
}
|
|
20
45
|
}
|
|
21
|
-
if (_optionalChain([config, 'access',
|
|
22
|
-
const xml =
|
|
23
|
-
const rssPath = _nullishCoalesce(_optionalChain([config, 'access',
|
|
46
|
+
if (_optionalChain([config, 'access', _5 => _5.rss, 'optionalAccess', _6 => _6.enabled]) !== false) {
|
|
47
|
+
const xml = _chunkXO56R4TDcjs.renderRssXml.call(void 0, output.rss, config);
|
|
48
|
+
const rssPath = _nullishCoalesce(_optionalChain([config, 'access', _7 => _7.rss, 'optionalAccess', _8 => _8.path]), () => ( "/rss.xml"));
|
|
24
49
|
const rssFile = _path.join.call(void 0, publicDir, rssPath.replace(/^\//, ""));
|
|
25
50
|
ensureDir(_path.dirname.call(void 0, rssFile));
|
|
26
51
|
_fs.writeFileSync.call(void 0, rssFile, xml, "utf-8");
|
|
27
52
|
}
|
|
28
|
-
if (_optionalChain([config, 'access',
|
|
53
|
+
if (_optionalChain([config, 'access', _9 => _9.robots, 'optionalAccess', _10 => _10.enabled]) !== false && output.robots) {
|
|
29
54
|
_fs.writeFileSync.call(void 0, _path.join.call(void 0, publicDir, "robots.txt"), output.robots, "utf-8");
|
|
30
55
|
}
|
|
31
|
-
if (_optionalChain([config, 'access',
|
|
56
|
+
if (_optionalChain([config, 'access', _11 => _11.jsonLd, 'optionalAccess', _12 => _12.enabled]) !== false) {
|
|
32
57
|
const jsonLdDir = _path.join.call(void 0, outDir, "json-ld");
|
|
33
58
|
ensureDir(jsonLdDir);
|
|
34
59
|
for (const [slug, schemas] of Object.entries(output.jsonLd)) {
|
|
@@ -38,24 +63,24 @@ async function processAndWriteOutputs(config, publicDir) {
|
|
|
38
63
|
writeJson(_path.join.call(void 0, jsonLdDir, "_website.json"), output.websiteSchema);
|
|
39
64
|
}
|
|
40
65
|
}
|
|
41
|
-
if (_optionalChain([config, 'access',
|
|
66
|
+
if (_optionalChain([config, 'access', _13 => _13.metaTags, 'optionalAccess', _14 => _14.enabled]) !== false) {
|
|
42
67
|
const metaDir = _path.join.call(void 0, outDir, "meta-tags");
|
|
43
68
|
ensureDir(metaDir);
|
|
44
69
|
for (const [slug, tags] of Object.entries(output.metaTags)) {
|
|
45
70
|
writeJson(_path.join.call(void 0, metaDir, `${slug}.json`), tags);
|
|
46
71
|
}
|
|
47
72
|
}
|
|
48
|
-
if (_optionalChain([config, 'access',
|
|
73
|
+
if (_optionalChain([config, 'access', _15 => _15.hreflang, 'optionalAccess', _16 => _16.enabled]) !== false && Object.keys(output.hreflang).length > 0) {
|
|
49
74
|
const hreflangDir = _path.join.call(void 0, outDir, "hreflang");
|
|
50
75
|
ensureDir(hreflangDir);
|
|
51
76
|
for (const [slug, links] of Object.entries(output.hreflang)) {
|
|
52
77
|
writeJson(_path.join.call(void 0, hreflangDir, `${slug}.json`), links);
|
|
53
78
|
}
|
|
54
79
|
}
|
|
55
|
-
if (_optionalChain([config, 'access',
|
|
80
|
+
if (_optionalChain([config, 'access', _17 => _17.taxonomy, 'optionalAccess', _18 => _18.enabled]) !== false) {
|
|
56
81
|
writeJson(_path.join.call(void 0, outDir, "taxonomy.json"), output.taxonomy);
|
|
57
82
|
}
|
|
58
|
-
if (_optionalChain([config, 'access',
|
|
83
|
+
if (_optionalChain([config, 'access', _19 => _19.redirects, 'optionalAccess', _20 => _20.enabled]) !== false) {
|
|
59
84
|
writeJson(_path.join.call(void 0, outDir, "redirects.json"), output.redirects);
|
|
60
85
|
}
|
|
61
86
|
if (Object.keys(output.linkingSuggestions).length > 0) {
|
|
@@ -67,8 +92,8 @@ async function processAndWriteOutputs(config, publicDir) {
|
|
|
67
92
|
writeJson(_path.join.call(void 0, outDir, "integrity-report.json"), output.integrity);
|
|
68
93
|
const slugManifest = output.entries.map((e) => e.slug);
|
|
69
94
|
writeJson(_path.join.call(void 0, outDir, "slugs.json"), slugManifest);
|
|
70
|
-
|
|
71
|
-
|
|
95
|
+
_chunkXO56R4TDcjs.logger.info(`Generated ${output.entries.length} entries`);
|
|
96
|
+
_chunkXO56R4TDcjs.logger.info(`Outputs written to ${outDir}/ and ${publicDir}/`);
|
|
72
97
|
return output;
|
|
73
98
|
}
|
|
74
99
|
function ensureDir(dir) {
|
|
@@ -84,4 +109,4 @@ function writeJson(path, data) {
|
|
|
84
109
|
|
|
85
110
|
|
|
86
111
|
exports.processAndWriteOutputs = processAndWriteOutputs;
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
112
|
+
//# sourceMappingURL=chunk-DJUCNWHK.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/mehdi/vaza-content/dist/chunk-DJUCNWHK.cjs","../src/adapters/shared.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACTA,wBAAqD;AACrD,4BAA8B;AAgB9B,MAAA,SAAsB,sBAAA,CACpB,MAAA,EACA,SAAA,EACqB;AACrB,EAAA,MAAM,OAAA,EAAS,MAAM,kDAAA,MAAyB,CAAA;AAC9C,EAAA,MAAM,OAAA,EAAS,eAAA;AACf,EAAA,MAAM,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAEjD,EAAA,SAAA,CAAU,MAAM,CAAA;AAChB,EAAA,SAAA,CAAU,SAAS,CAAA;AAGnB,EAAA,GAAA,iBAAI,MAAA,mBAAO,OAAA,6BAAS,UAAA,IAAY,KAAA,EAAO;AACrC,IAAA,SAAA,CAAU,wBAAA,MAAK,EAAQ,mBAAmB,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA;AAE3D,IAAA,GAAA,iBAAI,MAAA,qBAAO,OAAA,6BAAS,mBAAA,EAAmB;AAErC,MAAA,MAAM,OAAA,EAAS,wDAAA,MAAyB,CAAO,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AACtE,MAAA,MAAM,WAAA,EAAa,wBAAA,SAAK,EAAW,SAAS,CAAA;AAC5C,MAAA,SAAA,CAAU,UAAU,CAAA;AAEpB,MAAA,MAAM,aAAA,EAAoD,CAAC,CAAA;AAE3D,MAAA,IAAA,CAAA,MAAW,CAAC,UAAA,EAAY,OAAO,EAAA,GAAK,MAAA,EAAQ;AAC1C,QAAA,MAAM,SAAA,EAAW,CAAA,EAAA;AACL,QAAA;AACE,QAAA;AAGE,QAAA;AACE,UAAA;AACR,UAAA;AACK,QAAA;AAEG,QAAA;AACD,UAAA;AACE,UAAA;AAClB,QAAA;AACH,MAAA;AAEiB,MAAA;AACE,MAAA;AACd,IAAA;AAEO,MAAA;AACO,MAAA;AACrB,IAAA;AACF,EAAA;AAGgB,EAAA;AACF,IAAA;AACI,IAAA;AACK,IAAA;AACH,IAAA;AACJ,IAAA;AAChB,EAAA;AAGmB,EAAA;AACE,IAAA;AACrB,EAAA;AAGmB,EAAA;AACC,IAAA;AACC,IAAA;AACD,IAAA;AACD,MAAA;AACjB,IAAA;AAEgB,IAAA;AACC,MAAA;AACjB,IAAA;AACF,EAAA;AAGqB,EAAA;AACE,IAAA;AACJ,IAAA;AACK,IAAA;AACL,MAAA;AACjB,IAAA;AACF,EAAA;AAImB,EAAA;AAGG,IAAA;AACC,IAAA;AACH,IAAA;AACD,MAAA;AACjB,IAAA;AACF,EAAA;AAGqB,EAAA;AACJ,IAAA;AACjB,EAAA;AAGsB,EAAA;AACL,IAAA;AACjB,EAAA;AAGuB,EAAA;AACrB,IAAA;AACe,MAAA;AACN,MAAA;AACT,IAAA;AACF,EAAA;AAGuB,EAAA;AAGF,EAAA;AACE,EAAA;AAEX,EAAA;AACA,EAAA;AAEL,EAAA;AACT;AAEsC;AACd,EAAA;AACH,IAAA;AACnB,EAAA;AACF;AAEiC;AACR,EAAA;AACH,EAAA;AACtB;AD/C0B;AACA;AACA;AACA","file":"/Users/mehdi/vaza-content/dist/chunk-DJUCNWHK.cjs","sourcesContent":[null,"import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { renderRssXml } from \"../generate/rss.js\";\nimport {\n renderSitemapIndex,\n renderSitemapXml,\n splitSitemapByCollection,\n} from \"../generate/sitemap.js\";\nimport { logger } from \"../logger.js\";\nimport { processCollections } from \"../process.js\";\nimport type { VazaConfig, VazaOutput } from \"../types.js\";\n\n/**\n * Shared adapter logic: process collections and write all output files.\n * @param config - vaza-content config\n * @param publicDir - framework-specific public directory (\"public\" or \"static\")\n */\nexport async function processAndWriteOutputs(\n config: VazaConfig,\n publicDir: string,\n): Promise<VazaOutput> {\n const output = await processCollections(config);\n const outDir = \".vaza-content\";\n const siteUrl = config.site.url.replace(/\\/$/, \"\");\n\n ensureDir(outDir);\n ensureDir(publicDir);\n\n // Write sitemap\n if (config.sitemap?.enabled !== false) {\n writeJson(join(outDir, \"sitemap-data.json\"), output.sitemap);\n\n if (config.sitemap?.splitByCollection) {\n // Multi-file sitemap with index\n const groups = splitSitemapByCollection(output.sitemap, output.entries);\n const sitemapDir = join(publicDir, \"sitemap\");\n ensureDir(sitemapDir);\n\n const indexEntries: { loc: string; lastmod?: string }[] = [];\n\n for (const [collection, entries] of groups) {\n const filename = `${collection}.xml`;\n const xml = renderSitemapXml(entries, output.hreflang);\n writeFileSync(join(sitemapDir, filename), xml, \"utf-8\");\n\n // Find most recent lastmod for the index\n const lastmod = entries.reduce((latest, e) => {\n if (!e.lastmod) return latest;\n return !latest || e.lastmod > latest ? e.lastmod : latest;\n }, \"\" as string);\n\n indexEntries.push({\n loc: `${siteUrl}/sitemap/${filename}`,\n ...(lastmod && { lastmod }),\n });\n }\n\n const indexXml = renderSitemapIndex(indexEntries);\n writeFileSync(join(publicDir, \"sitemap.xml\"), indexXml, \"utf-8\");\n } else {\n // Single sitemap file\n const xml = renderSitemapXml(output.sitemap, output.hreflang);\n writeFileSync(join(publicDir, \"sitemap.xml\"), xml, \"utf-8\");\n }\n }\n\n // Write RSS\n if (config.rss?.enabled !== false) {\n const xml = renderRssXml(output.rss, config);\n const rssPath = config.rss?.path ?? \"/rss.xml\";\n const rssFile = join(publicDir, rssPath.replace(/^\\//, \"\"));\n ensureDir(dirname(rssFile));\n writeFileSync(rssFile, xml, \"utf-8\");\n }\n\n // Write robots.txt\n if (config.robots?.enabled !== false && output.robots) {\n writeFileSync(join(publicDir, \"robots.txt\"), output.robots, \"utf-8\");\n }\n\n // Write JSON-LD per slug\n if (config.jsonLd?.enabled !== false) {\n const jsonLdDir = join(outDir, \"json-ld\");\n ensureDir(jsonLdDir);\n for (const [slug, schemas] of Object.entries(output.jsonLd)) {\n writeJson(join(jsonLdDir, `${slug}.json`), schemas);\n }\n // Write WebSite schema\n if (Object.keys(output.websiteSchema).length > 0) {\n writeJson(join(jsonLdDir, \"_website.json\"), output.websiteSchema);\n }\n }\n\n // Write meta tags per slug\n if (config.metaTags?.enabled !== false) {\n const metaDir = join(outDir, \"meta-tags\");\n ensureDir(metaDir);\n for (const [slug, tags] of Object.entries(output.metaTags)) {\n writeJson(join(metaDir, `${slug}.json`), tags);\n }\n }\n\n // Write hreflang per slug\n if (\n config.hreflang?.enabled !== false &&\n Object.keys(output.hreflang).length > 0\n ) {\n const hreflangDir = join(outDir, \"hreflang\");\n ensureDir(hreflangDir);\n for (const [slug, links] of Object.entries(output.hreflang)) {\n writeJson(join(hreflangDir, `${slug}.json`), links);\n }\n }\n\n // Write taxonomy data\n if (config.taxonomy?.enabled !== false) {\n writeJson(join(outDir, \"taxonomy.json\"), output.taxonomy);\n }\n\n // Write redirects\n if (config.redirects?.enabled !== false) {\n writeJson(join(outDir, \"redirects.json\"), output.redirects);\n }\n\n // Write linking suggestions\n if (Object.keys(output.linkingSuggestions).length > 0) {\n writeJson(\n join(outDir, \"linking-suggestions.json\"),\n output.linkingSuggestions,\n );\n }\n\n // Write integrity report\n writeJson(join(outDir, \"integrity-report.json\"), output.integrity);\n\n // Write slug manifest for redirect detection\n const slugManifest = output.entries.map((e) => e.slug);\n writeJson(join(outDir, \"slugs.json\"), slugManifest);\n\n logger.info(`Generated ${output.entries.length} entries`);\n logger.info(`Outputs written to ${outDir}/ and ${publicDir}/`);\n\n return output;\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction writeJson(path: string, data: unknown): void {\n ensureDir(dirname(path));\n writeFileSync(path, JSON.stringify(data, null, 2), \"utf-8\");\n}\n"]}
|
|
@@ -63,6 +63,13 @@ function generateArticleSchema(entry, site) {
|
|
|
63
63
|
if (entry.wordCount) {
|
|
64
64
|
schema.wordCount = entry.wordCount;
|
|
65
65
|
}
|
|
66
|
+
if (entry.readingTime) {
|
|
67
|
+
schema.timeRequired = `PT${entry.readingTime}M`;
|
|
68
|
+
}
|
|
69
|
+
schema.speakable = {
|
|
70
|
+
"@type": "SpeakableSpecification",
|
|
71
|
+
cssSelector: ["headline", "description"]
|
|
72
|
+
};
|
|
66
73
|
return schema;
|
|
67
74
|
}
|
|
68
75
|
|
|
@@ -895,6 +902,31 @@ function extractSlug(filePath) {
|
|
|
895
902
|
}
|
|
896
903
|
|
|
897
904
|
// src/generate/robots.ts
|
|
905
|
+
var AI_SEARCH_BOTS = [
|
|
906
|
+
"ChatGPT-User",
|
|
907
|
+
"OAI-SearchBot",
|
|
908
|
+
"GPTBot",
|
|
909
|
+
"PerplexityBot",
|
|
910
|
+
"YouBot",
|
|
911
|
+
"Amazonbot",
|
|
912
|
+
"PhindBot",
|
|
913
|
+
"Claude",
|
|
914
|
+
"anthropic-ai",
|
|
915
|
+
"google-extended",
|
|
916
|
+
"CCBot"
|
|
917
|
+
];
|
|
918
|
+
var AI_TRAINING_BOTS = [
|
|
919
|
+
"Meta-ExternalAgent",
|
|
920
|
+
"Bytespider",
|
|
921
|
+
"Applebot-Extended",
|
|
922
|
+
"cohere-ai",
|
|
923
|
+
"Diffbot",
|
|
924
|
+
"DeepSeekBot",
|
|
925
|
+
"FacebookBot",
|
|
926
|
+
"PetalBot",
|
|
927
|
+
"Omgilibot",
|
|
928
|
+
"img2dataset"
|
|
929
|
+
];
|
|
898
930
|
function generateRobots(config) {
|
|
899
931
|
const siteUrl = config.site.url.replace(/\/$/, "");
|
|
900
932
|
const rules = config.robots?.rules ?? [
|
|
@@ -915,6 +947,21 @@ function generateRobots(config) {
|
|
|
915
947
|
}
|
|
916
948
|
lines.push("");
|
|
917
949
|
}
|
|
950
|
+
const aiPolicy = config.robots?.aiPolicy ?? "allow-search";
|
|
951
|
+
if (aiPolicy === "allow-all") {
|
|
952
|
+
} else if (aiPolicy === "allow-search") {
|
|
953
|
+
for (const bot of AI_TRAINING_BOTS) {
|
|
954
|
+
lines.push(`User-agent: ${bot}`);
|
|
955
|
+
lines.push("Disallow: /");
|
|
956
|
+
lines.push("");
|
|
957
|
+
}
|
|
958
|
+
} else if (aiPolicy === "block-all") {
|
|
959
|
+
for (const bot of [...AI_SEARCH_BOTS, ...AI_TRAINING_BOTS]) {
|
|
960
|
+
lines.push(`User-agent: ${bot}`);
|
|
961
|
+
lines.push("Disallow: /");
|
|
962
|
+
lines.push("");
|
|
963
|
+
}
|
|
964
|
+
}
|
|
918
965
|
if (config.sitemap?.enabled !== false) {
|
|
919
966
|
lines.push(`Sitemap: ${siteUrl}/sitemap.xml`);
|
|
920
967
|
}
|
|
@@ -1122,6 +1169,34 @@ function extractSlugFromUrl(url) {
|
|
|
1122
1169
|
const parts = url.split("/").filter(Boolean);
|
|
1123
1170
|
return parts[parts.length - 1];
|
|
1124
1171
|
}
|
|
1172
|
+
function renderSitemapIndex(sitemaps) {
|
|
1173
|
+
const root = el(
|
|
1174
|
+
"sitemapindex",
|
|
1175
|
+
{ xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9" },
|
|
1176
|
+
sitemaps.map((s) => {
|
|
1177
|
+
const children = [el("loc", [s.loc])];
|
|
1178
|
+
if (s.lastmod) children.push(el("lastmod", [s.lastmod]));
|
|
1179
|
+
return el("sitemap", children);
|
|
1180
|
+
})
|
|
1181
|
+
);
|
|
1182
|
+
return renderXmlDocument(root);
|
|
1183
|
+
}
|
|
1184
|
+
function splitSitemapByCollection(entries, allEntries) {
|
|
1185
|
+
const groups = /* @__PURE__ */ new Map();
|
|
1186
|
+
const slugToCollection = /* @__PURE__ */ new Map();
|
|
1187
|
+
for (const entry of allEntries) {
|
|
1188
|
+
slugToCollection.set(entry.slug, entry._collection ?? "default");
|
|
1189
|
+
}
|
|
1190
|
+
for (const sitemapEntry of entries) {
|
|
1191
|
+
const parts = sitemapEntry.loc.split("/").filter(Boolean);
|
|
1192
|
+
const slug = parts[parts.length - 1];
|
|
1193
|
+
const collection = slugToCollection.get(slug ?? "") ?? "default";
|
|
1194
|
+
const group = groups.get(collection) ?? [];
|
|
1195
|
+
group.push(sitemapEntry);
|
|
1196
|
+
groups.set(collection, group);
|
|
1197
|
+
}
|
|
1198
|
+
return groups;
|
|
1199
|
+
}
|
|
1125
1200
|
|
|
1126
1201
|
// src/generate/taxonomy.ts
|
|
1127
1202
|
function generateTaxonomy(entries, _config) {
|
|
@@ -1685,9 +1760,11 @@ export {
|
|
|
1685
1760
|
renderRssXml,
|
|
1686
1761
|
generateSitemap,
|
|
1687
1762
|
renderSitemapXml,
|
|
1763
|
+
renderSitemapIndex,
|
|
1764
|
+
splitSitemapByCollection,
|
|
1688
1765
|
generateTaxonomy,
|
|
1689
1766
|
checkIntegrity,
|
|
1690
1767
|
normalize2 as normalize,
|
|
1691
1768
|
processCollections
|
|
1692
1769
|
};
|
|
1693
|
-
//# sourceMappingURL=chunk-
|
|
1770
|
+
//# sourceMappingURL=chunk-JKS5PF2Y.js.map
|