riksdagsmonitor 0.8.23 → 0.8.24
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/README.md +53 -1
- package/dist/lib/dashboards/party-dashboard.js +2 -1
- package/dist/lib/dashboards/party-dashboard.js.map +1 -1
- package/dist/lib/dashboards/risk-dashboard.js +2 -1
- package/dist/lib/dashboards/risk-dashboard.js.map +1 -1
- package/dist/lib/shared/index.d.ts +0 -1
- package/dist/lib/shared/index.d.ts.map +1 -1
- package/dist/lib/shared/index.js +3 -1
- package/dist/lib/shared/index.js.map +1 -1
- package/dist/lib/shared/register-globals.d.ts +1 -1
- package/dist/lib/shared/register-globals.d.ts.map +1 -1
- package/dist/lib/shared/register-globals.js +7 -1
- package/dist/lib/shared/register-globals.js.map +1 -1
- package/package.json +53 -21
- package/dist/scripts/analysis-reader.d.ts +0 -241
- package/dist/scripts/analysis-reader.d.ts.map +0 -1
- package/dist/scripts/analysis-reader.js +0 -531
- package/dist/scripts/analysis-reader.js.map +0 -1
- package/dist/scripts/article-quality-enhancer.d.ts +0 -148
- package/dist/scripts/article-quality-enhancer.d.ts.map +0 -1
- package/dist/scripts/article-quality-enhancer.js +0 -430
- package/dist/scripts/article-quality-enhancer.js.map +0 -1
- package/dist/scripts/article-template/constants.d.ts +0 -104
- package/dist/scripts/article-template/constants.d.ts.map +0 -1
- package/dist/scripts/article-template/constants.js +0 -225
- package/dist/scripts/article-template/constants.js.map +0 -1
- package/dist/scripts/article-template/helpers.d.ts +0 -83
- package/dist/scripts/article-template/helpers.d.ts.map +0 -1
- package/dist/scripts/article-template/helpers.js +0 -236
- package/dist/scripts/article-template/helpers.js.map +0 -1
- package/dist/scripts/article-template/index.d.ts +0 -39
- package/dist/scripts/article-template/index.d.ts.map +0 -1
- package/dist/scripts/article-template/index.js +0 -37
- package/dist/scripts/article-template/index.js.map +0 -1
- package/dist/scripts/article-template/registry.d.ts +0 -64
- package/dist/scripts/article-template/registry.d.ts.map +0 -1
- package/dist/scripts/article-template/registry.js +0 -405
- package/dist/scripts/article-template/registry.js.map +0 -1
- package/dist/scripts/article-template/template.d.ts +0 -18
- package/dist/scripts/article-template/template.d.ts.map +0 -1
- package/dist/scripts/article-template/template.js +0 -359
- package/dist/scripts/article-template/template.js.map +0 -1
- package/dist/scripts/article-template/types.d.ts +0 -90
- package/dist/scripts/article-template/types.d.ts.map +0 -1
- package/dist/scripts/article-template/types.js +0 -96
- package/dist/scripts/article-template/types.js.map +0 -1
- package/dist/scripts/article-template.d.ts +0 -18
- package/dist/scripts/article-template.d.ts.map +0 -1
- package/dist/scripts/article-template.js +0 -18
- package/dist/scripts/article-template.js.map +0 -1
- package/dist/scripts/catalog-downloaded-data.d.ts +0 -66
- package/dist/scripts/catalog-downloaded-data.d.ts.map +0 -1
- package/dist/scripts/catalog-downloaded-data.js +0 -239
- package/dist/scripts/catalog-downloaded-data.js.map +0 -1
- package/dist/scripts/check-cia-schema-updates.d.ts +0 -186
- package/dist/scripts/check-cia-schema-updates.d.ts.map +0 -1
- package/dist/scripts/check-cia-schema-updates.js +0 -363
- package/dist/scripts/check-cia-schema-updates.js.map +0 -1
- package/dist/scripts/data-transformers/calendar.d.ts +0 -16
- package/dist/scripts/data-transformers/calendar.d.ts.map +0 -1
- package/dist/scripts/data-transformers/calendar.js +0 -137
- package/dist/scripts/data-transformers/calendar.js.map +0 -1
- package/dist/scripts/data-transformers/constants/committee-names.d.ts +0 -15
- package/dist/scripts/data-transformers/constants/committee-names.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/committee-names.js +0 -30
- package/dist/scripts/data-transformers/constants/committee-names.js.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts +0 -11
- package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels-part1.js +0 -900
- package/dist/scripts/data-transformers/constants/content-labels-part1.js.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts +0 -11
- package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels-part2.js +0 -900
- package/dist/scripts/data-transformers/constants/content-labels-part2.js.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels.d.ts +0 -13
- package/dist/scripts/data-transformers/constants/content-labels.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels.js +0 -18
- package/dist/scripts/data-transformers/constants/content-labels.js.map +0 -1
- package/dist/scripts/data-transformers/constants/index.d.ts +0 -15
- package/dist/scripts/data-transformers/constants/index.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/index.js +0 -15
- package/dist/scripts/data-transformers/constants/index.js.map +0 -1
- package/dist/scripts/data-transformers/constants/locale-map.d.ts +0 -13
- package/dist/scripts/data-transformers/constants/locale-map.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/locale-map.js +0 -17
- package/dist/scripts/data-transformers/constants/locale-map.js.map +0 -1
- package/dist/scripts/data-transformers/constants.d.ts +0 -14
- package/dist/scripts/data-transformers/constants.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants.js +0 -14
- package/dist/scripts/data-transformers/constants.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts +0 -64
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js +0 -805
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts +0 -50
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.js +0 -310
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/committee.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/committee.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/committee.js +0 -247
- package/dist/scripts/data-transformers/content-generators/committee.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts +0 -124
- package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/dashboard-section.js +0 -564
- package/dist/scripts/data-transformers/content-generators/dashboard-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts +0 -82
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js +0 -321
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/generic.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/generic.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/generic.js +0 -295
- package/dist/scripts/data-transformers/content-generators/generic.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/index.d.ts +0 -84
- package/dist/scripts/data-transformers/content-generators/index.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/index.js +0 -47
- package/dist/scripts/data-transformers/content-generators/index.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/interpellations.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/interpellations.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/interpellations.js +0 -124
- package/dist/scripts/data-transformers/content-generators/interpellations.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts +0 -137
- package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/mindmap-section.js +0 -286
- package/dist/scripts/data-transformers/content-generators/mindmap-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts +0 -17
- package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/month-ahead.js +0 -212
- package/dist/scripts/data-transformers/content-generators/month-ahead.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts +0 -17
- package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/monthly-review.js +0 -173
- package/dist/scripts/data-transformers/content-generators/monthly-review.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/motions.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/motions.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/motions.js +0 -158
- package/dist/scripts/data-transformers/content-generators/motions.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts +0 -62
- package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/newsworthiness.js +0 -254
- package/dist/scripts/data-transformers/content-generators/newsworthiness.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/propositions.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/propositions.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/propositions.js +0 -263
- package/dist/scripts/data-transformers/content-generators/propositions.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts +0 -92
- package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/sankey-section.js +0 -257
- package/dist/scripts/data-transformers/content-generators/sankey-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/shared.d.ts +0 -139
- package/dist/scripts/data-transformers/content-generators/shared.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/shared.js +0 -935
- package/dist/scripts/data-transformers/content-generators/shared.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/swot-section.d.ts +0 -50
- package/dist/scripts/data-transformers/content-generators/swot-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/swot-section.js +0 -177
- package/dist/scripts/data-transformers/content-generators/swot-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/week-ahead.js +0 -332
- package/dist/scripts/data-transformers/content-generators/week-ahead.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators.d.ts +0 -15
- package/dist/scripts/data-transformers/content-generators.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators.js +0 -14
- package/dist/scripts/data-transformers/content-generators.js.map +0 -1
- package/dist/scripts/data-transformers/document-analysis.d.ts +0 -58
- package/dist/scripts/data-transformers/document-analysis.d.ts.map +0 -1
- package/dist/scripts/data-transformers/document-analysis.js +0 -396
- package/dist/scripts/data-transformers/document-analysis.js.map +0 -1
- package/dist/scripts/data-transformers/helpers.d.ts +0 -144
- package/dist/scripts/data-transformers/helpers.d.ts.map +0 -1
- package/dist/scripts/data-transformers/helpers.js +0 -408
- package/dist/scripts/data-transformers/helpers.js.map +0 -1
- package/dist/scripts/data-transformers/index.d.ts +0 -45
- package/dist/scripts/data-transformers/index.d.ts.map +0 -1
- package/dist/scripts/data-transformers/index.js +0 -66
- package/dist/scripts/data-transformers/index.js.map +0 -1
- package/dist/scripts/data-transformers/metadata.d.ts +0 -42
- package/dist/scripts/data-transformers/metadata.d.ts.map +0 -1
- package/dist/scripts/data-transformers/metadata.js +0 -385
- package/dist/scripts/data-transformers/metadata.js.map +0 -1
- package/dist/scripts/data-transformers/policy-analysis.d.ts +0 -105
- package/dist/scripts/data-transformers/policy-analysis.d.ts.map +0 -1
- package/dist/scripts/data-transformers/policy-analysis.js +0 -686
- package/dist/scripts/data-transformers/policy-analysis.js.map +0 -1
- package/dist/scripts/data-transformers/risk-analysis.d.ts +0 -104
- package/dist/scripts/data-transformers/risk-analysis.d.ts.map +0 -1
- package/dist/scripts/data-transformers/risk-analysis.js +0 -279
- package/dist/scripts/data-transformers/risk-analysis.js.map +0 -1
- package/dist/scripts/data-transformers/types.d.ts +0 -260
- package/dist/scripts/data-transformers/types.d.ts.map +0 -1
- package/dist/scripts/data-transformers/types.js +0 -11
- package/dist/scripts/data-transformers/types.js.map +0 -1
- package/dist/scripts/data-transformers.d.ts +0 -23
- package/dist/scripts/data-transformers.d.ts.map +0 -1
- package/dist/scripts/data-transformers.js +0 -35
- package/dist/scripts/data-transformers.js.map +0 -1
- package/dist/scripts/deep-inspection/index.d.ts +0 -55
- package/dist/scripts/deep-inspection/index.d.ts.map +0 -1
- package/dist/scripts/deep-inspection/index.js +0 -66
- package/dist/scripts/deep-inspection/index.js.map +0 -1
- package/dist/scripts/detect-swedish-leakage.d.ts +0 -69
- package/dist/scripts/detect-swedish-leakage.d.ts.map +0 -1
- package/dist/scripts/detect-swedish-leakage.js +0 -417
- package/dist/scripts/detect-swedish-leakage.js.map +0 -1
- package/dist/scripts/editorial-framework.d.ts +0 -121
- package/dist/scripts/editorial-framework.d.ts.map +0 -1
- package/dist/scripts/editorial-framework.js +0 -364
- package/dist/scripts/editorial-framework.js.map +0 -1
- package/dist/scripts/editorial-pillars.d.ts +0 -43
- package/dist/scripts/editorial-pillars.d.ts.map +0 -1
- package/dist/scripts/editorial-pillars.js +0 -215
- package/dist/scripts/editorial-pillars.js.map +0 -1
- package/dist/scripts/extract-news-metadata.d.ts +0 -12
- package/dist/scripts/extract-news-metadata.d.ts.map +0 -1
- package/dist/scripts/extract-news-metadata.js +0 -107
- package/dist/scripts/extract-news-metadata.js.map +0 -1
- package/dist/scripts/extract-vocabulary.d.ts +0 -15
- package/dist/scripts/extract-vocabulary.d.ts.map +0 -1
- package/dist/scripts/extract-vocabulary.js +0 -255
- package/dist/scripts/extract-vocabulary.js.map +0 -1
- package/dist/scripts/fix-article-navigation.d.ts +0 -37
- package/dist/scripts/fix-article-navigation.d.ts.map +0 -1
- package/dist/scripts/fix-article-navigation.js +0 -198
- package/dist/scripts/fix-article-navigation.js.map +0 -1
- package/dist/scripts/fix-keywords-localization.d.ts +0 -18
- package/dist/scripts/fix-keywords-localization.d.ts.map +0 -1
- package/dist/scripts/fix-keywords-localization.js +0 -270
- package/dist/scripts/fix-keywords-localization.js.map +0 -1
- package/dist/scripts/fix-old-articles-branding.d.ts +0 -17
- package/dist/scripts/fix-old-articles-branding.d.ts.map +0 -1
- package/dist/scripts/fix-old-articles-branding.js +0 -229
- package/dist/scripts/fix-old-articles-branding.js.map +0 -1
- package/dist/scripts/generate-news-backport.d.ts +0 -16
- package/dist/scripts/generate-news-backport.d.ts.map +0 -1
- package/dist/scripts/generate-news-backport.js +0 -379
- package/dist/scripts/generate-news-backport.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts +0 -141
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js +0 -546
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts +0 -59
- package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/analysis-cache.js +0 -116
- package/dist/scripts/generate-news-enhanced/analysis-cache.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts +0 -58
- package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/analysis-labels.js +0 -144
- package/dist/scripts/generate-news-enhanced/analysis-labels.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/config.d.ts +0 -58
- package/dist/scripts/generate-news-enhanced/config.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/config.js +0 -286
- package/dist/scripts/generate-news-enhanced/config.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/generators.d.ts +0 -119
- package/dist/scripts/generate-news-enhanced/generators.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/generators.js +0 -2131
- package/dist/scripts/generate-news-enhanced/generators.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/helpers.d.ts +0 -122
- package/dist/scripts/generate-news-enhanced/helpers.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/helpers.js +0 -468
- package/dist/scripts/generate-news-enhanced/helpers.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/index.d.ts +0 -19
- package/dist/scripts/generate-news-enhanced/index.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/index.js +0 -221
- package/dist/scripts/generate-news-enhanced/index.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts +0 -46
- package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/swot-analyzer.js +0 -1227
- package/dist/scripts/generate-news-enhanced/swot-analyzer.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/types.d.ts +0 -34
- package/dist/scripts/generate-news-enhanced/types.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/types.js +0 -9
- package/dist/scripts/generate-news-enhanced/types.js.map +0 -1
- package/dist/scripts/generate-news-enhanced.d.ts +0 -25
- package/dist/scripts/generate-news-enhanced.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced.js +0 -37
- package/dist/scripts/generate-news-enhanced.js.map +0 -1
- package/dist/scripts/generate-news-indexes/constants.d.ts +0 -20
- package/dist/scripts/generate-news-indexes/constants.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/constants.js +0 -308
- package/dist/scripts/generate-news-indexes/constants.js.map +0 -1
- package/dist/scripts/generate-news-indexes/helpers.d.ts +0 -73
- package/dist/scripts/generate-news-indexes/helpers.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/helpers.js +0 -352
- package/dist/scripts/generate-news-indexes/helpers.js.map +0 -1
- package/dist/scripts/generate-news-indexes/index.d.ts +0 -20
- package/dist/scripts/generate-news-indexes/index.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/index.js +0 -75
- package/dist/scripts/generate-news-indexes/index.js.map +0 -1
- package/dist/scripts/generate-news-indexes/template.d.ts +0 -25
- package/dist/scripts/generate-news-indexes/template.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/template.js +0 -644
- package/dist/scripts/generate-news-indexes/template.js.map +0 -1
- package/dist/scripts/generate-news-indexes/types.d.ts +0 -96
- package/dist/scripts/generate-news-indexes/types.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/types.js +0 -9
- package/dist/scripts/generate-news-indexes/types.js.map +0 -1
- package/dist/scripts/generate-news-indexes.d.ts +0 -20
- package/dist/scripts/generate-news-indexes.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes.js +0 -19
- package/dist/scripts/generate-news-indexes.js.map +0 -1
- package/dist/scripts/generate-rss.d.ts +0 -48
- package/dist/scripts/generate-rss.d.ts.map +0 -1
- package/dist/scripts/generate-rss.js +0 -299
- package/dist/scripts/generate-rss.js.map +0 -1
- package/dist/scripts/generate-sitemap-html.d.ts +0 -79
- package/dist/scripts/generate-sitemap-html.d.ts.map +0 -1
- package/dist/scripts/generate-sitemap-html.js +0 -878
- package/dist/scripts/generate-sitemap-html.js.map +0 -1
- package/dist/scripts/generate-sitemap.d.ts +0 -23
- package/dist/scripts/generate-sitemap.d.ts.map +0 -1
- package/dist/scripts/generate-sitemap.js +0 -476
- package/dist/scripts/generate-sitemap.js.map +0 -1
- package/dist/scripts/generate-types-from-cia-schemas.d.ts +0 -176
- package/dist/scripts/generate-types-from-cia-schemas.d.ts.map +0 -1
- package/dist/scripts/generate-types-from-cia-schemas.js +0 -318
- package/dist/scripts/generate-types-from-cia-schemas.js.map +0 -1
- package/dist/scripts/government-role-validator.d.ts +0 -65
- package/dist/scripts/government-role-validator.d.ts.map +0 -1
- package/dist/scripts/government-role-validator.js +0 -217
- package/dist/scripts/government-role-validator.js.map +0 -1
- package/dist/scripts/html-utils.d.ts +0 -17
- package/dist/scripts/html-utils.d.ts.map +0 -1
- package/dist/scripts/html-utils.js +0 -29
- package/dist/scripts/html-utils.js.map +0 -1
- package/dist/scripts/load-cia-stats.d.ts +0 -89
- package/dist/scripts/load-cia-stats.d.ts.map +0 -1
- package/dist/scripts/load-cia-stats.js +0 -400
- package/dist/scripts/load-cia-stats.js.map +0 -1
- package/dist/scripts/mcp-client/client.d.ts +0 -73
- package/dist/scripts/mcp-client/client.d.ts.map +0 -1
- package/dist/scripts/mcp-client/client.js +0 -526
- package/dist/scripts/mcp-client/client.js.map +0 -1
- package/dist/scripts/mcp-client/document-types.d.ts +0 -23
- package/dist/scripts/mcp-client/document-types.d.ts.map +0 -1
- package/dist/scripts/mcp-client/document-types.js +0 -62
- package/dist/scripts/mcp-client/document-types.js.map +0 -1
- package/dist/scripts/mcp-client/index.d.ts +0 -34
- package/dist/scripts/mcp-client/index.d.ts.map +0 -1
- package/dist/scripts/mcp-client/index.js +0 -67
- package/dist/scripts/mcp-client/index.js.map +0 -1
- package/dist/scripts/mcp-client/transport.d.ts +0 -32
- package/dist/scripts/mcp-client/transport.d.ts.map +0 -1
- package/dist/scripts/mcp-client/transport.js +0 -102
- package/dist/scripts/mcp-client/transport.js.map +0 -1
- package/dist/scripts/mcp-client.d.ts +0 -18
- package/dist/scripts/mcp-client.d.ts.map +0 -1
- package/dist/scripts/mcp-client.js +0 -18
- package/dist/scripts/mcp-client.js.map +0 -1
- package/dist/scripts/mcp-query-cli.d.ts +0 -25
- package/dist/scripts/mcp-query-cli.d.ts.map +0 -1
- package/dist/scripts/mcp-query-cli.js +0 -66
- package/dist/scripts/mcp-query-cli.js.map +0 -1
- package/dist/scripts/news-types/breaking-news.d.ts +0 -178
- package/dist/scripts/news-types/breaking-news.d.ts.map +0 -1
- package/dist/scripts/news-types/breaking-news.js +0 -432
- package/dist/scripts/news-types/breaking-news.js.map +0 -1
- package/dist/scripts/news-types/committee-reports.d.ts +0 -212
- package/dist/scripts/news-types/committee-reports.d.ts.map +0 -1
- package/dist/scripts/news-types/committee-reports.js +0 -404
- package/dist/scripts/news-types/committee-reports.js.map +0 -1
- package/dist/scripts/news-types/month-ahead.d.ts +0 -71
- package/dist/scripts/news-types/month-ahead.d.ts.map +0 -1
- package/dist/scripts/news-types/month-ahead.js +0 -392
- package/dist/scripts/news-types/month-ahead.js.map +0 -1
- package/dist/scripts/news-types/monthly-review.d.ts +0 -61
- package/dist/scripts/news-types/monthly-review.d.ts.map +0 -1
- package/dist/scripts/news-types/monthly-review.js +0 -417
- package/dist/scripts/news-types/monthly-review.js.map +0 -1
- package/dist/scripts/news-types/motions.d.ts +0 -214
- package/dist/scripts/news-types/motions.d.ts.map +0 -1
- package/dist/scripts/news-types/motions.js +0 -447
- package/dist/scripts/news-types/motions.js.map +0 -1
- package/dist/scripts/news-types/propositions.d.ts +0 -204
- package/dist/scripts/news-types/propositions.d.ts.map +0 -1
- package/dist/scripts/news-types/propositions.js +0 -401
- package/dist/scripts/news-types/propositions.js.map +0 -1
- package/dist/scripts/news-types/week-ahead.d.ts +0 -231
- package/dist/scripts/news-types/week-ahead.d.ts.map +0 -1
- package/dist/scripts/news-types/week-ahead.js +0 -441
- package/dist/scripts/news-types/week-ahead.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/analysis.d.ts +0 -47
- package/dist/scripts/news-types/weekly-review/analysis.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/analysis.js +0 -276
- package/dist/scripts/news-types/weekly-review/analysis.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/data-loader.d.ts +0 -51
- package/dist/scripts/news-types/weekly-review/data-loader.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/data-loader.js +0 -298
- package/dist/scripts/news-types/weekly-review/data-loader.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/generator.d.ts +0 -18
- package/dist/scripts/news-types/weekly-review/generator.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/generator.js +0 -284
- package/dist/scripts/news-types/weekly-review/generator.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/index.d.ts +0 -20
- package/dist/scripts/news-types/weekly-review/index.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/index.js +0 -23
- package/dist/scripts/news-types/weekly-review/index.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/types.d.ts +0 -72
- package/dist/scripts/news-types/weekly-review/types.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/types.js +0 -20
- package/dist/scripts/news-types/weekly-review/types.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/validation.d.ts +0 -10
- package/dist/scripts/news-types/weekly-review/validation.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/validation.js +0 -95
- package/dist/scripts/news-types/weekly-review/validation.js.map +0 -1
- package/dist/scripts/news-types/weekly-review.d.ts +0 -15
- package/dist/scripts/news-types/weekly-review.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review.js +0 -14
- package/dist/scripts/news-types/weekly-review.js.map +0 -1
- package/dist/scripts/party-variants.d.ts +0 -23
- package/dist/scripts/party-variants.d.ts.map +0 -1
- package/dist/scripts/party-variants.js +0 -50
- package/dist/scripts/party-variants.js.map +0 -1
- package/dist/scripts/pipeline/index.d.ts +0 -19
- package/dist/scripts/pipeline/index.d.ts.map +0 -1
- package/dist/scripts/pipeline/index.js +0 -17
- package/dist/scripts/pipeline/index.js.map +0 -1
- package/dist/scripts/pipeline/orchestrator.d.ts +0 -56
- package/dist/scripts/pipeline/orchestrator.d.ts.map +0 -1
- package/dist/scripts/pipeline/orchestrator.js +0 -147
- package/dist/scripts/pipeline/orchestrator.js.map +0 -1
- package/dist/scripts/pipeline/types.d.ts +0 -117
- package/dist/scripts/pipeline/types.d.ts.map +0 -1
- package/dist/scripts/pipeline/types.js +0 -13
- package/dist/scripts/pipeline/types.js.map +0 -1
- package/dist/scripts/pipeline/validation.d.ts +0 -66
- package/dist/scripts/pipeline/validation.d.ts.map +0 -1
- package/dist/scripts/pipeline/validation.js +0 -129
- package/dist/scripts/pipeline/validation.js.map +0 -1
- package/dist/scripts/populate-analysis-data.d.ts +0 -41
- package/dist/scripts/populate-analysis-data.d.ts.map +0 -1
- package/dist/scripts/populate-analysis-data.js +0 -255
- package/dist/scripts/populate-analysis-data.js.map +0 -1
- package/dist/scripts/pre-article-analysis/data-downloader.d.ts +0 -80
- package/dist/scripts/pre-article-analysis/data-downloader.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis/data-downloader.js +0 -230
- package/dist/scripts/pre-article-analysis/data-downloader.js.map +0 -1
- package/dist/scripts/pre-article-analysis/data-persistence.d.ts +0 -141
- package/dist/scripts/pre-article-analysis/data-persistence.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis/data-persistence.js +0 -345
- package/dist/scripts/pre-article-analysis/data-persistence.js.map +0 -1
- package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts +0 -158
- package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis/markdown-serializer.js +0 -648
- package/dist/scripts/pre-article-analysis/markdown-serializer.js.map +0 -1
- package/dist/scripts/pre-article-analysis/pdf-converter.d.ts +0 -58
- package/dist/scripts/pre-article-analysis/pdf-converter.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis/pdf-converter.js +0 -142
- package/dist/scripts/pre-article-analysis/pdf-converter.js.map +0 -1
- package/dist/scripts/pre-article-analysis.d.ts +0 -42
- package/dist/scripts/pre-article-analysis.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis.js +0 -642
- package/dist/scripts/pre-article-analysis.js.map +0 -1
- package/dist/scripts/scb-client.d.ts +0 -104
- package/dist/scripts/scb-client.d.ts.map +0 -1
- package/dist/scripts/scb-client.js +0 -286
- package/dist/scripts/scb-client.js.map +0 -1
- package/dist/scripts/scb-context.d.ts +0 -88
- package/dist/scripts/scb-context.d.ts.map +0 -1
- package/dist/scripts/scb-context.js +0 -307
- package/dist/scripts/scb-context.js.map +0 -1
- package/dist/scripts/shared/version.d.ts +0 -9
- package/dist/scripts/shared/version.d.ts.map +0 -1
- package/dist/scripts/shared/version.js +0 -28
- package/dist/scripts/shared/version.js.map +0 -1
- package/dist/scripts/statistical-claims-detector.d.ts +0 -119
- package/dist/scripts/statistical-claims-detector.d.ts.map +0 -1
- package/dist/scripts/statistical-claims-detector.js +0 -391
- package/dist/scripts/statistical-claims-detector.js.map +0 -1
- package/dist/scripts/sync-cia-schemas.d.ts +0 -52
- package/dist/scripts/sync-cia-schemas.d.ts.map +0 -1
- package/dist/scripts/sync-cia-schemas.js +0 -195
- package/dist/scripts/sync-cia-schemas.js.map +0 -1
- package/dist/scripts/translation-dictionary.d.ts +0 -45
- package/dist/scripts/translation-dictionary.d.ts.map +0 -1
- package/dist/scripts/translation-dictionary.js +0 -3642
- package/dist/scripts/translation-dictionary.js.map +0 -1
- package/dist/scripts/types/article.d.ts +0 -392
- package/dist/scripts/types/article.d.ts.map +0 -1
- package/dist/scripts/types/article.js +0 -6
- package/dist/scripts/types/article.js.map +0 -1
- package/dist/scripts/types/content.d.ts +0 -167
- package/dist/scripts/types/content.d.ts.map +0 -1
- package/dist/scripts/types/content.js +0 -6
- package/dist/scripts/types/content.js.map +0 -1
- package/dist/scripts/types/editorial.d.ts +0 -17
- package/dist/scripts/types/editorial.d.ts.map +0 -1
- package/dist/scripts/types/editorial.js +0 -6
- package/dist/scripts/types/editorial.js.map +0 -1
- package/dist/scripts/types/language.d.ts +0 -7
- package/dist/scripts/types/language.d.ts.map +0 -1
- package/dist/scripts/types/language.js +0 -6
- package/dist/scripts/types/language.js.map +0 -1
- package/dist/scripts/types/mcp.d.ts +0 -117
- package/dist/scripts/types/mcp.d.ts.map +0 -1
- package/dist/scripts/types/mcp.js +0 -6
- package/dist/scripts/types/mcp.js.map +0 -1
- package/dist/scripts/types/party.d.ts +0 -9
- package/dist/scripts/types/party.d.ts.map +0 -1
- package/dist/scripts/types/party.js +0 -6
- package/dist/scripts/types/party.js.map +0 -1
- package/dist/scripts/types/validation.d.ts +0 -136
- package/dist/scripts/types/validation.d.ts.map +0 -1
- package/dist/scripts/types/validation.js +0 -6
- package/dist/scripts/types/validation.js.map +0 -1
- package/dist/scripts/types/workflow.d.ts +0 -78
- package/dist/scripts/types/workflow.d.ts.map +0 -1
- package/dist/scripts/types/workflow.js +0 -6
- package/dist/scripts/types/workflow.js.map +0 -1
- package/dist/scripts/update-stats-from-cia.d.ts +0 -44
- package/dist/scripts/update-stats-from-cia.d.ts.map +0 -1
- package/dist/scripts/update-stats-from-cia.js +0 -310
- package/dist/scripts/update-stats-from-cia.js.map +0 -1
- package/dist/scripts/validate-against-cia-schemas.d.ts +0 -126
- package/dist/scripts/validate-against-cia-schemas.d.ts.map +0 -1
- package/dist/scripts/validate-against-cia-schemas.js +0 -299
- package/dist/scripts/validate-against-cia-schemas.js.map +0 -1
- package/dist/scripts/validate-cross-references.d.ts +0 -49
- package/dist/scripts/validate-cross-references.d.ts.map +0 -1
- package/dist/scripts/validate-cross-references.js +0 -183
- package/dist/scripts/validate-cross-references.js.map +0 -1
- package/dist/scripts/validate-file-ownership.d.ts +0 -68
- package/dist/scripts/validate-file-ownership.d.ts.map +0 -1
- package/dist/scripts/validate-file-ownership.js +0 -135
- package/dist/scripts/validate-file-ownership.js.map +0 -1
- package/dist/scripts/validate-news-translations.d.ts +0 -27
- package/dist/scripts/validate-news-translations.d.ts.map +0 -1
- package/dist/scripts/validate-news-translations.js +0 -258
- package/dist/scripts/validate-news-translations.js.map +0 -1
- package/dist/scripts/validate-translations.d.ts +0 -162
- package/dist/scripts/validate-translations.d.ts.map +0 -1
- package/dist/scripts/validate-translations.js +0 -378
- package/dist/scripts/validate-translations.js.map +0 -1
- package/dist/scripts/workflow-state-coordinator.d.ts +0 -354
- package/dist/scripts/workflow-state-coordinator.d.ts.map +0 -1
- package/dist/scripts/workflow-state-coordinator.js +0 -876
- package/dist/scripts/workflow-state-coordinator.js.map +0 -1
- package/dist/scripts/world-bank-client.d.ts +0 -122
- package/dist/scripts/world-bank-client.d.ts.map +0 -1
- package/dist/scripts/world-bank-client.js +0 -192
- package/dist/scripts/world-bank-client.js.map +0 -1
- package/dist/scripts/world-bank-context.d.ts +0 -88
- package/dist/scripts/world-bank-context.d.ts.map +0 -1
- package/dist/scripts/world-bank-context.js +0 -331
- package/dist/scripts/world-bank-context.js.map +0 -1
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File Ownership Validator for News Workflow Conflict Prevention
|
|
3
|
-
*
|
|
4
|
-
* Enforces a strict file-ownership contract between content and translation workflows:
|
|
5
|
-
* - Content workflows (news-committee-reports, news-propositions, etc.) own EN/SV files
|
|
6
|
-
* - Translation workflow (news-translate) owns all other language files (DA/NO/FI/DE/FR/ES/NL/AR/HE/JA/KO/ZH)
|
|
7
|
-
*
|
|
8
|
-
* This prevents merge conflicts when concurrent workflows touch the same date's article files.
|
|
9
|
-
*
|
|
10
|
-
* @author Hack23 AB
|
|
11
|
-
* @license Apache-2.0
|
|
12
|
-
*/
|
|
13
|
-
import { execSync } from 'node:child_process';
|
|
14
|
-
import { resolve } from 'node:path';
|
|
15
|
-
import { fileURLToPath } from 'node:url';
|
|
16
|
-
/** Languages owned by content generation workflows */
|
|
17
|
-
export const CONTENT_LANGS = ['en', 'sv'];
|
|
18
|
-
/** Languages owned by the translation workflow */
|
|
19
|
-
export const TRANSLATION_LANGS = [
|
|
20
|
-
'da', 'no', 'fi', 'de', 'fr', 'es', 'nl', 'ar', 'he', 'ja', 'ko', 'zh',
|
|
21
|
-
];
|
|
22
|
-
/**
|
|
23
|
-
* Extract the language code from a news article filename.
|
|
24
|
-
* Expected pattern: `news/YYYY-MM-DD-slug-{lang}.html`
|
|
25
|
-
*
|
|
26
|
-
* @param filepath - The file path to extract the language from
|
|
27
|
-
* @returns The two-letter language code, or null if no match
|
|
28
|
-
*/
|
|
29
|
-
export function extractLangFromPath(filepath) {
|
|
30
|
-
const match = filepath.match(/-([a-z]{2})\.html$/);
|
|
31
|
-
return match?.[1] ?? null;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Check whether a file belongs to the given workflow category.
|
|
35
|
-
*
|
|
36
|
-
* @param filepath - The file path to check
|
|
37
|
-
* @param category - The workflow category ('content' or 'translation')
|
|
38
|
-
* @returns true if the file is allowed for the given category
|
|
39
|
-
*/
|
|
40
|
-
export function isFileOwnedByCategory(filepath, category) {
|
|
41
|
-
if (!filepath.startsWith('news/') || !filepath.endsWith('.html')) {
|
|
42
|
-
// Non-news or non-HTML files are always allowed (metadata, indexes, etc.)
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
const lang = extractLangFromPath(filepath);
|
|
46
|
-
if (!lang) {
|
|
47
|
-
// Files without a language suffix (e.g., news/index.html) are allowed for both
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
const isContentLang = CONTENT_LANGS.includes(lang);
|
|
51
|
-
const isTranslationLang = TRANSLATION_LANGS.includes(lang);
|
|
52
|
-
return category === 'content' ? isContentLang : isTranslationLang;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Validate that all pending files (staged + unstaged + untracked working-tree changes)
|
|
56
|
-
* conform to the file-ownership contract for the given workflow category.
|
|
57
|
-
*
|
|
58
|
-
* Checks the union of:
|
|
59
|
-
* - `git diff --cached --name-only` (staged)
|
|
60
|
-
* - `git diff --name-only` (unstaged modifications)
|
|
61
|
-
* - `git ls-files --others --exclude-standard` (untracked new files)
|
|
62
|
-
*
|
|
63
|
-
* This ensures violations are caught regardless of whether `git add` has been run.
|
|
64
|
-
*
|
|
65
|
-
* @param category - The workflow category ('content' or 'translation')
|
|
66
|
-
* @returns Validation result with pass/fail status and any violations
|
|
67
|
-
*/
|
|
68
|
-
export function validatePendingFileOwnership(category) {
|
|
69
|
-
const stagedOutput = execSync('git diff --cached --name-only', {
|
|
70
|
-
encoding: 'utf-8',
|
|
71
|
-
}).trim();
|
|
72
|
-
const unstagedOutput = execSync('git diff --name-only', {
|
|
73
|
-
encoding: 'utf-8',
|
|
74
|
-
}).trim();
|
|
75
|
-
const untrackedOutput = execSync('git ls-files --others --exclude-standard', { encoding: 'utf-8' }).trim();
|
|
76
|
-
const allFiles = new Set();
|
|
77
|
-
if (stagedOutput) {
|
|
78
|
-
for (const f of stagedOutput.split('\n'))
|
|
79
|
-
if (f)
|
|
80
|
-
allFiles.add(f);
|
|
81
|
-
}
|
|
82
|
-
if (unstagedOutput) {
|
|
83
|
-
for (const f of unstagedOutput.split('\n'))
|
|
84
|
-
if (f)
|
|
85
|
-
allFiles.add(f);
|
|
86
|
-
}
|
|
87
|
-
if (untrackedOutput) {
|
|
88
|
-
for (const f of untrackedOutput.split('\n'))
|
|
89
|
-
if (f)
|
|
90
|
-
allFiles.add(f);
|
|
91
|
-
}
|
|
92
|
-
if (allFiles.size === 0) {
|
|
93
|
-
return { passed: true, violations: [], checkedCount: 0 };
|
|
94
|
-
}
|
|
95
|
-
return validateFileList([...allFiles], category);
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Validate a list of file paths against the ownership contract.
|
|
99
|
-
* This is the pure-logic core, usable without git.
|
|
100
|
-
*
|
|
101
|
-
* @param files - Array of file paths to validate
|
|
102
|
-
* @param category - The workflow category ('content' or 'translation')
|
|
103
|
-
* @returns Validation result with pass/fail status and any violations
|
|
104
|
-
*/
|
|
105
|
-
export function validateFileList(files, category) {
|
|
106
|
-
const newsHtmlFiles = files.filter((f) => f.startsWith('news/') && f.endsWith('.html'));
|
|
107
|
-
const violations = newsHtmlFiles.filter((f) => !isFileOwnedByCategory(f, category));
|
|
108
|
-
return {
|
|
109
|
-
passed: violations.length === 0,
|
|
110
|
-
violations,
|
|
111
|
-
checkedCount: newsHtmlFiles.length,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
/* istanbul ignore next -- CLI entry point */
|
|
115
|
-
if (resolve(fileURLToPath(import.meta.url)) === resolve(process.argv[1] ?? '')) {
|
|
116
|
-
const category = process.argv[2];
|
|
117
|
-
if (!category || !['content', 'translation'].includes(category)) {
|
|
118
|
-
console.error('Usage: npx tsx scripts/validate-file-ownership.ts <content|translation>\n' +
|
|
119
|
-
' Validates staged, unstaged, and untracked changes against the file-ownership contract.');
|
|
120
|
-
process.exit(2);
|
|
121
|
-
}
|
|
122
|
-
const result = validatePendingFileOwnership(category);
|
|
123
|
-
if (result.passed) {
|
|
124
|
-
console.log(`✅ File ownership validation passed (${result.checkedCount} news files checked for '${category}' category)`);
|
|
125
|
-
process.exit(0);
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
console.error(`❌ File ownership violation! The following files do not belong to the '${category}' workflow category:`);
|
|
129
|
-
for (const v of result.violations) {
|
|
130
|
-
console.error(` - ${v}`);
|
|
131
|
-
}
|
|
132
|
-
process.exit(1);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=validate-file-ownership.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-file-ownership.js","sourceRoot":"","sources":["../../scripts/validate-file-ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module Validation/TranslationQuality
|
|
3
|
-
* @category Validation
|
|
4
|
-
*
|
|
5
|
-
* @title News Article Translation Completeness Validator
|
|
6
|
-
*
|
|
7
|
-
* @description
|
|
8
|
-
* Validates that news articles published in non-Swedish languages are
|
|
9
|
-
* fully translated, preventing partially-translated articles from publication.
|
|
10
|
-
*
|
|
11
|
-
* @author Hack23 AB (Multilingual Intelligence & Quality Assurance)
|
|
12
|
-
* @license Apache-2.0
|
|
13
|
-
* @version 2.0.0
|
|
14
|
-
*/
|
|
15
|
-
/** BCP-47 validation error record */
|
|
16
|
-
export interface BCP47Error {
|
|
17
|
-
readonly field: string;
|
|
18
|
-
readonly expected: string;
|
|
19
|
-
readonly actual: string;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Validate BCP-47 consistency within an article file.
|
|
23
|
-
* Checks that `html[lang]`, `og:locale`, and JSON-LD `inLanguage` are
|
|
24
|
-
* consistent with the expected values for the file's language suffix.
|
|
25
|
-
*/
|
|
26
|
-
export declare function validateBCP47Consistency(filePath: string, fileLang: string): BCP47Error[];
|
|
27
|
-
//# sourceMappingURL=validate-news-translations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-news-translations.d.ts","sourceRoot":"","sources":["../../scripts/validate-news-translations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoEH,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAoBD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CA2CzF"}
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module Validation/TranslationQuality
|
|
3
|
-
* @category Validation
|
|
4
|
-
*
|
|
5
|
-
* @title News Article Translation Completeness Validator
|
|
6
|
-
*
|
|
7
|
-
* @description
|
|
8
|
-
* Validates that news articles published in non-Swedish languages are
|
|
9
|
-
* fully translated, preventing partially-translated articles from publication.
|
|
10
|
-
*
|
|
11
|
-
* @author Hack23 AB (Multilingual Intelligence & Quality Assurance)
|
|
12
|
-
* @license Apache-2.0
|
|
13
|
-
* @version 2.0.0
|
|
14
|
-
*/
|
|
15
|
-
import { readFileSync, readdirSync, statSync } from 'fs';
|
|
16
|
-
import { join, basename } from 'path';
|
|
17
|
-
const colors = {
|
|
18
|
-
reset: '\x1b[0m',
|
|
19
|
-
green: '\x1b[32m',
|
|
20
|
-
red: '\x1b[31m',
|
|
21
|
-
yellow: '\x1b[33m',
|
|
22
|
-
cyan: '\x1b[36m',
|
|
23
|
-
bold: '\x1b[1m',
|
|
24
|
-
};
|
|
25
|
-
// Language codes to check (exclude Swedish)
|
|
26
|
-
const NON_SWEDISH_LANGS = [
|
|
27
|
-
'en', 'da', 'no', 'fi', 'de', 'fr', 'es', 'nl', 'ar', 'he', 'ja', 'ko', 'zh',
|
|
28
|
-
];
|
|
29
|
-
/**
|
|
30
|
-
* Map from filename language suffix to the expected BCP-47 tag used in
|
|
31
|
-
* `html[lang]`, `og:locale`, and JSON-LD `inLanguage`.
|
|
32
|
-
*
|
|
33
|
-
* Norwegian files use the filename suffix 'no' but must be advertised as 'nb'.
|
|
34
|
-
*/
|
|
35
|
-
const BCP47_TAG = {
|
|
36
|
-
en: 'en', sv: 'sv', da: 'da', no: 'nb', fi: 'fi',
|
|
37
|
-
de: 'de', fr: 'fr', es: 'es', nl: 'nl',
|
|
38
|
-
ar: 'ar', he: 'he', ja: 'ja', ko: 'ko', zh: 'zh',
|
|
39
|
-
};
|
|
40
|
-
const OG_LOCALE_EXPECTED = {
|
|
41
|
-
en: 'en_US', sv: 'sv_SE', da: 'da_DK', no: 'nb_NO', fi: 'fi_FI',
|
|
42
|
-
de: 'de_DE', fr: 'fr_FR', es: 'es_ES', nl: 'nl_NL',
|
|
43
|
-
ar: 'ar_SA', he: 'he_IL', ja: 'ja_JP', ko: 'ko_KR', zh: 'zh_CN',
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Validate BCP-47 consistency within an article file.
|
|
47
|
-
* Checks that `html[lang]`, `og:locale`, and JSON-LD `inLanguage` are
|
|
48
|
-
* consistent with the expected values for the file's language suffix.
|
|
49
|
-
*/
|
|
50
|
-
export function validateBCP47Consistency(filePath, fileLang) {
|
|
51
|
-
const errors = [];
|
|
52
|
-
const content = readFileSync(filePath, 'utf-8');
|
|
53
|
-
const expectedTag = BCP47_TAG[fileLang] ?? fileLang;
|
|
54
|
-
const expectedLocale = OG_LOCALE_EXPECTED[fileLang];
|
|
55
|
-
// Check html lang attribute
|
|
56
|
-
const htmlLangMatch = content.match(/<html\s[^>]*lang="([^"]+)"/);
|
|
57
|
-
if (htmlLangMatch) {
|
|
58
|
-
const actual = htmlLangMatch[1] ?? '';
|
|
59
|
-
if (actual !== expectedTag) {
|
|
60
|
-
errors.push({ field: 'html[lang]', expected: expectedTag, actual });
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Check og:locale
|
|
64
|
-
if (expectedLocale) {
|
|
65
|
-
const ogMatch = content.match(/property="og:locale"\s+content="([^"]+)"/);
|
|
66
|
-
if (ogMatch) {
|
|
67
|
-
const actual = ogMatch[1] ?? '';
|
|
68
|
-
if (actual !== expectedLocale) {
|
|
69
|
-
errors.push({ field: 'og:locale', expected: expectedLocale, actual });
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// Check JSON-LD inLanguage
|
|
74
|
-
const inLangMatch = content.match(/"inLanguage":\s*"([^"]+)"/);
|
|
75
|
-
if (inLangMatch) {
|
|
76
|
-
const actual = inLangMatch[1] ?? '';
|
|
77
|
-
if (actual !== expectedTag) {
|
|
78
|
-
errors.push({ field: 'inLanguage', expected: expectedTag, actual });
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// Check dir="rtl" for RTL languages
|
|
82
|
-
if (fileLang === 'ar' || fileLang === 'he') {
|
|
83
|
-
if (!content.includes('dir="rtl"')) {
|
|
84
|
-
errors.push({ field: 'dir', expected: 'rtl', actual: 'missing' });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return errors;
|
|
88
|
-
}
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
// Functions
|
|
91
|
-
// ---------------------------------------------------------------------------
|
|
92
|
-
/**
|
|
93
|
-
* Check if a file contains untranslated Swedish content markers.
|
|
94
|
-
*/
|
|
95
|
-
function checkFileForUntranslatedContent(filepath) {
|
|
96
|
-
try {
|
|
97
|
-
const content = readFileSync(filepath, 'utf-8');
|
|
98
|
-
const markers = content.match(/data-translate="true"/g);
|
|
99
|
-
if (!markers) {
|
|
100
|
-
return { passed: true };
|
|
101
|
-
}
|
|
102
|
-
// Extract samples of untranslated content
|
|
103
|
-
const samples = [];
|
|
104
|
-
const sampleRegex = /<span data-translate="true"[^>]*>([^<]{0,80})/g;
|
|
105
|
-
let match;
|
|
106
|
-
let count = 0;
|
|
107
|
-
while ((match = sampleRegex.exec(content)) !== null && count < 3) {
|
|
108
|
-
const raw = match[1] ?? '';
|
|
109
|
-
const text = raw.length >= 80 ? raw + '...' : raw;
|
|
110
|
-
samples.push(text);
|
|
111
|
-
count++;
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
passed: false,
|
|
115
|
-
markerCount: markers.length,
|
|
116
|
-
samples,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
return {
|
|
121
|
-
error: error.message,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Get all HTML files in a directory (recursive).
|
|
127
|
-
*/
|
|
128
|
-
function getAllHtmlFiles(dir) {
|
|
129
|
-
const files = [];
|
|
130
|
-
try {
|
|
131
|
-
const items = readdirSync(dir);
|
|
132
|
-
for (const item of items) {
|
|
133
|
-
const fullPath = join(dir, item);
|
|
134
|
-
const stat = statSync(fullPath);
|
|
135
|
-
if (stat.isDirectory()) {
|
|
136
|
-
files.push(...getAllHtmlFiles(fullPath));
|
|
137
|
-
}
|
|
138
|
-
else if (item.endsWith('.html')) {
|
|
139
|
-
files.push(fullPath);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
console.error(`${colors.red}Error reading directory ${dir}: ${error.message}${colors.reset}`);
|
|
145
|
-
}
|
|
146
|
-
return files;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Determine language code from filename.
|
|
150
|
-
*/
|
|
151
|
-
function getLanguageCode(filename) {
|
|
152
|
-
const match = filename.match(/-([a-z]{2})\.html$/);
|
|
153
|
-
return match ? match[1] ?? null : null;
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Main validation function.
|
|
157
|
-
*/
|
|
158
|
-
function validateNewsTranslations(directory = 'news') {
|
|
159
|
-
console.log(`${colors.bold}${colors.cyan}===========================================`);
|
|
160
|
-
console.log(`News Article Translation Validation`);
|
|
161
|
-
console.log(`===========================================${colors.reset}\n`);
|
|
162
|
-
console.log(`Checking directory: ${directory}\n`);
|
|
163
|
-
const htmlFiles = getAllHtmlFiles(directory);
|
|
164
|
-
const nonSwedishFiles = htmlFiles.filter((file) => {
|
|
165
|
-
const lang = getLanguageCode(basename(file));
|
|
166
|
-
return lang !== null && NON_SWEDISH_LANGS.includes(lang);
|
|
167
|
-
});
|
|
168
|
-
console.log(`Found ${nonSwedishFiles.length} non-Swedish article files to check\n`);
|
|
169
|
-
let totalPassed = 0;
|
|
170
|
-
let totalFailed = 0;
|
|
171
|
-
let totalErrors = 0;
|
|
172
|
-
let totalBCP47Errors = 0;
|
|
173
|
-
const failedFiles = [];
|
|
174
|
-
for (const filepath of nonSwedishFiles) {
|
|
175
|
-
const filename = basename(filepath);
|
|
176
|
-
const lang = getLanguageCode(filename);
|
|
177
|
-
const result = checkFileForUntranslatedContent(filepath);
|
|
178
|
-
// BCP-47 consistency check
|
|
179
|
-
const bcp47Errors = lang ? validateBCP47Consistency(filepath, lang) : [];
|
|
180
|
-
if (bcp47Errors.length > 0) {
|
|
181
|
-
totalBCP47Errors += bcp47Errors.length;
|
|
182
|
-
console.log(`${colors.yellow}⚠ BCP-47: ${filename}${colors.reset}`);
|
|
183
|
-
for (const err of bcp47Errors) {
|
|
184
|
-
console.log(` ${colors.yellow}${err.field}: expected "${err.expected}", got "${err.actual}"${colors.reset}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (result.error !== undefined) {
|
|
188
|
-
console.log(`${colors.red}ERROR: ${filename}${colors.reset}`);
|
|
189
|
-
console.log(` ${colors.red}${result.error}${colors.reset}\n`);
|
|
190
|
-
totalErrors++;
|
|
191
|
-
}
|
|
192
|
-
else if (result.passed) {
|
|
193
|
-
console.log(`${colors.green}✓ ${filename} (${(lang ?? '').toUpperCase()})${colors.reset}`);
|
|
194
|
-
totalPassed++;
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
console.log(`${colors.red}✗ ${filename} (${(lang ?? '').toUpperCase()})${colors.reset}`);
|
|
198
|
-
console.log(` ${colors.red}Found ${result.markerCount} untranslated marker(s)${colors.reset}`);
|
|
199
|
-
if (result.samples.length > 0) {
|
|
200
|
-
console.log(` ${colors.yellow}Samples:${colors.reset}`);
|
|
201
|
-
result.samples.forEach((sample, i) => {
|
|
202
|
-
console.log(` ${i + 1}. "${sample}"`);
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
console.log('');
|
|
206
|
-
failedFiles.push({
|
|
207
|
-
filename,
|
|
208
|
-
lang: lang ?? '',
|
|
209
|
-
count: result.markerCount,
|
|
210
|
-
samples: result.samples,
|
|
211
|
-
});
|
|
212
|
-
totalFailed++;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
// Summary
|
|
216
|
-
console.log(`\n${colors.bold}${colors.cyan}===========================================`);
|
|
217
|
-
console.log(`Summary`);
|
|
218
|
-
console.log(`===========================================${colors.reset}\n`);
|
|
219
|
-
console.log(`Total articles checked: ${nonSwedishFiles.length}`);
|
|
220
|
-
console.log(`${colors.green}✓ Fully translated: ${totalPassed}${colors.reset}`);
|
|
221
|
-
console.log(`${colors.red}✗ Contains untranslated content: ${totalFailed}${colors.reset}`);
|
|
222
|
-
if (totalErrors > 0) {
|
|
223
|
-
console.log(`${colors.red}✗ Errors: ${totalErrors}${colors.reset}`);
|
|
224
|
-
}
|
|
225
|
-
if (totalBCP47Errors > 0) {
|
|
226
|
-
console.log(`${colors.red}✗ BCP-47 inconsistencies: ${totalBCP47Errors}${colors.reset}`);
|
|
227
|
-
}
|
|
228
|
-
if (totalFailed > 0 || totalBCP47Errors > 0) {
|
|
229
|
-
console.log(`\n${colors.bold}${colors.red}❌ VALIDATION FAILED${colors.reset}`);
|
|
230
|
-
if (failedFiles.length > 0) {
|
|
231
|
-
console.log(`\nFiles needing translation:\n`);
|
|
232
|
-
failedFiles.forEach(({ filename, count }) => {
|
|
233
|
-
console.log(` ${colors.red}✗${colors.reset} ${filename} - ${count} markers`);
|
|
234
|
-
});
|
|
235
|
-
console.log(`\n${colors.yellow}Action Required:${colors.reset}`);
|
|
236
|
-
console.log(`1. Open each file listed above`);
|
|
237
|
-
console.log(`2. Find all <span data-translate="true" lang="sv">Swedish text</span> elements`);
|
|
238
|
-
console.log(`3. Translate the Swedish text to the article's target language`);
|
|
239
|
-
console.log(`4. Replace the span with plain translated text`);
|
|
240
|
-
console.log(`5. Consult TRANSLATION_GUIDE.md for terminology\n`);
|
|
241
|
-
}
|
|
242
|
-
if (totalBCP47Errors > 0) {
|
|
243
|
-
console.log(`\n${colors.yellow}BCP-47 Action Required:${colors.reset}`);
|
|
244
|
-
console.log(`Ensure html[lang], og:locale, and inLanguage are consistent per article.`);
|
|
245
|
-
console.log(`Norwegian articles must use lang="nb", og:locale="nb_NO", inLanguage="nb".\n`);
|
|
246
|
-
}
|
|
247
|
-
return 1;
|
|
248
|
-
}
|
|
249
|
-
else {
|
|
250
|
-
console.log(`\n${colors.bold}${colors.green}✅ ALL ARTICLES FULLY TRANSLATED${colors.reset}\n`);
|
|
251
|
-
return 0;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
// Run validation
|
|
255
|
-
const directory = process.argv[2] || 'news';
|
|
256
|
-
const exitCode = validateNewsTranslations(directory);
|
|
257
|
-
process.exit(exitCode);
|
|
258
|
-
//# sourceMappingURL=validate-news-translations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-news-translations.js","sourceRoot":"","sources":["../../scripts/validate-news-translations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* @module Validation/LanguageMetadata
|
|
4
|
-
* @category Validation
|
|
5
|
-
*
|
|
6
|
-
* @title Homepage Language File Validator - SEO & Internationalization Gate
|
|
7
|
-
*
|
|
8
|
-
* @description
|
|
9
|
-
* **INTELLIGENCE OPERATIVE PERSPECTIVE**
|
|
10
|
-
*
|
|
11
|
-
* This validator ensures the homepage and main content pages maintain proper
|
|
12
|
-
* language metadata across all 14 supported language editions. While appearing
|
|
13
|
-
* as a technical SEO task, language validation serves critical intelligence
|
|
14
|
-
* functions: ensuring international readers can discover content in their
|
|
15
|
-
* language, preventing search engine deindexing, and maintaining consistent
|
|
16
|
-
* information architecture across the multilingual platform.
|
|
17
|
-
*
|
|
18
|
-
* **METADATA VALIDATION FRAMEWORK:**
|
|
19
|
-
* The validator checks seven critical metadata elements for each language:
|
|
20
|
-
*
|
|
21
|
-
* 1. **HTML lang Attribute Correctness**
|
|
22
|
-
* - Validates lang="xx" matches ISO 639-1 language codes
|
|
23
|
-
* - Detects mismatches (e.g., Swedish content with lang="en")
|
|
24
|
-
* - Critical for: Screen readers, search engines, browser font selection
|
|
25
|
-
* Intelligence impact: Accessibility for visually-impaired international readers
|
|
26
|
-
*
|
|
27
|
-
* 2. **dir="rtl" for Right-to-Left Languages**
|
|
28
|
-
* - Validates Arabic (AR) and Hebrew (HE) have dir="rtl" attribute
|
|
29
|
-
* - Detects LTR incorrectly applied to RTL content
|
|
30
|
-
* - Critical for: Text layout, number display, punctuation handling
|
|
31
|
-
* Intelligence impact: Readability for Middle Eastern audience
|
|
32
|
-
*
|
|
33
|
-
* 3. **Title Tag Presence & Uniqueness**
|
|
34
|
-
* - Ensures <title> tag exists and is language-appropriate
|
|
35
|
-
* - Detects duplicate titles across language versions
|
|
36
|
-
* - Critical for: Browser tab display, search engine indexing
|
|
37
|
-
* Intelligence impact: Click-through rates from search results
|
|
38
|
-
*
|
|
39
|
-
* 4. **Meta Description Presence**
|
|
40
|
-
* - Validates meta description tag for SEO preview
|
|
41
|
-
* - Detects missing or placeholder descriptions
|
|
42
|
-
* - Critical for: Google snippet display, CTR optimization
|
|
43
|
-
* Intelligence impact: Search engine visibility for each language
|
|
44
|
-
*
|
|
45
|
-
* 5. **Canonical URL Correctness**
|
|
46
|
-
* - Ensures canonical URL points to correct language version
|
|
47
|
-
* - Detects broken or missing canonical tags
|
|
48
|
-
* - Critical for: Preventing search engine penalization
|
|
49
|
-
* Intelligence impact: Prevents duplicate content SEO issues
|
|
50
|
-
*
|
|
51
|
-
* 6. **Hreflang Tag Completeness**
|
|
52
|
-
* - Validates presence of hreflang tags for all language versions
|
|
53
|
-
* - Checks all target languages are represented
|
|
54
|
-
* - Critical for: Search engine language targeting
|
|
55
|
-
* Intelligence impact: Users find correct language version
|
|
56
|
-
*
|
|
57
|
-
* 7. **Open Graph Protocol for Social Media**
|
|
58
|
-
* - Ensures og:locale matches language code
|
|
59
|
-
* - Validates og:title and og:description presence
|
|
60
|
-
* - Critical for: Social media preview appearance
|
|
61
|
-
* Intelligence impact: Engagement rates when articles shared
|
|
62
|
-
*
|
|
63
|
-
* 8. **Schema.org Structured Data**
|
|
64
|
-
* - Validates JSON-LD for news articles and organizations
|
|
65
|
-
* - Ensures @language property matches content language
|
|
66
|
-
* - Critical for: Rich snippets, knowledge graph integration
|
|
67
|
-
* Intelligence impact: Enhanced search visibility and credibility
|
|
68
|
-
*
|
|
69
|
-
* **LANGUAGE CONFIGURATIONS (14 Total):**
|
|
70
|
-
* - EN: English (Primary international language)
|
|
71
|
-
* - SV: Swedish (Source/development language)
|
|
72
|
-
* - DA: Danish (Nordic coverage)
|
|
73
|
-
* - NO: Norwegian (Nordic coverage)
|
|
74
|
-
* - FI: Finnish (Nordic coverage)
|
|
75
|
-
* - DE: German (European coverage)
|
|
76
|
-
* - FR: French (European coverage)
|
|
77
|
-
* - ES: Spanish (European coverage)
|
|
78
|
-
* - NL: Dutch (European coverage)
|
|
79
|
-
* - AR: Arabic (Middle Eastern coverage, RTL)
|
|
80
|
-
* - HE: Hebrew (Middle Eastern coverage, RTL)
|
|
81
|
-
* - JA: Japanese (Asian coverage, special encoding)
|
|
82
|
-
* - KO: Korean (Asian coverage, special encoding)
|
|
83
|
-
* - ZH: Chinese Simplified (Asian coverage, special encoding)
|
|
84
|
-
*
|
|
85
|
-
* **VALIDATION ALGORITHM:**
|
|
86
|
-
* 1. Load each language version HTML file
|
|
87
|
-
* 2. Parse metadata fields (lang, dir, title, meta, canonical, etc.)
|
|
88
|
-
* 3. Validate against language configuration rules
|
|
89
|
-
* 4. Cross-validate hreflang consistency across all versions
|
|
90
|
-
* 5. Report validation results with specific errors
|
|
91
|
-
* 6. Exit code 0 if all valid, 1 if any failures
|
|
92
|
-
*
|
|
93
|
-
* **OPERATIONAL INTEGRATION:**
|
|
94
|
-
* - Pre-deployment CI/CD validation (blocks bad metadata)
|
|
95
|
-
* - Automated homepage generation pipeline
|
|
96
|
-
* - Monthly SEO audit to detect drift
|
|
97
|
-
* - Search console monitoring for indexing issues
|
|
98
|
-
*
|
|
99
|
-
* **SEARCH ENGINE OPTIMIZATION IMPACT:**
|
|
100
|
-
* - Proper metadata prevents Google search penalties
|
|
101
|
-
* - Hreflang tags direct users to correct language version
|
|
102
|
-
* - Canonical tags prevent duplicate content issues
|
|
103
|
-
* - Structured data improves SERP visibility
|
|
104
|
-
*
|
|
105
|
-
* **ACCESSIBILITY COMPLIANCE:**
|
|
106
|
-
* - lang attribute critical for screen reader language detection
|
|
107
|
-
* - dir="rtl" essential for RTL language navigation
|
|
108
|
-
* - Meta descriptions describe page purpose for users
|
|
109
|
-
* - Structured data supports assistive technology
|
|
110
|
-
*
|
|
111
|
-
* **KNOWN LIMITATIONS:**
|
|
112
|
-
* - Does not validate hreflang URLs correctness (only counts tags)
|
|
113
|
-
* - Does not verify that hreflang URLs actually exist or are reachable
|
|
114
|
-
* - Does not check translation quality of meta descriptions
|
|
115
|
-
* - Does not validate Open Graph image URLs
|
|
116
|
-
*
|
|
117
|
-
* **PERFORMANCE:**
|
|
118
|
-
* - File read + parse: ~5ms per language
|
|
119
|
-
* - Full validation: ~70ms total (14 languages)
|
|
120
|
-
* - Memory usage: Minimal (streaming parser)
|
|
121
|
-
*
|
|
122
|
-
* **GDPR COMPLIANCE:**
|
|
123
|
-
* - No personal data processing
|
|
124
|
-
* - Meta description validation supports transparency
|
|
125
|
-
* - Language targeting respects user preferences
|
|
126
|
-
* - Cookie consent metadata validation (future enhancement)
|
|
127
|
-
*
|
|
128
|
-
* @osint International Audience Intelligence
|
|
129
|
-
* - Metadata quality determines international discoverability
|
|
130
|
-
* - Hreflang analysis shows language version coverage
|
|
131
|
-
* - SEO metrics track international audience reach
|
|
132
|
-
* - Social media metadata tracks sharing patterns by language
|
|
133
|
-
*
|
|
134
|
-
* @risk Search Visibility Assurance
|
|
135
|
-
* - Prevents Google search penalization
|
|
136
|
-
* - Ensures users find correct language version
|
|
137
|
-
* - Detects metadata corruption from attacks
|
|
138
|
-
* - Monitors for accidental deindexing
|
|
139
|
-
*
|
|
140
|
-
* @gdpr Language & Regional Preferences
|
|
141
|
-
* - Respects user language preferences
|
|
142
|
-
* - Supports accessibility for all languages
|
|
143
|
-
* - Transparent content metadata for users
|
|
144
|
-
* - Supports language-based data handling policies
|
|
145
|
-
*
|
|
146
|
-
* @security Metadata Integrity
|
|
147
|
-
* - Validates metadata isn't corrupted
|
|
148
|
-
* - Prevents injection of malicious metadata
|
|
149
|
-
* - Ensures schema.org data authenticity
|
|
150
|
-
* - Detects unauthorized metadata changes
|
|
151
|
-
*
|
|
152
|
-
* @author Hack23 AB (Multilingual Platform & SEO)
|
|
153
|
-
* @license Apache-2.0
|
|
154
|
-
* @version 2.0.0
|
|
155
|
-
* @since 2024-07-20
|
|
156
|
-
* @see https://schema.org/ (Structured Data Standard)
|
|
157
|
-
* @see https://www.w3.org/International/ (W3C Internationalization)
|
|
158
|
-
* @see tests/validate-translations.test.js (Test Suite)
|
|
159
|
-
* @see Issue #98 (Hreflang Implementation)
|
|
160
|
-
*/
|
|
161
|
-
export {};
|
|
162
|
-
//# sourceMappingURL=validate-translations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-translations.d.ts","sourceRoot":"","sources":["../../scripts/validate-translations.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8JG"}
|