[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71H8SSK9KA00VYEJ93E699Z":3,"skill-same:01M71H8SSK9KA00VYEJ93E699Z":49},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":24,"linkOnly":25,"markdownContent":26,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":13,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":34,"install":35,"resources":48},"01M71H8SSK9KA00VYEJ93E699Z","02-transformations",null,"Effect-TS 4 Schema transformations — Schema.transform, Schema.transformOrFail, and codec patterns","lambda-solver\u002Flambdabench-pro","lambda-solver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F279071046?v=4","01M71H55W2WK3PM6RRAY9JZWAJ","01M71H55WRT9XAFDAVACTCC2XP",0,"MIT","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Feffect-ts\u002Fschema\u002F02-transformations\u002FSKILL.md",[],[18,19,20,21,22,23],"02 transformations","effect","opencode","transform","schema","patterns","2026-11-10 10:12:30",false,"---\nname: 02-transformations\ndescription: Effect-TS 4 Schema transformations — Schema.transform, Schema.transformOrFail, and codec patterns\nlicense: MIT\ncompatibility: opencode\n---\n\n# Schema Transformations\n\n## Schema.transform — lossless bidirectional mapping\n\nUse when every encoded value maps cleanly to a decoded value and back.\n\n```typescript\nimport { Schema } from \"effect\";\n\n\u002F\u002F String → Number (trim + parse)\nconst NumberFromString = Schema.transform(Schema.String, Schema.Number, {\n  strict: true,\n  decode: (s) => parseFloat(s),\n  encode: (n) => String(n),\n});\n\n\u002F\u002F String → Date\nconst DateFromIso = Schema.transform(Schema.String, Schema.Date, {\n  strict: true,\n  decode: (s) => new Date(s),\n  encode: (d) => d.toISOString(),\n});\n```\n\n## Schema.transformOrFail — mapping that can fail\n\nUse when decoding may produce a validation error.\n\n```typescript\nimport { ParseResult, Schema } from \"effect\";\n\nconst PositiveNumber = Schema.transformOrFail(Schema.Number, Schema.Number, {\n  strict: true,\n  decode: (n, _options, ast) =>\n    n > 0 ? ParseResult.succeed(n) : ParseResult.fail(new ParseResult.Type(ast, n, \"must be positive\")),\n  encode: ParseResult.succeed,\n});\n```\n\n## Built-in transformations\n\n```typescript\nSchema.DateTimeUtcFromString; \u002F\u002F ISO-8601 string → DateTime.Utc\nSchema.NumberFromString; \u002F\u002F \"42\" → 42\nSchema.BooleanFromString; \u002F\u002F \"true\" → true\nSchema.BigIntFromString; \u002F\u002F \"9007199254740993\" → 9007199254740993n\nSchema.Trim; \u002F\u002F string → trimmed string\nSchema.Lowercase; \u002F\u002F string → lowercase string\nSchema.Uppercase; \u002F\u002F string → uppercase string\n```\n\n## Class with transformation\n\n```typescript\nclass UserFromRaw extends Schema.Class\u003CUserFromRaw>(\"UserFromRaw\")({\n  id: Schema.NumberFromString, \u002F\u002F wire: \"42\" → decoded: 42\n  createdAt: Schema.DateTimeUtcFromString,\n  name: Schema.Trim,\n}) {}\n```\n\n## Codec pattern — named reusable transform\n\n```typescript\n\u002F\u002F Define once\nconst JsonString = \u003CA, I, R>(schema: Schema.Schema\u003CA, I, R>) =>\n  Schema.transform(Schema.String, schema, {\n    strict: true,\n    decode: (s) => JSON.parse(s) as I,\n    encode: (a) => JSON.stringify(a),\n  });\n\n\u002F\u002F Use on any schema\nconst JsonRanking = JsonString(Ranking);\n```\n\n## Pipe transformations on struct fields\n\n```typescript\nconst UserId = Schema.String.pipe(Schema.brand(\"UserId\"), Schema.minLength(1));\n\nconst Slug = Schema.String.pipe(Schema.brand(\"Slug\"), Schema.pattern(\u002F^[a-z0-9-]+$\u002F));\n```\n\n## Optional with default\n\n```typescript\nconst ConfigSchema = Schema.Struct({\n  port: Schema.Number.pipe(Schema.optional).pipe(Schema.withDefault(() => 3000)),\n  debug: Schema.Boolean.pipe(Schema.optional).pipe(Schema.withDefault(() => false)),\n});\n```\n","# Schema Transformations\n\n## Schema.transform — lossless bidirectional mapping\n\nUse when every encoded value maps cleanly to a decoded value and back.\n\n```typescript\nimport { Schema } from \"effect\";\n\n\u002F\u002F String → Number (trim + parse)\nconst NumberFromString = Schema.transform(Schema.String, Schema.Number, {\n  strict: true,\n  decode: (s) => parseFloat(s),\n  encode: (n) => String(n),\n});\n\n\u002F\u002F String → Date\nconst DateFromIso = Schema.transform(Schema.String, Schema.Date, {\n  strict: true,\n  decode: (s) => new Date(s),\n  encode: (d) => d.toISOString(),\n});\n```\n\n## Schema.transformOrFail — mapping that can fail\n\nUse when decoding may produce a validation error.\n\n```typescript\nimport { ParseResult, Schema } from \"effect\";\n\nconst PositiveNumber = Schema.transformOrFail(Schema.Number, Schema.Number, {\n  strict: true,\n  decode: (n, _options, ast) =>\n    n > 0 ? ParseResult.succeed(n) : ParseResult.fail(new ParseResult.Type(ast, n, \"must be positive\")),\n  encode: ParseResult.succeed,\n});\n```\n\n## Built-in transformations\n\n```typescript\nSchema.DateTimeUtcFromString; \u002F\u002F ISO-8601 string → DateTime.Utc\nSchema.NumberFromString; \u002F\u002F \"42\" → 42\nSchema.BooleanFromString; \u002F\u002F \"true\" → true\nSchema.BigIntFromString; \u002F\u002F \"9007199254740993\" → 9007199254740993n\nSchema.Trim; \u002F\u002F string → trimmed string\nSchema.Lowercase; \u002F\u002F string → lowercase string\nSchema.Uppercase; \u002F\u002F string → uppercase string\n```\n\n## Class with transformation\n\n```typescript\nclass UserFromRaw extends Schema.Class\u003CUserFromRaw>(\"UserFromRaw\")({\n  id: Schema.NumberFromString, \u002F\u002F wire: \"42\" → decoded: 42\n  createdAt: Schema.DateTimeUtcFromString,\n  name: Schema.Trim,\n}) {}\n```\n\n## Codec pattern — named reusable transform\n\n```typescript\n\u002F\u002F Define once\nconst JsonString = \u003CA, I, R>(schema: Schema.Schema\u003CA, I, R>) =>\n  Schema.transform(Schema.String, schema, {\n    strict: true,\n    decode: (s) => JSON.parse(s) as I,\n    encode: (a) => JSON.stringify(a),\n  });\n\n\u002F\u002F Use on any schema\nconst JsonRanking = JsonString(Ranking);\n```\n\n## Pipe transformations on struct fields\n\n```typescript\nconst UserId = Schema.String.pipe(Schema.brand(\"UserId\"), Schema.minLength(1));\n\nconst Slug = Schema.String.pipe(Schema.brand(\"Slug\"), Schema.pattern(\u002F^[a-z0-9-]+$\u002F));\n```\n\n## Optional with default\n\n```typescript\nconst ConfigSchema = Schema.Struct({\n  port: Schema.Number.pipe(Schema.optional).pipe(Schema.withDefault(() => 3000)),\n  debug: Schema.Boolean.pipe(Schema.optional).pipe(Schema.withDefault(() => false)),\n});\n```\n",{"name":5,"license":14,"description":7,"compatibility":20},"main","816c073aaf171300af3605b06f7ec5aa7370ef0b","reference\u002Fghui\u002F.opencode\u002Fskills\u002Feffect-ts\u002Fschema\u002F02-transformations","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro","https:\u002F\u002Fgithub.com\u002Flambda-solver","2026-05-31 17:08:46",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add lambda-solver\u002Flambdabench-pro --skill 02-transformations",{"tool":41,"command":42},"bunx","bunx skills add lambda-solver\u002Flambdabench-pro --skill 02-transformations",{"tool":44,"command":45},"pnpm","pnpm dlx skills add lambda-solver\u002Flambdabench-pro --skill 02-transformations","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Feffect-ts\u002Fschema\u002F02-transformations\u002FSKILL.md",true,[],[50,81,102,121,142,160],{"skillNo":51,"name":52,"nameZh":6,"description":53,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":61,"publishedAt":24},"01M71H9FNA5D6Y4ANXD18Z1Z3X","tmux-workflow","Development workflow with tmux — run dev servers, Storybook, and background processes in persistent sessions with live logs, while keeping OpenCode free for chat","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Ftmux\u002FSKILL.md",[56],{"categoryNo":57,"categoryName":58,"taxonomyType":59,"taxonomyTypeDesc":60},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[62,63,64,65,66,67,68,69,70,71,72,20,73,74,75,76,77,78,79,80],"tmux","workflow","tmux workflow","chat","dev servers","background","processes","storybook","live","servers","run","with","logs","development workflow","free","dev","sessions","for","development",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":90,"publishedAt":24},"01M71H9DQJDAJVZX37NDN99D3P","04-anti-patterns","React anti-patterns to avoid — manual JSX repetition, useEffect misuse, reference instability, prop drilling, conditional hooks, and common performance traps","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fpatterns\u002F04-anti-patterns\u002FSKILL.md",[87],{"categoryNo":88,"categoryName":89,"taxonomyType":59,"taxonomyTypeDesc":60},"01JBSEEDCAT000000000000009","前端开发",[23,91,92,93,94,95,96,97,98,99,100,20,101],"anti patterns","04 anti patterns","common","jsx","reference","conditional","hooks","manual","performance","anti-patterns","react",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":109,"publishedAt":24},"01M71H9BXF511W2R3B73S5P9ZN","03-state-management","React state management patterns — lifting state, colocation, URL state, server state with TanStack Query, local state with useState\u002FuseReducer","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fpatterns\u002F03-state-management\u002FSKILL.md",[108],{"categoryNo":88,"categoryName":89,"taxonomyType":59,"taxonomyTypeDesc":60},[110,111,112,113,101,114,23,115,116,117,118,20,119,73,120],"management","state management","state","03 state management","query","URL","tanstack","react state management","local","server","tanstack query",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":128,"publishedAt":24},"01M71H9AAGVWMYQ4NG82QPYCTE","02-component-composition","React component composition patterns — render props, compound components, list rendering with map, slot patterns, and layout primitives","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fpatterns\u002F02-component-composition\u002FSKILL.md",[127],{"categoryNo":88,"categoryName":89,"taxonomyType":59,"taxonomyTypeDesc":60},[129,130,131,20,73,132,133,101,134,23,135,136,137,138,139,140,141],"02 component composition","component","Composition","compound","components","primitives","composition patterns","list","map","rendering","render","react component","layout",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":149,"publishedAt":24},"01M71H98RDXRQZDR496SRD906M","01-fp-style","React functional programming style — pure components, hooks conventions, Effect Atom integration, and Tailwind patterns","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fpatterns\u002F01-fp-style\u002FSKILL.md",[148],{"categoryNo":88,"categoryName":89,"taxonomyType":59,"taxonomyTypeDesc":60},[150,151,152,23,153,154,20,155,101,156,133,97,157,158,159,19],"01 fp style","style","atom","conventions","integration","functional","programming","Tailwind","tailwind patterns","functional programming",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":167,"publishedAt":24},"01M71H95PYGAWBS5C8KN0C4WGT","react-animation","React animation with react\u002Fmotion (Framer Motion) — declarative animations, gestures, layout animations, and performance best practices","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fanimation\u002FSKILL.md",[166],{"categoryNo":88,"categoryName":89,"taxonomyType":59,"taxonomyTypeDesc":60},[101,168,169,99,170,20,141,171,172,73,173,174,175,176],"react animation","Animation","framer motion","motion","best practices","framer","gestures","animations","declarative"]