Merge commit '36c66dd290d3ce6eb1ccd310d0c658d4a32bb8eb' as 'repos/effect'

This commit is contained in:
-Puter
2026-07-19 03:25:10 +05:30
parent dd1071cc10
commit 2daf979036
2214 changed files with 673090 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
import { MssqlClient } from "@effect/sql-mssql"
import { describe, expect, it } from "@effect/vitest"
import { Effect } from "effect"
import * as Statement from "effect/unstable/sql/Statement"
const sql = Statement.make(Effect.void as any, MssqlClient.makeCompiler(), [], undefined)
describe("mssql", () => {
it("insert helper", () => {
const [query, params] = sql`INSERT INTO ${sql("people")} ${sql.insert({ name: "Tim", age: 10 })}`.compile()
expect(query).toEqual(
`INSERT INTO [people] ([name],[age]) VALUES (@1,@2)`
)
expect(params).toEqual(["Tim", 10])
})
it("insert helper returning", () => {
const [query, params] = sql`INSERT INTO ${sql("people")} ${sql.insert({ name: "Tim", age: 10 }).returning("*")}`
.compile()
expect(query).toEqual(
`INSERT INTO [people] ([name],[age]) OUTPUT INSERTED.* VALUES (@1,@2)`
)
expect(params).toEqual(["Tim", 10])
})
it("update helper", () => {
const [query, params] = sql`UPDATE people SET name = data.name ${
sql.updateValues(
[{ name: "Tim" }, { name: "John" }],
"data"
)
}`.compile()
expect(query).toEqual(
`UPDATE people SET name = data.name FROM (values (@1),(@2)) AS data([name])`
)
expect(params).toEqual(["Tim", "John"])
})
it("update helper returning", () => {
const [query, params] = sql`UPDATE people SET name = data.name ${
sql.updateValues(
[{ name: "Tim" }, { name: "John" }],
"data"
).returning("*")
}`.compile()
expect(query).toEqual(
`UPDATE people SET name = data.name OUTPUT INSERTED.* FROM (values (@1),(@2)) AS data([name])`
)
expect(params).toEqual(["Tim", "John"])
})
it("update single helper returning", () => {
const [query, params] = sql`UPDATE people SET ${sql.update({ name: "Tim" }).returning("*")}`
.compile()
expect(query).toEqual(
`UPDATE people SET [name] = @1 OUTPUT INSERTED.*`
)
expect(params).toEqual(["Tim"])
})
it("array helper", () => {
const [query, params] = sql`SELECT * FROM ${sql("people")} WHERE id IN ${sql.in([1, 2, "string"])}`.compile()
expect(query).toEqual(`SELECT * FROM [people] WHERE id IN (@1,@2,@3)`)
expect(params).toEqual([1, 2, "string"])
})
// it("param types", () => {
// const [query, params] = sql`SELECT * FROM ${sql("people")} WHERE id = ${
// sql.param(
// MssqlTypes.BigInt,
// 1
// )
// }`.compile()
// expect(query).toEqual(`SELECT * FROM [people] WHERE id = @1`)
// expect(isCustom("MssqlParam")(params[0])).toEqual(true)
// const param = params[0] as unknown as Custom<
// "MsSqlParam",
// any,
// any,
// any
// >
// expect(param.i0).toEqual(MssqlTypes.BigInt)
// expect(param.i1).toEqual(1)
// expect(param.i2).toEqual({})
// })
it("escape [", () => {
const [query] = sql`SELECT * FROM ${sql("peo[]ple.te[st]ing")}`.compile()
expect(query).toEqual(`SELECT * FROM [peo[]]ple].[te[st]]ing]`)
})
})

View File

