kawaijs 0.1.11 → 0.1.13

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 (48) hide show
  1. package/README.md +51 -4
  2. package/dist/commands/build.d.ts +1 -0
  3. package/dist/commands/build.d.ts.map +1 -1
  4. package/dist/commands/build.js +152 -1147
  5. package/dist/commands/build.js.map +1 -1
  6. package/dist/commands/create.d.ts.map +1 -1
  7. package/dist/commands/create.js +132 -55
  8. package/dist/commands/create.js.map +1 -1
  9. package/dist/commands/dev.d.ts +1 -0
  10. package/dist/commands/dev.d.ts.map +1 -1
  11. package/dist/commands/dev.js +301 -1258
  12. package/dist/commands/dev.js.map +1 -1
  13. package/dist/commands/embed.d.ts +25 -0
  14. package/dist/commands/embed.d.ts.map +1 -0
  15. package/dist/commands/embed.js +110 -0
  16. package/dist/commands/embed.js.map +1 -0
  17. package/dist/commands/validate.d.ts.map +1 -1
  18. package/dist/commands/validate.js +104 -6
  19. package/dist/commands/validate.js.map +1 -1
  20. package/dist/config.d.ts +119 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +93 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/i18n.d.ts +8 -0
  25. package/dist/i18n.d.ts.map +1 -0
  26. package/dist/i18n.js +49 -0
  27. package/dist/i18n.js.map +1 -0
  28. package/dist/index.d.ts +7 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +68 -33
  31. package/dist/index.js.map +1 -1
  32. package/dist/parse-args.d.ts +29 -0
  33. package/dist/parse-args.d.ts.map +1 -0
  34. package/dist/parse-args.js +106 -0
  35. package/dist/parse-args.js.map +1 -0
  36. package/dist/pwa.d.ts +22 -0
  37. package/dist/pwa.d.ts.map +1 -0
  38. package/dist/pwa.js +151 -0
  39. package/dist/pwa.js.map +1 -0
  40. package/dist/runtime-bundle.d.ts +3 -0
  41. package/dist/runtime-bundle.d.ts.map +1 -0
  42. package/dist/runtime-bundle.js +76 -0
  43. package/dist/runtime-bundle.js.map +1 -0
  44. package/dist/seo.d.ts +81 -0
  45. package/dist/seo.d.ts.map +1 -0
  46. package/dist/seo.js +534 -0
  47. package/dist/seo.js.map +1 -0
  48. package/package.json +8 -7
