@seo-partner/adapters 1.0.0 → 1.0.3

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.
Files changed (61) hide show
  1. package/dist/ast-merger.d.ts +24 -0
  2. package/dist/ast-merger.d.ts.map +1 -0
  3. package/dist/ast-merger.js +85 -0
  4. package/dist/ast-merger.js.map +1 -0
  5. package/dist/astro-adapter.d.ts +6 -0
  6. package/dist/astro-adapter.d.ts.map +1 -1
  7. package/dist/astro-adapter.js +19 -0
  8. package/dist/astro-adapter.js.map +1 -1
  9. package/dist/blog-scaffold-generator.d.ts +8 -0
  10. package/dist/blog-scaffold-generator.d.ts.map +1 -0
  11. package/dist/blog-scaffold-generator.js +138 -0
  12. package/dist/blog-scaffold-generator.js.map +1 -0
  13. package/dist/index.d.ts +8 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +8 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/laravel-adapter.d.ts +7 -0
  18. package/dist/laravel-adapter.d.ts.map +1 -0
  19. package/dist/laravel-adapter.js +35 -0
  20. package/dist/laravel-adapter.js.map +1 -0
  21. package/dist/layout-title-resolver.d.ts +8 -0
  22. package/dist/layout-title-resolver.d.ts.map +1 -0
  23. package/dist/layout-title-resolver.js +28 -0
  24. package/dist/layout-title-resolver.js.map +1 -0
  25. package/dist/nuxt-adapter.d.ts +6 -0
  26. package/dist/nuxt-adapter.d.ts.map +1 -1
  27. package/dist/nuxt-adapter.js +20 -0
  28. package/dist/nuxt-adapter.js.map +1 -1
  29. package/dist/php-native-adapter.d.ts +7 -0
  30. package/dist/php-native-adapter.d.ts.map +1 -0
  31. package/dist/php-native-adapter.js +31 -0
  32. package/dist/php-native-adapter.js.map +1 -0
  33. package/dist/sitemap-builder.d.ts +10 -0
  34. package/dist/sitemap-builder.d.ts.map +1 -0
  35. package/dist/sitemap-builder.js +37 -0
  36. package/dist/sitemap-builder.js.map +1 -0
  37. package/dist/skeleton-detector.d.ts +14 -0
  38. package/dist/skeleton-detector.d.ts.map +1 -0
  39. package/dist/skeleton-detector.js +33 -0
  40. package/dist/skeleton-detector.js.map +1 -0
  41. package/dist/sveltekit-adapter.d.ts +6 -0
  42. package/dist/sveltekit-adapter.d.ts.map +1 -1
  43. package/dist/sveltekit-adapter.js +26 -0
  44. package/dist/sveltekit-adapter.js.map +1 -1
  45. package/dist/symfony-adapter.d.ts +7 -0
  46. package/dist/symfony-adapter.d.ts.map +1 -0
  47. package/dist/symfony-adapter.js +23 -0
  48. package/dist/symfony-adapter.js.map +1 -0
  49. package/package.json +2 -2
  50. package/src/ast-merger.ts +123 -0
  51. package/src/astro-adapter.ts +155 -126
  52. package/src/blog-scaffold-generator.ts +153 -0
  53. package/src/index.ts +8 -0
  54. package/src/laravel-adapter.ts +45 -0
  55. package/src/layout-title-resolver.ts +37 -0
  56. package/src/nuxt-adapter.ts +148 -118
  57. package/src/php-native-adapter.ts +46 -0
  58. package/src/sitemap-builder.ts +57 -0
  59. package/src/skeleton-detector.ts +56 -0
  60. package/src/sveltekit-adapter.ts +160 -119
  61. package/src/symfony-adapter.ts +33 -0
