@jjlmoya/utils-babies 1.14.0 → 1.15.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 +2 -2
- package/src/category/index.ts +3 -0
- package/src/entries.ts +4 -1
- package/src/index.ts +1 -0
- package/src/pages/[locale]/[slug].astro +31 -39
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/baby-budget-planner/baby-budget-planner.css +405 -0
- package/src/tool/baby-budget-planner/bibliography.astro +14 -0
- package/src/tool/baby-budget-planner/bibliography.ts +14 -0
- package/src/tool/baby-budget-planner/component.astro +406 -0
- package/src/tool/baby-budget-planner/entry.ts +77 -0
- package/src/tool/baby-budget-planner/i18n/de.ts +182 -0
- package/src/tool/baby-budget-planner/i18n/en.ts +184 -0
- package/src/tool/baby-budget-planner/i18n/es.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/fr.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/id.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/it.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/ja.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/ko.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/nl.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/pl.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/pt.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/ru.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/sv.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/tr.ts +183 -0
- package/src/tool/baby-budget-planner/i18n/zh.ts +183 -0
- package/src/tool/baby-budget-planner/index.ts +10 -0
- package/src/tool/baby-budget-planner/logic.ts +68 -0
- package/src/tool/baby-budget-planner/seo.astro +15 -0
- package/src/tool/baby-feeding-calculator/bibliography.astro +9 -6
- package/src/tool/baby-feeding-calculator/seo.astro +2 -45
- package/src/tool/baby-percentile-calculator/seo.astro +7 -28
- package/src/tool/baby-size-converter/seo.astro +7 -28
- package/src/tool/fertile-days-estimator/seo.astro +7 -28
- package/src/tool/pregnancy-calculator/seo.astro +7 -28
- package/src/tool/vaccination-calendar/seo.astro +7 -28
- package/src/tools.ts +2 -0
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
import {
|
|
3
|
-
SEOTitle,
|
|
4
|
-
SEOStats,
|
|
5
|
-
SEOTip,
|
|
6
|
-
SEOTable,
|
|
7
|
-
SEOList,
|
|
8
|
-
SEOSummary,
|
|
9
|
-
SEOComparative,
|
|
10
|
-
SEOGlossary,
|
|
11
|
-
SEOArticle,
|
|
12
|
-
} from '@jjlmoya/utils-shared';
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
13
3
|
import { babyFeedingCalculator } from './index';
|
|
14
4
|
import type { KnownLocale } from '../../types';
|
|
15
5
|
|
|
@@ -20,39 +10,6 @@ interface Props {
|
|
|
20
10
|
const { locale = 'es' } = Astro.props;
|
|
21
11
|
const content = await babyFeedingCalculator.i18n[locale]?.();
|
|
22
12
|
if (!content) return null;
|
|
23
|
-
|
|
24
|
-
const { seo } = content;
|
|
25
13
|
---
|
|
26
14
|
|
|
27
|
-
<
|
|
28
|
-
{seo.map((section: any) => {
|
|
29
|
-
switch (section.type) {
|
|
30
|
-
case 'summary':
|
|
31
|
-
return <SEOSummary title={section.title} items={section.items} />;
|
|
32
|
-
case 'title':
|
|
33
|
-
return <SEOTitle title={section.text} level={section.level || 2} />;
|
|
34
|
-
case 'paragraph':
|
|
35
|
-
return <p set:html={section.html} />;
|
|
36
|
-
case 'stats':
|
|
37
|
-
return <SEOStats stats={section.items} columns={section.columns} />;
|
|
38
|
-
case 'tip':
|
|
39
|
-
return <SEOTip><Fragment set:html={section.html} /></SEOTip>;
|
|
40
|
-
case 'table':
|
|
41
|
-
return (
|
|
42
|
-
<SEOTable headers={section.headers}>
|
|
43
|
-
{section.rows.map((row: string[]) => (
|
|
44
|
-
<tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
|
|
45
|
-
))}
|
|
46
|
-
</SEOTable>
|
|
47
|
-
);
|
|
48
|
-
case 'list':
|
|
49
|
-
return <SEOList items={section.items} />;
|
|
50
|
-
case 'comparative':
|
|
51
|
-
return <SEOComparative items={section.items} columns={section.columns} />;
|
|
52
|
-
case 'glossary':
|
|
53
|
-
return <SEOGlossary items={section.items} />;
|
|
54
|
-
default:
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
})}
|
|
58
|
-
</SEOArticle>
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
import {
|
|
3
|
-
SEOTitle, SEOStats, SEOTip, SEOTable,
|
|
4
|
-
SEOList, SEOSummary, SEOComparative, SEOGlossary, SEOArticle,
|
|
5
|
-
} from '@jjlmoya/utils-shared';
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
6
3
|
import { babyPercentileCalculator } from './index';
|
|
7
4
|
import type { KnownLocale } from '../../types';
|
|
8
5
|
|
|
9
|
-
interface Props {
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await babyPercentileCalculator.i18n[locale]?.();
|
|
12
12
|
if (!content) return null;
|
|
13
|
-
const { seo } = content;
|
|
14
13
|
---
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
switch (section.type) {
|
|
18
|
-
case 'summary': return <SEOSummary title={section.title} items={section.items} />;
|
|
19
|
-
case 'title': return <SEOTitle title={section.text} level={section.level || 2} />;
|
|
20
|
-
case 'paragraph': return <p set:html={section.html} />;
|
|
21
|
-
case 'stats': return <SEOStats stats={section.items} columns={section.columns} />;
|
|
22
|
-
case 'tip': return <SEOTip><Fragment set:html={section.html} /></SEOTip>;
|
|
23
|
-
case 'table': return (
|
|
24
|
-
<SEOTable headers={section.headers}>
|
|
25
|
-
{section.rows.map((row: string[]) => (
|
|
26
|
-
<tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
|
|
27
|
-
))}
|
|
28
|
-
</SEOTable>
|
|
29
|
-
);
|
|
30
|
-
case 'list': return <SEOList items={section.items} />;
|
|
31
|
-
case 'comparative': return <SEOComparative items={section.items} columns={section.columns} />;
|
|
32
|
-
case 'glossary': return <SEOGlossary items={section.items} />;
|
|
33
|
-
default: return null;
|
|
34
|
-
}
|
|
35
|
-
})}
|
|
36
|
-
</SEOArticle>
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
import {
|
|
3
|
-
SEOTitle, SEOStats, SEOTip, SEOTable,
|
|
4
|
-
SEOList, SEOSummary, SEOComparative, SEOGlossary, SEOArticle,
|
|
5
|
-
} from '@jjlmoya/utils-shared';
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
6
3
|
import { babySizeConverter } from './index';
|
|
7
4
|
import type { KnownLocale } from '../../types';
|
|
8
5
|
|
|
9
|
-
interface Props {
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await babySizeConverter.i18n[locale]?.();
|
|
12
12
|
if (!content) return null;
|
|
13
|
-
const { seo } = content;
|
|
14
13
|
---
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
switch (section.type) {
|
|
18
|
-
case 'summary': return <SEOSummary title={section.title} items={section.items} />;
|
|
19
|
-
case 'title': return <SEOTitle title={section.text} level={section.level || 2} />;
|
|
20
|
-
case 'paragraph': return <p set:html={section.html} />;
|
|
21
|
-
case 'stats': return <SEOStats stats={section.items} columns={section.columns} />;
|
|
22
|
-
case 'tip': return <SEOTip><Fragment set:html={section.html} /></SEOTip>;
|
|
23
|
-
case 'table': return (
|
|
24
|
-
<SEOTable headers={section.headers}>
|
|
25
|
-
{section.rows.map((row: string[]) => (
|
|
26
|
-
<tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
|
|
27
|
-
))}
|
|
28
|
-
</SEOTable>
|
|
29
|
-
);
|
|
30
|
-
case 'list': return <SEOList items={section.items} />;
|
|
31
|
-
case 'comparative': return <SEOComparative items={section.items} columns={section.columns} />;
|
|
32
|
-
case 'glossary': return <SEOGlossary items={section.items} />;
|
|
33
|
-
default: return null;
|
|
34
|
-
}
|
|
35
|
-
})}
|
|
36
|
-
</SEOArticle>
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
import {
|
|
3
|
-
SEOTitle, SEOStats, SEOTip, SEOTable,
|
|
4
|
-
SEOList, SEOSummary, SEOComparative, SEOGlossary, SEOArticle,
|
|
5
|
-
} from '@jjlmoya/utils-shared';
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
6
3
|
import { fertileDaysEstimator } from './index';
|
|
7
4
|
import type { KnownLocale } from '../../types';
|
|
8
5
|
|
|
9
|
-
interface Props {
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await fertileDaysEstimator.i18n[locale]?.();
|
|
12
12
|
if (!content) return null;
|
|
13
|
-
const { seo } = content;
|
|
14
13
|
---
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
switch (section.type) {
|
|
18
|
-
case 'summary': return <SEOSummary title={section.title} items={section.items} />;
|
|
19
|
-
case 'title': return <SEOTitle title={section.text} level={section.level || 2} />;
|
|
20
|
-
case 'paragraph': return <p set:html={section.html} />;
|
|
21
|
-
case 'stats': return <SEOStats stats={section.items} columns={section.columns} />;
|
|
22
|
-
case 'tip': return <SEOTip><Fragment set:html={section.html} /></SEOTip>;
|
|
23
|
-
case 'table': return (
|
|
24
|
-
<SEOTable headers={section.headers}>
|
|
25
|
-
{section.rows.map((row: string[]) => (
|
|
26
|
-
<tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
|
|
27
|
-
))}
|
|
28
|
-
</SEOTable>
|
|
29
|
-
);
|
|
30
|
-
case 'list': return <SEOList items={section.items} />;
|
|
31
|
-
case 'comparative': return <SEOComparative items={section.items} columns={section.columns} />;
|
|
32
|
-
case 'glossary': return <SEOGlossary items={section.items} />;
|
|
33
|
-
default: return null;
|
|
34
|
-
}
|
|
35
|
-
})}
|
|
36
|
-
</SEOArticle>
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
import {
|
|
3
|
-
SEOTitle, SEOStats, SEOTip, SEOTable,
|
|
4
|
-
SEOList, SEOSummary, SEOComparative, SEOGlossary, SEOArticle,
|
|
5
|
-
} from '@jjlmoya/utils-shared';
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
6
3
|
import { pregnancyCalculator } from './index';
|
|
7
4
|
import type { KnownLocale } from '../../types';
|
|
8
5
|
|
|
9
|
-
interface Props {
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await pregnancyCalculator.i18n[locale]?.();
|
|
12
12
|
if (!content) return null;
|
|
13
|
-
const { seo } = content;
|
|
14
13
|
---
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
switch (section.type) {
|
|
18
|
-
case 'summary': return <SEOSummary title={section.title} items={section.items} />;
|
|
19
|
-
case 'title': return <SEOTitle title={section.text} level={section.level || 2} />;
|
|
20
|
-
case 'paragraph': return <p set:html={section.html} />;
|
|
21
|
-
case 'stats': return <SEOStats stats={section.items} columns={section.columns} />;
|
|
22
|
-
case 'tip': return <SEOTip><Fragment set:html={section.html} /></SEOTip>;
|
|
23
|
-
case 'table': return (
|
|
24
|
-
<SEOTable headers={section.headers}>
|
|
25
|
-
{section.rows.map((row: string[]) => (
|
|
26
|
-
<tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
|
|
27
|
-
))}
|
|
28
|
-
</SEOTable>
|
|
29
|
-
);
|
|
30
|
-
case 'list': return <SEOList items={section.items} />;
|
|
31
|
-
case 'comparative': return <SEOComparative items={section.items} columns={section.columns} />;
|
|
32
|
-
case 'glossary': return <SEOGlossary items={section.items} />;
|
|
33
|
-
default: return null;
|
|
34
|
-
}
|
|
35
|
-
})}
|
|
36
|
-
</SEOArticle>
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
import {
|
|
3
|
-
SEOTitle, SEOStats, SEOTip, SEOTable,
|
|
4
|
-
SEOList, SEOSummary, SEOComparative, SEOGlossary, SEOArticle,
|
|
5
|
-
} from '@jjlmoya/utils-shared';
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
6
3
|
import { vaccinationCalendar } from './index';
|
|
7
4
|
import type { KnownLocale } from '../../types';
|
|
8
5
|
|
|
9
|
-
interface Props {
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await vaccinationCalendar.i18n[locale]?.();
|
|
12
12
|
if (!content) return null;
|
|
13
|
-
const { seo } = content;
|
|
14
13
|
---
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
switch (section.type) {
|
|
18
|
-
case 'summary': return <SEOSummary title={section.title} items={section.items} />;
|
|
19
|
-
case 'title': return <SEOTitle title={section.text} level={section.level || 2} />;
|
|
20
|
-
case 'paragraph': return <p set:html={section.html} />;
|
|
21
|
-
case 'stats': return <SEOStats stats={section.items} columns={section.columns} />;
|
|
22
|
-
case 'tip': return <SEOTip><Fragment set:html={section.html} /></SEOTip>;
|
|
23
|
-
case 'table': return (
|
|
24
|
-
<SEOTable headers={section.headers}>
|
|
25
|
-
{section.rows.map((row: string[]) => (
|
|
26
|
-
<tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
|
|
27
|
-
))}
|
|
28
|
-
</SEOTable>
|
|
29
|
-
);
|
|
30
|
-
case 'list': return <SEOList items={section.items} />;
|
|
31
|
-
case 'comparative': return <SEOComparative items={section.items} columns={section.columns} />;
|
|
32
|
-
case 'glossary': return <SEOGlossary items={section.items} />;
|
|
33
|
-
default: return null;
|
|
34
|
-
}
|
|
35
|
-
})}
|
|
36
|
-
</SEOArticle>
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
package/src/tools.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { ALL_ENTRIES } from './entries';
|
|
2
2
|
import type { ToolDefinition } from './types';
|
|
3
3
|
import { BABY_FEEDING_CALCULATOR_TOOL } from './tool/baby-feeding-calculator/index';
|
|
4
|
+
import { BABY_BUDGET_PLANNER_TOOL } from './tool/baby-budget-planner/index';
|
|
4
5
|
import { BABY_SIZE_CONVERTER_TOOL } from './tool/baby-size-converter/index';
|
|
5
6
|
import { VACCINATION_CALENDAR_TOOL } from './tool/vaccination-calendar/index';
|
|
6
7
|
import { FERTILE_DAYS_ESTIMATOR_TOOL } from './tool/fertile-days-estimator/index';
|
|
@@ -9,6 +10,7 @@ import { PREGNANCY_CALCULATOR_TOOL } from './tool/pregnancy-calculator/index';
|
|
|
9
10
|
|
|
10
11
|
export const ALL_TOOLS: ToolDefinition[] = [
|
|
11
12
|
BABY_FEEDING_CALCULATOR_TOOL,
|
|
13
|
+
BABY_BUDGET_PLANNER_TOOL,
|
|
12
14
|
BABY_SIZE_CONVERTER_TOOL,
|
|
13
15
|
VACCINATION_CALENDAR_TOOL,
|
|
14
16
|
FERTILE_DAYS_ESTIMATOR_TOOL,
|