euparliamentmonitor 0.8.4
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/LICENSE +201 -0
- package/README.md +1005 -0
- package/SECURITY.md +151 -0
- package/package.json +131 -0
- package/scripts/constants/committee-indicator-map.d.ts +199 -0
- package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
- package/scripts/constants/committee-indicator-map.js +1224 -0
- package/scripts/constants/committee-indicator-map.js.map +1 -0
- package/scripts/constants/config.d.ts +38 -0
- package/scripts/constants/config.d.ts.map +1 -0
- package/scripts/constants/config.js +66 -0
- package/scripts/constants/config.js.map +1 -0
- package/scripts/constants/language-articles.d.ts +84 -0
- package/scripts/constants/language-articles.d.ts.map +1 -0
- package/scripts/constants/language-articles.js +6771 -0
- package/scripts/constants/language-articles.js.map +1 -0
- package/scripts/constants/language-core.d.ts +38 -0
- package/scripts/constants/language-core.d.ts.map +1 -0
- package/scripts/constants/language-core.js +90 -0
- package/scripts/constants/language-core.js.map +1 -0
- package/scripts/constants/language-ui.d.ts +82 -0
- package/scripts/constants/language-ui.d.ts.map +1 -0
- package/scripts/constants/language-ui.js +889 -0
- package/scripts/constants/language-ui.js.map +1 -0
- package/scripts/constants/languages.d.ts +14 -0
- package/scripts/constants/languages.d.ts.map +1 -0
- package/scripts/constants/languages.js +15 -0
- package/scripts/constants/languages.js.map +1 -0
- package/scripts/generators/analysis-builders.d.ts +266 -0
- package/scripts/generators/analysis-builders.d.ts.map +1 -0
- package/scripts/generators/analysis-builders.js +2903 -0
- package/scripts/generators/analysis-builders.js.map +1 -0
- package/scripts/generators/breaking-content.d.ts +45 -0
- package/scripts/generators/breaking-content.d.ts.map +1 -0
- package/scripts/generators/breaking-content.js +530 -0
- package/scripts/generators/breaking-content.js.map +1 -0
- package/scripts/generators/committee-helpers.d.ts +54 -0
- package/scripts/generators/committee-helpers.d.ts.map +1 -0
- package/scripts/generators/committee-helpers.js +154 -0
- package/scripts/generators/committee-helpers.js.map +1 -0
- package/scripts/generators/dashboard-content.d.ts +95 -0
- package/scripts/generators/dashboard-content.d.ts.map +1 -0
- package/scripts/generators/dashboard-content.js +630 -0
- package/scripts/generators/dashboard-content.js.map +1 -0
- package/scripts/generators/deep-analysis-content.d.ts +23 -0
- package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
- package/scripts/generators/deep-analysis-content.js +831 -0
- package/scripts/generators/deep-analysis-content.js.map +1 -0
- package/scripts/generators/mindmap-content.d.ts +55 -0
- package/scripts/generators/mindmap-content.d.ts.map +1 -0
- package/scripts/generators/mindmap-content.js +512 -0
- package/scripts/generators/mindmap-content.js.map +1 -0
- package/scripts/generators/motions-content.d.ts +50 -0
- package/scripts/generators/motions-content.d.ts.map +1 -0
- package/scripts/generators/motions-content.js +391 -0
- package/scripts/generators/motions-content.js.map +1 -0
- package/scripts/generators/news-enhanced.d.ts +14 -0
- package/scripts/generators/news-enhanced.d.ts.map +1 -0
- package/scripts/generators/news-enhanced.js +169 -0
- package/scripts/generators/news-enhanced.js.map +1 -0
- package/scripts/generators/news-indexes.d.ts +31 -0
- package/scripts/generators/news-indexes.d.ts.map +1 -0
- package/scripts/generators/news-indexes.js +410 -0
- package/scripts/generators/news-indexes.js.map +1 -0
- package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
- package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/fetch-stage.js +1522 -0
- package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
- package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
- package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/generate-stage.js +204 -0
- package/scripts/generators/pipeline/generate-stage.js.map +1 -0
- package/scripts/generators/pipeline/output-stage.d.ts +48 -0
- package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/output-stage.js +145 -0
- package/scripts/generators/pipeline/output-stage.js.map +1 -0
- package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
- package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/transform-stage.js +111 -0
- package/scripts/generators/pipeline/transform-stage.js.map +1 -0
- package/scripts/generators/propositions-content.d.ts +29 -0
- package/scripts/generators/propositions-content.d.ts.map +1 -0
- package/scripts/generators/propositions-content.js +90 -0
- package/scripts/generators/propositions-content.js.map +1 -0
- package/scripts/generators/sankey-content.d.ts +45 -0
- package/scripts/generators/sankey-content.d.ts.map +1 -0
- package/scripts/generators/sankey-content.js +227 -0
- package/scripts/generators/sankey-content.js.map +1 -0
- package/scripts/generators/sitemap.d.ts +66 -0
- package/scripts/generators/sitemap.d.ts.map +1 -0
- package/scripts/generators/sitemap.js +562 -0
- package/scripts/generators/sitemap.js.map +1 -0
- package/scripts/generators/strategies/article-strategy.d.ts +146 -0
- package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/article-strategy.js +4 -0
- package/scripts/generators/strategies/article-strategy.js.map +1 -0
- package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
- package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
- package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
- package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
- package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
- package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
- package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
- package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
- package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
- package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
- package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
- package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
- package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
- package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/motions-strategy.js +215 -0
- package/scripts/generators/strategies/motions-strategy.js.map +1 -0
- package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
- package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/propositions-strategy.js +257 -0
- package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
- package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
- package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
- package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
- package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
- package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
- package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
- package/scripts/generators/swot-content.d.ts +42 -0
- package/scripts/generators/swot-content.d.ts.map +1 -0
- package/scripts/generators/swot-content.js +366 -0
- package/scripts/generators/swot-content.js.map +1 -0
- package/scripts/generators/week-ahead-content.d.ts +103 -0
- package/scripts/generators/week-ahead-content.d.ts.map +1 -0
- package/scripts/generators/week-ahead-content.js +610 -0
- package/scripts/generators/week-ahead-content.js.map +1 -0
- package/scripts/index.d.ts +40 -0
- package/scripts/index.d.ts.map +1 -0
- package/scripts/index.js +53 -0
- package/scripts/index.js.map +1 -0
- package/scripts/mcp/ep-mcp-client.d.ts +471 -0
- package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
- package/scripts/mcp/ep-mcp-client.js +734 -0
- package/scripts/mcp/ep-mcp-client.js.map +1 -0
- package/scripts/mcp/mcp-connection.d.ts +264 -0
- package/scripts/mcp/mcp-connection.d.ts.map +1 -0
- package/scripts/mcp/mcp-connection.js +790 -0
- package/scripts/mcp/mcp-connection.js.map +1 -0
- package/scripts/mcp/mcp-health.d.ts +75 -0
- package/scripts/mcp/mcp-health.d.ts.map +1 -0
- package/scripts/mcp/mcp-health.js +78 -0
- package/scripts/mcp/mcp-health.js.map +1 -0
- package/scripts/mcp/mcp-retry.d.ts +94 -0
- package/scripts/mcp/mcp-retry.d.ts.map +1 -0
- package/scripts/mcp/mcp-retry.js +127 -0
- package/scripts/mcp/mcp-retry.js.map +1 -0
- package/scripts/mcp/wb-mcp-client.d.ts +38 -0
- package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
- package/scripts/mcp/wb-mcp-client.js +112 -0
- package/scripts/mcp/wb-mcp-client.js.map +1 -0
- package/scripts/templates/article-template.d.ts +9 -0
- package/scripts/templates/article-template.d.ts.map +1 -0
- package/scripts/templates/article-template.js +378 -0
- package/scripts/templates/article-template.js.map +1 -0
- package/scripts/templates/section-builders.d.ts +28 -0
- package/scripts/templates/section-builders.d.ts.map +1 -0
- package/scripts/templates/section-builders.js +142 -0
- package/scripts/templates/section-builders.js.map +1 -0
- package/scripts/types/analysis.d.ts +115 -0
- package/scripts/types/analysis.d.ts.map +1 -0
- package/scripts/types/analysis.js +4 -0
- package/scripts/types/analysis.js.map +1 -0
- package/scripts/types/common.d.ts +584 -0
- package/scripts/types/common.d.ts.map +1 -0
- package/scripts/types/common.js +96 -0
- package/scripts/types/common.js.map +1 -0
- package/scripts/types/generation.d.ts +104 -0
- package/scripts/types/generation.d.ts.map +1 -0
- package/scripts/types/generation.js +4 -0
- package/scripts/types/generation.js.map +1 -0
- package/scripts/types/index.d.ts +24 -0
- package/scripts/types/index.d.ts.map +1 -0
- package/scripts/types/index.js +16 -0
- package/scripts/types/index.js.map +1 -0
- package/scripts/types/intelligence.d.ts +129 -0
- package/scripts/types/intelligence.d.ts.map +1 -0
- package/scripts/types/intelligence.js +4 -0
- package/scripts/types/intelligence.js.map +1 -0
- package/scripts/types/mcp.d.ts +418 -0
- package/scripts/types/mcp.d.ts.map +1 -0
- package/scripts/types/mcp.js +4 -0
- package/scripts/types/mcp.js.map +1 -0
- package/scripts/types/parliament.d.ts +388 -0
- package/scripts/types/parliament.d.ts.map +1 -0
- package/scripts/types/parliament.js +4 -0
- package/scripts/types/parliament.js.map +1 -0
- package/scripts/types/quality.d.ts +114 -0
- package/scripts/types/quality.d.ts.map +1 -0
- package/scripts/types/quality.js +4 -0
- package/scripts/types/quality.js.map +1 -0
- package/scripts/types/stakeholder.d.ts +88 -0
- package/scripts/types/stakeholder.d.ts.map +1 -0
- package/scripts/types/stakeholder.js +16 -0
- package/scripts/types/stakeholder.js.map +1 -0
- package/scripts/types/visualization.d.ts +708 -0
- package/scripts/types/visualization.d.ts.map +1 -0
- package/scripts/types/visualization.js +4 -0
- package/scripts/types/visualization.js.map +1 -0
- package/scripts/types/world-bank.d.ts +85 -0
- package/scripts/types/world-bank.d.ts.map +1 -0
- package/scripts/types/world-bank.js +4 -0
- package/scripts/types/world-bank.js.map +1 -0
- package/scripts/utils/article-category.d.ts +18 -0
- package/scripts/utils/article-category.d.ts.map +1 -0
- package/scripts/utils/article-category.js +49 -0
- package/scripts/utils/article-category.js.map +1 -0
- package/scripts/utils/article-quality-scorer.d.ts +87 -0
- package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
- package/scripts/utils/article-quality-scorer.js +1048 -0
- package/scripts/utils/article-quality-scorer.js.map +1 -0
- package/scripts/utils/content-metadata.d.ts +34 -0
- package/scripts/utils/content-metadata.d.ts.map +1 -0
- package/scripts/utils/content-metadata.js +249 -0
- package/scripts/utils/content-metadata.js.map +1 -0
- package/scripts/utils/content-validator.d.ts +94 -0
- package/scripts/utils/content-validator.d.ts.map +1 -0
- package/scripts/utils/content-validator.js +489 -0
- package/scripts/utils/content-validator.js.map +1 -0
- package/scripts/utils/copy-test-reports.d.ts +9 -0
- package/scripts/utils/copy-test-reports.d.ts.map +1 -0
- package/scripts/utils/copy-test-reports.js +508 -0
- package/scripts/utils/copy-test-reports.js.map +1 -0
- package/scripts/utils/file-utils.d.ts +144 -0
- package/scripts/utils/file-utils.d.ts.map +1 -0
- package/scripts/utils/file-utils.js +374 -0
- package/scripts/utils/file-utils.js.map +1 -0
- package/scripts/utils/fix-articles.d.ts +27 -0
- package/scripts/utils/fix-articles.d.ts.map +1 -0
- package/scripts/utils/fix-articles.js +510 -0
- package/scripts/utils/fix-articles.js.map +1 -0
- package/scripts/utils/generate-docs-index.d.ts +8 -0
- package/scripts/utils/generate-docs-index.d.ts.map +1 -0
- package/scripts/utils/generate-docs-index.js +275 -0
- package/scripts/utils/generate-docs-index.js.map +1 -0
- package/scripts/utils/html-sanitize.d.ts +18 -0
- package/scripts/utils/html-sanitize.d.ts.map +1 -0
- package/scripts/utils/html-sanitize.js +57 -0
- package/scripts/utils/html-sanitize.js.map +1 -0
- package/scripts/utils/intelligence-analysis.d.ts +173 -0
- package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
- package/scripts/utils/intelligence-analysis.js +936 -0
- package/scripts/utils/intelligence-analysis.js.map +1 -0
- package/scripts/utils/intelligence-index.d.ts +126 -0
- package/scripts/utils/intelligence-index.d.ts.map +1 -0
- package/scripts/utils/intelligence-index.js +731 -0
- package/scripts/utils/intelligence-index.js.map +1 -0
- package/scripts/utils/metadata-utils.d.ts +14 -0
- package/scripts/utils/metadata-utils.d.ts.map +1 -0
- package/scripts/utils/metadata-utils.js +18 -0
- package/scripts/utils/metadata-utils.js.map +1 -0
- package/scripts/utils/news-metadata.d.ts +47 -0
- package/scripts/utils/news-metadata.d.ts.map +1 -0
- package/scripts/utils/news-metadata.js +259 -0
- package/scripts/utils/news-metadata.js.map +1 -0
- package/scripts/utils/validate-articles.d.ts +2 -0
- package/scripts/utils/validate-articles.d.ts.map +1 -0
- package/scripts/utils/validate-articles.js +284 -0
- package/scripts/utils/validate-articles.js.map +1 -0
- package/scripts/utils/validate-ep-api.d.ts +51 -0
- package/scripts/utils/validate-ep-api.d.ts.map +1 -0
- package/scripts/utils/validate-ep-api.js +160 -0
- package/scripts/utils/validate-ep-api.js.map +1 -0
- package/scripts/utils/world-bank-data.d.ts +84 -0
- package/scripts/utils/world-bank-data.d.ts.map +1 -0
- package/scripts/utils/world-bank-data.js +311 -0
- package/scripts/utils/world-bank-data.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"news-enhanced.js","sourceRoot":"","sources":["../../src/generators/news-enhanced.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import type { ParsedArticle } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get the index filename for a given language code.
|
|
5
|
+
* English uses index.html (the primary homepage), others use index-{lang}.html.
|
|
6
|
+
*
|
|
7
|
+
* @param lang - Language code
|
|
8
|
+
* @returns Filename string
|
|
9
|
+
*/
|
|
10
|
+
export declare function getIndexFilename(lang: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Generate index HTML for a language.
|
|
13
|
+
*
|
|
14
|
+
* Produces a complete, standards-compliant HTML5 page with:
|
|
15
|
+
* - Sticky header with EU branding
|
|
16
|
+
* - Compact language switcher with flag + code
|
|
17
|
+
* - Hero section with page title and description
|
|
18
|
+
* - Responsive card grid for news articles
|
|
19
|
+
* - Accessible empty state when no articles exist
|
|
20
|
+
* - Hack23 AB multi-section footer (About, Quick Links, Built by Hack23, Languages)
|
|
21
|
+
*
|
|
22
|
+
* @param lang - Language code
|
|
23
|
+
* @param articles - Articles for this language
|
|
24
|
+
* @param metaMap - Map of article filename to real title and description
|
|
25
|
+
* @returns Complete HTML document
|
|
26
|
+
*/
|
|
27
|
+
export declare function generateIndexHTML(lang: string, articles: ParsedArticle[], metaMap?: Map<string, {
|
|
28
|
+
title: string;
|
|
29
|
+
description: string;
|
|
30
|
+
}>): string;
|
|
31
|
+
//# sourceMappingURL=news-indexes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"news-indexes.d.ts","sourceRoot":"","sources":["../../src/generators/news-indexes.ts"],"names":[],"mappings":";AA+CA,OAAO,KAAK,EAAE,aAAa,EAA0C,MAAM,mBAAmB,CAAC;AAE/F;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AA+FD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAa,GACvE,MAAM,CAqPR"}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-FileCopyrightText: 2024-2026 Hack23 AB
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
/**
|
|
5
|
+
* @module Generators/NewsIndexes
|
|
6
|
+
* @description Generates index.html files for each language listing all news articles.
|
|
7
|
+
* English is the primary homepage (index.html), other languages use index-{lang}.html.
|
|
8
|
+
* Design follows riksdagsmonitor patterns: compact language switcher, Hack23 AB footer.
|
|
9
|
+
*/
|
|
10
|
+
import path, { resolve } from 'path';
|
|
11
|
+
import { pathToFileURL } from 'url';
|
|
12
|
+
import { PROJECT_ROOT, APP_VERSION, NEWS_DIR } from '../constants/config.js';
|
|
13
|
+
import { ALL_LANGUAGES, LANGUAGE_NAMES, LANGUAGE_FLAGS, PAGE_TITLES, PAGE_DESCRIPTIONS, SECTION_HEADINGS, NO_ARTICLES_MESSAGES, SKIP_LINK_TEXTS, AI_SECTION_CONTENT, FILTER_LABELS, ARTICLE_TYPE_LABELS, HEADER_SUBTITLE_LABELS, FOOTER_ABOUT_HEADING_LABELS, FOOTER_ABOUT_TEXT_LABELS, FOOTER_QUICK_LINKS_LABELS, FOOTER_BUILT_BY_LABELS, FOOTER_LANGUAGES_LABELS, getLocalizedString, getTextDirection, } from '../constants/languages.js';
|
|
14
|
+
import { getNewsArticles, groupArticlesByLanguage, formatSlug, parseArticleFilename, extractArticleMeta, escapeHTML, atomicWrite, } from '../utils/file-utils.js';
|
|
15
|
+
import { writeMetadataDatabase } from '../utils/news-metadata.js';
|
|
16
|
+
import { detectCategory } from '../utils/article-category.js';
|
|
17
|
+
/**
|
|
18
|
+
* Get the index filename for a given language code.
|
|
19
|
+
* English uses index.html (the primary homepage), others use index-{lang}.html.
|
|
20
|
+
*
|
|
21
|
+
* @param lang - Language code
|
|
22
|
+
* @returns Filename string
|
|
23
|
+
*/
|
|
24
|
+
export function getIndexFilename(lang) {
|
|
25
|
+
return lang === 'en' ? 'index.html' : `index-${lang}.html`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build the compact language switcher nav HTML.
|
|
29
|
+
* Uses flag emoji + language code, riksdagsmonitor style.
|
|
30
|
+
*
|
|
31
|
+
* @param currentLang - Active language code
|
|
32
|
+
* @returns HTML string
|
|
33
|
+
*/
|
|
34
|
+
function buildLangSwitcher(currentLang) {
|
|
35
|
+
return ALL_LANGUAGES.map((code) => {
|
|
36
|
+
const flag = getLocalizedString(LANGUAGE_FLAGS, code);
|
|
37
|
+
const name = getLocalizedString(LANGUAGE_NAMES, code);
|
|
38
|
+
const active = code === currentLang ? ' active' : '';
|
|
39
|
+
const href = getIndexFilename(code);
|
|
40
|
+
const current = code === currentLang ? ' aria-current="page"' : '';
|
|
41
|
+
const safeHref = escapeHTML(href);
|
|
42
|
+
const safeCode = escapeHTML(code);
|
|
43
|
+
const safeName = escapeHTML(name);
|
|
44
|
+
return `<a href="${safeHref}" class="lang-link${active}" hreflang="${safeCode}" lang="${safeCode}" title="${safeName}" aria-label="${safeName}"${current}>${flag} ${code.toUpperCase()}</a>`;
|
|
45
|
+
}).join('\n ');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build the language grid for the footer.
|
|
49
|
+
*
|
|
50
|
+
* @param currentLang - Active language code
|
|
51
|
+
* @returns HTML string for the language grid
|
|
52
|
+
*/
|
|
53
|
+
function buildFooterLanguageGrid(currentLang) {
|
|
54
|
+
return ALL_LANGUAGES.map((code) => {
|
|
55
|
+
const flag = getLocalizedString(LANGUAGE_FLAGS, code);
|
|
56
|
+
const name = getLocalizedString(LANGUAGE_NAMES, code);
|
|
57
|
+
const href = getIndexFilename(code);
|
|
58
|
+
const active = code === currentLang ? ' class="active"' : '';
|
|
59
|
+
const safeHref = escapeHTML(href);
|
|
60
|
+
const safeCode = escapeHTML(code);
|
|
61
|
+
const safeName = escapeHTML(name);
|
|
62
|
+
return `<a href="${safeHref}"${active} hreflang="${safeCode}">${flag} ${safeName}</a>`;
|
|
63
|
+
}).join('\n ');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Render a single news card element.
|
|
67
|
+
*
|
|
68
|
+
* @param article - Parsed article data
|
|
69
|
+
* @param meta - Real title and description extracted from the article HTML
|
|
70
|
+
* @param meta.title - Article title
|
|
71
|
+
* @param meta.description - Article description/excerpt
|
|
72
|
+
* @param categoryLabels - Optional localized article category labels
|
|
73
|
+
* @returns HTML string for one card
|
|
74
|
+
*/
|
|
75
|
+
function renderCard(article, meta, categoryLabels) {
|
|
76
|
+
const category = detectCategory(article.slug);
|
|
77
|
+
// Sanitize the category for safe use in CSS class names (allow only alphanumeric and hyphens)
|
|
78
|
+
const safeCategory = String(category).replace(/[^a-z0-9-]/gi, '');
|
|
79
|
+
const title = escapeHTML(meta.title || formatSlug(article.slug));
|
|
80
|
+
const badgeLabel = categoryLabels?.[category] ?? formatSlug(safeCategory);
|
|
81
|
+
const excerpt = meta.description
|
|
82
|
+
? `\n <p class="news-card__excerpt">${escapeHTML(meta.description)}</p>`
|
|
83
|
+
: '';
|
|
84
|
+
return `
|
|
85
|
+
<li class="news-card">
|
|
86
|
+
<a href="news/${escapeHTML(article.filename)}" class="news-card__link" lang="${escapeHTML(article.lang)}" hreflang="${escapeHTML(article.lang)}">
|
|
87
|
+
<div class="news-card__accent news-card__accent--${safeCategory}"></div>
|
|
88
|
+
<div class="news-card__body">
|
|
89
|
+
<div class="news-card__meta">
|
|
90
|
+
<span class="news-card__badge news-card__badge--${safeCategory}">${escapeHTML(badgeLabel)}</span>
|
|
91
|
+
<time class="news-card__date" datetime="${escapeHTML(article.date)}">${escapeHTML(article.date)}</time>
|
|
92
|
+
</div>
|
|
93
|
+
<h3 class="news-card__title">${title}</h3>${excerpt}
|
|
94
|
+
</div>
|
|
95
|
+
</a>
|
|
96
|
+
</li>`;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Build hreflang alternate link tags for SEO multi-language support.
|
|
100
|
+
*
|
|
101
|
+
* @returns HTML string of link elements
|
|
102
|
+
*/
|
|
103
|
+
function buildHreflangTags() {
|
|
104
|
+
const links = ALL_LANGUAGES.map((code) => {
|
|
105
|
+
const href = getIndexFilename(code);
|
|
106
|
+
return `<link rel="alternate" hreflang="${code}" href="${href}">`;
|
|
107
|
+
});
|
|
108
|
+
links.push('<link rel="alternate" hreflang="x-default" href="index.html">');
|
|
109
|
+
return links.join('\n ');
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Generate index HTML for a language.
|
|
113
|
+
*
|
|
114
|
+
* Produces a complete, standards-compliant HTML5 page with:
|
|
115
|
+
* - Sticky header with EU branding
|
|
116
|
+
* - Compact language switcher with flag + code
|
|
117
|
+
* - Hero section with page title and description
|
|
118
|
+
* - Responsive card grid for news articles
|
|
119
|
+
* - Accessible empty state when no articles exist
|
|
120
|
+
* - Hack23 AB multi-section footer (About, Quick Links, Built by Hack23, Languages)
|
|
121
|
+
*
|
|
122
|
+
* @param lang - Language code
|
|
123
|
+
* @param articles - Articles for this language
|
|
124
|
+
* @param metaMap - Map of article filename to real title and description
|
|
125
|
+
* @returns Complete HTML document
|
|
126
|
+
*/
|
|
127
|
+
export function generateIndexHTML(lang, articles, metaMap = new Map()) {
|
|
128
|
+
const title = getLocalizedString(PAGE_TITLES, lang);
|
|
129
|
+
const description = getLocalizedString(PAGE_DESCRIPTIONS, lang);
|
|
130
|
+
const heading = getLocalizedString(SECTION_HEADINGS, lang);
|
|
131
|
+
const noArticlesText = getLocalizedString(NO_ARTICLES_MESSAGES, lang);
|
|
132
|
+
const skipLinkText = getLocalizedString(SKIP_LINK_TEXTS, lang);
|
|
133
|
+
const dir = getTextDirection(lang);
|
|
134
|
+
const year = new Date().getFullYear();
|
|
135
|
+
const selfHref = getIndexFilename(lang);
|
|
136
|
+
const heroTitle = title.split(' - ')[0];
|
|
137
|
+
const filterLabels = getLocalizedString(FILTER_LABELS, lang);
|
|
138
|
+
const categoryLabels = getLocalizedString(ARTICLE_TYPE_LABELS, lang);
|
|
139
|
+
// Collect distinct categories from the current article set
|
|
140
|
+
const usedCategories = new Set();
|
|
141
|
+
for (const a of articles) {
|
|
142
|
+
usedCategories.add(detectCategory(a.slug));
|
|
143
|
+
}
|
|
144
|
+
const content = articles.length === 0
|
|
145
|
+
? `
|
|
146
|
+
<div class="empty-state">
|
|
147
|
+
<div class="empty-state__icon" aria-hidden="true">📰</div>
|
|
148
|
+
<p class="empty-state__text">${noArticlesText}</p>
|
|
149
|
+
</div>`
|
|
150
|
+
: `
|
|
151
|
+
<ul class="news-grid" role="list">
|
|
152
|
+
${articles
|
|
153
|
+
.map((a) => renderCard(a, metaMap.get(a.filename) ?? { title: formatSlug(a.slug), description: '' }, categoryLabels))
|
|
154
|
+
.join('\n')}
|
|
155
|
+
</ul>`;
|
|
156
|
+
const ai = getLocalizedString(AI_SECTION_CONTENT, lang);
|
|
157
|
+
// Build filter buttons from used categories (with article count)
|
|
158
|
+
const categoryCounts = new Map();
|
|
159
|
+
for (const a of articles) {
|
|
160
|
+
const cat = detectCategory(a.slug);
|
|
161
|
+
categoryCounts.set(cat, (categoryCounts.get(cat) ?? 0) + 1);
|
|
162
|
+
}
|
|
163
|
+
const filterButtons = articles.length > 0
|
|
164
|
+
? Array.from(usedCategories)
|
|
165
|
+
.sort()
|
|
166
|
+
.map((cat) => {
|
|
167
|
+
const safeCat = String(cat).replace(/[^a-z0-9-]/gi, '');
|
|
168
|
+
const label = categoryLabels[cat] ?? formatSlug(safeCat);
|
|
169
|
+
const count = categoryCounts.get(cat) ?? 0;
|
|
170
|
+
return `<button type="button" class="filter-btn" data-category="${safeCat}">${escapeHTML(label)}<span class="filter-btn__count">${count}</span></button>`;
|
|
171
|
+
})
|
|
172
|
+
.join('\n ')
|
|
173
|
+
: '';
|
|
174
|
+
const headerSubtitle = escapeHTML(getLocalizedString(HEADER_SUBTITLE_LABELS, lang));
|
|
175
|
+
const footerAboutHeading = escapeHTML(getLocalizedString(FOOTER_ABOUT_HEADING_LABELS, lang));
|
|
176
|
+
const footerAboutText = escapeHTML(getLocalizedString(FOOTER_ABOUT_TEXT_LABELS, lang));
|
|
177
|
+
const footerQuickLinksHeading = escapeHTML(getLocalizedString(FOOTER_QUICK_LINKS_LABELS, lang));
|
|
178
|
+
const footerBuiltByHeading = escapeHTML(getLocalizedString(FOOTER_BUILT_BY_LABELS, lang));
|
|
179
|
+
const footerLanguagesHeading = escapeHTML(getLocalizedString(FOOTER_LANGUAGES_LABELS, lang));
|
|
180
|
+
const canonicalUrl = `https://hack23.github.io/euparliamentmonitor/${selfHref}`;
|
|
181
|
+
return `<!DOCTYPE html>
|
|
182
|
+
<html lang="${lang}" dir="${dir}">
|
|
183
|
+
<head>
|
|
184
|
+
<meta charset="UTF-8">
|
|
185
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
186
|
+
<meta http-equiv="X-Content-Type-Options" content="nosniff">
|
|
187
|
+
<meta name="referrer" content="no-referrer">
|
|
188
|
+
<meta name="generator" content="EU Parliament Monitor v${escapeHTML(APP_VERSION)}">
|
|
189
|
+
<title>${title}</title>
|
|
190
|
+
<meta name="description" content="${description}">
|
|
191
|
+
<link rel="canonical" href="${canonicalUrl}">
|
|
192
|
+
<meta property="og:type" content="website">
|
|
193
|
+
<meta property="og:title" content="${heroTitle}">
|
|
194
|
+
<meta property="og:description" content="${description}">
|
|
195
|
+
<meta property="og:url" content="${canonicalUrl}">
|
|
196
|
+
<meta property="og:site_name" content="EU Parliament Monitor">
|
|
197
|
+
<meta property="og:locale" content="${lang}">
|
|
198
|
+
<meta property="og:image" content="https://hack23.github.io/euparliamentmonitor/images/og-image.jpg">
|
|
199
|
+
<meta property="og:image:width" content="1200">
|
|
200
|
+
<meta property="og:image:height" content="630">
|
|
201
|
+
<meta property="og:image:alt" content="EU Parliament Monitor — AI-Disrupted Parliamentary Intelligence">
|
|
202
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
203
|
+
<meta name="twitter:title" content="${heroTitle}">
|
|
204
|
+
<meta name="twitter:description" content="${description}">
|
|
205
|
+
<meta name="twitter:image" content="https://hack23.github.io/euparliamentmonitor/images/og-image.jpg">
|
|
206
|
+
<meta name="twitter:image:alt" content="EU Parliament Monitor — AI-Disrupted Parliamentary Intelligence">
|
|
207
|
+
${buildHreflangTags()}
|
|
208
|
+
<!-- Favicons -->
|
|
209
|
+
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
|
210
|
+
<link rel="icon" type="image/png" sizes="32x32" href="images/favicon-32x32.png">
|
|
211
|
+
<link rel="icon" type="image/png" sizes="16x16" href="images/favicon-16x16.png">
|
|
212
|
+
<link rel="apple-touch-icon" sizes="180x180" href="images/apple-touch-icon.png">
|
|
213
|
+
<link rel="manifest" href="site.webmanifest">
|
|
214
|
+
<meta name="theme-color" content="#003399">
|
|
215
|
+
<link rel="alternate" type="application/rss+xml" title="EU Parliament Monitor RSS" href="rss.xml">
|
|
216
|
+
<link rel="stylesheet" href="styles.css">
|
|
217
|
+
</head>
|
|
218
|
+
<body>
|
|
219
|
+
<a href="#main" class="skip-link">${skipLinkText}</a>
|
|
220
|
+
|
|
221
|
+
<header class="site-header" role="banner">
|
|
222
|
+
<div class="site-header__inner site-header__inner--stacked">
|
|
223
|
+
<a href="${selfHref}" class="site-header__brand" aria-label="${heroTitle}">
|
|
224
|
+
<picture class="site-header__logo-picture">
|
|
225
|
+
<source srcset="images/header-logo.webp" type="image/webp">
|
|
226
|
+
<img class="site-header__logo site-header__logo--header" src="images/header-logo.png" alt="" width="72" height="48" aria-hidden="true">
|
|
227
|
+
</picture>
|
|
228
|
+
<span>
|
|
229
|
+
<span class="site-header__title">${heroTitle}</span>
|
|
230
|
+
</span>
|
|
231
|
+
</a>
|
|
232
|
+
<nav class="site-header__langs" role="navigation" aria-label="Language selection">
|
|
233
|
+
${buildLangSwitcher(lang)}
|
|
234
|
+
</nav>
|
|
235
|
+
</div>
|
|
236
|
+
</header>
|
|
237
|
+
|
|
238
|
+
<section class="hero">
|
|
239
|
+
<div class="hero__inner">
|
|
240
|
+
<div class="hero__content">
|
|
241
|
+
<p class="hero__kicker">${headerSubtitle}</p>
|
|
242
|
+
<h1 class="hero__title">${heroTitle}</h1>
|
|
243
|
+
<p class="hero__description">${description}</p>
|
|
244
|
+
</div>
|
|
245
|
+
<picture class="hero__banner">
|
|
246
|
+
<source srcset="images/banner.webp" type="image/webp">
|
|
247
|
+
<img src="images/banner.jpg" alt="EU Parliament Monitor — AI-Disrupted Parliamentary Intelligence" class="hero__banner-img" width="1200" height="400" loading="eager">
|
|
248
|
+
</picture>
|
|
249
|
+
</div>
|
|
250
|
+
</section>
|
|
251
|
+
|
|
252
|
+
<main id="main" class="site-main">
|
|
253
|
+
<h2 class="section-heading"><span class="section-heading__icon" aria-hidden="true">📋</span> ${heading}</h2>${articles.length > 0
|
|
254
|
+
? `
|
|
255
|
+
<div class="filter-toolbar" role="toolbar" aria-label="Filter articles">
|
|
256
|
+
<div class="filter-buttons">
|
|
257
|
+
<button type="button" class="filter-btn active" data-category="all">${escapeHTML(filterLabels.all)}<span class="filter-btn__count">${articles.length}</span></button>
|
|
258
|
+
${filterButtons}
|
|
259
|
+
</div>
|
|
260
|
+
<div class="filter-search">
|
|
261
|
+
<input type="search" class="filter-search__input" placeholder="${escapeHTML(filterLabels.search)}" aria-label="${escapeHTML(filterLabels.search)}">
|
|
262
|
+
</div>
|
|
263
|
+
</div>`
|
|
264
|
+
: ''}
|
|
265
|
+
${content}
|
|
266
|
+
</main>
|
|
267
|
+
|
|
268
|
+
<section class="ai-intelligence" aria-labelledby="ai-heading">
|
|
269
|
+
<h2 id="ai-heading"><span aria-hidden="true">🤖</span> ${escapeHTML(ai.heading)}</h2>
|
|
270
|
+
<blockquote class="ai-intelligence__quote">${escapeHTML(ai.quote)}</blockquote>
|
|
271
|
+
<p>${escapeHTML(ai.description)}</p>
|
|
272
|
+
<ul class="ai-intelligence__features">
|
|
273
|
+
<li><strong>${escapeHTML(ai.featureAgents)}</strong> — ${escapeHTML(ai.featureAgentsDesc)}</li>
|
|
274
|
+
<li><strong>${escapeHTML(ai.featureSchedule)}</strong> — ${escapeHTML(ai.featureScheduleDesc)}</li>
|
|
275
|
+
<li><strong>${escapeHTML(ai.featureHuman)}</strong> — ${escapeHTML(ai.featureHumanDesc)}</li>
|
|
276
|
+
<li><strong>${escapeHTML(ai.featureData)}</strong> — ${escapeHTML(ai.featureDataDesc)}</li>
|
|
277
|
+
</ul>
|
|
278
|
+
</section>
|
|
279
|
+
|
|
280
|
+
<footer class="site-footer" role="contentinfo">
|
|
281
|
+
<div class="footer-content">
|
|
282
|
+
<div class="footer-section">
|
|
283
|
+
<h3>${footerAboutHeading}</h3>
|
|
284
|
+
<p>${footerAboutText}</p>
|
|
285
|
+
<p class="footer-stats">${articles.length} articles available</p>
|
|
286
|
+
</div>
|
|
287
|
+
<div class="footer-section">
|
|
288
|
+
<h3>${footerQuickLinksHeading}</h3>
|
|
289
|
+
<ul>
|
|
290
|
+
<li><a href="index.html">Home</a></li>
|
|
291
|
+
<li><a href="sitemap.html">Sitemap</a></li>
|
|
292
|
+
<li><a href="rss.xml">RSS Feed</a></li>
|
|
293
|
+
<li><a href="https://github.com/Hack23/euparliamentmonitor">GitHub Repository</a></li>
|
|
294
|
+
<li><a href="https://github.com/Hack23/euparliamentmonitor/blob/main/LICENSE">Apache-2.0 License</a></li>
|
|
295
|
+
<li><a href="https://www.europarl.europa.eu/">European Parliament</a></li>
|
|
296
|
+
</ul>
|
|
297
|
+
</div>
|
|
298
|
+
<div class="footer-section">
|
|
299
|
+
<h3>${footerBuiltByHeading}</h3>
|
|
300
|
+
<ul>
|
|
301
|
+
<li><a href="https://hack23.com">hack23.com</a></li>
|
|
302
|
+
<li><a href="https://www.linkedin.com/company/hack23">LinkedIn</a></li>
|
|
303
|
+
<li><a href="https://github.com/Hack23/ISMS-PUBLIC">Security & Privacy Policy</a></li>
|
|
304
|
+
<li><a href="mailto:james@hack23.com">Contact</a></li>
|
|
305
|
+
</ul>
|
|
306
|
+
</div>
|
|
307
|
+
<div class="footer-section">
|
|
308
|
+
<h3>${footerLanguagesHeading}</h3>
|
|
309
|
+
<div class="language-grid">
|
|
310
|
+
${buildFooterLanguageGrid(lang)}
|
|
311
|
+
</div>
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
<div class="footer-bottom">
|
|
315
|
+
<p>© 2008-${year} <a href="https://hack23.com">Hack23 AB</a> (Org.nr 5595347807) | Gothenburg, Sweden | v${escapeHTML(APP_VERSION)}</p>
|
|
316
|
+
<p class="footer-disclaimer"><span aria-hidden="true">⚠️</span> This platform is under ongoing improvement. Please <a href="https://github.com/Hack23/euparliamentmonitor/issues">report any issues on GitHub</a>.</p>
|
|
317
|
+
</div>
|
|
318
|
+
</footer>
|
|
319
|
+
|
|
320
|
+
<script>
|
|
321
|
+
(function(){
|
|
322
|
+
var toolbar=document.querySelector('.filter-toolbar');
|
|
323
|
+
if(!toolbar)return;
|
|
324
|
+
var buttons=toolbar.querySelectorAll('.filter-btn');
|
|
325
|
+
var search=toolbar.querySelector('.filter-search__input');
|
|
326
|
+
var cards=document.querySelectorAll('.news-card');
|
|
327
|
+
function filterCards(){
|
|
328
|
+
var cat=toolbar.querySelector('.filter-btn.active');
|
|
329
|
+
var activeCat=cat?cat.getAttribute('data-category'):'all';
|
|
330
|
+
var query=search?search.value.toLowerCase():'';
|
|
331
|
+
cards.forEach(function(card){
|
|
332
|
+
var badge=card.querySelector('.news-card__badge');
|
|
333
|
+
var cardCat=badge?badge.className.replace(/.*news-card__badge--/,''):'';
|
|
334
|
+
var title=card.querySelector('.news-card__title');
|
|
335
|
+
var text=(title?title.textContent:'').toLowerCase();
|
|
336
|
+
var excerpt=card.querySelector('.news-card__excerpt');
|
|
337
|
+
var excerptText=(excerpt?excerpt.textContent:'').toLowerCase();
|
|
338
|
+
var matchCat=activeCat==='all'||cardCat===activeCat;
|
|
339
|
+
var matchSearch=!query||text.indexOf(query)!==-1||excerptText.indexOf(query)!==-1;
|
|
340
|
+
card.style.display=matchCat&&matchSearch?'':'none';
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
buttons.forEach(function(btn){
|
|
344
|
+
btn.addEventListener('click',function(){
|
|
345
|
+
buttons.forEach(function(b){b.classList.remove('active')});
|
|
346
|
+
btn.classList.add('active');
|
|
347
|
+
filterCards();
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
if(search){search.addEventListener('input',filterCards);}
|
|
351
|
+
})();
|
|
352
|
+
</script>
|
|
353
|
+
</body>
|
|
354
|
+
</html>`;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Main execution - generates index files for all languages.
|
|
358
|
+
* English generates index.html (primary homepage), others generate index-{lang}.html.
|
|
359
|
+
*/
|
|
360
|
+
function main() {
|
|
361
|
+
console.log('📰 Generating news indexes...');
|
|
362
|
+
const articles = getNewsArticles();
|
|
363
|
+
console.log(`📊 Found ${articles.length} articles`);
|
|
364
|
+
const grouped = groupArticlesByLanguage(articles, ALL_LANGUAGES);
|
|
365
|
+
// Build metadata map (real titles + descriptions from each article HTML)
|
|
366
|
+
const metaBuildTimerLabel = `⏱️ Built metadata map for ${articles.length} articles`;
|
|
367
|
+
console.time(metaBuildTimerLabel);
|
|
368
|
+
const metaMap = new Map();
|
|
369
|
+
for (const filename of articles) {
|
|
370
|
+
const filepath = path.join(NEWS_DIR, filename);
|
|
371
|
+
metaMap.set(filename, extractArticleMeta(filepath));
|
|
372
|
+
}
|
|
373
|
+
console.timeEnd(metaBuildTimerLabel);
|
|
374
|
+
// Also update the metadata database, reusing the already-extracted meta to avoid re-reading files
|
|
375
|
+
const dbArticles = articles
|
|
376
|
+
.map((filename) => {
|
|
377
|
+
const parsed = parseArticleFilename(filename);
|
|
378
|
+
if (!parsed)
|
|
379
|
+
return null;
|
|
380
|
+
const meta = metaMap.get(filename) ?? { title: '', description: '' };
|
|
381
|
+
return {
|
|
382
|
+
filename: parsed.filename,
|
|
383
|
+
date: parsed.date,
|
|
384
|
+
slug: parsed.slug,
|
|
385
|
+
lang: parsed.lang,
|
|
386
|
+
title: meta.title || formatSlug(parsed.slug),
|
|
387
|
+
description: meta.description,
|
|
388
|
+
};
|
|
389
|
+
})
|
|
390
|
+
.filter((e) => e !== null);
|
|
391
|
+
dbArticles.sort((a, b) => b.date.localeCompare(a.date));
|
|
392
|
+
writeMetadataDatabase({ lastUpdated: new Date().toISOString(), articles: dbArticles });
|
|
393
|
+
console.log('📝 Updated articles metadata database');
|
|
394
|
+
let generated = 0;
|
|
395
|
+
for (const lang of ALL_LANGUAGES) {
|
|
396
|
+
const langArticles = grouped[lang] ?? [];
|
|
397
|
+
const html = generateIndexHTML(lang, langArticles, metaMap);
|
|
398
|
+
const filename = getIndexFilename(lang);
|
|
399
|
+
const filepath = path.join(PROJECT_ROOT, filename);
|
|
400
|
+
atomicWrite(filepath, html);
|
|
401
|
+
console.log(` ✅ Generated ${filename} (${langArticles.length} articles)`);
|
|
402
|
+
generated++;
|
|
403
|
+
}
|
|
404
|
+
console.log(`✅ Generated ${generated} index files`);
|
|
405
|
+
}
|
|
406
|
+
// Only run main when executed directly (not when imported)
|
|
407
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) {
|
|
408
|
+
main();
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=news-indexes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"news-indexes.js","sourceRoot":"","sources":["../../src/generators/news-indexes.ts"],"names":[],"mappings":"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"}
|