@@ -0,0 +1,24 @@
1
+ export interface MetadataFields {
2
+ title?: string;
3
+ description?: string;
4
+ canonical?: string;
5
+ openGraph?: {
6
+ title?: string;
7
+ description?: string;
8
+ url?: string;
9
+ siteName?: string;
10
+ };
11
+ }
12
+ export interface AstMergeResult {
13
+ mergedCode: string;
14
+ modified: boolean;
15
+ hasComplexDynamicLogic: boolean;
16
+ isClientComponent: boolean;
17
+ changes: Array<{
18
+ field: string;
19
+ before?: string | null;
20
+ after: string;
21
+ }>;
22
+ }
23
+ export declare function mergePageMetadataInPlace(sourceCode: string, newMeta: MetadataFields): AstMergeResult;
24
+ //# sourceMappingURL=ast-merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-merger.d.ts","sourceRoot":"","sources":["../src/ast-merger.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,sBAAsB,EAAE,OAAO,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,cAAc,CA+FhB"}
@@ -0,0 +1,85 @@
1
+ export function mergePageMetadataInPlace(sourceCode, newMeta) {
2
+ const isClientComponent = /^\s*['"]use client['"]/m.test(sourceCode);
3
+ const hasGenerateMetadata = /\bexport\s+(async\s+)?function\s+generateMetadata\b/.test(sourceCode);
4
+ if (hasGenerateMetadata) {
5
+ return {
6
+ mergedCode: sourceCode,
7
+ modified: false,
8
+ hasComplexDynamicLogic: true,
9
+ isClientComponent,
10
+ changes: [],
11
+ };
12
+ }
13
+ const changes = [];
14
+ // Match existing `export const metadata = { ... }` or `export const metadata: Metadata = { ... }`
15
+ const metadataRegex = /(export\s+const\s+metadata(?:\s*:\s*\w+)?\s*=\s*\{)([\s\S]*?)(\};?)/m;
16
+ const match = metadataRegex.exec(sourceCode);
17
+ if (match) {
18
+ const prefix = match[1] ?? '';
19
+ let body = match[2] ?? '';
20
+ const suffix = match[3] ?? '';
21
+ // Check title
22
+ if (newMeta.title && !/\btitle\s*:/m.test(body)) {
23
+ const val = newMeta.title;
24
+ body = `\n title: '${val.replace(/'/g, "\\'")}',` + body;
25
+ changes.push({ field: 'title', before: null, after: val });
26
+ }
27
+ // Check description
28
+ if (newMeta.description && !/\bdescription\s*:/m.test(body)) {
29
+ const val = newMeta.description;
30
+ body = `\n description: '${val.replace(/'/g, "\\'")}',` + body;
31
+ changes.push({ field: 'description', before: null, after: val });
32
+ }
33
+ // Check alternates / canonical
34
+ if (newMeta.canonical && !/\balternates\s*:/m.test(body)) {
35
+ const val = newMeta.canonical;
36
+ body = body + `\n alternates: {\n canonical: '${val}',\n },`;
37
+ changes.push({ field: 'alternates.canonical', before: null, after: val });
38
+ }
39
+ // Check openGraph
40
+ if (newMeta.openGraph && !/\bopenGraph\s*:/m.test(body)) {
41
+ const ogTitle = newMeta.openGraph.title ?? newMeta.title ?? '';
42
+ const ogDesc = newMeta.openGraph.description ?? newMeta.description ?? '';
43
+ body = body + `\n openGraph: {\n title: '${ogTitle.replace(/'/g, "\\'")}',\n description: '${ogDesc.replace(/'/g, "\\'")}',\n },`;
44
+ changes.push({ field: 'openGraph', before: null, after: ogTitle });
45
+ }
46
+ const mergedCode = sourceCode.replace(metadataRegex, `${prefix}${body}\n${suffix}`);
47
+ return {
48
+ mergedCode,
49
+ modified: changes.length > 0,
50
+ hasComplexDynamicLogic: false,
51
+ isClientComponent,
52
+ changes,
53
+ };
54
+ }
55
+ // No existing metadata block: create one
56
+ const entries = [];
57
+ if (newMeta.title) {
58
+ entries.push(` title: '${newMeta.title.replace(/'/g, "\\'")}',`);
59
+ changes.push({ field: 'title', before: null, after: newMeta.title });
60
+ }
61
+ if (newMeta.description) {
62
+ entries.push(` description: '${newMeta.description.replace(/'/g, "\\'")}',`);
63
+ changes.push({ field: 'description', before: null, after: newMeta.description });
64
+ }
65
+ if (newMeta.canonical) {
66
+ entries.push(` alternates: {\n canonical: '${newMeta.canonical}',\n },`);
67
+ changes.push({ field: 'alternates.canonical', before: null, after: newMeta.canonical });
68
+ }
69
+ if (newMeta.openGraph) {
70
+ const ogTitle = newMeta.openGraph.title ?? newMeta.title ?? '';
71
+ const ogDesc = newMeta.openGraph.description ?? newMeta.description ?? '';
72
+ entries.push(` openGraph: {\n title: '${ogTitle.replace(/'/g, "\\'")}',\n description: '${ogDesc.replace(/'/g, "\\'")}',\n },`);
73
+ changes.push({ field: 'openGraph', before: null, after: ogTitle });
74
+ }
75
+ const newExport = `\nexport const metadata = {\n${entries.join('\n')}\n};\n`;
76
+ const mergedCode = sourceCode + newExport;
77
+ return {
78
+ mergedCode,
79
+ modified: true,
80
+ hasComplexDynamicLogic: false,
81
+ isClientComponent,
82
+ changes,
83
+ };
84
+ }
85
+ //# sourceMappingURL=ast-merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-merger.js","sourceRoot":"","sources":["../src/ast-merger.ts"],"names":[],"mappings":"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"}
@@ -10,4 +10,10 @@ export declare class AstroAdapter implements FrameworkAdapter {
10
10
  discoverRoutes(projectRoot: string, filePaths: ReadonlyArray<string>, contentsByPath: ReadonlyMap<string, string>, sitemapPaths: ReadonlySet<string>): Promise<ReadonlyArray<DiscoveredRoute>>;
11
11
  extractRoute(projectRoot: string, route: DiscoveredRoute, fileContent: string): Promise<ExtractedRouteData>;
12
12
  }
13
+ export interface AstroMetaFields {
14
+ title?: string;
15
+ description?: string;
16
+ canonical?: string;
17
+ }
18
+ export declare function patchAstroTemplate(sourceCode: string, meta: AstroMetaFields): string;
13
19
  //# sourceMappingURL=astro-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"astro-adapter.d.ts","sourceRoot":"","sources":["../src/astro-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAK3F,qBAAa,YAAa,YAAW,gBAAgB;IACnD,SAAgB,EAAE,WAAW;IAC7B,SAAgB,IAAI,WAAW;IAC/B,SAAgB,OAAO,EAAE,cAAc,CAAS;IAChD,SAAgB,YAAY,EAAE,mBAAmB,CAQ/C;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IAE1C,MAAM,CACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1C,OAAO,CAAC,OAAO,CAAC;IAqBN,cAAc,CACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3C,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAoD7B,YAAY,CACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC;CAe/B"}
1
+ {"version":3,"file":"astro-adapter.d.ts","sourceRoot":"","sources":["../src/astro-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAK3F,qBAAa,YAAa,YAAW,gBAAgB;IACnD,SAAgB,EAAE,WAAW;IAC7B,SAAgB,IAAI,WAAW;IAC/B,SAAgB,OAAO,EAAE,cAAc,CAAS;IAChD,SAAgB,YAAY,EAAE,mBAAmB,CAQ/C;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IAE1C,MAAM,CACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1C,OAAO,CAAC,OAAO,CAAC;IAqBN,cAAc,CACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3C,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAoD7B,YAAY,CACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC;CAe/B;AAGD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,eAAe,GACpB,MAAM,CAkBR"}
@@ -92,4 +92,23 @@ export class AstroAdapter {
92
92
  return extracted;
93
93
  }
94
94
  }
95
+ export function patchAstroTemplate(sourceCode, meta) {
96
+ let result = sourceCode;
97
+ const entries = [];
98
+ if (meta.title)
99
+ entries.push(`title: "${meta.title.replace(/"/g, '\\"')}"`);
100
+ if (meta.description)
101
+ entries.push(`description: "${meta.description.replace(/"/g, '\\"')}"`);
102
+ if (meta.canonical)
103
+ entries.push(`canonical: "${meta.canonical}"`);
104
+ const seoVarBlock = `const seoMeta = {\n ${entries.join(',\n ')}\n};\n`;
105
+ const frontmatterMatch = /^---\s*\n([\s\S]*?)\n---/m.exec(result);
106
+ if (frontmatterMatch) {
107
+ result = result.replace(/^---\s*\n/m, `---\n${seoVarBlock}`);
108
+ }
109
+ else {
110
+ result = `---\n${seoVarBlock}---\n\n` + result;
111
+ }
112
+ return result;
113
+ }
95
114
  //# sourceMappingURL=astro-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"astro-adapter.js","sourceRoot":"","sources":["../src/astro-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"astro-adapter.js","sourceRoot":"","sources":["../src/astro-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FrameworkType } from '@seo-partner/core';
2
+ export interface BlogScaffoldFile {
3
+ relativePath: string;
4
+ code: string;
5
+ description: string;
6
+ }
7
+ export declare function generateBlogScaffold(framework: FrameworkType, pillarTitle?: string): BlogScaffoldFile[];
8
+ //# sourceMappingURL=blog-scaffold-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-scaffold-generator.d.ts","sourceRoot":"","sources":["../src/blog-scaffold-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,EACxB,WAAW,SAA6B,GACvC,gBAAgB,EAAE,CA4IpB"}
@@ -0,0 +1,138 @@
1
+ export function generateBlogScaffold(framework, pillarTitle = 'Actualités et Guides SEO') {
2
+ switch (framework) {
3
+ case 'next_app':
4
+ return [
5
+ {
6
+ relativePath: 'app/blog/page.tsx',
7
+ code: `import type { Metadata } from 'next';
8
+ import Link from 'next/link';
9
+
10
+ export const metadata: Metadata = {
11
+ title: '${pillarTitle} | Blog',
12
+ description: 'Découvrez nos guides d\\\'experts et analyses approfondies.',
13
+ alternates: {
14
+ canonical: '/blog',
15
+ },
16
+ };
17
+
18
+ export default function BlogIndexPage() {
19
+ return (
20
+ <main className="max-w-4xl mx-auto py-12 px-4">
21
+ <h1 className="text-3xl font-bold mb-8">${pillarTitle}</h1>
22
+ <p className="text-gray-600 mb-6">Explorez nos articles et guides complets pour approfondir vos compétences.</p>
23
+ </main>
24
+ );
25
+ }
26
+ `,
27
+ description: 'Page d\'index du blog Next.js App Router',
28
+ },
29
+ {
30
+ relativePath: 'app/blog/[slug]/page.tsx',
31
+ code: `import type { Metadata } from 'next';
32
+ import { notFound } from 'next/navigation';
33
+
34
+ interface Props {
35
+ params: { slug: string };
36
+ }
37
+
38
+ export async function generateMetadata({ params }: Props): Promise<Metadata> {
39
+ return {
40
+ title: \`Article: \${params.slug} | Blog\`,
41
+ description: 'Guide complet et recommandations pratiques.',
42
+ };
43
+ }
44
+
45
+ export default function BlogPostPage({ params }: Props) {
46
+ return (
47
+ <article className="max-w-3xl mx-auto py-12 px-4 prose">
48
+ <h1>Détail de l\\\'article : {params.slug}</h1>
49
+ </article>
50
+ );
51
+ }
52
+ `,
53
+ description: 'Route dynamique d\'article Next.js App Router',
54
+ },
55
+ ];
56
+ case 'nuxt':
57
+ return [
58
+ {
59
+ relativePath: 'pages/blog/index.vue',
60
+ code: `<script setup lang="ts">
61
+ useSeoMeta({
62
+ title: '${pillarTitle} | Blog',
63
+ description: 'Guides d\\\'experts et ressources pratiques.',
64
+ });
65
+ </script>
66
+
67
+ <template>
68
+ <main class="blog-index">
69
+ <h1>${pillarTitle}</h1>
70
+ </main>
71
+ </template>
72
+ `,
73
+ description: 'Page d\'index du blog Nuxt 3',
74
+ },
75
+ ];
76
+ case 'astro':
77
+ return [
78
+ {
79
+ relativePath: 'src/pages/blog/index.astro',
80
+ code: `---
81
+ const pageTitle = "${pillarTitle}";
82
+ ---
83
+ <html>
84
+ <head>
85
+ <title>{pageTitle}</title>
86
+ <meta name="description" content="Guides et analyses éditoriales d\\\'experts." />
87
+ </head>
88
+ <body>
89
+ <main>
90
+ <h1>{pageTitle}</h1>
91
+ </main>
92
+ </body>
93
+ </html>
94
+ `,
95
+ description: 'Page d\'index du blog Astro',
96
+ },
97
+ ];
98
+ case 'laravel':
99
+ return [
100
+ {
101
+ relativePath: 'resources/views/blog/index.blade.php',
102
+ code: `@extends('layouts.app')
103
+
104
+ @section('title', '${pillarTitle}')
105
+
106
+ @push('meta')
107
+ <meta name="description" content="Retrouvez nos guides et articles spécialisés.">
108
+ @endpush
109
+
110
+ @section('content')
111
+ <div class="container py-5">
112
+ <h1>${pillarTitle}</h1>
113
+ </div>
114
+ @endsection
115
+ `,
116
+ description: 'Vue d\'index du blog Laravel Blade',
117
+ },
118
+ ];
119
+ default:
120
+ return [
121
+ {
122
+ relativePath: 'blog/index.php',
123
+ code: `<?php
124
+ $pageTitle = '${pillarTitle}';
125
+ $metaDescription = 'Guides et ressources d\\\'experts.';
126
+ require_once __DIR__ . '/../includes/header.php';
127
+ ?>
128
+ <main class="container">
129
+ <h1><?php echo htmlspecialchars($pageTitle); ?></h1>
130
+ </main>
131
+ <?php require_once __DIR__ . '/../includes/footer.php'; ?>
132
+ `,
133
+ description: 'Script d\'index du blog PHP',
134
+ },
135
+ ];
136
+ }
137
+ }
138
+ //# sourceMappingURL=blog-scaffold-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-scaffold-generator.js","sourceRoot":"","sources":["../src/blog-scaffold-generator.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,oBAAoB,CAClC,SAAwB,EACxB,WAAW,GAAG,0BAA0B;IAExC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,UAAU;YACb,OAAO;gBACL;oBACE,YAAY,EAAE,mBAAmB;oBACjC,IAAI,EAAE;;;;YAIJ,WAAW;;;;;;;;;;gDAUyB,WAAW;;;;;CAK1D;oBACS,WAAW,EAAE,0CAA0C;iBACxD;gBACD;oBACE,YAAY,EAAE,0BAA0B;oBACxC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;CAqBf;oBACS,WAAW,EAAE,+CAA+C;iBAC7D;aACF,CAAC;QAEJ,KAAK,MAAM;YACT,OAAO;gBACL;oBACE,YAAY,EAAE,sBAAsB;oBACpC,IAAI,EAAE;;YAEJ,WAAW;;;;;;;UAOb,WAAW;;;CAGpB;oBACS,WAAW,EAAE,8BAA8B;iBAC5C;aACF,CAAC;QAEJ,KAAK,OAAO;YACV,OAAO;gBACL;oBACE,YAAY,EAAE,4BAA4B;oBAC1C,IAAI,EAAE;qBACK,WAAW;;;;;;;;;;;;;CAa/B;oBACS,WAAW,EAAE,6BAA6B;iBAC3C;aACF,CAAC;QAEJ,KAAK,SAAS;YACZ,OAAO;gBACL;oBACE,YAAY,EAAE,sCAAsC;oBACpD,IAAI,EAAE;;qBAEK,WAAW;;;;;;;;UAQtB,WAAW;;;CAGpB;oBACS,WAAW,EAAE,oCAAoC;iBAClD;aACF,CAAC;QAEJ;YACE,OAAO;gBACL;oBACE,YAAY,EAAE,gBAAgB;oBAC9B,IAAI,EAAE;gBACA,WAAW;;;;;;;;CAQ1B;oBACS,WAAW,EAAE,6BAA6B;iBAC3C;aACF,CAAC;IACN,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -7,6 +7,9 @@ export * from './sveltekit-adapter.js';
7
7
  export * from './remix-adapter.js';
8
8
  export * from './django-adapter.js';
9
9
  export * from './php-adapter.js';
10
+ export * from './laravel-adapter.js';
11
+ export * from './symfony-adapter.js';
12
+ export * from './php-native-adapter.js';
10
13
  export * from './static-adapter.js';
11
14
  export * from './parsers/tsx-ast-parser.js';
12
15
  export * from './parsers/html-parser.js';
@@ -21,4 +24,9 @@ export * from './parsers/php-template-parser.js';
21
24
  export * from './parsers/robots-sitemap-parser.js';
22
25
  export * from './parsers/route-normalizer.js';
23
26
  export * from './parsers/layout-resolver.js';
27
+ export * from './sitemap-builder.js';
28
+ export * from './skeleton-detector.js';
29
+ export * from './ast-merger.js';
30
+ export * from './layout-title-resolver.js';
31
+ export * from './blog-scaffold-generator.js';
24
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,9 @@ export * from './sveltekit-adapter.js';
7
7
  export * from './remix-adapter.js';
8
8
  export * from './django-adapter.js';
9
9
  export * from './php-adapter.js';
10
+ export * from './laravel-adapter.js';
11
+ export * from './symfony-adapter.js';
12
+ export * from './php-native-adapter.js';
10
13
  export * from './static-adapter.js';
11
14
  export * from './parsers/tsx-ast-parser.js';
12
15
  export * from './parsers/html-parser.js';
@@ -21,4 +24,9 @@ export * from './parsers/php-template-parser.js';
21
24
  export * from './parsers/robots-sitemap-parser.js';
22
25
  export * from './parsers/route-normalizer.js';
23
26
  export * from './parsers/layout-resolver.js';
27
+ export * from './sitemap-builder.js';
28
+ export * from './skeleton-detector.js';
29
+ export * from './ast-merger.js';
30
+ export * from './layout-title-resolver.js';
31
+ export * from './blog-scaffold-generator.js';
24
32
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface LaravelMetaFields {
2
+ title?: string;
3
+ description?: string;
4
+ canonical?: string;
5
+ }
6
+ export declare function patchLaravelBladeTemplate(sourceCode: string, meta: LaravelMetaFields): string;
7
+ //# sourceMappingURL=laravel-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laravel-adapter.d.ts","sourceRoot":"","sources":["../src/laravel-adapter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,iBAAiB,GACtB,MAAM,CAkCR"}
@@ -0,0 +1,35 @@
1
+ export function patchLaravelBladeTemplate(sourceCode, meta) {
2
+ let result = sourceCode;
3
+ // Title section
4
+ if (meta.title && !/@section\(\s*['"]title['"]/i.test(result)) {
5
+ const sectionTitle = `@section('title', '${meta.title.replace(/'/g, "\\'")}')\n`;
6
+ if (/@extends\([^)]+\)/i.test(result)) {
7
+ result = result.replace(/(@extends\([^)]+\)\s*\n)/i, `$1${sectionTitle}`);
8
+ }
9
+ else {
10
+ result = sectionTitle + result;
11
+ }
12
+ }
13
+ // Meta push
14
+ if ((meta.description || meta.canonical) && !/@push\(\s*['"]meta['"]/i.test(result)) {
15
+ const metaTags = ["@push('meta')"];
16
+ if (meta.description) {
17
+ metaTags.push(` <meta name="description" content="${meta.description.replace(/"/g, '&quot;')}">`);
18
+ }
19
+ if (meta.canonical) {
20
+ metaTags.push(` <link rel="canonical" href="${meta.canonical}">`);
21
+ }
22
+ metaTags.push('@endpush\n');
23
+ if (/@section\(\s*['"]title['"][^)]*\)/i.test(result)) {
24
+ result = result.replace(/(@section\(\s*['"]title['"][^)]*\)\s*\n)/i, `$1${metaTags.join('\n')}`);
25
+ }
26
+ else if (/@extends\([^)]+\)/i.test(result)) {
27
+ result = result.replace(/(@extends\([^)]+\)\s*\n)/i, `$1${metaTags.join('\n')}`);
28
+ }
29
+ else {
30
+ result = metaTags.join('\n') + result;
31
+ }
32
+ }
33
+ return result;
34
+ }
35
+ //# sourceMappingURL=laravel-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laravel-adapter.js","sourceRoot":"","sources":["../src/laravel-adapter.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,IAAuB;IAEvB,IAAI,MAAM,GAAG,UAAU,CAAC;IAExB,gBAAgB;IAChB,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9D,MAAM,YAAY,GAAG,sBAAsB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;QACjF,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,KAAK,YAAY,EAAE,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC;QACjC,CAAC;IACH,CAAC;IAED,YAAY;IACZ,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpF,MAAM,QAAQ,GAAa,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE5B,IAAI,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,2CAA2C,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC;aAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface LayoutTitleTemplate {
2
+ template?: string;
3
+ defaultTitle?: string;
4
+ brandName?: string;
5
+ }
6
+ export declare function extractLayoutTitleTemplate(layoutCode: string): LayoutTitleTemplate | null;
7
+ export declare function sanitizePageTitleForLayout(pageTitle: string, layoutTemplate: LayoutTitleTemplate | null): string;
8
+ //# sourceMappingURL=layout-title-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-title-resolver.d.ts","sourceRoot":"","sources":["../src/layout-title-resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAqBzF;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,mBAAmB,GAAG,IAAI,GAAG,MAAM,CAOhH"}
@@ -0,0 +1,28 @@
1
+ export function extractLayoutTitleTemplate(layoutCode) {
2
+ const match = /title\s*:\s*\{([^}]+)\}/m.exec(layoutCode);
3
+ if (!match || !match[1])
4
+ return null;
5
+ const body = match[1];
6
+ const templateMatch = /template\s*:\s*['"`]([^'"`]+)['"`]/.exec(body);
7
+ const defaultMatch = /default\s*:\s*['"`]([^'"`]+)['"`]/.exec(body);
8
+ const template = templateMatch?.[1];
9
+ const defaultTitle = defaultMatch?.[1];
10
+ let brandName;
11
+ if (template && template.includes('%s')) {
12
+ brandName = template.replace('%s', '').replace(/^[| -]+|[| -]+$/g, '').trim();
13
+ }
14
+ return {
15
+ template,
16
+ defaultTitle,
17
+ brandName,
18
+ };
19
+ }
20
+ export function sanitizePageTitleForLayout(pageTitle, layoutTemplate) {
21
+ if (!layoutTemplate?.brandName) {
22
+ return pageTitle;
23
+ }
24
+ const brand = layoutTemplate.brandName;
25
+ const regex = new RegExp(`(\\s*[|\\-]\\s*${brand.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')})+$`, 'i');
26
+ return pageTitle.replace(regex, '').trim();
27
+ }
28
+ //# sourceMappingURL=layout-title-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-title-resolver.js","sourceRoot":"","sources":["../src/layout-title-resolver.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,0BAA0B,CAAC,UAAkB;IAC3D,MAAM,KAAK,GAAG,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvC,IAAI,SAA6B,CAAC;IAClC,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChF,CAAC;IAED,OAAO;QACL,QAAQ;QACR,YAAY;QACZ,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,SAAiB,EAAE,cAA0C;IACtG,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,kBAAkB,KAAK,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrG,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC"}
@@ -10,4 +10,10 @@ export declare class NuxtAdapter implements FrameworkAdapter {
10
10
  discoverRoutes(projectRoot: string, filePaths: ReadonlyArray<string>, contentsByPath: ReadonlyMap<string, string>, sitemapPaths: ReadonlySet<string>): Promise<ReadonlyArray<DiscoveredRoute>>;
11
11
  extractRoute(projectRoot: string, route: DiscoveredRoute, fileContent: string): Promise<ExtractedRouteData>;
12
12
  }
13
+ export interface NuxtMetaFields {
14
+ title?: string;
15
+ description?: string;
16
+ canonical?: string;
17
+ }
18
+ export declare function patchNuxtTemplate(sourceCode: string, meta: NuxtMetaFields): string;
13
19
  //# sourceMappingURL=nuxt-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nuxt-adapter.d.ts","sourceRoot":"","sources":["../src/nuxt-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAK3F,qBAAa,WAAY,YAAW,gBAAgB;IAClD,SAAgB,EAAE,UAAU;IAC5B,SAAgB,IAAI,YAAY;IAChC,SAAgB,OAAO,EAAE,cAAc,CAAS;IAChD,SAAgB,YAAY,EAAE,mBAAmB,CAQ/C;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IAE1C,MAAM,CACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1C,OAAO,CAAC,OAAO,CAAC;IAoBN,cAAc,CACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3C,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAoD7B,YAAY,CACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC;CAS/B"}
1
+ {"version":3,"file":"nuxt-adapter.d.ts","sourceRoot":"","sources":["../src/nuxt-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAK3F,qBAAa,WAAY,YAAW,gBAAgB;IAClD,SAAgB,EAAE,UAAU;IAC5B,SAAgB,IAAI,YAAY;IAChC,SAAgB,OAAO,EAAE,cAAc,CAAS;IAChD,SAAgB,YAAY,EAAE,mBAAmB,CAQ/C;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IAE1C,MAAM,CACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1C,OAAO,CAAC,OAAO,CAAC;IAoBN,cAAc,CACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3C,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAoD7B,YAAY,CACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC;CAS/B;AAGD,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,GACnB,MAAM,CAmBR"}
@@ -85,4 +85,24 @@ export class NuxtAdapter {
85
85
  return extracted;
86
86
  }
87
87
  }
88
+ export function patchNuxtTemplate(sourceCode, meta) {
89
+ let result = sourceCode;
90
+ const entries = [];
91
+ if (meta.title)
92
+ entries.push(` title: '${meta.title.replace(/'/g, "\\'")}',`);
93
+ if (meta.description)
94
+ entries.push(` description: '${meta.description.replace(/'/g, "\\'")}',`);
95
+ if (meta.canonical)
96
+ entries.push(` canonical: '${meta.canonical}',`);
97
+ const seoMetaCall = `useSeoMeta({\n${entries.join('\n')}\n});\n`;
98
+ if (/<script\s+setup[^>]*>/i.test(result)) {
99
+ if (!/useSeoMeta\s*\(/i.test(result)) {
100
+ result = result.replace(/(<script\s+setup[^>]*>\s*\n)/i, `$1${seoMetaCall}`);
101
+ }
102
+ }
103
+ else {
104
+ result = `<script setup lang="ts">\n${seoMetaCall}</script>\n\n` + result;
105
+ }
106
+ return result;
107
+ }
88
108
  //# sourceMappingURL=nuxt-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nuxt-adapter.js","sourceRoot":"","sources":["../src/nuxt-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nuxt-adapter.js","sourceRoot":"","sources":["../src/nuxt-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface PhpNativeMetaFields {
2
+ title?: string;
3
+ description?: string;
4
+ canonical?: string;
5
+ }
6
+ export declare function patchPhpNativeTemplate(sourceCode: string, meta: PhpNativeMetaFields): string;
7
+ //# sourceMappingURL=php-native-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php-native-adapter.d.ts","sourceRoot":"","sources":["../src/php-native-adapter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,mBAAmB,GACxB,MAAM,CAmCR"}
@@ -0,0 +1,31 @@
1
+ export function patchPhpNativeTemplate(sourceCode, meta) {
2
+ let result = sourceCode;
3
+ const vars = [];
4
+ if (meta.title && !/\$pageTitle\s*=/i.test(result)) {
5
+ vars.push(`$pageTitle = '${meta.title.replace(/'/g, "\\'")}';`);
6
+ }
7
+ if (meta.description && !/\$metaDescription\s*=/i.test(result)) {
8
+ vars.push(`$metaDescription = '${meta.description.replace(/'/g, "\\'")}';`);
9
+ }
10
+ if (meta.canonical && !/\$canonicalUrl\s*=/i.test(result)) {
11
+ vars.push(`$canonicalUrl = '${meta.canonical.replace(/'/g, "\\'")}';`);
12
+ }
13
+ if (vars.length === 0) {
14
+ return result;
15
+ }
16
+ const varsBlock = vars.join('\n') + '\n';
17
+ // If file starts with <?php, inject before any header include
18
+ if (/<\?php/i.test(result)) {
19
+ if (/(include|require|include_once|require_once)\s*['"][^'"]*header[^'"]*['"]/i.test(result)) {
20
+ result = result.replace(/((?:include|require|include_once|require_once)\s*['"][^'"]*header[^'"]*['"])/i, `${varsBlock}$1`);
21
+ }
22
+ else {
23
+ result = result.replace(/(<\?php\s*\n)/i, `$1${varsBlock}`);
24
+ }
25
+ }
26
+ else {
27
+ result = `<?php\n${varsBlock}?>\n` + result;
28
+ }
29
+ return result;
30
+ }
31
+ //# sourceMappingURL=php-native-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php-native-adapter.js","sourceRoot":"","sources":["../src/php-native-adapter.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,IAAyB;IAEzB,IAAI,MAAM,GAAG,UAAU,CAAC;IAExB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEzC,8DAA8D;IAC9D,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,IAAI,2EAA2E,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7F,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,+EAA+E,EAC/E,GAAG,SAAS,IAAI,CACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,UAAU,SAAS,MAAM,GAAG,MAAM,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface SitemapRouteEntry {
2
+ pattern: string;
3
+ isPrivate: boolean;
4
+ lastmod?: string;
5
+ changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';
6
+ priority?: number;
7
+ }
8
+ export declare function buildSitemapXml(routes: ReadonlyArray<SitemapRouteEntry>, siteUrl: string): string;
9
+ export declare function buildNextJsAppSitemap(routes: ReadonlyArray<SitemapRouteEntry>, siteUrl: string): string;
10
+ //# sourceMappingURL=sitemap-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap-builder.d.ts","sourceRoot":"","sources":["../src/sitemap-builder.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACxC,OAAO,EAAE,MAAM,GACd,MAAM,CAoBR;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACxC,OAAO,EAAE,MAAM,GACd,MAAM,CAmBR"}