{"_id":"@aletso/effect-route","_rev":"3-6d28da9f78581e2f67c4b57eca214839","name":"@aletso/effect-route","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.2":{"name":"@aletso/effect-route","version":"0.1.2","license":"MIT","_id":"@aletso/effect-route@0.1.2","maintainers":[{"name":"gbartman","email":"g.bartman@aletso.com"}],"dist":{"shasum":"01e04f9851c0e06d55889b12a597f7e42d38ba3b","tarball":"https://registry.npmjs.org/@aletso/effect-route/-/effect-route-0.1.2.tgz","fileCount":11,"integrity":"sha512-BUWtY756A+IXChZAZwPZrO4d4sXB5/4LkXIzbtwmnGDDovU42noz9t6SttuX9JdKd7O57ILvaSEGiRlcg+lm1w==","signatures":[{"sig":"MEQCICd33V59nrMI9GwLcCR3lzvc6IbQqMaRIrxnEKpJDoOWAiBVegkolaeG571mXDm8I4mvf34hfH4rvWt5slFPUmFxOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43898},"type":"module","_from":"file:aletso-effect-route-0.1.2.tgz","exports":{"./*":"./dist/*.js"},"scripts":{"build":"tsc -b tsconfig.json","type-check":"tsc -b tsconfig.json"},"_npmUser":{"name":"gbartman","email":"g.bartman@aletso.com"},"_resolved":"/tmp/6515199dec3e0ab675bab99dfabf2588/aletso-effect-route-0.1.2.tgz","_integrity":"sha512-BUWtY756A+IXChZAZwPZrO4d4sXB5/4LkXIzbtwmnGDDovU42noz9t6SttuX9JdKd7O57ILvaSEGiRlcg+lm1w==","_npmVersion":"11.12.1","description":"Effect-native RPC route contract definitions","directories":{},"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@effect/language-service":"^0.62.3"},"peerDependencies":{"effect":"^3.19.12","@effect/rpc":"^0.72.2"},"_npmOperationalInternal":{"tmp":"tmp/effect-route_0.1.2_1776189554328_0.5872901944637159","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@aletso/effect-route","version":"0.1.3","license":"MIT","_id":"@aletso/effect-route@0.1.3","maintainers":[{"name":"gbartman","email":"g.bartman@aletso.com"}],"dist":{"shasum":"8116c2a2cfce9629c0be874d3cb5a260b92f46ac","tarball":"https://registry.npmjs.org/@aletso/effect-route/-/effect-route-0.1.3.tgz","fileCount":12,"integrity":"sha512-34Jt7KmXZFuUMqAB6ybd/H7woP/iColTfVhM9fccKpZHvy/LEevewwVbt2o6VbK5ZGo6NZ8UkPRyBWLpHKUVMg==","signatures":[{"sig":"MEYCIQDSInBnjmJ3ndI/MRO30IBv7HNTlOkG0z3wzNQ723o5AAIhAK5mqndgGJAPt0/s46YShIXXcZbGXq3A0pRvKAnjIsB1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47683},"type":"module","_from":"file:aletso-effect-route-0.1.3.tgz","exports":{"./*":"./dist/*.js"},"scripts":{"build":"tsc -b tsconfig.json","type-check":"tsc -b tsconfig.json"},"_npmUser":{"name":"gbartman","email":"g.bartman@aletso.com"},"_resolved":"/tmp/332ae2122c0fbc8ccf0a8d2fe2119876/aletso-effect-route-0.1.3.tgz","_integrity":"sha512-34Jt7KmXZFuUMqAB6ybd/H7woP/iColTfVhM9fccKpZHvy/LEevewwVbt2o6VbK5ZGo6NZ8UkPRyBWLpHKUVMg==","_npmVersion":"11.12.1","description":"Effect-native RPC route contract definitions","directories":{},"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@effect/language-service":"^0.62.3"},"peerDependencies":{"effect":"^3.19.12","@effect/rpc":"^0.72.2"},"_npmOperationalInternal":{"tmp":"tmp/effect-route_0.1.3_1776190711400_0.6644410803487428","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@aletso/effect-route","version":"0.1.4","type":"module","description":"Effect-native RPC route contract definitions","license":"MIT","exports":{"./*":"./dist/*.js"},"publishConfig":{"access":"public"},"peerDependencies":{"@effect/rpc":"^0.72.2","effect":"^3.19.12"},"devDependencies":{"@effect/language-service":"^0.62.3","typescript":"^5.9.3"},"scripts":{"build":"tsc -b tsconfig.json","type-check":"tsc -b tsconfig.json"},"_id":"@aletso/effect-route@0.1.4","_integrity":"sha512-fJOXm9uHtcMWBPhjKQQx8myW6dLI5lOL7V/rKvx090q5xOL84h+8oTvs/+7wyxL7QQOO4R0kZFof24d/zRM85w==","_resolved":"/tmp/51ec7aab282f1f907b637595fc9e141c/aletso-effect-route-0.1.4.tgz","_from":"file:aletso-effect-route-0.1.4.tgz","_nodeVersion":"24.11.1","_npmVersion":"11.12.1","dist":{"integrity":"sha512-fJOXm9uHtcMWBPhjKQQx8myW6dLI5lOL7V/rKvx090q5xOL84h+8oTvs/+7wyxL7QQOO4R0kZFof24d/zRM85w==","shasum":"3226465a7269cfabb405152dbf021270414b0ad9","tarball":"https://registry.npmjs.org/@aletso/effect-route/-/effect-route-0.1.4.tgz","fileCount":12,"unpackedSize":49296,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDNMcz+3Jg8Kg1udNLkkWnwDAacfzQn1Bl894iB52eajwIgXWqpQImwAaPt4uUTRMnuP67HZ7ukcUCtEibSMm/tFv4="}]},"_npmUser":{"name":"gbartman","email":"g.bartman@aletso.com"},"directories":{},"maintainers":[{"name":"gbartman","email":"g.bartman@aletso.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/effect-route_0.1.4_1776526592077_0.9453368140416261"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T17:59:14.180Z","modified":"2026-04-18T15:36:32.351Z","0.1.2":"2026-04-14T17:59:14.468Z","0.1.3":"2026-04-14T18:18:31.538Z","0.1.4":"2026-04-18T15:36:32.236Z"},"license":"MIT","description":"Effect-native RPC route contract definitions","maintainers":[{"name":"gbartman","email":"g.bartman@aletso.com"}],"readme":"# @aletso/effect-route\n\nTyped route contracts for Effect RPC.\n\nUse this package to define payload, success, and error schemas once, group routes with a prefix, and expose a typed `RpcGroup` for server wiring.\n\n## Install\n\n```bash\npnpm add @aletso/effect-route @effect/rpc effect\n```\n\n## Define routes with schemas and middleware\n\nExample domain contract setup.\n\n```ts\nimport * as Route from \"@aletso/effect-route/Route\";\nimport * as RouteGroup from \"@aletso/effect-route/RouteGroup\";\nimport * as Schema from \"effect/Schema\";\nimport { AuthMiddleware } from \"../Policy\";\n\nexport const SurveyListItem = Schema.Struct({\n  id: Schema.String,\n  title: Schema.String,\n});\n\nexport const SurveyPublished = Schema.Struct({\n  id: Schema.String,\n  title: Schema.String,\n  status: Schema.Literal(\"published\"),\n});\n\nexport class SurveyNotFound extends Schema.TaggedError<SurveyNotFound>()(\n  \"SurveyNotFound\",\n  {\n    id: Schema.String,\n  },\n) {}\n\nexport class Group extends RouteGroup.make(\n  Route.make(\"find_many\", {\n    success: Schema.Array(SurveyListItem),\n  }).middleware(AuthMiddleware),\n\n  Route.make(\"find_by_id\", {\n    success: SurveyListItem,\n    error: SurveyNotFound,\n    payload: Schema.Struct({ id: Schema.String }),\n  }).middleware(AuthMiddleware),\n\n  Route.make(\"publish\", {\n    success: SurveyPublished,\n    error: SurveyNotFound,\n    payload: Schema.Struct({ id: Schema.String }),\n  }).middleware(AuthMiddleware),\n).prefix(\"survey_\") {}\n```\n\nAfter prefixing:\n\n- `Group.find_by_id._tag` is `survey_find_by_id`\n- `Group.find_by_id.key` is `@aletso/effect-route/Route/survey_find_by_id`\n\n## Merge route groups into one RPC domain\n\nExample domain-level RpcGroup merge.\n\n```ts\nimport * as RpcGroup from \"@effect/rpc/RpcGroup\";\nimport * as Health from \"./api/Health\";\nimport * as Identity from \"./api/Identity\";\nimport * as Survey from \"./api/Survey\";\n\nexport class DomainRpc extends RpcGroup.make().merge(\n  Health.Group.RpcGroup,\n  Identity.Group.RpcGroup,\n  Survey.Group.RpcGroup,\n) {}\n```\n\n## Bind handlers on the server\n\n`RouteGroup.RpcGroup` gives a ready to use Effect RPC group.\n\n```ts\nimport { Group as SurveyRoutes } from \"../domain/api/Survey\";\nimport { SurveyService } from \"../server/public/survey/service\";\nimport * as Effect from \"effect/Effect\";\n\nexport const SurveyRpcLive = SurveyRoutes.RpcGroup.toLayer({\n  survey_find_many: () => Effect.flatMap(SurveyService, (s) => s.findMany),\n  survey_find_by_id: ({ id }) =>\n    Effect.flatMap(SurveyService, (s) => s.findById(id)),\n  survey_publish: ({ id }) =>\n    Effect.flatMap(SurveyService, (s) => s.publish(id)),\n});\n```\n\n## Use the same contracts in the data layer\n\nThese contracts are designed to be consumed by `@aletso/atom-query`.\n\n```ts\nimport * as Query from \"@aletso/atom-query/Query\";\nimport { Group as SurveyRoutes } from \"../domain/api/Survey\";\n\nexport const surveyFindById = Query.familyFromRoute(SurveyRoutes.find_by_id, {\n  effect: ({ id }) => api.findById(id),\n  runtime,\n});\n```\n\n## API surface\n\n- `Route.make(...)`\n- `route.middleware(...)`\n- `route.prefix(...)`\n- `RouteGroup.make(...)`\n- `routeGroup.prefix(...)`\n- `routeGroup.merge(...)`\n- `routeGroup.middleware(...)`\n- `routeGroup.RpcGroup`\n","readmeFilename":"README.md"}