Skip to content

TypeScriptified data generator date utils - #30039

Merged
EvanHahn merged 3 commits into
mainfrom
seeder-database-date-to-ts
Aug 18, 2026
Merged

TypeScriptified data generator date utils#30039
EvanHahn merged 3 commits into
mainfrom
seeder-database-date-to-ts

Conversation

@EvanHahn

Copy link
Copy Markdown
Contributor

no ref

I recommend reviewing this one commit at a time.

@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: QUIET

Plan: Pro Plus

Run ID: 80197305-21a8-4c44-811a-8c6f09bb095c

📥 Commits

Reviewing files that changed from the base of the PR and between ce08414 and e7cfe8a.

📒 Files selected for processing (31)
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js

Included review availability: Your plan includes up to 10 reviews per rolling hour; 7 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (13)
  • GitHub Check: Legacy tests (Node 22.23.1, better-sqlite3)
  • GitHub Check: Build E2E Public App Assets
  • GitHub Check: Unit tests (Node 22.23.1)
  • GitHub Check: Acceptance tests (Node 22.23.1, mysql8)
  • GitHub Check: Acceptance tests (Node 22.23.1, better-sqlite3)
  • GitHub Check: Legacy tests (Node 22.23.1, mysql8)
  • GitHub Check: Lint
  • GitHub Check: Build Docker Images
  • GitHub Check: Build Admin
  • GitHub Check: i18n
  • GitHub Check: Check migration integrity
  • GitHub Check: Check app version bump
  • GitHub Check: Analyze (javascript-typescript)
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{js,jsx,cjs,mjs}

📄 CodeRabbit inference engine (Custom checks)

**/*.{js,jsx,cjs,mjs}: New files are TypeScript: Fail if the PR adds a new .js/.jsx/.cjs/.mjs source file, unless it is: a DB
migration (ghost/core/core/server/data/migrations/), under apps/ember-admin/,
a tool/config file, under scripts/ or docker/, or generated/vendored code.
Modifying pre-existing JS files never fails this check.

Files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js

⚙️ CodeRabbit configuration file

**/*.{js,jsx,cjs,mjs}: New source files must be TypeScript: flag new JS files as a required change
unless exempt (DB migrations, apps/ember-admin/, tool/config files, scripts/,
docker/, generated code).
Never request conversion of pre-existing JS files. If the PR substantially
reworks one (rewritten logic or significant new functions — not renames or
small fixes), you may leave ONE optional, non-blocking note for the whole PR
that those files are cheap TS-conversion candidates; skip minor changes and
exempt areas.
If the PR adds or changes a runtime boundary (parsing HTTP input, JSON, config,
external responses), suggest validating it — ideally with TS + Zod.

Files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js
**/*

📄 CodeRabbit inference engine (AGENTS.md)

Always use pnpm, never npm or Yarn.

Files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js

⚙️ CodeRabbit configuration file

**/*: Prioritise concrete correctness, security, data-integrity, compatibility,
and regression risks. Explain the failure mode and point to the affected
code. Do not report formatting, naming, import ordering, type errors, or
other findings already owned by configured static tools or failing GitHub
checks. Do not request speculative abstractions, broad refactors, generic
documentation, or tests unrelated to changed behaviour. Treat nearby
AGENTS.md files and mapped codebase documentation as authoritative; do not
enforce proposals, plans, or historical guidance as current policy.

Files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js
**/*.{ts,tsx}

📄 CodeRabbit inference engine (Custom checks)

**/*.{ts,tsx}: Type-safe boundaries: Fail only if the PR:

  • consumes boundary data (HTTP input, external API/SDK responses, env/config,
    DB/filesystem reads, queue/webhook/event payloads) without validating it
    first — Zod by default, another format only where an external contract
    requires it; or
  • introduces any, unchecked as, @ts-nocheck, or @ts-ignore to bypass
    typing boundary data; or
  • hand-writes a type duplicating a shape a Zod schema describes (use z.infer).
    Never fail for: internal function/module calls (no runtime validation needed),
    pre-existing JS files touched incidentally, tests, scripts, or config files.

Files:

  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
