@fnndsc/cumin 3.27.2 → 3.27.4
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.
|
@@ -84,6 +84,15 @@ export declare function client_adminUrlEnsure(client: Client): Promise<string |
|
|
|
84
84
|
* @throws {Error} When the client has no advertised administrative endpoint.
|
|
85
85
|
*/
|
|
86
86
|
export declare function client_adminRequest(client: Client, path: string, method: 'get' | 'post', data?: Record<string, string>): Promise<unknown>;
|
|
87
|
+
/**
|
|
88
|
+
* CUBE's own words for a refusal, from whatever body it sent: a
|
|
89
|
+
* Collection+JSON error, Django REST field errors (\`{"username": ["…"]}\`)
|
|
90
|
+
* or a \`detail\`, else the body itself.
|
|
91
|
+
*
|
|
92
|
+
* @param body - The response body, as text.
|
|
93
|
+
* @returns The reason, one line.
|
|
94
|
+
*/
|
|
95
|
+
export declare function refusalReason_of(body: string): string;
|
|
87
96
|
/**
|
|
88
97
|
* Narrows an arbitrary resource to a chrisapi ListResource.
|
|
89
98
|
*
|
package/dist/chrisapi/adapter.js
CHANGED
|
@@ -57,6 +57,7 @@ exports.client_create = client_create;
|
|
|
57
57
|
exports.client_authGet = client_authGet;
|
|
58
58
|
exports.client_adminUrlEnsure = client_adminUrlEnsure;
|
|
59
59
|
exports.client_adminRequest = client_adminRequest;
|
|
60
|
+
exports.refusalReason_of = refusalReason_of;
|
|
60
61
|
exports.resource_isList = resource_isList;
|
|
61
62
|
exports.listData_get = listData_get;
|
|
62
63
|
exports.itemData_get = itemData_get;
|
|
@@ -136,7 +137,61 @@ async function client_adminRequest(client, path, method, data) {
|
|
|
136
137
|
if (method === 'get')
|
|
137
138
|
return (await request.get(url)).data;
|
|
138
139
|
const template = { template: { data: Object.entries(data ?? {}).map(([name, value]) => ({ name, value })) } };
|
|
139
|
-
|
|
140
|
+
// Posted directly rather than through chrisapi's Request: on a refusal
|
|
141
|
+
// whose body is not Collection+JSON (Django REST's field errors are plain
|
|
142
|
+
// JSON), chrisapi replaces the message with "Bad server response!" and
|
|
143
|
+
// overwrites the body with it, so CUBE's reason never reached anyone.
|
|
144
|
+
const response = await fetch(url, {
|
|
145
|
+
method: 'POST',
|
|
146
|
+
headers: {
|
|
147
|
+
Authorization: `Token ${client_authGet(client).token}`,
|
|
148
|
+
'Content-Type': 'application/vnd.collection+json',
|
|
149
|
+
Accept: 'application/vnd.collection+json',
|
|
150
|
+
},
|
|
151
|
+
body: JSON.stringify(template),
|
|
152
|
+
});
|
|
153
|
+
const text = await response.text();
|
|
154
|
+
if (!response.ok)
|
|
155
|
+
throw new Error(`CUBE refused POST ${url} (HTTP ${response.status}): ${refusalReason_of(text)}`);
|
|
156
|
+
try {
|
|
157
|
+
return JSON.parse(text);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
throw new Error(`CUBE answered HTTP ${response.status} with a body that is not JSON`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* CUBE's own words for a refusal, from whatever body it sent: a
|
|
165
|
+
* Collection+JSON error, Django REST field errors (\`{"username": ["…"]}\`)
|
|
166
|
+
* or a \`detail\`, else the body itself.
|
|
167
|
+
*
|
|
168
|
+
* @param body - The response body, as text.
|
|
169
|
+
* @returns The reason, one line.
|
|
170
|
+
*/
|
|
171
|
+
function refusalReason_of(body) {
|
|
172
|
+
let parsed;
|
|
173
|
+
try {
|
|
174
|
+
parsed = JSON.parse(body);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// An HTML error page (Django's own 403 or 500) says why in its text:
|
|
178
|
+
// the title, the heading, the first paragraph. Styles and scripts go.
|
|
179
|
+
const text = body
|
|
180
|
+
.replace(/<(style|script)[\s\S]*?<\/\1>/gi, ' ')
|
|
181
|
+
.replace(/<[^>]+>/g, ' ')
|
|
182
|
+
.replace(/ /g, ' ')
|
|
183
|
+
.replace(/\s+/g, ' ')
|
|
184
|
+
.trim();
|
|
185
|
+
return text.slice(0, 300) || 'no reason given';
|
|
186
|
+
}
|
|
187
|
+
const record = (parsed && typeof parsed === 'object' ? parsed : {});
|
|
188
|
+
const collection = record['collection'];
|
|
189
|
+
if (collection?.error?.message !== undefined)
|
|
190
|
+
return refusalReason_of(String(collection.error.message));
|
|
191
|
+
if (typeof record['detail'] === 'string')
|
|
192
|
+
return record['detail'];
|
|
193
|
+
const parts = Object.entries(record).map(([field, value]) => `${field}: ${Array.isArray(value) ? value.map(String).join(' ') : String(value)}`);
|
|
194
|
+
return parts.length > 0 ? parts.join('; ') : 'no reason given';
|
|
140
195
|
}
|
|
141
196
|
/**
|
|
142
197
|
* Narrows an arbitrary resource to a chrisapi ListResource.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/chrisapi/adapter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmEH,sCAMC;AASD,sCAEC;AAQD,wCAEC;AAUD,sDAUC;AAYD,
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/chrisapi/adapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fnndsc/cumin",
|
|
3
|
-
"version": "3.27.
|
|
3
|
+
"version": "3.27.4",
|
|
4
4
|
"description": "Utility library for ChILI and other ChRIS-related JavaScript applications",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -68,6 +68,6 @@
|
|
|
68
68
|
"@fnndsc/chrisapi": "^1.25.0",
|
|
69
69
|
"chalk": "^4.1.2",
|
|
70
70
|
"figlet": "^1.7.0",
|
|
71
|
-
"@fnndsc/menu": "^0.
|
|
71
|
+
"@fnndsc/menu": "^0.18.0"
|
|
72
72
|
}
|
|
73
73
|
}
|