@jjlmoya/utils-travel 1.12.0 → 1.14.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.
Files changed (86) hide show
  1. package/package.json +1 -1
  2. package/src/pages/[locale]/[slug].astro +31 -14
  3. package/src/tests/locale_completeness.test.ts +7 -19
  4. package/src/tests/shared-test-helpers.ts +56 -0
  5. package/src/tests/tool_exports.test.ts +34 -0
  6. package/src/tool/luggage-calculator/airline-luggage-calculator.css +1 -1
  7. package/src/tool/luggage-calculator/bibliography.astro +2 -10
  8. package/src/tool/luggage-calculator/bibliography.ts +16 -0
  9. package/src/tool/luggage-calculator/entry.ts +2 -0
  10. package/src/tool/luggage-calculator/i18n/de.ts +1 -17
  11. package/src/tool/luggage-calculator/i18n/en.ts +1 -17
  12. package/src/tool/luggage-calculator/i18n/es.ts +1 -17
  13. package/src/tool/luggage-calculator/i18n/fr.ts +1 -17
  14. package/src/tool/luggage-calculator/i18n/id.ts +1 -17
  15. package/src/tool/luggage-calculator/i18n/it.ts +1 -17
  16. package/src/tool/luggage-calculator/i18n/ja.ts +1 -17
  17. package/src/tool/luggage-calculator/i18n/ko.ts +1 -17
  18. package/src/tool/luggage-calculator/i18n/nl.ts +1 -17
  19. package/src/tool/luggage-calculator/i18n/pl.ts +1 -17
  20. package/src/tool/luggage-calculator/i18n/pt.ts +1 -17
  21. package/src/tool/luggage-calculator/i18n/ru.ts +1 -17
  22. package/src/tool/luggage-calculator/i18n/sv.ts +1 -17
  23. package/src/tool/luggage-calculator/i18n/tr.ts +1 -17
  24. package/src/tool/luggage-calculator/i18n/zh.ts +1 -17
  25. package/src/tool/luggage-calculator/index.ts +1 -0
  26. package/src/tool/mini-adventures/bibliography.astro +2 -10
  27. package/src/tool/mini-adventures/bibliography.ts +6 -0
  28. package/src/tool/mini-adventures/entry.ts +2 -0
  29. package/src/tool/mini-adventures/i18n/de.ts +1 -7
  30. package/src/tool/mini-adventures/i18n/en.ts +1 -7
  31. package/src/tool/mini-adventures/i18n/es.ts +1 -7
  32. package/src/tool/mini-adventures/i18n/fr.ts +1 -7
  33. package/src/tool/mini-adventures/i18n/id.ts +1 -7
  34. package/src/tool/mini-adventures/i18n/it.ts +1 -7
  35. package/src/tool/mini-adventures/i18n/ja.ts +1 -7
  36. package/src/tool/mini-adventures/i18n/ko.ts +1 -7
  37. package/src/tool/mini-adventures/i18n/nl.ts +1 -7
  38. package/src/tool/mini-adventures/i18n/pl.ts +1 -7
  39. package/src/tool/mini-adventures/i18n/pt.ts +1 -7
  40. package/src/tool/mini-adventures/i18n/ru.ts +1 -7
  41. package/src/tool/mini-adventures/i18n/sv.ts +1 -7
  42. package/src/tool/mini-adventures/i18n/tr.ts +1 -7
  43. package/src/tool/mini-adventures/i18n/zh.ts +1 -7
  44. package/src/tool/mini-adventures/index.ts +1 -0
  45. package/src/tool/mini-adventures/mini-adventure-forecast.css +14 -14
  46. package/src/tool/suitcase-checklist/bibliography.astro +2 -10
  47. package/src/tool/suitcase-checklist/bibliography.ts +6 -0
  48. package/src/tool/suitcase-checklist/entry.ts +2 -0
  49. package/src/tool/suitcase-checklist/i18n/de.ts +1 -7
  50. package/src/tool/suitcase-checklist/i18n/en.ts +1 -7
  51. package/src/tool/suitcase-checklist/i18n/es.ts +1 -7
  52. package/src/tool/suitcase-checklist/i18n/fr.ts +1 -7
  53. package/src/tool/suitcase-checklist/i18n/id.ts +1 -7
  54. package/src/tool/suitcase-checklist/i18n/it.ts +1 -7
  55. package/src/tool/suitcase-checklist/i18n/ja.ts +1 -7
  56. package/src/tool/suitcase-checklist/i18n/ko.ts +1 -7
  57. package/src/tool/suitcase-checklist/i18n/nl.ts +1 -7
  58. package/src/tool/suitcase-checklist/i18n/pl.ts +1 -7
  59. package/src/tool/suitcase-checklist/i18n/pt.ts +1 -7
  60. package/src/tool/suitcase-checklist/i18n/ru.ts +1 -7
  61. package/src/tool/suitcase-checklist/i18n/sv.ts +1 -7
  62. package/src/tool/suitcase-checklist/i18n/tr.ts +1 -7
  63. package/src/tool/suitcase-checklist/i18n/zh.ts +1 -7
  64. package/src/tool/suitcase-checklist/index.ts +1 -0
  65. package/src/tool/suitcase-checklist/suitcase-checklist-generator.css +1 -1
  66. package/src/tool/tip-calculator/bibliography.astro +2 -10
  67. package/src/tool/tip-calculator/bibliography.ts +16 -0
  68. package/src/tool/tip-calculator/entry.ts +2 -0
  69. package/src/tool/tip-calculator/i18n/de.ts +1 -17
  70. package/src/tool/tip-calculator/i18n/en.ts +1 -17
  71. package/src/tool/tip-calculator/i18n/es.ts +1 -17
  72. package/src/tool/tip-calculator/i18n/fr.ts +1 -17
  73. package/src/tool/tip-calculator/i18n/id.ts +1 -17
  74. package/src/tool/tip-calculator/i18n/it.ts +1 -17
  75. package/src/tool/tip-calculator/i18n/ja.ts +1 -17
  76. package/src/tool/tip-calculator/i18n/ko.ts +1 -17
  77. package/src/tool/tip-calculator/i18n/nl.ts +1 -17
  78. package/src/tool/tip-calculator/i18n/pl.ts +1 -17
  79. package/src/tool/tip-calculator/i18n/pt.ts +1 -17
  80. package/src/tool/tip-calculator/i18n/ru.ts +1 -17
  81. package/src/tool/tip-calculator/i18n/sv.ts +1 -17
  82. package/src/tool/tip-calculator/i18n/tr.ts +1 -17
  83. package/src/tool/tip-calculator/i18n/zh.ts +1 -17
  84. package/src/tool/tip-calculator/index.ts +1 -0
  85. package/src/tool/tip-calculator/international-tip-calculator.css +1 -1
  86. package/src/types.ts +4 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-travel",
