@oddington/sdk 0.1.27 → 0.1.29
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/README.md +24 -4
- package/dist/browser.js +280 -176
- package/dist/index.js +9 -9
- package/dist/types/packages/sdk/src/data-schema-types.d.ts +186 -0
- package/dist/types/packages/sdk/src/public.d.ts +4 -1
- package/dist/types/packages/sdk/src/routine-definition-types.d.ts +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { CollectionSchema, DataRepository, PublicValueDefinition, RecordsQuery, RecordsResult, SelectionMetadata } from '../../../shared/data-contract.js';
|
|
2
|
+
import type { DataRepositorySchemas } from './public.js';
|
|
3
|
+
type ReadonlySchema<Value> = Value extends object ? {
|
|
4
|
+
readonly [Key in keyof Value]: ReadonlySchema<Value[Key]>;
|
|
5
|
+
} : Value;
|
|
6
|
+
type Catalogue = {
|
|
7
|
+
collections: readonly ReadonlySchema<CollectionSchema>[];
|
|
8
|
+
};
|
|
9
|
+
type Collection = Catalogue['collections'][number];
|
|
10
|
+
type Definition = ReadonlySchema<PublicValueDefinition>;
|
|
11
|
+
type Field = Definition & {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
};
|
|
14
|
+
type Fields<Schema extends Collection> = Schema['fields'][number];
|
|
15
|
+
type Named<Schema extends Collection, Name> = Extract<Fields<Schema>, {
|
|
16
|
+
name: Name;
|
|
17
|
+
}>;
|
|
18
|
+
type Targets<Schemas extends Catalogue, Link> = Link extends {
|
|
19
|
+
to: readonly (infer Type)[];
|
|
20
|
+
} ? Extract<Schemas['collections'][number], {
|
|
21
|
+
type: Type;
|
|
22
|
+
}> : never;
|
|
23
|
+
type Scalar<Value> = Value extends {
|
|
24
|
+
kind: 'string' | 'date' | 'link';
|
|
25
|
+
} ? string : Value extends {
|
|
26
|
+
kind: 'integer' | 'number';
|
|
27
|
+
} ? number : Value extends {
|
|
28
|
+
kind: 'boolean';
|
|
29
|
+
} ? boolean : Value extends {
|
|
30
|
+
kind: 'enum';
|
|
31
|
+
values: readonly (infer Choice)[];
|
|
32
|
+
} ? Choice : Value extends {
|
|
33
|
+
kind: 'const';
|
|
34
|
+
value: infer Constant;
|
|
35
|
+
} ? Constant : never;
|
|
36
|
+
type ObjectValue<Fields extends Field> = {
|
|
37
|
+
-readonly [F in Fields as F['nullable'] extends true ? never : F['name']]: Value<F>;
|
|
38
|
+
} & {
|
|
39
|
+
-readonly [F in Fields as F['nullable'] extends true ? F['name'] : never]?: Value<F>;
|
|
40
|
+
};
|
|
41
|
+
type SingleValue<D> = D extends {
|
|
42
|
+
kind: 'object';
|
|
43
|
+
fields: readonly (infer F extends Field)[];
|
|
44
|
+
} ? ObjectValue<F> : D extends {
|
|
45
|
+
kind: 'map';
|
|
46
|
+
key: infer Key;
|
|
47
|
+
value: infer Item;
|
|
48
|
+
} ? Partial<Record<Extract<Scalar<Key>, string | number>, Value<Item>>> : Scalar<D>;
|
|
49
|
+
type Cardinality<D, Item> = (D extends {
|
|
50
|
+
many: true;
|
|
51
|
+
} ? Item[] : Item) | (D extends {
|
|
52
|
+
nullable: true;
|
|
53
|
+
} ? null : never);
|
|
54
|
+
type Value<D> = Cardinality<D, SingleValue<D>>;
|
|
55
|
+
type FilterField<Schema extends Collection> = Extract<Fields<Schema>, {
|
|
56
|
+
many: false;
|
|
57
|
+
kind: 'string' | 'integer' | 'number' | 'boolean' | 'date' | 'enum' | 'const' | 'link';
|
|
58
|
+
}>;
|
|
59
|
+
type Lower<V> = {
|
|
60
|
+
$gt: V;
|
|
61
|
+
$gte?: never;
|
|
62
|
+
} | {
|
|
63
|
+
$gte: V;
|
|
64
|
+
$gt?: never;
|
|
65
|
+
};
|
|
66
|
+
type Upper<V> = {
|
|
67
|
+
$lt: V;
|
|
68
|
+
$lte?: never;
|
|
69
|
+
} | {
|
|
70
|
+
$lte: V;
|
|
71
|
+
$lt?: never;
|
|
72
|
+
};
|
|
73
|
+
type Range<V> = ((Lower<V> & {
|
|
74
|
+
$lt?: never;
|
|
75
|
+
$lte?: never;
|
|
76
|
+
}) | (Upper<V> & {
|
|
77
|
+
$gt?: never;
|
|
78
|
+
$gte?: never;
|
|
79
|
+
}) | (Lower<V> & Upper<V>)) & {
|
|
80
|
+
$in?: never;
|
|
81
|
+
};
|
|
82
|
+
type Condition<F> = Scalar<F> | (F extends {
|
|
83
|
+
nullable: true;
|
|
84
|
+
} ? null : never) | {
|
|
85
|
+
$in: Array<Scalar<F> | (F extends {
|
|
86
|
+
nullable: true;
|
|
87
|
+
} ? null : never)>;
|
|
88
|
+
$gt?: never;
|
|
89
|
+
$gte?: never;
|
|
90
|
+
$lt?: never;
|
|
91
|
+
$lte?: never;
|
|
92
|
+
} | (F extends {
|
|
93
|
+
kind: 'integer' | 'number' | 'date';
|
|
94
|
+
} ? Range<Scalar<F>> : never);
|
|
95
|
+
type RefField = {
|
|
96
|
+
name: '$ref';
|
|
97
|
+
kind: 'string';
|
|
98
|
+
many: false;
|
|
99
|
+
nullable: false;
|
|
100
|
+
};
|
|
101
|
+
type Options<Schema extends Collection, Mode> = {
|
|
102
|
+
fields?: Array<Fields<Schema>['name'] | '$ref' | '$version'>;
|
|
103
|
+
where?: {
|
|
104
|
+
[F in FilterField<Schema> | RefField as F['name']]?: Condition<F>;
|
|
105
|
+
};
|
|
106
|
+
} & (Mode extends 'one' ? {} : {
|
|
107
|
+
order?: {
|
|
108
|
+
[F in FilterField<Schema> | RefField as F['name']]?: 'asc' | 'desc';
|
|
109
|
+
};
|
|
110
|
+
limit?: number;
|
|
111
|
+
}) & (Mode extends 'top' ? {
|
|
112
|
+
count?: boolean;
|
|
113
|
+
after?: string;
|
|
114
|
+
} : {});
|
|
115
|
+
type Exact<Actual, Allowed> = Actual extends Allowed ? Record<Exclude<keyof Actual, keyof Allowed>, never> : never;
|
|
116
|
+
type ExactUnion<Actual, Allowed> = Allowed extends unknown ? Exact<Actual, Allowed> : never;
|
|
117
|
+
type CheckWhere<Schema extends Collection, Actual> = {
|
|
118
|
+
[Key in keyof Actual]: Key extends (FilterField<Schema> | RefField)['name'] ? Actual[Key] extends object ? ExactUnion<Actual[Key], Condition<Extract<FilterField<Schema> | RefField, {
|
|
119
|
+
name: Key;
|
|
120
|
+
}>>> : unknown : never;
|
|
121
|
+
};
|
|
122
|
+
type CheckOptions<Schema extends Collection, Actual, Mode> = Exact<Actual, Options<Schema, Mode>> & {
|
|
123
|
+
[Key in keyof Actual]: Key extends 'where' ? CheckWhere<Schema, Actual[Key]> : Key extends 'order' ? Exact<Actual[Key], NonNullable<Options<Schema, Mode>[Extract<Key, keyof Options<Schema, Mode>>]>> : unknown;
|
|
124
|
+
};
|
|
125
|
+
type CheckSelection<Schemas extends Catalogue, Schema extends Collection, Query, Mode, Depth extends unknown[]> = Schema extends Collection ? {
|
|
126
|
+
[Key in keyof Query]: Key extends '$' ? CheckOptions<Schema, Query[Key], Mode> : Key extends Fields<Schema>['name'] ? Named<Schema, Key> extends infer Link extends {
|
|
127
|
+
kind: 'link';
|
|
128
|
+
many: boolean;
|
|
129
|
+
} ? Depth['length'] extends 4 ? never : CheckTargets<Schemas, Targets<Schemas, Link>, Query[Key], Link['many'] extends true ? 'many' : 'one', [...Depth, unknown]> : never : never;
|
|
130
|
+
} : never;
|
|
131
|
+
type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer I) => void ? I : never;
|
|
132
|
+
type CheckTargets<Schemas extends Catalogue, Schema extends Collection, Query, Mode, Depth extends unknown[]> = UnionToIntersection<CheckSelection<Schemas, Schema, Query, Mode, Depth>>;
|
|
133
|
+
type CheckQuery<Schemas extends Catalogue, Query> = {
|
|
134
|
+
[Name in keyof Query]: Name extends Schemas['collections'][number]['name'] ? CheckSelection<Schemas, Extract<Schemas['collections'][number], {
|
|
135
|
+
name: Name;
|
|
136
|
+
}>, Query[Name], 'top', []> : never;
|
|
137
|
+
};
|
|
138
|
+
type SelectedNames<Schema extends Collection, Query> = Query extends {
|
|
139
|
+
$: {
|
|
140
|
+
fields: readonly (infer Name)[];
|
|
141
|
+
};
|
|
142
|
+
} ? Extract<Name, Fields<Schema>['name']> : Fields<Schema>['name'];
|
|
143
|
+
type Expanded<Schemas extends Catalogue, F, Query> = F extends {
|
|
144
|
+
kind: 'link';
|
|
145
|
+
} ? Cardinality<F, Project<Schemas, Targets<Schemas, F>, Query>> | (F extends {
|
|
146
|
+
many: false;
|
|
147
|
+
} ? '$' extends keyof Query ? 'where' extends keyof NonNullable<Query['$']> ? null : never : never : never) : never;
|
|
148
|
+
type Project<Schemas extends Catalogue, Schema extends Collection, Query> = Schema extends Collection ? {
|
|
149
|
+
$ref: string;
|
|
150
|
+
$version: string;
|
|
151
|
+
} & {
|
|
152
|
+
[F in Fields<Schema> as F['nullable'] extends true ? never : F['name'] extends SelectedNames<Schema, Query> | Exclude<keyof Query, '$'> ? F['name'] : never]: F['name'] extends keyof Query ? Expanded<Schemas, F, Query[F['name']]> : Value<F>;
|
|
153
|
+
} & {
|
|
154
|
+
[F in Fields<Schema> as F['nullable'] extends true ? F['name'] extends SelectedNames<Schema, Query> | Exclude<keyof Query, '$'> ? F['name'] : never : never]?: F['name'] extends keyof Query ? Expanded<Schemas, F, Query[F['name']]> : Value<F>;
|
|
155
|
+
} : never;
|
|
156
|
+
type OptionalKeys<Value> = {
|
|
157
|
+
[Key in keyof Value]-?: {} extends Pick<Value, Key> ? Key : never;
|
|
158
|
+
}[keyof Value];
|
|
159
|
+
type WidenedOptions<Options> = 'fields' extends keyof Options ? 'fields' extends OptionalKeys<Options> ? true : Options['fields'] extends readonly unknown[] ? number extends Options['fields']['length'] ? true : false : false : false;
|
|
160
|
+
type WidenedSelection<Query> = string extends keyof Query ? true : [OptionalKeys<Query>] extends [never] ? '$' extends keyof Query ? WidenedOptions<Query['$']> extends true ? true : WidenedLinks<Query> : WidenedLinks<Query> : true;
|
|
161
|
+
type WidenedLinks<Query> = true extends {
|
|
162
|
+
[Key in Exclude<keyof Query, '$'>]: WidenedSelection<Query[Key]>;
|
|
163
|
+
}[Exclude<keyof Query, '$'>] ? true : false;
|
|
164
|
+
type Widened<Query> = string extends keyof Query ? true : true extends {
|
|
165
|
+
[Name in keyof Query]: WidenedSelection<Query[Name]>;
|
|
166
|
+
}[keyof Query] ? true : false;
|
|
167
|
+
type Result<Schemas extends Catalogue, Query extends RecordsQuery> = Widened<Query> extends true ? RecordsResult<Query> : {
|
|
168
|
+
$meta: SelectionMetadata;
|
|
169
|
+
} & {
|
|
170
|
+
[Name in keyof Query]: Project<Schemas, Extract<Schemas['collections'][number], {
|
|
171
|
+
name: Name;
|
|
172
|
+
}>, Query[Name]>[];
|
|
173
|
+
};
|
|
174
|
+
type Checked<Schemas extends Catalogue, Query> = Widened<Query> extends true ? unknown : CheckQuery<Schemas, Query>;
|
|
175
|
+
type SchemaRepository<Schemas extends Catalogue> = Omit<DataRepository, 'records'> & {
|
|
176
|
+
records: Omit<DataRepository['records'], 'select' | 'pages' | 'all'> & {
|
|
177
|
+
select<const Query extends RecordsQuery>(query: Query & Checked<Schemas, Query>): Promise<Result<Schemas, Query>>;
|
|
178
|
+
pages<const Query extends RecordsQuery>(query: Query & Checked<Schemas, Query>): AsyncIterable<Result<Schemas, Query>>;
|
|
179
|
+
all<const Query extends RecordsQuery>(query: Query & Checked<Schemas, Query>, options: {
|
|
180
|
+
maxRecords: number;
|
|
181
|
+
}): Promise<Result<Schemas, Query>>;
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
/** Generated metadata refines declarations only; unknown aliases stay generic. */
|
|
185
|
+
export type RepositoryFor<Name extends string> = string extends Name ? DataRepository : Name extends keyof DataRepositorySchemas ? DataRepositorySchemas[Name] extends Catalogue ? SchemaRepository<DataRepositorySchemas[Name]> : DataRepository : DataRepository;
|
|
186
|
+
export {};
|
|
@@ -20,8 +20,11 @@ export type { Connections } from '../../../shared/airtable-contract.js';
|
|
|
20
20
|
export declare const connections: import('../../../shared/airtable-contract.js').Connections;
|
|
21
21
|
export { DataOperationError } from '../../../shared/data-contract.js';
|
|
22
22
|
export type { DataRepository, DataErrorCode, PublicValueDefinition, PublicField, CollectionSummary, CollectionSchema, QueryScalar, SelectionOptions, RecordSelection, RecordsQuery, DataValue, SelectedRecord, SelectionMetadata, RecordsResult, RecordsReadInput, RecordsReadResult, RecordsSearchOptions, RecordsSearchResult, HistoryListOptions, HistoryEntry, HistoryChangesOptions, HistoryChange, HistoryChangesResult, RecordIdentity, RecordCreation, RecordUpdateSet, DataPublication, DataChangeSet, DataEffect } from '../../../shared/data-contract.js';
|
|
23
|
+
/** Reserved for OS-generated normalized schema snapshots; grants no runtime authority. */
|
|
24
|
+
export interface DataRepositorySchemas {
|
|
25
|
+
}
|
|
23
26
|
export declare const data: {
|
|
24
|
-
repository(name:
|
|
27
|
+
repository<const Name extends string>(name: Name): import('./data-schema-types.js').RepositoryFor<Name>;
|
|
25
28
|
};
|
|
26
29
|
export { FileOperationError } from '../../../shared/files-contract.js';
|
|
27
30
|
export { InboxOperationError } from '../../../shared/inbox-member-contract.js';
|
|
@@ -56,9 +56,11 @@ export type RoutineArtifactInput = Readonly<{
|
|
|
56
56
|
sha256: string;
|
|
57
57
|
content: Uint8Array | Blob | ReadableStream<Uint8Array>;
|
|
58
58
|
}>;
|
|
59
|
+
/** Historical artifacts may retain their original Attempt link. New remote
|
|
60
|
+
* artifacts belong directly to the Run and do not fabricate that identity. */
|
|
59
61
|
export type RoutineArtifact = Readonly<{
|
|
60
62
|
id: string;
|
|
61
|
-
attempt
|
|
63
|
+
attempt?: string;
|
|
62
64
|
name: string;
|
|
63
65
|
mediaType: string;
|
|
64
66
|
size: number;
|