mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 19:04:02 +00:00
fix(regional): keep impossible compact article dates unknown
This commit is contained in:
1 parent
0265ad4c19
commit
af128bd4cd
4 files changed
+62
-4
No files matched your search
@@ -32,6 +32,7 @@
|
|||||||
- Tool string length validation counts Unicode characters correctly, including characters outside the basic multilingual plane.
|
- Tool string length validation counts Unicode characters correctly, including characters outside the basic multilingual plane.
|
||||||
|
|
||||||
- Director timeline seeks cross the dateline along the short longitude arc.
|
- Director timeline seeks cross the dateline along the short longitude arc.
|
||||||
|
- Regional articles retain unknown publication times when compact source dates do not identify a real calendar instant.
|
||||||
|
|
||||||
- Treat explicitly current, complete empty vessel coverage as a successful update,
|
- Treat explicitly current, complete empty vessel coverage as a successful update,
|
||||||
clearing obsolete contacts while retaining stale or incomplete snapshots.
|
clearing obsolete contacts while retaining stale or incomplete snapshots.
|
||||||
|
|||||||
@@ -5326,3 +5326,8 @@ datacenters, dams and the Nepal locator retain that shared credit while displaye
|
|||||||
|
|
||||||
Military fragments stitch by source identity. Different mapped parcels merge only
|
Military fragments stitch by source identity. Different mapped parcels merge only
|
||||||
when their footprints touch or contain one another, never across a seam tolerance gap.
|
when their footprints touch or contain one another, never across a seam tolerance gap.
|
||||||
|
|
||||||
|
|
||||||
|
### fix(regional): keep impossible compact article dates unknown
|
||||||
|
|
||||||
|
Round-trip compact timestamps through a valid Date and retain the article with an unknown timestamp when its source date is impossible. Valid compact and ordinary ISO output formats are preserved.
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { normalizeRegionalArticles } from './regionalModel.js';
|
||||||
|
test('compact source dates must denote an actual calendar instant', () => {
|
||||||
|
for (const date of [
|
||||||
|
'20260230T120000Z',
|
||||||
|
'20260431T120000Z',
|
||||||
|
'20261301T120000Z',
|
||||||
|
'20260716T240000Z',
|
||||||
|
'20260716T126000Z',
|
||||||
|
'20260716T120060Z',
|
||||||
|
]) {
|
||||||
|
const [article] = normalizeRegionalArticles({
|
||||||
|
articles: [
|
||||||
|
{
|
||||||
|
title: 'Fixture',
|
||||||
|
url: 'https://fixture.example/news',
|
||||||
|
seendate: date,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
assert.equal(article.publishedAt, null, date);
|
||||||
|
assert.equal(article.title, 'Fixture');
|
||||||
|
}
|
||||||
|
for (const [input, expected] of [
|
||||||
|
['20240229T004500Z', '2024-02-29T00:45:00Z'],
|
||||||
|
['20260716T000000Z', '2026-07-16T00:00:00Z'],
|
||||||
|
['2026-07-16T12:00:00Z', '2026-07-16T12:00:00.000Z'],
|
||||||
|
]) {
|
||||||
|
assert.equal(
|
||||||
|
normalizeRegionalArticles({
|
||||||
|
articles: [
|
||||||
|
{
|
||||||
|
title: 'Fixture',
|
||||||
|
url: 'https://fixture.example/news',
|
||||||
|
seendate: input,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})[0].publishedAt,
|
||||||
|
expected,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -67,11 +67,20 @@ export function normalizeRegionalArticles(payload, limit = MAX_ARTICLES) {
|
|||||||
seen.add(signature);
|
seen.add(signature);
|
||||||
const rawDate = cleanText(row?.seendate, 32);
|
const rawDate = cleanText(row?.seendate, 32);
|
||||||
const compactDate = /^(\d{8})T(\d{6})Z$/.exec(rawDate);
|
const compactDate = /^(\d{8})T(\d{6})Z$/.exec(rawDate);
|
||||||
const publishedAt = compactDate
|
const candidateDate = compactDate
|
||||||
? `${compactDate[1].slice(0, 4)}-${compactDate[1].slice(4, 6)}-${compactDate[1].slice(6, 8)}T${compactDate[2].slice(0, 2)}:${compactDate[2].slice(2, 4)}:${compactDate[2].slice(4, 6)}Z`
|
? `${compactDate[1].slice(0, 4)}-${compactDate[1].slice(4, 6)}-${compactDate[1].slice(6, 8)}T${compactDate[2].slice(0, 2)}:${compactDate[2].slice(2, 4)}:${compactDate[2].slice(4, 6)}Z`
|
||||||
: Number.isNaN(Date.parse(rawDate))
|
: rawDate;
|
||||||
? null
|
const parsedMs = Date.parse(candidateDate);
|
||||||
: new Date(rawDate).toISOString();
|
const validDate =
|
||||||
|
Number.isFinite(parsedMs) &&
|
||||||
|
(!compactDate ||
|
||||||
|
new Date(parsedMs).toISOString().slice(0, 19) ===
|
||||||
|
candidateDate.slice(0, 19));
|
||||||
|
const publishedAt = validDate
|
||||||
|
? compactDate
|
||||||
|
? candidateDate
|
||||||
|
: new Date(parsedMs).toISOString()
|
||||||
|
: null;
|
||||||
articles.push({
|
articles.push({
|
||||||
title,
|
title,
|
||||||
url,
|
url,
|
||||||
|
|||||||
Reference in new issue
Block a user