@shipfox/api-definitions 13.1.0 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +11 -11
- package/CHANGELOG.md +35 -0
- package/dist/core/entities/index.d.ts +1 -1
- package/dist/core/entities/index.d.ts.map +1 -1
- package/dist/core/entities/index.js +1 -1
- package/dist/core/entities/index.js.map +1 -1
- package/dist/core/entities/integration-context.d.ts +4 -0
- package/dist/core/entities/integration-context.d.ts.map +1 -1
- package/dist/core/entities/integration-context.js.map +1 -1
- package/dist/core/entities/sync-state.d.ts +10 -4
- package/dist/core/entities/sync-state.d.ts.map +1 -1
- package/dist/core/entities/sync-state.js +26 -7
- package/dist/core/entities/sync-state.js.map +1 -1
- package/dist/core/entities/validation-diagnostic.d.ts +8 -0
- package/dist/core/entities/validation-diagnostic.d.ts.map +1 -0
- package/dist/core/entities/validation-diagnostic.js +3 -0
- package/dist/core/entities/validation-diagnostic.js.map +1 -0
- package/dist/core/entities/workflow-definition.d.ts +2 -0
- package/dist/core/entities/workflow-definition.d.ts.map +1 -1
- package/dist/core/entities/workflow-definition.js.map +1 -1
- package/dist/core/errors.d.ts +10 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +9 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/integrations.d.ts +3 -1
- package/dist/core/integrations.d.ts.map +1 -1
- package/dist/core/integrations.js +10 -2
- package/dist/core/integrations.js.map +1 -1
- package/dist/core/parse-definition.d.ts +4 -4
- package/dist/core/parse-definition.d.ts.map +1 -1
- package/dist/core/parse-definition.js +5 -5
- package/dist/core/parse-definition.js.map +1 -1
- package/dist/core/resolve-definition-at-ref.d.ts +66 -0
- package/dist/core/resolve-definition-at-ref.d.ts.map +1 -0
- package/dist/core/resolve-definition-at-ref.js +374 -0
- package/dist/core/resolve-definition-at-ref.js.map +1 -0
- package/dist/core/sync-definitions.d.ts +2 -2
- package/dist/core/sync-definitions.d.ts.map +1 -1
- package/dist/core/sync-definitions.js +5 -5
- package/dist/core/sync-definitions.js.map +1 -1
- package/dist/core/validate-definition.d.ts +3 -3
- package/dist/core/validate-definition.d.ts.map +1 -1
- package/dist/core/validate-definition.js +17 -12
- package/dist/core/validate-definition.js.map +1 -1
- package/dist/core/workflow-model/cron-trigger.d.ts +1 -1
- package/dist/core/workflow-model/cron-trigger.d.ts.map +1 -1
- package/dist/core/workflow-model/cron-trigger.js +9 -5
- package/dist/core/workflow-model/cron-trigger.js.map +1 -1
- package/dist/core/workflow-model/index.d.ts +1 -1
- package/dist/core/workflow-model/index.d.ts.map +1 -1
- package/dist/core/workflow-model/index.js.map +1 -1
- package/dist/core/workflow-model/invalid-workflow-model-error.d.ts +4 -2
- package/dist/core/workflow-model/invalid-workflow-model-error.d.ts.map +1 -1
- package/dist/core/workflow-model/invalid-workflow-model-error.js.map +1 -1
- package/dist/core/workflow-model/normalize-job-listening.d.ts.map +1 -1
- package/dist/core/workflow-model/normalize-job-listening.js +51 -30
- package/dist/core/workflow-model/normalize-job-listening.js.map +1 -1
- package/dist/core/workflow-model/normalize-triggers.d.ts +1 -1
- package/dist/core/workflow-model/normalize-triggers.d.ts.map +1 -1
- package/dist/core/workflow-model/normalize-triggers.js +48 -18
- package/dist/core/workflow-model/normalize-triggers.js.map +1 -1
- package/dist/core/workflow-model/normalize-workflow-document.d.ts +1 -1
- package/dist/core/workflow-model/normalize-workflow-document.d.ts.map +1 -1
- package/dist/core/workflow-model/normalize-workflow-document.js +3 -3
- package/dist/core/workflow-model/normalize-workflow-document.js.map +1 -1
- package/dist/core/workflow-model/parse-interpolation-field.d.ts.map +1 -1
- package/dist/core/workflow-model/parse-interpolation-field.js +1 -15
- package/dist/core/workflow-model/parse-interpolation-field.js.map +1 -1
- package/dist/core/workflow-model/validate-predicate-expression.d.ts +3 -1
- package/dist/core/workflow-model/validate-predicate-expression.d.ts.map +1 -1
- package/dist/core/workflow-model/validate-predicate-expression.js +3 -0
- package/dist/core/workflow-model/validate-predicate-expression.js.map +1 -1
- package/dist/core/workflow-model/validation-issue.d.ts +2 -1
- package/dist/core/workflow-model/validation-issue.d.ts.map +1 -1
- package/dist/core/workflow-model/validation-issue.js +12 -15
- package/dist/core/workflow-model/validation-issue.js.map +1 -1
- package/dist/db/db.d.ts +196 -4
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +3 -1
- package/dist/db/db.js.map +1 -1
- package/dist/db/definition-triggers.js +3 -1
- package/dist/db/definition-triggers.js.map +1 -1
- package/dist/db/definitions.d.ts +17 -0
- package/dist/db/definitions.d.ts.map +1 -1
- package/dist/db/definitions.js +190 -23
- package/dist/db/definitions.js.map +1 -1
- package/dist/db/index.d.ts +2 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +2 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/schema/definitions.d.ts +17 -0
- package/dist/db/schema/definitions.d.ts.map +1 -1
- package/dist/db/schema/definitions.js +8 -0
- package/dist/db/schema/definitions.js.map +1 -1
- package/dist/db/schema/sync-states.d.ts +7 -3
- package/dist/db/schema/sync-states.d.ts.map +1 -1
- package/dist/db/schema/sync-states.js +5 -1
- package/dist/db/schema/sync-states.js.map +1 -1
- package/dist/db/schema/workflows.d.ts +78 -0
- package/dist/db/schema/workflows.d.ts.map +1 -0
- package/dist/db/schema/workflows.js +17 -0
- package/dist/db/schema/workflows.js.map +1 -0
- package/dist/db/sync-states.d.ts +2 -2
- package/dist/db/sync-states.d.ts.map +1 -1
- package/dist/db/sync-states.js +4 -4
- package/dist/db/sync-states.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +4 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +19 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/presentation/dto/definition.d.ts.map +1 -1
- package/dist/presentation/dto/definition.js +11 -4
- package/dist/presentation/dto/definition.js.map +1 -1
- package/dist/presentation/inter-module.d.ts +9 -1
- package/dist/presentation/inter-module.d.ts.map +1 -1
- package/dist/presentation/inter-module.js +66 -2
- package/dist/presentation/inter-module.js.map +1 -1
- package/dist/presentation/routes/create-definition.d.ts.map +1 -1
- package/dist/presentation/routes/create-definition.js +16 -3
- package/dist/presentation/routes/create-definition.js.map +1 -1
- package/dist/presentation/routes/get-definition.d.ts.map +1 -1
- package/dist/presentation/routes/get-definition.js +18 -4
- package/dist/presentation/routes/get-definition.js.map +1 -1
- package/dist/presentation/routes/project-access.d.ts +1 -0
- package/dist/presentation/routes/project-access.d.ts.map +1 -1
- package/dist/presentation/routes/validate-definition.js +3 -3
- package/dist/presentation/routes/validate-definition.js.map +1 -1
- package/dist/temporal/activities/sync-activities.d.ts +3 -3
- package/dist/temporal/activities/sync-activities.d.ts.map +1 -1
- package/dist/temporal/activities/sync-activities.js +7 -4
- package/dist/temporal/activities/sync-activities.js.map +1 -1
- package/dist/temporal/workflows/definition-sync.js +1 -1
- package/dist/temporal/workflows/definition-sync.js.map +1 -1
- package/dist/temporal/workflows/index.bundle.js +50 -22
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0003_nebulous_nemesis.sql +11 -0
- package/drizzle/0004_workflow_ref_lookup.sql +1 -0
- package/drizzle/meta/0003_snapshot.json +627 -0
- package/drizzle/meta/0004_snapshot.json +649 -0
- package/drizzle/meta/_journal.json +14 -0
- package/drizzle.config.ts +1 -0
- package/package.json +7 -7
- package/src/core/entities/index.ts +1 -1
- package/src/core/entities/integration-context.ts +4 -0
- package/src/core/entities/sync-state.test.ts +49 -0
- package/src/core/entities/sync-state.ts +35 -12
- package/src/core/entities/validation-diagnostic.ts +8 -0
- package/src/core/entities/workflow-definition.ts +2 -0
- package/src/core/errors.ts +26 -0
- package/src/core/index.ts +12 -0
- package/src/core/integrations.test.ts +38 -0
- package/src/core/integrations.ts +10 -1
- package/src/core/parse-definition-diagnostics.test.ts +47 -0
- package/src/core/parse-definition.test.ts +29 -5
- package/src/core/parse-definition.ts +7 -7
- package/src/core/resolve-definition-at-ref.test.ts +792 -0
- package/src/core/resolve-definition-at-ref.ts +551 -0
- package/src/core/sync-definitions.test.ts +61 -2
- package/src/core/sync-definitions.ts +7 -7
- package/src/core/validate-definition.test.ts +31 -22
- package/src/core/validate-definition.ts +21 -13
- package/src/core/workflow-model/cron-trigger.ts +6 -2
- package/src/core/workflow-model/index.ts +1 -0
- package/src/core/workflow-model/invalid-workflow-model-error.ts +5 -1
- package/src/core/workflow-model/normalize-job-listening.ts +55 -23
- package/src/core/workflow-model/normalize-triggers.ts +44 -15
- package/src/core/workflow-model/normalize-workflow-document.test.ts +444 -36
- package/src/core/workflow-model/normalize-workflow-document.ts +8 -4
- package/src/core/workflow-model/parse-interpolation-field.ts +1 -23
- package/src/core/workflow-model/validate-predicate-expression.ts +6 -0
- package/src/core/workflow-model/validation-issue.ts +8 -13
- package/src/db/db.ts +7 -1
- package/src/db/definition-triggers.test.ts +44 -0
- package/src/db/definition-triggers.ts +1 -1
- package/src/db/definitions.test.ts +300 -1
- package/src/db/definitions.ts +282 -28
- package/src/db/index.ts +2 -0
- package/src/db/schema/definitions.test.ts +1 -0
- package/src/db/schema/definitions.ts +11 -0
- package/src/db/schema/sync-states.ts +12 -3
- package/src/db/schema/workflows.ts +23 -0
- package/src/db/sync-states.test.ts +87 -18
- package/src/db/sync-states.ts +6 -6
- package/src/db/workflow-lineage-migration.test.ts +158 -0
- package/src/index.ts +3 -1
- package/src/metrics/index.ts +1 -0
- package/src/metrics/instance.test.ts +50 -0
- package/src/metrics/instance.ts +23 -0
- package/src/presentation/dto/definition.test.ts +89 -1
- package/src/presentation/dto/definition.ts +8 -5
- package/src/presentation/inter-module.test.ts +177 -0
- package/src/presentation/inter-module.ts +77 -4
- package/src/presentation/routes/create-definition.test.ts +38 -0
- package/src/presentation/routes/create-definition.ts +20 -3
- package/src/presentation/routes/get-definition.test.ts +125 -11
- package/src/presentation/routes/get-definition.ts +21 -4
- package/src/presentation/routes/list-definitions.test.ts +1 -1
- package/src/presentation/routes/validate-definition.test.ts +1 -1
- package/src/presentation/routes/validate-definition.ts +3 -3
- package/src/presentation/subscribers/on-integration-connection-available.test.ts +3 -0
- package/src/temporal/activities/sync-activities.test.ts +46 -2
- package/src/temporal/activities/sync-activities.ts +9 -7
- package/src/temporal/workflows/definition-sync.ts +1 -1
- package/test/factories/definition.ts +1 -0
- package/test/globalSetup.ts +2 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/core/entities/validation-warning.d.ts +0 -6
- package/dist/core/entities/validation-warning.d.ts.map +0 -1
- package/dist/core/entities/validation-warning.js +0 -3
- package/dist/core/entities/validation-warning.js.map +0 -1
- package/src/core/entities/validation-warning.ts +0 -5
- package/src/core/parse-definition-warnings.test.ts +0 -33
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/definitions.ts"],"sourcesContent":["import {\n DEFINITION_DELETED,\n DEFINITION_RESOLVED,\n type DefinitionsEventMap,\n} from '@shipfox/api-definitions-dto';\nimport {writeOutboxEvent} from '@shipfox/node-outbox';\nimport type {WorkflowDocument} from '@shipfox/workflow-document';\nimport {and, asc, eq, gt, isNull, notInArray, or, type SQL, sql} from 'drizzle-orm';\nimport type {\n WorkflowDefinition,\n WorkflowDefinitionPayload,\n WorkflowSourceSnapshot,\n} from '#core/entities/workflow-definition.js';\nimport type {WorkflowModel} from '#core/entities/workflow-model.js';\nimport {db} from './db.js';\nimport {definitionTriggersFor} from './definition-triggers.js';\nimport {toDefinition, workflowDefinitions} from './schema/definitions.js';\nimport {definitionsOutbox} from './schema/outbox.js';\n\ntype Tx = Parameters<Parameters<ReturnType<typeof db>['transaction']>[0]>[0];\n\nexport interface UpsertDefinitionParams {\n projectId: string;\n workspaceId: string;\n configPath?: string | null | undefined;\n source?: 'manual' | 'vcs' | undefined;\n name: string;\n document: WorkflowDocument;\n model: WorkflowModel;\n sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;\n contentHash?: string | null | undefined;\n sha?: string | undefined;\n ref?: string | undefined;\n}\n\nfunction buildUpsertQuery(tx: Tx, params: UpsertDefinitionParams) {\n const source = params.source ?? 'manual';\n if (source === 'vcs' && !params.configPath) {\n throw new Error('configPath is required for VCS definitions');\n }\n // Keep source aligned with the conflict arbiter (chosen by ref/sha presence):\n // vcs rows are versioned by ref/sha, manual rows have neither.\n const hasRefOrSha = params.ref != null || params.sha != null;\n if ((source === 'vcs') !== hasRefOrSha) {\n throw new Error(\n 'Definition source/ref/sha mismatch: vcs requires a ref or sha, manual requires neither',\n );\n }\n\n const definition: WorkflowDefinitionPayload = {\n document: params.document,\n model: params.model,\n sourceSnapshot: params.sourceSnapshot ?? null,\n };\n\n const set = {\n name: params.name,\n source,\n definition,\n contentHash: params.contentHash ?? null,\n fetchedAt: sql`now()`,\n updatedAt: sql`now()`,\n deletedAt: null,\n };\n\n const values = {\n projectId: params.projectId,\n configPath: params.configPath ?? null,\n source,\n sha: params.sha ?? null,\n ref: params.ref ?? null,\n name: params.name,\n definition,\n contentHash: params.contentHash ?? null,\n };\n\n if (params.sha) {\n return tx\n .insert(workflowDefinitions)\n .values(values)\n .onConflictDoUpdate({\n target: [\n workflowDefinitions.projectId,\n workflowDefinitions.sha,\n workflowDefinitions.configPath,\n ],\n targetWhere: sql`\"sha\" IS NOT NULL`,\n set,\n })\n .returning();\n }\n\n if (params.ref) {\n return tx\n .insert(workflowDefinitions)\n .values(values)\n .onConflictDoUpdate({\n target: [\n workflowDefinitions.projectId,\n workflowDefinitions.ref,\n workflowDefinitions.configPath,\n ],\n targetWhere: sql`\"ref\" IS NOT NULL`,\n set,\n })\n .returning();\n }\n\n return tx\n .insert(workflowDefinitions)\n .values(values)\n .onConflictDoUpdate({\n target: [workflowDefinitions.projectId, workflowDefinitions.configPath],\n targetWhere: sql`\"config_path\" IS NOT NULL AND \"ref\" IS NULL AND \"sha\" IS NULL`,\n set,\n })\n .returning();\n}\n\nexport async function upsertDefinition(\n params: UpsertDefinitionParams,\n): Promise<WorkflowDefinition> {\n return await db().transaction(async (tx) => {\n const rows = await buildUpsertQuery(tx, params);\n const row = rows[0];\n if (!row) throw new Error('Upsert returned no rows');\n\n await writeOutboxEvent<DefinitionsEventMap>(tx, definitionsOutbox, {\n type: DEFINITION_RESOLVED,\n payload: {\n definitionId: row.id,\n projectId: row.projectId,\n workspaceId: params.workspaceId,\n configPath: row.configPath,\n triggers: definitionTriggersFor(row.definition.model),\n },\n });\n\n return toDefinition(row);\n });\n}\n\nexport async function getDefinitionById(id: string): Promise<WorkflowDefinition | undefined> {\n const rows = await db()\n .select()\n .from(workflowDefinitions)\n .where(and(eq(workflowDefinitions.id, id), isNull(workflowDefinitions.deletedAt)))\n .limit(1);\n const row = rows[0];\n\n if (!row) return undefined;\n return toDefinition(row);\n}\n\nexport interface DefinitionCursor {\n value: string;\n id: string;\n}\n\nexport interface ListDefinitionsParams {\n projectId: string;\n limit: number;\n cursor?: DefinitionCursor | undefined;\n}\n\nexport interface ListDefinitionsResult {\n definitions: WorkflowDefinition[];\n nextCursor: DefinitionCursor | null;\n}\n\nfunction cursorWhere(cursor: DefinitionCursor | undefined): SQL | undefined {\n if (!cursor) return undefined;\n return or(\n gt(workflowDefinitions.name, cursor.value),\n and(eq(workflowDefinitions.name, cursor.value), gt(workflowDefinitions.id, cursor.id)),\n );\n}\n\nexport async function listDefinitions(\n params: ListDefinitionsParams,\n): Promise<ListDefinitionsResult> {\n const conditions = [\n eq(workflowDefinitions.projectId, params.projectId),\n isNull(workflowDefinitions.deletedAt),\n ];\n const cursorCondition = cursorWhere(params.cursor);\n if (cursorCondition) conditions.push(cursorCondition);\n\n const rows = await db()\n .select()\n .from(workflowDefinitions)\n .where(and(...conditions))\n .orderBy(asc(workflowDefinitions.name), asc(workflowDefinitions.id))\n .limit(params.limit + 1);\n\n const hasMore = rows.length > params.limit;\n const pageRows = hasMore ? rows.slice(0, params.limit) : rows;\n const last = pageRows.at(-1);\n\n return {\n definitions: pageRows.map(toDefinition),\n nextCursor: hasMore && last ? {value: last.name, id: last.id} : null,\n };\n}\n\nexport async function listDefinitionsByProject(projectId: string): Promise<WorkflowDefinition[]> {\n const result = await listDefinitions({projectId, limit: 100});\n return result.definitions;\n}\n\nexport interface SoftDeleteVcsDefinitionsParams {\n projectId: string;\n workspaceId: string;\n ref: string;\n keepConfigPaths: string[];\n}\n\nasync function softDeleteVcsDefinitionsNotInTx(\n tx: Tx,\n params: SoftDeleteVcsDefinitionsParams,\n): Promise<number> {\n const now = sql`now()`;\n const baseWhere = and(\n eq(workflowDefinitions.projectId, params.projectId),\n eq(workflowDefinitions.source, 'vcs'),\n eq(workflowDefinitions.ref, params.ref),\n isNull(workflowDefinitions.deletedAt),\n );\n const where =\n params.keepConfigPaths.length > 0\n ? and(baseWhere, notInArray(workflowDefinitions.configPath, params.keepConfigPaths))\n : baseWhere;\n\n const rows = await tx\n .update(workflowDefinitions)\n .set({deletedAt: now, updatedAt: now})\n .where(where)\n .returning({id: workflowDefinitions.id});\n\n for (const row of rows) {\n await writeOutboxEvent<DefinitionsEventMap>(tx, definitionsOutbox, {\n type: DEFINITION_DELETED,\n payload: {\n definitionId: row.id,\n projectId: params.projectId,\n workspaceId: params.workspaceId,\n },\n });\n }\n\n return rows.length;\n}\n\nexport async function softDeleteVcsDefinitionsNotIn(\n params: SoftDeleteVcsDefinitionsParams,\n): Promise<number> {\n return await db().transaction((tx) => softDeleteVcsDefinitionsNotInTx(tx, params));\n}\n\nexport interface ApplyVcsDefinitionsBatchParams {\n projectId: string;\n workspaceId: string;\n ref: string;\n upserts: Array<{\n configPath: string;\n name: string;\n document: WorkflowDocument;\n model: WorkflowModel;\n sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;\n contentHash: string;\n }>;\n}\n\nexport interface ApplyVcsDefinitionsBatchResult {\n appliedCount: number;\n deletedCount: number;\n}\n\nexport async function applyVcsDefinitionsBatch(\n params: ApplyVcsDefinitionsBatchParams,\n): Promise<ApplyVcsDefinitionsBatchResult> {\n return await db().transaction(async (tx) => {\n let appliedCount = 0;\n for (const item of params.upserts) {\n const existing = await tx\n .select({\n contentHash: workflowDefinitions.contentHash,\n deletedAt: workflowDefinitions.deletedAt,\n })\n .from(workflowDefinitions)\n .where(\n and(\n eq(workflowDefinitions.projectId, params.projectId),\n eq(workflowDefinitions.ref, params.ref),\n eq(workflowDefinitions.configPath, item.configPath),\n ),\n )\n .limit(1);\n\n const previous = existing[0];\n const unchanged =\n previous !== undefined &&\n previous.deletedAt === null &&\n previous.contentHash === item.contentHash;\n\n const rows = await buildUpsertQuery(tx, {\n projectId: params.projectId,\n workspaceId: params.workspaceId,\n configPath: item.configPath,\n source: 'vcs',\n ref: params.ref,\n name: item.name,\n document: item.document,\n model: item.model,\n sourceSnapshot: item.sourceSnapshot ?? null,\n contentHash: item.contentHash,\n });\n const row = rows[0];\n if (!row) throw new Error('Upsert returned no rows');\n\n if (!unchanged) {\n await writeOutboxEvent<DefinitionsEventMap>(tx, definitionsOutbox, {\n type: DEFINITION_RESOLVED,\n payload: {\n definitionId: row.id,\n projectId: row.projectId,\n workspaceId: params.workspaceId,\n configPath: row.configPath,\n triggers: definitionTriggersFor(row.definition.model),\n },\n });\n appliedCount += 1;\n }\n }\n\n const keepConfigPaths = params.upserts.map((upsert) => upsert.configPath);\n const deletedCount = await softDeleteVcsDefinitionsNotInTx(tx, {\n projectId: params.projectId,\n workspaceId: params.workspaceId,\n ref: params.ref,\n keepConfigPaths,\n });\n\n return {appliedCount, deletedCount};\n });\n}\n\nexport async function invalidateCache(params: {projectId: string; ref: string}): Promise<void> {\n await db()\n .delete(workflowDefinitions)\n .where(\n and(\n eq(workflowDefinitions.projectId, params.projectId),\n eq(workflowDefinitions.ref, params.ref),\n ),\n );\n}\n"],"names":["DEFINITION_DELETED","DEFINITION_RESOLVED","writeOutboxEvent","and","asc","eq","gt","isNull","notInArray","or","sql","db","definitionTriggersFor","toDefinition","workflowDefinitions","definitionsOutbox","buildUpsertQuery","tx","params","source","configPath","Error","hasRefOrSha","ref","sha","definition","document","model","sourceSnapshot","set","name","contentHash","fetchedAt","updatedAt","deletedAt","values","projectId","insert","onConflictDoUpdate","target","targetWhere","returning","upsertDefinition","transaction","rows","row","type","payload","definitionId","id","workspaceId","triggers","getDefinitionById","select","from","where","limit","undefined","cursorWhere","cursor","value","listDefinitions","conditions","cursorCondition","push","orderBy","hasMore","length","pageRows","slice","last","at","definitions","map","nextCursor","listDefinitionsByProject","result","softDeleteVcsDefinitionsNotInTx","now","baseWhere","keepConfigPaths","update","softDeleteVcsDefinitionsNotIn","applyVcsDefinitionsBatch","appliedCount","item","upserts","existing","previous","unchanged","upsert","deletedCount","invalidateCache","delete"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/db/definitions.ts"],"sourcesContent":["import {\n DEFINITION_DELETED,\n DEFINITION_RESOLVED,\n type DefinitionsEventMap,\n} from '@shipfox/api-definitions-dto';\nimport {writeOutboxEvent} from '@shipfox/node-outbox';\nimport type {WorkflowDocument} from '@shipfox/workflow-document';\nimport {\n and,\n asc,\n eq,\n gt,\n inArray,\n isNotNull,\n isNull,\n notInArray,\n or,\n type SQL,\n sql,\n} from 'drizzle-orm';\nimport type {\n WorkflowDefinition,\n WorkflowDefinitionPayload,\n WorkflowSourceSnapshot,\n} from '#core/entities/workflow-definition.js';\nimport type {WorkflowModel} from '#core/entities/workflow-model.js';\nimport {db} from './db.js';\nimport {definitionTriggersFor} from './definition-triggers.js';\nimport {type DefinitionDb, toDefinition, workflowDefinitions} from './schema/definitions.js';\nimport {definitionsOutbox} from './schema/outbox.js';\nimport {workflowWorkflows} from './schema/workflows.js';\n\ntype Tx = Parameters<Parameters<ReturnType<typeof db>['transaction']>[0]>[0];\n\nexport interface UpsertDefinitionParams {\n projectId: string;\n workspaceId: string;\n configPath?: string | null | undefined;\n source?: 'manual' | 'vcs' | undefined;\n name: string;\n document: WorkflowDocument;\n model: WorkflowModel;\n sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;\n contentHash?: string | null | undefined;\n sha?: string | undefined;\n ref?: string | undefined;\n}\n\n/**\n * Finds or creates the workflow lineage for (projectId, configPath) and returns\n * its id. Pathless manual definitions share a project-scoped lineage because\n * their request has no more specific stable key.\n */\nasync function findOrCreateWorkflow(\n tx: Tx,\n params: {projectId: string; configPath: string | null},\n): Promise<string> {\n if (params.configPath === null) {\n // Serialize the first pathless definition for a project so concurrent saves\n // cannot create multiple project-scoped lineages.\n await tx.execute(sql`SELECT pg_advisory_xact_lock(hashtextextended(${params.projectId}, 0))`);\n const existing = await tx\n .select({workflowId: workflowDefinitions.workflowId})\n .from(workflowDefinitions)\n .where(\n and(\n eq(workflowDefinitions.projectId, params.projectId),\n isNull(workflowDefinitions.configPath),\n eq(workflowDefinitions.source, 'manual'),\n isNotNull(workflowDefinitions.workflowId),\n ),\n )\n .orderBy(asc(workflowDefinitions.createdAt), asc(workflowDefinitions.id))\n .limit(1);\n const existingRow = existing[0];\n if (existingRow?.workflowId) return existingRow.workflowId;\n\n const inserted = await tx\n .insert(workflowWorkflows)\n .values({projectId: params.projectId, configPath: null})\n .onConflictDoNothing()\n .returning({id: workflowWorkflows.id});\n const insertedRow = inserted[0];\n if (insertedRow) return insertedRow.id;\n\n const existingLineage = await tx\n .select({id: workflowWorkflows.id})\n .from(workflowWorkflows)\n .where(\n and(\n eq(workflowWorkflows.projectId, params.projectId),\n isNull(workflowWorkflows.configPath),\n ),\n )\n .limit(1);\n const existingLineageRow = existingLineage[0];\n if (!existingLineageRow) {\n throw new Error(`Pathless workflow lineage missing for project ${params.projectId}`);\n }\n return existingLineageRow.id;\n }\n\n const inserted = await tx\n .insert(workflowWorkflows)\n .values({projectId: params.projectId, configPath: params.configPath})\n .onConflictDoNothing()\n .returning({id: workflowWorkflows.id});\n const insertedRow = inserted[0];\n if (insertedRow) return insertedRow.id;\n\n const existing = await tx\n .select({id: workflowWorkflows.id})\n .from(workflowWorkflows)\n .where(\n and(\n eq(workflowWorkflows.projectId, params.projectId),\n eq(workflowWorkflows.configPath, params.configPath),\n ),\n )\n .limit(1);\n const existingRow = existing[0];\n if (!existingRow) {\n throw new Error(\n `Workflow lineage upsert returned no row for project ${params.projectId} and config path ${params.configPath}`,\n );\n }\n return existingRow.id;\n}\n\nasync function findOrCreateWorkflows(\n tx: Tx,\n params: {projectId: string; configPaths: string[]},\n): Promise<Map<string, string>> {\n const configPaths = [...new Set(params.configPaths)].sort((left, right) =>\n left < right ? -1 : left > right ? 1 : 0,\n );\n if (configPaths.length === 0) return new Map();\n\n await tx\n .insert(workflowWorkflows)\n .values(configPaths.map((configPath) => ({projectId: params.projectId, configPath})))\n .onConflictDoNothing();\n\n const rows = await tx\n .select({id: workflowWorkflows.id, configPath: workflowWorkflows.configPath})\n .from(workflowWorkflows)\n .where(\n and(\n eq(workflowWorkflows.projectId, params.projectId),\n inArray(workflowWorkflows.configPath, configPaths),\n ),\n );\n const workflowIds = new Map<string, string>();\n for (const row of rows) {\n if (row.configPath !== null) workflowIds.set(row.configPath, row.id);\n }\n for (const configPath of configPaths) {\n if (!workflowIds.has(configPath)) {\n throw new Error(\n `Workflow lineage upsert returned no row for project ${params.projectId} and config path ${configPath}`,\n );\n }\n }\n return workflowIds;\n}\n\nasync function ensureWorkflowId(\n tx: Tx,\n row: Pick<DefinitionDb, 'id' | 'projectId' | 'configPath' | 'workflowId'>,\n): Promise<string> {\n if (row.workflowId !== null) return row.workflowId;\n\n const workflowId = await findOrCreateWorkflow(tx, {\n projectId: row.projectId,\n configPath: row.configPath,\n });\n const updated = await tx\n .update(workflowDefinitions)\n .set({workflowId})\n .where(and(eq(workflowDefinitions.id, row.id), isNull(workflowDefinitions.workflowId)))\n .returning({workflowId: workflowDefinitions.workflowId});\n const updatedRow = updated[0];\n if (updatedRow?.workflowId) return updatedRow.workflowId;\n\n const current = await tx\n .select({workflowId: workflowDefinitions.workflowId})\n .from(workflowDefinitions)\n .where(eq(workflowDefinitions.id, row.id))\n .limit(1);\n const currentRow = current[0];\n if (!currentRow?.workflowId) {\n throw new Error(`Definition ${row.id} still has no workflow lineage after reconciliation`);\n }\n return currentRow.workflowId;\n}\n\nfunction buildUpsertQuery(tx: Tx, params: UpsertDefinitionParams & {workflowId: string}) {\n const source = params.source ?? 'manual';\n if (source === 'vcs' && !params.configPath) {\n throw new Error('configPath is required for VCS definitions');\n }\n // Keep source aligned with the conflict arbiter (chosen by ref/sha presence):\n // vcs rows are versioned by ref/sha, manual rows have neither.\n const hasRefOrSha = params.ref != null || params.sha != null;\n if ((source === 'vcs') !== hasRefOrSha) {\n throw new Error(\n 'Definition source/ref/sha mismatch: vcs requires a ref or sha, manual requires neither',\n );\n }\n\n const definition: WorkflowDefinitionPayload = {\n document: params.document,\n model: params.model,\n sourceSnapshot: params.sourceSnapshot ?? null,\n };\n\n const set = {\n workflowId: params.workflowId,\n name: params.name,\n source,\n definition,\n contentHash: params.contentHash ?? null,\n fetchedAt: sql`now()`,\n updatedAt: sql`now()`,\n deletedAt: null,\n };\n\n const values = {\n projectId: params.projectId,\n workflowId: params.workflowId,\n configPath: params.configPath ?? null,\n source,\n sha: params.sha ?? null,\n ref: params.ref ?? null,\n name: params.name,\n definition,\n contentHash: params.contentHash ?? null,\n };\n\n if (params.sha) {\n return tx\n .insert(workflowDefinitions)\n .values(values)\n .onConflictDoUpdate({\n target: [\n workflowDefinitions.projectId,\n workflowDefinitions.sha,\n workflowDefinitions.configPath,\n ],\n targetWhere: sql`\"sha\" IS NOT NULL`,\n set,\n })\n .returning();\n }\n\n if (params.ref) {\n return tx\n .insert(workflowDefinitions)\n .values(values)\n .onConflictDoUpdate({\n target: [\n workflowDefinitions.projectId,\n workflowDefinitions.ref,\n workflowDefinitions.configPath,\n ],\n targetWhere: sql`\"ref\" IS NOT NULL`,\n set,\n })\n .returning();\n }\n\n return tx\n .insert(workflowDefinitions)\n .values(values)\n .onConflictDoUpdate({\n target: [workflowDefinitions.projectId, workflowDefinitions.configPath],\n targetWhere: sql`\"config_path\" IS NOT NULL AND \"ref\" IS NULL AND \"sha\" IS NULL`,\n set,\n })\n .returning();\n}\n\nexport async function upsertDefinition(\n params: UpsertDefinitionParams,\n): Promise<WorkflowDefinition> {\n return await db().transaction(async (tx) => {\n const workflowId = await findOrCreateWorkflow(tx, {\n projectId: params.projectId,\n configPath: params.configPath ?? null,\n });\n const rows = await buildUpsertQuery(tx, {...params, workflowId});\n const row = rows[0];\n if (!row) throw new Error('Upsert returned no rows');\n\n await writeOutboxEvent<DefinitionsEventMap>(tx, definitionsOutbox, {\n type: DEFINITION_RESOLVED,\n payload: {\n definitionId: row.id,\n projectId: row.projectId,\n workspaceId: params.workspaceId,\n configPath: row.configPath,\n triggers: definitionTriggersFor(row.definition.model),\n },\n });\n\n return toDefinition(row);\n });\n}\n\n/**\n * Finds or creates the workflow lineage for (projectId, configPath) outside a\n * sync. A dev definition uses the lineage for run numbering without ever\n * persisting a definition row or publishing a resolution event.\n */\nexport async function findOrCreateWorkflowLineage(params: {\n projectId: string;\n configPath: string;\n}): Promise<string> {\n return await db().transaction(async (tx) => {\n return await findOrCreateWorkflow(tx, params);\n });\n}\n\nexport async function getDefinitionById(id: string): Promise<WorkflowDefinition | undefined> {\n return await db().transaction(async (tx) => {\n const rows = await tx\n .select()\n .from(workflowDefinitions)\n .where(and(eq(workflowDefinitions.id, id), isNull(workflowDefinitions.deletedAt)))\n .limit(1);\n const row = rows[0];\n\n if (row) {\n const workflowId = await ensureWorkflowId(tx, row);\n return toDefinition({...row, workflowId});\n }\n\n return undefined;\n });\n}\n\nexport async function getWorkflowLineageById(\n id: string,\n): Promise<{id: string; projectId: string} | undefined> {\n const rows = await db()\n .select({id: workflowWorkflows.id, projectId: workflowWorkflows.projectId})\n .from(workflowWorkflows)\n .where(eq(workflowWorkflows.id, id))\n .limit(1);\n\n return rows[0];\n}\n\nexport async function getDefinitionByWorkflowId(params: {\n workflowId: string;\n ref: string;\n}): Promise<WorkflowDefinition | undefined> {\n const rows = await db()\n .select()\n .from(workflowDefinitions)\n .where(\n and(\n eq(workflowDefinitions.workflowId, params.workflowId),\n eq(workflowDefinitions.ref, params.ref),\n isNull(workflowDefinitions.deletedAt),\n ),\n )\n .limit(1);\n const row = rows[0];\n\n return row ? toDefinition({...row, workflowId: params.workflowId}) : undefined;\n}\n\nexport interface DefinitionCursor {\n value: string;\n id: string;\n}\n\nexport interface ListDefinitionsParams {\n projectId: string;\n limit: number;\n cursor?: DefinitionCursor | undefined;\n}\n\nexport interface ListDefinitionsResult {\n definitions: WorkflowDefinition[];\n nextCursor: DefinitionCursor | null;\n}\n\nfunction cursorWhere(cursor: DefinitionCursor | undefined): SQL | undefined {\n if (!cursor) return undefined;\n return or(\n gt(workflowDefinitions.name, cursor.value),\n and(eq(workflowDefinitions.name, cursor.value), gt(workflowDefinitions.id, cursor.id)),\n );\n}\n\nexport async function listDefinitions(\n params: ListDefinitionsParams,\n): Promise<ListDefinitionsResult> {\n return await db().transaction(async (tx) => {\n const conditions = [\n eq(workflowDefinitions.projectId, params.projectId),\n isNull(workflowDefinitions.deletedAt),\n ];\n const cursorCondition = cursorWhere(params.cursor);\n if (cursorCondition) conditions.push(cursorCondition);\n\n const rows = await tx\n .select()\n .from(workflowDefinitions)\n .where(and(...conditions))\n .orderBy(asc(workflowDefinitions.name), asc(workflowDefinitions.id))\n .limit(params.limit + 1);\n\n const hasMore = rows.length > params.limit;\n const pageRows = hasMore ? rows.slice(0, params.limit) : rows;\n const last = pageRows.at(-1);\n const definitions: WorkflowDefinition[] = [];\n for (const row of pageRows) {\n const workflowId = await ensureWorkflowId(tx, row);\n definitions.push(toDefinition({...row, workflowId}));\n }\n\n return {\n definitions,\n nextCursor: hasMore && last ? {value: last.name, id: last.id} : null,\n };\n });\n}\n\nexport async function listDefinitionsByProject(projectId: string): Promise<WorkflowDefinition[]> {\n const result = await listDefinitions({projectId, limit: 100});\n return result.definitions;\n}\n\nexport interface SoftDeleteVcsDefinitionsParams {\n projectId: string;\n workspaceId: string;\n ref: string;\n keepConfigPaths: string[];\n}\n\nasync function softDeleteVcsDefinitionsNotInTx(\n tx: Tx,\n params: SoftDeleteVcsDefinitionsParams,\n): Promise<number> {\n const now = sql`now()`;\n const baseWhere = and(\n eq(workflowDefinitions.projectId, params.projectId),\n eq(workflowDefinitions.source, 'vcs'),\n eq(workflowDefinitions.ref, params.ref),\n isNull(workflowDefinitions.deletedAt),\n );\n const where =\n params.keepConfigPaths.length > 0\n ? and(baseWhere, notInArray(workflowDefinitions.configPath, params.keepConfigPaths))\n : baseWhere;\n\n const rows = await tx\n .update(workflowDefinitions)\n .set({deletedAt: now, updatedAt: now})\n .where(where)\n .returning({id: workflowDefinitions.id});\n\n for (const row of rows) {\n await writeOutboxEvent<DefinitionsEventMap>(tx, definitionsOutbox, {\n type: DEFINITION_DELETED,\n payload: {\n definitionId: row.id,\n projectId: params.projectId,\n workspaceId: params.workspaceId,\n },\n });\n }\n\n return rows.length;\n}\n\nexport async function softDeleteVcsDefinitionsNotIn(\n params: SoftDeleteVcsDefinitionsParams,\n): Promise<number> {\n return await db().transaction((tx) => softDeleteVcsDefinitionsNotInTx(tx, params));\n}\n\nexport interface ApplyVcsDefinitionsBatchParams {\n projectId: string;\n workspaceId: string;\n ref: string;\n upserts: Array<{\n configPath: string;\n name: string;\n document: WorkflowDocument;\n model: WorkflowModel;\n sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;\n contentHash: string;\n }>;\n}\n\nexport interface ApplyVcsDefinitionsBatchResult {\n appliedCount: number;\n deletedCount: number;\n}\n\nexport async function applyVcsDefinitionsBatch(\n params: ApplyVcsDefinitionsBatchParams,\n): Promise<ApplyVcsDefinitionsBatchResult> {\n return await db().transaction(async (tx) => {\n let appliedCount = 0;\n const prepared: Array<{\n item: (typeof params.upserts)[number];\n unchanged: boolean;\n workflowId: string | null | undefined;\n }> = [];\n for (const item of params.upserts) {\n const existing = await tx\n .select({\n contentHash: workflowDefinitions.contentHash,\n deletedAt: workflowDefinitions.deletedAt,\n workflowId: workflowDefinitions.workflowId,\n })\n .from(workflowDefinitions)\n .where(\n and(\n eq(workflowDefinitions.projectId, params.projectId),\n eq(workflowDefinitions.ref, params.ref),\n eq(workflowDefinitions.configPath, item.configPath),\n ),\n )\n .limit(1);\n\n const previous = existing[0];\n const unchanged =\n previous !== undefined &&\n previous.deletedAt === null &&\n previous.contentHash === item.contentHash;\n\n prepared.push({item, unchanged, workflowId: previous?.workflowId});\n }\n\n const workflowIds = await findOrCreateWorkflows(tx, {\n projectId: params.projectId,\n configPaths: prepared.filter(({unchanged}) => !unchanged).map(({item}) => item.configPath),\n });\n\n for (const {item, unchanged, workflowId: previousWorkflowId} of prepared) {\n const workflowId = unchanged\n ? (previousWorkflowId ??\n (await findOrCreateWorkflow(tx, {\n projectId: params.projectId,\n configPath: item.configPath,\n })))\n : workflowIds.get(item.configPath);\n if (!workflowId) {\n throw new Error(\n `Workflow lineage missing for project ${params.projectId} and config path ${item.configPath}`,\n );\n }\n const rows = await buildUpsertQuery(tx, {\n projectId: params.projectId,\n workspaceId: params.workspaceId,\n workflowId,\n configPath: item.configPath,\n source: 'vcs',\n ref: params.ref,\n name: item.name,\n document: item.document,\n model: item.model,\n sourceSnapshot: item.sourceSnapshot ?? null,\n contentHash: item.contentHash,\n });\n const row = rows[0];\n if (!row) throw new Error('Upsert returned no rows');\n\n if (!unchanged) {\n await writeOutboxEvent<DefinitionsEventMap>(tx, definitionsOutbox, {\n type: DEFINITION_RESOLVED,\n payload: {\n definitionId: row.id,\n projectId: row.projectId,\n workspaceId: params.workspaceId,\n configPath: row.configPath,\n triggers: definitionTriggersFor(row.definition.model),\n },\n });\n appliedCount += 1;\n }\n }\n\n const keepConfigPaths = params.upserts.map((upsert) => upsert.configPath);\n const deletedCount = await softDeleteVcsDefinitionsNotInTx(tx, {\n projectId: params.projectId,\n workspaceId: params.workspaceId,\n ref: params.ref,\n keepConfigPaths,\n });\n\n return {appliedCount, deletedCount};\n });\n}\n\nexport async function invalidateCache(params: {projectId: string; ref: string}): Promise<void> {\n await db()\n .delete(workflowDefinitions)\n .where(\n and(\n eq(workflowDefinitions.projectId, params.projectId),\n eq(workflowDefinitions.ref, params.ref),\n ),\n );\n}\n"],"names":["DEFINITION_DELETED","DEFINITION_RESOLVED","writeOutboxEvent","and","asc","eq","gt","inArray","isNotNull","isNull","notInArray","or","sql","db","definitionTriggersFor","toDefinition","workflowDefinitions","definitionsOutbox","workflowWorkflows","findOrCreateWorkflow","tx","params","configPath","execute","projectId","existing","select","workflowId","from","where","source","orderBy","createdAt","id","limit","existingRow","inserted","insert","values","onConflictDoNothing","returning","insertedRow","existingLineage","existingLineageRow","Error","findOrCreateWorkflows","configPaths","Set","sort","left","right","length","Map","map","rows","workflowIds","row","set","has","ensureWorkflowId","updated","update","updatedRow","current","currentRow","buildUpsertQuery","hasRefOrSha","ref","sha","definition","document","model","sourceSnapshot","name","contentHash","fetchedAt","updatedAt","deletedAt","onConflictDoUpdate","target","targetWhere","upsertDefinition","transaction","type","payload","definitionId","workspaceId","triggers","findOrCreateWorkflowLineage","getDefinitionById","undefined","getWorkflowLineageById","getDefinitionByWorkflowId","cursorWhere","cursor","value","listDefinitions","conditions","cursorCondition","push","hasMore","pageRows","slice","last","at","definitions","nextCursor","listDefinitionsByProject","result","softDeleteVcsDefinitionsNotInTx","now","baseWhere","keepConfigPaths","softDeleteVcsDefinitionsNotIn","applyVcsDefinitionsBatch","appliedCount","prepared","item","upserts","previous","unchanged","filter","previousWorkflowId","get","upsert","deletedCount","invalidateCache","delete"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,mBAAmB,QAEd,+BAA+B;AACtC,SAAQC,gBAAgB,QAAO,uBAAuB;AAEtD,SACEC,GAAG,EACHC,GAAG,EACHC,EAAE,EACFC,EAAE,EACFC,OAAO,EACPC,SAAS,EACTC,MAAM,EACNC,UAAU,EACVC,EAAE,EAEFC,GAAG,QACE,cAAc;AAOrB,SAAQC,EAAE,QAAO,UAAU;AAC3B,SAAQC,qBAAqB,QAAO,2BAA2B;AAC/D,SAA2BC,YAAY,EAAEC,mBAAmB,QAAO,0BAA0B;AAC7F,SAAQC,iBAAiB,QAAO,qBAAqB;AACrD,SAAQC,iBAAiB,QAAO,wBAAwB;AAkBxD;;;;CAIC,GACD,eAAeC,qBACbC,EAAM,EACNC,MAAsD;IAEtD,IAAIA,OAAOC,UAAU,KAAK,MAAM;QAC9B,4EAA4E;QAC5E,kDAAkD;QAClD,MAAMF,GAAGG,OAAO,CAACX,GAAG,CAAC,8CAA8C,EAAES,OAAOG,SAAS,CAAC,KAAK,CAAC;QAC5F,MAAMC,WAAW,MAAML,GACpBM,MAAM,CAAC;YAACC,YAAYX,oBAAoBW,UAAU;QAAA,GAClDC,IAAI,CAACZ,qBACLa,KAAK,CACJ1B,IACEE,GAAGW,oBAAoBQ,SAAS,EAAEH,OAAOG,SAAS,GAClDf,OAAOO,oBAAoBM,UAAU,GACrCjB,GAAGW,oBAAoBc,MAAM,EAAE,WAC/BtB,UAAUQ,oBAAoBW,UAAU,IAG3CI,OAAO,CAAC3B,IAAIY,oBAAoBgB,SAAS,GAAG5B,IAAIY,oBAAoBiB,EAAE,GACtEC,KAAK,CAAC;QACT,MAAMC,cAAcV,QAAQ,CAAC,EAAE;QAC/B,IAAIU,aAAaR,YAAY,OAAOQ,YAAYR,UAAU;QAE1D,MAAMS,WAAW,MAAMhB,GACpBiB,MAAM,CAACnB,mBACPoB,MAAM,CAAC;YAACd,WAAWH,OAAOG,SAAS;YAAEF,YAAY;QAAI,GACrDiB,mBAAmB,GACnBC,SAAS,CAAC;YAACP,IAAIf,kBAAkBe,EAAE;QAAA;QACtC,MAAMQ,cAAcL,QAAQ,CAAC,EAAE;QAC/B,IAAIK,aAAa,OAAOA,YAAYR,EAAE;QAEtC,MAAMS,kBAAkB,MAAMtB,GAC3BM,MAAM,CAAC;YAACO,IAAIf,kBAAkBe,EAAE;QAAA,GAChCL,IAAI,CAACV,mBACLW,KAAK,CACJ1B,IACEE,GAAGa,kBAAkBM,SAAS,EAAEH,OAAOG,SAAS,GAChDf,OAAOS,kBAAkBI,UAAU,IAGtCY,KAAK,CAAC;QACT,MAAMS,qBAAqBD,eAAe,CAAC,EAAE;QAC7C,IAAI,CAACC,oBAAoB;YACvB,MAAM,IAAIC,MAAM,CAAC,8CAA8C,EAAEvB,OAAOG,SAAS,EAAE;QACrF;QACA,OAAOmB,mBAAmBV,EAAE;IAC9B;IAEA,MAAMG,WAAW,MAAMhB,GACpBiB,MAAM,CAACnB,mBACPoB,MAAM,CAAC;QAACd,WAAWH,OAAOG,SAAS;QAAEF,YAAYD,OAAOC,UAAU;IAAA,GAClEiB,mBAAmB,GACnBC,SAAS,CAAC;QAACP,IAAIf,kBAAkBe,EAAE;IAAA;IACtC,MAAMQ,cAAcL,QAAQ,CAAC,EAAE;IAC/B,IAAIK,aAAa,OAAOA,YAAYR,EAAE;IAEtC,MAAMR,WAAW,MAAML,GACpBM,MAAM,CAAC;QAACO,IAAIf,kBAAkBe,EAAE;IAAA,GAChCL,IAAI,CAACV,mBACLW,KAAK,CACJ1B,IACEE,GAAGa,kBAAkBM,SAAS,EAAEH,OAAOG,SAAS,GAChDnB,GAAGa,kBAAkBI,UAAU,EAAED,OAAOC,UAAU,IAGrDY,KAAK,CAAC;IACT,MAAMC,cAAcV,QAAQ,CAAC,EAAE;IAC/B,IAAI,CAACU,aAAa;QAChB,MAAM,IAAIS,MACR,CAAC,oDAAoD,EAAEvB,OAAOG,SAAS,CAAC,iBAAiB,EAAEH,OAAOC,UAAU,EAAE;IAElH;IACA,OAAOa,YAAYF,EAAE;AACvB;AAEA,eAAeY,sBACbzB,EAAM,EACNC,MAAkD;IAElD,MAAMyB,cAAc;WAAI,IAAIC,IAAI1B,OAAOyB,WAAW;KAAE,CAACE,IAAI,CAAC,CAACC,MAAMC,QAC/DD,OAAOC,QAAQ,CAAC,IAAID,OAAOC,QAAQ,IAAI;IAEzC,IAAIJ,YAAYK,MAAM,KAAK,GAAG,OAAO,IAAIC;IAEzC,MAAMhC,GACHiB,MAAM,CAACnB,mBACPoB,MAAM,CAACQ,YAAYO,GAAG,CAAC,CAAC/B,aAAgB,CAAA;YAACE,WAAWH,OAAOG,SAAS;YAAEF;QAAU,CAAA,IAChFiB,mBAAmB;IAEtB,MAAMe,OAAO,MAAMlC,GAChBM,MAAM,CAAC;QAACO,IAAIf,kBAAkBe,EAAE;QAAEX,YAAYJ,kBAAkBI,UAAU;IAAA,GAC1EM,IAAI,CAACV,mBACLW,KAAK,CACJ1B,IACEE,GAAGa,kBAAkBM,SAAS,EAAEH,OAAOG,SAAS,GAChDjB,QAAQW,kBAAkBI,UAAU,EAAEwB;IAG5C,MAAMS,cAAc,IAAIH;IACxB,KAAK,MAAMI,OAAOF,KAAM;QACtB,IAAIE,IAAIlC,UAAU,KAAK,MAAMiC,YAAYE,GAAG,CAACD,IAAIlC,UAAU,EAAEkC,IAAIvB,EAAE;IACrE;IACA,KAAK,MAAMX,cAAcwB,YAAa;QACpC,IAAI,CAACS,YAAYG,GAAG,CAACpC,aAAa;YAChC,MAAM,IAAIsB,MACR,CAAC,oDAAoD,EAAEvB,OAAOG,SAAS,CAAC,iBAAiB,EAAEF,YAAY;QAE3G;IACF;IACA,OAAOiC;AACT;AAEA,eAAeI,iBACbvC,EAAM,EACNoC,GAAyE;IAEzE,IAAIA,IAAI7B,UAAU,KAAK,MAAM,OAAO6B,IAAI7B,UAAU;IAElD,MAAMA,aAAa,MAAMR,qBAAqBC,IAAI;QAChDI,WAAWgC,IAAIhC,SAAS;QACxBF,YAAYkC,IAAIlC,UAAU;IAC5B;IACA,MAAMsC,UAAU,MAAMxC,GACnByC,MAAM,CAAC7C,qBACPyC,GAAG,CAAC;QAAC9B;IAAU,GACfE,KAAK,CAAC1B,IAAIE,GAAGW,oBAAoBiB,EAAE,EAAEuB,IAAIvB,EAAE,GAAGxB,OAAOO,oBAAoBW,UAAU,IACnFa,SAAS,CAAC;QAACb,YAAYX,oBAAoBW,UAAU;IAAA;IACxD,MAAMmC,aAAaF,OAAO,CAAC,EAAE;IAC7B,IAAIE,YAAYnC,YAAY,OAAOmC,WAAWnC,UAAU;IAExD,MAAMoC,UAAU,MAAM3C,GACnBM,MAAM,CAAC;QAACC,YAAYX,oBAAoBW,UAAU;IAAA,GAClDC,IAAI,CAACZ,qBACLa,KAAK,CAACxB,GAAGW,oBAAoBiB,EAAE,EAAEuB,IAAIvB,EAAE,GACvCC,KAAK,CAAC;IACT,MAAM8B,aAAaD,OAAO,CAAC,EAAE;IAC7B,IAAI,CAACC,YAAYrC,YAAY;QAC3B,MAAM,IAAIiB,MAAM,CAAC,WAAW,EAAEY,IAAIvB,EAAE,CAAC,mDAAmD,CAAC;IAC3F;IACA,OAAO+B,WAAWrC,UAAU;AAC9B;AAEA,SAASsC,iBAAiB7C,EAAM,EAAEC,MAAqD;IACrF,MAAMS,SAAST,OAAOS,MAAM,IAAI;IAChC,IAAIA,WAAW,SAAS,CAACT,OAAOC,UAAU,EAAE;QAC1C,MAAM,IAAIsB,MAAM;IAClB;IACA,8EAA8E;IAC9E,+DAA+D;IAC/D,MAAMsB,cAAc7C,OAAO8C,GAAG,IAAI,QAAQ9C,OAAO+C,GAAG,IAAI;IACxD,IAAI,AAACtC,WAAW,UAAWoC,aAAa;QACtC,MAAM,IAAItB,MACR;IAEJ;IAEA,MAAMyB,aAAwC;QAC5CC,UAAUjD,OAAOiD,QAAQ;QACzBC,OAAOlD,OAAOkD,KAAK;QACnBC,gBAAgBnD,OAAOmD,cAAc,IAAI;IAC3C;IAEA,MAAMf,MAAM;QACV9B,YAAYN,OAAOM,UAAU;QAC7B8C,MAAMpD,OAAOoD,IAAI;QACjB3C;QACAuC;QACAK,aAAarD,OAAOqD,WAAW,IAAI;QACnCC,WAAW/D,GAAG,CAAC,KAAK,CAAC;QACrBgE,WAAWhE,GAAG,CAAC,KAAK,CAAC;QACrBiE,WAAW;IACb;IAEA,MAAMvC,SAAS;QACbd,WAAWH,OAAOG,SAAS;QAC3BG,YAAYN,OAAOM,UAAU;QAC7BL,YAAYD,OAAOC,UAAU,IAAI;QACjCQ;QACAsC,KAAK/C,OAAO+C,GAAG,IAAI;QACnBD,KAAK9C,OAAO8C,GAAG,IAAI;QACnBM,MAAMpD,OAAOoD,IAAI;QACjBJ;QACAK,aAAarD,OAAOqD,WAAW,IAAI;IACrC;IAEA,IAAIrD,OAAO+C,GAAG,EAAE;QACd,OAAOhD,GACJiB,MAAM,CAACrB,qBACPsB,MAAM,CAACA,QACPwC,kBAAkB,CAAC;YAClBC,QAAQ;gBACN/D,oBAAoBQ,SAAS;gBAC7BR,oBAAoBoD,GAAG;gBACvBpD,oBAAoBM,UAAU;aAC/B;YACD0D,aAAapE,GAAG,CAAC,iBAAiB,CAAC;YACnC6C;QACF,GACCjB,SAAS;IACd;IAEA,IAAInB,OAAO8C,GAAG,EAAE;QACd,OAAO/C,GACJiB,MAAM,CAACrB,qBACPsB,MAAM,CAACA,QACPwC,kBAAkB,CAAC;YAClBC,QAAQ;gBACN/D,oBAAoBQ,SAAS;gBAC7BR,oBAAoBmD,GAAG;gBACvBnD,oBAAoBM,UAAU;aAC/B;YACD0D,aAAapE,GAAG,CAAC,iBAAiB,CAAC;YACnC6C;QACF,GACCjB,SAAS;IACd;IAEA,OAAOpB,GACJiB,MAAM,CAACrB,qBACPsB,MAAM,CAACA,QACPwC,kBAAkB,CAAC;QAClBC,QAAQ;YAAC/D,oBAAoBQ,SAAS;YAAER,oBAAoBM,UAAU;SAAC;QACvE0D,aAAapE,GAAG,CAAC,6DAA6D,CAAC;QAC/E6C;IACF,GACCjB,SAAS;AACd;AAEA,OAAO,eAAeyC,iBACpB5D,MAA8B;IAE9B,OAAO,MAAMR,KAAKqE,WAAW,CAAC,OAAO9D;QACnC,MAAMO,aAAa,MAAMR,qBAAqBC,IAAI;YAChDI,WAAWH,OAAOG,SAAS;YAC3BF,YAAYD,OAAOC,UAAU,IAAI;QACnC;QACA,MAAMgC,OAAO,MAAMW,iBAAiB7C,IAAI;YAAC,GAAGC,MAAM;YAAEM;QAAU;QAC9D,MAAM6B,MAAMF,IAAI,CAAC,EAAE;QACnB,IAAI,CAACE,KAAK,MAAM,IAAIZ,MAAM;QAE1B,MAAM1C,iBAAsCkB,IAAIH,mBAAmB;YACjEkE,MAAMlF;YACNmF,SAAS;gBACPC,cAAc7B,IAAIvB,EAAE;gBACpBT,WAAWgC,IAAIhC,SAAS;gBACxB8D,aAAajE,OAAOiE,WAAW;gBAC/BhE,YAAYkC,IAAIlC,UAAU;gBAC1BiE,UAAUzE,sBAAsB0C,IAAIa,UAAU,CAACE,KAAK;YACtD;QACF;QAEA,OAAOxD,aAAayC;IACtB;AACF;AAEA;;;;CAIC,GACD,OAAO,eAAegC,4BAA4BnE,MAGjD;IACC,OAAO,MAAMR,KAAKqE,WAAW,CAAC,OAAO9D;QACnC,OAAO,MAAMD,qBAAqBC,IAAIC;IACxC;AACF;AAEA,OAAO,eAAeoE,kBAAkBxD,EAAU;IAChD,OAAO,MAAMpB,KAAKqE,WAAW,CAAC,OAAO9D;QACnC,MAAMkC,OAAO,MAAMlC,GAChBM,MAAM,GACNE,IAAI,CAACZ,qBACLa,KAAK,CAAC1B,IAAIE,GAAGW,oBAAoBiB,EAAE,EAAEA,KAAKxB,OAAOO,oBAAoB6D,SAAS,IAC9E3C,KAAK,CAAC;QACT,MAAMsB,MAAMF,IAAI,CAAC,EAAE;QAEnB,IAAIE,KAAK;YACP,MAAM7B,aAAa,MAAMgC,iBAAiBvC,IAAIoC;YAC9C,OAAOzC,aAAa;gBAAC,GAAGyC,GAAG;gBAAE7B;YAAU;QACzC;QAEA,OAAO+D;IACT;AACF;AAEA,OAAO,eAAeC,uBACpB1D,EAAU;IAEV,MAAMqB,OAAO,MAAMzC,KAChBa,MAAM,CAAC;QAACO,IAAIf,kBAAkBe,EAAE;QAAET,WAAWN,kBAAkBM,SAAS;IAAA,GACxEI,IAAI,CAACV,mBACLW,KAAK,CAACxB,GAAGa,kBAAkBe,EAAE,EAAEA,KAC/BC,KAAK,CAAC;IAET,OAAOoB,IAAI,CAAC,EAAE;AAChB;AAEA,OAAO,eAAesC,0BAA0BvE,MAG/C;IACC,MAAMiC,OAAO,MAAMzC,KAChBa,MAAM,GACNE,IAAI,CAACZ,qBACLa,KAAK,CACJ1B,IACEE,GAAGW,oBAAoBW,UAAU,EAAEN,OAAOM,UAAU,GACpDtB,GAAGW,oBAAoBmD,GAAG,EAAE9C,OAAO8C,GAAG,GACtC1D,OAAOO,oBAAoB6D,SAAS,IAGvC3C,KAAK,CAAC;IACT,MAAMsB,MAAMF,IAAI,CAAC,EAAE;IAEnB,OAAOE,MAAMzC,aAAa;QAAC,GAAGyC,GAAG;QAAE7B,YAAYN,OAAOM,UAAU;IAAA,KAAK+D;AACvE;AAkBA,SAASG,YAAYC,MAAoC;IACvD,IAAI,CAACA,QAAQ,OAAOJ;IACpB,OAAO/E,GACLL,GAAGU,oBAAoByD,IAAI,EAAEqB,OAAOC,KAAK,GACzC5F,IAAIE,GAAGW,oBAAoByD,IAAI,EAAEqB,OAAOC,KAAK,GAAGzF,GAAGU,oBAAoBiB,EAAE,EAAE6D,OAAO7D,EAAE;AAExF;AAEA,OAAO,eAAe+D,gBACpB3E,MAA6B;IAE7B,OAAO,MAAMR,KAAKqE,WAAW,CAAC,OAAO9D;QACnC,MAAM6E,aAAa;YACjB5F,GAAGW,oBAAoBQ,SAAS,EAAEH,OAAOG,SAAS;YAClDf,OAAOO,oBAAoB6D,SAAS;SACrC;QACD,MAAMqB,kBAAkBL,YAAYxE,OAAOyE,MAAM;QACjD,IAAII,iBAAiBD,WAAWE,IAAI,CAACD;QAErC,MAAM5C,OAAO,MAAMlC,GAChBM,MAAM,GACNE,IAAI,CAACZ,qBACLa,KAAK,CAAC1B,OAAO8F,aACblE,OAAO,CAAC3B,IAAIY,oBAAoByD,IAAI,GAAGrE,IAAIY,oBAAoBiB,EAAE,GACjEC,KAAK,CAACb,OAAOa,KAAK,GAAG;QAExB,MAAMkE,UAAU9C,KAAKH,MAAM,GAAG9B,OAAOa,KAAK;QAC1C,MAAMmE,WAAWD,UAAU9C,KAAKgD,KAAK,CAAC,GAAGjF,OAAOa,KAAK,IAAIoB;QACzD,MAAMiD,OAAOF,SAASG,EAAE,CAAC,CAAC;QAC1B,MAAMC,cAAoC,EAAE;QAC5C,KAAK,MAAMjD,OAAO6C,SAAU;YAC1B,MAAM1E,aAAa,MAAMgC,iBAAiBvC,IAAIoC;YAC9CiD,YAAYN,IAAI,CAACpF,aAAa;gBAAC,GAAGyC,GAAG;gBAAE7B;YAAU;QACnD;QAEA,OAAO;YACL8E;YACAC,YAAYN,WAAWG,OAAO;gBAACR,OAAOQ,KAAK9B,IAAI;gBAAExC,IAAIsE,KAAKtE,EAAE;YAAA,IAAI;QAClE;IACF;AACF;AAEA,OAAO,eAAe0E,yBAAyBnF,SAAiB;IAC9D,MAAMoF,SAAS,MAAMZ,gBAAgB;QAACxE;QAAWU,OAAO;IAAG;IAC3D,OAAO0E,OAAOH,WAAW;AAC3B;AASA,eAAeI,gCACbzF,EAAM,EACNC,MAAsC;IAEtC,MAAMyF,MAAMlG,GAAG,CAAC,KAAK,CAAC;IACtB,MAAMmG,YAAY5G,IAChBE,GAAGW,oBAAoBQ,SAAS,EAAEH,OAAOG,SAAS,GAClDnB,GAAGW,oBAAoBc,MAAM,EAAE,QAC/BzB,GAAGW,oBAAoBmD,GAAG,EAAE9C,OAAO8C,GAAG,GACtC1D,OAAOO,oBAAoB6D,SAAS;IAEtC,MAAMhD,QACJR,OAAO2F,eAAe,CAAC7D,MAAM,GAAG,IAC5BhD,IAAI4G,WAAWrG,WAAWM,oBAAoBM,UAAU,EAAED,OAAO2F,eAAe,KAChFD;IAEN,MAAMzD,OAAO,MAAMlC,GAChByC,MAAM,CAAC7C,qBACPyC,GAAG,CAAC;QAACoB,WAAWiC;QAAKlC,WAAWkC;IAAG,GACnCjF,KAAK,CAACA,OACNW,SAAS,CAAC;QAACP,IAAIjB,oBAAoBiB,EAAE;IAAA;IAExC,KAAK,MAAMuB,OAAOF,KAAM;QACtB,MAAMpD,iBAAsCkB,IAAIH,mBAAmB;YACjEkE,MAAMnF;YACNoF,SAAS;gBACPC,cAAc7B,IAAIvB,EAAE;gBACpBT,WAAWH,OAAOG,SAAS;gBAC3B8D,aAAajE,OAAOiE,WAAW;YACjC;QACF;IACF;IAEA,OAAOhC,KAAKH,MAAM;AACpB;AAEA,OAAO,eAAe8D,8BACpB5F,MAAsC;IAEtC,OAAO,MAAMR,KAAKqE,WAAW,CAAC,CAAC9D,KAAOyF,gCAAgCzF,IAAIC;AAC5E;AAqBA,OAAO,eAAe6F,yBACpB7F,MAAsC;IAEtC,OAAO,MAAMR,KAAKqE,WAAW,CAAC,OAAO9D;QACnC,IAAI+F,eAAe;QACnB,MAAMC,WAID,EAAE;QACP,KAAK,MAAMC,QAAQhG,OAAOiG,OAAO,CAAE;YACjC,MAAM7F,WAAW,MAAML,GACpBM,MAAM,CAAC;gBACNgD,aAAa1D,oBAAoB0D,WAAW;gBAC5CG,WAAW7D,oBAAoB6D,SAAS;gBACxClD,YAAYX,oBAAoBW,UAAU;YAC5C,GACCC,IAAI,CAACZ,qBACLa,KAAK,CACJ1B,IACEE,GAAGW,oBAAoBQ,SAAS,EAAEH,OAAOG,SAAS,GAClDnB,GAAGW,oBAAoBmD,GAAG,EAAE9C,OAAO8C,GAAG,GACtC9D,GAAGW,oBAAoBM,UAAU,EAAE+F,KAAK/F,UAAU,IAGrDY,KAAK,CAAC;YAET,MAAMqF,WAAW9F,QAAQ,CAAC,EAAE;YAC5B,MAAM+F,YACJD,aAAa7B,aACb6B,SAAS1C,SAAS,KAAK,QACvB0C,SAAS7C,WAAW,KAAK2C,KAAK3C,WAAW;YAE3C0C,SAASjB,IAAI,CAAC;gBAACkB;gBAAMG;gBAAW7F,YAAY4F,UAAU5F;YAAU;QAClE;QAEA,MAAM4B,cAAc,MAAMV,sBAAsBzB,IAAI;YAClDI,WAAWH,OAAOG,SAAS;YAC3BsB,aAAasE,SAASK,MAAM,CAAC,CAAC,EAACD,SAAS,EAAC,GAAK,CAACA,WAAWnE,GAAG,CAAC,CAAC,EAACgE,IAAI,EAAC,GAAKA,KAAK/F,UAAU;QAC3F;QAEA,KAAK,MAAM,EAAC+F,IAAI,EAAEG,SAAS,EAAE7F,YAAY+F,kBAAkB,EAAC,IAAIN,SAAU;YACxE,MAAMzF,aAAa6F,YACdE,sBACA,MAAMvG,qBAAqBC,IAAI;gBAC9BI,WAAWH,OAAOG,SAAS;gBAC3BF,YAAY+F,KAAK/F,UAAU;YAC7B,KACAiC,YAAYoE,GAAG,CAACN,KAAK/F,UAAU;YACnC,IAAI,CAACK,YAAY;gBACf,MAAM,IAAIiB,MACR,CAAC,qCAAqC,EAAEvB,OAAOG,SAAS,CAAC,iBAAiB,EAAE6F,KAAK/F,UAAU,EAAE;YAEjG;YACA,MAAMgC,OAAO,MAAMW,iBAAiB7C,IAAI;gBACtCI,WAAWH,OAAOG,SAAS;gBAC3B8D,aAAajE,OAAOiE,WAAW;gBAC/B3D;gBACAL,YAAY+F,KAAK/F,UAAU;gBAC3BQ,QAAQ;gBACRqC,KAAK9C,OAAO8C,GAAG;gBACfM,MAAM4C,KAAK5C,IAAI;gBACfH,UAAU+C,KAAK/C,QAAQ;gBACvBC,OAAO8C,KAAK9C,KAAK;gBACjBC,gBAAgB6C,KAAK7C,cAAc,IAAI;gBACvCE,aAAa2C,KAAK3C,WAAW;YAC/B;YACA,MAAMlB,MAAMF,IAAI,CAAC,EAAE;YACnB,IAAI,CAACE,KAAK,MAAM,IAAIZ,MAAM;YAE1B,IAAI,CAAC4E,WAAW;gBACd,MAAMtH,iBAAsCkB,IAAIH,mBAAmB;oBACjEkE,MAAMlF;oBACNmF,SAAS;wBACPC,cAAc7B,IAAIvB,EAAE;wBACpBT,WAAWgC,IAAIhC,SAAS;wBACxB8D,aAAajE,OAAOiE,WAAW;wBAC/BhE,YAAYkC,IAAIlC,UAAU;wBAC1BiE,UAAUzE,sBAAsB0C,IAAIa,UAAU,CAACE,KAAK;oBACtD;gBACF;gBACA4C,gBAAgB;YAClB;QACF;QAEA,MAAMH,kBAAkB3F,OAAOiG,OAAO,CAACjE,GAAG,CAAC,CAACuE,SAAWA,OAAOtG,UAAU;QACxE,MAAMuG,eAAe,MAAMhB,gCAAgCzF,IAAI;YAC7DI,WAAWH,OAAOG,SAAS;YAC3B8D,aAAajE,OAAOiE,WAAW;YAC/BnB,KAAK9C,OAAO8C,GAAG;YACf6C;QACF;QAEA,OAAO;YAACG;YAAcU;QAAY;IACpC;AACF;AAEA,OAAO,eAAeC,gBAAgBzG,MAAwC;IAC5E,MAAMR,KACHkH,MAAM,CAAC/G,qBACPa,KAAK,CACJ1B,IACEE,GAAGW,oBAAoBQ,SAAS,EAAEH,OAAOG,SAAS,GAClDnB,GAAGW,oBAAoBmD,GAAG,EAAE9C,OAAO8C,GAAG;AAG9C"}
|
package/dist/db/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export { closeDb, db, schema } from './db.js';
|
|
2
2
|
export type { ApplyVcsDefinitionsBatchParams, ApplyVcsDefinitionsBatchResult, ListDefinitionsParams, ListDefinitionsResult, SoftDeleteVcsDefinitionsParams, UpsertDefinitionParams, } from './definitions.js';
|
|
3
|
-
export { applyVcsDefinitionsBatch, getDefinitionById, invalidateCache, listDefinitions, listDefinitionsByProject, softDeleteVcsDefinitionsNotIn, upsertDefinition, } from './definitions.js';
|
|
3
|
+
export { applyVcsDefinitionsBatch, findOrCreateWorkflowLineage, getDefinitionById, invalidateCache, listDefinitions, listDefinitionsByProject, softDeleteVcsDefinitionsNotIn, upsertDefinition, } from './definitions.js';
|
|
4
4
|
export { definitionsOutbox } from './schema/outbox.js';
|
|
5
5
|
export { definitionSyncStates } from './schema/sync-states.js';
|
|
6
|
+
export { type WorkflowCreateDb, type WorkflowDb, workflowWorkflows } from './schema/workflows.js';
|
|
6
7
|
export { type DefinitionSyncStateKey, getLatestDefinitionSyncState, type MarkDefinitionSyncParams, markDefinitionSyncState, } from './sync-states.js';
|
|
7
8
|
export declare const migrationsPath: string;
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/db/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,8BAA8B,EAC9B,8BAA8B,EAC9B,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,wBAAwB,EACxB,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAC,oBAAoB,EAAC,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,EAC5B,KAAK,wBAAwB,EAC7B,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,cAAc,QAAoE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,8BAA8B,EAC9B,8BAA8B,EAC9B,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,wBAAwB,EACxB,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAC,oBAAoB,EAAC,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAC,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAChG,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,EAC5B,KAAK,wBAAwB,EAC7B,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,cAAc,QAAoE,CAAC"}
|
package/dist/db/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { dirname, resolve } from 'node:path';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
export { closeDb, db, schema } from './db.js';
|
|
4
|
-
export { applyVcsDefinitionsBatch, getDefinitionById, invalidateCache, listDefinitions, listDefinitionsByProject, softDeleteVcsDefinitionsNotIn, upsertDefinition } from './definitions.js';
|
|
4
|
+
export { applyVcsDefinitionsBatch, findOrCreateWorkflowLineage, getDefinitionById, invalidateCache, listDefinitions, listDefinitionsByProject, softDeleteVcsDefinitionsNotIn, upsertDefinition } from './definitions.js';
|
|
5
5
|
export { definitionsOutbox } from './schema/outbox.js';
|
|
6
6
|
export { definitionSyncStates } from './schema/sync-states.js';
|
|
7
|
+
export { workflowWorkflows } from './schema/workflows.js';
|
|
7
8
|
export { getLatestDefinitionSyncState, markDefinitionSyncState } from './sync-states.js';
|
|
8
9
|
export const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');
|
|
9
10
|
|
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {closeDb, db, schema} from './db.js';\nexport type {\n ApplyVcsDefinitionsBatchParams,\n ApplyVcsDefinitionsBatchResult,\n ListDefinitionsParams,\n ListDefinitionsResult,\n SoftDeleteVcsDefinitionsParams,\n UpsertDefinitionParams,\n} from './definitions.js';\nexport {\n applyVcsDefinitionsBatch,\n getDefinitionById,\n invalidateCache,\n listDefinitions,\n listDefinitionsByProject,\n softDeleteVcsDefinitionsNotIn,\n upsertDefinition,\n} from './definitions.js';\nexport {definitionsOutbox} from './schema/outbox.js';\nexport {definitionSyncStates} from './schema/sync-states.js';\nexport {\n type DefinitionSyncStateKey,\n getLatestDefinitionSyncState,\n type MarkDefinitionSyncParams,\n markDefinitionSyncState,\n} from './sync-states.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","closeDb","db","schema","applyVcsDefinitionsBatch","getDefinitionById","invalidateCache","listDefinitions","listDefinitionsByProject","softDeleteVcsDefinitionsNotIn","upsertDefinition","definitionsOutbox","definitionSyncStates","getLatestDefinitionSyncState","markDefinitionSyncState","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SAAQC,OAAO,EAAEC,EAAE,EAAEC,MAAM,QAAO,UAAU;AAS5C,SACEC,wBAAwB,EACxBC,iBAAiB,EACjBC,eAAe,EACfC,eAAe,EACfC,wBAAwB,EACxBC,6BAA6B,EAC7BC,gBAAgB,QACX,mBAAmB;AAC1B,SAAQC,iBAAiB,QAAO,qBAAqB;AACrD,SAAQC,oBAAoB,QAAO,0BAA0B;AAC7D,SAEEC,4BAA4B,EAE5BC,uBAAuB,QAClB,mBAAmB;AAE1B,OAAO,MAAMC,
|
|
1
|
+
{"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {closeDb, db, schema} from './db.js';\nexport type {\n ApplyVcsDefinitionsBatchParams,\n ApplyVcsDefinitionsBatchResult,\n ListDefinitionsParams,\n ListDefinitionsResult,\n SoftDeleteVcsDefinitionsParams,\n UpsertDefinitionParams,\n} from './definitions.js';\nexport {\n applyVcsDefinitionsBatch,\n findOrCreateWorkflowLineage,\n getDefinitionById,\n invalidateCache,\n listDefinitions,\n listDefinitionsByProject,\n softDeleteVcsDefinitionsNotIn,\n upsertDefinition,\n} from './definitions.js';\nexport {definitionsOutbox} from './schema/outbox.js';\nexport {definitionSyncStates} from './schema/sync-states.js';\nexport {type WorkflowCreateDb, type WorkflowDb, workflowWorkflows} from './schema/workflows.js';\nexport {\n type DefinitionSyncStateKey,\n getLatestDefinitionSyncState,\n type MarkDefinitionSyncParams,\n markDefinitionSyncState,\n} from './sync-states.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","closeDb","db","schema","applyVcsDefinitionsBatch","findOrCreateWorkflowLineage","getDefinitionById","invalidateCache","listDefinitions","listDefinitionsByProject","softDeleteVcsDefinitionsNotIn","upsertDefinition","definitionsOutbox","definitionSyncStates","workflowWorkflows","getLatestDefinitionSyncState","markDefinitionSyncState","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SAAQC,OAAO,EAAEC,EAAE,EAAEC,MAAM,QAAO,UAAU;AAS5C,SACEC,wBAAwB,EACxBC,2BAA2B,EAC3BC,iBAAiB,EACjBC,eAAe,EACfC,eAAe,EACfC,wBAAwB,EACxBC,6BAA6B,EAC7BC,gBAAgB,QACX,mBAAmB;AAC1B,SAAQC,iBAAiB,QAAO,qBAAqB;AACrD,SAAQC,oBAAoB,QAAO,0BAA0B;AAC7D,SAAgDC,iBAAiB,QAAO,wBAAwB;AAChG,SAEEC,4BAA4B,EAE5BC,uBAAuB,QAClB,mBAAmB;AAE1B,OAAO,MAAMC,iBAAiBlB,QAAQD,QAAQE,cAAc,YAAYkB,GAAG,IAAI,iBAAiB"}
|
|
@@ -21,6 +21,23 @@ export declare const workflowDefinitions: import("drizzle-orm/pg-core").PgTableW
|
|
|
21
21
|
identity: undefined;
|
|
22
22
|
generated: undefined;
|
|
23
23
|
}, {}, {}>;
|
|
24
|
+
workflowId: import("drizzle-orm/pg-core").PgColumn<{
|
|
25
|
+
name: "workflow_id";
|
|
26
|
+
tableName: "workflow_definitions";
|
|
27
|
+
dataType: "string";
|
|
28
|
+
columnType: "PgUUID";
|
|
29
|
+
data: string;
|
|
30
|
+
driverParam: string;
|
|
31
|
+
notNull: false;
|
|
32
|
+
hasDefault: false;
|
|
33
|
+
isPrimaryKey: false;
|
|
34
|
+
isAutoincrement: false;
|
|
35
|
+
hasRuntimeDefault: false;
|
|
36
|
+
enumValues: undefined;
|
|
37
|
+
baseColumn: never;
|
|
38
|
+
identity: undefined;
|
|
39
|
+
generated: undefined;
|
|
40
|
+
}, {}, {}>;
|
|
24
41
|
projectId: import("drizzle-orm/pg-core").PgColumn<{
|
|
25
42
|
name: "project_id";
|
|
26
43
|
tableName: "workflow_definitions";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../../src/db/schema/definitions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../../src/db/schema/definitions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,uCAAuC,CAAC;AAI/C,eAAO,MAAM,oBAAoB,yDAAkD,CAAC;AAEpF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4C/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAC;AACnE,MAAM,MAAM,kBAAkB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAC;AACzE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAE7D,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,kBAAkB,CAwBlE"}
|
|
@@ -2,12 +2,15 @@ import { uuidv7PrimaryKey } from '@shipfox/node-drizzle';
|
|
|
2
2
|
import { sql } from 'drizzle-orm';
|
|
3
3
|
import { check, index, jsonb, pgEnum, text, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
|
|
4
4
|
import { pgTable } from './common.js';
|
|
5
|
+
import { workflowWorkflows } from './workflows.js';
|
|
5
6
|
export const definitionSourceEnum = pgEnum('definitions_source', [
|
|
6
7
|
'manual',
|
|
7
8
|
'vcs'
|
|
8
9
|
]);
|
|
9
10
|
export const workflowDefinitions = pgTable('workflow_definitions', {
|
|
10
11
|
id: uuidv7PrimaryKey(),
|
|
12
|
+
// Schema-only upgrades leave historical rows null until they are touched.
|
|
13
|
+
workflowId: uuid('workflow_id').references(()=>workflowWorkflows.id),
|
|
11
14
|
projectId: uuid('project_id').notNull(),
|
|
12
15
|
configPath: text('config_path'),
|
|
13
16
|
source: definitionSourceEnum('source').notNull().default('manual'),
|
|
@@ -35,13 +38,18 @@ export const workflowDefinitions = pgTable('workflow_definitions', {
|
|
|
35
38
|
uniqueIndex('definitions_wd_sha_lookup').on(table.projectId, table.sha, table.configPath).where(sql`"sha" IS NOT NULL`),
|
|
36
39
|
uniqueIndex('definitions_wd_ref_lookup').on(table.projectId, table.ref, table.configPath).where(sql`"ref" IS NOT NULL`),
|
|
37
40
|
index('definitions_wd_project_name_id_idx').on(table.projectId, table.name, table.id).where(sql`"deleted_at" IS NULL`),
|
|
41
|
+
index('definitions_wd_workflow_ref_lookup').on(table.workflowId, table.ref).where(sql`"ref" IS NOT NULL AND "deleted_at" IS NULL`),
|
|
38
42
|
// Binds source to its git coordinates so the partial indexes above stay
|
|
39
43
|
// unambiguous: vcs rows carry a ref or sha; manual rows carry neither.
|
|
40
44
|
check('definitions_wd_source_ref_sha_consistent', sql`("source" = 'vcs') = ("ref" IS NOT NULL OR "sha" IS NOT NULL)`)
|
|
41
45
|
]);
|
|
42
46
|
export function toDefinition(row) {
|
|
47
|
+
if (row.workflowId === null) {
|
|
48
|
+
throw new Error(`Definition ${row.id} has no workflow lineage`);
|
|
49
|
+
}
|
|
43
50
|
return {
|
|
44
51
|
id: row.id,
|
|
52
|
+
workflowId: row.workflowId,
|
|
45
53
|
projectId: row.projectId,
|
|
46
54
|
configPath: row.configPath,
|
|
47
55
|
source: row.source,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/schema/definitions.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {check, index, jsonb, pgEnum, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {\n WorkflowDefinition,\n WorkflowDefinitionPayload,\n} from '#core/entities/workflow-definition.js';\nimport {pgTable} from './common.js';\n\nexport const definitionSourceEnum = pgEnum('definitions_source', ['manual', 'vcs']);\n\nexport const workflowDefinitions = pgTable(\n 'workflow_definitions',\n {\n id: uuidv7PrimaryKey(),\n projectId: uuid('project_id').notNull(),\n configPath: text('config_path'),\n source: definitionSourceEnum('source').notNull().default('manual'),\n sha: text('sha'),\n ref: text('ref'),\n name: text('name').notNull(),\n definition: jsonb('definition').notNull().$type<WorkflowDefinitionPayload>(),\n contentHash: text('content_hash'),\n fetchedAt: timestamp('fetched_at', {withTimezone: true}).notNull().defaultNow(),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n deletedAt: timestamp('deleted_at', {withTimezone: true}),\n },\n (table) => [\n // Manual definitions only (no ref, no sha); VCS uniqueness is sha_lookup/ref_lookup.\n // A source-agnostic predicate here collides VCS upserts on a non-arbiter index. ENG-659.\n uniqueIndex('definitions_wd_manual_unique')\n .on(table.projectId, table.configPath)\n .where(sql`\"config_path\" IS NOT NULL AND \"ref\" IS NULL AND \"sha\" IS NULL`),\n uniqueIndex('definitions_wd_sha_lookup')\n .on(table.projectId, table.sha, table.configPath)\n .where(sql`\"sha\" IS NOT NULL`),\n uniqueIndex('definitions_wd_ref_lookup')\n .on(table.projectId, table.ref, table.configPath)\n .where(sql`\"ref\" IS NOT NULL`),\n index('definitions_wd_project_name_id_idx')\n .on(table.projectId, table.name, table.id)\n .where(sql`\"deleted_at\" IS NULL`),\n // Binds source to its git coordinates so the partial indexes above stay\n // unambiguous: vcs rows carry a ref or sha; manual rows carry neither.\n check(\n 'definitions_wd_source_ref_sha_consistent',\n sql`(\"source\" = 'vcs') = (\"ref\" IS NOT NULL OR \"sha\" IS NOT NULL)`,\n ),\n ],\n);\n\nexport type DefinitionDb = typeof workflowDefinitions.$inferSelect;\nexport type DefinitionCreateDb = typeof workflowDefinitions.$inferInsert;\nexport type DefinitionUpdateDb = Partial<DefinitionCreateDb>;\n\nexport function toDefinition(row: DefinitionDb): WorkflowDefinition {\n return {\n id: row.id,\n projectId: row.projectId,\n configPath: row.configPath,\n source: row.source,\n sha: row.sha,\n ref: row.ref,\n name: row.name,\n definition: row.definition.document,\n document: row.definition.document,\n model: row.definition.model,\n sourceSnapshot: row.definition.sourceSnapshot ?? null,\n contentHash: row.contentHash,\n fetchedAt: row.fetchedAt,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n deletedAt: row.deletedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","check","index","jsonb","pgEnum","text","timestamp","uniqueIndex","uuid","pgTable","definitionSourceEnum","workflowDefinitions","id","projectId","notNull","configPath","source","default","sha","ref","name","definition","$type","contentHash","fetchedAt","withTimezone","defaultNow","createdAt","updatedAt","deletedAt","table","on","where","toDefinition","row","document","model","sourceSnapshot"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,KAAK,EAAEC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AAKpG,SAAQC,OAAO,QAAO,cAAc;
|
|
1
|
+
{"version":3,"sources":["../../../src/db/schema/definitions.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {check, index, jsonb, pgEnum, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {\n WorkflowDefinition,\n WorkflowDefinitionPayload,\n} from '#core/entities/workflow-definition.js';\nimport {pgTable} from './common.js';\nimport {workflowWorkflows} from './workflows.js';\n\nexport const definitionSourceEnum = pgEnum('definitions_source', ['manual', 'vcs']);\n\nexport const workflowDefinitions = pgTable(\n 'workflow_definitions',\n {\n id: uuidv7PrimaryKey(),\n // Schema-only upgrades leave historical rows null until they are touched.\n workflowId: uuid('workflow_id').references(() => workflowWorkflows.id),\n projectId: uuid('project_id').notNull(),\n configPath: text('config_path'),\n source: definitionSourceEnum('source').notNull().default('manual'),\n sha: text('sha'),\n ref: text('ref'),\n name: text('name').notNull(),\n definition: jsonb('definition').notNull().$type<WorkflowDefinitionPayload>(),\n contentHash: text('content_hash'),\n fetchedAt: timestamp('fetched_at', {withTimezone: true}).notNull().defaultNow(),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n deletedAt: timestamp('deleted_at', {withTimezone: true}),\n },\n (table) => [\n // Manual definitions only (no ref, no sha); VCS uniqueness is sha_lookup/ref_lookup.\n // A source-agnostic predicate here collides VCS upserts on a non-arbiter index. ENG-659.\n uniqueIndex('definitions_wd_manual_unique')\n .on(table.projectId, table.configPath)\n .where(sql`\"config_path\" IS NOT NULL AND \"ref\" IS NULL AND \"sha\" IS NULL`),\n uniqueIndex('definitions_wd_sha_lookup')\n .on(table.projectId, table.sha, table.configPath)\n .where(sql`\"sha\" IS NOT NULL`),\n uniqueIndex('definitions_wd_ref_lookup')\n .on(table.projectId, table.ref, table.configPath)\n .where(sql`\"ref\" IS NOT NULL`),\n index('definitions_wd_project_name_id_idx')\n .on(table.projectId, table.name, table.id)\n .where(sql`\"deleted_at\" IS NULL`),\n index('definitions_wd_workflow_ref_lookup')\n .on(table.workflowId, table.ref)\n .where(sql`\"ref\" IS NOT NULL AND \"deleted_at\" IS NULL`),\n // Binds source to its git coordinates so the partial indexes above stay\n // unambiguous: vcs rows carry a ref or sha; manual rows carry neither.\n check(\n 'definitions_wd_source_ref_sha_consistent',\n sql`(\"source\" = 'vcs') = (\"ref\" IS NOT NULL OR \"sha\" IS NOT NULL)`,\n ),\n ],\n);\n\nexport type DefinitionDb = typeof workflowDefinitions.$inferSelect;\nexport type DefinitionCreateDb = typeof workflowDefinitions.$inferInsert;\nexport type DefinitionUpdateDb = Partial<DefinitionCreateDb>;\n\nexport function toDefinition(row: DefinitionDb): WorkflowDefinition {\n if (row.workflowId === null) {\n throw new Error(`Definition ${row.id} has no workflow lineage`);\n }\n\n return {\n id: row.id,\n workflowId: row.workflowId,\n projectId: row.projectId,\n configPath: row.configPath,\n source: row.source,\n sha: row.sha,\n ref: row.ref,\n name: row.name,\n definition: row.definition.document,\n document: row.definition.document,\n model: row.definition.model,\n sourceSnapshot: row.definition.sourceSnapshot ?? null,\n contentHash: row.contentHash,\n fetchedAt: row.fetchedAt,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n deletedAt: row.deletedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","check","index","jsonb","pgEnum","text","timestamp","uniqueIndex","uuid","pgTable","workflowWorkflows","definitionSourceEnum","workflowDefinitions","id","workflowId","references","projectId","notNull","configPath","source","default","sha","ref","name","definition","$type","contentHash","fetchedAt","withTimezone","defaultNow","createdAt","updatedAt","deletedAt","table","on","where","toDefinition","row","Error","document","model","sourceSnapshot"],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type { DefinitionSyncState } from '#core/entities/sync-state.js';
|
|
1
|
+
import type { DefinitionSyncDiagnostic, DefinitionSyncState } from '#core/entities/sync-state.js';
|
|
2
|
+
type StoredDefinitionSyncDiagnostic = Omit<DefinitionSyncDiagnostic, 'severity'> & {
|
|
3
|
+
severity?: DefinitionSyncDiagnostic['severity'];
|
|
4
|
+
};
|
|
2
5
|
export declare const definitionSyncStatusEnum: import("drizzle-orm/pg-core").PgEnum<["pending", "syncing", "succeeded", "failed"]>;
|
|
3
6
|
export declare const definitionSyncErrorCodeEnum: import("drizzle-orm/pg-core").PgEnum<["no-workflow-files", "invalid-definition", "provider-repository-not-found", "provider-file-not-found", "provider-access-denied", "provider-rate-limited", "provider-timeout", "provider-unavailable", "provider-malformed-response", "content-too-large", "too-many-files", "connection-unavailable", "unknown"]>;
|
|
4
7
|
export declare const definitionSyncStates: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
@@ -146,7 +149,7 @@ export declare const definitionSyncStates: import("drizzle-orm/pg-core").PgTable
|
|
|
146
149
|
tableName: "sync_states";
|
|
147
150
|
dataType: "json";
|
|
148
151
|
columnType: "PgJsonb";
|
|
149
|
-
data:
|
|
152
|
+
data: StoredDefinitionSyncDiagnostic[];
|
|
150
153
|
driverParam: unknown;
|
|
151
154
|
notNull: true;
|
|
152
155
|
hasDefault: true;
|
|
@@ -158,7 +161,7 @@ export declare const definitionSyncStates: import("drizzle-orm/pg-core").PgTable
|
|
|
158
161
|
identity: undefined;
|
|
159
162
|
generated: undefined;
|
|
160
163
|
}, {}, {
|
|
161
|
-
$type:
|
|
164
|
+
$type: StoredDefinitionSyncDiagnostic[];
|
|
162
165
|
}>;
|
|
163
166
|
startedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
164
167
|
name: "started_at";
|
|
@@ -234,4 +237,5 @@ export declare const definitionSyncStates: import("drizzle-orm/pg-core").PgTable
|
|
|
234
237
|
export type DefinitionSyncStateDb = typeof definitionSyncStates.$inferSelect;
|
|
235
238
|
export type DefinitionSyncStateCreateDb = typeof definitionSyncStates.$inferInsert;
|
|
236
239
|
export declare function toDefinitionSyncState(row: DefinitionSyncStateDb): DefinitionSyncState;
|
|
240
|
+
export {};
|
|
237
241
|
//# sourceMappingURL=sync-states.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-states.d.ts","sourceRoot":"","sources":["../../../src/db/schema/sync-states.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sync-states.d.ts","sourceRoot":"","sources":["../../../src/db/schema/sync-states.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,wBAAwB,EAExB,mBAAmB,EAEpB,MAAM,8BAA8B,CAAC;AAGtC,KAAK,8BAA8B,GAAG,IAAI,CAAC,wBAAwB,EAAE,UAAU,CAAC,GAAG;IACjF,QAAQ,CAAC,EAAE,wBAAwB,CAAC,UAAU,CAAC,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,wBAAwB,qFAKnC,CAAC;AAEH,eAAO,MAAM,2BAA2B,yVActC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BhC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,OAAO,oBAAoB,CAAC,YAAY,CAAC;AAC7E,MAAM,MAAM,2BAA2B,GAAG,OAAO,oBAAoB,CAAC,YAAY,CAAC;AAEnF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,GAAG,mBAAmB,CAqBrF"}
|
|
@@ -50,6 +50,10 @@ export const definitionSyncStates = pgTable('sync_states', {
|
|
|
50
50
|
index('definitions_sync_states_failed_idx').on(table.updatedAt).where(sql`"status" = 'failed'`)
|
|
51
51
|
]);
|
|
52
52
|
export function toDefinitionSyncState(row) {
|
|
53
|
+
const diagnostics = (row.warnings ?? []).map(({ severity, ...diagnostic })=>({
|
|
54
|
+
...diagnostic,
|
|
55
|
+
severity: severity ?? 'warning'
|
|
56
|
+
}));
|
|
53
57
|
return {
|
|
54
58
|
id: row.id,
|
|
55
59
|
projectId: row.projectId,
|
|
@@ -59,7 +63,7 @@ export function toDefinitionSyncState(row) {
|
|
|
59
63
|
status: row.status,
|
|
60
64
|
lastErrorCode: row.lastErrorCode,
|
|
61
65
|
lastErrorMessage: row.lastErrorMessage,
|
|
62
|
-
|
|
66
|
+
diagnostics,
|
|
63
67
|
startedAt: row.startedAt,
|
|
64
68
|
finishedAt: row.finishedAt,
|
|
65
69
|
createdAt: row.createdAt,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/schema/sync-states.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {index, jsonb, pgEnum, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {\n DefinitionSyncErrorCode,\n DefinitionSyncState,\n DefinitionSyncStatus,\n
|
|
1
|
+
{"version":3,"sources":["../../../src/db/schema/sync-states.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {index, jsonb, pgEnum, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {\n DefinitionSyncDiagnostic,\n DefinitionSyncErrorCode,\n DefinitionSyncState,\n DefinitionSyncStatus,\n} from '#core/entities/sync-state.js';\nimport {pgTable} from './common.js';\n\ntype StoredDefinitionSyncDiagnostic = Omit<DefinitionSyncDiagnostic, 'severity'> & {\n severity?: DefinitionSyncDiagnostic['severity'];\n};\n\nexport const definitionSyncStatusEnum = pgEnum('definitions_sync_status', [\n 'pending',\n 'syncing',\n 'succeeded',\n 'failed',\n]);\n\nexport const definitionSyncErrorCodeEnum = pgEnum('definitions_sync_error_code', [\n 'no-workflow-files',\n 'invalid-definition',\n 'provider-repository-not-found',\n 'provider-file-not-found',\n 'provider-access-denied',\n 'provider-rate-limited',\n 'provider-timeout',\n 'provider-unavailable',\n 'provider-malformed-response',\n 'content-too-large',\n 'too-many-files',\n 'connection-unavailable',\n 'unknown',\n]);\n\nexport const definitionSyncStates = pgTable(\n 'sync_states',\n {\n id: uuidv7PrimaryKey(),\n projectId: uuid('project_id').notNull(),\n sourceConnectionId: uuid('source_connection_id').notNull(),\n sourceExternalRepositoryId: text('source_external_repository_id').notNull(),\n ref: text('ref').notNull(),\n status: definitionSyncStatusEnum('status').notNull().default('pending'),\n lastErrorCode: definitionSyncErrorCodeEnum('last_error_code'),\n lastErrorMessage: text('last_error_message'),\n warnings: jsonb('warnings').notNull().default([]).$type<StoredDefinitionSyncDiagnostic[]>(),\n startedAt: timestamp('started_at', {withTimezone: true}),\n finishedAt: timestamp('finished_at', {withTimezone: true}),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('definitions_sync_states_source_unique').on(\n table.projectId,\n table.sourceConnectionId,\n table.sourceExternalRepositoryId,\n table.ref,\n ),\n index('definitions_sync_states_failed_idx').on(table.updatedAt).where(sql`\"status\" = 'failed'`),\n ],\n);\n\nexport type DefinitionSyncStateDb = typeof definitionSyncStates.$inferSelect;\nexport type DefinitionSyncStateCreateDb = typeof definitionSyncStates.$inferInsert;\n\nexport function toDefinitionSyncState(row: DefinitionSyncStateDb): DefinitionSyncState {\n const diagnostics = (row.warnings ?? []).map(({severity, ...diagnostic}) => ({\n ...diagnostic,\n severity: severity ?? 'warning',\n }));\n\n return {\n id: row.id,\n projectId: row.projectId,\n sourceConnectionId: row.sourceConnectionId,\n sourceExternalRepositoryId: row.sourceExternalRepositoryId,\n ref: row.ref,\n status: row.status as DefinitionSyncStatus,\n lastErrorCode: row.lastErrorCode as DefinitionSyncErrorCode | null,\n lastErrorMessage: row.lastErrorMessage,\n diagnostics,\n startedAt: row.startedAt,\n finishedAt: row.finishedAt,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","index","jsonb","pgEnum","text","timestamp","uniqueIndex","uuid","pgTable","definitionSyncStatusEnum","definitionSyncErrorCodeEnum","definitionSyncStates","id","projectId","notNull","sourceConnectionId","sourceExternalRepositoryId","ref","status","default","lastErrorCode","lastErrorMessage","warnings","$type","startedAt","withTimezone","finishedAt","createdAt","defaultNow","updatedAt","table","on","where","toDefinitionSyncState","row","diagnostics","map","severity","diagnostic"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AAO7F,SAAQC,OAAO,QAAO,cAAc;AAMpC,OAAO,MAAMC,2BAA2BN,OAAO,2BAA2B;IACxE;IACA;IACA;IACA;CACD,EAAE;AAEH,OAAO,MAAMO,8BAA8BP,OAAO,+BAA+B;IAC/E;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,EAAE;AAEH,OAAO,MAAMQ,uBAAuBH,QAClC,eACA;IACEI,IAAIb;IACJc,WAAWN,KAAK,cAAcO,OAAO;IACrCC,oBAAoBR,KAAK,wBAAwBO,OAAO;IACxDE,4BAA4BZ,KAAK,iCAAiCU,OAAO;IACzEG,KAAKb,KAAK,OAAOU,OAAO;IACxBI,QAAQT,yBAAyB,UAAUK,OAAO,GAAGK,OAAO,CAAC;IAC7DC,eAAeV,4BAA4B;IAC3CW,kBAAkBjB,KAAK;IACvBkB,UAAUpB,MAAM,YAAYY,OAAO,GAAGK,OAAO,CAAC,EAAE,EAAEI,KAAK;IACvDC,WAAWnB,UAAU,cAAc;QAACoB,cAAc;IAAI;IACtDC,YAAYrB,UAAU,eAAe;QAACoB,cAAc;IAAI;IACxDE,WAAWtB,UAAU,cAAc;QAACoB,cAAc;IAAI,GAAGX,OAAO,GAAGc,UAAU;IAC7EC,WAAWxB,UAAU,cAAc;QAACoB,cAAc;IAAI,GAAGX,OAAO,GAAGc,UAAU;AAC/E,GACA,CAACE,QAAU;QACTxB,YAAY,yCAAyCyB,EAAE,CACrDD,MAAMjB,SAAS,EACfiB,MAAMf,kBAAkB,EACxBe,MAAMd,0BAA0B,EAChCc,MAAMb,GAAG;QAEXhB,MAAM,sCAAsC8B,EAAE,CAACD,MAAMD,SAAS,EAAEG,KAAK,CAAChC,GAAG,CAAC,mBAAmB,CAAC;KAC/F,EACD;AAKF,OAAO,SAASiC,sBAAsBC,GAA0B;IAC9D,MAAMC,cAAc,AAACD,CAAAA,IAAIZ,QAAQ,IAAI,EAAE,AAAD,EAAGc,GAAG,CAAC,CAAC,EAACC,QAAQ,EAAE,GAAGC,YAAW,GAAM,CAAA;YAC3E,GAAGA,UAAU;YACbD,UAAUA,YAAY;QACxB,CAAA;IAEA,OAAO;QACLzB,IAAIsB,IAAItB,EAAE;QACVC,WAAWqB,IAAIrB,SAAS;QACxBE,oBAAoBmB,IAAInB,kBAAkB;QAC1CC,4BAA4BkB,IAAIlB,0BAA0B;QAC1DC,KAAKiB,IAAIjB,GAAG;QACZC,QAAQgB,IAAIhB,MAAM;QAClBE,eAAec,IAAId,aAAa;QAChCC,kBAAkBa,IAAIb,gBAAgB;QACtCc;QACAX,WAAWU,IAAIV,SAAS;QACxBE,YAAYQ,IAAIR,UAAU;QAC1BC,WAAWO,IAAIP,SAAS;QACxBE,WAAWK,IAAIL,SAAS;IAC1B;AACF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export declare const workflowWorkflows: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
2
|
+
name: "workflows";
|
|
3
|
+
schema: undefined;
|
|
4
|
+
columns: {
|
|
5
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
6
|
+
name: "id";
|
|
7
|
+
tableName: "workflows";
|
|
8
|
+
dataType: "string";
|
|
9
|
+
columnType: "PgUUID";
|
|
10
|
+
data: string;
|
|
11
|
+
driverParam: string;
|
|
12
|
+
notNull: true;
|
|
13
|
+
hasDefault: true;
|
|
14
|
+
isPrimaryKey: true;
|
|
15
|
+
isAutoincrement: false;
|
|
16
|
+
hasRuntimeDefault: false;
|
|
17
|
+
enumValues: undefined;
|
|
18
|
+
baseColumn: never;
|
|
19
|
+
identity: undefined;
|
|
20
|
+
generated: undefined;
|
|
21
|
+
}, {}, {}>;
|
|
22
|
+
projectId: import("drizzle-orm/pg-core").PgColumn<{
|
|
23
|
+
name: "project_id";
|
|
24
|
+
tableName: "workflows";
|
|
25
|
+
dataType: "string";
|
|
26
|
+
columnType: "PgUUID";
|
|
27
|
+
data: string;
|
|
28
|
+
driverParam: string;
|
|
29
|
+
notNull: true;
|
|
30
|
+
hasDefault: false;
|
|
31
|
+
isPrimaryKey: false;
|
|
32
|
+
isAutoincrement: false;
|
|
33
|
+
hasRuntimeDefault: false;
|
|
34
|
+
enumValues: undefined;
|
|
35
|
+
baseColumn: never;
|
|
36
|
+
identity: undefined;
|
|
37
|
+
generated: undefined;
|
|
38
|
+
}, {}, {}>;
|
|
39
|
+
configPath: import("drizzle-orm/pg-core").PgColumn<{
|
|
40
|
+
name: "config_path";
|
|
41
|
+
tableName: "workflows";
|
|
42
|
+
dataType: "string";
|
|
43
|
+
columnType: "PgText";
|
|
44
|
+
data: string;
|
|
45
|
+
driverParam: string;
|
|
46
|
+
notNull: false;
|
|
47
|
+
hasDefault: false;
|
|
48
|
+
isPrimaryKey: false;
|
|
49
|
+
isAutoincrement: false;
|
|
50
|
+
hasRuntimeDefault: false;
|
|
51
|
+
enumValues: [string, ...string[]];
|
|
52
|
+
baseColumn: never;
|
|
53
|
+
identity: undefined;
|
|
54
|
+
generated: undefined;
|
|
55
|
+
}, {}, {}>;
|
|
56
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
57
|
+
name: "created_at";
|
|
58
|
+
tableName: "workflows";
|
|
59
|
+
dataType: "date";
|
|
60
|
+
columnType: "PgTimestamp";
|
|
61
|
+
data: Date;
|
|
62
|
+
driverParam: string;
|
|
63
|
+
notNull: true;
|
|
64
|
+
hasDefault: true;
|
|
65
|
+
isPrimaryKey: false;
|
|
66
|
+
isAutoincrement: false;
|
|
67
|
+
hasRuntimeDefault: false;
|
|
68
|
+
enumValues: undefined;
|
|
69
|
+
baseColumn: never;
|
|
70
|
+
identity: undefined;
|
|
71
|
+
generated: undefined;
|
|
72
|
+
}, {}, {}>;
|
|
73
|
+
};
|
|
74
|
+
dialect: 'pg';
|
|
75
|
+
}>;
|
|
76
|
+
export type WorkflowDb = typeof workflowWorkflows.$inferSelect;
|
|
77
|
+
export type WorkflowCreateDb = typeof workflowWorkflows.$inferInsert;
|
|
78
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/db/schema/workflows.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,iBAAiB,CAAC,YAAY,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG,OAAO,iBAAiB,CAAC,YAAY,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { uuidv7PrimaryKey } from '@shipfox/node-drizzle';
|
|
2
|
+
import { sql } from 'drizzle-orm';
|
|
3
|
+
import { text, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
|
|
4
|
+
import { pgTable } from './common.js';
|
|
5
|
+
export const workflowWorkflows = pgTable('workflows', {
|
|
6
|
+
id: uuidv7PrimaryKey(),
|
|
7
|
+
projectId: uuid('project_id').notNull(),
|
|
8
|
+
configPath: text('config_path'),
|
|
9
|
+
createdAt: timestamp('created_at', {
|
|
10
|
+
withTimezone: true
|
|
11
|
+
}).notNull().defaultNow()
|
|
12
|
+
}, (table)=>[
|
|
13
|
+
uniqueIndex('definitions_workflows_project_path_unique').on(table.projectId, table.configPath),
|
|
14
|
+
uniqueIndex('definitions_workflows_project_pathless_unique').on(table.projectId).where(sql`"config_path" IS NULL`)
|
|
15
|
+
]);
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/db/schema/workflows.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport {pgTable} from './common.js';\n\nexport const workflowWorkflows = pgTable(\n 'workflows',\n {\n id: uuidv7PrimaryKey(),\n projectId: uuid('project_id').notNull(),\n configPath: text('config_path'),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('definitions_workflows_project_path_unique').on(table.projectId, table.configPath),\n uniqueIndex('definitions_workflows_project_pathless_unique')\n .on(table.projectId)\n .where(sql`\"config_path\" IS NULL`),\n ],\n);\n\nexport type WorkflowDb = typeof workflowWorkflows.$inferSelect;\nexport type WorkflowCreateDb = typeof workflowWorkflows.$inferInsert;\n"],"names":["uuidv7PrimaryKey","sql","text","timestamp","uniqueIndex","uuid","pgTable","workflowWorkflows","id","projectId","notNull","configPath","createdAt","withTimezone","defaultNow","table","on","where"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AACvE,SAAQC,OAAO,QAAO,cAAc;AAEpC,OAAO,MAAMC,oBAAoBD,QAC/B,aACA;IACEE,IAAIR;IACJS,WAAWJ,KAAK,cAAcK,OAAO;IACrCC,YAAYT,KAAK;IACjBU,WAAWT,UAAU,cAAc;QAACU,cAAc;IAAI,GAAGH,OAAO,GAAGI,UAAU;AAC/E,GACA,CAACC,QAAU;QACTX,YAAY,6CAA6CY,EAAE,CAACD,MAAMN,SAAS,EAAEM,MAAMJ,UAAU;QAC7FP,YAAY,iDACTY,EAAE,CAACD,MAAMN,SAAS,EAClBQ,KAAK,CAAChB,GAAG,CAAC,qBAAqB,CAAC;KACpC,EACD"}
|
package/dist/db/sync-states.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DefinitionSyncErrorCode, DefinitionSyncState, DefinitionSyncStatus
|
|
1
|
+
import type { DefinitionSyncDiagnostic, DefinitionSyncErrorCode, DefinitionSyncState, DefinitionSyncStatus } from '#core/entities/sync-state.js';
|
|
2
2
|
export interface DefinitionSyncStateKey {
|
|
3
3
|
projectId: string;
|
|
4
4
|
sourceConnectionId: string;
|
|
@@ -9,7 +9,7 @@ export interface MarkDefinitionSyncParams extends DefinitionSyncStateKey {
|
|
|
9
9
|
status: DefinitionSyncStatus;
|
|
10
10
|
lastErrorCode?: DefinitionSyncErrorCode | null | undefined;
|
|
11
11
|
lastErrorMessage?: string | null | undefined;
|
|
12
|
-
|
|
12
|
+
diagnostics?: readonly DefinitionSyncDiagnostic[] | null | undefined;
|
|
13
13
|
startedAt?: Date | null | undefined;
|
|
14
14
|
finishedAt?: Date | null | undefined;
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-states.d.ts","sourceRoot":"","sources":["../../src/db/sync-states.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"sync-states.d.ts","sourceRoot":"","sources":["../../src/db/sync-states.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,8BAA8B,CAAC;AAKtC,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC;IACnC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAyB,SAAQ,sBAAsB;IACtE,MAAM,EAAE,oBAAoB,CAAC;IAC7B,aAAa,CAAC,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3D,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,SAAS,wBAAwB,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACrE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAuC9B;AAED,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC;CACpC,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAiB3C"}
|
package/dist/db/sync-states.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { and, desc, eq } from 'drizzle-orm';
|
|
2
|
-
import {
|
|
2
|
+
import { limitDefinitionSyncDiagnostics } from '#core/entities/sync-state.js';
|
|
3
3
|
import { db } from './db.js';
|
|
4
4
|
import { definitionSyncStates, toDefinitionSyncState } from './schema/sync-states.js';
|
|
5
5
|
export async function markDefinitionSyncState(params) {
|
|
6
6
|
const now = new Date();
|
|
7
|
-
const
|
|
7
|
+
const diagnostics = limitDefinitionSyncDiagnostics(params.diagnostics ?? []);
|
|
8
8
|
const [row] = await db().insert(definitionSyncStates).values({
|
|
9
9
|
projectId: params.projectId,
|
|
10
10
|
sourceConnectionId: params.sourceConnectionId,
|
|
@@ -13,7 +13,7 @@ export async function markDefinitionSyncState(params) {
|
|
|
13
13
|
status: params.status,
|
|
14
14
|
lastErrorCode: params.lastErrorCode ?? null,
|
|
15
15
|
lastErrorMessage: params.lastErrorMessage ?? null,
|
|
16
|
-
warnings,
|
|
16
|
+
warnings: diagnostics,
|
|
17
17
|
startedAt: params.startedAt ?? null,
|
|
18
18
|
finishedAt: params.finishedAt ?? null,
|
|
19
19
|
updatedAt: now
|
|
@@ -28,7 +28,7 @@ export async function markDefinitionSyncState(params) {
|
|
|
28
28
|
status: params.status,
|
|
29
29
|
lastErrorCode: params.lastErrorCode ?? null,
|
|
30
30
|
lastErrorMessage: params.lastErrorMessage ?? null,
|
|
31
|
-
warnings,
|
|
31
|
+
warnings: diagnostics,
|
|
32
32
|
...params.startedAt !== undefined ? {
|
|
33
33
|
startedAt: params.startedAt
|
|
34
34
|
} : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/sync-states.ts"],"sourcesContent":["import {and, desc, eq} from 'drizzle-orm';\nimport type {\n DefinitionSyncErrorCode,\n DefinitionSyncState,\n DefinitionSyncStatus,\n
|
|
1
|
+
{"version":3,"sources":["../../src/db/sync-states.ts"],"sourcesContent":["import {and, desc, eq} from 'drizzle-orm';\nimport type {\n DefinitionSyncDiagnostic,\n DefinitionSyncErrorCode,\n DefinitionSyncState,\n DefinitionSyncStatus,\n} from '#core/entities/sync-state.js';\nimport {limitDefinitionSyncDiagnostics} from '#core/entities/sync-state.js';\nimport {db} from './db.js';\nimport {definitionSyncStates, toDefinitionSyncState} from './schema/sync-states.js';\n\nexport interface DefinitionSyncStateKey {\n projectId: string;\n sourceConnectionId: string;\n sourceExternalRepositoryId: string;\n ref: string;\n}\n\nexport interface MarkDefinitionSyncParams extends DefinitionSyncStateKey {\n status: DefinitionSyncStatus;\n lastErrorCode?: DefinitionSyncErrorCode | null | undefined;\n lastErrorMessage?: string | null | undefined;\n diagnostics?: readonly DefinitionSyncDiagnostic[] | null | undefined;\n startedAt?: Date | null | undefined;\n finishedAt?: Date | null | undefined;\n}\n\nexport async function markDefinitionSyncState(\n params: MarkDefinitionSyncParams,\n): Promise<DefinitionSyncState> {\n const now = new Date();\n const diagnostics = limitDefinitionSyncDiagnostics(params.diagnostics ?? []);\n const [row] = await db()\n .insert(definitionSyncStates)\n .values({\n projectId: params.projectId,\n sourceConnectionId: params.sourceConnectionId,\n sourceExternalRepositoryId: params.sourceExternalRepositoryId,\n ref: params.ref,\n status: params.status,\n lastErrorCode: params.lastErrorCode ?? null,\n lastErrorMessage: params.lastErrorMessage ?? null,\n warnings: diagnostics,\n startedAt: params.startedAt ?? null,\n finishedAt: params.finishedAt ?? null,\n updatedAt: now,\n })\n .onConflictDoUpdate({\n target: [\n definitionSyncStates.projectId,\n definitionSyncStates.sourceConnectionId,\n definitionSyncStates.sourceExternalRepositoryId,\n definitionSyncStates.ref,\n ],\n set: {\n status: params.status,\n lastErrorCode: params.lastErrorCode ?? null,\n lastErrorMessage: params.lastErrorMessage ?? null,\n warnings: diagnostics,\n ...(params.startedAt !== undefined ? {startedAt: params.startedAt} : {}),\n ...(params.finishedAt !== undefined ? {finishedAt: params.finishedAt} : {}),\n updatedAt: now,\n },\n })\n .returning();\n\n if (!row) throw new Error('Definition sync state upsert returned no rows');\n return toDefinitionSyncState(row);\n}\n\nexport async function getLatestDefinitionSyncState(params: {\n projectId: string;\n sourceConnectionId: string;\n sourceExternalRepositoryId: string;\n}): Promise<DefinitionSyncState | undefined> {\n const rows = await db()\n .select()\n .from(definitionSyncStates)\n .where(\n and(\n eq(definitionSyncStates.projectId, params.projectId),\n eq(definitionSyncStates.sourceConnectionId, params.sourceConnectionId),\n eq(definitionSyncStates.sourceExternalRepositoryId, params.sourceExternalRepositoryId),\n ),\n )\n .orderBy(desc(definitionSyncStates.updatedAt))\n .limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toDefinitionSyncState(row);\n}\n"],"names":["and","desc","eq","limitDefinitionSyncDiagnostics","db","definitionSyncStates","toDefinitionSyncState","markDefinitionSyncState","params","now","Date","diagnostics","row","insert","values","projectId","sourceConnectionId","sourceExternalRepositoryId","ref","status","lastErrorCode","lastErrorMessage","warnings","startedAt","finishedAt","updatedAt","onConflictDoUpdate","target","set","undefined","returning","Error","getLatestDefinitionSyncState","rows","select","from","where","orderBy","limit"],"mappings":"AAAA,SAAQA,GAAG,EAAEC,IAAI,EAAEC,EAAE,QAAO,cAAc;AAO1C,SAAQC,8BAA8B,QAAO,+BAA+B;AAC5E,SAAQC,EAAE,QAAO,UAAU;AAC3B,SAAQC,oBAAoB,EAAEC,qBAAqB,QAAO,0BAA0B;AAkBpF,OAAO,eAAeC,wBACpBC,MAAgC;IAEhC,MAAMC,MAAM,IAAIC;IAChB,MAAMC,cAAcR,+BAA+BK,OAAOG,WAAW,IAAI,EAAE;IAC3E,MAAM,CAACC,IAAI,GAAG,MAAMR,KACjBS,MAAM,CAACR,sBACPS,MAAM,CAAC;QACNC,WAAWP,OAAOO,SAAS;QAC3BC,oBAAoBR,OAAOQ,kBAAkB;QAC7CC,4BAA4BT,OAAOS,0BAA0B;QAC7DC,KAAKV,OAAOU,GAAG;QACfC,QAAQX,OAAOW,MAAM;QACrBC,eAAeZ,OAAOY,aAAa,IAAI;QACvCC,kBAAkBb,OAAOa,gBAAgB,IAAI;QAC7CC,UAAUX;QACVY,WAAWf,OAAOe,SAAS,IAAI;QAC/BC,YAAYhB,OAAOgB,UAAU,IAAI;QACjCC,WAAWhB;IACb,GACCiB,kBAAkB,CAAC;QAClBC,QAAQ;YACNtB,qBAAqBU,SAAS;YAC9BV,qBAAqBW,kBAAkB;YACvCX,qBAAqBY,0BAA0B;YAC/CZ,qBAAqBa,GAAG;SACzB;QACDU,KAAK;YACHT,QAAQX,OAAOW,MAAM;YACrBC,eAAeZ,OAAOY,aAAa,IAAI;YACvCC,kBAAkBb,OAAOa,gBAAgB,IAAI;YAC7CC,UAAUX;YACV,GAAIH,OAAOe,SAAS,KAAKM,YAAY;gBAACN,WAAWf,OAAOe,SAAS;YAAA,IAAI,CAAC,CAAC;YACvE,GAAIf,OAAOgB,UAAU,KAAKK,YAAY;gBAACL,YAAYhB,OAAOgB,UAAU;YAAA,IAAI,CAAC,CAAC;YAC1EC,WAAWhB;QACb;IACF,GACCqB,SAAS;IAEZ,IAAI,CAAClB,KAAK,MAAM,IAAImB,MAAM;IAC1B,OAAOzB,sBAAsBM;AAC/B;AAEA,OAAO,eAAeoB,6BAA6BxB,MAIlD;IACC,MAAMyB,OAAO,MAAM7B,KAChB8B,MAAM,GACNC,IAAI,CAAC9B,sBACL+B,KAAK,CACJpC,IACEE,GAAGG,qBAAqBU,SAAS,EAAEP,OAAOO,SAAS,GACnDb,GAAGG,qBAAqBW,kBAAkB,EAAER,OAAOQ,kBAAkB,GACrEd,GAAGG,qBAAqBY,0BAA0B,EAAET,OAAOS,0BAA0B,IAGxFoB,OAAO,CAACpC,KAAKI,qBAAqBoB,SAAS,GAC3Ca,KAAK,CAAC;IAET,MAAM1B,MAAMqB,IAAI,CAAC,EAAE;IACnB,IAAI,CAACrB,KAAK,OAAOiB;IACjB,OAAOvB,sBAAsBM;AAC/B"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAUhF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAM7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAC,KAAK,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAc3E,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,EACb,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAStF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,YAAY,EAAE,wBAAwB,CAAC;CACxC;AAED,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,KAAK,EACL,YAAY,GACb,EAAE,8BAA8B,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAUhF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAM7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAC,KAAK,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAc3E,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,EACb,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAStF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,YAAY,EAAE,wBAAwB,CAAC;CACxC;AAED,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,KAAK,EACL,YAAY,GACb,EAAE,8BAA8B,GAAG,aAAa,CAqChD"}
|
package/dist/index.js
CHANGED
|
@@ -61,7 +61,11 @@ export function createDefinitionsModule({ projects, agent, integrations }) {
|
|
|
61
61
|
}
|
|
62
62
|
],
|
|
63
63
|
interModulePresentations: [
|
|
64
|
-
createDefinitionsInterModulePresentation(
|
|
64
|
+
createDefinitionsInterModulePresentation({
|
|
65
|
+
projects,
|
|
66
|
+
agent,
|
|
67
|
+
integrations
|
|
68
|
+
})
|
|
65
69
|
]
|
|
66
70
|
};
|
|
67
71
|
}
|