diff --git a/changelogs/drizzle-seed/0.3.2.md b/changelogs/drizzle-seed/0.3.2.md new file mode 100644 index 0000000000..9a4c5fbcc7 --- /dev/null +++ b/changelogs/drizzle-seed/0.3.2.md @@ -0,0 +1,145 @@ +## Bug fixes + +- https://github.com/drizzle-team/drizzle-orm/issues/3914 + +Both the `seed` and `reset` functions didn't include `LibSQLDatabase` in their generic type parameters. +As a result, the `seed` function accepts a `db` parameter like this: + +```ts +import { drizzle } from "drizzle-orm/libsql"; +import * as schema from "./schema.ts"; + +const db = drizzle({ + connection: { + url: "", + authToken: "", + }, +}); + +await seed(db, schema); +``` + +But it will reject a `db` parameter defined like this: + +```ts +import { drizzle } from "drizzle-orm/libsql"; +import * as schema from "./schema.ts"; + +const db = drizzle({ + schema, + connection: { + url: "", + authToken: "", + }, +}); + +await seed(db, schema); +``` + +- https://github.com/drizzle-team/drizzle-orm/issues/4194 + +drizzle-seed misinterpreted `realEstateTypeEnum` enum as a `real` type. + +- https://github.com/drizzle-team/drizzle-orm/issues/3915 + +drizzle seed breaks serial sequence sync with Postgres serial type. + +## Features + +- ignore column in refinements + +Now you can let drizzle-seed know if you want to ignore column during seeding. + +```ts +// schema.ts +import { integer, pgTable, text } from "drizzle-orm/pg-core"; + +export const users = pgTable("users", { + id: integer().primaryKey(), + name: text().notNull(), + age: integer(), + photo: text(), +}); +``` + +```ts +// index.ts +import { drizzle } from "drizzle-orm/node-postgres"; +import { seed } from "drizzle-seed"; +import * as schema from "./schema.ts"; + +async function main() { + const db = drizzle(process.env["DATABASE_URL"]!); + await seed(db, schema).refine((f) => ({ + users: { + count: 5, + columns: { + name: f.fullName(), + photo: false, // the photo column will not be seeded, allowing the database to use its default value. + }, + }, + })); +} + +main(); +``` + +## Improvements + +- added minTime, maxTime parameters to `time` generator + +```ts +await seed(db, { timeTable: schema.timeTable }).refine((funcs) => ({ + timeTable: { + count, + columns: { + time: funcs.time({ + minTime: "13:12:13", + maxTime: "15:12:13", + }), + }, + }, +})); +``` + +- added minTimestamp, maxTimestamp parameters to `timestamp` generator + +```ts +await seed(db, { timestampTable: schema.timestampTable }).refine((funcs) => ({ + timestampTable: { + count, + columns: { + timestamp: funcs.timestamp({ + minTimestamp: "2025-03-07 13:12:13.123Z", + maxTimestamp: "2025-03-09 15:12:13.456Z", + }), + }, + }, +})); +``` + +- added minDatetime, maxDatetime parameters to `datetime` generator + +```ts +await seed(db, { datetimeTable: schema.datetimeTable }).refine((funcs) => ({ + datetimeTable: { + count, + columns: { + datetime: funcs.datetime({ + minDatetime: "2025-03-07 13:12:13Z", + maxDatetime: "2025-03-09 15:12:13Z", + }), + }, + }, +})); +``` + +- exported `AbstractGenerator` so that users can build their own custom generator classes. + +- drizzle-seed now updates PostgreSQL sequences after seeding. + + drizzle-seed iterates through each column in a table, selects columns of type smallint, integer, bigint, smallserial, serial, or bigserial, and (if a sequence exists) updates it to the column’s maximum seeded value. + + ```sql + select setval(pg_get_serial_sequence('"schema_name"."table_name"', 'column_name'), 3, true); + ``` diff --git a/changelogs/drizzle-seed/1.0.0-beta.8.md b/changelogs/drizzle-seed/1.0.0-beta.8.md new file mode 100644 index 0000000000..d09a339639 --- /dev/null +++ b/changelogs/drizzle-seed/1.0.0-beta.8.md @@ -0,0 +1,168 @@ +## Bug fixes + +- [[BUG]: drizzle seed doesn't work with libSQL](https://github.com/drizzle-team/drizzle-orm/issues/3914) +- [[BUG]: Seed UUIDs not compatible with Zod/v4](https://github.com/drizzle-team/drizzle-orm/issues/4551) +- [[BUG]: drizzle seed generates invalid input value (number) for enum strings (pg)](https://github.com/drizzle-team/drizzle-orm/issues/4194) +- [[BUG]: drizzle seed breaks serial sequence sync with Postgres serial type](https://github.com/drizzle-team/drizzle-orm/issues/3915) + +## Features + +### ignore column in refinements + +Now you can let drizzle-seed know if you want to ignore column during seeding. + +```ts +// schema.ts +import { integer, pgTable, text } from "drizzle-orm/pg-core"; + +export const users = pgTable("users", { + id: integer().primaryKey(), + name: text().notNull(), + age: integer(), + photo: text(), +}); +``` + +```ts +// index.ts +import { drizzle } from "drizzle-orm/node-postgres"; +import { seed } from "drizzle-seed"; +import * as schema from "./schema.ts"; + +async function main() { + const db = drizzle(process.env["DATABASE_URL"]!); + await seed(db, schema).refine((f) => ({ + users: { + count: 5, + columns: { + name: f.fullName(), + photo: false, // the photo column will not be seeded, allowing the database to use its default value. + }, + }, + })); +} + +main(); +``` + +## Improvements + +### Added `min`, `max` parameters to `time` generator + +```ts +await seed(db, { timeTable: schema.timeTable }).refine((funcs) => ({ + timeTable: { + count, + columns: { + time: funcs.time({ + min: "13:12:13", + max: "15:12:13", + }), + }, + }, +})); +``` + +### Added `min`, `max` parameters to `timestamp` generator + +```ts +await seed(db, { timestampTable: schema.timestampTable }).refine((funcs) => ({ + timestampTable: { + count, + columns: { + timestamp: funcs.timestamp({ + min: "2025-03-07 13:12:13.123Z", + max: "2025-03-09 15:12:13.456Z", + }), + }, + }, +})); +``` + +### Added `min`, `max` parameters to `datetime` generator + +```ts +await seed(db, { datetimeTable: schema.datetimeTable }).refine((funcs) => ({ + datetimeTable: { + count, + columns: { + datetime: funcs.datetime({ + min: "2025-03-07 13:12:13Z", + max: "2025-03-09 15:12:13Z", + }), + }, + }, +})); +``` + +### PostgreSQL sequences updating after seed + +`drizzle-seed` iterates through each column in a table, selects columns of type smallint, integer, bigint, smallserial, serial, or bigserial, and (if a sequence exists) updates it to the column’s maximum seeded value. + +```sql +select setval(pg_get_serial_sequence('"schema_name"."table_name"', 'column_name'), 3, true); +``` + +## Breaking changes + +### `uuid` generator was changed and upgraded to v4 + +```ts +await seed(db, { table }).refine((f) => ({ + table: { + columns: { + // AA97B177-9383-4934-8543-0F91A7A02836 + // ^ + // 1 + // the digit at position 1 is always one of '8', '9', 'A' or 'B' + column1: f.uuid(), + } + } +})) +``` + +**Reason for upgrade** + +UUID values generated by the old version of the `uuid` generator fail Zod’s v4 UUID validation. + +example +```ts +import { createSelectSchema } from 'drizzle-zod'; +import { seed } from 'drizzle-seed'; + +await seed(db, { uuidTest: schema.uuidTest }, { count: 1 }).refine((funcs) => ({ + uuidTest: { + columns: { + col1: funcs.uuid() + } + } + }) +); + +const uuidSelectSchema = createSelectSchema(schema.uuidTest); +const res = await db.select().from(schema.uuidTest); +// the line below will throw an error when using old version of uuid generator +uuidSelectSchema.parse(res[0]); +``` + +**Usage** +```ts +await seed(db, schema); +// or explicit +await seed(db, schema, { version: '4' }); +``` + +**Switch to the old version** + +The previous version of `uuid` generator is v1. +```ts +await seed(db, schema, { version: '1' }); +``` +To use the v2 generators while maintaining the v1 `uuid` generator: +```ts +await seed(db, schema, { version: '2' }); +``` +To use the v3 generators while maintaining the v1 `uuid` generator: +```ts +await seed(db, schema, { version: '3' }); +``` \ No newline at end of file diff --git a/drizzle-arktype/package.json b/drizzle-arktype/package.json index a26ddda488..f0e3218622 100644 --- a/drizzle-arktype/package.json +++ b/drizzle-arktype/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-arktype", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "description": "Generate arktype schemas from Drizzle ORM schemas", "type": "module", "scripts": { diff --git a/drizzle-kit/package.json b/drizzle-kit/package.json index 47aa10c1e7..3ff264af3d 100644 --- a/drizzle-kit/package.json +++ b/drizzle-kit/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-kit", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "homepage": "https://orm.drizzle.team", "keywords": [ "drizzle", diff --git a/drizzle-orm/package.json b/drizzle-orm/package.json index 5b335df6b4..796bd0fd52 100644 --- a/drizzle-orm/package.json +++ b/drizzle-orm/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-orm", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "description": "Drizzle ORM package for SQL databases", "type": "module", "scripts": { diff --git a/drizzle-orm/types-bench.ts b/drizzle-orm/types-bench.ts index 1538230bec..8c18abb9c4 100644 --- a/drizzle-orm/types-bench.ts +++ b/drizzle-orm/types-bench.ts @@ -1,1028 +1,1024 @@ -import { bench, setup } from "@arktype/attest"; -import * as schema from "./tmp/big-schema.js"; -import { defineRelations as defy } from "./src/relations.js"; +import { bench, setup } from '@arktype/attest'; +import { defineRelations as defy } from './src/relations.js'; +import * as schema from './tmp/big-schema.js'; // import { defy } from "./src/relations2.js"; // import * as schema from "./big-schema"; setup({ - skipTypes: true, + skipTypes: true, }); -bench("relations", () => { - defy(schema, (r) => ({ - user: { - workspacesViaApiWebhook: r.many.workspace({ - from: r.user.id.through(r.apiWebhook.createdByUserId), - to: r.workspace.id.through(r.apiWebhook.workspaceId), - alias: "user_id_workspace_id_via_apiWebhook", - }), - blockingTimeslots: r.many.blockingTimeslot(), - bookingLinksCreatedByUserId: r.many.bookingLink({ - alias: "bookingLink_createdByUserId_user_id", - }), - bookingSettings: r.one.bookingSettings(), - emailAccounts: r.many.emailAccount(), - apiKeys: r.many.apiKey(), - threadsViaComment: r.many.thread({ - from: r.user.id.through(r.comment.createdByUserId), - to: r.thread.id.through(r.comment.threadId), - alias: "user_id_thread_id_via_comment", - }), - calendarWebhooks: r.many.calendarWebhook(), - bookingLinksViaInviteeBooking: r.many.bookingLink({ - alias: "bookingLink_id_user_id_via_inviteeBooking", - }), - meetingActionItems: r.many.meetingActionItem(), - notesCreatedByUserId: r.many.notes({ - alias: "notes_createdByUserId_user_id", - }), - notesPublishedByUserId: r.many.notes({ - alias: "notes_publishedByUserId_user_id", - }), - motionSubscriptions: r.one.motionSubscription(), - notesViaNoteDataSnapshot: r.many.notes({ - from: r.user.id.through(r.noteDataSnapshot.createdByUserId), - to: r.notes.id.through(r.noteDataSnapshot.noteId), - alias: "user_id_notes_id_via_noteDataSnapshot", - }), - notesViaNoteMention: r.many.notes({ - from: r.user.id.through(r.noteMention.createdByUserId), - to: r.notes.id.through(r.noteMention.noteId), - alias: "user_id_notes_id_via_noteMention", - }), - notesViaNoteUserLastViewed: r.many.notes({ - alias: "notes_id_user_id_via_noteUserLastViewed", - }), - projectDefinitionsCreatedByUserId: r.many.projectDefinition({ - alias: "projectDefinition_createdByUserId_user_id", - }), - projectDefinitionsManagerId: r.many.projectDefinition({ - alias: "projectDefinition_managerId_user_id", - }), - projectsCreatedByUserId: r.many.project({ - alias: "project_createdByUserId_user_id", - }), - projectsManagerId: r.many.project({ - alias: "project_managerId_user_id", - }), - reactions: r.many.reaction(), - referrals: r.many.referral(), - recurringTasksAssigneeUserId: r.many.recurringTask({ - alias: "recurringTask_assigneeUserId_user_id", - }), - recurringTasksCreatedByUserId: r.many.recurringTask({ - alias: "recurringTask_createdByUserId_user_id", - }), - projectManagementViews: r.many.projectManagementView(), - taskDefinitions: r.many.taskDefinition(), - teamsViaTeamInvite: r.many.team({ - from: r.user.id.through(r.teamInvite.inviterId), - to: r.team.id.through(r.teamInvite.teamId), - alias: "user_id_team_id_via_teamInvite", - }), - teamTasksAssigneeUserId: r.many.teamTask({ - alias: "teamTask_assigneeUserId_user_id", - }), - teamTasksCreatedByUserId: r.many.teamTask({ - alias: "teamTask_createdByUserId_user_id", - }), - teamsViaTeamMember: r.many.team({ - alias: "team_id_user_id_via_teamMember", - }), - uploadedFiles: r.many.uploadedFile(), - threadsCreatedByUserId: r.many.thread({ - alias: "thread_createdByUserId_user_id", - }), - userNotificationPreferences: r.many.userNotificationPreferences(), - userOauthCodes: r.many.userOauthCode(), - featurePermissionTiers: r.many.featurePermissionTiers(), - userTaskDefaultSettings: r.many.userTaskDefaultSettings(), - userTutorials: r.one.userTutorials(), - workspacesViaWorkspaceMember: r.many.workspace({ - from: r.user.id.through(r.workspaceMember.userId), - to: r.workspace.id.through(r.workspaceMember.workspaceId), - alias: "user_id_workspace_id_via_workspaceMember", - }), - userSettings: r.one.userSettings(), - teamTasksViaTaskSubscribedUsers: r.many.teamTask({ - alias: "teamTask_id_user_id_via_taskSubscribedUsers", - }), - }, - workspace: { - usersViaApiWebhook: r.many.user({ - alias: "user_id_workspace_id_via_apiWebhook", - }), - customFieldInstances: r.many.customFieldInstance(), - labels: r.many.label(), - notes: r.many.notes(), - projectDefinitionsWorkspaceId: r.many.projectDefinition({ - alias: "projectDefinition_workspaceId_workspace_id", - }), - projectsWorkspaceId: r.many.project({ - alias: "project_workspaceId_workspace_id", - }), - projectDefinitionsViaStageDefinition: r.many.projectDefinition({ - alias: "projectDefinition_id_workspace_id_via_stageDefinition", - }), - recurringTasks: r.many.recurringTask(), - taskDefinitions: r.many.taskDefinition(), - teamTasksWorkspaceId: r.many.teamTask({ - alias: "teamTask_workspaceId_workspace_id", - }), - taskStatuses: r.many.taskStatus(), - projectsViaTemplateProject: r.many.project({ - alias: "project_id_workspace_id_via_templateProject", - }), - teamTasksViaTemplateTask: r.many.teamTask({ - alias: "teamTask_id_workspace_id_via_templateTask", - }), - uploadedFiles: r.many.uploadedFile(), - userTaskDefaultSettings: r.many.userTaskDefaultSettings(), - usersViaWorkspaceMember: r.many.user({ - alias: "user_id_workspace_id_via_workspaceMember", - }), - team: r.one.team({ - from: r.workspace.teamId, - to: r.team.id, - }), - workspaceTaskSequencers: r.one.workspaceTaskSequencer(), - }, - blockingTimeslot: { - user: r.one.user({ - from: r.blockingTimeslot.userId, - to: r.user.id, - }), - }, - bookingLink: { - user: r.one.user({ - from: r.bookingLink.createdByUserId, - to: r.user.id, - alias: "bookingLink_createdByUserId_user_id", - }), - bookingLink: r.one.bookingLink({ - from: r.bookingLink.parentTemplateId, - to: r.bookingLink.id, - alias: "bookingLink_parentTemplateId_bookingLink_id", - }), - bookingLinks: r.many.bookingLink({ - alias: "bookingLink_parentTemplateId_bookingLink_id", - }), - team: r.one.team({ - from: r.bookingLink.teamId, - to: r.team.id, - }), - bookingConflictCalendars: r.many.bookingConflictCalendar(), - bookingQuestions: r.many.bookingQuestion(), - users: r.many.user({ - from: r.bookingLink.id.through(r.inviteeBooking.bookingLinkId), - to: r.user.id.through(r.inviteeBooking.linkCreatorId), - alias: "bookingLink_id_user_id_via_inviteeBooking", - }), - bookingAvailabilitySlots: r.many.bookingAvailabilitySlot(), - }, - team: { - bookingLinks: r.many.bookingLink(), - integrations: r.many.integration(), - meetingInsightsTeamSettings: r.one.meetingInsightsTeamSettings(), - motionSubscriptions: r.one.motionSubscription(), - meetingInsights: r.many.meetingInsights(), - permissionRoles: r.many.permissionRole(), - teamPaymentMethods: r.one.teamPaymentMethod(), - usersViaTeamInvite: r.many.user({ - alias: "user_id_team_id_via_teamInvite", - }), - teamSettings: r.one.teamSettings(), - usersViaTeamMember: r.many.user({ - from: r.team.id.through(r.teamMember.teamId), - to: r.user.id.through(r.teamMember.userId), - alias: "team_id_user_id_via_teamMember", - }), - featurePermissionTiers: r.many.featurePermissionTiers(), - workspaces: r.many.workspace(), - permissionPolicies: r.many.permissionPolicy(), - }, - bookingConflictCalendar: { - bookingLink: r.one.bookingLink({ - from: r.bookingConflictCalendar.bookingLinkId, - to: r.bookingLink.id, - }), - }, - bookingQuestion: { - bookingLink: r.one.bookingLink({ - from: r.bookingQuestion.bookingLinkId, - to: r.bookingLink.id, - }), - }, - bookingSettings: { - user: r.one.user({ - from: r.bookingSettings.userId, - to: r.user.id, - }), - }, - emailAccount: { - users: r.many.user({ - from: r.emailAccount.id.through(r.calendar.emailAccountId), - to: r.user.id.through(r.calendar.userId), - }), - }, - calendarEventExtensions: { - calendar: r.one.calendar({ - from: r.calendarEventExtensions.calendarId, - to: r.calendar.id, - }), - }, - calendar: { - calendarEventExtensions: r.many.calendarEventExtensions(), - }, - calendarEvent: { - syncSession: r.one.syncSession({ - from: r.calendarEvent.syncSessionId, - to: r.syncSession.id, - }), - meetingTaskRelations: r.one.meetingTaskRelation(), - }, - syncSession: { - calendarEvents: r.many.calendarEvent(), - }, - apiKey: { - user: r.one.user({ - from: r.apiKey.userId, - to: r.user.id, - }), - }, - customFieldInstance: { - workspace: r.one.workspace({ - from: r.customFieldInstance.workspaceId, - to: r.workspace.id, - }), - customFieldValues: r.many.customFieldValue(), - projects: r.many.project({ - from: r.customFieldInstance.id.through( - r.projectTaskSyncedCustomField.customFieldInstanceId - ), - to: r.project.id.through(r.projectTaskSyncedCustomField.projectId), - }), - }, - customFieldValue: { - customFieldInstance: r.one.customFieldInstance({ - from: r.customFieldValue.instanceId, - to: r.customFieldInstance.id, - }), - }, - thread: { - users: r.many.user({ - alias: "user_id_thread_id_via_comment", - }), - user: r.one.user({ - from: r.thread.createdByUserId, - to: r.user.id, - alias: "thread_createdByUserId_user_id", - }), - }, - calendarWebhook: { - user: r.one.user({ - from: r.calendarWebhook.userId, - to: r.user.id, - }), - }, - integrationImport: { - integration: r.one.integration({ - from: r.integrationImport.integrationId, - to: r.integration.id, - }), - importMappings: r.many.importMapping(), - syncedEntities: r.many.syncedEntity(), - }, - integration: { - integrationImports: r.many.integrationImport(), - team: r.one.team({ - from: r.integration.teamId, - to: r.team.id, - }), - }, - importMapping: { - integrationImport: r.one.integrationImport({ - from: r.importMapping.integrationImportId, - to: r.integrationImport.id, - }), - }, - label: { - workspace: r.one.workspace({ - from: r.label.workspaceId, - to: r.workspace.id, - }), - projectDefinitions: r.many.projectDefinition({ - from: r.label.id.through(r.projectDefinitionLabel.labelId), - to: r.projectDefinition.id.through( - r.projectDefinitionLabel.projectDefinitionId - ), - }), - recurringTasks: r.many.recurringTask({ - from: r.label.id.through(r.recurringTaskLabel.labelId), - to: r.recurringTask.id.through(r.recurringTaskLabel.recurringTaskId), - }), - projects: r.many.project({ - from: r.label.id.through(r.projectLabel.labelId), - to: r.project.id.through(r.projectLabel.projectId), - }), - taskDefinitions: r.many.taskDefinition({ - from: r.label.id.through(r.taskDefinitionLabel.labelId), - to: r.taskDefinition.id.through(r.taskDefinitionLabel.taskDefinitionId), - }), - teamTasks: r.many.teamTask({ - from: r.label.id.through(r.teamTaskLabel.labelId), - to: r.teamTask.id.through(r.teamTaskLabel.taskId), - }), - userTaskDefaultSettings: r.many.userTaskDefaultSettings({ - from: r.label.id.through(r.userTaskDefaultSettingsLabel.labelId), - to: r.userTaskDefaultSettings.id.through( - r.userTaskDefaultSettingsLabel.userTaskDefaultSettingsId - ), - }), - }, - meetingActionItem: { - meetingInsight: r.one.meetingInsights({ - from: r.meetingActionItem.meetingInsightsId, - to: r.meetingInsights.id, - }), - teamTaskPotentialDuplicateTaskId: r.one.teamTask({ - from: r.meetingActionItem.potentialDuplicateTaskId, - to: r.teamTask.id, - alias: "meetingActionItem_potentialDuplicateTaskId_teamTask_id", - }), - teamTaskTaskId: r.one.teamTask({ - from: r.meetingActionItem.taskId, - to: r.teamTask.id, - alias: "meetingActionItem_taskId_teamTask_id", - }), - user: r.one.user({ - from: r.meetingActionItem.triagedByUserId, - to: r.user.id, - }), - }, - meetingInsights: { - meetingActionItems: r.many.meetingActionItem(), - note: r.one.notes({ - from: r.meetingInsights.noteId, - to: r.notes.id, - }), - recurringMeetingInsight: r.one.recurringMeetingInsights({ - from: r.meetingInsights.parentId, - to: r.recurringMeetingInsights.id, - }), - team: r.one.team({ - from: r.meetingInsights.teamId, - to: r.team.id, - }), - }, - teamTask: { - meetingActionItemsPotentialDuplicateTaskId: r.many.meetingActionItem({ - alias: "meetingActionItem_potentialDuplicateTaskId_teamTask_id", - }), - meetingActionItemsTaskId: r.one.meetingActionItem({ - alias: "meetingActionItem_taskId_teamTask_id", - }), - taskScheduledEntities: r.many.taskScheduledEntity(), - userAssigneeUserId: r.one.user({ - from: r.teamTask.assigneeUserId, - to: r.user.id, - alias: "teamTask_assigneeUserId_user_id", - }), - userCreatedByUserId: r.one.user({ - from: r.teamTask.createdByUserId, - to: r.user.id, - alias: "teamTask_createdByUserId_user_id", - }), - meetingTaskRelation: r.one.meetingTaskRelation({ - from: r.teamTask.meetingRelationId, - to: r.meetingTaskRelation.id, - }), - teamTaskMeetingTaskId: r.one.teamTask({ - from: r.teamTask.meetingTaskId, - to: r.teamTask.id, - alias: "teamTask_meetingTaskId_teamTask_id", - }), - teamTasksMeetingTaskId: r.one.teamTask({ - alias: "teamTask_meetingTaskId_teamTask_id", - }), - teamTaskParentChunkTaskId: r.one.teamTask({ - from: r.teamTask.parentChunkTaskId, - to: r.teamTask.id, - alias: "teamTask_parentChunkTaskId_teamTask_id", - }), - teamTasksParentChunkTaskId: r.many.teamTask({ - alias: "teamTask_parentChunkTaskId_teamTask_id", - }), - recurringTask: r.one.recurringTask({ - from: r.teamTask.parentRecurringTaskId, - to: r.recurringTask.id, - }), - project: r.one.project({ - from: r.teamTask.projectId, - to: r.project.id, - }), - stage: r.one.stage({ - from: [r.teamTask.projectId, r.teamTask.stageDefinitionId], - to: [r.stage.projectId, r.stage.stageDefinitionId], - }), - stageDefinition: r.one.stageDefinition({ - from: r.teamTask.stageDefinitionId, - to: r.stageDefinition.id, - }), - taskStatus: r.one.taskStatus({ - from: r.teamTask.statusId, - to: r.taskStatus.id, - }), - taskDefinition: r.one.taskDefinition({ - from: r.teamTask.taskDefinitionId, - to: r.taskDefinition.id, - }), - workspace: r.one.workspace({ - from: r.teamTask.workspaceId, - to: r.workspace.id, - alias: "teamTask_workspaceId_workspace_id", - }), - workspaces: r.many.workspace({ - from: r.teamTask.id.through(r.templateTask.taskId), - to: r.workspace.id.through(r.templateTask.workspaceId), - alias: "teamTask_id_workspace_id_via_templateTask", - }), - uploadedFiles: r.many.uploadedFile(), - labels: r.many.label(), - users: r.many.user({ - from: r.teamTask.id.through(r.taskSubscribedUsers.taskId), - to: r.user.id.through(r.taskSubscribedUsers.userId), - alias: "teamTask_id_user_id_via_taskSubscribedUsers", - }), - }, - meetingInsightsTeamSettings: { - team: r.one.team({ - from: r.meetingInsightsTeamSettings.teamId, - to: r.team.id, - }), - }, - notes: { - userCreatedByUserId: r.one.user({ - from: r.notes.createdByUserId, - to: r.user.id, - alias: "notes_createdByUserId_user_id", - }), - note: r.one.notes({ - from: r.notes.parentNoteId, - to: r.notes.id, - alias: "notes_parentNoteId_notes_id", - }), - notes: r.many.notes({ - alias: "notes_parentNoteId_notes_id", - }), - userPublishedByUserId: r.one.user({ - from: r.notes.publishedByUserId, - to: r.user.id, - alias: "notes_publishedByUserId_user_id", - }), - workspace: r.one.workspace({ - from: r.notes.workspaceId, - to: r.workspace.id, - }), - usersViaNoteDataSnapshot: r.many.user({ - alias: "user_id_notes_id_via_noteDataSnapshot", - }), - usersViaNoteMention: r.many.user({ - alias: "user_id_notes_id_via_noteMention", - }), - usersViaNoteUserLastViewed: r.many.user({ - from: r.notes.id.through(r.noteUserLastViewed.noteId), - to: r.user.id.through(r.noteUserLastViewed.userId), - alias: "notes_id_user_id_via_noteUserLastViewed", - }), - meetingInsights: r.many.meetingInsights(), - recurringMeetingInsights: r.one.recurringMeetingInsights(), - }, - motionSubscription: { - featurePermissionTier: r.one.featurePermissionTiers({ - from: r.motionSubscription.featurePermissionTierId, - to: r.featurePermissionTiers.id, - }), - team: r.one.team({ - from: r.motionSubscription.teamId, - to: r.team.id, - }), - user: r.one.user({ - from: r.motionSubscription.userId, - to: r.user.id, - }), - userSubscriptions: r.many.userSubscription({ - from: r.motionSubscription.id.through( - r.stripeSubscription.motionSubscriptionId - ), - to: r.userSubscription.id.through( - r.stripeSubscription.userSubscriptionId - ), - }), - }, - featurePermissionTiers: { - motionSubscriptions: r.many.motionSubscription(), - teams: r.many.team({ - from: r.featurePermissionTiers.id.through( - r.teamSubscription.featurePermissionTierId - ), - to: r.team.id.through(r.teamSubscription.teamId), - }), - users: r.many.user({ - from: r.featurePermissionTiers.id.through( - r.userSubscription.featurePermissionTierId - ), - to: r.user.id.through(r.userSubscription.userId), - }), - }, - permission: { - permissionRole: r.one.permissionRole({ - from: r.permission.permissionRoleId, - to: r.permissionRole.id, - }), - }, - permissionRole: { - permissions: r.many.permission(), - team: r.one.team({ - from: r.permissionRole.teamId, - to: r.team.id, - }), - permissionRoleAssignments: r.many.permissionRoleAssignment(), - }, - meetingTaskRelation: { - calendarEvent: r.one.calendarEvent({ - from: r.meetingTaskRelation.calendarEventId, - to: r.calendarEvent.id, - }), - teamTasks: r.one.teamTask(), - }, - recurringMeetingInsights: { - meetingInsights: r.many.meetingInsights(), - note: r.one.notes({ - from: r.recurringMeetingInsights.noteId, - to: r.notes.id, - }), - }, - meetingInsightsSettings: { - userSetting: r.one.userSettings({ - from: r.meetingInsightsSettings.userSettingsId, - to: r.userSettings.id, - }), - }, - userSettings: { - meetingInsightsSettings: r.one.meetingInsightsSettings(), - userAutoScheduleSettings: r.one.userAutoScheduleSettings(), - userCalendarDisplaySettings: r.one.userCalendarDisplaySettings(), - userConferenceSettings: r.one.userConferenceSettings(), - folderItems: r.many.folderItem(), - folders: r.many.folder(), - userMeetingInsightsSettings: r.one.userMeetingInsightsSettings(), - userSidebarDisplaySettings: r.one.userSidebarDisplaySettings(), - userOnboardingSettings: r.one.userOnboardingSettings(), - userTimezoneSettings: r.one.userTimezoneSettings(), - userTaskDefaultSettings: r.many.userTaskDefaultSettings(), - user: r.one.user({ - from: r.userSettings.userId, - to: r.user.id, - }), - userPageViewSettings: r.many.userPageViewSettings(), - }, - projectDefinition: { - labels: r.many.label(), - stageDefinitionsViaProjectDefinitionStageDefinition: - r.many.stageDefinition({ - from: r.projectDefinition.id.through( - r.projectDefinitionStageDefinition.projectDefinitionId - ), - to: r.stageDefinition.id.through( - r.projectDefinitionStageDefinition.stageDefinitionId - ), - alias: - "projectDefinition_id_stageDefinition_id_via_projectDefinitionStageDefinition", - }), - userCreatedByUserId: r.one.user({ - from: r.projectDefinition.createdByUserId, - to: r.user.id, - alias: "projectDefinition_createdByUserId_user_id", - }), - folder: r.one.folder({ - from: r.projectDefinition.folderId, - to: r.folder.id, - }), - userManagerId: r.one.user({ - from: r.projectDefinition.managerId, - to: r.user.id, - alias: "projectDefinition_managerId_user_id", - }), - workspace: r.one.workspace({ - from: r.projectDefinition.workspaceId, - to: r.workspace.id, - alias: "projectDefinition_workspaceId_workspace_id", - }), - projects: r.many.project(), - workspaces: r.many.workspace({ - from: r.projectDefinition.id.through( - r.stageDefinition.projectDefinitionId - ), - to: r.workspace.id.through(r.stageDefinition.workspaceId), - alias: "projectDefinition_id_workspace_id_via_stageDefinition", - }), - taskDefinitions: r.many.taskDefinition(), - stageDefinitionsViaVariableDefinition: r.many.stageDefinition({ - from: r.projectDefinition.id.through( - r.variableDefinition.projectDefinitionId - ), - to: r.stageDefinition.id.through( - r.variableDefinition.stageDefinitionId - ), - alias: "projectDefinition_id_stageDefinition_id_via_variableDefinition", - }), - }, - stageDefinition: { - projectDefinitionsViaProjectDefinitionStageDefinition: - r.many.projectDefinition({ - alias: - "projectDefinition_id_stageDefinition_id_via_projectDefinitionStageDefinition", - }), - projects: r.many.project(), - stages: r.many.stage(), - taskDefinitions: r.many.taskDefinition(), - teamTasks: r.many.teamTask(), - projectDefinitionsViaVariableDefinition: r.many.projectDefinition({ - alias: "projectDefinition_id_stageDefinition_id_via_variableDefinition", - }), - }, - folder: { - projectDefinitions: r.many.projectDefinition(), - userSettings: r.many.userSettings({ - from: r.folder.id.through(r.userFolderSettings.folderId), - to: r.userSettings.id.through(r.userFolderSettings.userSettingsId), - }), - folderItems: r.many.folderItem(), - }, - project: { - stageDefinition: r.one.stageDefinition({ - from: r.project.activeStageDefinitionId, - to: r.stageDefinition.id, - }), - userCreatedByUserId: r.one.user({ - from: r.project.createdByUserId, - to: r.user.id, - alias: "project_createdByUserId_user_id", - }), - userManagerId: r.one.user({ - from: r.project.managerId, - to: r.user.id, - alias: "project_managerId_user_id", - }), - projectDefinition: r.one.projectDefinition({ - from: r.project.projectDefinitionId, - to: r.projectDefinition.id, - }), - taskStatus: r.one.taskStatus({ - from: r.project.statusId, - to: r.taskStatus.id, - }), - workspace: r.one.workspace({ - from: r.project.workspaceId, - to: r.workspace.id, - alias: "project_workspaceId_workspace_id", - }), - customFieldInstances: r.many.customFieldInstance(), - stages: r.many.stage(), - labels: r.many.label(), - teamTasks: r.many.teamTask(), - workspaces: r.many.workspace({ - from: r.project.id.through(r.templateProject.projectId), - to: r.workspace.id.through(r.templateProject.workspaceId), - alias: "project_id_workspace_id_via_templateProject", - }), - uploadedFiles: r.many.uploadedFile(), - userTaskDefaultSettings: r.many.userTaskDefaultSettings(), - variableInstances: r.many.variableInstance(), - }, - taskStatus: { - projects: r.many.project(), - recurringTasks: r.many.recurringTask(), - taskDefinitions: r.many.taskDefinition(), - teamTasks: r.many.teamTask(), - workspace: r.one.workspace({ - from: r.taskStatus.workspaceId, - to: r.workspace.id, - }), - userTaskDefaultSettings: r.many.userTaskDefaultSettings(), - }, - reaction: { - user: r.one.user({ - from: r.reaction.userId, - to: r.user.id, - }), - }, - recurringTask: { - labels: r.many.label(), - userAssigneeUserId: r.one.user({ - from: r.recurringTask.assigneeUserId, - to: r.user.id, - alias: "recurringTask_assigneeUserId_user_id", - }), - userCreatedByUserId: r.one.user({ - from: r.recurringTask.createdByUserId, - to: r.user.id, - alias: "recurringTask_createdByUserId_user_id", - }), - taskStatus: r.one.taskStatus({ - from: r.recurringTask.statusId, - to: r.taskStatus.id, - }), - workspace: r.one.workspace({ - from: r.recurringTask.workspaceId, - to: r.workspace.id, - }), - teamTasks: r.many.teamTask(), - uploadedFiles: r.many.uploadedFile(), - }, - referral: { - user: r.one.user({ - from: r.referral.referrerId, - to: r.user.id, - }), - }, - stage: { - projectDefinitionStageDefinition: r.one.projectDefinitionStageDefinition({ - from: r.stage.projectDefinitionStageDefinitionId, - to: r.projectDefinitionStageDefinition.id, - }), - project: r.one.project({ - from: r.stage.projectId, - to: r.project.id, - }), - stageDefinition: r.one.stageDefinition({ - from: r.stage.stageDefinitionId, - to: r.stageDefinition.id, - }), - teamTasks: r.many.teamTask(), - variableInstances: r.many.variableInstance(), - }, - projectDefinitionStageDefinition: { - stages: r.many.stage(), - }, - userSubscription: { - motionSubscriptions: r.many.motionSubscription(), - }, - syncedEntity: { - integrationImport: r.one.integrationImport({ - from: r.syncedEntity.integrationImportId, - to: r.integrationImport.id, - }), - }, - projectManagementView: { - user: r.one.user({ - from: r.projectManagementView.creatorUserId, - to: r.user.id, - }), - }, - taskDefinition: { - labels: r.many.label(), - user: r.one.user({ - from: r.taskDefinition.assigneeUserId, - to: r.user.id, - }), - taskDefinition: r.one.taskDefinition({ - from: r.taskDefinition.blockerId, - to: r.taskDefinition.id, - alias: "taskDefinition_blockerId_taskDefinition_id", - }), - taskDefinitions: r.many.taskDefinition({ - alias: "taskDefinition_blockerId_taskDefinition_id", - }), - projectDefinition: r.one.projectDefinition({ - from: r.taskDefinition.projectDefinitionId, - to: r.projectDefinition.id, - }), - stageDefinition: r.one.stageDefinition({ - from: r.taskDefinition.stageDefinitionId, - to: r.stageDefinition.id, - }), - taskStatus: r.one.taskStatus({ - from: r.taskDefinition.statusId, - to: r.taskStatus.id, - }), - workspace: r.one.workspace({ - from: r.taskDefinition.workspaceId, - to: r.workspace.id, - }), - teamTasks: r.many.teamTask(), - }, - teamPaymentMethod: { - team: r.one.team({ - from: r.teamPaymentMethod.teamId, - to: r.team.id, - }), - }, - taskScheduledEntity: { - teamTask: r.one.teamTask({ - from: r.taskScheduledEntity.parentTaskId, - to: r.teamTask.id, - }), - }, - teamSettings: { - team: r.one.team({ - from: r.teamSettings.teamId, - to: r.team.id, - }), - teamMeetingInsightsSettings: r.one.teamMeetingInsightsSettings(), - }, - teamMeetingInsightsSettings: { - teamSetting: r.one.teamSettings({ - from: r.teamMeetingInsightsSettings.teamSettingsId, - to: r.teamSettings.id, - }), - }, - uploadedFile: { - comment: r.one.comment({ - from: r.uploadedFile.commentId, - to: r.comment.id, - }), - user: r.one.user({ - from: r.uploadedFile.createdByUserId, - to: r.user.id, - }), - project: r.one.project({ - from: r.uploadedFile.projectId, - to: r.project.id, - }), - recurringTask: r.one.recurringTask({ - from: r.uploadedFile.recurringTaskId, - to: r.recurringTask.id, - }), - teamTask: r.one.teamTask({ - from: r.uploadedFile.taskId, - to: r.teamTask.id, - }), - workspace: r.one.workspace({ - from: r.uploadedFile.workspaceId, - to: r.workspace.id, - }), - }, - comment: { - uploadedFiles: r.many.uploadedFile(), - }, - userAutoScheduleSettings: { - userSetting: r.one.userSettings({ - from: r.userAutoScheduleSettings.userSettingsId, - to: r.userSettings.id, - }), - }, - userCalendarDisplaySettings: { - userSetting: r.one.userSettings({ - from: r.userCalendarDisplaySettings.userSettingsId, - to: r.userSettings.id, - }), - }, - userConferenceSettings: { - userSetting: r.one.userSettings({ - from: r.userConferenceSettings.userSettingsId, - to: r.userSettings.id, - }), - }, - folderItem: { - userSettings: r.many.userSettings({ - from: r.folderItem.id.through(r.userFolderItemSettings.folderItemId), - to: r.userSettings.id.through(r.userFolderItemSettings.userSettingsId), - }), - folder: r.one.folder({ - from: r.folderItem.folderId, - to: r.folder.id, - }), - folderItemOriginalFolderItemId: r.one.folderItem({ - from: r.folderItem.originalFolderItemId, - to: r.folderItem.id, - alias: "folderItem_originalFolderItemId_folderItem_id", - }), - folderItemsOriginalFolderItemId: r.many.folderItem({ - alias: "folderItem_originalFolderItemId_folderItem_id", - }), - folderItemParentFolderItemId: r.one.folderItem({ - from: r.folderItem.parentFolderItemId, - to: r.folderItem.id, - alias: "folderItem_parentFolderItemId_folderItem_id", - }), - folderItemsParentFolderItemId: r.many.folderItem({ - alias: "folderItem_parentFolderItemId_folderItem_id", - }), - }, - userMeetingInsightsSettings: { - userSetting: r.one.userSettings({ - from: r.userMeetingInsightsSettings.userSettingsId, - to: r.userSettings.id, - }), - }, - userNotificationPreferences: { - user: r.one.user({ - from: r.userNotificationPreferences.userId, - to: r.user.id, - }), - }, - userOauthCode: { - user: r.one.user({ - from: r.userOauthCode.userId, - to: r.user.id, - }), - }, - userSidebarDisplaySettings: { - userSetting: r.one.userSettings({ - from: r.userSidebarDisplaySettings.userSettingsId, - to: r.userSettings.id, - }), - }, - userTaskDefaultSettings: { - labels: r.many.label(), - user: r.one.user({ - from: r.userTaskDefaultSettings.assigneeUserId, - to: r.user.id, - }), - project: r.one.project({ - from: r.userTaskDefaultSettings.projectId, - to: r.project.id, - }), - taskStatus: r.one.taskStatus({ - from: r.userTaskDefaultSettings.statusId, - to: r.taskStatus.id, - }), - userSetting: r.one.userSettings({ - from: r.userTaskDefaultSettings.userSettingsId, - to: r.userSettings.id, - }), - workspace: r.one.workspace({ - from: r.userTaskDefaultSettings.workspaceId, - to: r.workspace.id, - }), - }, - userOnboardingSettings: { - userSetting: r.one.userSettings({ - from: r.userOnboardingSettings.userSettingsId, - to: r.userSettings.id, - }), - }, - userTimezoneSettings: { - userSetting: r.one.userSettings({ - from: r.userTimezoneSettings.userSettingsId, - to: r.userSettings.id, - }), - }, - userTutorials: { - user: r.one.user({ - from: r.userTutorials.userId, - to: r.user.id, - }), - }, - variableInstance: { - project: r.one.project({ - from: r.variableInstance.projectId, - to: r.project.id, - }), - stage: r.one.stage({ - from: r.variableInstance.stageId, - to: r.stage.id, - }), - variableDefinition: r.one.variableDefinition({ - from: r.variableInstance.variableId, - to: r.variableDefinition.id, - }), - }, - variableDefinition: { - variableInstances: r.many.variableInstance(), - }, - userPageViewSettings: { - userSetting: r.one.userSettings({ - from: r.userPageViewSettings.userSettingsId, - to: r.userSettings.id, - }), - }, - bookingAvailabilitySlot: { - bookingLink: r.one.bookingLink({ - from: r.bookingAvailabilitySlot.bookingLinkId, - to: r.bookingLink.id, - }), - }, - permissionPolicy: { - team: r.one.team({ - from: r.permissionPolicy.teamId, - to: r.team.id, - }), - }, - permissionRoleAssignment: { - permissionRole: r.one.permissionRole({ - from: r.permissionRoleAssignment.permissionRoleId, - to: r.permissionRole.id, - }), - }, - workspaceTaskSequencer: { - workspace: r.one.workspace({ - from: r.workspaceTaskSequencer.workspaceId, - to: r.workspace.id, - }), - }, - })); -}).types([103199, "instantiations"]); +bench('relations', () => { + defy(schema, (r) => ({ + user: { + workspacesViaApiWebhook: r.many.workspace({ + from: r.user.id.through(r.apiWebhook.createdByUserId), + to: r.workspace.id.through(r.apiWebhook.workspaceId), + alias: 'user_id_workspace_id_via_apiWebhook', + }), + blockingTimeslots: r.many.blockingTimeslot(), + bookingLinksCreatedByUserId: r.many.bookingLink({ + alias: 'bookingLink_createdByUserId_user_id', + }), + bookingSettings: r.one.bookingSettings(), + emailAccounts: r.many.emailAccount(), + apiKeys: r.many.apiKey(), + threadsViaComment: r.many.thread({ + from: r.user.id.through(r.comment.createdByUserId), + to: r.thread.id.through(r.comment.threadId), + alias: 'user_id_thread_id_via_comment', + }), + calendarWebhooks: r.many.calendarWebhook(), + bookingLinksViaInviteeBooking: r.many.bookingLink({ + alias: 'bookingLink_id_user_id_via_inviteeBooking', + }), + meetingActionItems: r.many.meetingActionItem(), + notesCreatedByUserId: r.many.notes({ + alias: 'notes_createdByUserId_user_id', + }), + notesPublishedByUserId: r.many.notes({ + alias: 'notes_publishedByUserId_user_id', + }), + motionSubscriptions: r.one.motionSubscription(), + notesViaNoteDataSnapshot: r.many.notes({ + from: r.user.id.through(r.noteDataSnapshot.createdByUserId), + to: r.notes.id.through(r.noteDataSnapshot.noteId), + alias: 'user_id_notes_id_via_noteDataSnapshot', + }), + notesViaNoteMention: r.many.notes({ + from: r.user.id.through(r.noteMention.createdByUserId), + to: r.notes.id.through(r.noteMention.noteId), + alias: 'user_id_notes_id_via_noteMention', + }), + notesViaNoteUserLastViewed: r.many.notes({ + alias: 'notes_id_user_id_via_noteUserLastViewed', + }), + projectDefinitionsCreatedByUserId: r.many.projectDefinition({ + alias: 'projectDefinition_createdByUserId_user_id', + }), + projectDefinitionsManagerId: r.many.projectDefinition({ + alias: 'projectDefinition_managerId_user_id', + }), + projectsCreatedByUserId: r.many.project({ + alias: 'project_createdByUserId_user_id', + }), + projectsManagerId: r.many.project({ + alias: 'project_managerId_user_id', + }), + reactions: r.many.reaction(), + referrals: r.many.referral(), + recurringTasksAssigneeUserId: r.many.recurringTask({ + alias: 'recurringTask_assigneeUserId_user_id', + }), + recurringTasksCreatedByUserId: r.many.recurringTask({ + alias: 'recurringTask_createdByUserId_user_id', + }), + projectManagementViews: r.many.projectManagementView(), + taskDefinitions: r.many.taskDefinition(), + teamsViaTeamInvite: r.many.team({ + from: r.user.id.through(r.teamInvite.inviterId), + to: r.team.id.through(r.teamInvite.teamId), + alias: 'user_id_team_id_via_teamInvite', + }), + teamTasksAssigneeUserId: r.many.teamTask({ + alias: 'teamTask_assigneeUserId_user_id', + }), + teamTasksCreatedByUserId: r.many.teamTask({ + alias: 'teamTask_createdByUserId_user_id', + }), + teamsViaTeamMember: r.many.team({ + alias: 'team_id_user_id_via_teamMember', + }), + uploadedFiles: r.many.uploadedFile(), + threadsCreatedByUserId: r.many.thread({ + alias: 'thread_createdByUserId_user_id', + }), + userNotificationPreferences: r.many.userNotificationPreferences(), + userOauthCodes: r.many.userOauthCode(), + featurePermissionTiers: r.many.featurePermissionTiers(), + userTaskDefaultSettings: r.many.userTaskDefaultSettings(), + userTutorials: r.one.userTutorials(), + workspacesViaWorkspaceMember: r.many.workspace({ + from: r.user.id.through(r.workspaceMember.userId), + to: r.workspace.id.through(r.workspaceMember.workspaceId), + alias: 'user_id_workspace_id_via_workspaceMember', + }), + userSettings: r.one.userSettings(), + teamTasksViaTaskSubscribedUsers: r.many.teamTask({ + alias: 'teamTask_id_user_id_via_taskSubscribedUsers', + }), + }, + workspace: { + usersViaApiWebhook: r.many.user({ + alias: 'user_id_workspace_id_via_apiWebhook', + }), + customFieldInstances: r.many.customFieldInstance(), + labels: r.many.label(), + notes: r.many.notes(), + projectDefinitionsWorkspaceId: r.many.projectDefinition({ + alias: 'projectDefinition_workspaceId_workspace_id', + }), + projectsWorkspaceId: r.many.project({ + alias: 'project_workspaceId_workspace_id', + }), + projectDefinitionsViaStageDefinition: r.many.projectDefinition({ + alias: 'projectDefinition_id_workspace_id_via_stageDefinition', + }), + recurringTasks: r.many.recurringTask(), + taskDefinitions: r.many.taskDefinition(), + teamTasksWorkspaceId: r.many.teamTask({ + alias: 'teamTask_workspaceId_workspace_id', + }), + taskStatuses: r.many.taskStatus(), + projectsViaTemplateProject: r.many.project({ + alias: 'project_id_workspace_id_via_templateProject', + }), + teamTasksViaTemplateTask: r.many.teamTask({ + alias: 'teamTask_id_workspace_id_via_templateTask', + }), + uploadedFiles: r.many.uploadedFile(), + userTaskDefaultSettings: r.many.userTaskDefaultSettings(), + usersViaWorkspaceMember: r.many.user({ + alias: 'user_id_workspace_id_via_workspaceMember', + }), + team: r.one.team({ + from: r.workspace.teamId, + to: r.team.id, + }), + workspaceTaskSequencers: r.one.workspaceTaskSequencer(), + }, + blockingTimeslot: { + user: r.one.user({ + from: r.blockingTimeslot.userId, + to: r.user.id, + }), + }, + bookingLink: { + user: r.one.user({ + from: r.bookingLink.createdByUserId, + to: r.user.id, + alias: 'bookingLink_createdByUserId_user_id', + }), + bookingLink: r.one.bookingLink({ + from: r.bookingLink.parentTemplateId, + to: r.bookingLink.id, + alias: 'bookingLink_parentTemplateId_bookingLink_id', + }), + bookingLinks: r.many.bookingLink({ + alias: 'bookingLink_parentTemplateId_bookingLink_id', + }), + team: r.one.team({ + from: r.bookingLink.teamId, + to: r.team.id, + }), + bookingConflictCalendars: r.many.bookingConflictCalendar(), + bookingQuestions: r.many.bookingQuestion(), + users: r.many.user({ + from: r.bookingLink.id.through(r.inviteeBooking.bookingLinkId), + to: r.user.id.through(r.inviteeBooking.linkCreatorId), + alias: 'bookingLink_id_user_id_via_inviteeBooking', + }), + bookingAvailabilitySlots: r.many.bookingAvailabilitySlot(), + }, + team: { + bookingLinks: r.many.bookingLink(), + integrations: r.many.integration(), + meetingInsightsTeamSettings: r.one.meetingInsightsTeamSettings(), + motionSubscriptions: r.one.motionSubscription(), + meetingInsights: r.many.meetingInsights(), + permissionRoles: r.many.permissionRole(), + teamPaymentMethods: r.one.teamPaymentMethod(), + usersViaTeamInvite: r.many.user({ + alias: 'user_id_team_id_via_teamInvite', + }), + teamSettings: r.one.teamSettings(), + usersViaTeamMember: r.many.user({ + from: r.team.id.through(r.teamMember.teamId), + to: r.user.id.through(r.teamMember.userId), + alias: 'team_id_user_id_via_teamMember', + }), + featurePermissionTiers: r.many.featurePermissionTiers(), + workspaces: r.many.workspace(), + permissionPolicies: r.many.permissionPolicy(), + }, + bookingConflictCalendar: { + bookingLink: r.one.bookingLink({ + from: r.bookingConflictCalendar.bookingLinkId, + to: r.bookingLink.id, + }), + }, + bookingQuestion: { + bookingLink: r.one.bookingLink({ + from: r.bookingQuestion.bookingLinkId, + to: r.bookingLink.id, + }), + }, + bookingSettings: { + user: r.one.user({ + from: r.bookingSettings.userId, + to: r.user.id, + }), + }, + emailAccount: { + users: r.many.user({ + from: r.emailAccount.id.through(r.calendar.emailAccountId), + to: r.user.id.through(r.calendar.userId), + }), + }, + calendarEventExtensions: { + calendar: r.one.calendar({ + from: r.calendarEventExtensions.calendarId, + to: r.calendar.id, + }), + }, + calendar: { + calendarEventExtensions: r.many.calendarEventExtensions(), + }, + calendarEvent: { + syncSession: r.one.syncSession({ + from: r.calendarEvent.syncSessionId, + to: r.syncSession.id, + }), + meetingTaskRelations: r.one.meetingTaskRelation(), + }, + syncSession: { + calendarEvents: r.many.calendarEvent(), + }, + apiKey: { + user: r.one.user({ + from: r.apiKey.userId, + to: r.user.id, + }), + }, + customFieldInstance: { + workspace: r.one.workspace({ + from: r.customFieldInstance.workspaceId, + to: r.workspace.id, + }), + customFieldValues: r.many.customFieldValue(), + projects: r.many.project({ + from: r.customFieldInstance.id.through( + r.projectTaskSyncedCustomField.customFieldInstanceId, + ), + to: r.project.id.through(r.projectTaskSyncedCustomField.projectId), + }), + }, + customFieldValue: { + customFieldInstance: r.one.customFieldInstance({ + from: r.customFieldValue.instanceId, + to: r.customFieldInstance.id, + }), + }, + thread: { + users: r.many.user({ + alias: 'user_id_thread_id_via_comment', + }), + user: r.one.user({ + from: r.thread.createdByUserId, + to: r.user.id, + alias: 'thread_createdByUserId_user_id', + }), + }, + calendarWebhook: { + user: r.one.user({ + from: r.calendarWebhook.userId, + to: r.user.id, + }), + }, + integrationImport: { + integration: r.one.integration({ + from: r.integrationImport.integrationId, + to: r.integration.id, + }), + importMappings: r.many.importMapping(), + syncedEntities: r.many.syncedEntity(), + }, + integration: { + integrationImports: r.many.integrationImport(), + team: r.one.team({ + from: r.integration.teamId, + to: r.team.id, + }), + }, + importMapping: { + integrationImport: r.one.integrationImport({ + from: r.importMapping.integrationImportId, + to: r.integrationImport.id, + }), + }, + label: { + workspace: r.one.workspace({ + from: r.label.workspaceId, + to: r.workspace.id, + }), + projectDefinitions: r.many.projectDefinition({ + from: r.label.id.through(r.projectDefinitionLabel.labelId), + to: r.projectDefinition.id.through( + r.projectDefinitionLabel.projectDefinitionId, + ), + }), + recurringTasks: r.many.recurringTask({ + from: r.label.id.through(r.recurringTaskLabel.labelId), + to: r.recurringTask.id.through(r.recurringTaskLabel.recurringTaskId), + }), + projects: r.many.project({ + from: r.label.id.through(r.projectLabel.labelId), + to: r.project.id.through(r.projectLabel.projectId), + }), + taskDefinitions: r.many.taskDefinition({ + from: r.label.id.through(r.taskDefinitionLabel.labelId), + to: r.taskDefinition.id.through(r.taskDefinitionLabel.taskDefinitionId), + }), + teamTasks: r.many.teamTask({ + from: r.label.id.through(r.teamTaskLabel.labelId), + to: r.teamTask.id.through(r.teamTaskLabel.taskId), + }), + userTaskDefaultSettings: r.many.userTaskDefaultSettings({ + from: r.label.id.through(r.userTaskDefaultSettingsLabel.labelId), + to: r.userTaskDefaultSettings.id.through( + r.userTaskDefaultSettingsLabel.userTaskDefaultSettingsId, + ), + }), + }, + meetingActionItem: { + meetingInsight: r.one.meetingInsights({ + from: r.meetingActionItem.meetingInsightsId, + to: r.meetingInsights.id, + }), + teamTaskPotentialDuplicateTaskId: r.one.teamTask({ + from: r.meetingActionItem.potentialDuplicateTaskId, + to: r.teamTask.id, + alias: 'meetingActionItem_potentialDuplicateTaskId_teamTask_id', + }), + teamTaskTaskId: r.one.teamTask({ + from: r.meetingActionItem.taskId, + to: r.teamTask.id, + alias: 'meetingActionItem_taskId_teamTask_id', + }), + user: r.one.user({ + from: r.meetingActionItem.triagedByUserId, + to: r.user.id, + }), + }, + meetingInsights: { + meetingActionItems: r.many.meetingActionItem(), + note: r.one.notes({ + from: r.meetingInsights.noteId, + to: r.notes.id, + }), + recurringMeetingInsight: r.one.recurringMeetingInsights({ + from: r.meetingInsights.parentId, + to: r.recurringMeetingInsights.id, + }), + team: r.one.team({ + from: r.meetingInsights.teamId, + to: r.team.id, + }), + }, + teamTask: { + meetingActionItemsPotentialDuplicateTaskId: r.many.meetingActionItem({ + alias: 'meetingActionItem_potentialDuplicateTaskId_teamTask_id', + }), + meetingActionItemsTaskId: r.one.meetingActionItem({ + alias: 'meetingActionItem_taskId_teamTask_id', + }), + taskScheduledEntities: r.many.taskScheduledEntity(), + userAssigneeUserId: r.one.user({ + from: r.teamTask.assigneeUserId, + to: r.user.id, + alias: 'teamTask_assigneeUserId_user_id', + }), + userCreatedByUserId: r.one.user({ + from: r.teamTask.createdByUserId, + to: r.user.id, + alias: 'teamTask_createdByUserId_user_id', + }), + meetingTaskRelation: r.one.meetingTaskRelation({ + from: r.teamTask.meetingRelationId, + to: r.meetingTaskRelation.id, + }), + teamTaskMeetingTaskId: r.one.teamTask({ + from: r.teamTask.meetingTaskId, + to: r.teamTask.id, + alias: 'teamTask_meetingTaskId_teamTask_id', + }), + teamTasksMeetingTaskId: r.one.teamTask({ + alias: 'teamTask_meetingTaskId_teamTask_id', + }), + teamTaskParentChunkTaskId: r.one.teamTask({ + from: r.teamTask.parentChunkTaskId, + to: r.teamTask.id, + alias: 'teamTask_parentChunkTaskId_teamTask_id', + }), + teamTasksParentChunkTaskId: r.many.teamTask({ + alias: 'teamTask_parentChunkTaskId_teamTask_id', + }), + recurringTask: r.one.recurringTask({ + from: r.teamTask.parentRecurringTaskId, + to: r.recurringTask.id, + }), + project: r.one.project({ + from: r.teamTask.projectId, + to: r.project.id, + }), + stage: r.one.stage({ + from: [r.teamTask.projectId, r.teamTask.stageDefinitionId], + to: [r.stage.projectId, r.stage.stageDefinitionId], + }), + stageDefinition: r.one.stageDefinition({ + from: r.teamTask.stageDefinitionId, + to: r.stageDefinition.id, + }), + taskStatus: r.one.taskStatus({ + from: r.teamTask.statusId, + to: r.taskStatus.id, + }), + taskDefinition: r.one.taskDefinition({ + from: r.teamTask.taskDefinitionId, + to: r.taskDefinition.id, + }), + workspace: r.one.workspace({ + from: r.teamTask.workspaceId, + to: r.workspace.id, + alias: 'teamTask_workspaceId_workspace_id', + }), + workspaces: r.many.workspace({ + from: r.teamTask.id.through(r.templateTask.taskId), + to: r.workspace.id.through(r.templateTask.workspaceId), + alias: 'teamTask_id_workspace_id_via_templateTask', + }), + uploadedFiles: r.many.uploadedFile(), + labels: r.many.label(), + users: r.many.user({ + from: r.teamTask.id.through(r.taskSubscribedUsers.taskId), + to: r.user.id.through(r.taskSubscribedUsers.userId), + alias: 'teamTask_id_user_id_via_taskSubscribedUsers', + }), + }, + meetingInsightsTeamSettings: { + team: r.one.team({ + from: r.meetingInsightsTeamSettings.teamId, + to: r.team.id, + }), + }, + notes: { + userCreatedByUserId: r.one.user({ + from: r.notes.createdByUserId, + to: r.user.id, + alias: 'notes_createdByUserId_user_id', + }), + note: r.one.notes({ + from: r.notes.parentNoteId, + to: r.notes.id, + alias: 'notes_parentNoteId_notes_id', + }), + notes: r.many.notes({ + alias: 'notes_parentNoteId_notes_id', + }), + userPublishedByUserId: r.one.user({ + from: r.notes.publishedByUserId, + to: r.user.id, + alias: 'notes_publishedByUserId_user_id', + }), + workspace: r.one.workspace({ + from: r.notes.workspaceId, + to: r.workspace.id, + }), + usersViaNoteDataSnapshot: r.many.user({ + alias: 'user_id_notes_id_via_noteDataSnapshot', + }), + usersViaNoteMention: r.many.user({ + alias: 'user_id_notes_id_via_noteMention', + }), + usersViaNoteUserLastViewed: r.many.user({ + from: r.notes.id.through(r.noteUserLastViewed.noteId), + to: r.user.id.through(r.noteUserLastViewed.userId), + alias: 'notes_id_user_id_via_noteUserLastViewed', + }), + meetingInsights: r.many.meetingInsights(), + recurringMeetingInsights: r.one.recurringMeetingInsights(), + }, + motionSubscription: { + featurePermissionTier: r.one.featurePermissionTiers({ + from: r.motionSubscription.featurePermissionTierId, + to: r.featurePermissionTiers.id, + }), + team: r.one.team({ + from: r.motionSubscription.teamId, + to: r.team.id, + }), + user: r.one.user({ + from: r.motionSubscription.userId, + to: r.user.id, + }), + userSubscriptions: r.many.userSubscription({ + from: r.motionSubscription.id.through( + r.stripeSubscription.motionSubscriptionId, + ), + to: r.userSubscription.id.through( + r.stripeSubscription.userSubscriptionId, + ), + }), + }, + featurePermissionTiers: { + motionSubscriptions: r.many.motionSubscription(), + teams: r.many.team({ + from: r.featurePermissionTiers.id.through( + r.teamSubscription.featurePermissionTierId, + ), + to: r.team.id.through(r.teamSubscription.teamId), + }), + users: r.many.user({ + from: r.featurePermissionTiers.id.through( + r.userSubscription.featurePermissionTierId, + ), + to: r.user.id.through(r.userSubscription.userId), + }), + }, + permission: { + permissionRole: r.one.permissionRole({ + from: r.permission.permissionRoleId, + to: r.permissionRole.id, + }), + }, + permissionRole: { + permissions: r.many.permission(), + team: r.one.team({ + from: r.permissionRole.teamId, + to: r.team.id, + }), + permissionRoleAssignments: r.many.permissionRoleAssignment(), + }, + meetingTaskRelation: { + calendarEvent: r.one.calendarEvent({ + from: r.meetingTaskRelation.calendarEventId, + to: r.calendarEvent.id, + }), + teamTasks: r.one.teamTask(), + }, + recurringMeetingInsights: { + meetingInsights: r.many.meetingInsights(), + note: r.one.notes({ + from: r.recurringMeetingInsights.noteId, + to: r.notes.id, + }), + }, + meetingInsightsSettings: { + userSetting: r.one.userSettings({ + from: r.meetingInsightsSettings.userSettingsId, + to: r.userSettings.id, + }), + }, + userSettings: { + meetingInsightsSettings: r.one.meetingInsightsSettings(), + userAutoScheduleSettings: r.one.userAutoScheduleSettings(), + userCalendarDisplaySettings: r.one.userCalendarDisplaySettings(), + userConferenceSettings: r.one.userConferenceSettings(), + folderItems: r.many.folderItem(), + folders: r.many.folder(), + userMeetingInsightsSettings: r.one.userMeetingInsightsSettings(), + userSidebarDisplaySettings: r.one.userSidebarDisplaySettings(), + userOnboardingSettings: r.one.userOnboardingSettings(), + userTimezoneSettings: r.one.userTimezoneSettings(), + userTaskDefaultSettings: r.many.userTaskDefaultSettings(), + user: r.one.user({ + from: r.userSettings.userId, + to: r.user.id, + }), + userPageViewSettings: r.many.userPageViewSettings(), + }, + projectDefinition: { + labels: r.many.label(), + stageDefinitionsViaProjectDefinitionStageDefinition: r.many.stageDefinition({ + from: r.projectDefinition.id.through( + r.projectDefinitionStageDefinition.projectDefinitionId, + ), + to: r.stageDefinition.id.through( + r.projectDefinitionStageDefinition.stageDefinitionId, + ), + alias: 'projectDefinition_id_stageDefinition_id_via_projectDefinitionStageDefinition', + }), + userCreatedByUserId: r.one.user({ + from: r.projectDefinition.createdByUserId, + to: r.user.id, + alias: 'projectDefinition_createdByUserId_user_id', + }), + folder: r.one.folder({ + from: r.projectDefinition.folderId, + to: r.folder.id, + }), + userManagerId: r.one.user({ + from: r.projectDefinition.managerId, + to: r.user.id, + alias: 'projectDefinition_managerId_user_id', + }), + workspace: r.one.workspace({ + from: r.projectDefinition.workspaceId, + to: r.workspace.id, + alias: 'projectDefinition_workspaceId_workspace_id', + }), + projects: r.many.project(), + workspaces: r.many.workspace({ + from: r.projectDefinition.id.through( + r.stageDefinition.projectDefinitionId, + ), + to: r.workspace.id.through(r.stageDefinition.workspaceId), + alias: 'projectDefinition_id_workspace_id_via_stageDefinition', + }), + taskDefinitions: r.many.taskDefinition(), + stageDefinitionsViaVariableDefinition: r.many.stageDefinition({ + from: r.projectDefinition.id.through( + r.variableDefinition.projectDefinitionId, + ), + to: r.stageDefinition.id.through( + r.variableDefinition.stageDefinitionId, + ), + alias: 'projectDefinition_id_stageDefinition_id_via_variableDefinition', + }), + }, + stageDefinition: { + projectDefinitionsViaProjectDefinitionStageDefinition: r.many.projectDefinition({ + alias: 'projectDefinition_id_stageDefinition_id_via_projectDefinitionStageDefinition', + }), + projects: r.many.project(), + stages: r.many.stage(), + taskDefinitions: r.many.taskDefinition(), + teamTasks: r.many.teamTask(), + projectDefinitionsViaVariableDefinition: r.many.projectDefinition({ + alias: 'projectDefinition_id_stageDefinition_id_via_variableDefinition', + }), + }, + folder: { + projectDefinitions: r.many.projectDefinition(), + userSettings: r.many.userSettings({ + from: r.folder.id.through(r.userFolderSettings.folderId), + to: r.userSettings.id.through(r.userFolderSettings.userSettingsId), + }), + folderItems: r.many.folderItem(), + }, + project: { + stageDefinition: r.one.stageDefinition({ + from: r.project.activeStageDefinitionId, + to: r.stageDefinition.id, + }), + userCreatedByUserId: r.one.user({ + from: r.project.createdByUserId, + to: r.user.id, + alias: 'project_createdByUserId_user_id', + }), + userManagerId: r.one.user({ + from: r.project.managerId, + to: r.user.id, + alias: 'project_managerId_user_id', + }), + projectDefinition: r.one.projectDefinition({ + from: r.project.projectDefinitionId, + to: r.projectDefinition.id, + }), + taskStatus: r.one.taskStatus({ + from: r.project.statusId, + to: r.taskStatus.id, + }), + workspace: r.one.workspace({ + from: r.project.workspaceId, + to: r.workspace.id, + alias: 'project_workspaceId_workspace_id', + }), + customFieldInstances: r.many.customFieldInstance(), + stages: r.many.stage(), + labels: r.many.label(), + teamTasks: r.many.teamTask(), + workspaces: r.many.workspace({ + from: r.project.id.through(r.templateProject.projectId), + to: r.workspace.id.through(r.templateProject.workspaceId), + alias: 'project_id_workspace_id_via_templateProject', + }), + uploadedFiles: r.many.uploadedFile(), + userTaskDefaultSettings: r.many.userTaskDefaultSettings(), + variableInstances: r.many.variableInstance(), + }, + taskStatus: { + projects: r.many.project(), + recurringTasks: r.many.recurringTask(), + taskDefinitions: r.many.taskDefinition(), + teamTasks: r.many.teamTask(), + workspace: r.one.workspace({ + from: r.taskStatus.workspaceId, + to: r.workspace.id, + }), + userTaskDefaultSettings: r.many.userTaskDefaultSettings(), + }, + reaction: { + user: r.one.user({ + from: r.reaction.userId, + to: r.user.id, + }), + }, + recurringTask: { + labels: r.many.label(), + userAssigneeUserId: r.one.user({ + from: r.recurringTask.assigneeUserId, + to: r.user.id, + alias: 'recurringTask_assigneeUserId_user_id', + }), + userCreatedByUserId: r.one.user({ + from: r.recurringTask.createdByUserId, + to: r.user.id, + alias: 'recurringTask_createdByUserId_user_id', + }), + taskStatus: r.one.taskStatus({ + from: r.recurringTask.statusId, + to: r.taskStatus.id, + }), + workspace: r.one.workspace({ + from: r.recurringTask.workspaceId, + to: r.workspace.id, + }), + teamTasks: r.many.teamTask(), + uploadedFiles: r.many.uploadedFile(), + }, + referral: { + user: r.one.user({ + from: r.referral.referrerId, + to: r.user.id, + }), + }, + stage: { + projectDefinitionStageDefinition: r.one.projectDefinitionStageDefinition({ + from: r.stage.projectDefinitionStageDefinitionId, + to: r.projectDefinitionStageDefinition.id, + }), + project: r.one.project({ + from: r.stage.projectId, + to: r.project.id, + }), + stageDefinition: r.one.stageDefinition({ + from: r.stage.stageDefinitionId, + to: r.stageDefinition.id, + }), + teamTasks: r.many.teamTask(), + variableInstances: r.many.variableInstance(), + }, + projectDefinitionStageDefinition: { + stages: r.many.stage(), + }, + userSubscription: { + motionSubscriptions: r.many.motionSubscription(), + }, + syncedEntity: { + integrationImport: r.one.integrationImport({ + from: r.syncedEntity.integrationImportId, + to: r.integrationImport.id, + }), + }, + projectManagementView: { + user: r.one.user({ + from: r.projectManagementView.creatorUserId, + to: r.user.id, + }), + }, + taskDefinition: { + labels: r.many.label(), + user: r.one.user({ + from: r.taskDefinition.assigneeUserId, + to: r.user.id, + }), + taskDefinition: r.one.taskDefinition({ + from: r.taskDefinition.blockerId, + to: r.taskDefinition.id, + alias: 'taskDefinition_blockerId_taskDefinition_id', + }), + taskDefinitions: r.many.taskDefinition({ + alias: 'taskDefinition_blockerId_taskDefinition_id', + }), + projectDefinition: r.one.projectDefinition({ + from: r.taskDefinition.projectDefinitionId, + to: r.projectDefinition.id, + }), + stageDefinition: r.one.stageDefinition({ + from: r.taskDefinition.stageDefinitionId, + to: r.stageDefinition.id, + }), + taskStatus: r.one.taskStatus({ + from: r.taskDefinition.statusId, + to: r.taskStatus.id, + }), + workspace: r.one.workspace({ + from: r.taskDefinition.workspaceId, + to: r.workspace.id, + }), + teamTasks: r.many.teamTask(), + }, + teamPaymentMethod: { + team: r.one.team({ + from: r.teamPaymentMethod.teamId, + to: r.team.id, + }), + }, + taskScheduledEntity: { + teamTask: r.one.teamTask({ + from: r.taskScheduledEntity.parentTaskId, + to: r.teamTask.id, + }), + }, + teamSettings: { + team: r.one.team({ + from: r.teamSettings.teamId, + to: r.team.id, + }), + teamMeetingInsightsSettings: r.one.teamMeetingInsightsSettings(), + }, + teamMeetingInsightsSettings: { + teamSetting: r.one.teamSettings({ + from: r.teamMeetingInsightsSettings.teamSettingsId, + to: r.teamSettings.id, + }), + }, + uploadedFile: { + comment: r.one.comment({ + from: r.uploadedFile.commentId, + to: r.comment.id, + }), + user: r.one.user({ + from: r.uploadedFile.createdByUserId, + to: r.user.id, + }), + project: r.one.project({ + from: r.uploadedFile.projectId, + to: r.project.id, + }), + recurringTask: r.one.recurringTask({ + from: r.uploadedFile.recurringTaskId, + to: r.recurringTask.id, + }), + teamTask: r.one.teamTask({ + from: r.uploadedFile.taskId, + to: r.teamTask.id, + }), + workspace: r.one.workspace({ + from: r.uploadedFile.workspaceId, + to: r.workspace.id, + }), + }, + comment: { + uploadedFiles: r.many.uploadedFile(), + }, + userAutoScheduleSettings: { + userSetting: r.one.userSettings({ + from: r.userAutoScheduleSettings.userSettingsId, + to: r.userSettings.id, + }), + }, + userCalendarDisplaySettings: { + userSetting: r.one.userSettings({ + from: r.userCalendarDisplaySettings.userSettingsId, + to: r.userSettings.id, + }), + }, + userConferenceSettings: { + userSetting: r.one.userSettings({ + from: r.userConferenceSettings.userSettingsId, + to: r.userSettings.id, + }), + }, + folderItem: { + userSettings: r.many.userSettings({ + from: r.folderItem.id.through(r.userFolderItemSettings.folderItemId), + to: r.userSettings.id.through(r.userFolderItemSettings.userSettingsId), + }), + folder: r.one.folder({ + from: r.folderItem.folderId, + to: r.folder.id, + }), + folderItemOriginalFolderItemId: r.one.folderItem({ + from: r.folderItem.originalFolderItemId, + to: r.folderItem.id, + alias: 'folderItem_originalFolderItemId_folderItem_id', + }), + folderItemsOriginalFolderItemId: r.many.folderItem({ + alias: 'folderItem_originalFolderItemId_folderItem_id', + }), + folderItemParentFolderItemId: r.one.folderItem({ + from: r.folderItem.parentFolderItemId, + to: r.folderItem.id, + alias: 'folderItem_parentFolderItemId_folderItem_id', + }), + folderItemsParentFolderItemId: r.many.folderItem({ + alias: 'folderItem_parentFolderItemId_folderItem_id', + }), + }, + userMeetingInsightsSettings: { + userSetting: r.one.userSettings({ + from: r.userMeetingInsightsSettings.userSettingsId, + to: r.userSettings.id, + }), + }, + userNotificationPreferences: { + user: r.one.user({ + from: r.userNotificationPreferences.userId, + to: r.user.id, + }), + }, + userOauthCode: { + user: r.one.user({ + from: r.userOauthCode.userId, + to: r.user.id, + }), + }, + userSidebarDisplaySettings: { + userSetting: r.one.userSettings({ + from: r.userSidebarDisplaySettings.userSettingsId, + to: r.userSettings.id, + }), + }, + userTaskDefaultSettings: { + labels: r.many.label(), + user: r.one.user({ + from: r.userTaskDefaultSettings.assigneeUserId, + to: r.user.id, + }), + project: r.one.project({ + from: r.userTaskDefaultSettings.projectId, + to: r.project.id, + }), + taskStatus: r.one.taskStatus({ + from: r.userTaskDefaultSettings.statusId, + to: r.taskStatus.id, + }), + userSetting: r.one.userSettings({ + from: r.userTaskDefaultSettings.userSettingsId, + to: r.userSettings.id, + }), + workspace: r.one.workspace({ + from: r.userTaskDefaultSettings.workspaceId, + to: r.workspace.id, + }), + }, + userOnboardingSettings: { + userSetting: r.one.userSettings({ + from: r.userOnboardingSettings.userSettingsId, + to: r.userSettings.id, + }), + }, + userTimezoneSettings: { + userSetting: r.one.userSettings({ + from: r.userTimezoneSettings.userSettingsId, + to: r.userSettings.id, + }), + }, + userTutorials: { + user: r.one.user({ + from: r.userTutorials.userId, + to: r.user.id, + }), + }, + variableInstance: { + project: r.one.project({ + from: r.variableInstance.projectId, + to: r.project.id, + }), + stage: r.one.stage({ + from: r.variableInstance.stageId, + to: r.stage.id, + }), + variableDefinition: r.one.variableDefinition({ + from: r.variableInstance.variableId, + to: r.variableDefinition.id, + }), + }, + variableDefinition: { + variableInstances: r.many.variableInstance(), + }, + userPageViewSettings: { + userSetting: r.one.userSettings({ + from: r.userPageViewSettings.userSettingsId, + to: r.userSettings.id, + }), + }, + bookingAvailabilitySlot: { + bookingLink: r.one.bookingLink({ + from: r.bookingAvailabilitySlot.bookingLinkId, + to: r.bookingLink.id, + }), + }, + permissionPolicy: { + team: r.one.team({ + from: r.permissionPolicy.teamId, + to: r.team.id, + }), + }, + permissionRoleAssignment: { + permissionRole: r.one.permissionRole({ + from: r.permissionRoleAssignment.permissionRoleId, + to: r.permissionRole.id, + }), + }, + workspaceTaskSequencer: { + workspace: r.one.workspace({ + from: r.workspaceTaskSequencer.workspaceId, + to: r.workspace.id, + }), + }, + })); +}).types([103199, 'instantiations']); // .mark({ mean: [3.44, "ns"], median: [3.33, "ns"] }) diff --git a/drizzle-seed/package.json b/drizzle-seed/package.json index 4178616650..899b48431f 100644 --- a/drizzle-seed/package.json +++ b/drizzle-seed/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-seed", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "main": "index.js", "type": "module", "scripts": { @@ -91,8 +91,9 @@ "cpy": "^11.1.0", "dockerode": "^4.0.6", "dotenv": "^16.4.5", - "drizzle-kit": "workspace:./drizzle-kit/dist", - "drizzle-orm": "workspace:./drizzle-orm/dist", + "drizzle-kit": "workspace:../drizzle-kit/dist", + "drizzle-orm": "workspace:../drizzle-orm/dist", + "drizzle-zod": "workspace:../drizzle-zod/dist", "get-port": "^7.1.0", "mssql": "^11.0.1", "mysql2": "^3.14.1", @@ -102,6 +103,7 @@ "tslib": "^2.7.0", "tsx": "^4.19.0", "uuid": "^10.0.0", + "zod": "^4.0.0", "zx": "^8.1.5" }, "dependencies": { diff --git a/drizzle-seed/rollup.config.ts b/drizzle-seed/rollup.config.ts index c5874a54ac..c6da738de9 100644 --- a/drizzle-seed/rollup.config.ts +++ b/drizzle-seed/rollup.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from 'rollup'; export default defineConfig([ { - input: 'src/index.ts', + input: ['src/index.ts'], output: [ { format: 'esm', diff --git a/drizzle-seed/scripts/build.ts b/drizzle-seed/scripts/build.ts index 1910feac6a..794d2dc1d7 100644 --- a/drizzle-seed/scripts/build.ts +++ b/drizzle-seed/scripts/build.ts @@ -4,7 +4,6 @@ import cpy from 'cpy'; await fs.remove('dist'); await $`rollup --config rollup.config.ts --configPlugin typescript`; -await $`resolve-tspaths`; await fs.copy('README.md', 'dist/README.md'); await cpy('dist/**/*.d.ts', 'dist', { rename: (basename) => basename.replace(/\.d\.ts$/, '.d.mts'), diff --git a/drizzle-seed/src/SeedService.ts b/drizzle-seed/src/SeedService.ts index 706878d5c1..275e9ffde3 100644 --- a/drizzle-seed/src/SeedService.ts +++ b/drizzle-seed/src/SeedService.ts @@ -3,7 +3,7 @@ import { entityKind, eq, is, sql } from 'drizzle-orm'; import type { MySqlTable, MySqlTableWithColumns } from 'drizzle-orm/mysql-core'; import { MySqlDatabase } from 'drizzle-orm/mysql-core'; import type { PgTable, PgTableWithColumns } from 'drizzle-orm/pg-core'; -import { PgDatabase } from 'drizzle-orm/pg-core'; +import { getTableConfig as getTableConfigPg, PgDatabase } from 'drizzle-orm/pg-core'; import type { SQLiteTable, SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core'; import { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core'; import { generatorsMap } from './generators/GeneratorFuncs.ts'; @@ -28,7 +28,7 @@ import type { Prettify, Relation, Table } from './types/tables.ts'; import type { CockroachTable, CockroachTableWithColumns } from 'drizzle-orm/cockroach-core'; import { CockroachDatabase } from 'drizzle-orm/cockroach-core'; import type { MsSqlTable, MsSqlTableWithColumns } from 'drizzle-orm/mssql-core'; -import { getTableConfig, MsSqlDatabase } from 'drizzle-orm/mssql-core'; +import { getTableConfig as getTableConfigMsSql, MsSqlDatabase } from 'drizzle-orm/mssql-core'; import type { SingleStoreTable, SingleStoreTableWithColumns } from 'drizzle-orm/singlestore-core'; import { SingleStoreDatabase } from 'drizzle-orm/singlestore-core'; import { selectGeneratorForCockroachColumn } from './cockroach-core/selectGensForColumn.ts'; @@ -38,7 +38,7 @@ import { selectGeneratorForMysqlColumn } from './mysql-core/selectGensForColumn. import { selectGeneratorForPostgresColumn } from './pg-core/selectGensForColumn.ts'; import { selectGeneratorForSingleStoreColumn } from './singlestore-core/selectGensForColumn.ts'; import { selectGeneratorForSqlite } from './sqlite-core/selectGensForColumn.ts'; -import { equalSets } from './utils.ts'; +import { equalSets, intMax, isPostgresColumnIntLike } from './utils.ts'; export class SeedService { static readonly entityKind: string = 'SeedService'; @@ -120,6 +120,7 @@ export class SeedService { } } + // handling refinements (count, with) if (refinements !== undefined && refinements[table.name] !== undefined) { if (refinements[table.name]!.count !== undefined) { tablesPossibleGenerators[i]!.count = refinements[table.name]!.count; @@ -207,6 +208,7 @@ export class SeedService { wasRefined: false, }; + // handling refinements (columnGenerator) if ( refinements !== undefined && refinements[table.name] !== undefined @@ -224,7 +226,7 @@ export class SeedService { } // Generating undefined as a value for a column and then inserting it via drizzle-orm - // will result in the value not being inserted into that column. + // will result in null of default value being inserted into that column. columnPossibleGenerator.generator = new generatorsMap.GenerateDefault[0]({ defaultValue: undefined }); columnPossibleGenerator.wasRefined = true; @@ -718,7 +720,8 @@ export class SeedService { // get values to generate columns with foreign key - // if table posts contains foreign key to table users, then rel.table === 'posts' and rel.refTable === 'users', because table posts has reference to table users. + // if table posts contains foreign key to table users, then rel.table === 'posts' and rel.refTable === 'users', + // because table posts has reference to table users. if (filteredRelations.length !== 0) { for (const rel of filteredRelations) { if ( @@ -918,6 +921,32 @@ export class SeedService { // columnsGenerators[columnName] = uniqueGen; // } } + + // sequence updates will only be performed for PostgreSQL, since MySQL and SQLite already update their sequences correctly on their own. + const columnsToUpdateSeq: Map< + string, + { schemaName: string | undefined; tableName: string; columnName: string; valueToUpdate?: number | bigint } + > = new Map(); + if ( + count > 0 && is(db, PgDatabase) && schema !== undefined && tableName !== undefined + && schema[tableName] !== undefined + ) { + const tableConfig = getTableConfigPg(schema[tableName] as PgTable); + for (const column of tableConfig.columns) { + // TODO should I filter only primary key columns? + // should I filter column by dataType or by column drizzle type? + // column.dataType === 'number' || column.dataType === 'bigint' + if (isPostgresColumnIntLike(column)) { + columnsToUpdateSeq.set(column.name, { + schemaName: tableConfig.schema, + tableName: tableConfig.name, + columnName: column.name, + valueToUpdate: undefined, + }); + } + } + } + let maxParametersNumber: number; if (is(db, PgDatabase)) { // @ts-ignore @@ -956,6 +985,13 @@ export class SeedService { | number | boolean; row[columnName as keyof typeof row] = generatedValue; + + const colToUpdateSeq = columnsToUpdateSeq.get(columnName); + if (columnsToUpdateSeq.size !== 0 && colToUpdateSeq !== undefined) { + colToUpdateSeq.valueToUpdate = colToUpdateSeq?.valueToUpdate === undefined + ? generatedValue as number | bigint + : intMax([colToUpdateSeq!.valueToUpdate, generatedValue as number | bigint]); + } } if ( @@ -1018,11 +1054,41 @@ export class SeedService { } } } + + const columnsToUpdateSeqFiltered = [...columnsToUpdateSeq.values()].filter((col) => + col.valueToUpdate !== undefined + ); + if ( + i === count - 1 + && columnsToUpdateSeqFiltered.length !== 0 && db !== undefined + ) { + for (const columnConfig of columnsToUpdateSeq.values()) { + if (columnConfig) { + await this.updateColumnSequence({ db, columnConfig }); + } + } + } } return preserveData === true ? generatedValues : []; }; + updateColumnSequence = async ({ db, columnConfig: { schemaName, tableName, columnName, valueToUpdate } }: { + db: DbType; + columnConfig: { schemaName?: string; tableName: string; columnName: string; valueToUpdate?: number | bigint }; + }) => { + if (is(db, PgDatabase)) { + const fullTableName = schemaName ? `"${schemaName}"."${tableName}"` : `"${tableName}"`; + const rawQuery = `SELECT setval(pg_get_serial_sequence('${fullTableName}', '${columnName}'), ${ + (valueToUpdate ?? 'null').toString() + }, true);`; + await db.execute(sql.raw(rawQuery)); + } + // mysql updates auto_increment or serial column by itself + // sqlite updates autoincrement column by itself + return; + }; + insertInDb = async ({ generatedValues, db, @@ -1058,7 +1124,7 @@ export class SeedService { let schemaDbName: string | undefined; let tableDbName: string | undefined; if (override === true) { - const tableConfig = getTableConfig(schema[tableName]! as MsSqlTable); + const tableConfig = getTableConfigMsSql(schema[tableName]! as MsSqlTable); schemaDbName = tableConfig.schema ?? 'dbo'; tableDbName = tableConfig.name; await db.execute(sql.raw(`SET IDENTITY_INSERT [${schemaDbName}].[${tableDbName}] ON;`)); diff --git a/drizzle-seed/src/generators/GeneratorFuncs.ts b/drizzle-seed/src/generators/GeneratorFuncs.ts index ea65dc5a0e..4a61adf15f 100644 --- a/drizzle-seed/src/generators/GeneratorFuncs.ts +++ b/drizzle-seed/src/generators/GeneratorFuncs.ts @@ -63,6 +63,7 @@ import { } from './Generators.ts'; import { GenerateStringV2, GenerateUniqueIntervalV2, GenerateUniqueStringV2 } from './versioning/v2.ts'; import { GenerateHashFromStringV3 } from './versioning/v3.ts'; +import { GenerateUUIDV4 } from './versioning/v4.ts'; function createGenerator, T>( generatorConstructor: new(params?: T) => GeneratorType, @@ -241,6 +242,8 @@ export const generatorsFuncs = { /** * generates time in 24 hours style. + * @param minTime - lower border of range. + * @param maxTime - upper border of range. * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.) * * @example @@ -248,7 +251,7 @@ export const generatorsFuncs = { * await seed(db, schema, { count: 1000 }).refine((funcs) => ({ * users: { * columns: { - * birthTime: funcs.time() + * birthTime: funcs.time({ minTime: "11:12:13.141", maxTime: "15:16:17.181" }) * }, * }, * })); @@ -259,6 +262,8 @@ export const generatorsFuncs = { /** * generates timestamps. + * @param minTimestamp - lower border of range. + * @param maxTimestamp - upper border of range. * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.) * * @example @@ -266,7 +271,7 @@ export const generatorsFuncs = { * await seed(db, schema, { count: 1000 }).refine((funcs) => ({ * orders: { * columns: { - * shippedDate: funcs.timestamp() + * shippedDate: funcs.timestamp({ minTimestamp: "2025-03-07T11:12:13.141", maxTimestamp: "2025-03-08T15:16:17.181" }) * }, * }, * })); @@ -277,6 +282,8 @@ export const generatorsFuncs = { /** * generates datetime objects. + * @param minDatetime - lower border of range. + * @param maxDatetime - upper border of range. * @param arraySize - number of elements in each one-dimensional array. (If specified, arrays will be generated.) * * @example @@ -284,7 +291,7 @@ export const generatorsFuncs = { * await seed(db, schema, { count: 1000 }).refine((funcs) => ({ * orders: { * columns: { - * shippedDate: funcs.datetime() + * shippedDate: funcs.datetime({ minDatetime: "2025-03-07T11:12:13.141", maxDatetime: "2025-03-08T15:16:17.181" }) * }, * }, * })); @@ -895,7 +902,7 @@ export const generatorsFuncs = { vector: createGenerator(GenerateVector), }; -// so far, version changes don’t affect generator parameters. +// so far, version changes don’t change generator parameters. export const generatorsFuncsV2 = { ...generatorsFuncs, }; @@ -904,6 +911,10 @@ export const generatorsFuncsV3 = { ...generatorsFuncs, }; +export const generatorsFuncsV4 = { + ...generatorsFuncs, +}; + export const generatorsMap = { GenerateHashFromString: [ GenerateHashFromString, @@ -977,6 +988,7 @@ export const generatorsMap = { ], GenerateUUID: [ GenerateUUID, + GenerateUUIDV4, ], GenerateFirstName: [ GenerateFirstName, diff --git a/drizzle-seed/src/generators/Generators.ts b/drizzle-seed/src/generators/Generators.ts index 096cc7db02..ff4c34d4c3 100644 --- a/drizzle-seed/src/generators/Generators.ts +++ b/drizzle-seed/src/generators/Generators.ts @@ -21,6 +21,7 @@ import { fillTemplate, getWeightedIndices, isObject, + isValidDate, OrderedNumberRange, } from './utils.ts'; @@ -1026,16 +1027,25 @@ export class GenerateDate extends AbstractGenerator<{ let { minDate, maxDate } = this.params; const anchorDate = new Date('2024-05-08'); + // 4 years in milliseconds const deltaMilliseconds = 4 * 31536000000; if (typeof minDate === 'string') { minDate = new Date(minDate); } + if (typeof minDate === 'object' && !isValidDate(minDate)) { + throw new Error('Invalid Date was provided for the minDate parameter.'); + } + if (typeof maxDate === 'string') { maxDate = new Date(maxDate); } + if (typeof maxDate === 'object' && !isValidDate(maxDate)) { + throw new Error('Invalid Date was provided for the maxDate parameter.'); + } + if (minDate === undefined) { if (maxDate === undefined) { minDate = new Date(anchorDate.getTime() - deltaMilliseconds); @@ -1049,6 +1059,10 @@ export class GenerateDate extends AbstractGenerator<{ maxDate = new Date(minDate.getTime() + (2 * deltaMilliseconds)); } + if (minDate > maxDate) { + throw new Error(`The minDate parameter must be less than or equal to the maxDate parameter.`); + } + this.state = { rng, minDate, maxDate }; } @@ -1072,19 +1086,110 @@ export class GenerateDate extends AbstractGenerator<{ return date; } } -export class GenerateTime extends AbstractGenerator<{ arraySize?: number }> { +export class GenerateTime extends AbstractGenerator<{ + min?: string | Date; + max?: string | Date; + arraySize?: number; +}> { static override readonly entityKind: string = 'GenerateTime'; private state: { rng: prand.RandomGenerator; + min: Date; + max: Date; } | undefined; override init({ count, seed }: { count: number; seed: number }) { super.init({ count, seed }); - const rng = prand.xoroshiro128plus(seed); - this.state = { rng }; + let { min, max } = this.params; + + if (min === undefined && max === undefined) { + // TODO: maybe need to change in major version release + // This is required to ensure that this generator remains deterministic when used without min, max parameters. + const oneDayInMilliseconds = 86400000; + min = new Date(new Date('2024-05-08T12:00:00.000Z').getTime() - oneDayInMilliseconds); + max = new Date(new Date('2024-05-08T12:00:00.000Z').getTime() + oneDayInMilliseconds); + + this.state = { rng, min, max }; + return; + } + + if (min === undefined) { + if (max === undefined) { + min = '00:00:00.000Z'; + max = '23:59:59.999Z'; + } else { + min = '00:00:00.000Z'; + } + } + + if (max === undefined) { + max = '23:59:59.999Z'; + new Date().toISOString(); + } + const anchorDate = new Date('2024-05-08'); + const anchorDateString0 = anchorDate.toISOString().replace(/T\d{2}:\d{2}:\d{2}.\d{3}Z/, ''); + + if (typeof min === 'string') { + // const timeMatch0 = min.match(/^\d{2}:\d{2}:\d{2}.\d{1,3}Z?$/); + const timeMatch1 = min.match(/^\d{2}:\d{2}:\d{2}Z?$/); + const timeMatch2 = min.match(/^\d{2}:\d{2}Z?$/); + + if ( + // timeMatch0 === null + timeMatch1 === null + && timeMatch2 === null + ) { + throw new Error( + `You're using the wrong format for the min parameter.` + + `\nPlease use one of these formats: 'HH:mm:ss', 'HH:mm' (with or without a trailing 'Z')`, + ); + } + + min = min.at(-1) === 'Z' ? min : min + 'Z'; + min = new Date(anchorDate.toISOString().replace(/\d{2}:\d{2}:\d{2}.\d{3}Z/, min)); + } + + if (typeof min === 'object') { + if (!isValidDate(min)) { + throw new Error('Invalid Date was provided for the min parameter.'); + } + min = new Date(min.toISOString().replace(/\d{4}-\d{2}-\d{2}/, anchorDateString0)); + } + + if (typeof max === 'string') { + // const timeMatch0 = max.match(/^\d{2}:\d{2}:\d{2}.\d{1,3}Z?$/); + const timeMatch1 = max.match(/^\d{2}:\d{2}:\d{2}Z?$/); + const timeMatch2 = max.match(/^\d{2}:\d{2}Z?$/); + if ( + // timeMatch0 === null + timeMatch1 === null + && timeMatch2 === null + ) { + throw new Error( + `You're using the wrong format for the max parameter.` + + `\nPlease use one of these formats: 'HH:mm:ss', 'HH:mm' (with or without a trailing 'Z').`, + ); + } + + max = max.at(-1) === 'Z' ? max : max + 'Z'; + max = new Date(anchorDate.toISOString().replace(/\d{2}:\d{2}:\d{2}.\d{3}Z/, max)); + } + + if (typeof max === 'object') { + if (!isValidDate(max)) { + throw new Error('Invalid Date was provided for the max parameter.'); + } + max = new Date(max.toISOString().replace(/\d{4}-\d{2}-\d{2}/, anchorDateString0)); + } + + if (min > max) { + throw new Error(`The min parameter must be less than or equal to the max parameter.`); + } + + this.state = { rng, min, max }; } generate() { @@ -1092,18 +1197,14 @@ export class GenerateTime extends AbstractGenerator<{ arraySize?: number }> { throw new Error('state is not defined.'); } - const anchorDateTime = new Date('2024-05-08T12:00:00.000Z'); - const oneDayInMilliseconds = 86400000; - - let date = new Date(); let milliseconds: number; [milliseconds, this.state.rng] = prand.uniformIntDistribution( - -oneDayInMilliseconds, - oneDayInMilliseconds, + this.state.min.getTime(), + this.state.max.getTime(), this.state.rng, ); - date = new Date(date.setTime(anchorDateTime.getTime() + milliseconds)); + const date = new Date(milliseconds); return date.toISOString().replace(/(\d{4}-\d{2}-\d{2}T)|(\.\d{3}Z)/g, ''); } @@ -1141,11 +1242,17 @@ export class GenerateTimestampInt extends AbstractGenerator<{ unitOfTime?: 'seco } } -export class GenerateTimestamp extends AbstractGenerator<{ arraySize?: number }> { +export class GenerateTimestamp extends AbstractGenerator<{ + min?: string | Date; + max?: string | Date; + arraySize?: number; +}> { static override readonly entityKind: string = 'GenerateTimestamp'; private state: { rng: prand.RandomGenerator; + min: Date; + max: Date; } | undefined; override init({ count, seed }: { count: number; seed: number }) { @@ -1153,26 +1260,61 @@ export class GenerateTimestamp extends AbstractGenerator<{ arraySize?: number }> const rng = prand.xoroshiro128plus(seed); - this.state = { rng }; + let { min, max } = this.params; + + const anchorDate = new Date('2024-05-08'); + // 2 years in milliseconds + const deltaMilliseconds = 2 * 31536000000; + + // ideally use util function that checks for date, etc. + if (typeof min === 'string') { + min = new Date(min); + } + + if (typeof min === 'object' && !isValidDate(min)) { + throw new Error('Invalid Date was provided for the "min" parameter.'); + } + + if (typeof max === 'string') { + max = new Date(max); + } + + if (typeof max === 'object' && !isValidDate(max)) { + throw new Error('Invalid Date was provided for the "max" parameter.'); + } + + if (min === undefined) { + if (max === undefined) { + min = new Date(anchorDate.getTime() - deltaMilliseconds); + max = new Date(anchorDate.getTime() + deltaMilliseconds); + } else { + min = new Date(max.getTime() - (2 * deltaMilliseconds)); + } + } + + if (max === undefined) { + max = new Date(min.getTime() + (2 * deltaMilliseconds)); + } + + if (min > max) { + throw new Error(`The "min" parameter must be less than or equal to the "max" parameter.`); + } + + this.state = { rng, min, max }; } generate() { if (this.state === undefined) { throw new Error('state is not defined.'); } - - const anchorTimestamp = new Date('2024-05-08'); - const twoYearsInMilliseconds = 2 * 31536000000; - - let date = new Date(); let milliseconds: number; [milliseconds, this.state.rng] = prand.uniformIntDistribution( - -twoYearsInMilliseconds, - twoYearsInMilliseconds, + this.state.min.getTime(), + this.state.max.getTime(), this.state.rng, ); - date = new Date(date.setTime(anchorTimestamp.getTime() + milliseconds)); + const date = new Date(milliseconds); if (this.dataType === 'string') { return date @@ -1185,11 +1327,17 @@ export class GenerateTimestamp extends AbstractGenerator<{ arraySize?: number }> } } -export class GenerateDatetime extends AbstractGenerator<{ arraySize?: number }> { +export class GenerateDatetime extends AbstractGenerator<{ + min?: string | Date; + max?: string | Date; + arraySize?: number; +}> { static override readonly entityKind: string = 'GenerateDatetime'; private state: { rng: prand.RandomGenerator; + min: Date; + max: Date; } | undefined; override init({ count, seed }: { count: number; seed: number }) { @@ -1197,7 +1345,47 @@ export class GenerateDatetime extends AbstractGenerator<{ arraySize?: number }> const rng = prand.xoroshiro128plus(seed); - this.state = { rng }; + let { min, max } = this.params; + + const anchorDate = new Date('2024-05-08'); + // 2 years in milliseconds + const deltaMilliseconds = 2 * 31536000000; + + // same here. a lot of code duplicates + if (typeof min === 'string') { + min = new Date(min); + } + + if (typeof min === 'object' && !isValidDate(min)) { + throw new Error('Invalid Date was provided for the min parameter.'); + } + + if (typeof max === 'string') { + max = new Date(max); + } + + if (typeof max === 'object' && !isValidDate(max)) { + throw new Error('Invalid Date was provided for the max parameter.'); + } + + if (min === undefined) { + if (max === undefined) { + min = new Date(anchorDate.getTime() - deltaMilliseconds); + max = new Date(anchorDate.getTime() + deltaMilliseconds); + } else { + min = new Date(max.getTime() - (2 * deltaMilliseconds)); + } + } + + if (max === undefined) { + max = new Date(min.getTime() + (2 * deltaMilliseconds)); + } + + if (min > max) { + throw new Error(`The min parameter must be less than or equal to the max parameter.`); + } + + this.state = { rng, min, max }; } generate() { @@ -1205,18 +1393,14 @@ export class GenerateDatetime extends AbstractGenerator<{ arraySize?: number }> throw new Error('state is not defined.'); } - const anchorDate = new Date('2024-05-08'); - const twoYearsInMilliseconds = 2 * 31536000000; - - let date = new Date(); let milliseconds: number; [milliseconds, this.state.rng] = prand.uniformIntDistribution( - -twoYearsInMilliseconds, - twoYearsInMilliseconds, + this.state.min.getTime(), + this.state.max.getTime(), this.state.rng, ); - date = new Date(date.setTime(anchorDate.getTime() + milliseconds)); + const date = new Date(milliseconds); if (this.dataType === 'string') { return date @@ -3476,6 +3660,22 @@ export class GenerateUniqueLine extends AbstractGenerator { } } +export class CustomGenerator = {}> extends AbstractGenerator<{ + generate: (params: { this_: CustomGenerator; i: number }) => any; + init?: (params: { this_: CustomGenerator; count: number; seed: number }) => void; +}> { + public state: StateT = {} as StateT; + + static override readonly entityKind: string = 'CustomGenerator'; + + override init({ count, seed }: { count: number; seed: number }) { + if (this.params.init !== undefined) this.params.init({ this_: this, count, seed }); + } + + generate({ i }: { i: number }): any { + return this.params.generate({ this_: this, i }); + } +} export class GenerateBitString extends AbstractGenerator<{ dimensions?: number; isUnique?: boolean; diff --git a/drizzle-seed/src/generators/apiVersion.ts b/drizzle-seed/src/generators/apiVersion.ts index 2f7f35dd1a..819d3ffd69 100644 --- a/drizzle-seed/src/generators/apiVersion.ts +++ b/drizzle-seed/src/generators/apiVersion.ts @@ -1 +1 @@ -export const latestVersion = 3; +export const latestVersion = 4; diff --git a/drizzle-seed/src/generators/utils.ts b/drizzle-seed/src/generators/utils.ts index 628962a125..5b93a41ff4 100644 --- a/drizzle-seed/src/generators/utils.ts +++ b/drizzle-seed/src/generators/utils.ts @@ -184,6 +184,10 @@ export const isObject = (value: any) => { return false; }; +export const isValidDate = (date: Date) => { + return !Number.isNaN(date.getTime()); +}; + // const main = () => { // console.time('range'); // const range = new OrderedBigintRange(BigInt(-10), BigInt(10), BigInt(1)); diff --git a/drizzle-seed/src/generators/versioning/v4.ts b/drizzle-seed/src/generators/versioning/v4.ts new file mode 100644 index 0000000000..df2f17f4f3 --- /dev/null +++ b/drizzle-seed/src/generators/versioning/v4.ts @@ -0,0 +1,62 @@ +import prand from 'pure-rand'; +import { AbstractGenerator } from '../Generators.ts'; + +/* eslint-disable drizzle-internal/require-entity-kind */ +export class GenerateUUIDV4 extends AbstractGenerator<{ + arraySize?: number; +}> { + static override readonly entityKind: string = 'GenerateUUID'; + static override readonly version: number = 4; + + public override isGeneratorUnique = true; + public override maxUniqueCount: number = Number.POSITIVE_INFINITY; + + private state: { rng: prand.RandomGenerator } | undefined; + + override getMaxUniqueCount(): number { + return Number.POSITIVE_INFINITY; + } + + override init({ count, seed }: { count: number; seed: number }) { + super.init({ count, seed }); + + const rng = prand.xoroshiro128plus(seed); + this.state = { rng }; + } + + generate() { + if (this.state === undefined) { + throw new Error('state is not defined.'); + } + // TODO generate uuid using string generator + const stringChars = '1234567890abcdef'; + let idx: number, + currStr: string; + const strLength = 36; + + // uuid v4 + const uuidTemplate = '########-####-4###-N###-############'; + currStr = ''; + for (let i = 0; i < strLength; i++) { + [idx, this.state.rng] = prand.uniformIntDistribution( + 0, + stringChars.length - 1, + this.state.rng, + ); + + if (uuidTemplate[i] === '#') { + currStr += stringChars[idx]; + continue; + } + + // used this pr -> https://github.com/drizzle-team/drizzle-orm/pull/4503 + if (uuidTemplate[i] === 'N') { + currStr += '89ab'[idx % 4]; + continue; + } + + currStr += uuidTemplate[i]; + } + return currStr; + } +} diff --git a/drizzle-seed/src/index.ts b/drizzle-seed/src/index.ts index 669c5a9a1d..e8cf66ec06 100644 --- a/drizzle-seed/src/index.ts +++ b/drizzle-seed/src/index.ts @@ -21,7 +21,12 @@ import type { SingleStoreColumn, SingleStoreSchema, SingleStoreTable } from 'dri import { SingleStoreDatabase } from 'drizzle-orm/singlestore-core'; import { filterCockroachSchema, resetCockroach, seedCockroach } from './cockroach-core/index.ts'; -import { generatorsFuncs, generatorsFuncsV2, type generatorsFuncsV3 } from './generators/GeneratorFuncs.ts'; +import { + generatorsFuncs, + generatorsFuncsV2, + type generatorsFuncsV3, + type generatorsFuncsV4, +} from './generators/GeneratorFuncs.ts'; import type { AbstractGenerator } from './generators/Generators.ts'; import { filterMsSqlTables, resetMsSql, seedMsSql } from './mssql-core/index.ts'; import { filterMysqlTables, resetMySql, seedMySql } from './mysql-core/index.ts'; @@ -161,7 +166,8 @@ export type FunctionsVersioning ? typeof generatorsFuncs : VERSION extends `2` ? typeof generatorsFuncsV2 : VERSION extends `3` ? typeof generatorsFuncsV3 - : typeof generatorsFuncsV3; + : VERSION extends `4` ? typeof generatorsFuncsV4 + : typeof generatorsFuncsV4; export function getGeneratorsFunctions() { return generatorsFuncs; @@ -280,7 +286,7 @@ export async function seedForDrizzleStudio( * // seeding with count and seed specified * await seed(db, schema, { count: 100000, seed: 1 }); * - * //seeding using refine + * // seeding using refine * await seed(db, schema, { count: 1000 }).refine((funcs) => ({ * users: { * columns: { @@ -301,6 +307,17 @@ export async function seedForDrizzleStudio( * }, * })); * + * // seeding while ignoring column + * await seed(db, schema).refine((funcs) => ({ + * users: { + * count: 5, + * columns: { + * name: funcs.fullName(), + * photo: false, // the photo column will not be seeded, allowing the database to use its default value. + * }, + * }, + * })); + * * ``` */ export function seed< @@ -308,7 +325,7 @@ export function seed< SCHEMA extends { [key: string]: SchemaValuesType; }, - VERSION extends '3' | '2' | '1' | undefined, + VERSION extends '4' | '3' | '2' | '1' | undefined, >(db: DB, schema: SCHEMA, options?: { count?: number; seed?: number; version?: VERSION }) { return new SeedPromise(db, schema, options); } @@ -385,6 +402,10 @@ const seedFunc = async ( * @example * ```ts * await reset(db, schema); + * + * // Alternatively, you can provide an object containing your tables + * // as the `schema` parameter when calling `reset`. + * await reset(db, { users }); * ``` */ export async function reset< diff --git a/drizzle-seed/src/utils.ts b/drizzle-seed/src/utils.ts index 6be4381f68..e68a4211d6 100644 --- a/drizzle-seed/src/utils.ts +++ b/drizzle-seed/src/utils.ts @@ -1,3 +1,15 @@ +import { is } from 'drizzle-orm'; +import type { PgColumn } from 'drizzle-orm/pg-core'; +import { + PgBigInt53, + PgBigInt64, + PgBigSerial53, + PgBigSerial64, + PgInteger, + PgSerial, + PgSmallInt, + PgSmallSerial, +} from 'drizzle-orm/pg-core'; import type { RelationWithReferences } from './types/tables'; export const isRelationCyclic = ( @@ -37,3 +49,16 @@ export const isRelationCyclic = ( export const equalSets = (set1: Set, set2: Set) => { return set1.size === set2.size && [...set1].every((si) => set2.has(si)); }; + +export const intMax = (args: (number | bigint)[]) => args.reduce((m, e) => e > m ? e : m); + +export const isPostgresColumnIntLike = (column: PgColumn) => { + return is(column, PgSmallInt) + || is(column, PgInteger) + || is(column, PgBigInt53) + || is(column, PgBigInt64) + || is(column, PgSmallSerial) + || is(column, PgSerial) + || is(column, PgBigSerial53) + || is(column, PgBigSerial64); +}; diff --git a/drizzle-seed/tests/mysql/generatorsTest/generators.test.ts b/drizzle-seed/tests/mysql/generatorsTest/generators.test.ts index 64cc7b154c..45c68b4ff3 100644 --- a/drizzle-seed/tests/mysql/generatorsTest/generators.test.ts +++ b/drizzle-seed/tests/mysql/generatorsTest/generators.test.ts @@ -1,6 +1,6 @@ import { sql } from 'drizzle-orm'; import { expect } from 'vitest'; -import { seed } from '../../../src/index.ts'; +import { reset, seed } from '../../../src/index.ts'; import { mysqlTest as test } from '../instrumentation.ts'; import * as schema from './mysqlSchema.ts'; @@ -46,11 +46,82 @@ test('datetime generator test', async ({ db }) => { }, })); - const data = await db.select().from(schema.datetimeTable); + let data = await db.select().from(schema.datetimeTable); // every value in each row does not equal undefined. - const predicate = data.length !== 0 + let predicate = data.length !== 0 && data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null)); expect(predicate).toBe(true); + + const min = '2025-03-07 13:12:13Z'; + const max = '2025-03-09 15:12:13Z'; + await reset(db, { datetimeTable: schema.datetimeTable }); + await seed(db, { datetimeTable: schema.datetimeTable }).refine((funcs) => ({ + datetimeTable: { + count, + columns: { + datetime: funcs.datetime({ + min, + max, + }), + }, + }, + })); + + data = await db.select().from(schema.datetimeTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => + val !== null && val >= new Date(min) + && val <= new Date(max) + ) + ); + + expect(predicate).toBe(true); + + await reset(db, { datetimeTable: schema.datetimeTable }); + await seed(db, { datetimeTable: schema.datetimeTable }).refine((funcs) => ({ + datetimeTable: { + count, + columns: { + datetime: funcs.datetime({ + min, + max: min, + }), + }, + }, + })); + + data = await db.select().from(schema.datetimeTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => val !== null && val.getTime() === new Date(min).getTime()) + ); + + expect(predicate).toBe(true); + + await reset(db, { datetimeTable: schema.datetimeTable }); + await seed(db, { datetimeTable: schema.datetimeTable }).refine((funcs) => ({ + datetimeTable: { + count, + columns: { + datetime: funcs.datetime({ + min: new Date(min), + max: new Date(min), + }), + }, + }, + })); + + data = await db.select().from(schema.datetimeTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => val !== null && val.getTime() === new Date(min).getTime()) + ); + + expect(predicate).toBe(true); }); test('year generator test', async ({ db }) => { diff --git a/drizzle-seed/tests/pg/generatorsTest/generators.test.ts b/drizzle-seed/tests/pg/generatorsTest/generators.test.ts index b049b5d874..348dbc63f6 100644 --- a/drizzle-seed/tests/pg/generatorsTest/generators.test.ts +++ b/drizzle-seed/tests/pg/generatorsTest/generators.test.ts @@ -1106,10 +1106,77 @@ test('date generator test', async () => { }, })); - const data = await db.select().from(schema.dateTable); + let data = await db.select().from(schema.dateTable); // every value in each row does not equal undefined. - const predicate = data.length !== 0 - && data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null)); + let predicate = data.length !== 0 + && data.every((row) => Object.values(row).every((val) => val !== null)); + expect(predicate).toBe(true); + + // seed with parameters + const minDate = '2025-03-07'; + const maxDate = '2025-03-09'; + await reset(db, { dateTable: schema.dateTable }); + await seed(db, { dateTable: schema.dateTable }).refine((funcs) => ({ + dateTable: { + count, + columns: { + date: funcs.date({ + minDate, + maxDate, + }), + }, + }, + })); + + data = await db.select().from(schema.dateTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => val !== null && val >= new Date(minDate) && val <= new Date(maxDate)) + ); + + expect(predicate).toBe(true); + + await reset(db, { dateTable: schema.dateTable }); + await seed(db, { dateTable: schema.dateTable }).refine((funcs) => ({ + dateTable: { + count, + columns: { + date: funcs.date({ + minDate, + maxDate: minDate, + }), + }, + }, + })); + + data = await db.select().from(schema.dateTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => val !== null && val.getTime() === new Date(minDate).getTime()) + ); + expect(predicate).toBe(true); + + await reset(db, { dateTable: schema.dateTable }); + await seed(db, { dateTable: schema.dateTable }).refine((funcs) => ({ + dateTable: { + count, + columns: { + date: funcs.date({ + minDate: new Date(minDate), + maxDate: new Date(minDate), + }), + }, + }, + })); + + data = await db.select().from(schema.dateTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => val !== null && val.getTime() === new Date(minDate).getTime()) + ); expect(predicate).toBe(true); }); @@ -1143,11 +1210,87 @@ test('time generator test', async () => { }, })); - const data = await db.select().from(schema.timeTable); + let data = await db.select().from(schema.timeTable); // every value in each row does not equal undefined. - const predicate = data.length !== 0 + let predicate = data.length !== 0 && data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null)); expect(predicate).toBe(true); + + // seed with parameters + const min = '13:12:13'; + const max = '15:12:13'; + await reset(db, { timeTable: schema.timeTable }); + await seed(db, { timeTable: schema.timeTable }).refine((funcs) => ({ + timeTable: { + count, + columns: { + time: funcs.time({ + min, + max, + }), + }, + }, + })); + + const anchorDate = new Date(); + const getDateFromTime = (val: string) => new Date(anchorDate.toISOString().replace(/\d{2}:\d{2}:\d{2}/, val)); + data = await db.select().from(schema.timeTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => + val !== null && getDateFromTime(val) >= getDateFromTime(min) + && getDateFromTime(val) <= getDateFromTime(max) + ) + ); + + expect(predicate).toBe(true); + + await reset(db, { timeTable: schema.timeTable }); + await seed(db, { timeTable: schema.timeTable }).refine((funcs) => ({ + timeTable: { + count, + columns: { + time: funcs.time({ + min, + max: min, + }), + }, + }, + })); + + data = await db.select().from(schema.timeTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => + val !== null && getDateFromTime(val).getTime() === getDateFromTime(min).getTime() + ) + ); + expect(predicate).toBe(true); + + await reset(db, { timeTable: schema.timeTable }); + await seed(db, { timeTable: schema.timeTable }).refine((funcs) => ({ + timeTable: { + count, + columns: { + time: funcs.time({ + min: getDateFromTime(min), + max: getDateFromTime(min), + }), + }, + }, + })); + + data = await db.select().from(schema.timeTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => + val !== null && getDateFromTime(val).getTime() === getDateFromTime(min).getTime() + ) + ); + expect(predicate).toBe(true); }); test('time array generator test', async () => { @@ -1177,11 +1320,83 @@ test('timestamp generator test', async () => { }, })); - const data = await db.select().from(schema.timestampTable); + let data = await db.select().from(schema.timestampTable); // every value in each row does not equal undefined. - const predicate = data.length !== 0 + let predicate = data.length !== 0 && data.every((row) => Object.values(row).every((val) => val !== undefined && val !== null)); expect(predicate).toBe(true); + + // seed with parameters + const min = '2025-03-07 13:12:13.123Z'; + const max = '2025-03-09 15:12:13.456Z'; + await reset(db, { timestampTable: schema.timestampTable }); + await seed(db, { timestampTable: schema.timestampTable }).refine((funcs) => ({ + timestampTable: { + count, + columns: { + timestamp: funcs.timestamp({ + min, + max, + }), + }, + }, + })); + + data = await db.select().from(schema.timestampTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => + val !== null && val >= new Date(min) + && val <= new Date(max) + ) + ); + + expect(predicate).toBe(true); + + await reset(db, { timestampTable: schema.timestampTable }); + await seed(db, { timestampTable: schema.timestampTable }).refine((funcs) => ({ + timestampTable: { + count, + columns: { + timestamp: funcs.timestamp({ + min, + max: min, + }), + }, + }, + })); + + data = await db.select().from(schema.timestampTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => val !== null && val.getTime() === new Date(min).getTime()) + ); + + expect(predicate).toBe(true); + + await reset(db, { timestampTable: schema.timestampTable }); + await seed(db, { timestampTable: schema.timestampTable }).refine((funcs) => ({ + timestampTable: { + count, + columns: { + timestamp: funcs.timestamp({ + min: new Date(min), + max: new Date(min), + }), + }, + }, + })); + + data = await db.select().from(schema.timestampTable); + // every value in each row does not equal undefined. + predicate = data.length !== 0 + && data.every((row) => + Object.values(row).every((val) => val !== null && val.getTime() === new Date(min).getTime()) + ); + + expect(predicate).toBe(true); }); test('timestamp array generator test', async () => { diff --git a/drizzle-seed/tests/pg/generatorsTest/pgSchema.ts b/drizzle-seed/tests/pg/generatorsTest/pgSchema.ts index a5b9aaeb97..92cf85687b 100644 --- a/drizzle-seed/tests/pg/generatorsTest/pgSchema.ts +++ b/drizzle-seed/tests/pg/generatorsTest/pgSchema.ts @@ -88,7 +88,7 @@ export const booleanArrayTable = schema.table('boolean_array_table', { }); export const dateTable = schema.table('date_table', { - date: date('date'), + date: date('date', { mode: 'date' }), }); // TODO: add tests for data type with different modes diff --git a/drizzle-seed/tests/pg/pg.test.ts b/drizzle-seed/tests/pg/pg.test.ts index 1c058b8e5e..02bf8dc0d4 100644 --- a/drizzle-seed/tests/pg/pg.test.ts +++ b/drizzle-seed/tests/pg/pg.test.ts @@ -3,6 +3,7 @@ import { sql } from 'drizzle-orm'; import { relations } from 'drizzle-orm/_relations'; import type { PgliteDatabase } from 'drizzle-orm/pglite'; import { drizzle } from 'drizzle-orm/pglite'; +import { createSelectSchema } from 'drizzle-zod'; import { afterAll, afterEach, beforeAll, expect, test, vi } from 'vitest'; import { reset, seed } from '../../src/index.ts'; import * as schema from './pgSchema.ts'; @@ -220,6 +221,31 @@ beforeAll(async () => { ); `, ); + + await db.execute( + sql` + create table "seeder_lib_pg"."test_sequences" + ( + col1 integer generated always as identity, + col2 bigint generated by default as identity, + col3 bigint generated by default as identity, + col4 smallint, + col5 serial, + col6 bigserial, + col7 bigserial, + col8 smallserial + ); + `, + ); + + await db.execute( + sql` + create table "seeder_lib_pg"."uuid_test" + ( + col1 uuid + ); + `, + ); }); afterEach(async () => { @@ -434,3 +460,79 @@ test('overlapping a foreign key constraint with a one-to-many relation', async ( predicate = posts.every((row) => Object.values(row).every((val) => val !== undefined && val !== null)); expect(predicate).toBe(true); }); + +test('seeding while ignoring column', async () => { + await seed(db, { users: schema.users }).refine(() => ({ + users: { + columns: { + name: false, + }, + }, + })); + + const result = await db.select().from(schema.users); + + expect(result.length).toBe(10); + const predicate = result.every((row) => + Object.entries(row).every(([colName, colVal]) => + (colName === 'name' && colVal === null) || (colName !== 'name' && colVal !== null) + ) + ); + expect(predicate).toBe(true); +}); + +test('seeding table with sequences', async () => { + await seed(db, { testSequences: schema.testSequences }, { count: 10 }).refine((funcs) => ({ + testSequences: { + columns: { + col1: funcs.intPrimaryKey(), + col2: funcs.intPrimaryKey(), + col3: funcs.intPrimaryKey(), + col4: funcs.intPrimaryKey(), + col5: funcs.intPrimaryKey(), + col6: funcs.intPrimaryKey(), + col7: funcs.intPrimaryKey(), + col8: funcs.intPrimaryKey(), + }, + }, + })); + + await db.insert(schema.testSequences).values([{}]); + const res = await db.select().from(schema.testSequences); + + expect(res.at(-1)).toStrictEqual({ + col1: 11, + col2: 11, + col3: 11n, + col4: null, + col5: 11, + col6: 11, + col7: 11n, + col8: 11, + }); +}); + +test('uuid with drizzle-zod check', async () => { + await seed(db, { uuidTest: schema.uuidTest }, { count: 1 }).refine((funcs) => ({ + uuidTest: { + columns: { + col1: funcs.uuid(), + }, + }, + })); + + const uuidSelectSchema = createSelectSchema(schema.uuidTest); + const res = await db.select().from(schema.uuidTest); + uuidSelectSchema.parse(res[0]); + + expect(res).toStrictEqual([{ col1: 'caf44ec1-e98c-4d92-8ed5-beb2074f1460' }]); + const possibleUuids = [ + 'caf44ec1-e98c-4d92-8ed5-beb2074f1460', + 'caf44ec1-e98c-4d92-9ed5-beb2074f1460', + 'caf44ec1-e98c-4d92-aed5-beb2074f1460', + 'caf44ec1-e98c-4d92-bed5-beb2074f1460', + ]; + for (const uuid of possibleUuids) { + uuidSelectSchema.parse({ col1: uuid }); + } +}); diff --git a/drizzle-seed/tests/pg/pgSchema.ts b/drizzle-seed/tests/pg/pgSchema.ts index 05608ab141..810e6161bf 100644 --- a/drizzle-seed/tests/pg/pgSchema.ts +++ b/drizzle-seed/tests/pg/pgSchema.ts @@ -1,5 +1,18 @@ import type { AnyPgColumn } from 'drizzle-orm/pg-core'; -import { integer, numeric, pgSchema, serial, text, timestamp, varchar } from 'drizzle-orm/pg-core'; +import { + bigint, + bigserial, + integer, + numeric, + pgSchema, + serial, + smallint, + smallserial, + text, + timestamp, + uuid, + varchar, +} from 'drizzle-orm/pg-core'; export const schema = pgSchema('seeder_lib_pg'); @@ -127,3 +140,21 @@ export const posts = schema.table( userId: integer().references(() => users.id), }, ); + +export const testSequences = schema.table( + 'test_sequences', + { + col1: integer().generatedAlwaysAsIdentity(), + col2: bigint({ mode: 'number' }).generatedByDefaultAsIdentity(), + col3: bigint({ mode: 'bigint' }).generatedByDefaultAsIdentity(), + col4: smallint(), + col5: serial(), + col6: bigserial({ mode: 'number' }), + col7: bigserial({ mode: 'bigint' }), + col8: smallserial(), + }, +); + +export const uuidTest = schema.table('uuid_test', { + col1: uuid(), +}); diff --git a/drizzle-seed/tsconfig.build.json b/drizzle-seed/tsconfig.build.json index 3377281baa..712ab85e0c 100644 --- a/drizzle-seed/tsconfig.build.json +++ b/drizzle-seed/tsconfig.build.json @@ -3,5 +3,5 @@ "compilerOptions": { "rootDir": "src" }, - "include": ["src"] + "include": ["src", "!src/dev"] } diff --git a/drizzle-seed/tsconfig.json b/drizzle-seed/tsconfig.json index 42e23b1642..20dbe7ef9c 100644 --- a/drizzle-seed/tsconfig.json +++ b/drizzle-seed/tsconfig.json @@ -37,11 +37,7 @@ "noEmit": true, "allowImportingTsExtensions": true, "outDir": "dist", - "baseUrl": ".", - "declaration": true, - "paths": { - "~/*": ["src/*"] - } + "declaration": true }, "exclude": ["**/dist", "src/dev"], "include": ["src", "tests", "type-tests"] diff --git a/drizzle-seed/type-tests/sqlite.ts b/drizzle-seed/type-tests/sqlite.ts index 3228609c5c..412ff03834 100644 --- a/drizzle-seed/type-tests/sqlite.ts +++ b/drizzle-seed/type-tests/sqlite.ts @@ -10,6 +10,26 @@ const sqliteUsers = sqliteTable('users', { inviteId: int('invite_id').references((): SQLiteColumn => sqliteUsers.id), }); +{ + const db = betterSqlite3Drizzle(''); + + await seed(db, { users: sqliteUsers }); + await reset(db, { users: sqliteUsers }); +} + +{ + const db = libsqlDrizzle({ + schema: { sqliteUsers }, + connection: { + url: 'libsql://testturso-oleksiikh0240.turso.io', + }, + }); + + await reset(db, { sqliteUsers }); + + await seed(db, { sqliteUsers }); +} + { const db0 = betterSqlite3Drizzle('', { schema: { users: sqliteUsers } }); diff --git a/drizzle-seed/vitest.config.ts b/drizzle-seed/vitest.config.ts index 3109f9f53a..ed3cfb401d 100644 --- a/drizzle-seed/vitest.config.ts +++ b/drizzle-seed/vitest.config.ts @@ -18,11 +18,6 @@ export default defineConfig({ testTimeout: 100000, hookTimeout: 100000, isolate: true, - poolOptions: { - threads: { - singleThread: true, - }, - }, maxWorkers: 1, fileParallelism: false, }, diff --git a/drizzle-typebox/package.json b/drizzle-typebox/package.json index b427816a98..4be441ea89 100644 --- a/drizzle-typebox/package.json +++ b/drizzle-typebox/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-typebox", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "description": "Generate Typebox schemas from Drizzle ORM schemas", "type": "module", "scripts": { diff --git a/drizzle-valibot/package.json b/drizzle-valibot/package.json index b2b922050d..9228a670a9 100644 --- a/drizzle-valibot/package.json +++ b/drizzle-valibot/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-valibot", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "description": "Generate valibot schemas from Drizzle ORM schemas", "type": "module", "scripts": { diff --git a/drizzle-zod/package.json b/drizzle-zod/package.json index 308e929863..95e034f22f 100644 --- a/drizzle-zod/package.json +++ b/drizzle-zod/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-zod", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "description": "Generate Zod schemas from Drizzle ORM schemas", "type": "module", "scripts": { diff --git a/eslint-plugin-drizzle/package.json b/eslint-plugin-drizzle/package.json index 7fb15d78e9..69433a9dcb 100644 --- a/eslint-plugin-drizzle/package.json +++ b/eslint-plugin-drizzle/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-drizzle", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "description": "Eslint plugin for drizzle users to avoid common pitfalls", "main": "src/index.js", "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b07861968..378dee812e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,10 +125,10 @@ importers: devDependencies: '@ark/attest': specifier: ^0.45.8 - version: 0.45.11(typescript@5.9.2) + version: 0.45.11(typescript@6.0.0-dev.20251126) '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@5.9.2) + version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@6.0.0-dev.20251126) '@types/node': specifier: ^18.15.10 version: 18.19.130 @@ -379,7 +379,7 @@ importers: devDependencies: '@arktype/attest': specifier: ^0.46.0 - version: 0.46.0(typescript@5.9.2) + version: 0.46.0(typescript@6.0.0-dev.20251126) '@aws-sdk/client-rds-data': specifier: ^3.914.0 version: 3.940.0 @@ -454,7 +454,7 @@ importers: version: 0.8.0 '@xata.io/client': specifier: ^0.29.3 - version: 0.29.5(typescript@5.9.2) + version: 0.29.5(typescript@6.0.0-dev.20251126) better-sqlite3: specifier: ^11.9.1 version: 11.9.1 @@ -527,7 +527,7 @@ importers: version: 0.4.4(rollup@3.29.5) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@5.9.2) + version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@6.0.0-dev.20251126) '@types/async-retry': specifier: ^1.4.8 version: 1.4.9 @@ -565,11 +565,14 @@ importers: specifier: ^16.4.5 version: 16.6.1 drizzle-kit: - specifier: workspace:./drizzle-kit/dist - version: link:drizzle-kit/dist + specifier: workspace:../drizzle-kit/dist + version: link:../drizzle-kit/dist drizzle-orm: - specifier: workspace:./drizzle-orm/dist - version: link:drizzle-orm/dist + specifier: workspace:../drizzle-orm/dist + version: link:../drizzle-orm/dist + drizzle-zod: + specifier: workspace:../drizzle-zod/dist + version: link:../drizzle-zod/dist get-port: specifier: ^7.1.0 version: 7.1.0 @@ -584,7 +587,7 @@ importers: version: 8.16.3 resolve-tspaths: specifier: ^0.8.19 - version: 0.8.23(typescript@5.9.2) + version: 0.8.23(typescript@6.0.0-dev.20251126) rollup: specifier: ^3.29.5 version: 3.29.5 @@ -597,6 +600,9 @@ importers: uuid: specifier: ^10.0.0 version: 10.0.0 + zod: + specifier: ^4.0.0 + version: 4.1.13 zx: specifier: ^8.1.5 version: 8.8.5 @@ -605,7 +611,7 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@5.9.2) + version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@6.0.0-dev.20251126) '@sinclair/typebox': specifier: ^0.34.8 version: 0.34.41 @@ -635,7 +641,7 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@5.9.2) + version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@6.0.0-dev.20251126) '@types/node': specifier: ^18.15.10 version: 18.19.130 @@ -656,7 +662,7 @@ importers: version: 3.29.5 valibot: specifier: 1.0.0-beta.7 - version: 1.0.0-beta.7(typescript@5.9.2) + version: 1.0.0-beta.7(typescript@6.0.0-dev.20251126) zx: specifier: ^7.2.2 version: 7.2.4 @@ -665,7 +671,7 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@5.9.2) + version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@6.0.0-dev.20251126) '@types/node': specifier: ^18.15.10 version: 18.19.130 @@ -761,7 +767,7 @@ importers: version: 0.8.0 '@xata.io/client': specifier: ^0.29.3 - version: 0.29.5(typescript@5.9.2) + version: 0.29.5(typescript@6.0.0-dev.20251126) async-retry: specifier: ^1.3.3 version: 1.3.3 @@ -903,13 +909,13 @@ importers: version: 5.5.4 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.25)(typescript@5.9.2) + version: 10.9.2(@types/node@20.19.25)(typescript@6.0.0-dev.20251126) tsx: specifier: ^4.14.0 version: 4.20.6 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.9.2)(vite@7.2.4(@types/node@20.19.25)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.3.2(typescript@6.0.0-dev.20251126)(vite@7.2.4(@types/node@20.19.25)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) zx: specifier: ^8.3.2 version: 8.8.5 @@ -918,7 +924,7 @@ importers: dependencies: drizzle-beta: specifier: npm:drizzle-orm@1.0.0-beta.1-c0277c0 - version: drizzle-orm@1.0.0-beta.1-c0277c0(@aws-sdk/client-rds-data@3.940.0)(@cloudflare/workers-types@4.20251126.0)(@electric-sql/pglite@0.2.12)(@libsql/client-wasm@0.10.0)(@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@1.0.2)(@op-engineering/op-sqlite@2.0.22(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@5.14.0(prisma@5.14.0))(@tidbcloud/serverless@0.1.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(@xata.io/client@0.29.5(typescript@5.9.2))(better-sqlite3@11.9.1)(bun-types@1.3.3)(expo-sqlite@14.0.6(expo@54.0.25(@babel/core@7.28.5)(bufferutil@4.0.8)(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(utf-8-validate@6.0.3)))(gel@2.2.0)(mysql2@3.14.1)(pg@8.16.3)(postgres@3.4.7)(prisma@5.14.0)(sql.js@1.13.0)(sqlite3@5.1.7) + version: drizzle-orm@1.0.0-beta.1-c0277c0(@aws-sdk/client-rds-data@3.940.0)(@cloudflare/workers-types@4.20251126.0)(@electric-sql/pglite@0.2.12)(@libsql/client-wasm@0.10.0)(@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@1.0.2)(@op-engineering/op-sqlite@2.0.22(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@5.14.0(prisma@5.14.0))(@tidbcloud/serverless@0.1.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(@xata.io/client@0.29.5(typescript@6.0.0-dev.20251126))(better-sqlite3@11.9.1)(bun-types@1.3.3)(expo-sqlite@14.0.6(expo@54.0.25(@babel/core@7.28.5)(bufferutil@4.0.8)(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(utf-8-validate@6.0.3)))(gel@2.2.0)(mysql2@3.14.1)(pg@8.16.3)(postgres@3.4.7)(prisma@5.14.0)(sql.js@1.13.0)(sqlite3@5.1.7) drizzle-seed: specifier: workspace:../drizzle-seed/dist version: link:../drizzle-seed/dist @@ -5980,7 +5986,6 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lighthouse-logger@1.4.2: @@ -8592,6 +8597,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} + zx@7.2.4: resolution: {integrity: sha512-gDBp2doPvjzQiR5+d1AEuqTC/4TJq84WFHk3XiAZtO1XRUB0XRG0OYie8CdLPT8kJp085TpQ8NzPge7A+3aFgg==} engines: {node: '>= 16.0.0'} @@ -8628,16 +8636,16 @@ snapshots: typescript: 5.6.1-rc validate-npm-package-name: 5.0.1 - '@ark/attest@0.45.11(typescript@5.9.2)': + '@ark/attest@0.45.11(typescript@6.0.0-dev.20251126)': dependencies: '@ark/fs': 0.45.10 '@ark/util': 0.45.10 '@prettier/sync': 0.5.5(prettier@3.5.3) '@typescript/analyze-trace': 0.10.1 - '@typescript/vfs': 1.6.1(typescript@5.9.2) + '@typescript/vfs': 1.6.1(typescript@6.0.0-dev.20251126) arktype: 2.1.19 prettier: 3.5.3 - typescript: 5.9.2 + typescript: 6.0.0-dev.20251126 transitivePeerDependencies: - supports-color @@ -8665,16 +8673,16 @@ snapshots: '@ark/util@0.55.0': {} - '@arktype/attest@0.46.0(typescript@5.9.2)': + '@arktype/attest@0.46.0(typescript@6.0.0-dev.20251126)': dependencies: '@ark/fs': 0.46.0 '@ark/util': 0.46.0 '@prettier/sync': 0.5.5(prettier@3.5.3) '@typescript/analyze-trace': 0.10.1 - '@typescript/vfs': 1.6.1(typescript@5.9.2) + '@typescript/vfs': 1.6.1(typescript@6.0.0-dev.20251126) arktype: 2.1.20 prettier: 3.5.3 - typescript: 5.9.2 + typescript: 6.0.0-dev.20251126 transitivePeerDependencies: - supports-color @@ -11326,11 +11334,11 @@ snapshots: optionalDependencies: rollup: 3.29.5 - '@rollup/plugin-typescript@11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@5.9.2)': + '@rollup/plugin-typescript@11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@6.0.0-dev.20251126)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@3.29.5) resolve: 1.22.11 - typescript: 5.9.2 + typescript: 6.0.0-dev.20251126 optionalDependencies: rollup: 3.29.5 tslib: 2.8.1 @@ -12070,10 +12078,10 @@ snapshots: treeify: 1.1.0 yargs: 16.2.0 - '@typescript/vfs@1.6.1(typescript@5.9.2)': + '@typescript/vfs@1.6.1(typescript@6.0.0-dev.20251126)': dependencies: debug: 4.4.3 - typescript: 5.9.2 + typescript: 6.0.0-dev.20251126 transitivePeerDependencies: - supports-color @@ -12149,15 +12157,15 @@ snapshots: '@vitest/pretty-format': 4.0.13 tinyrainbow: 3.0.3 - '@xata.io/client@0.29.5(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - '@xata.io/client@0.29.5(typescript@5.9.3)': dependencies: typescript: 5.9.3 optional: true + '@xata.io/client@0.29.5(typescript@6.0.0-dev.20251126)': + dependencies: + typescript: 6.0.0-dev.20251126 + '@xmldom/xmldom@0.8.11': {} abbrev@1.1.1: {} @@ -13291,7 +13299,7 @@ snapshots: sql.js: 1.13.0 sqlite3: 5.1.7 - drizzle-orm@1.0.0-beta.1-c0277c0(@aws-sdk/client-rds-data@3.940.0)(@cloudflare/workers-types@4.20251126.0)(@electric-sql/pglite@0.2.12)(@libsql/client-wasm@0.10.0)(@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@1.0.2)(@op-engineering/op-sqlite@2.0.22(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@5.14.0(prisma@5.14.0))(@tidbcloud/serverless@0.1.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(@xata.io/client@0.29.5(typescript@5.9.2))(better-sqlite3@11.9.1)(bun-types@1.3.3)(expo-sqlite@14.0.6(expo@54.0.25(@babel/core@7.28.5)(bufferutil@4.0.8)(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(utf-8-validate@6.0.3)))(gel@2.2.0)(mysql2@3.14.1)(pg@8.16.3)(postgres@3.4.7)(prisma@5.14.0)(sql.js@1.13.0)(sqlite3@5.1.7): + drizzle-orm@1.0.0-beta.1-c0277c0(@aws-sdk/client-rds-data@3.940.0)(@cloudflare/workers-types@4.20251126.0)(@electric-sql/pglite@0.2.12)(@libsql/client-wasm@0.10.0)(@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@1.0.2)(@op-engineering/op-sqlite@2.0.22(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@5.14.0(prisma@5.14.0))(@tidbcloud/serverless@0.1.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(@xata.io/client@0.29.5(typescript@6.0.0-dev.20251126))(better-sqlite3@11.9.1)(bun-types@1.3.3)(expo-sqlite@14.0.6(expo@54.0.25(@babel/core@7.28.5)(bufferutil@4.0.8)(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(utf-8-validate@6.0.3)))(gel@2.2.0)(mysql2@3.14.1)(pg@8.16.3)(postgres@3.4.7)(prisma@5.14.0)(sql.js@1.13.0)(sqlite3@5.1.7): optionalDependencies: '@aws-sdk/client-rds-data': 3.940.0 '@cloudflare/workers-types': 4.20251126.0 @@ -13308,7 +13316,7 @@ snapshots: '@types/pg': 8.15.6 '@types/sql.js': 1.4.9 '@vercel/postgres': 0.8.0 - '@xata.io/client': 0.29.5(typescript@5.9.2) + '@xata.io/client': 0.29.5(typescript@6.0.0-dev.20251126) better-sqlite3: 11.9.1 bun-types: 1.3.3 expo-sqlite: 14.0.6(expo@54.0.25(@babel/core@7.28.5)(bufferutil@4.0.8)(react-native@0.82.1(@babel/core@7.28.5)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(utf-8-validate@6.0.3)) @@ -16396,6 +16404,13 @@ snapshots: fast-glob: 3.3.2 typescript: 5.9.2 + resolve-tspaths@0.8.23(typescript@6.0.0-dev.20251126): + dependencies: + ansi-colors: 4.1.3 + commander: 12.1.0 + fast-glob: 3.3.2 + typescript: 6.0.0-dev.20251126 + resolve-workspace-root@2.0.0: {} resolve.exports@2.0.3: {} @@ -17122,7 +17137,7 @@ snapshots: '@ts-morph/common': 0.26.1 code-block-writer: 13.0.3 - ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.2): + ts-node@10.9.2(@types/node@20.19.25)(typescript@6.0.0-dev.20251126): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -17136,7 +17151,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.2 + typescript: 6.0.0-dev.20251126 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -17144,6 +17159,10 @@ snapshots: optionalDependencies: typescript: 5.9.2 + tsconfck@3.1.6(typescript@6.0.0-dev.20251126): + optionalDependencies: + typescript: 6.0.0-dev.20251126 + tslib@2.8.1: {} tsup@8.5.1(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): @@ -17387,9 +17406,9 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - valibot@1.0.0-beta.7(typescript@5.9.2): + valibot@1.0.0-beta.7(typescript@6.0.0-dev.20251126): optionalDependencies: - typescript: 5.9.2 + typescript: 6.0.0-dev.20251126 validate-npm-package-name@4.0.0: dependencies: @@ -17399,24 +17418,24 @@ snapshots: vary@1.1.2: {} - vite-tsconfig-paths@4.3.2(typescript@5.9.2)(vite@7.2.4(@types/node@20.19.25)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@4.3.2(typescript@5.9.2)(vite@7.2.4(@types/node@24.10.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.2) optionalDependencies: - vite: 7.2.4(@types/node@20.19.25)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.9.2)(vite@7.2.4(@types/node@24.10.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@4.3.2(typescript@6.0.0-dev.20251126)(vite@7.2.4(@types/node@20.19.25)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.2) + tsconfck: 3.1.6(typescript@6.0.0-dev.20251126) optionalDependencies: - vite: 7.2.4(@types/node@24.10.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@20.19.25)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript @@ -17712,6 +17731,8 @@ snapshots: zod@3.25.76: {} + zod@4.1.13: {} + zx@7.2.4: dependencies: '@types/fs-extra': 11.0.4 diff --git a/turbo.json b/turbo.json index 8d83522ae1..9454782dba 100644 --- a/turbo.json +++ b/turbo.json @@ -189,7 +189,8 @@ }, "drizzle-seed#build": { "dependsOn": [ - "drizzle-orm#build" + "drizzle-orm#build", + "drizzle-zod#build" ], "inputs": [ "src/**/*.ts", @@ -395,7 +396,8 @@ }, "drizzle-seed#build:artifact": { "dependsOn": [ - "drizzle-orm#build:artifact" + "drizzle-orm#build:artifact", + "drizzle-zod#build:artifact" ], "inputs": [ "src/**/*.ts",