New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@orpc/contract

Package Overview
Dependencies
Maintainers
0
Versions
228
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@orpc/contract - npm Package Compare versions

Comparing version 0.0.0-next.331b26b to 0.0.0-next.370978b

dist/src/builder-variants.d.ts

321

dist/index.js

@@ -0,4 +1,20 @@

// src/error.ts
var ValidationError = class extends Error {
issues;
constructor(options) {
super(options.message, options);
this.issues = options.issues;
}
};
function mergeErrorMap(errorMap1, errorMap2) {
return { ...errorMap1, ...errorMap2 };
}
// src/meta.ts
function mergeMeta(meta1, meta2) {
return { ...meta1, ...meta2 };
}
// src/procedure.ts
var ContractProcedure = class {
"~type" = "ContractProcedure";
"~orpc";

@@ -9,2 +25,5 @@ constructor(def) {

}
if (Object.values(def.errorMap).some((val) => val && val.status && (val.status < 400 || val.status > 599))) {
throw new Error("[ContractProcedure] The error status code must be in the 400-599 range.");
}
this["~orpc"] = def;

@@ -17,136 +36,136 @@ }

}
return (typeof item === "object" || typeof item === "function") && item !== null && "~type" in item && item["~type"] === "ContractProcedure" && "~orpc" in item && typeof item["~orpc"] === "object" && item["~orpc"] !== null && "InputSchema" in item["~orpc"] && "OutputSchema" in item["~orpc"];
return (typeof item === "object" || typeof item === "function") && item !== null && "~orpc" in item && typeof item["~orpc"] === "object" && item["~orpc"] !== null && "inputSchema" in item["~orpc"] && "outputSchema" in item["~orpc"] && "errorMap" in item["~orpc"] && "route" in item["~orpc"] && "meta" in item["~orpc"];
}
// src/procedure-decorated.ts
var DecoratedContractProcedure = class _DecoratedContractProcedure extends ContractProcedure {
static decorate(procedure) {
if (procedure instanceof _DecoratedContractProcedure) {
return procedure;
}
return new _DecoratedContractProcedure(procedure["~orpc"]);
// src/route.ts
function mergeRoute(a, b) {
return { ...a, ...b };
}
function prefixRoute(route, prefix) {
if (!route.path) {
return route;
}
route(route) {
return new _DecoratedContractProcedure({
return {
...route,
path: `${prefix}${route.path}`
};
}
function unshiftTagRoute(route, tags) {
return {
...route,
tags: [...tags, ...route.tags ?? []]
};
}
function mergePrefix(a, b) {
return a ? `${a}${b}` : b;
}
function mergeTags(a, b) {
return a ? [...a, ...b] : b;
}
function adaptRoute(route, options) {
let router = route;
if (options.prefix) {
router = prefixRoute(router, options.prefix);
}
if (options.tags) {
router = unshiftTagRoute(router, options.tags);
}
return router;
}
// src/router.ts
function adaptContractRouter(contract, options) {
if (isContractProcedure(contract)) {
const adapted2 = new ContractProcedure({
...contract["~orpc"],
errorMap: mergeErrorMap(options.errorMap, contract["~orpc"].errorMap),
route: adaptRoute(contract["~orpc"].route, options)
});
return adapted2;
}
const adapted = {};
for (const key in contract) {
adapted[key] = adaptContractRouter(contract[key], options);
}
return adapted;
}
// src/builder.ts
var ContractBuilder = class _ContractBuilder extends ContractProcedure {
constructor(def) {
super(def);
this["~orpc"].prefix = def.prefix;
this["~orpc"].tags = def.tags;
}
/**
* Reset initial meta
*/
$meta(initialMeta) {
return new _ContractBuilder({
...this["~orpc"],
route: {
...this["~orpc"].route,
...route
}
meta: initialMeta
});
}
prefix(prefix) {
return new _DecoratedContractProcedure({
/**
* Reset initial route
*/
$route(initialRoute) {
return new _ContractBuilder({
...this["~orpc"],
...this["~orpc"].route?.path ? {
route: {
...this["~orpc"].route,
path: `${prefix}${this["~orpc"].route.path}`
}
} : void 0
route: initialRoute
});
}
unshiftTag(...tags) {
return new _DecoratedContractProcedure({
errors(errors) {
return new _ContractBuilder({
...this["~orpc"],
route: {
...this["~orpc"].route,
tags: [
...tags,
...this["~orpc"].route?.tags?.filter((tag) => !tags.includes(tag)) ?? []
]
}
errorMap: mergeErrorMap(this["~orpc"].errorMap, errors)
});
}
input(schema, example) {
return new _DecoratedContractProcedure({
meta(meta) {
return new _ContractBuilder({
...this["~orpc"],
InputSchema: schema,
inputExample: example
meta: mergeMeta(this["~orpc"].meta, meta)
});
}
output(schema, example) {
return new _DecoratedContractProcedure({
route(route) {
return new _ContractBuilder({
...this["~orpc"],
OutputSchema: schema,
outputExample: example
route: mergeRoute(this["~orpc"].route, route)
});
}
};
// src/router-builder.ts
var ContractRouterBuilder = class _ContractRouterBuilder {
"~type" = "ContractProcedure";
"~orpc";
constructor(def) {
this["~orpc"] = def;
}
prefix(prefix) {
return new _ContractRouterBuilder({
input(schema) {
return new _ContractBuilder({
...this["~orpc"],
prefix: `${this["~orpc"].prefix ?? ""}${prefix}`
inputSchema: schema
});
}
tag(...tags) {
return new _ContractRouterBuilder({
output(schema) {
return new _ContractBuilder({
...this["~orpc"],
tags: [...this["~orpc"].tags ?? [], ...tags]
outputSchema: schema
});
}
router(router) {
if (isContractProcedure(router)) {
let decorated = DecoratedContractProcedure.decorate(router);
if (this["~orpc"].tags) {
decorated = decorated.unshiftTag(...this["~orpc"].tags);
}
if (this["~orpc"].prefix) {
decorated = decorated.prefix(this["~orpc"].prefix);
}
return decorated;
}
const adapted = {};
for (const key in router) {
adapted[key] = this.router(router[key]);
}
return adapted;
}
};
// src/builder.ts
var ContractBuilder = class {
prefix(prefix) {
return new ContractRouterBuilder({
prefix
return new _ContractBuilder({
...this["~orpc"],
prefix: mergePrefix(this["~orpc"].prefix, prefix)
});
}
tag(...tags) {
return new ContractRouterBuilder({
tags
return new _ContractBuilder({
...this["~orpc"],
tags: mergeTags(this["~orpc"].tags, tags)
});
}
route(route) {
return new DecoratedContractProcedure({
route,
InputSchema: void 0,
OutputSchema: void 0
});
}
input(schema, example) {
return new DecoratedContractProcedure({
InputSchema: schema,
inputExample: example,
OutputSchema: void 0
});
}
output(schema, example) {
return new DecoratedContractProcedure({
OutputSchema: schema,
outputExample: example,
InputSchema: void 0
});
}
router(router) {
return router;
return adaptContractRouter(router, this["~orpc"]);
}
};
var oc = new ContractBuilder({
errorMap: {},
inputSchema: void 0,
outputSchema: void 0,
route: {},
meta: {}
});

@@ -161,32 +180,94 @@ // src/config.ts

};
var GLOBAL_CONFIG_REF = { value: DEFAULT_CONFIG };
function configGlobal(config) {
if (config.defaultSuccessStatus !== void 0 && (config.defaultSuccessStatus < 200 || config.defaultSuccessStatus > 299)) {
throw new Error("[configGlobal] The defaultSuccessStatus must be between 200 and 299");
function fallbackContractConfig(key, value) {
if (value === void 0) {
return DEFAULT_CONFIG[key];
}
GLOBAL_CONFIG_REF.value = config;
return value;
}
function fallbackToGlobalConfig(key, value) {
if (value === void 0) {
const fallback = GLOBAL_CONFIG_REF.value[key];
if (fallback === void 0) {
return DEFAULT_CONFIG[key];
// src/event-iterator.ts
import { mapEventIterator, ORPCError } from "@orpc/client";
import { isAsyncIteratorObject } from "@orpc/standard-server";
var EVENT_ITERATOR_SCHEMA_SYMBOL = Symbol("ORPC_EVENT_ITERATOR_SCHEMA");
function eventIterator(yields, returns) {
return {
"~standard": {
[EVENT_ITERATOR_SCHEMA_SYMBOL]: { yields, returns },
vendor: "orpc",
version: 1,
validate(iterator) {
if (!isAsyncIteratorObject(iterator)) {
return { issues: [{ message: "Expect event source iterator", path: [] }] };
}
const mapped = mapEventIterator(iterator, {
async value(value, done) {
const schema = done ? returns : yields;
if (!schema) {
return value;
}
const result = await schema["~standard"].validate(value);
if (result.issues) {
throw new ORPCError("EVENT_ITERATOR_VALIDATION_FAILED", {
message: "Event source iterator validation failed",
cause: new ValidationError({
issues: result.issues,
message: "Event source iterator validation failed"
})
});
}
return result.value;
},
error: async (error) => error
});
return { value: mapped };
}
}
return fallback;
};
}
function getEventIteratorSchemaDetails(schema) {
if (schema === void 0) {
return void 0;
}
return value;
return schema["~standard"][EVENT_ITERATOR_SCHEMA_SYMBOL];
}
// src/schema.ts
function type(...[map]) {
return {
"~standard": {
vendor: "custom",
version: 1,
async validate(value) {
if (map) {
return { value: await map(value) };
}
return { value };
}
}
};
}
// src/index.ts
var oc = new ContractBuilder();
import { ORPCError as ORPCError2 } from "@orpc/client";
export {
ContractBuilder,
ContractProcedure,
ContractRouterBuilder,
DecoratedContractProcedure,
configGlobal,
fallbackToGlobalConfig,
ORPCError2 as ORPCError,
ValidationError,
adaptContractRouter,
adaptRoute,
eventIterator,
fallbackContractConfig,
getEventIteratorSchemaDetails,
isContractProcedure,
oc
mergeErrorMap,
mergeMeta,
mergePrefix,
mergeRoute,
mergeTags,
oc,
prefixRoute,
type,
unshiftTagRoute
};
//# sourceMappingURL=index.js.map

@@ -1,14 +0,32 @@

import type { RouteOptions } from './procedure';
import type { ContractRouter } from './router';
import type { HTTPPath, Schema, SchemaInput, SchemaOutput } from './types';
import { DecoratedContractProcedure } from './procedure-decorated';
import { ContractRouterBuilder } from './router-builder';
export declare class ContractBuilder {
prefix(prefix: HTTPPath): ContractRouterBuilder;
tag(...tags: string[]): ContractRouterBuilder;
route(route: RouteOptions): DecoratedContractProcedure<undefined, undefined>;
input<U extends Schema = undefined>(schema: U, example?: SchemaInput<U>): DecoratedContractProcedure<U, undefined>;
output<U extends Schema = undefined>(schema: U, example?: SchemaOutput<U>): DecoratedContractProcedure<undefined, U>;
router<T extends ContractRouter>(router: T): T;
import type { ContractProcedureBuilder, ContractProcedureBuilderWithInput, ContractProcedureBuilderWithOutput, ContractRouterBuilder } from './builder-variants';
import type { ContractProcedureDef } from './procedure';
import type { AdaptContractRouterOptions, AdaptedContractRouter, ContractRouter } from './router';
import type { Schema } from './schema';
import { type ErrorMap, type MergedErrorMap } from './error';
import { type Meta } from './meta';
import { ContractProcedure } from './procedure';
import { type HTTPPath, type Route } from './route';
export interface ContractBuilderDef<TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap, TMeta extends Meta> extends ContractProcedureDef<TInputSchema, TOutputSchema, TErrorMap, TMeta>, AdaptContractRouterOptions<TErrorMap> {
}
export declare class ContractBuilder<TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap, TMeta extends Meta> extends ContractProcedure<TInputSchema, TOutputSchema, TErrorMap, TMeta> {
'~orpc': ContractBuilderDef<TInputSchema, TOutputSchema, TErrorMap, TMeta>;
constructor(def: ContractBuilderDef<TInputSchema, TOutputSchema, TErrorMap, TMeta>);
/**
* Reset initial meta
*/
$meta<U extends Meta>(initialMeta: U): ContractBuilder<TInputSchema, TOutputSchema, TErrorMap, U>;
/**
* Reset initial route
*/
$route(initialRoute: Route): ContractBuilder<TInputSchema, TOutputSchema, TErrorMap, TMeta>;
errors<U extends ErrorMap>(errors: U): ContractBuilder<TInputSchema, TOutputSchema, MergedErrorMap<TErrorMap, U>, TMeta>;
meta(meta: TMeta): ContractProcedureBuilder<TInputSchema, TOutputSchema, TErrorMap, TMeta>;
route(route: Route): ContractProcedureBuilder<TInputSchema, TOutputSchema, TErrorMap, TMeta>;
input<U extends Schema>(schema: U): ContractProcedureBuilderWithInput<U, TOutputSchema, TErrorMap, TMeta>;
output<U extends Schema>(schema: U): ContractProcedureBuilderWithOutput<TInputSchema, U, TErrorMap, TMeta>;
prefix(prefix: HTTPPath): ContractRouterBuilder<TErrorMap, TMeta>;
tag(...tags: string[]): ContractRouterBuilder<TErrorMap, TMeta>;
router<T extends ContractRouter<TMeta>>(router: T): AdaptedContractRouter<T, TErrorMap>;
}
export declare const oc: ContractBuilder<undefined, undefined, {}, {}>;
//# sourceMappingURL=builder.d.ts.map

@@ -1,36 +0,10 @@

import type { HTTPMethod, InputStructure } from './types';
export interface ORPCConfig {
/**
* @default 'POST'
*/
defaultMethod?: HTTPMethod;
/**
*
* @default 200
*/
defaultSuccessStatus?: number;
/**
*
* @default 'OK'
*/
defaultSuccessDescription?: string;
/**
*
* @default 'compact'
*/
defaultInputStructure?: InputStructure;
/**
*
* @default 'compact'
*/
defaultOutputStructure?: InputStructure;
import type { HTTPMethod, InputStructure } from './route';
export interface ContractConfig {
defaultMethod: HTTPMethod;
defaultSuccessStatus: number;
defaultSuccessDescription: string;
defaultInputStructure: InputStructure;
defaultOutputStructure: InputStructure;
}
/**
* Set the global configuration, this configuration can effect entire project
*/
export declare function configGlobal(config: ORPCConfig): void;
/**
* Fallback the value to the global config if it is undefined
*/
export declare function fallbackToGlobalConfig<T extends keyof ORPCConfig>(key: T, value: ORPCConfig[T]): Exclude<ORPCConfig[T], undefined>;
export declare function fallbackContractConfig<T extends keyof ContractConfig>(key: T, value: ContractConfig[T] | undefined): ContractConfig[T];
//# sourceMappingURL=config.d.ts.map
/** unnoq */
import { ContractBuilder } from './builder';
export * from './builder';
export * from './builder-variants';
export * from './config';
export * from './error';
export * from './event-iterator';
export * from './meta';
export * from './procedure';
export * from './procedure-decorated';
export * from './procedure-client';
export * from './route';
export * from './router';
export * from './router-builder';
export * from './types';
export declare const oc: ContractBuilder;
export * from './router-client';
export * from './schema';
export { ORPCError } from '@orpc/client';
//# sourceMappingURL=index.d.ts.map

@@ -1,81 +0,18 @@

import type { HTTPMethod, HTTPPath, InputStructure, OutputStructure, Schema, SchemaOutput } from './types';
export interface RouteOptions {
method?: HTTPMethod;
path?: HTTPPath;
summary?: string;
description?: string;
deprecated?: boolean;
tags?: readonly string[];
/**
* The status code of the response when the procedure is successful.
*
* @default 200
*/
successStatus?: number;
/**
* The description of the response when the procedure is successful.
*
* @default 'OK'
*/
successDescription?: string;
/**
* Determines how the input should be structured based on `params`, `query`, `headers`, and `body`.
*
* @option 'compact'
* Combines `params` and either `query` or `body` (depending on the HTTP method) into a single object.
*
* @option 'detailed'
* Keeps each part of the request (`params`, `query`, `headers`, and `body`) as separate fields in the input object.
*
* Example:
* ```ts
* const input = {
* params: { id: 1 },
* query: { search: 'hello' },
* headers: { 'Content-Type': 'application/json' },
* body: { name: 'John' },
* }
* ```
*
* @default 'compact'
*/
inputStructure?: InputStructure;
/**
* Determines how the response should be structured based on the output.
*
* @option 'compact'
* Includes only the body data, encoded directly in the response.
*
* @option 'detailed'
* Separates the output into `headers` and `body` fields.
* - `headers`: Custom headers to merge with the response headers.
* - `body`: The response data.
*
* Example:
* ```ts
* const output = {
* headers: { 'x-custom-header': 'value' },
* body: { message: 'Hello, world!' },
* };
* ```
*
* @default 'compact'
*/
outputStructure?: OutputStructure;
import type { ErrorMap } from './error';
import type { Meta } from './meta';
import type { Route } from './route';
import type { Schema } from './schema';
export interface ContractProcedureDef<TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap, TMeta extends Meta> {
meta: TMeta;
route: Route;
inputSchema: TInputSchema;
outputSchema: TOutputSchema;
errorMap: TErrorMap;
}
export interface ContractProcedureDef<TInputSchema extends Schema, TOutputSchema extends Schema> {
route?: RouteOptions;
InputSchema: TInputSchema;
inputExample?: SchemaOutput<TInputSchema>;
OutputSchema: TOutputSchema;
outputExample?: SchemaOutput<TOutputSchema>;
export declare class ContractProcedure<TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap, TMeta extends Meta> {
'~orpc': ContractProcedureDef<TInputSchema, TOutputSchema, TErrorMap, TMeta>;
constructor(def: ContractProcedureDef<TInputSchema, TOutputSchema, TErrorMap, TMeta>);
}
export declare class ContractProcedure<TInputSchema extends Schema, TOutputSchema extends Schema> {
'~type': "ContractProcedure";
'~orpc': ContractProcedureDef<TInputSchema, TOutputSchema>;
constructor(def: ContractProcedureDef<TInputSchema, TOutputSchema>);
}
export type ANY_CONTRACT_PROCEDURE = ContractProcedure<any, any>;
export type WELL_CONTRACT_PROCEDURE = ContractProcedure<Schema, Schema>;
export declare function isContractProcedure(item: unknown): item is ANY_CONTRACT_PROCEDURE;
export type AnyContractProcedure = ContractProcedure<any, any, any, any>;
export declare function isContractProcedure(item: unknown): item is AnyContractProcedure;
//# sourceMappingURL=procedure.d.ts.map

@@ -1,12 +0,29 @@

import type { ANY_CONTRACT_PROCEDURE, ContractProcedure } from './procedure';
import type { SchemaInput, SchemaOutput } from './types';
export type ContractRouter = ANY_CONTRACT_PROCEDURE | {
[k: string]: ContractRouter;
import type { Meta } from './meta';
import type { SchemaInput, SchemaOutput } from './schema';
import { type ErrorMap, type MergedErrorMap } from './error';
import { ContractProcedure } from './procedure';
import { type HTTPPath } from './route';
export type ContractRouter<TMeta extends Meta> = ContractProcedure<any, any, any, TMeta> | {
[k: string]: ContractRouter<TMeta>;
};
export type InferContractRouterInputs<T extends ContractRouter> = T extends ContractProcedure<infer UInputSchema, any> ? SchemaInput<UInputSchema> : {
[K in keyof T]: T[K] extends ContractRouter ? InferContractRouterInputs<T[K]> : never;
export type AnyContractRouter = ContractRouter<any>;
export type AdaptedContractRouter<TContract extends AnyContractRouter, TErrorMap extends ErrorMap> = {
[K in keyof TContract]: TContract[K] extends ContractProcedure<infer UInputSchema, infer UOutputSchema, infer UErrors, infer UMeta> ? ContractProcedure<UInputSchema, UOutputSchema, MergedErrorMap<TErrorMap, UErrors>, UMeta> : TContract[K] extends AnyContractRouter ? AdaptedContractRouter<TContract[K], TErrorMap> : never;
};
export type InferContractRouterOutputs<T extends ContractRouter> = T extends ContractProcedure<any, infer UOutputSchema> ? SchemaOutput<UOutputSchema> : {
[K in keyof T]: T[K] extends ContractRouter ? InferContractRouterOutputs<T[K]> : never;
export interface AdaptContractRouterOptions<TErrorMap extends ErrorMap> {
errorMap: TErrorMap;
prefix?: HTTPPath;
tags?: readonly string[];
}
export declare function adaptContractRouter<TRouter extends ContractRouter<any>, TErrorMap extends ErrorMap>(contract: TRouter, options: AdaptContractRouterOptions<TErrorMap>): AdaptedContractRouter<TRouter, TErrorMap>;
export type InferContractRouterInputs<T extends AnyContractRouter> = T extends ContractProcedure<infer UInputSchema, any, any, any> ? SchemaInput<UInputSchema> : {
[K in keyof T]: T[K] extends AnyContractRouter ? InferContractRouterInputs<T[K]> : never;
};
export type InferContractRouterOutputs<T extends AnyContractRouter> = T extends ContractProcedure<any, infer UOutputSchema, any, any> ? SchemaOutput<UOutputSchema> : {
[K in keyof T]: T[K] extends AnyContractRouter ? InferContractRouterOutputs<T[K]> : never;
};
export type ContractRouterToErrorMap<T extends AnyContractRouter> = T extends ContractProcedure<any, any, infer UErrorMap, any> ? UErrorMap : {
[K in keyof T]: T[K] extends AnyContractRouter ? ContractRouterToErrorMap<T[K]> : never;
}[keyof T];
export type ContractRouterToMeta<T extends AnyContractRouter> = T extends ContractRouter<infer UMeta> ? UMeta : never;
//# sourceMappingURL=router.d.ts.map
{
"name": "@orpc/contract",
"type": "module",
"version": "0.0.0-next.331b26b",
"version": "0.0.0-next.370978b",
"license": "MIT",

@@ -32,4 +32,6 @@ "homepage": "https://orpc.unnoq.com",

"dependencies": {
"@standard-schema/spec": "1.0.0-beta.4",
"@orpc/shared": "0.0.0-next.331b26b"
"@standard-schema/spec": "^1.0.0",
"@orpc/shared": "0.0.0-next.370978b",
"@orpc/client": "0.0.0-next.370978b",
"@orpc/standard-server": "0.0.0-next.370978b"
},

@@ -39,3 +41,3 @@ "devDependencies": {

"valibot": "1.0.0-beta.9",
"zod": "3.24.1"
"zod": "^3.24.1"
},

@@ -42,0 +44,0 @@ "scripts": {

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc