@jjlmoya/utils-health 1.12.0 → 1.13.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/package.json +1 -1
- package/src/pages/[locale]/[slug].astro +28 -12
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tool/binauralTuner/bibliography.ts +8 -0
- package/src/tool/binauralTuner/i18n/de.ts +2 -10
- package/src/tool/binauralTuner/i18n/en.ts +2 -10
- package/src/tool/binauralTuner/i18n/es.ts +2 -10
- package/src/tool/binauralTuner/i18n/fr.ts +2 -10
- package/src/tool/binauralTuner/i18n/id.ts +2 -10
- package/src/tool/binauralTuner/i18n/it.ts +2 -10
- package/src/tool/binauralTuner/i18n/ja.ts +2 -10
- package/src/tool/binauralTuner/i18n/ko.ts +2 -10
- package/src/tool/binauralTuner/i18n/nl.ts +2 -10
- package/src/tool/binauralTuner/i18n/pl.ts +2 -10
- package/src/tool/binauralTuner/i18n/pt.ts +2 -10
- package/src/tool/binauralTuner/i18n/ru.ts +2 -10
- package/src/tool/binauralTuner/i18n/sv.ts +2 -10
- package/src/tool/binauralTuner/i18n/tr.ts +2 -10
- package/src/tool/binauralTuner/i18n/zh.ts +2 -10
- package/src/tool/binauralTuner/seo.astro +2 -1
- package/src/tool/bloodUnitConverter/bibliography.ts +12 -0
- package/src/tool/bloodUnitConverter/i18n/de.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/en.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/es.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/fr.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/id.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/it.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/ja.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/ko.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/nl.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/pl.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/pt.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/ru.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/sv.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/tr.ts +2 -14
- package/src/tool/bloodUnitConverter/i18n/zh.ts +2 -14
- package/src/tool/bloodUnitConverter/seo.astro +2 -1
- package/src/tool/bmiCalculator/bibliography.ts +12 -0
- package/src/tool/bmiCalculator/i18n/de.ts +2 -14
- package/src/tool/bmiCalculator/i18n/en.ts +2 -14
- package/src/tool/bmiCalculator/i18n/es.ts +2 -14
- package/src/tool/bmiCalculator/i18n/fr.ts +2 -14
- package/src/tool/bmiCalculator/i18n/id.ts +2 -14
- package/src/tool/bmiCalculator/i18n/it.ts +2 -14
- package/src/tool/bmiCalculator/i18n/ja.ts +2 -14
- package/src/tool/bmiCalculator/i18n/ko.ts +2 -14
- package/src/tool/bmiCalculator/i18n/nl.ts +2 -14
- package/src/tool/bmiCalculator/i18n/pl.ts +2 -14
- package/src/tool/bmiCalculator/i18n/pt.ts +2 -14
- package/src/tool/bmiCalculator/i18n/ru.ts +2 -14
- package/src/tool/bmiCalculator/i18n/sv.ts +2 -14
- package/src/tool/bmiCalculator/i18n/tr.ts +2 -14
- package/src/tool/bmiCalculator/i18n/zh.ts +2 -14
- package/src/tool/bmiCalculator/seo.astro +2 -1
- package/src/tool/breathingVisualizer/bibliography.ts +20 -0
- package/src/tool/breathingVisualizer/i18n/de.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/en.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/es.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/fr.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/id.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/it.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/ja.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/ko.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/nl.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/pl.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/pt.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/ru.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/sv.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/tr.ts +2 -22
- package/src/tool/breathingVisualizer/i18n/zh.ts +2 -22
- package/src/tool/breathingVisualizer/seo.astro +2 -1
- package/src/tool/caffeineTracker/bibliography.ts +12 -0
- package/src/tool/caffeineTracker/i18n/de.ts +2 -18
- package/src/tool/caffeineTracker/i18n/en.ts +2 -18
- package/src/tool/caffeineTracker/i18n/es.ts +2 -18
- package/src/tool/caffeineTracker/i18n/fr.ts +2 -18
- package/src/tool/caffeineTracker/i18n/id.ts +2 -18
- package/src/tool/caffeineTracker/i18n/it.ts +2 -18
- package/src/tool/caffeineTracker/i18n/ja.ts +2 -18
- package/src/tool/caffeineTracker/i18n/ko.ts +2 -18
- package/src/tool/caffeineTracker/i18n/nl.ts +2 -18
- package/src/tool/caffeineTracker/i18n/pl.ts +2 -18
- package/src/tool/caffeineTracker/i18n/pt.ts +2 -18
- package/src/tool/caffeineTracker/i18n/ru.ts +2 -18
- package/src/tool/caffeineTracker/i18n/sv.ts +2 -18
- package/src/tool/caffeineTracker/i18n/tr.ts +2 -18
- package/src/tool/caffeineTracker/i18n/zh.ts +2 -18
- package/src/tool/caffeineTracker/seo.astro +2 -1
- package/src/tool/daltonismSimulator/bibliography.ts +20 -0
- package/src/tool/daltonismSimulator/i18n/de.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/en.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/es.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/fr.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/id.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/it.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/ja.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/ko.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/nl.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/pl.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/pt.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/ru.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/sv.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/tr.ts +2 -18
- package/src/tool/daltonismSimulator/i18n/zh.ts +2 -18
- package/src/tool/daltonismSimulator/seo.astro +2 -1
- package/src/tool/digestionStopwatch/bibliography.ts +16 -0
- package/src/tool/digestionStopwatch/i18n/de.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/en.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/es.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/fr.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/id.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/it.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/ja.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/ko.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/nl.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/pl.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/pt.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/ru.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/sv.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/tr.ts +2 -14
- package/src/tool/digestionStopwatch/i18n/zh.ts +2 -14
- package/src/tool/digestionStopwatch/seo.astro +2 -1
- package/src/tool/epworthSleepinessScale/bibliography.ts +12 -0
- package/src/tool/epworthSleepinessScale/i18n/de.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/en.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/es.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/fr.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/id.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/it.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/ja.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/ko.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/nl.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/pl.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/pt.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/ru.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/sv.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/tr.ts +2 -10
- package/src/tool/epworthSleepinessScale/i18n/zh.ts +2 -10
- package/src/tool/epworthSleepinessScale/seo.astro +2 -1
- package/src/tool/hydrationCalculator/bibliography.ts +16 -0
- package/src/tool/hydrationCalculator/i18n/de.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/en.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/es.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/fr.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/id.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/it.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/ja.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/ko.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/nl.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/pl.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/pt.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/ru.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/sv.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/tr.ts +2 -14
- package/src/tool/hydrationCalculator/i18n/zh.ts +2 -14
- package/src/tool/hydrationCalculator/seo.astro +2 -1
- package/src/tool/pelliRobsonTest/bibliography.ts +12 -0
- package/src/tool/pelliRobsonTest/i18n/de.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/en.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/es.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/fr.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/id.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/it.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/ja.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/ko.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/nl.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/pl.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/pt.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/ru.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/sv.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/tr.ts +2 -10
- package/src/tool/pelliRobsonTest/i18n/zh.ts +2 -10
- package/src/tool/pelliRobsonTest/seo.astro +2 -1
- package/src/tool/peripheralVisionTrainer/bibliography.ts +12 -0
- package/src/tool/peripheralVisionTrainer/i18n/de.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/en.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/es.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/fr.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/id.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/it.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/ja.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/ko.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/nl.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/pl.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/pt.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/ru.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/sv.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/tr.ts +2 -10
- package/src/tool/peripheralVisionTrainer/i18n/zh.ts +2 -10
- package/src/tool/peripheralVisionTrainer/seo.astro +2 -1
- package/src/tool/readingDistanceCalculator/bibliography.ts +16 -0
- package/src/tool/readingDistanceCalculator/i18n/de.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/en.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/es.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/fr.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/id.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/it.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/ja.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/ko.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/nl.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/pl.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/pt.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/ru.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/sv.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/tr.ts +2 -14
- package/src/tool/readingDistanceCalculator/i18n/zh.ts +2 -14
- package/src/tool/readingDistanceCalculator/seo.astro +2 -1
- package/src/tool/screenDecompressionTime/bibliography.ts +12 -0
- package/src/tool/screenDecompressionTime/i18n/de.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/en.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/es.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/fr.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/id.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/it.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/ja.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/ko.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/nl.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/pl.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/pt.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/ru.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/sv.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/tr.ts +2 -14
- package/src/tool/screenDecompressionTime/i18n/zh.ts +2 -14
- package/src/tool/screenDecompressionTime/seo.astro +2 -1
- package/src/tool/tinnitusReliever/bibliography.ts +16 -0
- package/src/tool/tinnitusReliever/i18n/de.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/en.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/es.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/fr.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/id.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/it.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/ja.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/ko.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/nl.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/pl.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/pt.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/ru.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/sv.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/tr.ts +2 -14
- package/src/tool/tinnitusReliever/i18n/zh.ts +2 -14
- package/src/tool/tinnitusReliever/seo.astro +2 -1
- package/src/tool/ubeCalculator/bibliography.ts +12 -0
- package/src/tool/ubeCalculator/i18n/de.ts +2 -10
- package/src/tool/ubeCalculator/i18n/en.ts +2 -10
- package/src/tool/ubeCalculator/i18n/es.ts +2 -10
- package/src/tool/ubeCalculator/i18n/fr.ts +2 -10
- package/src/tool/ubeCalculator/i18n/id.ts +2 -10
- package/src/tool/ubeCalculator/i18n/it.ts +2 -10
- package/src/tool/ubeCalculator/i18n/ja.ts +2 -10
- package/src/tool/ubeCalculator/i18n/ko.ts +2 -10
- package/src/tool/ubeCalculator/i18n/nl.ts +2 -10
- package/src/tool/ubeCalculator/i18n/pl.ts +2 -10
- package/src/tool/ubeCalculator/i18n/pt.ts +2 -10
- package/src/tool/ubeCalculator/i18n/ru.ts +2 -10
- package/src/tool/ubeCalculator/i18n/sv.ts +2 -10
- package/src/tool/ubeCalculator/i18n/tr.ts +2 -10
- package/src/tool/ubeCalculator/i18n/zh.ts +2 -10
- package/src/tool/ubeCalculator/seo.astro +2 -1
- package/src/tool/waterPurifier/bibliography.ts +16 -0
- package/src/tool/waterPurifier/i18n/de.ts +2 -14
- package/src/tool/waterPurifier/i18n/en.ts +2 -14
- package/src/tool/waterPurifier/i18n/es.ts +2 -14
- package/src/tool/waterPurifier/i18n/fr.ts +2 -14
- package/src/tool/waterPurifier/i18n/id.ts +2 -14
- package/src/tool/waterPurifier/i18n/it.ts +2 -14
- package/src/tool/waterPurifier/i18n/ja.ts +2 -14
- package/src/tool/waterPurifier/i18n/ko.ts +2 -14
- package/src/tool/waterPurifier/i18n/nl.ts +2 -14
- package/src/tool/waterPurifier/i18n/pl.ts +2 -14
- package/src/tool/waterPurifier/i18n/pt.ts +2 -14
- package/src/tool/waterPurifier/i18n/ru.ts +2 -14
- package/src/tool/waterPurifier/i18n/sv.ts +2 -14
- package/src/tool/waterPurifier/i18n/tr.ts +2 -14
- package/src/tool/waterPurifier/i18n/zh.ts +2 -14
- package/src/tool/waterPurifier/seo.astro +2 -1
package/package.json
CHANGED
|
@@ -34,18 +34,28 @@ export async function getStaticPaths() {
|
|
|
34
34
|
]),
|
|
35
35
|
) as Partial<Record<KnownLocale, string>>;
|
|
36
36
|
|
|
37
|
+
const firstLoader = entry.i18n.en ?? Object.values(entry.i18n)[0];
|
|
38
|
+
const englishSlug = firstLoader ? (await firstLoader()).slug : entry.id;
|
|
39
|
+
|
|
37
40
|
for (const { locale, content } of localeContents) {
|
|
38
|
-
const allToolsNav =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
const allToolsNav = (
|
|
42
|
+
await Promise.all(
|
|
43
|
+
ALL_TOOLS.map(async ({ entry: navEntry }) => {
|
|
44
|
+
const loader = navEntry.i18n[locale] ?? navEntry.i18n.en;
|
|
45
|
+
if (!loader) return null;
|
|
46
|
+
const navContent = await loader();
|
|
47
|
+
return {
|
|
48
|
+
id: navEntry.id,
|
|
49
|
+
title: navContent.title,
|
|
50
|
+
href: `/${locale}/${navContent.slug}`,
|
|
51
|
+
isActive: navEntry.id === entry.id,
|
|
52
|
+
};
|
|
53
|
+
}),
|
|
54
|
+
)
|
|
55
|
+
).filter(Boolean) as NavItem[];
|
|
46
56
|
paths.push({
|
|
47
57
|
params: { locale, slug: content.slug },
|
|
48
|
-
props: { Component, locale, content, localeUrls, allToolsNav },
|
|
58
|
+
props: { Component, locale, content, localeUrls, allToolsNav, englishSlug },
|
|
49
59
|
});
|
|
50
60
|
}
|
|
51
61
|
}
|
|
@@ -66,11 +76,16 @@ interface Props {
|
|
|
66
76
|
content: ToolLocaleContent;
|
|
67
77
|
localeUrls: Partial<Record<KnownLocale, string>>;
|
|
68
78
|
allToolsNav: NavItem[];
|
|
79
|
+
englishSlug: string;
|
|
69
80
|
}
|
|
70
81
|
|
|
71
|
-
const { Component, locale, content, localeUrls, allToolsNav } = Astro.props;
|
|
82
|
+
const { Component, locale, content, localeUrls, allToolsNav, englishSlug } = Astro.props;
|
|
83
|
+
|
|
84
|
+
const cssFiles = import.meta.glob("../../tool/*/*.css", { query: "?raw", import: "default" });
|
|
85
|
+
const cssKey = Object.keys(cssFiles).find((k) => k.endsWith(`/${englishSlug}.css`));
|
|
86
|
+
const toolCss = cssKey ? await cssFiles[cssKey]() as string : "";
|
|
72
87
|
|
|
73
|
-
const seoContent: UtilitySEOContent = { locale, sections: content.seo };
|
|
88
|
+
const seoContent: UtilitySEOContent = { locale, sections: content.seo ?? [] };
|
|
74
89
|
|
|
75
90
|
const words = content.title.split(" ");
|
|
76
91
|
const titleHighlight = words[0] || "";
|
|
@@ -89,8 +104,9 @@ const titleBase = words.slice(1).join(" ") || "";
|
|
|
89
104
|
tools={allToolsNav}
|
|
90
105
|
/>
|
|
91
106
|
<Fragment slot="head">
|
|
107
|
+
{toolCss ? <Fragment set:html={`<style is:inline>${toolCss}</style>`} /> : null}
|
|
92
108
|
{
|
|
93
|
-
content.schemas.map((schema: unknown) => (
|
|
109
|
+
( content.schemas ?? []).map((schema: unknown) => (
|
|
94
110
|
<script
|
|
95
111
|
is:inline
|
|
96
112
|
type="application/ld+json"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../types';
|
|
2
|
+
|
|
3
|
+
export interface ToolExportValidationResult {
|
|
4
|
+
passed: boolean;
|
|
5
|
+
failures: string[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function validateComponentType(
|
|
9
|
+
toolId: string,
|
|
10
|
+
componentName: string,
|
|
11
|
+
component: unknown,
|
|
12
|
+
failures: string[],
|
|
13
|
+
): void {
|
|
14
|
+
if (typeof component !== 'function') {
|
|
15
|
+
failures.push(`${toolId}: ${componentName} is not a function (${typeof component})`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function validateComponentExecution(
|
|
20
|
+
toolId: string,
|
|
21
|
+
componentName: string,
|
|
22
|
+
fn: () => Promise<unknown>,
|
|
23
|
+
failures: string[],
|
|
24
|
+
): Promise<void> {
|
|
25
|
+
try {
|
|
26
|
+
const result = await fn();
|
|
27
|
+
if (!result || typeof result !== 'object') {
|
|
28
|
+
failures.push(`${toolId}: ${componentName} import returned invalid result`);
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
failures.push(`${toolId}: ${componentName} execution error - ${error instanceof Error ? error.message : 'unknown'}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function validateToolExports(tools: ToolDefinition[]): Promise<ToolExportValidationResult> {
|
|
36
|
+
const failures: string[] = [];
|
|
37
|
+
|
|
38
|
+
for (const tool of tools) {
|
|
39
|
+
validateComponentType(tool.entry.id, 'Component', tool.Component, failures);
|
|
40
|
+
validateComponentType(tool.entry.id, 'SEOComponent', tool.SEOComponent, failures);
|
|
41
|
+
validateComponentType(tool.entry.id, 'BibliographyComponent', tool.BibliographyComponent, failures);
|
|
42
|
+
|
|
43
|
+
const componentFn = tool.Component as () => Promise<unknown>;
|
|
44
|
+
const seoFn = tool.SEOComponent as () => Promise<unknown>;
|
|
45
|
+
const bibFn = tool.BibliographyComponent as () => Promise<unknown>;
|
|
46
|
+
|
|
47
|
+
await validateComponentExecution(tool.entry.id, 'Component', componentFn, failures);
|
|
48
|
+
await validateComponentExecution(tool.entry.id, 'SEOComponent', seoFn, failures);
|
|
49
|
+
await validateComponentExecution(tool.entry.id, 'BibliographyComponent', bibFn, failures);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
passed: failures.length === 0,
|
|
54
|
+
failures,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ALL_TOOLS } from '../tools';
|
|
3
|
+
import { validateToolExports } from './shared-test-helpers';
|
|
4
|
+
|
|
5
|
+
describe('Tool Exports Pattern Validation', () => {
|
|
6
|
+
describe('Component Exports Format', () => {
|
|
7
|
+
ALL_TOOLS.forEach((tool) => {
|
|
8
|
+
it(`${tool.entry.id}: Component should be a lazy-loaded function`, () => {
|
|
9
|
+
expect(typeof tool.Component).toBe('function');
|
|
10
|
+
expect(tool.Component).toBeInstanceOf(Function);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it(`${tool.entry.id}: SEOComponent should be a lazy-loaded function`, () => {
|
|
14
|
+
expect(typeof tool.SEOComponent).toBe('function');
|
|
15
|
+
expect(tool.SEOComponent).toBeInstanceOf(Function);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it(`${tool.entry.id}: BibliographyComponent should be a lazy-loaded function`, () => {
|
|
19
|
+
expect(typeof tool.BibliographyComponent).toBe('function');
|
|
20
|
+
expect(tool.BibliographyComponent).toBeInstanceOf(Function);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('Dynamic Import Validation', () => {
|
|
26
|
+
it('all tools must have functional dynamic imports', async () => {
|
|
27
|
+
const result = await validateToolExports(ALL_TOOLS);
|
|
28
|
+
if (!result.passed) {
|
|
29
|
+
throw new Error(`Tool export validation failed:\n${result.failures.join('\n')}`);
|
|
30
|
+
}
|
|
31
|
+
expect(result.passed).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: 'Research on Binaural Beats and Sleep Quality - Oxford Academic',
|
|
6
|
+
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
7
|
+
},
|
|
8
|
+
];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Häufig gestellte Fragen zu Binaural-Beats',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Referenzen und empfohlene Lektüre',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Studie zu Binaural-Beats und Schlafqualität - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Frequently asked questions about binaural beats',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'References and recommended reading',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Research on Binaural Beats and Sleep Quality - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Preguntas frecuentes sobre ondas binaurales',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Referencias y lecturas recomendadas',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploración de los sueños lúcidos',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Research on Binaural Beats and Sleep Quality - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Questions fréquentes sur les battements binauraux',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Références et lectures recommandées',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: "Explorer le monde des rêves lucides",
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Research on Binaural Beats and Sleep Quality - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Pertanyaan yang sering diajukan tentang binaural beats',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Referensi dan bacaan yang disarankan',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Penelitian tentang Binaural Beats dan Kualitas Tidur - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Domande frequenti sui battiti binaurali',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Riferimenti e letture consigliate',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Ricerca sui Battiti Binaurali e la Qualità del Sonno - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'バイノーラルビートに関するよくある質問',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: '参考文献および推奨書籍',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: '明晰夢の世界へ(Exploring the World of Lucid Dreaming)',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'バイノーラルビートと睡眠の質に関する研究 - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: '바이노럴 비트에 관한 자주 묻는 질문',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: '참고 문헌 및 추천 도서',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming (명석몽의 세계)',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: '바이노럴 비트와 수면의 질 연구 - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Veelgestelde vragen over binaural beats',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Referenties en aanbevolen literatuur',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Onderzoek naar Binaural Beats en Slaapkwaliteit - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Często zadawane pytania o dudnienia różnicowe',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Bibliografia i zalecana lektura',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Badania nad dudnieniami różnicowymi i jakością snu - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Perguntas frequentes sobre batidas binaurais',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Referências e leituras recomendadas',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Investigação sobre Batidas Binaurais e Qualidade do Sono - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Часто задаваемые вопросы о бинауральных ритмах',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Источники и рекомендуемая литература',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming (Исследование мира осознанных сновидений)',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Исследование бинауральных ритмов и качества сна - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Vanliga frågor om binaurala beats',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Referenser och rekommenderad läsning',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Forskning om binaurala beats och sömnkvalitet - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: 'Binaural vuruşlar hakkında sıkça sorulan sorular',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: 'Referanslar ve önerilen okumalar',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: 'Exploring the World of Lucid Dreaming',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: 'Binaural Vuruşlar ve Uyku Kalitesi Üzerine Araştırma - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BinauralTunerUI } from '../ui';
|
|
@@ -99,16 +100,7 @@ export const content: ToolLocaleContent<BinauralTunerUI> = {
|
|
|
99
100
|
faqTitle: '关于双耳节拍的常见问题',
|
|
100
101
|
faq: faqData,
|
|
101
102
|
bibliographyTitle: '参考资料和推荐阅读',
|
|
102
|
-
bibliography
|
|
103
|
-
{
|
|
104
|
-
name: '探索明晰梦的世界(Exploring the World of Lucid Dreaming)',
|
|
105
|
-
url: 'https://amzn.to/4unHXWZ',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: '双耳节拍与睡眠质量研究 - Oxford Academic',
|
|
109
|
-
url: 'https://academic.oup.com/sleep/article/47/10/zsae097/7647043',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
103
|
+
bibliography,
|
|
112
104
|
howTo: howToData,
|
|
113
105
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
106
|
ui: {
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await binauralTuner.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: 'IFCC Scientific Division — Biochemical conversion factors',
|
|
6
|
+
url: 'https://www.ifcc.org/',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: 'Health New Zealand — Understanding your complete blood count results',
|
|
10
|
+
url: 'https://www.healthnz.govt.nz/health-topics/tests-and-treatments/medical-tests-and-procedures/laboratory-tests/understanding-your-complete-blood-count-results',
|
|
11
|
+
}
|
|
12
|
+
];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BloodUnitConverterUI } from '../ui';
|
|
@@ -94,20 +95,7 @@ export const content: ToolLocaleContent<BloodUnitConverterUI> = {
|
|
|
94
95
|
faqTitle: 'Häufig gestellte Fragen zur Umrechnung von Bluttest-Einheiten',
|
|
95
96
|
faq: faqData,
|
|
96
97
|
bibliographyTitle: 'Wissenschaftliche Referenzen',
|
|
97
|
-
bibliography
|
|
98
|
-
{
|
|
99
|
-
name: 'IFCC Scientific Division — Biochemical conversion factors',
|
|
100
|
-
url: 'https://www.ifcc.org/',
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
name: 'Mayo Clinic — Blood test interpretation',
|
|
104
|
-
url: 'https://www.mayoclinic.org/',
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: 'Weltgesundheitsorganisation — Diabetes diagnostic criteria',
|
|
108
|
-
url: 'https://www.who.int/',
|
|
109
|
-
},
|
|
110
|
-
],
|
|
98
|
+
bibliography,
|
|
111
99
|
howTo: howToData,
|
|
112
100
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
113
101
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BloodUnitConverterUI } from '../ui';
|
|
@@ -94,20 +95,7 @@ export const content: ToolLocaleContent<BloodUnitConverterUI> = {
|
|
|
94
95
|
faqTitle: 'Frequently asked questions about blood test unit conversion',
|
|
95
96
|
faq: faqData,
|
|
96
97
|
bibliographyTitle: 'Scientific references',
|
|
97
|
-
bibliography
|
|
98
|
-
{
|
|
99
|
-
name: 'IFCC Scientific Division — Biochemical conversion factors',
|
|
100
|
-
url: 'https://www.ifcc.org/',
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
name: 'Mayo Clinic — Blood test interpretation',
|
|
104
|
-
url: 'https://www.mayoclinic.org/',
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: 'World Health Organization — Diabetes diagnostic criteria',
|
|
108
|
-
url: 'https://www.who.int/',
|
|
109
|
-
},
|
|
110
|
-
],
|
|
98
|
+
bibliography,
|
|
111
99
|
howTo: howToData,
|
|
112
100
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
113
101
|
ui: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowToThing } from 'schema-dts';
|
|
2
3
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
4
|
import type { BloodUnitConverterUI } from '../ui';
|
|
@@ -94,20 +95,7 @@ export const content: ToolLocaleContent<BloodUnitConverterUI> = {
|
|
|
94
95
|
faqTitle: 'Preguntas frecuentes sobre la conversión de unidades analíticas',
|
|
95
96
|
faq: faqData,
|
|
96
97
|
bibliographyTitle: 'Referencias científicas',
|
|
97
|
-
bibliography
|
|
98
|
-
{
|
|
99
|
-
name: 'IFCC Scientific Division — Factores de conversión bioquímica',
|
|
100
|
-
url: 'https://www.ifcc.org/',
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
name: 'Mayo Clinic — Interpretación de análisis de sangre',
|
|
104
|
-
url: 'https://www.mayoclinic.org/',
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: 'Organización Mundial de la Salud — Criterios diagnósticos de diabetes',
|
|
108
|
-
url: 'https://www.who.int/',
|
|
109
|
-
},
|
|
110
|
-
],
|
|
98
|
+
bibliography,
|
|
111
99
|
howTo: howToData,
|
|
112
100
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
113
101
|
ui: {
|