-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDirDescriptor.ts
142 lines (123 loc) · 4.08 KB
/
DirDescriptor.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import { ManualMimeTypes } from "./IServiceConfig.ts";
export type StorePattern = "store" | "store-transform" | "store-view" | "store-operation" | "store-directory";
export type ApiPattern = StorePattern | "transform" | "view" | "operation" | "directory";
export interface StoreDetails {
storeMimeTypes: string[],
createDirectory: boolean,
createFiles: boolean,
exceptionMimeTypes?: Record<string, [ string, string ]>
}
export interface TransformDetails {
reqMimeType: string,
respMimeType: string
}
export interface ViewDetails {
respMimeType: string
}
export interface OperationDetails {
reqMimeType: string
}
/**
* A store is a directory which allows resources to be dynamically created and deleted.
* PUT requests create resources, GET requests read the current value and DELETE requests delete the resource.
*/
export interface StoreSpec extends StoreDetails {
pattern: "store"
}
/**
* A transform is a resource which transforms data it receives via a POST request
*/
export interface TransformSpec extends TransformDetails {
pattern: "transform"
}
/**
* A store-transform is a directory where each resource defines a transform which
* can be used to transform data sent to the resource via a POST request.
*/
export interface StoreTransformSpec extends StoreDetails, TransformDetails {
pattern: "store-transform",
}
/**
* A view is a resource which returns data to a GET request only
*/
export interface ViewSpec extends ViewDetails {
pattern: "view"
}
export interface StoreViewSpec extends StoreDetails, ViewDetails {
pattern: "store-view"
}
/**
* An operation is a resource to which you POST or PUT data which takes an action but does not return data
*/
export interface OperationSpec extends OperationDetails {
pattern: "operation"
}
export interface StoreOperationSpec extends StoreDetails, OperationDetails {
pattern: "store-operation"
}
/**
* A directory is a directory which contains a number of fixed urls which are
*/
export interface DirectorySpec {
pattern: "directory",
}
export interface StoreDirectorySpec extends StoreDetails {
pattern: "store-directory"
}
export type AnyStoreSpec = StoreSpec | StoreTransformSpec | StoreViewSpec | StoreOperationSpec | StoreDirectorySpec;
export type ApiSpec = AnyStoreSpec | TransformSpec
| ViewSpec
| OperationSpec
| DirectorySpec;
export type PathInfo = [ name: string, dateModified?: number, mimeType?: string, writeMimeType?: string ]
| [ name: string, dateModified?: number, spec?: ApiSpec ];
export interface DirDescriptor {
path: string;
paths: PathInfo[];
spec?: ApiSpec;
}
export const storeDescriptor = (storePattern: StorePattern, createDirectory: boolean, createFiles: boolean, storeMimeTypes: string[], transformMimeTypes?: ManualMimeTypes) => {
let spec: AnyStoreSpec;
const storeProps = {
storeMimeTypes,
createDirectory,
createFiles
};
switch (storePattern) {
case "store-transform":
spec = {
pattern: "store-transform",
...storeProps,
reqMimeType: transformMimeTypes?.requestMimeType,
respMimeType: transformMimeTypes?.responseMimeType
} as StoreTransformSpec;
break;
case "store-directory":
spec = {
pattern: "store-directory",
...storeProps
} as StoreDirectorySpec;
break;
case "store-operation":
spec = {
pattern: "store-operation",
...storeProps,
reqMimeType: transformMimeTypes?.requestMimeType
} as StoreOperationSpec;
break;
case "store-view":
spec = {
pattern: "store-view",
...storeProps,
respMimeType: transformMimeTypes?.responseMimeType
} as StoreViewSpec;
break;
default:
spec = {
pattern: "store",
...storeProps
} as StoreSpec;
break;
}
return spec;
}