@nathanvale/chatline 0.0.1 → 0.0.2-next.1
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/CHANGELOG.md +12 -0
- package/dist/bin/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/clean.d.ts +0 -17
- package/dist/cli/commands/clean.d.ts.map +0 -1
- package/dist/cli/commands/clean.js +0 -142
- package/dist/cli/commands/clean.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -17
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/doctor.js +0 -202
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/enrich-ai.d.ts +0 -17
- package/dist/cli/commands/enrich-ai.d.ts.map +0 -1
- package/dist/cli/commands/enrich-ai.js +0 -371
- package/dist/cli/commands/enrich-ai.js.map +0 -1
- package/dist/cli/commands/index.d.ts +0 -16
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/index.js +0 -16
- package/dist/cli/commands/index.js.map +0 -1
- package/dist/cli/commands/ingest-csv.d.ts +0 -17
- package/dist/cli/commands/ingest-csv.d.ts.map +0 -1
- package/dist/cli/commands/ingest-csv.js +0 -138
- package/dist/cli/commands/ingest-csv.js.map +0 -1
- package/dist/cli/commands/ingest-db.d.ts +0 -17
- package/dist/cli/commands/ingest-db.d.ts.map +0 -1
- package/dist/cli/commands/ingest-db.js +0 -159
- package/dist/cli/commands/ingest-db.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -17
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -110
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/normalize-link.d.ts +0 -16
- package/dist/cli/commands/normalize-link.d.ts.map +0 -1
- package/dist/cli/commands/normalize-link.js +0 -144
- package/dist/cli/commands/normalize-link.js.map +0 -1
- package/dist/cli/commands/render-markdown.d.ts +0 -17
- package/dist/cli/commands/render-markdown.d.ts.map +0 -1
- package/dist/cli/commands/render-markdown.js +0 -218
- package/dist/cli/commands/render-markdown.js.map +0 -1
- package/dist/cli/commands/stats.d.ts +0 -17
- package/dist/cli/commands/stats.d.ts.map +0 -1
- package/dist/cli/commands/stats.js +0 -175
- package/dist/cli/commands/stats.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -17
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -152
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/index.d.ts +0 -13
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -121
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/types.d.ts +0 -93
- package/dist/cli/types.d.ts.map +0 -1
- package/dist/cli/types.js +0 -7
- package/dist/cli/types.js.map +0 -1
- package/dist/cli/utils.d.ts +0 -29
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js +0 -53
- package/dist/cli/utils.js.map +0 -1
- package/dist/cli.d.ts +0 -9
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -1805
- package/dist/config/generator.d.ts +0 -90
- package/dist/config/generator.d.ts.map +0 -1
- package/dist/config/generator.js +0 -320
- package/dist/config/generator.js.map +0 -1
- package/dist/config/loader.d.ts +0 -107
- package/dist/config/loader.d.ts.map +0 -1
- package/dist/config/loader.js +0 -251
- package/dist/config/loader.js.map +0 -1
- package/dist/config/schema.d.ts +0 -107
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/config/schema.js +0 -169
- package/dist/config/schema.js.map +0 -1
- package/dist/enrich/audio-transcription.d.ts +0 -77
- package/dist/enrich/audio-transcription.d.ts.map +0 -1
- package/dist/enrich/audio-transcription.js +0 -370
- package/dist/enrich/audio-transcription.js.map +0 -1
- package/dist/enrich/checkpoint.d.ts +0 -137
- package/dist/enrich/checkpoint.d.ts.map +0 -1
- package/dist/enrich/checkpoint.js +0 -205
- package/dist/enrich/checkpoint.js.map +0 -1
- package/dist/enrich/idempotency.d.ts +0 -90
- package/dist/enrich/idempotency.d.ts.map +0 -1
- package/dist/enrich/idempotency.js +0 -188
- package/dist/enrich/idempotency.js.map +0 -1
- package/dist/enrich/image-analysis.d.ts +0 -62
- package/dist/enrich/image-analysis.d.ts.map +0 -1
- package/dist/enrich/image-analysis.js +0 -264
- package/dist/enrich/image-analysis.js.map +0 -1
- package/dist/enrich/index.d.ts +0 -60
- package/dist/enrich/index.d.ts.map +0 -1
- package/dist/enrich/index.js +0 -74
- package/dist/enrich/index.js.map +0 -1
- package/dist/enrich/link-enrichment.d.ts +0 -37
- package/dist/enrich/link-enrichment.d.ts.map +0 -1
- package/dist/enrich/link-enrichment.js +0 -202
- package/dist/enrich/link-enrichment.js.map +0 -1
- package/dist/enrich/pdf-video-handling.d.ts +0 -49
- package/dist/enrich/pdf-video-handling.d.ts.map +0 -1
- package/dist/enrich/pdf-video-handling.js +0 -325
- package/dist/enrich/pdf-video-handling.js.map +0 -1
- package/dist/enrich/progress-tracker.d.ts +0 -120
- package/dist/enrich/progress-tracker.d.ts.map +0 -1
- package/dist/enrich/progress-tracker.js +0 -220
- package/dist/enrich/progress-tracker.js.map +0 -1
- package/dist/enrich/providers/firecrawl.d.ts +0 -18
- package/dist/enrich/providers/firecrawl.d.ts.map +0 -1
- package/dist/enrich/providers/firecrawl.js +0 -48
- package/dist/enrich/providers/firecrawl.js.map +0 -1
- package/dist/enrich/providers/generic.d.ts +0 -16
- package/dist/enrich/providers/generic.d.ts.map +0 -1
- package/dist/enrich/providers/generic.js +0 -36
- package/dist/enrich/providers/generic.js.map +0 -1
- package/dist/enrich/providers/index.d.ts +0 -14
- package/dist/enrich/providers/index.d.ts.map +0 -1
- package/dist/enrich/providers/index.js +0 -13
- package/dist/enrich/providers/index.js.map +0 -1
- package/dist/enrich/providers/instagram.d.ts +0 -16
- package/dist/enrich/providers/instagram.d.ts.map +0 -1
- package/dist/enrich/providers/instagram.js +0 -43
- package/dist/enrich/providers/instagram.js.map +0 -1
- package/dist/enrich/providers/spotify.d.ts +0 -16
- package/dist/enrich/providers/spotify.d.ts.map +0 -1
- package/dist/enrich/providers/spotify.js +0 -45
- package/dist/enrich/providers/spotify.js.map +0 -1
- package/dist/enrich/providers/twitter.d.ts +0 -16
- package/dist/enrich/providers/twitter.d.ts.map +0 -1
- package/dist/enrich/providers/twitter.js +0 -43
- package/dist/enrich/providers/twitter.js.map +0 -1
- package/dist/enrich/providers/types.d.ts +0 -47
- package/dist/enrich/providers/types.d.ts.map +0 -1
- package/dist/enrich/providers/types.js +0 -15
- package/dist/enrich/providers/types.js.map +0 -1
- package/dist/enrich/providers/youtube.d.ts +0 -16
- package/dist/enrich/providers/youtube.d.ts.map +0 -1
- package/dist/enrich/providers/youtube.js +0 -43
- package/dist/enrich/providers/youtube.js.map +0 -1
- package/dist/enrich/rate-limiting.d.ts +0 -118
- package/dist/enrich/rate-limiting.d.ts.map +0 -1
- package/dist/enrich/rate-limiting.js +0 -258
- package/dist/enrich/rate-limiting.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/ingest/dedup-merge.d.ts +0 -82
- package/dist/ingest/dedup-merge.d.ts.map +0 -1
- package/dist/ingest/dedup-merge.js +0 -262
- package/dist/ingest/dedup-merge.js.map +0 -1
- package/dist/ingest/ingest-csv.d.ts +0 -62
- package/dist/ingest/ingest-csv.d.ts.map +0 -1
- package/dist/ingest/ingest-csv.js +0 -300
- package/dist/ingest/ingest-csv.js.map +0 -1
- package/dist/ingest/ingest-db.d.ts +0 -64
- package/dist/ingest/ingest-db.d.ts.map +0 -1
- package/dist/ingest/ingest-db.js +0 -172
- package/dist/ingest/ingest-db.js.map +0 -1
- package/dist/ingest/link-replies-and-tapbacks.d.ts +0 -53
- package/dist/ingest/link-replies-and-tapbacks.d.ts.map +0 -1
- package/dist/ingest/link-replies-and-tapbacks.js +0 -381
- package/dist/ingest/link-replies-and-tapbacks.js.map +0 -1
- package/dist/normalize/date-converters.d.ts +0 -45
- package/dist/normalize/date-converters.d.ts.map +0 -1
- package/dist/normalize/date-converters.js +0 -166
- package/dist/normalize/date-converters.js.map +0 -1
- package/dist/normalize/path-validator.d.ts +0 -65
- package/dist/normalize/path-validator.d.ts.map +0 -1
- package/dist/normalize/path-validator.js +0 -221
- package/dist/normalize/path-validator.js.map +0 -1
- package/dist/normalize/validate-normalized.d.ts +0 -45
- package/dist/normalize/validate-normalized.d.ts.map +0 -1
- package/dist/normalize/validate-normalized.js +0 -144
- package/dist/normalize/validate-normalized.js.map +0 -1
- package/dist/render/embeds-blockquotes.d.ts +0 -84
- package/dist/render/embeds-blockquotes.d.ts.map +0 -1
- package/dist/render/embeds-blockquotes.js +0 -204
- package/dist/render/embeds-blockquotes.js.map +0 -1
- package/dist/render/grouping.d.ts +0 -78
- package/dist/render/grouping.d.ts.map +0 -1
- package/dist/render/grouping.js +0 -134
- package/dist/render/grouping.js.map +0 -1
- package/dist/render/index.d.ts +0 -47
- package/dist/render/index.d.ts.map +0 -1
- package/dist/render/index.js +0 -245
- package/dist/render/index.js.map +0 -1
- package/dist/render/reply-rendering.d.ts +0 -88
- package/dist/render/reply-rendering.d.ts.map +0 -1
- package/dist/render/reply-rendering.js +0 -196
- package/dist/render/reply-rendering.js.map +0 -1
- package/dist/schema/message.d.ts +0 -125
- package/dist/schema/message.d.ts.map +0 -1
- package/dist/schema/message.js +0 -331
- package/dist/schema/message.js.map +0 -1
- package/dist/utils/delta-detection.d.ts +0 -107
- package/dist/utils/delta-detection.d.ts.map +0 -1
- package/dist/utils/delta-detection.js +0 -199
- package/dist/utils/delta-detection.js.map +0 -1
- package/dist/utils/enrichment-merge.d.ts +0 -135
- package/dist/utils/enrichment-merge.d.ts.map +0 -1
- package/dist/utils/enrichment-merge.js +0 -280
- package/dist/utils/enrichment-merge.js.map +0 -1
- package/dist/utils/human.d.ts +0 -15
- package/dist/utils/human.d.ts.map +0 -1
- package/dist/utils/human.js +0 -27
- package/dist/utils/human.js.map +0 -1
- package/dist/utils/incremental-state.d.ts +0 -133
- package/dist/utils/incremental-state.d.ts.map +0 -1
- package/dist/utils/incremental-state.js +0 -237
- package/dist/utils/incremental-state.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -40
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -176
- package/dist/utils/logger.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"link-replies-and-tapbacks.js","sourceRoot":"","sources":["../../src/ingest/link-replies-and-tapbacks.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,oBAAoB,GAAG,EAAE,CAAA,CAAC,iCAAiC;AACjE,MAAM,2BAA2B,GAAG,CAAC,CAAA,CAAC,iCAAiC;AACvE,MAAM,sBAAsB,GAAG,EAAE,CAAA,CAAC,gCAAgC;AA0BlE;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CACnC,QAAmB,EACnB,UAA0B,EAAE;IAE5B,MAAM,EACL,cAAc,GAAG,KAAK,EACtB,sBAAsB,EAAE,uBAAuB,GAAG,GAAG,GACrD,GAAG,OAAO,CAAA;IAEX,gCAAgC;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAA;IACzC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAA;IAEhD,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAEzB,mEAAmE;QACnE,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,mBAAmB;QACtF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QAClC,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,MAAM,cAAc,GAAoB,EAAE,CAAA;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACnC,2DAA2D;QAC3D,IAAI,GAAG,CAAC,WAAW,KAAK,MAAM,IAAI,GAAG,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAC/D,OAAO,GAAG,CAAA;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAC;YACvC,OAAO,GAAG,CAAA;QACX,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAA;QACX,CAAC;QAED,+BAA+B;QAC/B,MAAM,UAAU,GAAG,yBAAyB,CAC3C,GAAG,EACH,QAAQ,EACR,MAAM,EACN,WAAW,CACX,CAAA;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAA;QACX,CAAC;QAED,6BAA6B;QAC7B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QAE5C,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QAClC,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,GAAG,CAAA,CAAC,kDAAkD;QAC9D,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAA;QAEnC,iBAAiB;QACjB,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAA;QACrE,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAA;QAEvC,IAAI,KAAK,IAAI,cAAc,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;YACnC,IAAI,SAAS,EAAE,CAAC;gBACf,cAAc,CAAC,IAAI,CAAC;oBACnB,WAAW,EAAE,GAAG,CAAC,IAAI;oBACrB,cAAc,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI;oBACtC,UAAU,EAAE,cAAc;oBAC1B,QAAQ,EAAE,cAAc,CAAC,MAAM;oBAC/B,eAAe,EAAE,QAAQ;iBACzB,CAAC,CAAA;YACH,CAAC;QACF,CAAC;QAED,yBAAyB;QACzB,OAAO;YACN,GAAG,GAAG;YACN,UAAU,EAAE;gBACX,GAAG,GAAG,CAAC,UAAU;gBACjB,iBAAiB,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI;aAC5C;SACD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,OAAO,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;AACtE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACpC,QAAmB,EACnB,UAA0B,EAAE;IAE5B,MAAM,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAE1C,gBAAgB;IAChB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAA;IACzC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAA;IAEhD,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAEzB,mEAAmE;QACnE,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,mBAAmB;QACtF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QAClC,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,MAAM,cAAc,GAAoB,EAAE,CAAA;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACnC,gCAAgC;QAChC,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,GAAG,CAAA;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;YACpC,OAAO,GAAG,CAAA;QACX,CAAC;QAED,+BAA+B;QAC/B,MAAM,UAAU,GAAG,2BAA2B,CAC7C,GAAG,EACH,QAAQ,EACR,MAAM,EACN,WAAW,CACX,CAAA;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAA;QACX,CAAC;QAED,gBAAgB;QAChB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QAE5C,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QAClC,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,GAAG,CAAA,CAAC,kDAAkD;QAC9D,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAA;QAEnC,iBAAiB;QACjB,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAA;QAErE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;YACnC,IAAI,SAAS,EAAE,CAAC;gBACf,cAAc,CAAC,IAAI,CAAC;oBACnB,WAAW,EAAE,GAAG,CAAC,IAAI;oBACrB,cAAc,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI;oBACtC,UAAU,EAAE,cAAc;oBAC1B,QAAQ,EAAE,cAAc,CAAC,MAAM;oBAC/B,eAAe,EAAE,QAAQ;iBACzB,CAAC,CAAA;YACH,CAAC;QACF,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,GAAG,CAAA,CAAC,wCAAwC;QACpD,CAAC;QAED,OAAO;YACN,GAAG,GAAG;YACN,OAAO,EAAE;gBACR,GAAG,GAAG,CAAC,OAAO;gBACd,iBAAiB,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI;aAC5C;SACD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,OAAO,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAmB;IACvD,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,EAAE;QAChD,cAAc,EAAE,IAAI;KACpB,CAAkB,CAAA;IACnB,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,QAAQ,EAAE;QACxD,cAAc,EAAE,IAAI;KACpB,CAAkB,CAAA;IAEnB,MAAM,YAAY,GAAG;QACpB,GAAG,CAAC,SAAS,CAAC,cAAc,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,gBAAgB,CAAC,cAAc,IAAI,EAAE,CAAC;KAC1C,CAAA;IAED,OAAO;QACN,QAAQ,EAAE,YAAY,CAAC,MAAM;QAC7B,iBAAiB,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9C,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;gBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,OAAO;aAClB,CAAC,CAAC;SACH,CAAC,CAAC;KACH,CAAA;AACF,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAU,EAAE,aAAqB;IAC3D,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;IAE/B,sDAAsD;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;QACrD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA,CAAC,mCAAmC;IACrF,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,yBAAyB,CACjC,KAAc,EACd,YAAuB,EACvB,OAA6B,EAC7B,WAAmC;IAEnC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,CAAA;IACrC,MAAM,UAAU,GAAsB,EAAE,CAAA;IACxC,qEAAqE;IAErE,sFAAsF;IACtF,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,CACrC,2EAA2E,CAC3E,CAAA;IACD,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,CAAA;IAEtD,4DAA4D;IAC5D,MAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAA;IAC5E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,MAAM,gBAAgB,GAAc,EAAE,CAAA;IAEtC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3C,IAAI,cAAc,EAAE,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;gBAClC,IACC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;oBACxB,GAAG,CAAC,WAAW,KAAK,SAAS;oBAC7B,GAAG,CAAC,WAAW,KAAK,cAAc;oBAClC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EACtB,CAAC;oBACF,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBACvB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,uBAAuB;IACvB,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAC1D,SAAQ,CAAC,sCAAsC;QAChD,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;QACxD,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,CAAA;QAC7C,MAAM,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAAA;QAE3C,6CAA6C;QAC7C,IACC,gBAAgB,GAAG,CAAC;YACpB,gBAAgB,GAAG,2BAA2B,GAAG,EAAE,EAClD,CAAC;YACF,SAAQ;QACT,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,oCAAoC;QACpC,IAAI,gBAAgB,IAAI,oBAAoB,EAAE,CAAC;YAC9C,KAAK,IAAI,EAAE,CAAA;YACX,OAAO,CAAC,IAAI,CAAC,wBAAwB,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACtE,CAAC;QAED,sCAAsC;QACtC,IAAI,eAAe,GAAG,KAAK,CAAA;QAC3B,IAAI,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;YACnD,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;YAE/C,IAAI,cAAc,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAClD,KAAK,IAAI,GAAG,CAAA;gBACZ,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;gBAClC,eAAe,GAAG,IAAI,CAAA;YACvB,CAAC;iBAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACvD,KAAK,IAAI,EAAE,CAAA;gBACX,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;gBAChC,eAAe,GAAG,IAAI,CAAA;YACvB,CAAC;QACF,CAAC;QAED,2CAA2C;QAC3C,IAAI,SAAS,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACvC,IACC,CAAC,OAAO;gBACR,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC3C,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC1C,CAAC;gBACF,KAAK,IAAI,EAAE,CAAA;gBACX,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;gBAC/B,eAAe,GAAG,IAAI,CAAA;gBACtB,8CAA8C;gBAC9C,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;gBACpD,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrB,KAAK,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;oBAChD,OAAO,CAAC,IAAI,CAAC,oBAAoB,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gBACnD,CAAC;YACF,CAAC;QACF,CAAC;QAED,mEAAmE;QACnE,IAAI,gBAAgB,GAAG,oBAAoB,IAAI,eAAe,EAAE,CAAC;YAChE,KAAK,IAAI,gBAAgB,GAAG,GAAG,CAAA,CAAC,4BAA4B;YAC5D,OAAO,CAAC,IAAI,CAAC,qBAAqB,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACnE,CAAC;QAED,yBAAyB;QACzB,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACvD,KAAK,IAAI,EAAE,CAAA;YACX,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAC5B,CAAC;QAED,+BAA+B;QAC/B,IAAI,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YAChE,KAAK,IAAI,EAAE,CAAA;YACX,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC3B,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QACxD,CAAC;IACF,CAAC;IAED,2FAA2F;IAC3F,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,oCAAoC;QACpC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAA;QACzB,CAAC;QACD,wDAAwD;QACxD,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;QAC7D,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;QAC7D,OAAO,MAAM,GAAG,MAAM,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,OAAO,UAAU,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,2BAA2B,CACnC,OAAgB,EAChB,YAAuB,EACvB,OAA6B,EAC7B,WAAmC;IAEnC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,CAAA;IACzC,MAAM,UAAU,GAAsB,EAAE,CAAA;IAExC,4DAA4D;IAC5D,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,EAAE,2BAA2B,CAAC,CAAA;IAC9E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,MAAM,gBAAgB,GAAc,EAAE,CAAA;IAEtC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3C,IAAI,cAAc,EAAE,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;gBAClC,IACC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;oBACxB,GAAG,CAAC,WAAW,KAAK,SAAS;oBAC7B,GAAG,CAAC,WAAW,KAAK,cAAc;oBAClC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EACxB,CAAC;oBACF,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBACvB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,uBAAuB;IACvB,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;QACxD,MAAM,gBAAgB,GAAG,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,IAAI,CAAA;QAE7D,+BAA+B;QAC/B,IACC,gBAAgB,GAAG,CAAC;YACpB,gBAAgB,GAAG,2BAA2B,GAAG,EAAE,EAClD,CAAC;YACF,SAAQ;QACT,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,sBAAsB;QACtB,IAAI,gBAAgB,IAAI,sBAAsB,EAAE,CAAC;YAChD,KAAK,IAAI,EAAE,CAAA;YACX,OAAO,CAAC,IAAI,CAAC,cAAc,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC5D,CAAC;aAAM,CAAC;YACP,KAAK,IAAI,gBAAgB,CAAA;QAC1B,CAAC;QAED,wDAAwD;QACxD,IAAI,SAAS,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACvC,KAAK,IAAI,EAAE,CAAA;YACX,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACzB,CAAC;aAAM,IAAI,SAAS,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAC7C,KAAK,IAAI,EAAE,CAAA;YACX,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxB,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;YACpE,KAAK,IAAI,EAAE,CAAA;YACX,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC3B,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QACxD,CAAC;IACF,CAAC;IAED,OAAO,UAAU,CAAA;AAClB,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AC02: Convert Apple epoch (seconds since 2001-01-01 UTC) to ISO 8601 UTC string
|
|
3
|
-
* @param appleEpochSeconds - Seconds since 2001-01-01 00:00:00 UTC (may have fractional part)
|
|
4
|
-
* @returns ISO 8601 UTC string with Z suffix (e.g., "2001-01-01T00:00:00.000Z")
|
|
5
|
-
*/
|
|
6
|
-
export declare function convertAppleEpochToUTC(appleEpochSeconds: number): string;
|
|
7
|
-
/**
|
|
8
|
-
* AC01 & AC03: Normalize CSV UTC timestamp to ISO 8601 with Z suffix
|
|
9
|
-
* Preserves timezone information and ensures consistent format
|
|
10
|
-
* @param csvDate - CSV timestamp (typically already UTC with Z suffix)
|
|
11
|
-
* @returns Normalized ISO 8601 UTC string with Z suffix
|
|
12
|
-
*/
|
|
13
|
-
export declare function normalizeCSVDate(csvDate: string): string;
|
|
14
|
-
/**
|
|
15
|
-
* AC01: Validate date format is ISO 8601 UTC with Z suffix
|
|
16
|
-
* Strict validation rejects malformed dates and non-UTC timezones
|
|
17
|
-
* @param dateString - Date string to validate
|
|
18
|
-
* @returns Object with valid flag and optional error message
|
|
19
|
-
*/
|
|
20
|
-
export declare function validateDateFormat(dateString: string): {
|
|
21
|
-
valid: boolean;
|
|
22
|
-
error?: string;
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* AC04: Detect timezone drift between two timestamps
|
|
26
|
-
* Returns true if timestamps differ by more than a reasonable margin
|
|
27
|
-
* @param original - Original timestamp
|
|
28
|
-
* @param converted - Converted/processed timestamp
|
|
29
|
-
* @returns true if drift detected (timestamps differ significantly)
|
|
30
|
-
*/
|
|
31
|
-
export declare function detectTimezoneDrift(original: string, converted: string): boolean;
|
|
32
|
-
/**
|
|
33
|
-
* AC04: End-to-end round-trip validation
|
|
34
|
-
* Validates that a date can be parsed, normalized, and validated without drift
|
|
35
|
-
* @param dateString - Input date string
|
|
36
|
-
* @returns Validation result with drift detection
|
|
37
|
-
*/
|
|
38
|
-
export declare function roundTripDateValidation(dateString: string): {
|
|
39
|
-
valid: boolean;
|
|
40
|
-
driftDetected: boolean;
|
|
41
|
-
input: string;
|
|
42
|
-
normalized: string;
|
|
43
|
-
error?: string;
|
|
44
|
-
};
|
|
45
|
-
//# sourceMappingURL=date-converters.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-converters.d.ts","sourceRoot":"","sources":["../../src/normalize/date-converters.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAOxE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;IACvD,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAoEA;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GACf,OAAO,CAST;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG;IAC5D,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,EAAE,OAAO,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAwDA"}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
// src/normalize/date-converters.ts
|
|
2
|
-
// Apple epoch and CSV UTC converters with end-to-end validation
|
|
3
|
-
// Spec §13: Dates & Timezones, Risks & Mitigations
|
|
4
|
-
/**
|
|
5
|
-
* Apple epoch constant: seconds since 2001-01-01 00:00:00 UTC
|
|
6
|
-
* Used by macOS for timestamps
|
|
7
|
-
*/
|
|
8
|
-
const APPLE_EPOCH_SECONDS = 978_307_200;
|
|
9
|
-
/**
|
|
10
|
-
* AC02: Convert Apple epoch (seconds since 2001-01-01 UTC) to ISO 8601 UTC string
|
|
11
|
-
* @param appleEpochSeconds - Seconds since 2001-01-01 00:00:00 UTC (may have fractional part)
|
|
12
|
-
* @returns ISO 8601 UTC string with Z suffix (e.g., "2001-01-01T00:00:00.000Z")
|
|
13
|
-
*/
|
|
14
|
-
export function convertAppleEpochToUTC(appleEpochSeconds) {
|
|
15
|
-
// Convert Apple epoch seconds to Unix epoch milliseconds
|
|
16
|
-
const unixMs = (appleEpochSeconds + APPLE_EPOCH_SECONDS) * 1000;
|
|
17
|
-
// Create date and convert to ISO 8601 UTC
|
|
18
|
-
const date = new Date(unixMs);
|
|
19
|
-
return date.toISOString();
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* AC01 & AC03: Normalize CSV UTC timestamp to ISO 8601 with Z suffix
|
|
23
|
-
* Preserves timezone information and ensures consistent format
|
|
24
|
-
* @param csvDate - CSV timestamp (typically already UTC with Z suffix)
|
|
25
|
-
* @returns Normalized ISO 8601 UTC string with Z suffix
|
|
26
|
-
*/
|
|
27
|
-
export function normalizeCSVDate(csvDate) {
|
|
28
|
-
// Parse the CSV date string
|
|
29
|
-
const date = new Date(csvDate);
|
|
30
|
-
// Check if parse was successful
|
|
31
|
-
if (Number.isNaN(date.getTime())) {
|
|
32
|
-
throw new Error(`Invalid CSV date format: ${csvDate}`);
|
|
33
|
-
}
|
|
34
|
-
// Return ISO 8601 UTC string with Z suffix
|
|
35
|
-
return date.toISOString();
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* AC01: Validate date format is ISO 8601 UTC with Z suffix
|
|
39
|
-
* Strict validation rejects malformed dates and non-UTC timezones
|
|
40
|
-
* @param dateString - Date string to validate
|
|
41
|
-
* @returns Object with valid flag and optional error message
|
|
42
|
-
*/
|
|
43
|
-
export function validateDateFormat(dateString) {
|
|
44
|
-
// Check if empty or whitespace
|
|
45
|
-
if (!dateString || typeof dateString !== 'string' || !dateString.trim()) {
|
|
46
|
-
return { valid: false, error: 'Date string is empty or whitespace' };
|
|
47
|
-
}
|
|
48
|
-
// Check for Z suffix
|
|
49
|
-
if (!dateString.endsWith('Z')) {
|
|
50
|
-
return { valid: false, error: 'Date must end with Z suffix (UTC)' };
|
|
51
|
-
}
|
|
52
|
-
// Check for timezone offset (should not be present)
|
|
53
|
-
if (dateString.includes('+') || dateString.match(/-\d{2}:\d{2}$/)) {
|
|
54
|
-
return { valid: false, error: 'Date must be UTC only (no timezone offset)' };
|
|
55
|
-
}
|
|
56
|
-
// ISO 8601 requires T separator, not space
|
|
57
|
-
if (dateString.includes(' ')) {
|
|
58
|
-
return {
|
|
59
|
-
valid: false,
|
|
60
|
-
error: 'Date must use T separator (ISO 8601), not space',
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
// Strict ISO 8601 format check: YYYY-MM-DDTHH:mm:ss.sssZ
|
|
64
|
-
const iso8601Regex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/;
|
|
65
|
-
if (!iso8601Regex.test(dateString)) {
|
|
66
|
-
return {
|
|
67
|
-
valid: false,
|
|
68
|
-
error: 'Date must match ISO 8601 format (YYYY-MM-DDTHH:mm:ss[.sss]Z)',
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
// Attempt to parse
|
|
72
|
-
const date = new Date(dateString);
|
|
73
|
-
if (Number.isNaN(date.getTime())) {
|
|
74
|
-
return { valid: false, error: 'Invalid ISO 8601 date format' };
|
|
75
|
-
}
|
|
76
|
-
// Validate the date is actually valid (e.g., Feb 29 in non-leap year)
|
|
77
|
-
// Re-stringify and compare to ensure components match
|
|
78
|
-
const isoString = date.toISOString();
|
|
79
|
-
// Extract components from original and reformed
|
|
80
|
-
const originalParts = dateString.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/);
|
|
81
|
-
const reformedParts = isoString.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/);
|
|
82
|
-
if (!originalParts || !reformedParts) {
|
|
83
|
-
return { valid: false, error: 'Failed to parse date components' };
|
|
84
|
-
}
|
|
85
|
-
// Check year, month, day, hour, minute, second match
|
|
86
|
-
// If they don't match, it means the date was invalid (like Feb 30)
|
|
87
|
-
for (let i = 1; i <= 6; i++) {
|
|
88
|
-
if (originalParts[i] !== reformedParts[i]) {
|
|
89
|
-
return {
|
|
90
|
-
valid: false,
|
|
91
|
-
error: `Invalid date values: component mismatch at index ${i}`,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return { valid: true };
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* AC04: Detect timezone drift between two timestamps
|
|
99
|
-
* Returns true if timestamps differ by more than a reasonable margin
|
|
100
|
-
* @param original - Original timestamp
|
|
101
|
-
* @param converted - Converted/processed timestamp
|
|
102
|
-
* @returns true if drift detected (timestamps differ significantly)
|
|
103
|
-
*/
|
|
104
|
-
export function detectTimezoneDrift(original, converted) {
|
|
105
|
-
const origTime = new Date(original).getTime();
|
|
106
|
-
const convTime = new Date(converted).getTime();
|
|
107
|
-
// Allow 1 second tolerance for rounding/processing differences
|
|
108
|
-
const toleranceMs = 1000;
|
|
109
|
-
const diffMs = Math.abs(origTime - convTime);
|
|
110
|
-
return diffMs > toleranceMs;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* AC04: End-to-end round-trip validation
|
|
114
|
-
* Validates that a date can be parsed, normalized, and validated without drift
|
|
115
|
-
* @param dateString - Input date string
|
|
116
|
-
* @returns Validation result with drift detection
|
|
117
|
-
*/
|
|
118
|
-
export function roundTripDateValidation(dateString) {
|
|
119
|
-
try {
|
|
120
|
-
// Step 1: Validate original format
|
|
121
|
-
const formatValidation = validateDateFormat(dateString);
|
|
122
|
-
if (!formatValidation.valid) {
|
|
123
|
-
const result = {
|
|
124
|
-
valid: false,
|
|
125
|
-
driftDetected: false,
|
|
126
|
-
input: dateString,
|
|
127
|
-
normalized: '',
|
|
128
|
-
};
|
|
129
|
-
if (formatValidation.error) {
|
|
130
|
-
result.error = formatValidation.error;
|
|
131
|
-
}
|
|
132
|
-
return result;
|
|
133
|
-
}
|
|
134
|
-
// Step 2: Normalize (re-parse to ensure consistent formatting)
|
|
135
|
-
const normalized = normalizeCSVDate(dateString);
|
|
136
|
-
// Step 3: Validate normalized format
|
|
137
|
-
const normalizedValidation = validateDateFormat(normalized);
|
|
138
|
-
if (!normalizedValidation.valid) {
|
|
139
|
-
return {
|
|
140
|
-
valid: false,
|
|
141
|
-
driftDetected: false,
|
|
142
|
-
input: dateString,
|
|
143
|
-
normalized,
|
|
144
|
-
error: `Normalized date failed validation: ${normalizedValidation.error}`,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
// Step 4: Detect drift
|
|
148
|
-
const driftDetected = detectTimezoneDrift(dateString, normalized);
|
|
149
|
-
return {
|
|
150
|
-
valid: true,
|
|
151
|
-
driftDetected,
|
|
152
|
-
input: dateString,
|
|
153
|
-
normalized,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
catch (error) {
|
|
157
|
-
return {
|
|
158
|
-
valid: false,
|
|
159
|
-
driftDetected: false,
|
|
160
|
-
input: dateString,
|
|
161
|
-
normalized: '',
|
|
162
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=date-converters.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-converters.js","sourceRoot":"","sources":["../../src/normalize/date-converters.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import type { MediaProvenance, Message } from '../schema/message';
|
|
2
|
-
export type PathValidationConfig = {
|
|
3
|
-
attachmentRoots: string[];
|
|
4
|
-
source: 'csv' | 'db' | 'merged';
|
|
5
|
-
};
|
|
6
|
-
export type PathValidationStats = {
|
|
7
|
-
total: number;
|
|
8
|
-
found: number;
|
|
9
|
-
missing: number;
|
|
10
|
-
notAbsolute: number;
|
|
11
|
-
errors: Array<{
|
|
12
|
-
guid: string;
|
|
13
|
-
filename: string;
|
|
14
|
-
error: string;
|
|
15
|
-
}>;
|
|
16
|
-
};
|
|
17
|
-
export type PathValidationResult = {
|
|
18
|
-
messages: Message[];
|
|
19
|
-
stats: PathValidationStats;
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* Validate that a path is absolute (starts with /)
|
|
23
|
-
* AC01: All media.path fields are absolute paths when files exist on disk
|
|
24
|
-
*/
|
|
25
|
-
export declare function isAbsolutePath(filePath: string | null | undefined): boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Check if a file exists on the filesystem
|
|
28
|
-
*/
|
|
29
|
-
export declare function fileExists(filePath: string | null | undefined): boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Expand tilde in paths to home directory
|
|
32
|
-
*/
|
|
33
|
-
export declare function expandTildeInPath(filePath: string): string;
|
|
34
|
-
/**
|
|
35
|
-
* Search for an attachment file in configured root directories
|
|
36
|
-
* AC04: Support multiple attachment root directories from config
|
|
37
|
-
* Tries multiple strategies:
|
|
38
|
-
* 1. If filename is absolute and exists, return it
|
|
39
|
-
* 2. Try direct join of root + filename
|
|
40
|
-
* 3. Search for basename in root
|
|
41
|
-
*/
|
|
42
|
-
export declare function searchAttachmentInRoots(filename: string, attachmentRoots: string[]): string | null;
|
|
43
|
-
/**
|
|
44
|
-
* Infer the source (csv/db) from message metadata or GUID pattern
|
|
45
|
-
*/
|
|
46
|
-
export declare function inferSource(message: Message, defaultSource: 'csv' | 'db' | 'merged'): 'csv' | 'db';
|
|
47
|
-
/**
|
|
48
|
-
* Create provenance metadata for a media file
|
|
49
|
-
* AC02: Missing files retain original filename with provenance metadata
|
|
50
|
-
*/
|
|
51
|
-
export declare function createProvenance(message: Message, source: 'csv' | 'db' | 'merged'): MediaProvenance;
|
|
52
|
-
/**
|
|
53
|
-
* Validate and enforce absolute paths for all media messages
|
|
54
|
-
*
|
|
55
|
-
* AC01: All media.path fields are absolute paths when files exist on disk
|
|
56
|
-
* AC02: Missing files retain original filename with provenance metadata
|
|
57
|
-
* AC03: Path validation errors reported with counters (found vs missing)
|
|
58
|
-
* AC04: Support multiple attachment root directories from config
|
|
59
|
-
*/
|
|
60
|
-
export declare function validateAndEnforcePaths(messages: Message[], config: PathValidationConfig): PathValidationResult;
|
|
61
|
-
/**
|
|
62
|
-
* Format path validation statistics as human-readable string for logging
|
|
63
|
-
*/
|
|
64
|
-
export declare function formatPathValidationStats(stats: PathValidationStats): string;
|
|
65
|
-
//# sourceMappingURL=path-validator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"path-validator.d.ts","sourceRoot":"","sources":["../../src/normalize/path-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAIjE,MAAM,MAAM,oBAAoB,GAAG;IAClC,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;KACb,CAAC,CAAA;CACF,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,EAAE,mBAAmB,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAK3E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CASvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,GACvB,MAAM,GAAG,IAAI,CA4Bf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAC1B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,KAAK,GAAG,IAAI,GAAG,QAAQ,GACpC,KAAK,GAAG,IAAI,CAqBd;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,QAAQ,GAC7B,eAAe,CAOjB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,oBAAoB,GAC1B,oBAAoB,CA8FtB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAoB5E"}
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import * as os from 'node:os';
|
|
3
|
-
import * as path from 'node:path';
|
|
4
|
-
/**
|
|
5
|
-
* Validate that a path is absolute (starts with /)
|
|
6
|
-
* AC01: All media.path fields are absolute paths when files exist on disk
|
|
7
|
-
*/
|
|
8
|
-
export function isAbsolutePath(filePath) {
|
|
9
|
-
if (!filePath || typeof filePath !== 'string') {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
return filePath.startsWith('/');
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Check if a file exists on the filesystem
|
|
16
|
-
*/
|
|
17
|
-
export function fileExists(filePath) {
|
|
18
|
-
if (!filePath || typeof filePath !== 'string') {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
try {
|
|
22
|
-
return existsSync(filePath);
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Expand tilde in paths to home directory
|
|
30
|
-
*/
|
|
31
|
-
export function expandTildeInPath(filePath) {
|
|
32
|
-
if (filePath.startsWith('~')) {
|
|
33
|
-
return filePath.replace('~', os.homedir());
|
|
34
|
-
}
|
|
35
|
-
return filePath;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Search for an attachment file in configured root directories
|
|
39
|
-
* AC04: Support multiple attachment root directories from config
|
|
40
|
-
* Tries multiple strategies:
|
|
41
|
-
* 1. If filename is absolute and exists, return it
|
|
42
|
-
* 2. Try direct join of root + filename
|
|
43
|
-
* 3. Search for basename in root
|
|
44
|
-
*/
|
|
45
|
-
export function searchAttachmentInRoots(filename, attachmentRoots) {
|
|
46
|
-
if (!filename || attachmentRoots.length === 0) {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
for (const root of attachmentRoots) {
|
|
50
|
-
// Expand tilde in root directory
|
|
51
|
-
const expandedRoot = expandTildeInPath(root);
|
|
52
|
-
// Try direct file join
|
|
53
|
-
const directPath = path.join(expandedRoot, filename);
|
|
54
|
-
if (fileExists(directPath)) {
|
|
55
|
-
return directPath;
|
|
56
|
-
}
|
|
57
|
-
// Try basename matching (file in any subdirectory of root)
|
|
58
|
-
try {
|
|
59
|
-
const basename = path.basename(filename);
|
|
60
|
-
const basenameOnly = path.join(expandedRoot, basename);
|
|
61
|
-
if (fileExists(basenameOnly)) {
|
|
62
|
-
return basenameOnly;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// Continue to next root
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Infer the source (csv/db) from message metadata or GUID pattern
|
|
73
|
-
*/
|
|
74
|
-
export function inferSource(message, defaultSource) {
|
|
75
|
-
// Check guid pattern
|
|
76
|
-
if (message.guid?.startsWith('p:')) {
|
|
77
|
-
// Part GUID format: p:index/guid
|
|
78
|
-
return 'db';
|
|
79
|
-
}
|
|
80
|
-
if (message.guid?.startsWith('csv:')) {
|
|
81
|
-
return 'csv';
|
|
82
|
-
}
|
|
83
|
-
// Check if there's explicit metadata
|
|
84
|
-
const msgWithMeta = message;
|
|
85
|
-
if (msgWithMeta.exportMetadata?.source === 'csv') {
|
|
86
|
-
return 'csv';
|
|
87
|
-
}
|
|
88
|
-
if (msgWithMeta.exportMetadata?.source === 'db') {
|
|
89
|
-
return 'db';
|
|
90
|
-
}
|
|
91
|
-
// Default fallback
|
|
92
|
-
return defaultSource === 'csv' ? 'csv' : 'db';
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Create provenance metadata for a media file
|
|
96
|
-
* AC02: Missing files retain original filename with provenance metadata
|
|
97
|
-
*/
|
|
98
|
-
export function createProvenance(message, source) {
|
|
99
|
-
const now = new Date().toISOString();
|
|
100
|
-
return {
|
|
101
|
-
source: source,
|
|
102
|
-
lastSeen: message.date,
|
|
103
|
-
resolvedAt: now,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Validate and enforce absolute paths for all media messages
|
|
108
|
-
*
|
|
109
|
-
* AC01: All media.path fields are absolute paths when files exist on disk
|
|
110
|
-
* AC02: Missing files retain original filename with provenance metadata
|
|
111
|
-
* AC03: Path validation errors reported with counters (found vs missing)
|
|
112
|
-
* AC04: Support multiple attachment root directories from config
|
|
113
|
-
*/
|
|
114
|
-
export function validateAndEnforcePaths(messages, config) {
|
|
115
|
-
const result = {
|
|
116
|
-
messages: [],
|
|
117
|
-
stats: {
|
|
118
|
-
total: 0,
|
|
119
|
-
found: 0,
|
|
120
|
-
missing: 0,
|
|
121
|
-
notAbsolute: 0,
|
|
122
|
-
errors: [],
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
for (const message of messages) {
|
|
126
|
-
// Only process media messages
|
|
127
|
-
if (message.messageKind !== 'media' || !message.media) {
|
|
128
|
-
result.messages.push(message);
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
const updatedMessage = { ...message };
|
|
132
|
-
const media = { ...message.media };
|
|
133
|
-
result.stats.total++;
|
|
134
|
-
let resolvedPath = media.path;
|
|
135
|
-
let pathAbsolute = isAbsolutePath(resolvedPath);
|
|
136
|
-
let pathExists = fileExists(resolvedPath);
|
|
137
|
-
// If path is not absolute, try to resolve it
|
|
138
|
-
if (!pathAbsolute && resolvedPath) {
|
|
139
|
-
// Try expanding tilde
|
|
140
|
-
const expanded = expandTildeInPath(resolvedPath);
|
|
141
|
-
if (fileExists(expanded)) {
|
|
142
|
-
resolvedPath = expanded;
|
|
143
|
-
pathAbsolute = true;
|
|
144
|
-
pathExists = true;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// If still not absolute, try searching in attachment roots
|
|
148
|
-
if (!pathAbsolute && media.filename) {
|
|
149
|
-
const found = searchAttachmentInRoots(media.filename, config.attachmentRoots);
|
|
150
|
-
if (found) {
|
|
151
|
-
resolvedPath = found;
|
|
152
|
-
pathAbsolute = true;
|
|
153
|
-
pathExists = true;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// Update statistics and path
|
|
157
|
-
if (pathAbsolute && pathExists) {
|
|
158
|
-
result.stats.found++;
|
|
159
|
-
media.path = resolvedPath;
|
|
160
|
-
}
|
|
161
|
-
else if (pathAbsolute && !pathExists) {
|
|
162
|
-
// Path is absolute but file not found
|
|
163
|
-
result.stats.missing++;
|
|
164
|
-
const error = `File not found at path: ${resolvedPath}`;
|
|
165
|
-
result.stats.errors.push({
|
|
166
|
-
guid: message.guid,
|
|
167
|
-
filename: media.filename,
|
|
168
|
-
error,
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
else if (!pathAbsolute) {
|
|
172
|
-
// Path is not absolute
|
|
173
|
-
result.stats.notAbsolute++;
|
|
174
|
-
const error = `Path is not absolute: ${resolvedPath || '(empty)'}`;
|
|
175
|
-
result.stats.errors.push({
|
|
176
|
-
guid: message.guid,
|
|
177
|
-
filename: media.filename,
|
|
178
|
-
error,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
// Unknown state
|
|
183
|
-
result.stats.missing++;
|
|
184
|
-
const error = 'Could not resolve path';
|
|
185
|
-
result.stats.errors.push({
|
|
186
|
-
guid: message.guid,
|
|
187
|
-
filename: media.filename,
|
|
188
|
-
error,
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
// AC02: Add provenance metadata
|
|
192
|
-
const _source = inferSource(message, config.source);
|
|
193
|
-
media.provenance = createProvenance(message, config.source);
|
|
194
|
-
updatedMessage.media = media;
|
|
195
|
-
result.messages.push(updatedMessage);
|
|
196
|
-
}
|
|
197
|
-
return result;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Format path validation statistics as human-readable string for logging
|
|
201
|
-
*/
|
|
202
|
-
export function formatPathValidationStats(stats) {
|
|
203
|
-
const lines = [
|
|
204
|
-
'📁 Path Validation Report',
|
|
205
|
-
` Total media files: ${stats.total}`,
|
|
206
|
-
` ✓ Found (absolute & exists): ${stats.found}`,
|
|
207
|
-
` ✗ Missing (absolute but no file): ${stats.missing}`,
|
|
208
|
-
` ⚠ Not absolute: ${stats.notAbsolute}`,
|
|
209
|
-
];
|
|
210
|
-
if (stats.errors.length > 0) {
|
|
211
|
-
lines.push(` Errors (${stats.errors.length}):`);
|
|
212
|
-
stats.errors.slice(0, 5).forEach((err) => {
|
|
213
|
-
lines.push(` - ${err.filename} (${err.guid}): ${err.error}`);
|
|
214
|
-
});
|
|
215
|
-
if (stats.errors.length > 5) {
|
|
216
|
-
lines.push(` ... and ${stats.errors.length - 5} more`);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return lines.join('\n');
|
|
220
|
-
}
|
|
221
|
-
//# sourceMappingURL=path-validator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"path-validator.js","sourceRoot":"","sources":["../../src/normalize/path-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { ZodIssue } from 'zod';
|
|
2
|
-
import type { Message } from '../schema/message';
|
|
3
|
-
export type ValidationError = {
|
|
4
|
-
index: number;
|
|
5
|
-
fieldPath: string;
|
|
6
|
-
message: string;
|
|
7
|
-
};
|
|
8
|
-
/**
|
|
9
|
-
* AC01: Validate all normalized messages against MessageSchema
|
|
10
|
-
* AC02: Include field paths in error messages
|
|
11
|
-
* AC03: Batch validation - collect all errors before throwing
|
|
12
|
-
* @param messages - Array of messages to validate
|
|
13
|
-
* @returns Array of validated messages if all pass
|
|
14
|
-
* @throws Error with formatted error messages if any validation fails
|
|
15
|
-
*/
|
|
16
|
-
export declare function validateNormalizedMessages(messages: unknown[]): Message[];
|
|
17
|
-
/**
|
|
18
|
-
* AC02: Format Zod validation errors with field paths
|
|
19
|
-
* Converts Zod error array into readable messages with paths
|
|
20
|
-
* @param messageIndex - Index of the message in the array
|
|
21
|
-
* @param zodErrors - Zod validation errors
|
|
22
|
-
* @returns Formatted error message string
|
|
23
|
-
*/
|
|
24
|
-
export declare function formatValidationErrors(_messageIndex: number, zodErrors: ZodIssue[]): string;
|
|
25
|
-
/**
|
|
26
|
-
* AC04: Detect if message has snake_case fields
|
|
27
|
-
* Recursively checks for snake_case field names
|
|
28
|
-
* @param obj - Object to check
|
|
29
|
-
* @returns true if any snake_case fields found
|
|
30
|
-
*/
|
|
31
|
-
export declare function hasSnakeCaseFields(obj: unknown, depth?: number): boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Get all snake_case fields in an object (for error reporting)
|
|
34
|
-
* @param obj - Object to check
|
|
35
|
-
* @returns Array of field names that use snake_case
|
|
36
|
-
*/
|
|
37
|
-
export declare function getSnakeCaseFields(obj: unknown, prefix?: string, depth?: number): string[];
|
|
38
|
-
/**
|
|
39
|
-
* AC03: Collect validation errors from multiple messages
|
|
40
|
-
* Helper to aggregate errors with message index
|
|
41
|
-
* @param errorList - List of validation errors
|
|
42
|
-
* @returns Formatted error messages with indices
|
|
43
|
-
*/
|
|
44
|
-
export declare function collectValidationErrors(errorList: ValidationError[]): string[];
|
|
45
|
-
//# sourceMappingURL=validate-normalized.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-normalized.d.ts","sourceRoot":"","sources":["../../src/normalize/validate-normalized.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAGhD,MAAM,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAuDzE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,QAAQ,EAAE,GACnB,MAAM,CAeR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAsBnE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,OAAO,EACZ,MAAM,SAAK,EACX,KAAK,SAAI,GACP,MAAM,EAAE,CAuBV;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACtC,SAAS,EAAE,eAAe,EAAE,GAC1B,MAAM,EAAE,CAIV"}
|