Skip to content

Commit

Permalink
handle ExitFromSelf, Exit, CauseFromSelf, Cause
Browse files Browse the repository at this point in the history
  • Loading branch information
gcanti committed Jul 23, 2024
1 parent 0a01c5e commit 423dd35
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 0 deletions.
41 changes: 41 additions & 0 deletions public/codemods/schema-0.69.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,47 @@ export default function transformer(file: cs.FileInfo, api: cs.API) {
"CauseDefectUnknown",
"Defect",
)

// ---------------------------------------------------------------
// ExitFromSelf, Exit, CauseFromSelf, Cause
// ---------------------------------------------------------------

const addDefect = (api: string) =>
root.find(j.CallExpression, {
callee: {
type: "MemberExpression",
object: { name: schemaNamespace },
property: { name: api },
},
}).forEach(path => {
const args = path.value.arguments
if (args.length === 1 && args[0].type === "ObjectExpression") {
const properties = args[0].properties
if (
!properties.some(prop => {
return prop.type === "ObjectProperty"
&& prop.key.type === "Identifier"
&& prop.key.name === "defect"
})
) {
properties.push(
j.property(
"init",
j.identifier("defect"),
j.memberExpression(
j.identifier(schemaNamespace),
j.identifier("Defect"),
),
),
)
}
}
})

addDefect("ExitFromSelf")
addDefect("Exit")
addDefect("CauseFromSelf")
addDefect("Cause")
}

return root.toSource()
Expand Down
89 changes: 89 additions & 0 deletions test/schema-0.69.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -259,3 +259,92 @@ const schema = Schema.CauseDefectUnknown`,
const schema = Schema.Defect`,
)
})

describe("ExitFromSelf", () => {
expectTransformation(
"explicit defect",
`import { Schema as S } from "@effect/schema"
const schema = S.ExitFromSelf({ failure: S.String, success: S.Number, defect: S.Unknown })`,
`import { Schema as S } from "@effect/schema"
const schema = S.ExitFromSelf({ failure: S.String, success: S.Number, defect: S.Unknown })`,
)
expectTransformation(
"explicit defect with CauseDefectUnknown",
`import { Schema as S } from "@effect/schema"
const schema = S.ExitFromSelf({ failure: S.String, success: S.Number, defect: S.CauseDefectUnknown })`,
`import { Schema as S } from "@effect/schema"
const schema = S.ExitFromSelf({ failure: S.String, success: S.Number, defect: S.Defect })`,
)
expectTransformation(
"implicit defect",
`import { Schema as S } from "@effect/schema"
const schema = S.ExitFromSelf({ failure: S.String, success: S.Number })`,
`import { Schema as S } from "@effect/schema"
const schema = S.ExitFromSelf({
failure: S.String,
success: S.Number,
defect: S.Defect
})`,
)
})

describe("Exit", () => {
expectTransformation(
"explicit defect",
`import { Schema as S } from "@effect/schema"
const schema = S.Exit({ failure: S.String, success: S.Number, defect: S.Unknown })`,
`import { Schema as S } from "@effect/schema"
const schema = S.Exit({ failure: S.String, success: S.Number, defect: S.Unknown })`,
)
expectTransformation(
"implicit defect",
`import { Schema as S } from "@effect/schema"
const schema = S.Exit({ failure: S.String, success: S.Number })`,
`import { Schema as S } from "@effect/schema"
const schema = S.Exit({
failure: S.String,
success: S.Number,
defect: S.Defect
})`,
)
})

describe("CauseFromSelf", () => {
expectTransformation(
"explicit defect",
`import { Schema as S } from "@effect/schema"
const schema = S.CauseFromSelf({ error: S.NumberFromString, defect: S.Unknown })`,
`import { Schema as S } from "@effect/schema"
const schema = S.CauseFromSelf({ error: S.NumberFromString, defect: S.Unknown })`,
)
expectTransformation(
"implicit defect",
`import { Schema as S } from "@effect/schema"
const schema = S.CauseFromSelf({ error: S.NumberFromString })`,
`import { Schema as S } from "@effect/schema"
const schema = S.CauseFromSelf({
error: S.NumberFromString,
defect: S.Defect
})`,
)
})

describe("Cause", () => {
expectTransformation(
"explicit defect",
`import { Schema as S } from "@effect/schema"
const schema = S.Cause({ error: S.NumberFromString, defect: S.Unknown })`,
`import { Schema as S } from "@effect/schema"
const schema = S.Cause({ error: S.NumberFromString, defect: S.Unknown })`,
)
expectTransformation(
"implicit defect",
`import { Schema as S } from "@effect/schema"
const schema = S.Cause({ error: S.NumberFromString })`,
`import { Schema as S } from "@effect/schema"
const schema = S.Cause({
error: S.NumberFromString,
defect: S.Defect
})`,
)
})

0 comments on commit 423dd35

Please sign in to comment.