3
- "version": "1.12.0",
3
+ "version": "1.14.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -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 = await Promise.all(
39
- ALL_TOOLS.map(async ({ entry: navEntry }) => ({
40
- id: navEntry.id,
41
- title: (await navEntry.i18n[locale]!()).title,
42
- href: `/${locale}/${(await navEntry.i18n[locale]!()).slug}`,
43
- isActive: navEntry.id === entry.id,
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,17 @@ 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
+ // eslint-disable-next-line custom/no-css-comments
85
+ const cssFiles = import.meta.glob("../../tool/**/*.css", { query: "?raw", import: "default" });
86
+ const cssKey = Object.keys(cssFiles).find((k) => k.endsWith(`/${englishSlug}.css`));
87
+ const toolCss = cssKey ? await cssFiles[cssKey]() as string : "";
72
88
 
73
- const seoContent: UtilitySEOContent = { locale, sections: content.seo };
89
+ const seoContent: UtilitySEOContent = { locale, sections: content.seo ?? [] };
74
90
 
75
91
  const words = content.title.split(" ");
76
92
  const titleHighlight = words[0] || "";
@@ -89,8 +105,9 @@ const titleBase = words.slice(1).join(" ") || "";
89
105
  tools={allToolsNav}
90
106
  />
91
107
  <Fragment slot="head">
108
+ {toolCss ? <Fragment set:html={`<style is:inline>${toolCss}</style>`} /> : null}
92
109
  {
93
- content.schemas.map((schema: unknown) => (
110
+ ( content.schemas ?? []).map((schema: unknown) => (
94
111
  <script
95
112
  is:inline
96
113
  type="application/ld+json"
@@ -116,11 +133,11 @@ const titleBase = words.slice(1).join(" ") || "";
116
133
  </section>
117
134
 
118
135
  <section class="section-faq">
119
- <FAQSection items={content.faq} title={content.ui.faqTitle} inLanguage={locale} />
136
+ <FAQSection items={content.faq} />
120
137
  </section>
121
138
 
122
139
  <section class="section-bibliography">
123
- <Bibliography links={content.bibliography} title={content.ui.bibliographyTitle} />
140
+ <Bibliography links={content.bibliography} />
124
141
  </section>
125
142
  </div>
126
143
  </PreviewLayout>
@@ -7,28 +7,16 @@ describe('Locale Completeness Validation', () => {
7
7
  describe(`Tool: ${tool.entry.id}`, () => {
8
8
  Object.keys(tool.entry.i18n).forEach((locale) => {
9
9
  describe(`Locale: ${locale}`, () => {
10
- it('faqTitle should be defined when faq items exist', async () => {
10
+ it('should have mandatory properties', async () => {
11
11
  const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
12
12
  const content = (await loader?.()) as ToolLocaleContent;
13
13
 
14
- if (content.faq.length > 0) {
15
- expect(
16
- content.faqTitle,
17
- `Tool "${tool.entry.id}" locale "${locale}" has ${content.faq.length} FAQ items but is missing faqTitle`,
18
- ).toBeTruthy();
19
- }
20
- });
21
-
22
- it('bibliographyTitle should be defined when bibliography items exist', async () => {
23
- const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
24
- const content = (await loader?.()) as ToolLocaleContent;
25
-
26
- if (content.bibliography.length > 0) {
27
- expect(
28
- content.bibliographyTitle,
29
- `Tool "${tool.entry.id}" locale "${locale}" has ${content.bibliography.length} bibliography items but is missing bibliographyTitle`,
30
- ).toBeTruthy();
31
- }
14
+ expect(content.slug).toBeTruthy();
15
+ expect(typeof content.slug).toBe('string');
16
+ expect(content.title).toBeTruthy();
17
+ expect(typeof content.title).toBe('string');
18
+ expect(content.description).toBeTruthy();
19
+ expect(typeof content.description).toBe('string');
32
20
  });
33
21
  });
34
22
  });
@@ -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
+ });
@@ -13,7 +13,7 @@
13
13
  --lc-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.05), 0 10px 10px -5px rgba(0, 0, 0, 0.02);
14
14
  }
15
15
 
16
- :global(.theme-dark) .luggage-calculator {
16
+ .theme-dark .luggage-calculator {
17
17
  --lc-border: #334155;
18
18
  --lc-text: #f1f5f9;
19
19
  --lc-text-muted: #94a3b8;
@@ -1,14 +1,6 @@
1
1
  ---
2
2
  import { Bibliography as SharedBibliography } from "@jjlmoya/utils-shared";
3
- import { luggageCalculator } from "./index";
4
- import type { KnownLocale } from "../../types";
5
-
6
- interface Props {
7
- locale?: KnownLocale;
8
- }
9
-
10
- const { locale = "es" } = Astro.props;
11
- const content = await luggageCalculator.i18n[locale]?.();
3
+ import { bibliography } from "./bibliography";
12
4
  ---
13
5
 
14
- {content && <SharedBibliography links={content.bibliography} />}
6
+ <SharedBibliography links={bibliography} />
@@ -0,0 +1,16 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: "AENA: Passagiere und Gepäck",
6
+ url: "https://www.aena.es/es/pasajeros/pasajeros.html",
7
+ },
8
+ {
9
+ name: "Fluggastrechte - EU",
10
+ url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_de.htm",
11
+ },
12
+ {
13
+ name: "IATA: Gepäckregeln für Passagiere",
14
+ url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
15
+ },
16
+ ];
@@ -51,3 +51,5 @@ export const luggageCalculator: TravelToolEntry<LuggageCalculatorUI> = {
51
51
  zh: () => import('./i18n/zh').then((m) => m.content),
52
52
  },
53
53
  };
54
+
55
+ export { bibliography } from './bibliography';
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
407
408
  },
408
409
  ];
409
410
 
410
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
411
- {
412
- name: "AENA: Passagiere und Gepäck",
413
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
414
- },
415
- {
416
- name: "Fluggastrechte - EU",
417
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_de.htm",
418
- },
419
- {
420
- name: "IATA: Gepäckregeln für Passagiere",
421
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
422
- },
423
- ];
424
-
425
411
  const seo: LuggageCalculatorLocaleContent['seo'] = [
426
412
  {
427
413
  type: "title",
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
607
593
  ui,
608
594
  seo,
609
595
  faq,
610
- faqTitle: "Häufig gestellte Fragen",
611
596
  bibliography,
612
- bibliographyTitle: "Quellen und Referenzen",
613
597
  howTo,
614
598
  howToTitle: "So verwenden Sie den Rechner",
615
599
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -408,21 +409,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
408
409
  },
409
410
  ];
410
411
 
411
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
412
- {
413
- name: "AENA: Passengers and Baggage",
414
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
415
- },
416
- {
417
- name: "Air Passenger Rights - EU",
418
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_es.htm",
419
- },
420
- {
421
- name: "IATA: Passenger Baggage Rules",
422
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
423
- },
424
- ];
425
-
426
412
  const seo: LuggageCalculatorLocaleContent['seo'] = [
427
413
  {
428
414
  type: "title",
@@ -608,9 +594,7 @@ export const content: LuggageCalculatorLocaleContent = {
608
594
  ui,
609
595
  seo,
610
596
  faq,
611
- faqTitle: "Frequently Asked Questions",
612
597
  bibliography,
613
- bibliographyTitle: "Sources and References",
614
598
  howTo,
615
599
  howToTitle: "How to use the calculator",
616
600
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -408,21 +409,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
408
409
  },
409
410
  ];
410
411
 
411
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
412
- {
413
- name: "AENA: Pasajeros y Equipajes",
414
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
415
- },
416
- {
417
- name: "Derechos de los Pasajeros de la UE",
418
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_es.htm",
419
- },
420
- {
421
- name: "IATA: Passenger Baggage Rules",
422
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
423
- },
424
- ];
425
-
426
412
  const seo: LuggageCalculatorLocaleContent['seo'] = [
427
413
  {
428
414
  type: "title",
@@ -608,9 +594,7 @@ export const content: LuggageCalculatorLocaleContent = {
608
594
  ui,
609
595
  seo,
610
596
  faq,
611
- faqTitle: "Preguntas Frecuentes",
612
597
  bibliography,
613
- bibliographyTitle: "Fuentes y Referencias",
614
598
  howTo,
615
599
  howToTitle: "Cómo usar la calculadora",
616
600
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -392,21 +393,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
392
393
  },
393
394
  ];
394
395
 
395
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
396
- {
397
- name: "AENA: Pasajeros y Equipajes",
398
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
399
- },
400
- {
401
- name: "Droits des Passagers Aériens - UE",
402
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_es.htm",
403
- },
404
- {
405
- name: "IATA: Passenger Baggage Rules",
406
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
407
- },
408
- ];
409
-
410
396
  const seo: LuggageCalculatorLocaleContent['seo'] = [
411
397
  {
412
398
  type: "title",
@@ -540,9 +526,7 @@ export const content: LuggageCalculatorLocaleContent = {
540
526
  ui,
541
527
  seo,
542
528
  faq,
543
- faqTitle: "Questions Fréquentes",
544
529
  bibliography,
545
- bibliographyTitle: "Sources et Références",
546
530
  howTo,
547
531
  howToTitle: "Comment utiliser le calculateur",
548
532
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
407
408
  },
408
409
  ];
409
410
 
410
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
411
- {
412
- name: "AENA: Penumpang dan Bagasi",
413
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
414
- },
415
- {
416
- name: "Hak Penumpang Udara - Uni Eropa",
417
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_en.htm",
418
- },
419
- {
420
- name: "IATA: Aturan Bagasi Penumpang",
421
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
422
- },
423
- ];
424
-
425
411
  const seo: LuggageCalculatorLocaleContent['seo'] = [
426
412
  {
427
413
  type: "title",
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
607
593
  ui,
608
594
  seo,
609
595
  faq,
610
- faqTitle: "Pertanyaan yang Sering Diajukan",
611
596
  bibliography,
612
- bibliographyTitle: "Sumber dan Referensi",
613
597
  howTo,
614
598
  howToTitle: "Cara menggunakan kalkulator",
615
599
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
407
408
  },
408
409
  ];
409
410
 
410
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
411
- {
412
- name: "AENA: Passeggeri e Bagagli",
413
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
414
- },
415
- {
416
- name: "Diritti dei Passeggeri Aerei - UE",
417
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_it.htm",
418
- },
419
- {
420
- name: "IATA: Regole sui Bagagli dei Passeggeri",
421
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
422
- },
423
- ];
424
-
425
411
  const seo: LuggageCalculatorLocaleContent['seo'] = [
426
412
  {
427
413
  type: "title",
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
607
593
  ui,
608
594
  seo,
609
595
  faq,
610
- faqTitle: "Domande Frequenti",
611
596
  bibliography,
612
- bibliographyTitle: "Fonti e Riferimenti",
613
597
  howTo,
614
598
  howToTitle: "Come utilizzare il calcolatore",
615
599
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
407
408
  },
408
409
  ];
409
410
 
410
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
411
- {
412
- name: "AENA:旅客と手荷物",
413
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
414
- },
415
- {
416
- name: "航空旅客の権利 - EU",
417
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_en.htm",
418
- },
419
- {
420
- name: "IATA:旅客手荷物規則",
421
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
422
- },
423
- ];
424
-
425
411
  const seo: LuggageCalculatorLocaleContent['seo'] = [
426
412
  {
427
413
  type: "title",
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
607
593
  ui,
608
594
  seo,
609
595
  faq,
610
- faqTitle: "よくある質問",
611
596
  bibliography,
612
- bibliographyTitle: "出典とリファレンス",
613
597
  howTo,
614
598
  howToTitle: "計算機の使い方",
615
599
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
407
408
  },
408
409
  ];
409
410
 
410
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
411
- {
412
- name: "AENA: 승객 및 수하물",
413
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
414
- },
415
- {
416
- name: "항공 승객 권리 - EU",
417
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_en.htm",
418
- },
419
- {
420
- name: "IATA: 승객 수하물 규정",
421
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
422
- },
423
- ];
424
-
425
411
  const seo: LuggageCalculatorLocaleContent['seo'] = [
426
412
  {
427
413
  type: "title",
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
607
593
  ui,
608
594
  seo,
609
595
  faq,
610
- faqTitle: "자주 묻는 질문",
611
596
  bibliography,
612
- bibliographyTitle: "출처 및 참고",
613
597
  howTo,
614
598
  howToTitle: "계산기 사용 방법",
615
599
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
407
408
  },
408
409
  ];
409
410
 
410
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
411
- {
412
- name: "AENA: Passagiers en Bagage",
413
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
414
- },
415
- {
416
- name: "Passagiersrechten Luchtvaart - EU",
417
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_nl.htm",
418
- },
419
- {
420
- name: "IATA: Passagiersbagageregels",
421
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
422
- },
423
- ];
424
-
425
411
  const seo: LuggageCalculatorLocaleContent['seo'] = [
426
412
  {
427
413
  type: "title",
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
607
593
  ui,
608
594
  seo,
609
595
  faq,
610
- faqTitle: "Veelgestelde Vragen",
611
596
  bibliography,
612
- bibliographyTitle: "Bronnen en Referenties",
613
597
  howTo,
614
598
  howToTitle: "Hoe de calculator te gebruiken",
615
599
  schemas: [faqSchema, howToSchema, appSchema],
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
4
 
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
407
408
  },
408
409
  ];
409
410
 
410
- const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
411
- {
412
- name: "AENA: Pasażerowie i Bagaż",
413
- url: "https://www.aena.es/es/pasajeros/pasajeros.html",
414
- },
415
- {
416
- name: "Prawa Pasażerów Lotniczych - UE",
417
- url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_pl.htm",
418
- },
419
- {
420
- name: "IATA: Przepisy dotyczące bagażu pasażerskiego",
421
- url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
422
- },
423
- ];
424
-
425
411
  const seo: LuggageCalculatorLocaleContent['seo'] = [
426
412
  {
427
413
  type: "title",
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
607
593
  ui,
608
594
  seo,
609
595
  faq,
610
- faqTitle: "Najczęściej Zadawane Pytania",
611
596
  bibliography,
612
- bibliographyTitle: "Źródła i Odniesienia",
613
597
  howTo,
614
598
  howToTitle: "Jak korzystać z kalkulatora",
615
599
  schemas: [faqSchema, howToSchema, appSchema],