**/*.{ts,tsx,mts,cts}

⚙️ CodeRabbit configuration file

**/*.{ts,tsx,mts,cts}: Review lens: "where does this data become trusted?"

  • Boundary data (HTTP input, external API/SDK responses, env/config,
    DB/filesystem reads, queue/webhook/event payloads) is unknown until
    validated — Zod by default.
  • Infer boundary types via z.infer/z.input; flag handwritten duplicates.
  • Flag any, unchecked as on boundary data, @ts-nocheck, and unexplained
    @ts-ignore/@ts-expect-error.
  • Validated data stays trusted: don't request Zod on internal calls, and flag
    redundant re-validation.
  • ghost/core golden path: schema.ts owns Zod schemas + inferred types, with
    codec/serializer modules at the edges (see core/server/services/gift-links).
  • Looser typing in tests is fine unless it hides a real defect.

Files:

  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
**/*{.,-}{test,spec}.{js,jsx,ts,tsx}

⚙️ CodeRabbit configuration file

**/*{.,-}{test,spec}.{js,jsx,ts,tsx}: Review whether tests prove changed behaviour, meaningful error/edge paths, and
externally observable contracts without coupling to implementation details.
Prefer the lowest useful test layer. Do not demand broad E2E coverage for
isolated logic or repeat test-run failures already visible in GitHub checks.

Files:

  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
🧠 Learnings (9)
📚 Learning: 2026-01-08T10:26:38.700Z
Learnt from: rob-ghost
Repo: TryGhost/Ghost PR: 25791
File: ghost/core/core/server/api/endpoints/member-comment-ban.js:64-68
Timestamp: 2026-01-08T10:26:38.700Z
Learning: In the Ghost API, endpoints rely on the serialization layer to prepare frame.data[docName] as a non-empty array before query() executes. Endpoints access frame.data[docName][0] directly (e.g., frame.data.comment_bans[0], frame.data.members[0], frame.data.posts[0]) without per-endpoint validation. This pattern is common across API endpoints. When maintaining or creating endpoints, avoid duplicating validation for frame.data[docName] and ensure the serializer guarantees the shape and non-emptiness. If you add a new endpoint that uses this frame.data[docName], follow the same assumption and avoid redundant checks unless there's a documented exception.

Applied to files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js
📚 Learning: 2026-02-04T15:58:09.124Z
Learnt from: rob-ghost
Repo: TryGhost/Ghost PR: 26219
File: ghost/core/test/e2e-api/members-comments/comments.test.js:939-983
Timestamp: 2026-02-04T15:58:09.124Z
Learning: In Ghost core tests and code that interact with the Ghost comments API, count.replies is a backward-compatible alias for count.total_replies (all descendants via parent_id) and does not represent direct replies. The new field count.direct_replies returns tree-native direct reply counts. Reviewers should verify any code paths, tests, or API surface areas that rely on count.replies are preserved for compatibility, and consider updating or adding tests to cover count.direct_replies for direct counts. When updating or adding tests, ensure behavior is documented and that any assertions reflect the distinction between total (including descendants) and direct reply counts to avoid regressions in API consumer expectations.

Applied to files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js
📚 Learning: 2026-04-09T09:44:26.783Z
Learnt from: vershwal
Repo: TryGhost/Ghost PR: 27290
File: ghost/core/package.json:76-77
Timestamp: 2026-04-09T09:44:26.783Z
Learning: In the TryGhost/Ghost monorepo, treat `tryghost/admin-api-schema` as the single abstraction layer over AJV version differences. Do not raise code review findings for AJV-internal error field changes (e.g., `dataPath` → `instancePath` between AJV v6 and v8) when evaluating Ghost consumer code. The consumer-facing error contract for this package (`ValidationError` with `message`, `property`, `errorDetails`) is expected to remain stable, and Ghost wrapper code should not inspect raw AJV error objects—so review should focus on the stable `ValidationError` shape rather than AJV internals.

Applied to files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js
📚 Learning: 2026-06-04T15:15:20.265Z
Learnt from: JohnONolan
Repo: TryGhost/Ghost PR: 28368
File: apps/admin-x-settings/src/components/settings/site/navigation/navigation-edit-form.tsx:32-32
Timestamp: 2026-06-04T15:15:20.265Z
Learning: In this TryGhost/Ghost codebase (Tailwind CSS v4), use/accept the v4 suffix form of the important modifier in class names (e.g., `opacity-100!`, `flex!`). Do not flag these as incorrect or inconsistent with the older v3 prefix form (`!opacity-100`), since the suffix form is the established convention and aligns with the generated CSS.