@@ -0,0 +1,206 @@
import { assert, describe, it } from "@effect/vitest"
import { Effect } from "effect"
import * as Reactivity from "effect/unstable/reactivity/Reactivity"
import type * as SqlError from "effect/unstable/sql/SqlError"
import { vi } from "vitest"
const state: {
connectCause: unknown
requestCauses: Array<unknown>
} = {
connectCause: null,
requestCauses: []
}
class MockRequest {
callback: (cause: unknown, rowCount: number, rows: ReadonlyArray<any>) => void
constructor(
_sql: string,
callback: (cause: unknown, rowCount: number, rows: ReadonlyArray<any>) => void
) {
this.callback = callback
}
addParameter() {
return
}
addOutputParameter() {
return
}
on() {
return
}
}
class MockConnection {
connect(callback: (cause: unknown) => void) {
callback(state.connectCause)
}
close() {
return
}
on() {
return
}
beginTransaction(callback: (cause: unknown) => void) {
callback(null)
}
commitTransaction(callback: (cause: unknown) => void) {
callback(null)
}
saveTransaction(callback: (cause: unknown) => void) {
callback(null)
}
rollbackTransaction(callback: (cause: unknown) => void) {
callback(null)
}
cancel() {
return
}
execSql(request: MockRequest) {
const cause = state.requestCauses.length > 0 ? state.requestCauses.shift() : null
request.callback(cause, 0, [])
}
callProcedure(request: MockRequest) {
this.execSql(request)
}
}
vi.mock("tedious", () => ({
Connection: MockConnection,
Request: MockRequest,
TYPES: {
VarChar: {},
Int: {},
BigInt: {},
Bit: {},
DateTime: {},
VarBinary: {}
}
}))
const queryFailureReason = (cause: unknown) =>
Effect.gen(function*() {
state.connectCause = null
state.requestCauses = [null, cause]
const { MssqlClient } = yield* Effect.promise(() => import("@effect/sql-mssql"))
const client = yield* MssqlClient.make({ server: "localhost" })
const error = yield* Effect.flip(client`SELECT 1`)
return error.reason
}).pipe(
Effect.scoped,
Effect.provide(Reactivity.layer)
)
const queryFailureReasonTag = (number: number) => Effect.map(queryFailureReason({ number }), (reason) => reason._tag)
const assertUniqueViolation = (reason: SqlError.SqlErrorReason, constraint: string) => {
assert.strictEqual(reason._tag, "UniqueViolation")
if (reason._tag === "UniqueViolation") {
assert.strictEqual(reason.constraint, constraint)
}
}
describe("MssqlClient SqlError classification", () => {
it.effect("maps representative error numbers to reasons", () =>
Effect.gen(function*() {
const cases = [
[233, "ConnectionError"],
[18456, "AuthenticationError"],
[229, "AuthorizationError"],
[102, "SqlSyntaxError"],
[2601, "UniqueViolation"],
[2627, "UniqueViolation"],
[547, "ConstraintError"],
[1205, "DeadlockError"],
[3960, "SerializationError"],
[1222, "LockTimeoutError"]
] as const
for (const [number, expectedTag] of cases) {
const tag = yield* queryFailureReasonTag(number)
assert.strictEqual(tag, expectedTag)
}
}))
it.effect("falls back to UnknownError for unmapped error numbers", () =>
Effect.gen(function*() {
const tag = yield* queryFailureReasonTag(99999)
assert.strictEqual(tag, "UnknownError")
}))
it.effect("classifies duplicate-key number 2601 as UniqueViolation and extracts the unique index", () =>
Effect.gen(function*() {
const reason = yield* queryFailureReason({
number: 2601,
message:
"Cannot insert duplicate key row in object 'dbo.Users' with unique index 'IX_Users_Email'. The duplicate key value is (user@example.com)."
})
assertUniqueViolation(reason, "IX_Users_Email")
}))
it.effect("classifies constraint number 2627 as UniqueViolation and extracts the constraint", () =>
Effect.gen(function*() {
const reason = yield* queryFailureReason({
number: 2627,
message:
"Violation of UNIQUE KEY constraint 'UQ_Users_Email'. Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is (user@example.com)."
})
assertUniqueViolation(reason, "UQ_Users_Email")
}))
it.effect("prefers structured constraints and trims whitespace", () =>
Effect.gen(function*() {
const reason = yield* queryFailureReason({
number: 2601,
constraint: " IX_Structured_Email ",
message:
"Cannot insert duplicate key row in object 'dbo.Users' with unique index 'IX_Users_Email'. The duplicate key value is (user@example.com)."
})
assertUniqueViolation(reason, "IX_Structured_Email")
}))
it.effect("uses unknown for blank, missing, malformed, or non-string unique violation metadata", () =>
Effect.gen(function*() {
const missing = yield* queryFailureReason({ number: 2601 })
assertUniqueViolation(missing, "unknown")
const blank = yield* queryFailureReason({
number: 2627,
constraint: " ",
message: "Violation of UNIQUE KEY constraint ' '. Cannot insert duplicate key in object 'dbo.Users'."
})
assertUniqueViolation(blank, "unknown")
const malformed = yield* queryFailureReason({
number: 2601,
message: "Cannot insert duplicate key row in object 'dbo.Users'."
})
assertUniqueViolation(malformed, "unknown")
const nonString = yield* queryFailureReason({
number: 2627,
constraint: 2627,
message: { text: "Violation of UNIQUE KEY constraint 'UQ_Users_Email'." }
})
assertUniqueViolation(nonString, "unknown")
}))
it.effect("keeps non-unique constraint number 547 classified as ConstraintError", () =>
Effect.gen(function*() {
const tag = yield* queryFailureReasonTag(547)
assert.strictEqual(tag, "ConstraintError")
}))
})