decap-cms-lib-util 3.0.2 → 3.0.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.
- package/CHANGELOG.md +92 -84
- package/README.md +1 -1
- package/dist/decap-cms-lib-util.js +1 -1
- package/dist/decap-cms-lib-util.js.map +1 -1
- package/dist/esm/API.js +156 -2
- package/dist/esm/APIError.js +2 -2
- package/dist/esm/AccessTokenError.js +2 -2
- package/dist/esm/Cursor.js +2 -2
- package/dist/esm/EditorialWorkflowError.js +2 -2
- package/dist/esm/git-lfs.js +2 -2
- package/dist/esm/implementation.js +2 -2
- package/dist/esm/index.js +7 -0
- package/dist/esm/unsentRequest.js +2 -2
- package/package.json +3 -3
- package/src/API.ts +154 -0
- package/src/__tests__/api.spec.js +1 -0
- package/src/index.ts +3 -0
package/dist/esm/API.js
CHANGED
|
@@ -4,8 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.PreviewState = void 0;
|
|
7
|
+
exports.apiRequest = apiRequest;
|
|
8
|
+
exports.endpointConstants = exports.apiRoots = void 0;
|
|
9
|
+
exports.getDefaultBranchName = getDefaultBranchName;
|
|
7
10
|
exports.getPreviewStatus = getPreviewStatus;
|
|
8
11
|
exports.isPreviewContext = isPreviewContext;
|
|
12
|
+
exports.parseResponse = parseResponse;
|
|
9
13
|
exports.readFile = readFile;
|
|
10
14
|
exports.readFileMetadata = readFileMetadata;
|
|
11
15
|
exports.requestWithBackoff = requestWithBackoff;
|
|
@@ -13,10 +17,15 @@ exports.throwOnConflictingBranches = throwOnConflictingBranches;
|
|
|
13
17
|
var _asyncLock = require("./asyncLock");
|
|
14
18
|
var _unsentRequest = _interopRequireDefault(require("./unsentRequest"));
|
|
15
19
|
var _APIError = _interopRequireDefault(require("./APIError"));
|
|
20
|
+
const _excluded = ["token", "backend"];
|
|
16
21
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
22
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
23
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
24
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
25
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
26
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
18
|
-
function _toPropertyKey(
|
|
19
|
-
function _toPrimitive(
|
|
27
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
28
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
20
29
|
function _extendableBuiltin(cls) {
|
|
21
30
|
function ExtendableBuiltin() {
|
|
22
31
|
var instance = Reflect.construct(cls, Array.from(arguments));
|
|
@@ -51,6 +60,24 @@ class RateLimitError extends _extendableBuiltin(Error) {
|
|
|
51
60
|
}
|
|
52
61
|
}
|
|
53
62
|
}
|
|
63
|
+
async function parseJsonResponse(response) {
|
|
64
|
+
const json = await response.json();
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
return Promise.reject(json);
|
|
67
|
+
}
|
|
68
|
+
return json;
|
|
69
|
+
}
|
|
70
|
+
function parseResponse(response) {
|
|
71
|
+
const contentType = response.headers.get('Content-Type');
|
|
72
|
+
if (contentType && contentType.match(/json/)) {
|
|
73
|
+
return parseJsonResponse(response);
|
|
74
|
+
}
|
|
75
|
+
const textPromise = response.text().then(text => {
|
|
76
|
+
if (!response.ok) return Promise.reject(text);
|
|
77
|
+
return text;
|
|
78
|
+
});
|
|
79
|
+
return textPromise;
|
|
80
|
+
}
|
|
54
81
|
async function requestWithBackoff(api, req, attempt = 1) {
|
|
55
82
|
if (api.rateLimiter) {
|
|
56
83
|
await api.rateLimiter.acquire();
|
|
@@ -96,6 +123,133 @@ async function requestWithBackoff(api, req, attempt = 1) {
|
|
|
96
123
|
}
|
|
97
124
|
}
|
|
98
125
|
}
|
|
126
|
+
|
|
127
|
+
// Options is an object which contains all the standard network request properties
|
|
128
|
+
// for modifying HTTP requests and may contains `params` property
|
|
129
|
+
|
|
130
|
+
// RequestConfig contains all the standard properties of a Request object and
|
|
131
|
+
// several custom properties:
|
|
132
|
+
// - "headers" property is an object whose properties and values are string types
|
|
133
|
+
// - `token` property to allow passing tokens for users using a private repo.
|
|
134
|
+
// - `params` property for customizing response
|
|
135
|
+
// - `backend`(compulsory) to specify which backend to be used: Github, Gitlab etc.
|
|
136
|
+
|
|
137
|
+
const apiRoots = exports.apiRoots = {
|
|
138
|
+
github: 'https://api.github.com',
|
|
139
|
+
gitlab: 'https://gitlab.com/api/v4',
|
|
140
|
+
bitbucket: 'https://api.bitbucket.org/2.0'
|
|
141
|
+
};
|
|
142
|
+
const endpointConstants = exports.endpointConstants = {
|
|
143
|
+
singleRepo: {
|
|
144
|
+
bitbucket: '/repositories',
|
|
145
|
+
github: '/repos',
|
|
146
|
+
gitlab: '/projects'
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
const api = {
|
|
150
|
+
buildRequest(req) {
|
|
151
|
+
return req;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
function constructUrlWithParams(url, params) {
|
|
155
|
+
if (params) {
|
|
156
|
+
const paramList = [];
|
|
157
|
+
for (const key in params) {
|
|
158
|
+
paramList.push(`${key}=${encodeURIComponent(params[key])}`);
|
|
159
|
+
}
|
|
160
|
+
if (paramList.length) {
|
|
161
|
+
url += `?${paramList.join('&')}`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return url;
|
|
165
|
+
}
|
|
166
|
+
async function constructRequestHeaders(headerConfig) {
|
|
167
|
+
const {
|
|
168
|
+
token,
|
|
169
|
+
headers
|
|
170
|
+
} = headerConfig;
|
|
171
|
+
const baseHeaders = _objectSpread({
|
|
172
|
+
'Content-Type': 'application/json; charset=utf-8'
|
|
173
|
+
}, headers);
|
|
174
|
+
if (token) {
|
|
175
|
+
baseHeaders['Authorization'] = `token ${token}`;
|
|
176
|
+
}
|
|
177
|
+
return Promise.resolve(baseHeaders);
|
|
178
|
+
}
|
|
179
|
+
function handleRequestError(error, responseStatus, backend) {
|
|
180
|
+
throw new _APIError.default(error.message, responseStatus, backend);
|
|
181
|
+
}
|
|
182
|
+
async function apiRequest(path, config, parser = response => parseResponse(response)) {
|
|
183
|
+
const {
|
|
184
|
+
token,
|
|
185
|
+
backend
|
|
186
|
+
} = config,
|
|
187
|
+
props = _objectWithoutProperties(config, _excluded);
|
|
188
|
+
const options = _objectSpread({
|
|
189
|
+
cache: 'no-cache'
|
|
190
|
+
}, props);
|
|
191
|
+
const headers = await constructRequestHeaders({
|
|
192
|
+
headers: options.headers || {},
|
|
193
|
+
token
|
|
194
|
+
});
|
|
195
|
+
const baseUrl = apiRoots[backend];
|
|
196
|
+
const url = constructUrlWithParams(`${baseUrl}${path}`, options.params);
|
|
197
|
+
let responseStatus = 500;
|
|
198
|
+
try {
|
|
199
|
+
const req = _unsentRequest.default.fromFetchArguments(url, _objectSpread(_objectSpread({}, options), {}, {
|
|
200
|
+
headers
|
|
201
|
+
}));
|
|
202
|
+
const response = await requestWithBackoff(api, req);
|
|
203
|
+
responseStatus = response.status;
|
|
204
|
+
const parsedResponse = await parser(response);
|
|
205
|
+
return parsedResponse;
|
|
206
|
+
} catch (error) {
|
|
207
|
+
return handleRequestError(error, responseStatus, backend);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async function getDefaultBranchName(configs) {
|
|
211
|
+
let apiPath;
|
|
212
|
+
const {
|
|
213
|
+
token,
|
|
214
|
+
backend,
|
|
215
|
+
repo
|
|
216
|
+
} = configs;
|
|
217
|
+
switch (backend) {
|
|
218
|
+
case 'gitlab':
|
|
219
|
+
{
|
|
220
|
+
apiPath = `/projects/${encodeURIComponent(repo)}`;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
case 'bitbucket':
|
|
224
|
+
{
|
|
225
|
+
apiPath = `/repositories/${repo}`;
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
default:
|
|
229
|
+
{
|
|
230
|
+
apiPath = `/repos/${repo}`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const repoInfo = await apiRequest(apiPath, {
|
|
234
|
+
token,
|
|
235
|
+
backend
|
|
236
|
+
});
|
|
237
|
+
let defaultBranchName;
|
|
238
|
+
if (backend === 'bitbucket') {
|
|
239
|
+
const {
|
|
240
|
+
mainbranch: {
|
|
241
|
+
name
|
|
242
|
+
}
|
|
243
|
+
} = repoInfo;
|
|
244
|
+
defaultBranchName = name;
|
|
245
|
+
} else {
|
|
246
|
+
const {
|
|
247
|
+
default_branch
|
|
248
|
+
} = repoInfo;
|
|
249
|
+
defaultBranchName = default_branch;
|
|
250
|
+
}
|
|
251
|
+
return defaultBranchName;
|
|
252
|
+
}
|
|
99
253
|
async function readFile(id, fetchContent, localForage, isText) {
|
|
100
254
|
const key = id ? isText ? `gh.${id}` : `gh.${id}.blob` : null;
|
|
101
255
|
const cached = key ? await localForage.getItem(key) : null;
|
package/dist/esm/APIError.js
CHANGED
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.API_ERROR = void 0;
|
|
7
7
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
|
-
function _toPropertyKey(
|
|
9
|
-
function _toPrimitive(
|
|
8
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
9
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
10
10
|
function _extendableBuiltin(cls) {
|
|
11
11
|
function ExtendableBuiltin() {
|
|
12
12
|
var instance = Reflect.construct(cls, Array.from(arguments));
|
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.ACCESS_TOKEN_ERROR = void 0;
|
|
7
7
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
|
-
function _toPropertyKey(
|
|
9
|
-
function _toPrimitive(
|
|
8
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
9
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
10
10
|
function _extendableBuiltin(cls) {
|
|
11
11
|
function ExtendableBuiltin() {
|
|
12
12
|
var instance = Reflect.construct(cls, Array.from(arguments));
|
package/dist/esm/Cursor.js
CHANGED
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = exports.CURSOR_COMPATIBILITY_SYMBOL = void 0;
|
|
7
7
|
var _immutable = require("immutable");
|
|
8
8
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
9
|
-
function _toPropertyKey(
|
|
10
|
-
function _toPrimitive(
|
|
9
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
10
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
11
11
|
function jsToMap(obj) {
|
|
12
12
|
if (obj === undefined) {
|
|
13
13
|
return (0, _immutable.Map)();
|
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.EDITORIAL_WORKFLOW_ERROR = void 0;
|
|
7
7
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
|
-
function _toPropertyKey(
|
|
9
|
-
function _toPrimitive(
|
|
8
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
9
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
10
10
|
function _extendableBuiltin(cls) {
|
|
11
11
|
function ExtendableBuiltin() {
|
|
12
12
|
var instance = Reflect.construct(cls, Array.from(arguments));
|
package/dist/esm/git-lfs.js
CHANGED
|
@@ -19,8 +19,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
19
19
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
20
20
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
21
21
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
22
|
-
function _toPropertyKey(
|
|
23
|
-
function _toPrimitive(
|
|
22
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
23
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
24
24
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
25
25
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
26
26
|
function splitIntoLines(str) {
|
|
@@ -21,8 +21,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
21
21
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
22
22
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
23
23
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
24
|
-
function _toPropertyKey(
|
|
25
|
-
function _toPrimitive(
|
|
24
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
25
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
26
26
|
const MAX_CONCURRENT_DOWNLOADS = 10;
|
|
27
27
|
async function fetchFiles(files, readFile, readFileMetadata, apiName) {
|
|
28
28
|
const sem = (0, _semaphore.default)(MAX_CONCURRENT_DOWNLOADS);
|
package/dist/esm/index.js
CHANGED
|
@@ -160,6 +160,12 @@ Object.defineProperty(exports, "getBlobSHA", {
|
|
|
160
160
|
return _getBlobSHA.default;
|
|
161
161
|
}
|
|
162
162
|
});
|
|
163
|
+
Object.defineProperty(exports, "getDefaultBranchName", {
|
|
164
|
+
enumerable: true,
|
|
165
|
+
get: function () {
|
|
166
|
+
return _API.getDefaultBranchName;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
163
169
|
Object.defineProperty(exports, "getLargeMediaFilteredMediaFiles", {
|
|
164
170
|
enumerable: true,
|
|
165
171
|
get: function () {
|
|
@@ -396,6 +402,7 @@ const DecapCmsLibUtil = exports.DecapCmsLibUtil = {
|
|
|
396
402
|
contentKeyFromBranch: _APIUtils.contentKeyFromBranch,
|
|
397
403
|
blobToFileObj: _implementation.blobToFileObj,
|
|
398
404
|
requestWithBackoff: _API.requestWithBackoff,
|
|
405
|
+
getDefaultBranchName: _API.getDefaultBranchName,
|
|
399
406
|
allEntriesByFolder: _implementation.allEntriesByFolder,
|
|
400
407
|
AccessTokenError: _AccessTokenError.default,
|
|
401
408
|
throwOnConflictingBranches: _API.throwOnConflictingBranches
|
|
@@ -12,8 +12,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
12
12
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
13
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
14
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
15
|
-
function _toPropertyKey(
|
|
16
|
-
function _toPrimitive(
|
|
15
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
16
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
17
17
|
function isAbortControllerSupported() {
|
|
18
18
|
if (typeof window !== 'undefined') {
|
|
19
19
|
return !!window.AbortController;
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "decap-cms-lib-util",
|
|
3
3
|
"description": "Shared utilities for Decap CMS.",
|
|
4
|
-
"version": "3.0.
|
|
5
|
-
"repository": "https://github.com/decaporg/decap-cms/tree/
|
|
4
|
+
"version": "3.0.4",
|
|
5
|
+
"repository": "https://github.com/decaporg/decap-cms/tree/main/packages/decap-cms-lib-util",
|
|
6
6
|
"bugs": "https://github.com/decaporg/decap-cms/issues",
|
|
7
7
|
"module": "dist/esm/index.js",
|
|
8
8
|
"main": "dist/decap-cms-lib-util.js",
|
|
@@ -25,5 +25,5 @@
|
|
|
25
25
|
"immutable": "^3.7.6",
|
|
26
26
|
"lodash": "^4.17.11"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "d3678b0ad1b9f93b841c85e4ee2de48167aa8906"
|
|
29
29
|
}
|
package/src/API.ts
CHANGED
|
@@ -40,6 +40,26 @@ class RateLimitError extends Error {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
async function parseJsonResponse(response: Response) {
|
|
44
|
+
const json = await response.json();
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
return Promise.reject(json);
|
|
47
|
+
}
|
|
48
|
+
return json;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function parseResponse(response: Response) {
|
|
52
|
+
const contentType = response.headers.get('Content-Type');
|
|
53
|
+
if (contentType && contentType.match(/json/)) {
|
|
54
|
+
return parseJsonResponse(response);
|
|
55
|
+
}
|
|
56
|
+
const textPromise = response.text().then(text => {
|
|
57
|
+
if (!response.ok) return Promise.reject(text);
|
|
58
|
+
return text;
|
|
59
|
+
});
|
|
60
|
+
return textPromise;
|
|
61
|
+
}
|
|
62
|
+
|
|
43
63
|
export async function requestWithBackoff(
|
|
44
64
|
api: API,
|
|
45
65
|
req: ApiRequest,
|
|
@@ -96,6 +116,140 @@ export async function requestWithBackoff(
|
|
|
96
116
|
}
|
|
97
117
|
}
|
|
98
118
|
|
|
119
|
+
// Options is an object which contains all the standard network request properties
|
|
120
|
+
// for modifying HTTP requests and may contains `params` property
|
|
121
|
+
|
|
122
|
+
type Param = string | number;
|
|
123
|
+
|
|
124
|
+
type ParamObject = Record<string, Param>;
|
|
125
|
+
|
|
126
|
+
type HeaderObj = Record<string, string>;
|
|
127
|
+
|
|
128
|
+
type HeaderConfig = {
|
|
129
|
+
headers?: HeaderObj;
|
|
130
|
+
token?: string | undefined;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
type Backend = 'github' | 'gitlab' | 'bitbucket';
|
|
134
|
+
|
|
135
|
+
// RequestConfig contains all the standard properties of a Request object and
|
|
136
|
+
// several custom properties:
|
|
137
|
+
// - "headers" property is an object whose properties and values are string types
|
|
138
|
+
// - `token` property to allow passing tokens for users using a private repo.
|
|
139
|
+
// - `params` property for customizing response
|
|
140
|
+
// - `backend`(compulsory) to specify which backend to be used: Github, Gitlab etc.
|
|
141
|
+
|
|
142
|
+
type RequestConfig = Omit<RequestInit, 'headers'> &
|
|
143
|
+
HeaderConfig & {
|
|
144
|
+
backend: Backend;
|
|
145
|
+
params?: ParamObject;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export const apiRoots = {
|
|
149
|
+
github: 'https://api.github.com',
|
|
150
|
+
gitlab: 'https://gitlab.com/api/v4',
|
|
151
|
+
bitbucket: 'https://api.bitbucket.org/2.0',
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export const endpointConstants = {
|
|
155
|
+
singleRepo: {
|
|
156
|
+
bitbucket: '/repositories',
|
|
157
|
+
github: '/repos',
|
|
158
|
+
gitlab: '/projects',
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
const api = {
|
|
163
|
+
buildRequest(req: ApiRequest) {
|
|
164
|
+
return req;
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
function constructUrlWithParams(url: string, params?: ParamObject) {
|
|
169
|
+
if (params) {
|
|
170
|
+
const paramList = [];
|
|
171
|
+
for (const key in params) {
|
|
172
|
+
paramList.push(`${key}=${encodeURIComponent(params[key])}`);
|
|
173
|
+
}
|
|
174
|
+
if (paramList.length) {
|
|
175
|
+
url += `?${paramList.join('&')}`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return url;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function constructRequestHeaders(headerConfig: HeaderConfig) {
|
|
182
|
+
const { token, headers } = headerConfig;
|
|
183
|
+
const baseHeaders: HeaderObj = { 'Content-Type': 'application/json; charset=utf-8', ...headers };
|
|
184
|
+
if (token) {
|
|
185
|
+
baseHeaders['Authorization'] = `token ${token}`;
|
|
186
|
+
}
|
|
187
|
+
return Promise.resolve(baseHeaders);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function handleRequestError(error: FetchError, responseStatus: number, backend: Backend) {
|
|
191
|
+
throw new APIError(error.message, responseStatus, backend);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export async function apiRequest(
|
|
195
|
+
path: string,
|
|
196
|
+
config: RequestConfig,
|
|
197
|
+
parser = (response: Response) => parseResponse(response),
|
|
198
|
+
) {
|
|
199
|
+
const { token, backend, ...props } = config;
|
|
200
|
+
const options = { cache: 'no-cache', ...props };
|
|
201
|
+
const headers = await constructRequestHeaders({ headers: options.headers || {}, token });
|
|
202
|
+
const baseUrl = apiRoots[backend];
|
|
203
|
+
const url = constructUrlWithParams(`${baseUrl}${path}`, options.params);
|
|
204
|
+
let responseStatus = 500;
|
|
205
|
+
try {
|
|
206
|
+
const req = unsentRequest.fromFetchArguments(url, {
|
|
207
|
+
...options,
|
|
208
|
+
headers,
|
|
209
|
+
}) as unknown as ApiRequest;
|
|
210
|
+
const response = await requestWithBackoff(api, req);
|
|
211
|
+
responseStatus = response.status;
|
|
212
|
+
const parsedResponse = await parser(response);
|
|
213
|
+
return parsedResponse;
|
|
214
|
+
} catch (error) {
|
|
215
|
+
return handleRequestError(error, responseStatus, backend);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export async function getDefaultBranchName(configs: {
|
|
220
|
+
backend: Backend;
|
|
221
|
+
repo: string;
|
|
222
|
+
token?: string;
|
|
223
|
+
}) {
|
|
224
|
+
let apiPath;
|
|
225
|
+
const { token, backend, repo } = configs;
|
|
226
|
+
switch (backend) {
|
|
227
|
+
case 'gitlab': {
|
|
228
|
+
apiPath = `/projects/${encodeURIComponent(repo)}`;
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
case 'bitbucket': {
|
|
232
|
+
apiPath = `/repositories/${repo}`;
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
default: {
|
|
236
|
+
apiPath = `/repos/${repo}`;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const repoInfo = await apiRequest(apiPath, { token, backend });
|
|
240
|
+
let defaultBranchName;
|
|
241
|
+
if (backend === 'bitbucket') {
|
|
242
|
+
const {
|
|
243
|
+
mainbranch: { name },
|
|
244
|
+
} = repoInfo;
|
|
245
|
+
defaultBranchName = name;
|
|
246
|
+
} else {
|
|
247
|
+
const { default_branch } = repoInfo;
|
|
248
|
+
defaultBranchName = default_branch;
|
|
249
|
+
}
|
|
250
|
+
return defaultBranchName;
|
|
251
|
+
}
|
|
252
|
+
|
|
99
253
|
export async function readFile(
|
|
100
254
|
id: string | null | undefined,
|
|
101
255
|
fetchContent: () => Promise<string | Blob>,
|
package/src/index.ts
CHANGED
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
getPreviewStatus,
|
|
35
35
|
PreviewState,
|
|
36
36
|
requestWithBackoff,
|
|
37
|
+
getDefaultBranchName,
|
|
37
38
|
throwOnConflictingBranches,
|
|
38
39
|
} from './API';
|
|
39
40
|
import {
|
|
@@ -148,6 +149,7 @@ export const DecapCmsLibUtil = {
|
|
|
148
149
|
contentKeyFromBranch,
|
|
149
150
|
blobToFileObj,
|
|
150
151
|
requestWithBackoff,
|
|
152
|
+
getDefaultBranchName,
|
|
151
153
|
allEntriesByFolder,
|
|
152
154
|
AccessTokenError,
|
|
153
155
|
throwOnConflictingBranches,
|
|
@@ -204,6 +206,7 @@ export {
|
|
|
204
206
|
contentKeyFromBranch,
|
|
205
207
|
blobToFileObj,
|
|
206
208
|
requestWithBackoff,
|
|
209
|
+
getDefaultBranchName,
|
|
207
210
|
allEntriesByFolder,
|
|
208
211
|
AccessTokenError,
|
|
209
212
|
throwOnConflictingBranches,
|