@jdevalk/astro-seo-graph 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -4
- package/dist/indexnow.d.ts +2 -3
- package/dist/indexnow.d.ts.map +1 -1
- package/dist/indexnow.js +2 -2
- package/dist/indexnow.js.map +1 -1
- package/dist/integration.d.ts +21 -0
- package/dist/integration.d.ts.map +1 -1
- package/dist/integration.js +90 -13
- package/dist/integration.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -339,6 +339,8 @@ actions. Currently:
|
|
|
339
339
|
|
|
340
340
|
- Warns about built pages with zero or more than one `<h1>` element (a
|
|
341
341
|
common SEO and accessibility issue).
|
|
342
|
+
- Warns about duplicate `<title>` or meta description values across the
|
|
343
|
+
built corpus.
|
|
342
344
|
- Optionally submits built URLs to [IndexNow](https://www.indexnow.org)
|
|
343
345
|
after the build completes.
|
|
344
346
|
|
|
@@ -362,10 +364,11 @@ export default defineConfig({
|
|
|
362
364
|
|
|
363
365
|
Options:
|
|
364
366
|
|
|
365
|
-
| Prop
|
|
366
|
-
|
|
|
367
|
-
| `validateH1`
|
|
368
|
-
| `
|
|
367
|
+
| Prop | Default | Description |
|
|
368
|
+
| ------------------------ | ------- | --------------------------------------------------------------- |
|
|
369
|
+
| `validateH1` | `true` | Warn about pages without exactly one `<h1>` |
|
|
370
|
+
| `validateUniqueMetadata` | `true` | Warn about duplicate `<title>` or meta description across pages |
|
|
371
|
+
| `indexNow` | — | Submit built URLs to IndexNow. See below for sub-options. |
|
|
369
372
|
|
|
370
373
|
`indexNow` sub-options: `key` (8–128 hex chars), `host` (bare host, e.g.
|
|
371
374
|
`example.com`), `siteUrl` (absolute origin), `keyLocation?` (defaults to
|
|
@@ -391,6 +394,24 @@ The filename (minus `.txt.ts`) must equal the key. Pair this with the
|
|
|
391
394
|
`indexNow` integration option above, or call `submitToIndexNow` from your
|
|
392
395
|
own deploy hook.
|
|
393
396
|
|
|
397
|
+
> **Deploy the key file first.** IndexNow verifies host ownership by
|
|
398
|
+
> fetching `https://<host>/<key>.txt` on every submission. Submissions
|
|
399
|
+
> sent before the key file is reachable in production get rejected
|
|
400
|
+
> (HTTP 403) and the key is treated as invalid going forward — you'll
|
|
401
|
+
> have to rotate it. Ship the route, deploy, confirm the `.txt` loads
|
|
402
|
+
> over HTTPS, *then* enable `indexNow` in the integration.
|
|
403
|
+
|
|
404
|
+
## Validating your output
|
|
405
|
+
|
|
406
|
+
The build-time integration checks only catch a narrow set of issues.
|
|
407
|
+
After deploying, verify the rendered JSON-LD against:
|
|
408
|
+
|
|
409
|
+
1. [Google Rich Results Test](https://search.google.com/test/rich-results)
|
|
410
|
+
2. [Schema.org Validator](https://validator.schema.org/)
|
|
411
|
+
|
|
412
|
+
See [AGENTS.md](https://github.com/jdevalk/seo-graph/blob/main/AGENTS.md#validating-your-output)
|
|
413
|
+
for details on what to look for.
|
|
414
|
+
|
|
394
415
|
## License
|
|
395
416
|
|
|
396
417
|
MIT © Joost de Valk
|
package/dist/indexnow.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { APIRoute } from 'astro';
|
|
2
|
-
import { submitToIndexNow, validateIndexNowKey, type IndexNowSubmitResult } from '@jdevalk/seo-graph-core';
|
|
3
2
|
export interface IndexNowKeyRouteOptions {
|
|
4
3
|
/** IndexNow key (8–128 hex characters). */
|
|
5
4
|
key: string;
|
|
@@ -20,6 +19,6 @@ export interface IndexNowKeyRouteOptions {
|
|
|
20
19
|
* ```
|
|
21
20
|
*/
|
|
22
21
|
export declare function createIndexNowKeyRoute(options: IndexNowKeyRouteOptions): APIRoute;
|
|
23
|
-
export { submitToIndexNow, validateIndexNowKey };
|
|
24
|
-
export type { IndexNowSubmitResult };
|
|
22
|
+
export { submitToIndexNow, validateIndexNowKey } from '@jdevalk/seo-graph-core';
|
|
23
|
+
export type { IndexNowSubmitResult } from '@jdevalk/seo-graph-core';
|
|
25
24
|
//# sourceMappingURL=indexnow.d.ts.map
|
package/dist/indexnow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexnow.d.ts","sourceRoot":"","sources":["../src/indexnow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"indexnow.d.ts","sourceRoot":"","sources":["../src/indexnow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGtC,MAAM,WAAW,uBAAuB;IACpC,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,QAAQ,CAYjF;AAED,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/indexnow.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getIndexNowKeyFileContent
|
|
1
|
+
import { getIndexNowKeyFileContent } from '@jdevalk/seo-graph-core';
|
|
2
2
|
/**
|
|
3
3
|
* Returns an Astro `APIRoute` that serves the IndexNow key verification
|
|
4
4
|
* file. Place this at `src/pages/[key].txt.ts` or `src/pages/<key>.txt.ts`
|
|
@@ -24,5 +24,5 @@ export function createIndexNowKeyRoute(options) {
|
|
|
24
24
|
return new Response(body, { headers });
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
-
export { submitToIndexNow, validateIndexNowKey };
|
|
27
|
+
export { submitToIndexNow, validateIndexNowKey } from '@jdevalk/seo-graph-core';
|
|
28
28
|
//# sourceMappingURL=indexnow.js.map
|
package/dist/indexnow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexnow.js","sourceRoot":"","sources":["../src/indexnow.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"indexnow.js","sourceRoot":"","sources":["../src/indexnow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AASpE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACnE,MAAM,IAAI,GAAG,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,YAAY,GACd,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAExF,OAAO,KAAK,IAAI,EAAE;QACd,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,2BAA2B;SAC9C,CAAC;QACF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;QACnE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC;AACN,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/integration.d.ts
CHANGED
|
@@ -46,6 +46,16 @@ export interface SeoGraphIntegrationOptions {
|
|
|
46
46
|
* not present on disk at build time).
|
|
47
47
|
*/
|
|
48
48
|
validateH1?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Warn when two or more built pages share the same `<title>` or
|
|
51
|
+
* meta description. Duplicate metadata is an SEO smell that can only
|
|
52
|
+
* be detected across the whole corpus. Defaults to `true`.
|
|
53
|
+
*
|
|
54
|
+
* Pages without a title or description are reported separately by
|
|
55
|
+
* the H1 validator's siblings — this check only compares values that
|
|
56
|
+
* are present on multiple pages.
|
|
57
|
+
*/
|
|
58
|
+
validateUniqueMetadata?: boolean;
|
|
49
59
|
/**
|
|
50
60
|
* Submit built URLs to IndexNow after the build completes. Omit to
|
|
51
61
|
* disable. Only URLs on `host` are submitted; URLs with trailing
|
|
@@ -66,6 +76,17 @@ export declare function htmlFileToUrl(relativePath: string, siteUrl: string): st
|
|
|
66
76
|
* a lint warning.
|
|
67
77
|
*/
|
|
68
78
|
export declare function countH1s(html: string): number;
|
|
79
|
+
/**
|
|
80
|
+
* Extract the first `<title>` element's text content. Returns `null` when
|
|
81
|
+
* no title tag is found. Whitespace-collapsed and entity-decoded so
|
|
82
|
+
* duplicate-detection compares rendered text, not raw HTML.
|
|
83
|
+
*/
|
|
84
|
+
export declare function extractTitle(html: string): string | null;
|
|
85
|
+
/**
|
|
86
|
+
* Extract the `content` attribute of the first `<meta name="description">`
|
|
87
|
+
* tag. Returns `null` when absent. Entity-decoded for duplicate detection.
|
|
88
|
+
*/
|
|
89
|
+
export declare function extractMetaDescription(html: string): string | null;
|
|
69
90
|
/**
|
|
70
91
|
* Astro integration for `@jdevalk/astro-seo-graph`.
|
|
71
92
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACnB,GAAG,EAAE,GAAG,CAAC;IAET,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC5F;AAED,UAAU,oBAAoB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtE,CAAC;CACL;AAED,MAAM,WAAW,0BAA0B;IACvC,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACvC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,0BAA0B,CAAC;CACzC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc3E;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAgBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,GAAE,0BAA+B,GAAG,oBAAoB,
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACnB,GAAG,EAAE,GAAG,CAAC;IAET,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC5F;AAED,UAAU,oBAAoB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtE,CAAC;CACL;AAED,MAAM,WAAW,0BAA0B;IACvC,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACvC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,0BAA0B,CAAC;CACzC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc3E;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAgBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKxD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQlE;AAgBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,GAAE,0BAA+B,GAAG,oBAAoB,CA0H/F"}
|
package/dist/integration.js
CHANGED
|
@@ -35,6 +35,44 @@ export function countH1s(html) {
|
|
|
35
35
|
const matches = html.match(/<h1[\s>]/gi);
|
|
36
36
|
return matches ? matches.length : 0;
|
|
37
37
|
}
|
|
38
|
+
const HTML_ENTITIES = {
|
|
39
|
+
'&': '&',
|
|
40
|
+
'<': '<',
|
|
41
|
+
'>': '>',
|
|
42
|
+
'"': '"',
|
|
43
|
+
''': "'",
|
|
44
|
+
''': "'",
|
|
45
|
+
' ': ' ',
|
|
46
|
+
};
|
|
47
|
+
function decodeHtmlEntities(value) {
|
|
48
|
+
return value.replace(/&(?:amp|lt|gt|quot|apos|#39|nbsp);/g, (m) => HTML_ENTITIES[m] ?? m);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Extract the first `<title>` element's text content. Returns `null` when
|
|
52
|
+
* no title tag is found. Whitespace-collapsed and entity-decoded so
|
|
53
|
+
* duplicate-detection compares rendered text, not raw HTML.
|
|
54
|
+
*/
|
|
55
|
+
export function extractTitle(html) {
|
|
56
|
+
const match = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
|
|
57
|
+
if (!match)
|
|
58
|
+
return null;
|
|
59
|
+
const text = decodeHtmlEntities(match[1]).replace(/\s+/g, ' ').trim();
|
|
60
|
+
return text.length > 0 ? text : null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extract the `content` attribute of the first `<meta name="description">`
|
|
64
|
+
* tag. Returns `null` when absent. Entity-decoded for duplicate detection.
|
|
65
|
+
*/
|
|
66
|
+
export function extractMetaDescription(html) {
|
|
67
|
+
const re = /<meta\s+[^>]*name\s*=\s*["']description["'][^>]*content\s*=\s*["']([^"']*)["'][^>]*>|<meta\s+[^>]*content\s*=\s*["']([^"']*)["'][^>]*name\s*=\s*["']description["'][^>]*>/i;
|
|
68
|
+
const match = html.match(re);
|
|
69
|
+
if (!match)
|
|
70
|
+
return null;
|
|
71
|
+
const raw = (match[1] ?? match[2] ?? '').trim();
|
|
72
|
+
if (!raw)
|
|
73
|
+
return null;
|
|
74
|
+
return decodeHtmlEntities(raw);
|
|
75
|
+
}
|
|
38
76
|
async function collectHtmlFiles(dir, base = dir) {
|
|
39
77
|
const entries = await readdir(dir, { withFileTypes: true });
|
|
40
78
|
const files = [];
|
|
@@ -67,36 +105,75 @@ async function collectHtmlFiles(dir, base = dir) {
|
|
|
67
105
|
* ```
|
|
68
106
|
*/
|
|
69
107
|
export default function seoGraph(options = {}) {
|
|
70
|
-
const { validateH1 = true, indexNow } = options;
|
|
108
|
+
const { validateH1 = true, validateUniqueMetadata = true, indexNow } = options;
|
|
71
109
|
return {
|
|
72
110
|
name: '@jdevalk/astro-seo-graph',
|
|
73
111
|
hooks: {
|
|
74
112
|
'astro:build:done': async ({ dir, logger }) => {
|
|
75
113
|
const buildDir = fileURLToPath(dir);
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
114
|
+
const needsContentScan = validateH1 || validateUniqueMetadata;
|
|
115
|
+
const htmlFiles = needsContentScan || indexNow ? await collectHtmlFiles(buildDir) : [];
|
|
116
|
+
const h1Missing = [];
|
|
117
|
+
const h1Multiple = [];
|
|
118
|
+
const titlesByValue = new Map();
|
|
119
|
+
const descriptionsByValue = new Map();
|
|
120
|
+
if (needsContentScan) {
|
|
80
121
|
for (const file of htmlFiles) {
|
|
81
122
|
const content = await readFile(join(buildDir, file), 'utf8');
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
123
|
+
if (validateH1) {
|
|
124
|
+
const count = countH1s(content);
|
|
125
|
+
if (count === 0)
|
|
126
|
+
h1Missing.push(file);
|
|
127
|
+
else if (count > 1)
|
|
128
|
+
h1Multiple.push({ file, count });
|
|
129
|
+
}
|
|
130
|
+
if (validateUniqueMetadata) {
|
|
131
|
+
const title = extractTitle(content);
|
|
132
|
+
if (title) {
|
|
133
|
+
const list = titlesByValue.get(title) ?? [];
|
|
134
|
+
list.push(file);
|
|
135
|
+
titlesByValue.set(title, list);
|
|
136
|
+
}
|
|
137
|
+
const description = extractMetaDescription(content);
|
|
138
|
+
if (description) {
|
|
139
|
+
const list = descriptionsByValue.get(description) ?? [];
|
|
140
|
+
list.push(file);
|
|
141
|
+
descriptionsByValue.set(description, list);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
87
144
|
}
|
|
88
|
-
|
|
145
|
+
}
|
|
146
|
+
if (validateH1) {
|
|
147
|
+
if (h1Missing.length === 0 && h1Multiple.length === 0) {
|
|
89
148
|
logger.info(`H1 validation: ${htmlFiles.length} pages checked, all good.`);
|
|
90
149
|
}
|
|
91
150
|
else {
|
|
92
|
-
for (const file of
|
|
151
|
+
for (const file of h1Missing) {
|
|
93
152
|
logger.warn(`H1 validation: ${file} has no <h1>.`);
|
|
94
153
|
}
|
|
95
|
-
for (const { file, count } of
|
|
154
|
+
for (const { file, count } of h1Multiple) {
|
|
96
155
|
logger.warn(`H1 validation: ${file} has ${count} <h1> elements (expected 1).`);
|
|
97
156
|
}
|
|
98
157
|
}
|
|
99
158
|
}
|
|
159
|
+
if (validateUniqueMetadata) {
|
|
160
|
+
const dupTitles = [...titlesByValue.entries()].filter(([, files]) => files.length > 1);
|
|
161
|
+
const dupDescriptions = [...descriptionsByValue.entries()].filter(([, files]) => files.length > 1);
|
|
162
|
+
if (dupTitles.length === 0 && dupDescriptions.length === 0) {
|
|
163
|
+
logger.info(`Metadata uniqueness: ${htmlFiles.length} pages checked, all good.`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
for (const [title, files] of dupTitles) {
|
|
167
|
+
logger.warn(`Metadata uniqueness: title ${JSON.stringify(title)} appears on ${files.length} pages: ${files.join(', ')}`);
|
|
168
|
+
}
|
|
169
|
+
for (const [description, files] of dupDescriptions) {
|
|
170
|
+
const preview = description.length > 80
|
|
171
|
+
? description.slice(0, 77) + '…'
|
|
172
|
+
: description;
|
|
173
|
+
logger.warn(`Metadata uniqueness: description ${JSON.stringify(preview)} appears on ${files.length} pages: ${files.join(', ')}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
100
177
|
if (indexNow) {
|
|
101
178
|
const urls = htmlFiles
|
|
102
179
|
.map((f) => htmlFileToUrl(f, indexNow.siteUrl))
|
package/dist/integration.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.js","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"integration.js","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jdevalk/astro-seo-graph",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Astro integration for @jdevalk/seo-graph-core. Seo component, route factories, content-collection aggregator, Zod content helpers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"astro",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"astro-seo": "^1.1.0",
|
|
53
53
|
"schema-dts": "^2.0.0",
|
|
54
54
|
"zod": "^3.24.0",
|
|
55
|
-
"@jdevalk/seo-graph-core": "0.6.
|
|
55
|
+
"@jdevalk/seo-graph-core": "0.6.1"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@types/node": "^22.0.0",
|