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/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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
19
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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;
@@ -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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
9
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
9
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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));
@@ -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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
10
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
9
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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));
@@ -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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
23
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
25
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
16
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
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.2",
5
- "repository": "https://github.com/decaporg/decap-cms/tree/master/packages/decap-cms-lib-util",
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": "80fb16f775bc4a1ad026985ca85a2e9ee3f1e15c"
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>,
@@ -1,4 +1,5 @@
1
1
  import * as api from '../API';
2
+
2
3
  describe('Api', () => {
3
4
  describe('getPreviewStatus', () => {
4
5
  it('should return preview status on matching context', () => {
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,