@haste-health/operation-outcomes 0.11.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.
- package/README.md +1 -0
- package/lib/index.d.ts +22 -0
- package/lib/index.js +84 -0
- package/lib/index.js.map +1 -0
- package/package.json +29 -0
- package/src/index.ts +167 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# operation-outcomes
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { OperationOutcome } from "@haste-health/fhir-types/r4/types";
|
|
2
|
+
export declare class OperationError extends Error {
|
|
3
|
+
readonly operationOutcome: OperationOutcome;
|
|
4
|
+
constructor(operationOutcome: OperationOutcome);
|
|
5
|
+
get outcome(): OperationOutcome;
|
|
6
|
+
}
|
|
7
|
+
export declare function issueToStatusCode(issue: Issue): number;
|
|
8
|
+
export declare function isOperationError(e: unknown): e is OperationError;
|
|
9
|
+
export declare function outcome(issues: OperationOutcome["issue"]): OperationOutcome;
|
|
10
|
+
type Issue = OperationOutcome["issue"][number];
|
|
11
|
+
type IssueSeverity = "fatal" | "error" | "warning" | "information";
|
|
12
|
+
type IssueType = "invalid" | "structure" | "required" | "value" | "invariant" | "security" | "login" | "unknown" | "expired" | "forbidden" | "suppressed" | "processing" | "not-supported" | "duplicate" | "multiple-matches" | "not-found" | "too-long" | "code-invalid" | "extension" | "too-costly" | "business-rule" | "conflict" | "transient" | "lock-error" | "no-store" | "exception" | "timeout" | "incomplete" | "throttled" | "informational";
|
|
13
|
+
export declare function issue(severity: IssueSeverity, code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): Issue;
|
|
14
|
+
export declare function issueError(code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): Issue;
|
|
15
|
+
export declare function issueFatal(code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): Issue;
|
|
16
|
+
export declare function issueWarning(code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): Issue;
|
|
17
|
+
export declare function issueInfo(code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): Issue;
|
|
18
|
+
export declare function outcomeError(code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): OperationOutcome;
|
|
19
|
+
export declare function outcomeFatal(code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): OperationOutcome;
|
|
20
|
+
export declare function outcomeWarning(code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): OperationOutcome;
|
|
21
|
+
export declare function outcomeInfo(code: IssueType, diagnostics: Issue["diagnostics"], expression?: Issue["expression"]): OperationOutcome;
|
|
22
|
+
export {};
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export class OperationError extends Error {
|
|
2
|
+
operationOutcome;
|
|
3
|
+
constructor(operationOutcome) {
|
|
4
|
+
super();
|
|
5
|
+
this.operationOutcome = operationOutcome;
|
|
6
|
+
}
|
|
7
|
+
get outcome() {
|
|
8
|
+
return this.operationOutcome;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function issueToStatusCode(issue) {
|
|
12
|
+
switch (issue.severity) {
|
|
13
|
+
case "fatal": {
|
|
14
|
+
return 500;
|
|
15
|
+
}
|
|
16
|
+
case "error": {
|
|
17
|
+
switch (issue.code) {
|
|
18
|
+
case "not-found": {
|
|
19
|
+
return 404;
|
|
20
|
+
}
|
|
21
|
+
case "login": {
|
|
22
|
+
return 401;
|
|
23
|
+
}
|
|
24
|
+
case "forbidden": {
|
|
25
|
+
return 403;
|
|
26
|
+
}
|
|
27
|
+
default: {
|
|
28
|
+
return 400;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
case "warning": {
|
|
33
|
+
return 200;
|
|
34
|
+
}
|
|
35
|
+
case "information": {
|
|
36
|
+
return 200;
|
|
37
|
+
}
|
|
38
|
+
default: {
|
|
39
|
+
throw new Error("unknown severity");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function isOperationError(e) {
|
|
44
|
+
return e instanceof OperationError;
|
|
45
|
+
}
|
|
46
|
+
export function outcome(issues) {
|
|
47
|
+
return { resourceType: "OperationOutcome", issue: issues };
|
|
48
|
+
}
|
|
49
|
+
export function issue(severity, code, diagnostics, expression) {
|
|
50
|
+
const issue = {
|
|
51
|
+
severity: severity,
|
|
52
|
+
code: code,
|
|
53
|
+
diagnostics,
|
|
54
|
+
expression,
|
|
55
|
+
};
|
|
56
|
+
if (expression)
|
|
57
|
+
return { ...issue, expression };
|
|
58
|
+
return issue;
|
|
59
|
+
}
|
|
60
|
+
export function issueError(code, diagnostics, expression) {
|
|
61
|
+
return issue("error", code, diagnostics, expression);
|
|
62
|
+
}
|
|
63
|
+
export function issueFatal(code, diagnostics, expression) {
|
|
64
|
+
return issue("fatal", code, diagnostics, expression);
|
|
65
|
+
}
|
|
66
|
+
export function issueWarning(code, diagnostics, expression) {
|
|
67
|
+
return issue("warning", code, diagnostics, expression);
|
|
68
|
+
}
|
|
69
|
+
export function issueInfo(code, diagnostics, expression) {
|
|
70
|
+
return issue("information", code, diagnostics, expression);
|
|
71
|
+
}
|
|
72
|
+
export function outcomeError(code, diagnostics, expression) {
|
|
73
|
+
return outcome([issueError(code, diagnostics, expression)]);
|
|
74
|
+
}
|
|
75
|
+
export function outcomeFatal(code, diagnostics, expression) {
|
|
76
|
+
return outcome([issueFatal(code, diagnostics, expression)]);
|
|
77
|
+
}
|
|
78
|
+
export function outcomeWarning(code, diagnostics, expression) {
|
|
79
|
+
return outcome([issueWarning(code, diagnostics, expression)]);
|
|
80
|
+
}
|
|
81
|
+
export function outcomeInfo(code, diagnostics, expression) {
|
|
82
|
+
return outcome([issueInfo(code, diagnostics, expression)]);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@haste-health/operation-outcomes",
|
|
3
|
+
"version": "0.11.1",
|
|
4
|
+
"homepage": "https://haste.health",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/HasteHealth/HasteHealth.git"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"description": "",
|
|
11
|
+
"main": "lib/index.js",
|
|
12
|
+
"types": "lib/index.d.ts",
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"publish": "pnpm build && pnpm npm publish --access public --tolerate-republish"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@haste-health/fhir-types": "workspace:^",
|
|
19
|
+
"@jest/globals": "^29.7.0",
|
|
20
|
+
"@types/jest": "^29.5.14",
|
|
21
|
+
"jest": "^29.7.0",
|
|
22
|
+
"ts-jest": "^29.3.2",
|
|
23
|
+
"typescript": "5.9.2"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"lib/**",
|
|
27
|
+
"src/**"
|
|
28
|
+
]
|
|
29
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { OperationOutcome, code } from "@haste-health/fhir-types/r4/types";
|
|
2
|
+
|
|
3
|
+
export class OperationError extends Error {
|
|
4
|
+
public readonly operationOutcome: OperationOutcome;
|
|
5
|
+
constructor(operationOutcome: OperationOutcome) {
|
|
6
|
+
super();
|
|
7
|
+
this.operationOutcome = operationOutcome;
|
|
8
|
+
}
|
|
9
|
+
get outcome() {
|
|
10
|
+
return this.operationOutcome;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function issueToStatusCode(issue: Issue): number {
|
|
15
|
+
switch (issue.severity) {
|
|
16
|
+
case "fatal": {
|
|
17
|
+
return 500;
|
|
18
|
+
}
|
|
19
|
+
case "error": {
|
|
20
|
+
switch (issue.code) {
|
|
21
|
+
case "not-found": {
|
|
22
|
+
return 404;
|
|
23
|
+
}
|
|
24
|
+
case "login": {
|
|
25
|
+
return 401;
|
|
26
|
+
}
|
|
27
|
+
case "forbidden": {
|
|
28
|
+
return 403;
|
|
29
|
+
}
|
|
30
|
+
default: {
|
|
31
|
+
return 400;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
case "warning": {
|
|
36
|
+
return 200;
|
|
37
|
+
}
|
|
38
|
+
case "information": {
|
|
39
|
+
return 200;
|
|
40
|
+
}
|
|
41
|
+
default: {
|
|
42
|
+
throw new Error("unknown severity");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function isOperationError(e: unknown): e is OperationError {
|
|
48
|
+
return e instanceof OperationError;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function outcome(issues: OperationOutcome["issue"]): OperationOutcome {
|
|
52
|
+
return { resourceType: "OperationOutcome", issue: issues };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
type Issue = OperationOutcome["issue"][number];
|
|
56
|
+
type IssueSeverity = "fatal" | "error" | "warning" | "information";
|
|
57
|
+
type IssueType =
|
|
58
|
+
| "invalid"
|
|
59
|
+
| "structure"
|
|
60
|
+
| "required"
|
|
61
|
+
| "value"
|
|
62
|
+
| "invariant"
|
|
63
|
+
| "security"
|
|
64
|
+
| "login"
|
|
65
|
+
| "unknown"
|
|
66
|
+
| "expired"
|
|
67
|
+
| "forbidden"
|
|
68
|
+
| "suppressed"
|
|
69
|
+
| "processing"
|
|
70
|
+
| "not-supported"
|
|
71
|
+
| "duplicate"
|
|
72
|
+
| "multiple-matches"
|
|
73
|
+
| "not-found"
|
|
74
|
+
| "too-long"
|
|
75
|
+
| "code-invalid"
|
|
76
|
+
| "extension"
|
|
77
|
+
| "too-costly"
|
|
78
|
+
| "business-rule"
|
|
79
|
+
| "conflict"
|
|
80
|
+
| "transient"
|
|
81
|
+
| "lock-error"
|
|
82
|
+
| "no-store"
|
|
83
|
+
| "exception"
|
|
84
|
+
| "timeout"
|
|
85
|
+
| "incomplete"
|
|
86
|
+
| "throttled"
|
|
87
|
+
| "informational";
|
|
88
|
+
|
|
89
|
+
export function issue(
|
|
90
|
+
severity: IssueSeverity,
|
|
91
|
+
code: IssueType,
|
|
92
|
+
diagnostics: Issue["diagnostics"],
|
|
93
|
+
expression?: Issue["expression"]
|
|
94
|
+
): Issue {
|
|
95
|
+
const issue = {
|
|
96
|
+
severity: severity as code,
|
|
97
|
+
code: code as code,
|
|
98
|
+
diagnostics,
|
|
99
|
+
expression,
|
|
100
|
+
};
|
|
101
|
+
if (expression) return { ...issue, expression };
|
|
102
|
+
return issue;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function issueError(
|
|
106
|
+
code: IssueType,
|
|
107
|
+
diagnostics: Issue["diagnostics"],
|
|
108
|
+
expression?: Issue["expression"]
|
|
109
|
+
): Issue {
|
|
110
|
+
return issue("error", code, diagnostics, expression);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function issueFatal(
|
|
114
|
+
code: IssueType,
|
|
115
|
+
diagnostics: Issue["diagnostics"],
|
|
116
|
+
expression?: Issue["expression"]
|
|
117
|
+
): Issue {
|
|
118
|
+
return issue("fatal", code, diagnostics, expression);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function issueWarning(
|
|
122
|
+
code: IssueType,
|
|
123
|
+
diagnostics: Issue["diagnostics"],
|
|
124
|
+
expression?: Issue["expression"]
|
|
125
|
+
): Issue {
|
|
126
|
+
return issue("warning", code, diagnostics, expression);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function issueInfo(
|
|
130
|
+
code: IssueType,
|
|
131
|
+
diagnostics: Issue["diagnostics"],
|
|
132
|
+
expression?: Issue["expression"]
|
|
133
|
+
): Issue {
|
|
134
|
+
return issue("information", code, diagnostics, expression);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function outcomeError(
|
|
138
|
+
code: IssueType,
|
|
139
|
+
diagnostics: Issue["diagnostics"],
|
|
140
|
+
expression?: Issue["expression"]
|
|
141
|
+
): OperationOutcome {
|
|
142
|
+
return outcome([issueError(code, diagnostics, expression)]);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function outcomeFatal(
|
|
146
|
+
code: IssueType,
|
|
147
|
+
diagnostics: Issue["diagnostics"],
|
|
148
|
+
expression?: Issue["expression"]
|
|
149
|
+
): OperationOutcome {
|
|
150
|
+
return outcome([issueFatal(code, diagnostics, expression)]);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function outcomeWarning(
|
|
154
|
+
code: IssueType,
|
|
155
|
+
diagnostics: Issue["diagnostics"],
|
|
156
|
+
expression?: Issue["expression"]
|
|
157
|
+
): OperationOutcome {
|
|
158
|
+
return outcome([issueWarning(code, diagnostics, expression)]);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function outcomeInfo(
|
|
162
|
+
code: IssueType,
|
|
163
|
+
diagnostics: Issue["diagnostics"],
|
|
164
|
+
expression?: Issue["expression"]
|
|
165
|
+
): OperationOutcome {
|
|
166
|
+
return outcome([issueInfo(code, diagnostics, expression)]);
|
|
167
|
+
}
|