@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-tools",
3
- "version": "1.5.0",
3
+ "version": "1.8.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -1,7 +1,7 @@
1
1
  import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  export const content: CategoryLocaleContent = {
4
- slug: 'tools',
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 { default as toolsCategorySEO } from './category/seo.astro';
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 { default as RoutesComponent } from './tool/routes/component.astro';
22
- export { default as RoutesSEO } from './tool/routes/seo.astro';
23
- export { default as RoutesBibliography } from './tool/routes/bibliography.astro';
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 { default as RuleOfThreeComponent } from './tool/rule-of-three/component.astro';
28
- export { default as RuleOfThreeSEO } from './tool/rule-of-three/seo.astro';
29
- export { default as RuleOfThreeBibliography } from './tool/rule-of-three/bibliography.astro';
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 { default as PasswordGeneratorComponent } from './tool/password-generator/component.astro';
34
- export { default as PasswordGeneratorSEO } from './tool/password-generator/seo.astro';
35
- export { default as PasswordGeneratorBibliography } from './tool/password-generator/bibliography.astro';
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 { default as MorseBeaconComponent } from './tool/morse-beacon/component.astro';
40
- export { default as MorseBeaconSEO } from './tool/morse-beacon/seo.astro';
41
- export { default as MorseBeaconBibliography } from './tool/morse-beacon/bibliography.astro';
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 { default as SpeedReaderComponent } from './tool/speed-reader/component.astro';
46
- export { default as SpeedReaderSEO } from './tool/speed-reader/seo.astro';
47
- export { default as SpeedReaderBibliography } from './tool/speed-reader/bibliography.astro';
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 { default as WhatsappLinkComponent } from './tool/whatsapp-link/component.astro';
52
- export { default as WhatsappLinkSEO } from './tool/whatsapp-link/seo.astro';
53
- export { default as WhatsappLinkBibliography } from './tool/whatsapp-link/bibliography.astro';
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 { default as TextPixelCalculatorComponent } from './tool/text-pixel-calculator/component.astro';
58
- export { default as TextPixelCalculatorSEO } from './tool/text-pixel-calculator/seo.astro';
59
- export { default as TextPixelCalculatorBibliography } from './tool/text-pixel-calculator/bibliography.astro';
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 { default as DateDiffCalculatorComponent } from './tool/date-diff-calculator/component.astro';
64
- export { default as DateDiffCalculatorSEO } from './tool/date-diff-calculator/seo.astro';
65
- export { default as DateDiffCalculatorBibliography } from './tool/date-diff-calculator/bibliography.astro';
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 { default as EmailListCleanerComponent } from './tool/email-list-cleaner/component.astro';
70
- export { default as EmailListCleanerSEO } from './tool/email-list-cleaner/seo.astro';
71
- export { default as EmailListCleanerBibliography } from './tool/email-list-cleaner/bibliography.astro';
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 { default as EnvBadgeSpainComponent } from './tool/env-badge-spain/component.astro';
76
- export { default as EnvBadgeSpainSEO } from './tool/env-badge-spain/seo.astro';
77
- export { default as EnvBadgeSpainBibliography } from './tool/env-badge-spain/bibliography.astro';
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 { default as DriveDirectLinkComponent } from './tool/drive-direct-link/component.astro';
82
- export { default as DriveDirectLinkSEO } from './tool/drive-direct-link/seo.astro';
83
- export { default as DriveDirectLinkBibliography } from './tool/drive-direct-link/bibliography.astro';
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 { default as SeoContentOptimizerComponent } from './tool/seo-content-optimizer/component.astro';
88
- export { default as SeoContentOptimizerSEO } from './tool/seo-content-optimizer/seo.astro';
89
- export { default as SeoContentOptimizerBibliography } from './tool/seo-content-optimizer/bibliography.astro';
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: ToolComponent;
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: DateDiffCalculatorComponent,
32
- SEOComponent: DateDiffCalculatorSEO,
33
- BibliographyComponent: DateDiffCalculatorBibliography,
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: DriveDirectLinkComponent,
32
- SEOComponent: DriveDirectLinkSEO,
33
- BibliographyComponent: DriveDirectLinkBibliography,
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: EmailListCleanerComponent,
32
- SEOComponent: EmailListCleanerSEO,
33
- BibliographyComponent: EmailListCleanerBibliography,
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: EnvBadgeSpainComponent,
32
- SEOComponent: EnvBadgeSpainSEO,
33
- BibliographyComponent: EnvBadgeSpainBibliography,
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: MorseBeaconComponent,
32
- SEOComponent: MorseBeaconSEO,
33
- BibliographyComponent: MorseBeaconBibliography,
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: PasswordGeneratorComponent,
32
- SEOComponent: PasswordGeneratorSEO,
33
- BibliographyComponent: PasswordGeneratorBibliography,
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 { 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: RoutesComponent,
32
- SEOComponent: RoutesSEO,
33
- BibliographyComponent: RoutesBibliography,
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: RuleOfThreeComponent,
32
- SEOComponent: RuleOfThreeSEO,
33
- BibliographyComponent: RuleOfThreeBibliography,
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: SeoContentOptimizerComponent,
32
- SEOComponent: SeoContentOptimizerSEO,
33
- BibliographyComponent: SeoContentOptimizerBibliography,
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: SpeedReaderComponent,
32
- SEOComponent: SpeedReaderSEO,
33
- BibliographyComponent: SpeedReaderBibliography,
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: TextPixelCalculatorComponent,
32
- SEOComponent: TextPixelCalculatorSEO,
33
- BibliographyComponent: TextPixelCalculatorBibliography,
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: WhatsappLinkComponent,
32
- SEOComponent: WhatsappLinkSEO,
33
- BibliographyComponent: WhatsappLinkBibliography,
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);