Applied to files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js
📚 Learning: 2026-06-22T14:36:35.803Z
Learnt from: sagzy
Repo: TryGhost/Ghost PR: 28779
File: ghost/core/core/frontend/web/middleware/error-handler.js:0-0
Timestamp: 2026-06-22T14:36:35.803Z
Learning: When using Express.js view engines, Express stores engine handler functions in `app.engines` with keys that include a leading dot (e.g., `app.engines['.hbs']` and `app.engines['.ejs']`). Therefore, checking `app.engines.hbs` (no dot) will be `undefined`; to test whether an engine is already registered, use bracket notation with the dot prefix: `app.engines['.hbs'] !== undefined` (or equivalently `Object.prototype.hasOwnProperty.call(app.engines, '.hbs')`).

Applied to files:

  • ghost/core/core/server/data/seeders/importers/offers-importer.js
  • ghost/core/core/server/data/seeders/importers/members-products-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-importer.js
  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
  • ghost/core/core/server/data/seeders/importers/web-mentions-importer.js
  • ghost/core/core/server/data/seeders/importers/posts-importer.js
  • ghost/core/core/server/data/seeders/importers/members-login-events-importer.js
  • ghost/core/core/server/data/seeders/importers/users-importer.js
  • ghost/core/core/server/data/seeders/importers/email-batches-importer.js
  • ghost/core/core/server/data/seeders/importers/emails-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js
  • ghost/core/core/server/data/seeders/importers/comments-importer.js
  • ghost/core/core/server/data/seeders/importers/members-created-events-importer.js
  • ghost/core/core/server/data/seeders/importers/members-click-events-importer.js
  • ghost/core/core/server/data/seeders/importers/comment-reports-importer.js
  • ghost/core/core/server/data/seeders/importers/email-recipients-importer.js
  • ghost/core/core/server/data/seeders/importers/labels-importer.js
  • ghost/core/core/server/data/seeders/importers/members-status-events-importer.js
  • ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js
  • ghost/core/core/server/data/seeders/importers/tags-importer.js
  • ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js
  • ghost/core/core/server/data/seeders/importers/members-feedback-importer.js
📚 Learning: 2026-07-20T10:54:38.657Z
Learnt from: rob-ghost
Repo: TryGhost/Ghost PR: 29441
File: ghost/core/core/server/services/members-custom-fields/definitions-service.ts:202-219
Timestamp: 2026-07-20T10:54:38.657Z
Learning: When reviewing Ghost API behavior for `errors.HostLimitError`, validate the final serialized error payload that the API returns. Specifically, Ghost relocates the `HostLimitError`’s provided `message` into the serialized response’s `context`, and it replaces the serialized `message` with a generic host-limit message. Therefore, do not assume the error option fields (e.g., `message`) are returned unchanged—assert against the serialized payload shape (`context` contains the original message; `message` is the generic host-limit text) rather than the original thrown error fields.

Applied to files:

  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
📚 Learning: 2026-07-21T16:24:24.623Z
Learnt from: vershwal
Repo: TryGhost/Ghost PR: 29493
File: ghost/core/core/server/services/route-settings/route-settings-parser.ts:93-118
Timestamp: 2026-07-21T16:24:24.623Z
Learning: When handling Zod validation failures for `z.discriminatedUnion('type', ...)`, do not branch logic based on the human-readable `issue.message` text (it’s not a stable contract). Instead, use structured Zod issue fields to detect the specific failure mode—e.g., check `issue.code === 'invalid_union'` and that `issue.path[0] === 'type'` (or the configured discriminator key)—so the behavior remains reliable across Zod versions.

Applied to files:

  • ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts
  • ghost/core/core/server/data/seeders/importers/automations-importer.ts
  • ghost/core/core/server/data/seeders/importers/table-importer.ts
  • ghost/core/core/server/data/seeders/utils/database-date.ts
  • ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts
  • ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts
📚 Learning: 2026-01-26T13:53:03.597Z
Learnt from: rob-ghost
Repo: TryGhost/Ghost PR: 25791
File: ghost/core/test/e2e-api/admin/member-commenting.test.js:268-321
Timestamp: 2026-01-26T13:53:03.597Z
Learning: In Ghost's e2e API tests, audit events should separate the generic operation from the specific action. Assert that event equals the CRUD operation type (e.g., 'edited', 'added', 'deleted') and, if needed, also assert on context.action_name for the exact action (e.g., 'commenting_disabled', 'commenting_enabled'). This makes tests robust to both high-level and specific audit details.

Applied to files:

  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
