@revealui/contracts 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +160 -0
- package/dist/a2a/index.d.ts +383 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +276 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/actions/action-validator.d.ts +48 -0
- package/dist/actions/action-validator.d.ts.map +1 -0
- package/dist/actions/action-validator.js +288 -0
- package/dist/actions/action-validator.js.map +1 -0
- package/dist/actions/index.d.ts +7 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +7 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/agents/index.d.ts +628 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +511 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/types.d.ts +22 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/api/auth.d.ts +60 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +84 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/chat.d.ts +45 -0
- package/dist/api/chat.d.ts.map +1 -0
- package/dist/api/chat.js +55 -0
- package/dist/api/chat.js.map +1 -0
- package/dist/api/gdpr.d.ts +39 -0
- package/dist/api/gdpr.d.ts.map +1 -0
- package/dist/api/gdpr.js +53 -0
- package/dist/api/gdpr.js.map +1 -0
- package/dist/cms/collection.d.ts +108 -0
- package/dist/cms/collection.d.ts.map +1 -0
- package/dist/cms/collection.js +144 -0
- package/dist/cms/collection.js.map +1 -0
- package/dist/cms/compat.d.ts +128 -0
- package/dist/cms/compat.d.ts.map +1 -0
- package/dist/cms/compat.js +141 -0
- package/dist/cms/compat.js.map +1 -0
- package/dist/cms/config-contract.d.ts +278 -0
- package/dist/cms/config-contract.d.ts.map +1 -0
- package/dist/cms/config-contract.js +220 -0
- package/dist/cms/config-contract.js.map +1 -0
- package/dist/cms/config.d.ts +351 -0
- package/dist/cms/config.d.ts.map +1 -0
- package/dist/cms/config.js +50 -0
- package/dist/cms/config.js.map +1 -0
- package/dist/cms/errors.d.ts +122 -0
- package/dist/cms/errors.d.ts.map +1 -0
- package/dist/cms/errors.js +163 -0
- package/dist/cms/errors.js.map +1 -0
- package/dist/cms/extensibility.d.ts +211 -0
- package/dist/cms/extensibility.d.ts.map +1 -0
- package/dist/cms/extensibility.js +313 -0
- package/dist/cms/extensibility.js.map +1 -0
- package/dist/cms/field.d.ts +69 -0
- package/dist/cms/field.d.ts.map +1 -0
- package/dist/cms/field.js +94 -0
- package/dist/cms/field.js.map +1 -0
- package/dist/cms/functions.d.ts +466 -0
- package/dist/cms/functions.d.ts.map +1 -0
- package/dist/cms/functions.js +19 -0
- package/dist/cms/functions.js.map +1 -0
- package/dist/cms/global.d.ts +45 -0
- package/dist/cms/global.d.ts.map +1 -0
- package/dist/cms/global.js +62 -0
- package/dist/cms/global.js.map +1 -0
- package/dist/cms/index.d.ts +23 -0
- package/dist/cms/index.d.ts.map +1 -0
- package/dist/cms/index.js +42 -0
- package/dist/cms/index.js.map +1 -0
- package/dist/cms/structure.d.ts +1601 -0
- package/dist/cms/structure.d.ts.map +1 -0
- package/dist/cms/structure.js +757 -0
- package/dist/cms/structure.js.map +1 -0
- package/dist/content/index.d.ts +1542 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +522 -0
- package/dist/content/index.js.map +1 -0
- package/dist/database/bridge.d.ts +177 -0
- package/dist/database/bridge.d.ts.map +1 -0
- package/dist/database/bridge.js +139 -0
- package/dist/database/bridge.js.map +1 -0
- package/dist/database/index.d.ts +8 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +9 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/type-bridge.d.ts +178 -0
- package/dist/database/type-bridge.d.ts.map +1 -0
- package/dist/database/type-bridge.js +154 -0
- package/dist/database/type-bridge.js.map +1 -0
- package/dist/entities/agent-context.d.ts +280 -0
- package/dist/entities/agent-context.d.ts.map +1 -0
- package/dist/entities/agent-context.js +390 -0
- package/dist/entities/agent-context.js.map +1 -0
- package/dist/entities/agent-memory.d.ts +661 -0
- package/dist/entities/agent-memory.d.ts.map +1 -0
- package/dist/entities/agent-memory.js +544 -0
- package/dist/entities/agent-memory.js.map +1 -0
- package/dist/entities/board.d.ts +95 -0
- package/dist/entities/board.d.ts.map +1 -0
- package/dist/entities/board.js +99 -0
- package/dist/entities/board.js.map +1 -0
- package/dist/entities/code-provenance.d.ts +270 -0
- package/dist/entities/code-provenance.d.ts.map +1 -0
- package/dist/entities/code-provenance.js +339 -0
- package/dist/entities/code-provenance.js.map +1 -0
- package/dist/entities/index.d.ts +22 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +22 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/media.d.ts +485 -0
- package/dist/entities/media.d.ts.map +1 -0
- package/dist/entities/media.js +606 -0
- package/dist/entities/media.js.map +1 -0
- package/dist/entities/page-revision.d.ts +390 -0
- package/dist/entities/page-revision.d.ts.map +1 -0
- package/dist/entities/page-revision.js +406 -0
- package/dist/entities/page-revision.js.map +1 -0
- package/dist/entities/page.d.ts +2349 -0
- package/dist/entities/page.d.ts.map +1 -0
- package/dist/entities/page.js +377 -0
- package/dist/entities/page.js.map +1 -0
- package/dist/entities/post.d.ts +619 -0
- package/dist/entities/post.d.ts.map +1 -0
- package/dist/entities/post.js +555 -0
- package/dist/entities/post.js.map +1 -0
- package/dist/entities/price.d.ts +772 -0
- package/dist/entities/price.d.ts.map +1 -0
- package/dist/entities/price.js +308 -0
- package/dist/entities/price.js.map +1 -0
- package/dist/entities/product.d.ts +753 -0
- package/dist/entities/product.d.ts.map +1 -0
- package/dist/entities/product.js +307 -0
- package/dist/entities/product.js.map +1 -0
- package/dist/entities/session.d.ts +222 -0
- package/dist/entities/session.d.ts.map +1 -0
- package/dist/entities/session.js +253 -0
- package/dist/entities/session.js.map +1 -0
- package/dist/entities/site.d.ts +387 -0
- package/dist/entities/site.d.ts.map +1 -0
- package/dist/entities/site.js +348 -0
- package/dist/entities/site.js.map +1 -0
- package/dist/entities/ticket-comment.d.ts +49 -0
- package/dist/entities/ticket-comment.d.ts.map +1 -0
- package/dist/entities/ticket-comment.js +58 -0
- package/dist/entities/ticket-comment.js.map +1 -0
- package/dist/entities/ticket-label.d.ts +64 -0
- package/dist/entities/ticket-label.d.ts.map +1 -0
- package/dist/entities/ticket-label.js +77 -0
- package/dist/entities/ticket-label.js.map +1 -0
- package/dist/entities/ticket.d.ts +204 -0
- package/dist/entities/ticket.d.ts.map +1 -0
- package/dist/entities/ticket.js +205 -0
- package/dist/entities/ticket.js.map +1 -0
- package/dist/entities/user.d.ts +336 -0
- package/dist/entities/user.d.ts.map +1 -0
- package/dist/entities/user.js +255 -0
- package/dist/entities/user.js.map +1 -0
- package/dist/foundation/contract.d.ts +221 -0
- package/dist/foundation/contract.d.ts.map +1 -0
- package/dist/foundation/contract.js +133 -0
- package/dist/foundation/contract.js.map +1 -0
- package/dist/foundation/index.d.ts +7 -0
- package/dist/foundation/index.d.ts.map +1 -0
- package/dist/foundation/index.js +7 -0
- package/dist/foundation/index.js.map +1 -0
- package/dist/generated/contracts.d.ts +1514 -0
- package/dist/generated/contracts.d.ts.map +1 -0
- package/dist/generated/contracts.js +959 -0
- package/dist/generated/contracts.js.map +1 -0
- package/dist/generated/database.d.ts +48 -0
- package/dist/generated/database.d.ts.map +1 -0
- package/dist/generated/database.js +17 -0
- package/dist/generated/database.js.map +1 -0
- package/dist/generated/zod-schemas.d.ts +14793 -0
- package/dist/generated/zod-schemas.d.ts.map +1 -0
- package/dist/generated/zod-schemas.js +547 -0
- package/dist/generated/zod-schemas.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/representation/index.d.ts +304 -0
- package/dist/representation/index.d.ts.map +1 -0
- package/dist/representation/index.js +280 -0
- package/dist/representation/index.js.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Contract System
|
|
3
|
+
*
|
|
4
|
+
* A Contract is a single source of truth that combines:
|
|
5
|
+
* 1. TypeScript Type (compile-time safety)
|
|
6
|
+
* 2. Zod Schema (runtime validation)
|
|
7
|
+
* 3. Validation Functions (runtime validation)
|
|
8
|
+
* 4. Type Guards (runtime type checking)
|
|
9
|
+
* 5. Metadata (documentation, versioning)
|
|
10
|
+
*
|
|
11
|
+
* This unified approach ensures that types, schemas, and validation
|
|
12
|
+
* never drift apart, providing both compile-time and runtime safety.
|
|
13
|
+
*
|
|
14
|
+
* @module @revealui/contracts/foundation
|
|
15
|
+
*/
|
|
16
|
+
import type { ZodError, z } from 'zod/v4';
|
|
17
|
+
/**
|
|
18
|
+
* Validation result from contract validation
|
|
19
|
+
*/
|
|
20
|
+
export interface ContractValidationSuccess<T> {
|
|
21
|
+
success: true;
|
|
22
|
+
data: T;
|
|
23
|
+
errors?: never;
|
|
24
|
+
}
|
|
25
|
+
export interface ContractValidationFailure {
|
|
26
|
+
success: false;
|
|
27
|
+
data?: never;
|
|
28
|
+
errors: ZodError;
|
|
29
|
+
}
|
|
30
|
+
export type ContractValidationResult<T> = ContractValidationSuccess<T> | ContractValidationFailure;
|
|
31
|
+
/**
|
|
32
|
+
* Contract metadata for documentation and versioning
|
|
33
|
+
*/
|
|
34
|
+
export interface ContractMetadata {
|
|
35
|
+
/** Contract name/identifier */
|
|
36
|
+
name: string;
|
|
37
|
+
/** Contract version for migration support */
|
|
38
|
+
version: string;
|
|
39
|
+
/** Human-readable description */
|
|
40
|
+
description?: string;
|
|
41
|
+
/** Documentation URL */
|
|
42
|
+
docsUrl?: string;
|
|
43
|
+
/** Tags for categorization */
|
|
44
|
+
tags?: string[];
|
|
45
|
+
/** Deprecation notice if applicable */
|
|
46
|
+
deprecated?: boolean;
|
|
47
|
+
/** Deprecation message */
|
|
48
|
+
deprecatedMessage?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Unified Contract Interface
|
|
52
|
+
*
|
|
53
|
+
* A Contract binds together TypeScript types, Zod schemas, and validation
|
|
54
|
+
* into a single source of truth.
|
|
55
|
+
*
|
|
56
|
+
* @template T - The TypeScript type this contract validates
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const UserContract = createContract({
|
|
61
|
+
* name: 'User',
|
|
62
|
+
* version: '1.0.0',
|
|
63
|
+
* schema: z.object({
|
|
64
|
+
* id: z.string(),
|
|
65
|
+
* email: z.string().email(),
|
|
66
|
+
* name: z.string().min(1),
|
|
67
|
+
* }),
|
|
68
|
+
* })
|
|
69
|
+
*
|
|
70
|
+
* // Type inference
|
|
71
|
+
* type User = ContractType<typeof UserContract>
|
|
72
|
+
*
|
|
73
|
+
* // Runtime validation
|
|
74
|
+
* const result = UserContract.validate(rawData)
|
|
75
|
+
* if (result.success) {
|
|
76
|
+
* // result.data is fully typed as User
|
|
77
|
+
* console.log(result.data.email)
|
|
78
|
+
* }
|
|
79
|
+
*
|
|
80
|
+
* // Type guard
|
|
81
|
+
* if (UserContract.isType(unknownData)) {
|
|
82
|
+
* // unknownData is now typed as User
|
|
83
|
+
* console.log(unknownData.email)
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export interface Contract<T> {
|
|
88
|
+
/** Contract metadata */
|
|
89
|
+
readonly metadata: ContractMetadata;
|
|
90
|
+
/**
|
|
91
|
+
* Zod schema for runtime validation
|
|
92
|
+
* This is the single source of truth for the data structure
|
|
93
|
+
*/
|
|
94
|
+
readonly schema: z.ZodSchema<T>;
|
|
95
|
+
/**
|
|
96
|
+
* Validate data against the contract
|
|
97
|
+
* Returns a result object with success flag and typed data or errors
|
|
98
|
+
*
|
|
99
|
+
* @param data - Unknown data to validate
|
|
100
|
+
* @returns Validation result with typed data on success, errors on failure
|
|
101
|
+
*/
|
|
102
|
+
validate(data: unknown): ContractValidationResult<T>;
|
|
103
|
+
/**
|
|
104
|
+
* Type guard function
|
|
105
|
+
* Returns true if data matches the contract, false otherwise
|
|
106
|
+
* When true, TypeScript narrows the type to T
|
|
107
|
+
*
|
|
108
|
+
* @param data - Unknown data to check
|
|
109
|
+
* @returns True if data is valid, false otherwise
|
|
110
|
+
*/
|
|
111
|
+
isType(data: unknown): data is T;
|
|
112
|
+
/**
|
|
113
|
+
* Parse data and throw on validation failure
|
|
114
|
+
* Use this when you're certain data should be valid
|
|
115
|
+
*
|
|
116
|
+
* @param data - Unknown data to parse
|
|
117
|
+
* @returns Typed data
|
|
118
|
+
* @throws ZodError if validation fails
|
|
119
|
+
*/
|
|
120
|
+
parse(data: unknown): T;
|
|
121
|
+
/**
|
|
122
|
+
* Safe parse - returns result without throwing
|
|
123
|
+
* Alias for validate() for consistency with Zod API
|
|
124
|
+
*
|
|
125
|
+
* @param data - Unknown data to parse
|
|
126
|
+
* @returns Validation result
|
|
127
|
+
*/
|
|
128
|
+
safeParse(data: unknown): ContractValidationResult<T>;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Extract the TypeScript type from a Contract
|
|
132
|
+
*
|
|
133
|
+
* @template C - The contract type
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* type User = ContractType<typeof UserContract>
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export type ContractType<C extends Contract<unknown>> = C extends Contract<infer T> ? T : never;
|
|
141
|
+
/**
|
|
142
|
+
* Options for creating a contract
|
|
143
|
+
*/
|
|
144
|
+
export interface CreateContractOptions<T> {
|
|
145
|
+
/** Contract name/identifier */
|
|
146
|
+
name: string;
|
|
147
|
+
/** Contract version */
|
|
148
|
+
version: string;
|
|
149
|
+
/** Zod schema for validation */
|
|
150
|
+
schema: z.ZodSchema<T>;
|
|
151
|
+
/** Optional description */
|
|
152
|
+
description?: string;
|
|
153
|
+
/** Optional documentation URL */
|
|
154
|
+
docsUrl?: string;
|
|
155
|
+
/** Optional tags */
|
|
156
|
+
tags?: string[];
|
|
157
|
+
/** Optional deprecation flag */
|
|
158
|
+
deprecated?: boolean;
|
|
159
|
+
/** Optional deprecation message */
|
|
160
|
+
deprecatedMessage?: string;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create a unified contract from a Zod schema
|
|
164
|
+
*
|
|
165
|
+
* This factory function creates a Contract that binds together:
|
|
166
|
+
* - TypeScript type inference from the schema
|
|
167
|
+
* - Runtime validation via Zod
|
|
168
|
+
* - Type guards for type narrowing
|
|
169
|
+
* - Metadata for documentation
|
|
170
|
+
*
|
|
171
|
+
* @template T - The type inferred from the schema
|
|
172
|
+
* @param options - Contract creation options
|
|
173
|
+
* @returns A complete Contract instance
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```typescript
|
|
177
|
+
* const UserContract = createContract({
|
|
178
|
+
* name: 'User',
|
|
179
|
+
* version: '1.0.0',
|
|
180
|
+
* schema: z.object({
|
|
181
|
+
* id: z.string(),
|
|
182
|
+
* email: z.string().email(),
|
|
183
|
+
* name: z.string().min(1),
|
|
184
|
+
* }),
|
|
185
|
+
* })
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
export declare function createContract<T>(options: CreateContractOptions<T>): Contract<T>;
|
|
189
|
+
/**
|
|
190
|
+
* Contract registry for managing all contracts
|
|
191
|
+
* Allows lookup and versioning of contracts
|
|
192
|
+
*/
|
|
193
|
+
declare class ContractRegistry {
|
|
194
|
+
private contracts;
|
|
195
|
+
/**
|
|
196
|
+
* Register a contract
|
|
197
|
+
*/
|
|
198
|
+
register<T>(contract: Contract<T>): void;
|
|
199
|
+
/**
|
|
200
|
+
* Get a contract by name and version
|
|
201
|
+
*/
|
|
202
|
+
get<T>(name: string, version: string): Contract<T> | undefined;
|
|
203
|
+
/**
|
|
204
|
+
* Get the latest version of a contract
|
|
205
|
+
*/
|
|
206
|
+
getLatest<T>(name: string): Contract<T> | undefined;
|
|
207
|
+
/**
|
|
208
|
+
* List all registered contracts
|
|
209
|
+
*/
|
|
210
|
+
list(): Contract<unknown>[];
|
|
211
|
+
/**
|
|
212
|
+
* Clear all contracts (useful for testing)
|
|
213
|
+
*/
|
|
214
|
+
clear(): void;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Global contract registry instance
|
|
218
|
+
*/
|
|
219
|
+
export declare const contractRegistry: ContractRegistry;
|
|
220
|
+
export {};
|
|
221
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/foundation/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Contract System
|
|
3
|
+
*
|
|
4
|
+
* A Contract is a single source of truth that combines:
|
|
5
|
+
* 1. TypeScript Type (compile-time safety)
|
|
6
|
+
* 2. Zod Schema (runtime validation)
|
|
7
|
+
* 3. Validation Functions (runtime validation)
|
|
8
|
+
* 4. Type Guards (runtime type checking)
|
|
9
|
+
* 5. Metadata (documentation, versioning)
|
|
10
|
+
*
|
|
11
|
+
* This unified approach ensures that types, schemas, and validation
|
|
12
|
+
* never drift apart, providing both compile-time and runtime safety.
|
|
13
|
+
*
|
|
14
|
+
* @module @revealui/contracts/foundation
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Create a unified contract from a Zod schema
|
|
18
|
+
*
|
|
19
|
+
* This factory function creates a Contract that binds together:
|
|
20
|
+
* - TypeScript type inference from the schema
|
|
21
|
+
* - Runtime validation via Zod
|
|
22
|
+
* - Type guards for type narrowing
|
|
23
|
+
* - Metadata for documentation
|
|
24
|
+
*
|
|
25
|
+
* @template T - The type inferred from the schema
|
|
26
|
+
* @param options - Contract creation options
|
|
27
|
+
* @returns A complete Contract instance
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const UserContract = createContract({
|
|
32
|
+
* name: 'User',
|
|
33
|
+
* version: '1.0.0',
|
|
34
|
+
* schema: z.object({
|
|
35
|
+
* id: z.string(),
|
|
36
|
+
* email: z.string().email(),
|
|
37
|
+
* name: z.string().min(1),
|
|
38
|
+
* }),
|
|
39
|
+
* })
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export function createContract(options) {
|
|
43
|
+
const { name, version, schema, description, docsUrl, tags, deprecated, deprecatedMessage } = options;
|
|
44
|
+
const metadata = {
|
|
45
|
+
name,
|
|
46
|
+
version,
|
|
47
|
+
...(description && { description }),
|
|
48
|
+
...(docsUrl && { docsUrl }),
|
|
49
|
+
...(tags && { tags }),
|
|
50
|
+
...(deprecated !== undefined && { deprecated }),
|
|
51
|
+
...(deprecatedMessage && { deprecatedMessage }),
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
metadata,
|
|
55
|
+
schema,
|
|
56
|
+
validate(data) {
|
|
57
|
+
const result = schema.safeParse(data);
|
|
58
|
+
if (result.success) {
|
|
59
|
+
return {
|
|
60
|
+
success: true,
|
|
61
|
+
data: result.data,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
errors: result.error,
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
isType(data) {
|
|
70
|
+
return schema.safeParse(data).success;
|
|
71
|
+
},
|
|
72
|
+
parse(data) {
|
|
73
|
+
return schema.parse(data);
|
|
74
|
+
},
|
|
75
|
+
safeParse(data) {
|
|
76
|
+
return this.validate(data);
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Contract registry for managing all contracts
|
|
82
|
+
* Allows lookup and versioning of contracts
|
|
83
|
+
*/
|
|
84
|
+
class ContractRegistry {
|
|
85
|
+
contracts = new Map();
|
|
86
|
+
/**
|
|
87
|
+
* Register a contract
|
|
88
|
+
*/
|
|
89
|
+
register(contract) {
|
|
90
|
+
const key = `${contract.metadata.name}@${contract.metadata.version}`;
|
|
91
|
+
this.contracts.set(key, contract);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get a contract by name and version
|
|
95
|
+
*/
|
|
96
|
+
get(name, version) {
|
|
97
|
+
const key = `${name}@${version}`;
|
|
98
|
+
return this.contracts.get(key);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the latest version of a contract
|
|
102
|
+
*/
|
|
103
|
+
getLatest(name) {
|
|
104
|
+
let latest;
|
|
105
|
+
let latestVersion = '0.0.0';
|
|
106
|
+
for (const contract of Array.from(this.contracts.values())) {
|
|
107
|
+
if (contract.metadata.name === name) {
|
|
108
|
+
if (contract.metadata.version > latestVersion) {
|
|
109
|
+
latestVersion = contract.metadata.version;
|
|
110
|
+
latest = contract;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return latest;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* List all registered contracts
|
|
118
|
+
*/
|
|
119
|
+
list() {
|
|
120
|
+
return Array.from(this.contracts.values());
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clear all contracts (useful for testing)
|
|
124
|
+
*/
|
|
125
|
+
clear() {
|
|
126
|
+
this.contracts.clear();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Global contract registry instance
|
|
131
|
+
*/
|
|
132
|
+
export const contractRegistry = new ContractRegistry();
|
|
133
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/foundation/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @revealui/contracts/foundation
|
|
3
|
+
*
|
|
4
|
+
* Foundation contract system - core Contract<T> interface and utilities
|
|
5
|
+
*/
|
|
6
|
+
export { type Contract, type ContractMetadata, type ContractType, type ContractValidationFailure, type ContractValidationResult, type ContractValidationSuccess, type CreateContractOptions, contractRegistry, createContract, } from './contract.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/foundation/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,gBAAgB,EAChB,cAAc,GACf,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/foundation/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAQL,gBAAgB,EAChB,cAAc,GACf,MAAM,eAAe,CAAA"}
|