package/dist/seo.js ADDED
@@ -0,0 +1,534 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { escapeHtmlAttr } from './parse-args.js';
4
+ const ICON_MIME = {
5
+ '.svg': 'image/svg+xml',
6
+ '.png': 'image/png',
7
+ '.ico': 'image/x-icon',
8
+ '.jpg': 'image/jpeg',
9
+ '.jpeg': 'image/jpeg',
10
+ '.webp': 'image/webp'
11
+ };
12
+ function mimeForExt(ext) {
13
+ return ICON_MIME[ext.toLowerCase()] ?? 'application/octet-stream';
14
+ }
15
+ /**
16
+ * Resolve a project-relative asset path against common locations.
17
+ */
18
+ export function resolveProjectAssetPath(rootDir, relativePath) {
19
+ const clean = relativePath.replace(/^[./\\]+/, '').replace(/\\/g, '/');
20
+ if (!clean || clean.includes('..'))
21
+ return null;
22
+ const candidates = [
23
+ path.join(rootDir, clean),
24
+ path.join(rootDir, 'game', clean),
25
+ path.join(rootDir, 'game', 'assets', clean),
26
+ path.join(rootDir, 'assets', clean)
27
+ ];
28
+ for (const c of candidates) {
29
+ if (fs.existsSync(c) && fs.statSync(c).isFile()) {
30
+ return c;
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ const AUTO_FAVICON_NAMES = [
36
+ 'favicon.svg',
37
+ 'favicon.png',
38
+ 'favicon.ico',
39
+ 'icon.svg',
40
+ 'icon.png',
41
+ 'apple-touch-icon.png'
42
+ ];
43
+ /**
44
+ * Find a user-provided favicon/icon for the project.
45
+ * Prefers `seo.favicon`, then common filenames under game/ / assets/.
46
+ */
47
+ export function resolveFavicon(rootDir, config) {
48
+ const configured = config.seo?.favicon?.trim();
49
+ if (configured) {
50
+ const abs = resolveProjectAssetPath(rootDir, configured);
51
+ if (abs) {
52
+ const ext = path.extname(abs).toLowerCase() || '.png';
53
+ const outFileName = `favicon${ext === '.jpeg' ? '.jpg' : ext}`;
54
+ return {
55
+ absolutePath: abs,
56
+ href: `./${outFileName}`,
57
+ mimeType: mimeForExt(ext),
58
+ outFileName,
59
+ isGenerated: false
60
+ };
61
+ }
62
+ }
63
+ for (const name of AUTO_FAVICON_NAMES) {
64
+ const abs = resolveProjectAssetPath(rootDir, name);
65
+ if (abs) {
66
+ const ext = path.extname(abs).toLowerCase() || '.png';
67
+ const outFileName = name.startsWith('apple-touch') ? name : `favicon${ext}`;
68
+ return {
69
+ absolutePath: abs,
70
+ href: `./${outFileName}`,
71
+ mimeType: mimeForExt(ext),
72
+ outFileName,
73
+ isGenerated: false
74
+ };
75
+ }
76
+ }
77
+ return {
78
+ href: './icon.svg',
79
+ mimeType: 'image/svg+xml',
80
+ outFileName: 'icon.svg',
81
+ isGenerated: true
82
+ };
83
+ }
84
+ export function resolveAppleTouchIcon(rootDir, config, favicon) {
85
+ const configured = config.seo?.appleTouchIcon?.trim();
86
+ if (configured) {
87
+ const abs = resolveProjectAssetPath(rootDir, configured);
88
+ if (abs) {
89
+ const ext = path.extname(abs).toLowerCase() || '.png';
90
+ const outFileName = `apple-touch-icon${ext === '.svg' ? '.svg' : '.png'}`;
91
+ return {
92
+ absolutePath: abs,
93
+ href: `./${outFileName}`,
94
+ mimeType: mimeForExt(ext),
95
+ outFileName,
96
+ isGenerated: false
97
+ };
98
+ }
99
+ }
100
+ // Prefer a dedicated apple-touch file if present
101
+ for (const name of ['apple-touch-icon.png', 'apple-touch-icon.svg']) {
102
+ const abs = resolveProjectAssetPath(rootDir, name);
103
+ if (abs) {
104
+ return {
105
+ absolutePath: abs,
106
+ href: `./${path.basename(abs)}`,
107
+ mimeType: mimeForExt(path.extname(abs)),
108
+ outFileName: path.basename(abs),
109
+ isGenerated: false
110
+ };
111
+ }
112
+ }
113
+ return favicon;
114
+ }
115
+ /**
116
+ * Full SEO + social + favicon <head> fragment for CLI HTML shells.
117
+ */
118
+ export function renderSeoHeadTags(input) {
119
+ const { config, favicon, appleTouchIcon } = input;
120
+ const title = config.title || 'Kawaijs Visual Novel';
121
+ const description = config.seo?.description ||
122
+ config.share?.description ||
123
+ `Play ${title} in your browser.`;
124
+ const siteName = config.share?.siteName || title;
125
+ const author = config.author;
126
+ const locale = config.seo?.locale || 'en_US';
127
+ const lang = locale.split('_')[0] || 'en';
128
+ const robots = config.seo?.robots || 'index,follow';
129
+ const themeColor = config.seo?.themeColor || config.pwa?.themeColor || config.theme?.primaryColor || '#f43f5e';
130
+ const twitterCard = config.share?.twitterCard || 'summary_large_image';
131
+ const canonical = config.seo?.canonicalUrl || input.pageUrl;
132
+ const imageRaw = config.share?.defaultImage;
133
+ const image = imageRaw
134
+ ? imageRaw.startsWith('http') || imageRaw.startsWith('./') || imageRaw.startsWith('/')
135
+ ? imageRaw
136
+ : `./assets/${imageRaw.replace(/^assets\//, '')}`
137
+ : undefined;
138
+ const keywords = config.seo?.keywords;
139
+ const keywordsStr = Array.isArray(keywords)
140
+ ? keywords.filter(Boolean).join(', ')
141
+ : typeof keywords === 'string'
142
+ ? keywords
143
+ : '';
144
+ const lines = [
145
+ `<meta name="description" content="${escapeHtmlAttr(description)}">`,
146
+ `<meta name="robots" content="${escapeHtmlAttr(robots)}">`,
147
+ `<meta name="theme-color" content="${escapeHtmlAttr(themeColor)}">`
148
+ ];
149
+ if (author) {
150
+ lines.push(`<meta name="author" content="${escapeHtmlAttr(author)}">`);
151
+ }
152
+ if (keywordsStr) {
153
+ lines.push(`<meta name="keywords" content="${escapeHtmlAttr(keywordsStr)}">`);
154
+ }
155
+ if (canonical) {
156
+ lines.push(`<link rel="canonical" href="${escapeHtmlAttr(canonical)}">`);
157
+ }
158
+ // Open Graph
159
+ lines.push(`<meta property="og:type" content="website">`);
160
+ lines.push(`<meta property="og:locale" content="${escapeHtmlAttr(locale)}">`);
161
+ lines.push(`<meta property="og:title" content="${escapeHtmlAttr(title)}">`);
162
+ lines.push(`<meta property="og:description" content="${escapeHtmlAttr(description)}">`);
163
+ lines.push(`<meta property="og:site_name" content="${escapeHtmlAttr(siteName)}">`);
164
+ if (canonical) {
165
+ lines.push(`<meta property="og:url" content="${escapeHtmlAttr(canonical)}">`);
166
+ }
167
+ if (image) {
168
+ lines.push(`<meta property="og:image" content="${escapeHtmlAttr(image)}">`);
169
+ }
170
+ // Twitter
171
+ lines.push(`<meta name="twitter:card" content="${escapeHtmlAttr(twitterCard)}">`);
172
+ lines.push(`<meta name="twitter:title" content="${escapeHtmlAttr(title)}">`);
173
+ lines.push(`<meta name="twitter:description" content="${escapeHtmlAttr(description)}">`);
174
+ if (image) {
175
+ lines.push(`<meta name="twitter:image" content="${escapeHtmlAttr(image)}">`);
176
+ }
177
+ if (config.seo?.twitterSite) {
178
+ lines.push(`<meta name="twitter:site" content="${escapeHtmlAttr(config.seo.twitterSite)}">`);
179
+ }
180
+ if (config.seo?.twitterCreator) {
181
+ lines.push(`<meta name="twitter:creator" content="${escapeHtmlAttr(config.seo.twitterCreator)}">`);
182
+ }
183
+ if (input.includeIconLinks !== false) {
184
+ lines.push(`<link rel="icon" href="${escapeHtmlAttr(favicon.href)}" type="${escapeHtmlAttr(favicon.mimeType)}">`);
185
+ lines.push(`<link rel="apple-touch-icon" href="${escapeHtmlAttr(appleTouchIcon.href)}">`);
186
+ }
187
+ // JSON-LD (SoftwareApplication + Person + optional FAQPage for AEO/GEO)
188
+ if (config.seo?.jsonLd !== false) {
189
+ const custom = typeof config.seo?.jsonLd === 'object' ? config.seo.jsonLd : null;
190
+ const jsonLd = custom ?? buildDefaultJsonLd({
191
+ title,
192
+ description,
193
+ author,
194
+ canonical,
195
+ image,
196
+ faq: config.seo?.faq,
197
+ sameAs: config.seo?.sameAs
198
+ });
199
+ lines.push(`<script type="application/ld+json">${JSON.stringify(jsonLd).replace(/</g, '\\u003c')}</script>`);
200
+ }
201
+ // Help HTML lang consumers (attribute set separately on <html>)
202
+ void lang;
203
+ return lines.map((l) => ` ${l}`).join('\n');
204
+ }
205
+ export function buildDefaultJsonLd(input) {
206
+ const app = {
207
+ '@type': 'SoftwareApplication',
208
+ name: input.title,
209
+ description: input.description,
210
+ applicationCategory: 'GameApplication',
211
+ applicationSubCategory: 'VisualNovelEngine',
212
+ operatingSystem: 'Any',
213
+ browserRequirements: 'Requires JavaScript',
214
+ offers: {
215
+ '@type': 'Offer',
216
+ price: '0',
217
+ priceCurrency: 'USD'
218
+ }
219
+ };
220
+ if (input.canonical)
221
+ app.url = input.canonical;
222
+ if (input.image)
223
+ app.image = input.image;
224
+ if (input.author) {
225
+ app.author = { '@type': 'Person', name: input.author };
226
+ app.creator = { '@type': 'Person', name: input.author };
227
+ }
228
+ const graph = [app];
229
+ if (input.author) {
230
+ const person = {
231
+ '@type': 'Person',
232
+ name: input.author,
233
+ jobTitle: 'Software Engineer',
234
+ knowsAbout: [
235
+ 'visual novels',
236
+ 'web development',
237
+ 'TypeScript',
238
+ 'Kawaijs',
239
+ 'game engines'
240
+ ]
241
+ };
242
+ if (input.canonical)
243
+ person.url = input.canonical;
244
+ if (input.sameAs && input.sameAs.length > 0)
245
+ person.sameAs = [...input.sameAs];
246
+ graph.push(person);
247
+ }
248
+ if (input.faq && input.faq.length > 0) {
249
+ graph.push({
250
+ '@type': 'FAQPage',
251
+ mainEntity: input.faq.map((item) => ({
252
+ '@type': 'Question',
253
+ name: item.question,
254
+ acceptedAnswer: {
255
+ '@type': 'Answer',
256
+ text: item.answer
257
+ }
258
+ }))
259
+ });
260
+ }
261
+ if (graph.length === 1) {
262
+ return { '@context': 'https://schema.org', ...app };
263
+ }
264
+ return {
265
+ '@context': 'https://schema.org',
266
+ '@graph': graph
267
+ };
268
+ }
269
+ export function resolveHtmlLang(config) {
270
+ const locale = config.seo?.locale || 'en_US';
271
+ return (locale.split(/[_-]/)[0] || 'en').toLowerCase();
272
+ }
273
+ /**
274
+ * Copy user favicon / apple-touch into dist. Returns public hrefs actually written.
275
+ */
276
+ export function writeSeoIconsToDist(outDir, favicon, appleTouchIcon, generatedIconSvg) {
277
+ let faviconHref = favicon.href;
278
+ let appleHref = appleTouchIcon.href;
279
+ let pwaIconFile = 'icon.svg';
280
+ if (favicon.absolutePath && favicon.outFileName) {
281
+ fs.copyFileSync(favicon.absolutePath, path.join(outDir, favicon.outFileName));
282
+ faviconHref = `./${favicon.outFileName}`;
283
+ // Also publish as icon.* for PWA if SVG/PNG
284
+ const ext = path.extname(favicon.outFileName).toLowerCase();
285
+ if (ext === '.svg' || ext === '.png') {
286
+ pwaIconFile = `icon${ext}`;
287
+ fs.copyFileSync(favicon.absolutePath, path.join(outDir, pwaIconFile));
288
+ }
289
+ }
290
+ else if (generatedIconSvg) {
291
+ fs.writeFileSync(path.join(outDir, 'icon.svg'), generatedIconSvg, 'utf-8');
292
+ faviconHref = './icon.svg';
293
+ pwaIconFile = 'icon.svg';
294
+ }
295
+ if (appleTouchIcon.absolutePath &&
296
+ appleTouchIcon.outFileName &&
297
+ appleTouchIcon.absolutePath !== favicon.absolutePath) {
298
+ fs.copyFileSync(appleTouchIcon.absolutePath, path.join(outDir, appleTouchIcon.outFileName));
299
+ appleHref = `./${appleTouchIcon.outFileName}`;
300
+ }
301
+ else if (appleTouchIcon.absolutePath && appleTouchIcon.outFileName) {
302
+ // Same file as favicon — ensure out name exists
303
+ if (!fs.existsSync(path.join(outDir, appleTouchIcon.outFileName))) {
304
+ fs.copyFileSync(appleTouchIcon.absolutePath, path.join(outDir, appleTouchIcon.outFileName));
305
+ }
306
+ appleHref = `./${appleTouchIcon.outFileName}`;
307
+ }
308
+ else {
309
+ appleHref = faviconHref;
310
+ }
311
+ return { faviconHref, appleHref, pwaIconFile };
312
+ }
313
+ /** Normalize a canonical URL to a directory base ending with `/`. */
314
+ export function canonicalBaseUrl(canonicalUrl) {
315
+ try {
316
+ const u = new URL(canonicalUrl);
317
+ if (u.pathname.endsWith('/') || u.pathname === '') {
318
+ return u.href.endsWith('/') ? u.href : `${u.href}/`;
319
+ }
320
+ // File-like path → strip last segment
321
+ const dir = u.pathname.replace(/\/[^/]*$/, '/');
322
+ return `${u.origin}${dir}`;
323
+ }
324
+ catch {
325
+ return null;
326
+ }
327
+ }
328
+ /** Simple robots.txt when a canonical site URL is configured. */
329
+ export function renderRobotsTxt(canonicalUrl) {
330
+ const lines = [
331
+ 'User-agent: *',
332
+ 'Allow: /',
333
+ '',
334
+ '# Google Search Console / crawlers'
335
+ ];
336
+ if (canonicalUrl) {
337
+ const base = canonicalBaseUrl(canonicalUrl);
338
+ if (base) {
339
+ lines.push(`Sitemap: ${base}sitemap.xml`);
340
+ }
341
+ }
342
+ return `${lines.join('\n')}\n`;
343
+ }
344
+ const SITEMAP_SKIP_RE = /(?:^|\/)(?:robots\.txt|sw\.js|manifest\.webmanifest|favicon\.ico|favicon\.svg|icon\.svg)(?:$|\?)/i;
345
+ function resolveSitemapLoc(base, entry) {
346
+ if (typeof entry === 'string') {
347
+ if (!entry)
348
+ return null;
349
+ if (entry.startsWith('http://') || entry.startsWith('https://'))
350
+ return entry;
351
+ return `${base}${entry.replace(/^\//, '')}`;
352
+ }
353
+ if (entry.loc)
354
+ return entry.loc;
355
+ if (entry.path) {
356
+ if (entry.path.startsWith('http://') || entry.path.startsWith('https://'))
357
+ return entry.path;
358
+ return `${base}${entry.path.replace(/^\//, '')}`;
359
+ }
360
+ return null;
361
+ }
362
+ function defaultPriority(loc, home) {
363
+ if (loc === home)
364
+ return 1.0;
365
+ if (/\/showcase\/?$/.test(loc) || /\/playground\/?$/.test(loc))
366
+ return 0.9;
367
+ if (/\?lang=/.test(loc))
368
+ return 0.8;
369
+ if (/\?at=/.test(loc))
370
+ return 0.65;
371
+ if (/llms\.txt$/i.test(loc))
372
+ return 0.4;
373
+ return 0.7;
374
+ }
375
+ function defaultChangefreq(loc, home) {
376
+ if (loc === home || /\/showcase\/?$/.test(loc) || /\/playground\/?$/.test(loc))
377
+ return 'weekly';
378
+ if (/\?at=/.test(loc) || /\?lang=/.test(loc))
379
+ return 'monthly';
380
+ return 'monthly';
381
+ }
382
+ /** sitemap.xml for the built site (+ deep-link paths / extra entries). */
383
+ export function renderSitemapXml(canonicalUrl, extraPaths = []) {
384
+ const baseRaw = canonicalBaseUrl(canonicalUrl) ?? canonicalUrl;
385
+ const base = baseRaw.replace(/\/?$/, '/');
386
+ const home = base;
387
+ const today = new Date().toISOString().slice(0, 10);
388
+ const byLoc = new Map();
389
+ const upsert = (entry) => {
390
+ const loc = resolveSitemapLoc(base, entry);
391
+ if (!loc || SITEMAP_SKIP_RE.test(loc))
392
+ return;
393
+ // Utility / duplicate views — keep out of GSC sitemap
394
+ if (/[?&]embed=/.test(loc))
395
+ return;
396
+ const opts = typeof entry === 'string' ? {} : entry;
397
+ const existing = byLoc.get(loc);
398
+ const alternates = [...(existing?.alternates ?? [])];
399
+ if (opts.alternates) {
400
+ for (const alt of opts.alternates) {
401
+ if (!alternates.some((a) => a.hreflang === alt.hreflang && a.href === alt.href)) {
402
+ alternates.push({ hreflang: alt.hreflang, href: alt.href });
403
+ }
404
+ }
405
+ }
406
+ byLoc.set(loc, {
407
+ loc,
408
+ lastmod: opts.lastmod ?? existing?.lastmod ?? today,
409
+ changefreq: opts.changefreq ?? existing?.changefreq ?? defaultChangefreq(loc, home),
410
+ priority: opts.priority ?? existing?.priority ?? defaultPriority(loc, home),
411
+ alternates
412
+ });
413
+ };
414
+ upsert(home);
415
+ for (const p of extraPaths)
416
+ upsert(p);
417
+ // Stable order: home first, then alpha
418
+ const entries = [...byLoc.values()].sort((a, b) => {
419
+ if (a.loc === home)
420
+ return -1;
421
+ if (b.loc === home)
422
+ return 1;
423
+ return a.loc.localeCompare(b.loc);
424
+ });
425
+ const hasAlternates = entries.some((e) => e.alternates.length > 0);
426
+ const ns = hasAlternates
427
+ ? 'xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"\n xmlns:xhtml="http://www.w3.org/1999/xhtml"'
428
+ : 'xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"';
429
+ const body = entries
430
+ .map((e) => {
431
+ const altLines = e.alternates
432
+ .map((a) => ` <xhtml:link rel="alternate" hreflang="${escapeXml(a.hreflang)}" href="${escapeXml(a.href)}" />`)
433
+ .join('\n');
434
+ return ` <url>
435
+ <loc>${escapeXml(e.loc)}</loc>
436
+ <lastmod>${escapeXml(e.lastmod)}</lastmod>
437
+ <changefreq>${e.changefreq}</changefreq>
438
+ <priority>${e.priority.toFixed(1)}</priority>${altLines ? `\n${altLines}` : ''}
439
+ </url>`;
440
+ })
441
+ .join('\n');
442
+ return `<?xml version="1.0" encoding="UTF-8"?>
443
+ <urlset ${ns}>
444
+ ${body}
445
+ </urlset>
446
+ `;
447
+ }
448
+ function escapeXml(value) {
449
+ return value
450
+ .replace(/&/g, '&amp;')
451
+ .replace(/</g, '&lt;')
452
+ .replace(/>/g, '&gt;')
453
+ .replace(/"/g, '&quot;');
454
+ }
455
+ /** llms.txt — machine-readable summary for AI crawlers (GEO). */
456
+ export function renderLlmsTxt(config) {
457
+ if (typeof config.seo?.llmsTxt === 'string' && config.seo.llmsTxt.trim()) {
458
+ return config.seo.llmsTxt.trimEnd() + '\n';
459
+ }
460
+ const title = config.title || 'Kawaijs Visual Novel';
461
+ const description = config.seo?.aiSummary ||
462
+ config.seo?.description ||
463
+ config.share?.description ||
464
+ `${title} is a browser visual novel.`;
465
+ const author = config.author || 'Unknown';
466
+ const canonical = config.seo?.canonicalUrl;
467
+ const lines = [
468
+ `# ${title}`,
469
+ '',
470
+ `> ${description}`,
471
+ '',
472
+ `Author: ${author}`,
473
+ 'Engine: Kawaijs — web-native visual novel engine (TypeScript, Ren\'Py-inspired scripting).',
474
+ 'License: MIT',
475
+ ''
476
+ ];
477
+ if (canonical) {
478
+ lines.push('## Primary');
479
+ lines.push(`- [${title}](${canonical}): Interactive documentation / playable site`);
480
+ lines.push('');
481
+ }
482
+ lines.push('## Facts');
483
+ lines.push('- Kawaijs runs visual novels entirely in the browser with no backend required.');
484
+ lines.push('- Authors write `.kawa` scripts (indentation-based) and ship a static `dist/` folder.');
485
+ lines.push('- Deploy targets include GitHub Pages, Netlify, Vercel, Cloudflare Pages, and itch.io.');
486
+ lines.push('- Built-in features: save/load, backlog, rollback, PWA, SEO meta, JSON-LD, i18n.');
487
+ lines.push('');
488
+ if (config.seo?.faq && config.seo.faq.length > 0) {
489
+ lines.push('## FAQ');
490
+ for (const item of config.seo.faq) {
491
+ lines.push(`- Q: ${item.question}`);
492
+ lines.push(` A: ${item.answer}`);
493
+ }
494
+ lines.push('');
495
+ }
496
+ if (config.seo?.sameAs && config.seo.sameAs.length > 0) {
497
+ lines.push('## Links');
498
+ for (const url of config.seo.sameAs) {
499
+ lines.push(`- ${url}`);
500
+ }
501
+ lines.push('');
502
+ }
503
+ return lines.join('\n');
504
+ }
505
+ /** Crawlable FAQ / summary for bots when JS is unavailable (AEO). */
506
+ export function renderNoscriptDocs(config) {
507
+ const title = escapeHtmlText(config.title || 'Kawaijs');
508
+ const description = escapeHtmlText(config.seo?.aiSummary || config.seo?.description || config.share?.description || '');
509
+ const author = escapeHtmlText(config.author || '');
510
+ const faq = config.seo?.faq ?? [];
511
+ const faqHtml = faq
512
+ .map((item) => ` <section>
513
+ <h3>${escapeHtmlText(item.question)}</h3>
514
+ <p>${escapeHtmlText(item.answer)}</p>
515
+ </section>`)
516
+ .join('\n');
517
+ return `<noscript>
518
+ <main style="max-width:42rem;margin:2rem auto;padding:1.5rem;font-family:system-ui,sans-serif;line-height:1.55;color:#0f172a;background:#fff">
519
+ <h1>${title}</h1>
520
+ ${author ? `<p><strong>Author:</strong> ${author}</p>` : ''}
521
+ ${description ? `<p>${description}</p>` : ''}
522
+ <p>Enable JavaScript to play this interactive visual-novel documentation. Static answers follow for search and answer engines.</p>
523
+ ${faqHtml ? ` <h2>Frequently asked questions</h2>\n${faqHtml}` : ''}
524
+ </main>
525
+ </noscript>`;
526
+ }
527
+ function escapeHtmlText(value) {
528
+ return value
529
+ .replace(/&/g, '&amp;')
530
+ .replace(/</g, '&lt;')
531
+ .replace(/>/g, '&gt;')
532
+ .replace(/"/g, '&quot;');
533
+ }
534
+ //# sourceMappingURL=seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.js","sourceRoot":"","sources":["../src/seo.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kawaijs",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "Web-native visual novel engine and toolchain inspired by Ren'Py",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -31,12 +31,13 @@
31
31
  "typecheck": "tsc --noEmit"
32
32
  },
33
33
  "dependencies": {
34
- "@kawaijs/ast": "^0.1.11",
35
- "@kawaijs/parser": "^0.1.11",
36
- "@kawaijs/runtime": "^0.1.11",
37
- "@kawaijs/renderer-dom": "^0.1.11",
38
- "@kawaijs/audio": "^0.1.11",
39
- "@kawaijs/vite-plugin": "^0.1.11"
34
+ "@kawaijs/ast": "^0.1.13",
35
+ "@kawaijs/parser": "^0.1.13",
36
+ "@kawaijs/runtime": "^0.1.13",
37
+ "@kawaijs/renderer-dom": "^0.1.13",
38
+ "@kawaijs/audio": "^0.1.13",
39
+ "@kawaijs/vite-plugin": "^0.1.13",
40
+ "esbuild": "^0.28.2"
40
41
  },
41
42
  "keywords": [
42
43
  "kawaijs",