@jjlmoya/utils-tools 1.5.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/i18n/nl.ts +1 -1
- package/src/index.ts +38 -38
- package/src/pages/[locale]/[slug].astro +3 -4
- package/src/tests/category_validation.test.ts +58 -0
- package/src/tool/date-diff-calculator/index.ts +3 -6
- package/src/tool/drive-direct-link/index.ts +3 -6
- package/src/tool/email-list-cleaner/index.ts +3 -6
- package/src/tool/env-badge-spain/index.ts +3 -6
- package/src/tool/morse-beacon/index.ts +3 -6
- package/src/tool/password-generator/index.ts +3 -6
- package/src/tool/routes/index.ts +3 -6
- package/src/tool/rule-of-three/index.ts +3 -6
- package/src/tool/seo-content-optimizer/index.ts +3 -6
- package/src/tool/speed-reader/index.ts +3 -6
- package/src/tool/text-pixel-calculator/index.ts +3 -6
- package/src/tool/whatsapp-link/index.ts +3 -6
- package/src/tools.ts +2 -0
package/package.json
CHANGED
package/src/category/i18n/nl.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CategoryLocaleContent } from '../../types';
|
|
2
2
|
|
|
3
3
|
export const content: CategoryLocaleContent = {
|
|
4
|
-
slug: '
|
|
4
|
+
slug: 'hulpmiddelen',
|
|
5
5
|
title: 'Praktische Online Multi Tools',
|
|
6
6
|
description: 'Los alledaagse problemen op met gratis online tools. Route-optimizers, wachtwoordgenerators, RSVP-snellezen en snelle rekenhulpmiddelen.',
|
|
7
7
|
seo: [
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { toolsCategory } from './category';
|
|
2
|
-
export
|
|
2
|
+
export const toolsCategorySEO = () => import('./category/seo.astro').then((m) => m.default);
|
|
3
3
|
|
|
4
4
|
export type {
|
|
5
5
|
KnownLocale,
|
|
@@ -15,76 +15,76 @@ export type {
|
|
|
15
15
|
ToolDefinition,
|
|
16
16
|
} from './types';
|
|
17
17
|
|
|
18
|
-
export { ALL_TOOLS } from './tools';
|
|
18
|
+
export { ALL_ENTRIES, ALL_TOOLS } from './tools';
|
|
19
19
|
|
|
20
20
|
export { routes, ROUTES_TOOL } from './tool/routes/index';
|
|
21
|
-
export
|
|
22
|
-
export
|
|
23
|
-
export
|
|
21
|
+
export const RoutesComponent = () => import('./tool/routes/component.astro').then((m) => m.default);
|
|
22
|
+
export const RoutesSEO = () => import('./tool/routes/seo.astro').then((m) => m.default);
|
|
23
|
+
export const RoutesBibliography = () => import('./tool/routes/bibliography.astro').then((m) => m.default);
|
|
24
24
|
export type { RoutesUI } from './tool/routes/ui';
|
|
25
25
|
|
|
26
26
|
export { ruleOfThree, RULE_OF_THREE_TOOL } from './tool/rule-of-three/index';
|
|
27
|
-
export
|
|
28
|
-
export
|
|
29
|
-
export
|
|
27
|
+
export const RuleOfThreeComponent = () => import('./tool/rule-of-three/component.astro').then((m) => m.default);
|
|
28
|
+
export const RuleOfThreeSEO = () => import('./tool/rule-of-three/seo.astro').then((m) => m.default);
|
|
29
|
+
export const RuleOfThreeBibliography = () => import('./tool/rule-of-three/bibliography.astro').then((m) => m.default);
|
|
30
30
|
export type { RuleOfThreeUI } from './tool/rule-of-three/ui';
|
|
31
31
|
|
|
32
32
|
export { passwordGenerator, PASSWORD_GENERATOR_TOOL } from './tool/password-generator/index';
|
|
33
|
-
export
|
|
34
|
-
export
|
|
35
|
-
export
|
|
33
|
+
export const PasswordGeneratorComponent = () => import('./tool/password-generator/component.astro').then((m) => m.default);
|
|
34
|
+
export const PasswordGeneratorSEO = () => import('./tool/password-generator/seo.astro').then((m) => m.default);
|
|
35
|
+
export const PasswordGeneratorBibliography = () => import('./tool/password-generator/bibliography.astro').then((m) => m.default);
|
|
36
36
|
export type { PasswordGeneratorUI } from './tool/password-generator/ui';
|
|
37
37
|
|
|
38
38
|
export { morseBeacon, MORSE_BEACON_TOOL } from './tool/morse-beacon/index';
|
|
39
|
-
export
|
|
40
|
-
export
|
|
41
|
-
export
|
|
39
|
+
export const MorseBeaconComponent = () => import('./tool/morse-beacon/component.astro').then((m) => m.default);
|
|
40
|
+
export const MorseBeaconSEO = () => import('./tool/morse-beacon/seo.astro').then((m) => m.default);
|
|
41
|
+
export const MorseBeaconBibliography = () => import('./tool/morse-beacon/bibliography.astro').then((m) => m.default);
|
|
42
42
|
export type { MorseBeaconUI } from './tool/morse-beacon/ui';
|
|
43
43
|
|
|
44
44
|
export { speedReader, SPEED_READER_TOOL } from './tool/speed-reader/index';
|
|
45
|
-
export
|
|
46
|
-
export
|
|
47
|
-
export
|
|
45
|
+
export const SpeedReaderComponent = () => import('./tool/speed-reader/component.astro').then((m) => m.default);
|
|
46
|
+
export const SpeedReaderSEO = () => import('./tool/speed-reader/seo.astro').then((m) => m.default);
|
|
47
|
+
export const SpeedReaderBibliography = () => import('./tool/speed-reader/bibliography.astro').then((m) => m.default);
|
|
48
48
|
export type { SpeedReaderUI } from './tool/speed-reader/ui';
|
|
49
49
|
|
|
50
50
|
export { whatsappLink, WHATSAPP_LINK_TOOL } from './tool/whatsapp-link/index';
|
|
51
|
-
export
|
|
52
|
-
export
|
|
53
|
-
export
|
|
51
|
+
export const WhatsappLinkComponent = () => import('./tool/whatsapp-link/component.astro').then((m) => m.default);
|
|
52
|
+
export const WhatsappLinkSEO = () => import('./tool/whatsapp-link/seo.astro').then((m) => m.default);
|
|
53
|
+
export const WhatsappLinkBibliography = () => import('./tool/whatsapp-link/bibliography.astro').then((m) => m.default);
|
|
54
54
|
export type { WhatsappLinkUI } from './tool/whatsapp-link/ui';
|
|
55
55
|
|
|
56
56
|
export { textPixelCalculator, TEXT_PIXEL_CALCULATOR_TOOL } from './tool/text-pixel-calculator/index';
|
|
57
|
-
export
|
|
58
|
-
export
|
|
59
|
-
export
|
|
57
|
+
export const TextPixelCalculatorComponent = () => import('./tool/text-pixel-calculator/component.astro').then((m) => m.default);
|
|
58
|
+
export const TextPixelCalculatorSEO = () => import('./tool/text-pixel-calculator/seo.astro').then((m) => m.default);
|
|
59
|
+
export const TextPixelCalculatorBibliography = () => import('./tool/text-pixel-calculator/bibliography.astro').then((m) => m.default);
|
|
60
60
|
export type { TextPixelCalculatorUI } from './tool/text-pixel-calculator/ui';
|
|
61
61
|
|
|
62
62
|
export { dateDiffCalculator, DATE_DIFF_CALCULATOR_TOOL } from './tool/date-diff-calculator/index';
|
|
63
|
-
export
|
|
64
|
-
export
|
|
65
|
-
export
|
|
63
|
+
export const DateDiffCalculatorComponent = () => import('./tool/date-diff-calculator/component.astro').then((m) => m.default);
|
|
64
|
+
export const DateDiffCalculatorSEO = () => import('./tool/date-diff-calculator/seo.astro').then((m) => m.default);
|
|
65
|
+
export const DateDiffCalculatorBibliography = () => import('./tool/date-diff-calculator/bibliography.astro').then((m) => m.default);
|
|
66
66
|
export type { DateDiffCalculatorUI } from './tool/date-diff-calculator/ui';
|
|
67
67
|
|
|
68
68
|
export { emailListCleaner, EMAIL_LIST_CLEANER_TOOL } from './tool/email-list-cleaner/index';
|
|
69
|
-
export
|
|
70
|
-
export
|
|
71
|
-
export
|
|
69
|
+
export const EmailListCleanerComponent = () => import('./tool/email-list-cleaner/component.astro').then((m) => m.default);
|
|
70
|
+
export const EmailListCleanerSEO = () => import('./tool/email-list-cleaner/seo.astro').then((m) => m.default);
|
|
71
|
+
export const EmailListCleanerBibliography = () => import('./tool/email-list-cleaner/bibliography.astro').then((m) => m.default);
|
|
72
72
|
export type { EmailListCleanerUI } from './tool/email-list-cleaner/ui';
|
|
73
73
|
|
|
74
74
|
export { envBadgeSpain, ENV_BADGE_SPAIN_TOOL } from './tool/env-badge-spain/index';
|
|
75
|
-
export
|
|
76
|
-
export
|
|
77
|
-
export
|
|
75
|
+
export const EnvBadgeSpainComponent = () => import('./tool/env-badge-spain/component.astro').then((m) => m.default);
|
|
76
|
+
export const EnvBadgeSpainSEO = () => import('./tool/env-badge-spain/seo.astro').then((m) => m.default);
|
|
77
|
+
export const EnvBadgeSpainBibliography = () => import('./tool/env-badge-spain/bibliography.astro').then((m) => m.default);
|
|
78
78
|
export type { EnvBadgeSpainUI } from './tool/env-badge-spain/ui';
|
|
79
79
|
|
|
80
80
|
export { driveDirectLink, DRIVE_DIRECT_LINK_TOOL } from './tool/drive-direct-link/index';
|
|
81
|
-
export
|
|
82
|
-
export
|
|
83
|
-
export
|
|
81
|
+
export const DriveDirectLinkComponent = () => import('./tool/drive-direct-link/component.astro').then((m) => m.default);
|
|
82
|
+
export const DriveDirectLinkSEO = () => import('./tool/drive-direct-link/seo.astro').then((m) => m.default);
|
|
83
|
+
export const DriveDirectLinkBibliography = () => import('./tool/drive-direct-link/bibliography.astro').then((m) => m.default);
|
|
84
84
|
export type { DriveDirectLinkUI } from './tool/drive-direct-link/ui';
|
|
85
85
|
|
|
86
86
|
export { seoContentOptimizer, SEO_CONTENT_OPTIMIZER_TOOL } from './tool/seo-content-optimizer/index';
|
|
87
|
-
export
|
|
88
|
-
export
|
|
89
|
-
export
|
|
87
|
+
export const SeoContentOptimizerComponent = () => import('./tool/seo-content-optimizer/component.astro').then((m) => m.default);
|
|
88
|
+
export const SeoContentOptimizerSEO = () => import('./tool/seo-content-optimizer/seo.astro').then((m) => m.default);
|
|
89
|
+
export const SeoContentOptimizerBibliography = () => import('./tool/seo-content-optimizer/bibliography.astro').then((m) => m.default);
|
|
90
90
|
export type { SeoContentOptimizerUI } from './tool/seo-content-optimizer/ui';
|
|
@@ -14,7 +14,8 @@ import type { UtilitySEOContent } from "@jjlmoya/utils-shared";
|
|
|
14
14
|
export async function getStaticPaths() {
|
|
15
15
|
const paths = [];
|
|
16
16
|
|
|
17
|
-
for (const { entry, Component } of ALL_TOOLS) {
|
|
17
|
+
for (const { entry, Component: lazyComp } of ALL_TOOLS) {
|
|
18
|
+
const { default: Component } = await lazyComp();
|
|
18
19
|
const localeEntries = Object.entries(entry.i18n) as [
|
|
19
20
|
KnownLocale,
|
|
20
21
|
() => Promise<ToolLocaleContent>,
|
|
@@ -52,8 +53,6 @@ export async function getStaticPaths() {
|
|
|
52
53
|
return paths;
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
type ToolComponent = (props: { ui: Record<string, string> }) => unknown;
|
|
56
|
-
|
|
57
56
|
interface NavItem {
|
|
58
57
|
id: string;
|
|
59
58
|
title: string;
|
|
@@ -62,7 +61,7 @@ interface NavItem {
|
|
|
62
61
|
}
|
|
63
62
|
|
|
64
63
|
interface Props {
|
|
65
|
-
Component:
|
|
64
|
+
Component: unknown;
|
|
66
65
|
locale: KnownLocale;
|
|
67
66
|
content: ToolLocaleContent;
|
|
68
67
|
localeUrls: Partial<Record<KnownLocale, string>>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { toolsCategory } from '../category/index';
|
|
3
|
+
import type { CategoryLocaleContent } from '../types';
|
|
4
|
+
|
|
5
|
+
const EXPECTED_LOCALES = [
|
|
6
|
+
'de', 'en', 'es', 'fr', 'id', 'it', 'ja', 'ko', 'nl', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh'
|
|
7
|
+
];
|
|
8
|
+
|
|
9
|
+
const sharingLocales = ['ja', 'ko', 'zh'];
|
|
10
|
+
|
|
11
|
+
describe('Category Validation', () => {
|
|
12
|
+
it('should have all 15 required locales', () => {
|
|
13
|
+
const registeredLocales = Object.keys(toolsCategory.i18n);
|
|
14
|
+
EXPECTED_LOCALES.forEach((locale) => {
|
|
15
|
+
expect(
|
|
16
|
+
registeredLocales,
|
|
17
|
+
`Category is missing locale "${locale}"`,
|
|
18
|
+
).toContain(locale);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('Category Slug Validation', () => {
|
|
23
|
+
async function getEnSlug(locales: string[]): Promise<string> {
|
|
24
|
+
if (!locales.includes('en')) return '';
|
|
25
|
+
const enLoader = toolsCategory.i18n['en' as keyof typeof toolsCategory.i18n];
|
|
26
|
+
const enContent = (await enLoader?.()) as CategoryLocaleContent;
|
|
27
|
+
return enContent.slug;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function validateNonEnSlug(locale: string, slug: string, enSlug: string, slugs: Map<string, string>) {
|
|
31
|
+
if (sharingLocales.includes(locale)) {
|
|
32
|
+
expect(slug, `Category locale "${locale}" must use the same slug as "en" ("${enSlug}").`).toBe(enSlug);
|
|
33
|
+
} else {
|
|
34
|
+
expect(slug, `Category locale "${locale}" has the same slug as "en" ("${enSlug}"). Cada slug tiene que estar en su propio idioma`).not.toBe(enSlug);
|
|
35
|
+
if (slugs.has(slug)) {
|
|
36
|
+
expect(false, `Category locales "${locale}" and "${slugs.get(slug)}" share the same slug ("${slug}"). Cada slug tiene que estar en su propia idioma`).toBe(true);
|
|
37
|
+
}
|
|
38
|
+
slugs.set(slug, locale);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
it('every locale should have a unique, translated slug and follow format rules', async () => {
|
|
43
|
+
const slugs = new Map<string, string>();
|
|
44
|
+
const locales = Object.keys(toolsCategory.i18n);
|
|
45
|
+
const enSlug = await getEnSlug(locales);
|
|
46
|
+
|
|
47
|
+
for (const locale of locales) {
|
|
48
|
+
const loader = toolsCategory.i18n[locale as keyof typeof toolsCategory.i18n];
|
|
49
|
+
const content = (await loader?.()) as CategoryLocaleContent;
|
|
50
|
+
|
|
51
|
+
expect(content.slug, `Category locale "${locale}" has an invalid slug ("${content.slug}"). Slugs must be transliterated (only a-z, 0-9, and -).`).toMatch(/^[a-z0-9-]+$/);
|
|
52
|
+
expect(content.slug, `Category locale "${locale}" slug ("${content.slug}") cannot end with a 2-letter language code (e.g., -ja, -ru, -ko).`).not.toMatch(/-[a-z]{2}$/);
|
|
53
|
+
|
|
54
|
+
if (locale !== 'en') validateNonEnSlug(locale, content.slug, enSlug, slugs);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { DateDiffCalculatorUI } from './ui';
|
|
3
|
-
import DateDiffCalculatorComponent from './component.astro';
|
|
4
|
-
import DateDiffCalculatorSEO from './seo.astro';
|
|
5
|
-
import DateDiffCalculatorBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const dateDiffCalculator: ToolsToolEntry<DateDiffCalculatorUI> = {
|
|
8
5
|
id: 'date-diff-calculator',
|
|
@@ -28,7 +25,7 @@ export const dateDiffCalculator: ToolsToolEntry<DateDiffCalculatorUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const DATE_DIFF_CALCULATOR_TOOL: ToolDefinition = {
|
|
30
27
|
entry: dateDiffCalculator,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { DriveDirectLinkUI } from './ui';
|
|
3
|
-
import DriveDirectLinkComponent from './component.astro';
|
|
4
|
-
import DriveDirectLinkSEO from './seo.astro';
|
|
5
|
-
import DriveDirectLinkBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const driveDirectLink: ToolsToolEntry<DriveDirectLinkUI> = {
|
|
8
5
|
id: 'drive-direct-link',
|
|
@@ -28,7 +25,7 @@ export const driveDirectLink: ToolsToolEntry<DriveDirectLinkUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const DRIVE_DIRECT_LINK_TOOL: ToolDefinition = {
|
|
30
27
|
entry: driveDirectLink,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { EmailListCleanerUI } from './ui';
|
|
3
|
-
import EmailListCleanerComponent from './component.astro';
|
|
4
|
-
import EmailListCleanerSEO from './seo.astro';
|
|
5
|
-
import EmailListCleanerBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const emailListCleaner: ToolsToolEntry<EmailListCleanerUI> = {
|
|
8
5
|
id: 'email-list-cleaner',
|
|
@@ -28,7 +25,7 @@ export const emailListCleaner: ToolsToolEntry<EmailListCleanerUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const EMAIL_LIST_CLEANER_TOOL: ToolDefinition = {
|
|
30
27
|
entry: emailListCleaner,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { EnvBadgeSpainUI } from './ui';
|
|
3
|
-
import EnvBadgeSpainComponent from './component.astro';
|
|
4
|
-
import EnvBadgeSpainSEO from './seo.astro';
|
|
5
|
-
import EnvBadgeSpainBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const envBadgeSpain: ToolsToolEntry<EnvBadgeSpainUI> = {
|
|
8
5
|
id: 'env-badge-spain',
|
|
@@ -28,7 +25,7 @@ export const envBadgeSpain: ToolsToolEntry<EnvBadgeSpainUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const ENV_BADGE_SPAIN_TOOL: ToolDefinition = {
|
|
30
27
|
entry: envBadgeSpain,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { MorseBeaconUI } from './ui';
|
|
3
|
-
import MorseBeaconComponent from './component.astro';
|
|
4
|
-
import MorseBeaconSEO from './seo.astro';
|
|
5
|
-
import MorseBeaconBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const morseBeacon: ToolsToolEntry<MorseBeaconUI> = {
|
|
8
5
|
id: 'morse-beacon',
|
|
@@ -28,7 +25,7 @@ export const morseBeacon: ToolsToolEntry<MorseBeaconUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const MORSE_BEACON_TOOL: ToolDefinition = {
|
|
30
27
|
entry: morseBeacon,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { PasswordGeneratorUI } from './ui';
|
|
3
|
-
import PasswordGeneratorComponent from './component.astro';
|
|
4
|
-
import PasswordGeneratorSEO from './seo.astro';
|
|
5
|
-
import PasswordGeneratorBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const passwordGenerator: ToolsToolEntry<PasswordGeneratorUI> = {
|
|
8
5
|
id: 'password-generator',
|
|
@@ -28,7 +25,7 @@ export const passwordGenerator: ToolsToolEntry<PasswordGeneratorUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const PASSWORD_GENERATOR_TOOL: ToolDefinition = {
|
|
30
27
|
entry: passwordGenerator,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
package/src/tool/routes/index.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { RoutesUI } from './ui';
|
|
3
|
-
import RoutesComponent from './component.astro';
|
|
4
|
-
import RoutesSEO from './seo.astro';
|
|
5
|
-
import RoutesBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const routes: ToolsToolEntry<RoutesUI> = {
|
|
8
5
|
id: 'routes',
|
|
@@ -28,7 +25,7 @@ export const routes: ToolsToolEntry<RoutesUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const ROUTES_TOOL: ToolDefinition = {
|
|
30
27
|
entry: routes,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { RuleOfThreeUI } from './ui';
|
|
3
|
-
import RuleOfThreeComponent from './component.astro';
|
|
4
|
-
import RuleOfThreeSEO from './seo.astro';
|
|
5
|
-
import RuleOfThreeBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const ruleOfThree: ToolsToolEntry<RuleOfThreeUI> = {
|
|
8
5
|
id: 'rule-of-three',
|
|
@@ -28,7 +25,7 @@ export const ruleOfThree: ToolsToolEntry<RuleOfThreeUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const RULE_OF_THREE_TOOL: ToolDefinition = {
|
|
30
27
|
entry: ruleOfThree,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { SeoContentOptimizerUI } from './ui';
|
|
3
|
-
import SeoContentOptimizerComponent from './component.astro';
|
|
4
|
-
import SeoContentOptimizerSEO from './seo.astro';
|
|
5
|
-
import SeoContentOptimizerBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const seoContentOptimizer: ToolsToolEntry<SeoContentOptimizerUI> = {
|
|
8
5
|
id: 'seo-content-optimizer',
|
|
@@ -28,7 +25,7 @@ export const seoContentOptimizer: ToolsToolEntry<SeoContentOptimizerUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const SEO_CONTENT_OPTIMIZER_TOOL: ToolDefinition = {
|
|
30
27
|
entry: seoContentOptimizer,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { SpeedReaderUI } from './ui';
|
|
3
|
-
import SpeedReaderComponent from './component.astro';
|
|
4
|
-
import SpeedReaderSEO from './seo.astro';
|
|
5
|
-
import SpeedReaderBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const speedReader: ToolsToolEntry<SpeedReaderUI> = {
|
|
8
5
|
id: 'speed-reader',
|
|
@@ -28,7 +25,7 @@ export const speedReader: ToolsToolEntry<SpeedReaderUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const SPEED_READER_TOOL: ToolDefinition = {
|
|
30
27
|
entry: speedReader,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { TextPixelCalculatorUI } from './ui';
|
|
3
|
-
import TextPixelCalculatorComponent from './component.astro';
|
|
4
|
-
import TextPixelCalculatorSEO from './seo.astro';
|
|
5
|
-
import TextPixelCalculatorBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const textPixelCalculator: ToolsToolEntry<TextPixelCalculatorUI> = {
|
|
8
5
|
id: 'text-pixel-calculator',
|
|
@@ -28,7 +25,7 @@ export const textPixelCalculator: ToolsToolEntry<TextPixelCalculatorUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const TEXT_PIXEL_CALCULATOR_TOOL: ToolDefinition = {
|
|
30
27
|
entry: textPixelCalculator,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
2
|
import type { WhatsappLinkUI } from './ui';
|
|
3
|
-
import WhatsappLinkComponent from './component.astro';
|
|
4
|
-
import WhatsappLinkSEO from './seo.astro';
|
|
5
|
-
import WhatsappLinkBibliography from './bibliography.astro';
|
|
6
3
|
|
|
7
4
|
export const whatsappLink: ToolsToolEntry<WhatsappLinkUI> = {
|
|
8
5
|
id: 'whatsapp-link',
|
|
@@ -28,7 +25,7 @@ export const whatsappLink: ToolsToolEntry<WhatsappLinkUI> = {
|
|
|
28
25
|
|
|
29
26
|
export const WHATSAPP_LINK_TOOL: ToolDefinition = {
|
|
30
27
|
entry: whatsappLink,
|
|
31
|
-
Component:
|
|
32
|
-
SEOComponent:
|
|
33
|
-
BibliographyComponent:
|
|
28
|
+
Component: () => import('./component.astro'),
|
|
29
|
+
SEOComponent: () => import('./seo.astro'),
|
|
30
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
34
31
|
};
|
package/src/tools.ts
CHANGED
|
@@ -13,3 +13,5 @@ import { DRIVE_DIRECT_LINK_TOOL } from './tool/drive-direct-link/index';
|
|
|
13
13
|
import { SEO_CONTENT_OPTIMIZER_TOOL } from './tool/seo-content-optimizer/index';
|
|
14
14
|
|
|
15
15
|
export const ALL_TOOLS: ToolDefinition[] = [ROUTES_TOOL, RULE_OF_THREE_TOOL, PASSWORD_GENERATOR_TOOL, MORSE_BEACON_TOOL, SPEED_READER_TOOL, WHATSAPP_LINK_TOOL, TEXT_PIXEL_CALCULATOR_TOOL, DATE_DIFF_CALCULATOR_TOOL, EMAIL_LIST_CLEANER_TOOL, ENV_BADGE_SPAIN_TOOL, DRIVE_DIRECT_LINK_TOOL, SEO_CONTENT_OPTIMIZER_TOOL];
|
|
16
|
+
|
|
17
|
+
export const ALL_ENTRIES = ALL_TOOLS.map(t => t.entry);
|