📚 Learning: 2026-03-12T10:43:01.366Z
Learnt from: vershwal
Repo: TryGhost/Ghost PR: 26791
File: ghost/core/test/unit/server/services/media-inliner/test/external-media-inliner.test.js:1033-1039
Timestamp: 2026-03-12T10:43:01.366Z
Learning: In tests for the Ghost media-inliner, when reviews reference getMediaStorage withArgs(extension), verify that the extension corresponds to the actual binary content of the nock/mocked response (detected via magic bytes) rather than the URL filename. This applies to all tests under ghost/core/test/unit/server/services/media-inliner (and similar media-inliner tests). Use binary content to determine expected extension (e.g., a GIF blob should yield .gif even if the URL ends with .jpg).

Applied to files:

  • ghost/core/test/unit/server/data/seeders/data-generator.test.js
🔇 Additional comments (31)
ghost/core/core/server/data/seeders/utils/database-date.ts (1)

1-11: LGTM!

Also applies to: 13-13, 25-30

ghost/core/core/server/data/seeders/importers/automation-action-revisions-importer.ts (1)

5-5: LGTM!

Also applies to: 69-75

ghost/core/core/server/data/seeders/importers/automation-actions-importer.ts (1)

5-5: LGTM!

Also applies to: 54-63

ghost/core/core/server/data/seeders/importers/automation-runs-importer.ts (1)

7-7: LGTM!

Also applies to: 76-77, 87-88

ghost/core/core/server/data/seeders/importers/automations-importer.ts (1)

8-8: LGTM!

Also applies to: 55-56

ghost/core/core/server/data/seeders/importers/members-importer.js (1)

7-7: LGTM!

Also applies to: 91-93

ghost/core/core/server/data/seeders/importers/members-login-events-importer.js (1)

4-4: LGTM!

Also applies to: 37-37, 63-63

ghost/core/core/server/data/seeders/importers/members-products-importer.js (1)

4-4: LGTM!

Also applies to: 37-37

ghost/core/core/server/data/seeders/importers/members-status-events-importer.js (1)

2-2: LGTM!

Also applies to: 34-42

ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js (1)

3-3: LGTM!

Also applies to: 98-98, 196-197, 239-240, 251-251

ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js (1)

3-3: LGTM!

Also applies to: 53-53

ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts (1)

6-6: LGTM!

Also applies to: 116-122

ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js (1)

3-3: LGTM!

Also applies to: 38-38

ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js (1)

4-4: LGTM!

Also applies to: 51-52

ghost/core/core/server/data/seeders/importers/offer-redemptions-importer.js (1)

4-4: LGTM!

Also applies to: 56-56, 81-89, 101-101

ghost/core/core/server/data/seeders/importers/offers-importer.js (1)

4-4: LGTM!

Also applies to: 110-111

ghost/core/core/server/data/seeders/importers/posts-importer.js (1)

5-5: LGTM!

Also applies to: 56-58

ghost/core/core/server/data/seeders/importers/tags-importer.js (1)

4-4: LGTM!

Also applies to: 35-35

ghost/core/core/server/data/seeders/importers/users-importer.js (1)

5-5: LGTM!

Also applies to: 27-27

ghost/core/core/server/data/seeders/importers/web-mentions-importer.js (1)

3-3: LGTM!

Also applies to: 34-34

ghost/core/test/unit/server/data/seeders/data-generator.test.js (1)

14-14: LGTM!

Also applies to: 486-486, 501-501

ghost/core/core/server/data/seeders/importers/comment-reports-importer.js (1)

4-4: LGTM!

Also applies to: 52-61

ghost/core/core/server/data/seeders/importers/comments-importer.js (1)

5-5: LGTM!

Also applies to: 27-27, 40-40, 100-101

ghost/core/core/server/data/seeders/importers/email-batches-importer.js (1)

3-3: LGTM!

Also applies to: 24-25, 34-34

ghost/core/core/server/data/seeders/importers/email-recipients-importer.js (1)

4-4: LGTM!

Also applies to: 114-114, 128-129, 167-167, 190-192, 201-204

ghost/core/core/server/data/seeders/importers/emails-importer.js (1)

5-5: LGTM!

Also applies to: 45-45, 58-58, 90-93

ghost/core/core/server/data/seeders/importers/labels-importer.js (1)

5-5: LGTM!

Also applies to: 33-34

ghost/core/core/server/data/seeders/importers/members-click-events-importer.js (1)

4-4: LGTM!

Also applies to: 53-53, 64-64

ghost/core/core/server/data/seeders/importers/members-created-events-importer.js (1)

4-4: LGTM!

Also applies to: 50-51, 95-95

