@mkja/o-data 0.0.1

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.
@@ -0,0 +1,155 @@
1
+ import type { Schema, EntityType, ODataType, NavigationType, PrimitiveName, ComplexTypeDefinition } from './schema';
2
+ export type EntityTypeNameFromEntitySet<S extends Schema<S>, ES extends keyof S['entitysets']> = S['entitysets'][ES]['entitytype'];
3
+ export type EntityTypeFromEntitySet<S extends Schema<S>, ES extends keyof S['entitysets']> = S['entitytypes'][EntityTypeNameFromEntitySet<S, ES>];
4
+ export type FlattenEntityType<S extends Schema<S>, ET extends keyof S['entitytypes'], Visited extends string = never> = ET extends Visited ? never : S['entitytypes'][ET] extends {
5
+ baseType?: infer Base;
6
+ properties: infer Props;
7
+ } ? Base extends keyof S['entitytypes'] & string ? {
8
+ baseType?: Base;
9
+ properties: FlattenEntityType<S, Base, Visited | Extract<ET, string>>['properties'] & Props;
10
+ } : S['entitytypes'][ET] : S['entitytypes'][ET];
11
+ export type EntitySetsForEntityType<S extends Schema<S>, ET extends keyof S['entitytypes']> = Extract<{
12
+ [ES in keyof S['entitysets']]: S['entitysets'][ES]['entitytype'] extends ET ? ES : never;
13
+ }[keyof S['entitysets']], string>;
14
+ export type ExtractProperties<ET extends {
15
+ properties: Record<string, any>;
16
+ }> = {
17
+ [K in keyof ET['properties'] as ET['properties'][K] extends NavigationType<any> ? never : K]: ET['properties'][K];
18
+ };
19
+ export type ExtractNavigations<ET extends EntityType<any, any, any>> = {
20
+ [K in keyof ET['properties'] as ET['properties'][K] extends NavigationType<any> ? K : never]: ET['properties'][K] extends NavigationType<infer Target> ? {
21
+ target: Target;
22
+ collection: ET['properties'][K] extends {
23
+ collection: true;
24
+ } ? true : false;
25
+ } : never;
26
+ };
27
+ type PrimitiveToTS<P extends PrimitiveName> = P extends 'Edm.Boolean' ? boolean : P extends 'Edm.String' | 'Edm.Guid' | 'Edm.Duration' | 'Edm.TimeOfDay' ? string : P extends 'Edm.Binary' ? string : P extends 'Edm.Date' | 'Edm.DateTimeOffset' ? Date : P extends 'Edm.Byte' | 'Edm.Int16' | 'Edm.Int32' | 'Edm.Int64' | 'Edm.SByte' | 'Edm.Single' | 'Edm.Double' | 'Edm.Decimal' ? number : P extends 'Edm.Stream' | 'Edm.Untyped' | 'Edm.Geography' | 'Edm.GeographyPoint' | 'Edm.GeographyLineString' | 'Edm.GeographyPolygon' | 'Edm.GeographyMultiPoint' | 'Edm.GeographyMultiLineString' | 'Edm.GeographyMultiPolygon' | 'Edm.GeographyCollection' | 'Edm.Geometry' | 'Edm.GeometryPoint' | 'Edm.GeometryLineString' | 'Edm.GeometryPolygon' | 'Edm.GeometryMultiPoint' | 'Edm.GeometryMultiLineString' | 'Edm.GeometryMultiPolygon' | 'Edm.GeometryCollection' | 'Edm.ModelElementPath' | 'Edm.AnyPropertyPath' ? any : never;
28
+ type EnumToTS<Target extends string, S extends Schema<S>> = Target extends keyof NonNullable<S['enumtypes']> ? NonNullable<S['enumtypes']>[Target] extends {
29
+ members: infer Members;
30
+ } ? Members extends Record<string, any> ? keyof Members : never : never : never;
31
+ type ComplexTypeToTS<Target extends string, S extends Schema<S>, Visited extends string = never> = Target extends Visited ? never : Target extends keyof NonNullable<S['complextypes']> ? NonNullable<S['complextypes']>[Target] extends ComplexTypeDefinition<any, any, any> ? {
32
+ readonly [K in keyof NonNullable<S['complextypes']>[Target]]: ODataTypeToTS<NonNullable<S['complextypes']>[Target][K], S, Visited | Target>;
33
+ } : never : any;
34
+ export type ODataTypeToTS<T extends ODataType<any, any, any>, S extends Schema<S>, Visited extends string = never> = T extends {
35
+ collection: true;
36
+ } ? T extends {
37
+ type: 'enum';
38
+ target: infer Target;
39
+ } ? Target extends string ? Array<'nullable' extends keyof T ? T['nullable'] extends false ? EnumToTS<Target, S> : EnumToTS<Target, S> | null : EnumToTS<Target, S> | null> : never : T extends {
40
+ type: 'complex';
41
+ target: infer Target;
42
+ } ? Target extends string ? Array<'nullable' extends keyof T ? T['nullable'] extends false ? ComplexTypeToTS<Target, S, Visited> : ComplexTypeToTS<Target, S, Visited> | null : ComplexTypeToTS<Target, S, Visited> | null> : never : T extends {
43
+ type: infer P;
44
+ } ? P extends PrimitiveName ? Array<'nullable' extends keyof T ? T['nullable'] extends false ? PrimitiveToTS<P> : PrimitiveToTS<P> | null : PrimitiveToTS<P> | null> : never : never : T extends {
45
+ type: 'enum';
46
+ target: infer Target;
47
+ } ? Target extends string ? 'nullable' extends keyof T ? T['nullable'] extends false ? EnumToTS<Target, S> : EnumToTS<Target, S> | null : EnumToTS<Target, S> | null : never : T extends {
48
+ type: 'complex';
49
+ target: infer Target;
50
+ } ? Target extends string ? 'nullable' extends keyof T ? T['nullable'] extends false ? ComplexTypeToTS<Target, S, Visited> : ComplexTypeToTS<Target, S, Visited> | null : ComplexTypeToTS<Target, S, Visited> | null : never : T extends {
51
+ type: infer P;
52
+ } ? P extends PrimitiveName ? 'nullable' extends keyof T ? T['nullable'] extends false ? PrimitiveToTS<P> : PrimitiveToTS<P> | null : PrimitiveToTS<P> | null : never : never;
53
+ type MapPropertiesToTS<Props extends Record<string, ODataType<any, any, any>>, S extends Schema<S>> = {
54
+ readonly [K in keyof Props]: ODataTypeToTS<Props[K], S>;
55
+ };
56
+ export type QueryableEntity = {
57
+ readonly properties: {
58
+ readonly [key: string]: any;
59
+ };
60
+ readonly navigations: {
61
+ readonly [key: string]: {
62
+ target: any;
63
+ targetEntitysetKey: string | string[];
64
+ collection: boolean;
65
+ };
66
+ };
67
+ };
68
+ export type EntitySetToQueryableEntity<S extends Schema<S>, ES extends keyof S['entitysets']> = {
69
+ readonly properties: MapPropertiesToTS<ExtractProperties<FlattenEntityType<S, EntityTypeNameFromEntitySet<S, ES>> extends infer Flattened ? Flattened extends {
70
+ properties: Record<string, any>;
71
+ } ? Flattened : {
72
+ properties: Record<string, never>;
73
+ } : {
74
+ properties: Record<string, never>;
75
+ }>, S>;
76
+ readonly navigations: {
77
+ readonly [K in keyof ExtractNavigations<FlattenEntityType<S, EntityTypeNameFromEntitySet<S, ES>> extends infer Flattened ? Flattened extends {
78
+ properties: Record<string, any>;
79
+ } ? Flattened : {
80
+ properties: Record<string, never>;
81
+ } : {
82
+ properties: Record<string, never>;
83
+ }>]: ExtractNavigations<FlattenEntityType<S, EntityTypeNameFromEntitySet<S, ES>> extends infer Flattened ? Flattened extends {
84
+ properties: Record<string, any>;
85
+ } ? Flattened : {
86
+ properties: Record<string, never>;
87
+ } : {
88
+ properties: Record<string, never>;
89
+ }>[K] extends {
90
+ target: infer Target;
91
+ collection: infer C;
92
+ } ? Target extends keyof S['entitytypes'] ? EntitySetsForEntityType<S, Target> extends infer EntitySetKey ? EntitySetKey extends string ? {
93
+ readonly target: EntitySetToQueryableEntity<S, EntitySetKey>;
94
+ readonly targetEntitysetKey: EntitySetKey;
95
+ readonly collection: C extends true ? true : C extends false ? false : boolean;
96
+ } : {
97
+ readonly target: any;
98
+ readonly targetEntitysetKey: string | string[];
99
+ readonly collection: boolean;
100
+ } : {
101
+ readonly target: any;
102
+ readonly targetEntitysetKey: string | string[];
103
+ readonly collection: boolean;
104
+ } : {
105
+ readonly target: any;
106
+ readonly targetEntitysetKey: string | string[];
107
+ readonly collection: boolean;
108
+ } : never;
109
+ };
110
+ };
111
+ export type BoundOperationsForEntity<Ops extends Record<string, any>, Target extends string, Scope extends 'entity' | 'collection'> = {
112
+ [K in keyof Ops]: Ops[K] extends {
113
+ type: 'bound';
114
+ target: infer T;
115
+ collection: infer C;
116
+ } ? T extends Target ? C extends boolean ? C extends false ? Scope extends 'entity' ? Ops[K] : never : Scope extends 'collection' ? Ops[K] : never : never : never : never;
117
+ };
118
+ export type BoundOperationKeys<Ops extends Record<string, any>, Target extends string, Scope extends 'entity' | 'collection'> = keyof BoundOperationsForEntity<Ops, Target, Scope>;
119
+ export type UnboundActionKeys<S extends Schema<S>> = {
120
+ [K in keyof NonNullable<S['actions']>]: NonNullable<S['actions']>[K] extends {
121
+ type: 'unbound';
122
+ } ? K : never;
123
+ }[keyof NonNullable<S['actions']>];
124
+ export type UnboundFunctionKeys<S extends Schema<S>> = {
125
+ [K in keyof NonNullable<S['functions']>]: NonNullable<S['functions']>[K] extends {
126
+ type: 'unbound';
127
+ } ? K : never;
128
+ }[keyof NonNullable<S['functions']>];
129
+ export type ImportedActionKeys<S extends Schema<S>> = S['actionImports'] extends Record<string, any> ? Extract<keyof S['actionImports'], string> : never;
130
+ export type ImportedFunctionKeys<S extends Schema<S>> = S['functionImports'] extends Record<string, any> ? Extract<keyof S['functionImports'], string> : never;
131
+ export type ResolveActionFromImport<S extends Schema<S>, ImportName extends string> = ImportName extends keyof NonNullable<S['actionImports']> ? NonNullable<S['actionImports']>[ImportName] extends {
132
+ action: infer A;
133
+ } ? A extends string ? A : never : never : never;
134
+ export type ResolveFunctionFromImport<S extends Schema<S>, ImportName extends string> = ImportName extends keyof NonNullable<S['functionImports']> ? NonNullable<S['functionImports']>[ImportName] extends {
135
+ function: infer F;
136
+ } ? F extends string ? F : never : never : never;
137
+ export type BoundActionKeysForEntitySet<S extends Schema<S>, ES extends keyof S['entitysets'], Scope extends 'entity' | 'collection'> = {
138
+ [K in keyof NonNullable<S['actions']>]: NonNullable<S['actions']>[K] extends {
139
+ type: 'bound';
140
+ target: EntityTypeNameFromEntitySet<S, ES>;
141
+ collection: Scope extends 'collection' ? true : false;
142
+ } ? K : never;
143
+ }[keyof NonNullable<S['actions']>];
144
+ export type BoundFunctionKeysForEntitySet<S extends Schema<S>, ES extends keyof S['entitysets'], Scope extends 'entity' | 'collection'> = {
145
+ [K in keyof NonNullable<S['functions']>]: NonNullable<S['functions']>[K] extends {
146
+ type: 'bound';
147
+ target: EntityTypeNameFromEntitySet<S, ES>;
148
+ collection: Scope extends 'collection' ? true : false;
149
+ } ? K : never;
150
+ }[keyof NonNullable<S['functions']>];
151
+ export type IsNever<T> = [T] extends [never] ? true : false;
152
+ export type NonNeverKeys<T extends Record<string, any>> = {
153
+ [K in keyof T]: IsNever<T[K]> extends true ? never : K;
154
+ }[keyof T];
155
+ export {};
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // ============================================================================
2
+ // Type-Level Navigation Helpers
3
+ // ============================================================================
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@mkja/o-data",
3
+ "version": "0.0.1",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/m-kj-aldrin/o-data"
7
+ },
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "type": "module",
13
+ "main": "dist/index.js",
14
+ "module": "dist/index.js",
15
+ "types": "dist/index.d.ts",
16
+ "exports": {
17
+ ".": "./dist/index.js",
18
+ "./parser": "./dist/parser/config.js",
19
+ "./schema": "./dist/schema.js"
20
+ },
21
+ "bin": {
22
+ "o-data": "dist/cli.js"
23
+ },
24
+ "scripts": {
25
+ "build": "bun x tsc -p tsconfig.build.json"
26
+ },
27
+ "devDependencies": {
28
+ "@types/bun": "latest",
29
+ "typescript": "^5.0.0"
30
+ },
31
+ "dependencies": {
32
+ "fast-xml-parser": "^5.3.2"
33
+ }
34
+ }