ghost/core/core/server/data/seeders/importers/members-feedback-importer.js (1)

3-3: LGTM!

Also applies to: 27-39

ghost/core/core/server/data/seeders/importers/table-importer.ts (1)

2-2: LGTM!

Also applies to: 126-126


Walkthrough

The database-date utility now uses typed ES-module exports for dateToDatabaseString, parse, and randomBetween. Automation and other seeders now import the utility namespace and call these methods explicitly. Unit tests use the updated namespace binding. Date generation and persistence behavior remain unchanged.

Possibly related PRs

Suggested reviewers: 9larsons

Merge Risk: ⚪ Minimal · up to e7cfe

This localized TypeScript conversion is merge-ready after normal checks and review; no actionable merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 5 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description provides no meaningful summary of the changes and only gives a vague review instruction. Add a concise summary of the TypeScript conversion and database-date API changes.
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: converting the data generator date utilities to TypeScript.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Type-Safe Boundaries ✅ Passed The PR only migrates the date utility and renames call sites; its logic matches the prior JS, and no new any, unchecked as, ts-ignore, or duplicated Zod shape appears.
New Files Are Typescript ✅ Passed The complete PR diff adds no .js/.jsx/.cjs/.mjs files; database-date.js is renamed to database-date.ts, and other JavaScript files are only modified.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch seeder-database-date-to-ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@nx-cloud

nx-cloud Bot commented Aug 17, 2026

Copy link
Copy Markdown

🤖 Nx Cloud AI Fix

Ensure the fix-ci command is configured to always run in your CI pipeline to get automatic fixes in future runs. For more information, please see https://nx.dev/ci/features/self-healing-ci


View your CI Pipeline Execution ↗ for commit e7cfe8a

Command Status Duration Result
nx run ghost:test:ci:integration ✅ Succeeded 3m 19s View ↗
nx run ghost:test:integration ✅ Succeeded 2m 31s View ↗
nx run ghost:test:legacy ✅ Succeeded 3m 12s View ↗
nx run ghost:test:e2e ✅ Succeeded 2m 13s View ↗
nx run-many -t test:unit -p ghost ✅ Succeeded 26s View ↗
nx run ghost-monorepo:lint:boundaries ✅ Succeeded 21s View ↗
nx run @tryghost/admin:build ✅ Succeeded 7s View ↗
nx run-many -t lint -p ghost,ghost-monorepo ✅ Succeeded 19s View ↗
nx run-many --target=build --projects=tag:publi... ✅ Succeeded 1s View ↗

💡 Verify your cache is correct by running tasks in a sandbox. Read docs ↗


☁️ Nx Cloud last updated this comment at 2026-08-17 22:39:23 UTC

@codecov

codecov Bot commented Aug 17, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 0% with 119 lines in your changes missing coverage. Please review.
✅ Project coverage is 75.32%. Comparing base (ce08414) to head (e7cfe8a).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...ata/seeders/importers/email-recipients-importer.js 0.00% 11 Missing ⚠️
...re/core/server/data/seeders/utils/database-date.ts 0.00% 9 Missing ⚠️
...members-stripe-customers-subscriptions-importer.js 0.00% 7 Missing ⚠️
...e/server/data/seeders/importers/emails-importer.js 0.00% 6 Missing ⚠️
...ata/seeders/importers/members-feedback-importer.js 0.00% 6 Missing ⚠️
...data/seeders/importers/automation-runs-importer.ts 0.00% 5 Missing ⚠️
...server/data/seeders/importers/comments-importer.js 0.00% 5 Missing ⚠️
...ta/seeders/importers/offer-redemptions-importer.js 0.00% 5 Missing ⚠️
...a/seeders/importers/automation-actions-importer.ts 0.00% 4 Missing ⚠️
...data/seeders/importers/comment-reports-importer.js 0.00% 4 Missing ⚠️
... and 20 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #30039      +/-   ##
==========================================
- Coverage   75.32%   75.32%   -0.01%     
==========================================
  Files        1603     1603              
  Lines      142363   142355       -8     
  Branches    17569    17566       -3     
==========================================
- Hits       107241   107234       -7     
- Misses      34097    34122      +25     
+ Partials     1025      999      -26     
Flag Coverage Δ
e2e-tests 77.21% <0.00%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@EvanHahn
EvanHahn merged commit 1eaff16 into main Aug 18, 2026
54 checks passed
@EvanHahn
EvanHahn deleted the seeder-database-date-to-ts branch August 18, 2026 13:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant