Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@forge/api

Package Overview
Dependencies
Maintainers
14
Versions
360
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@forge/api - npm Package Compare versions

Comparing version 0.4.2 to 0.4.3-next.0

out/store/__test__/errors.test.d.ts

6

CHANGELOG.md
# @forge/api
## 0.4.3-next.0
### Patch Changes
- a91f2c6: Improved error reporting for store API
## 0.4.2

@@ -4,0 +10,0 @@

5

out/store/errors.d.ts

@@ -0,5 +1,8 @@

export declare const getErrorMessageFromCode: (code: string, message: string | null) => string;
export declare const getErrorMessage: (statusCode: number) => string;
export declare class StorageAPIError extends Error {
constructor(statusCode: number);
private constructor();
static forStatus(status: number): StorageAPIError;
static forErrorCode(code: string, message: string | null): StorageAPIError;
}
//# sourceMappingURL=errors.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getErrorMessageFromCode = (code, message) => {
return message !== null && message !== void 0 ? message : code;
};
exports.getErrorMessage = (statusCode) => {

@@ -17,10 +20,16 @@ switch (statusCode) {

default:
return `Unknown error. Received code ${statusCode}`;
return `Unknown error. Received status code '${statusCode}'`;
}
};
class StorageAPIError extends Error {
constructor(statusCode) {
super(exports.getErrorMessage(statusCode));
constructor(message) {
super(message);
}
static forStatus(status) {
return new StorageAPIError(exports.getErrorMessage(status));
}
static forErrorCode(code, message) {
return new StorageAPIError(exports.getErrorMessageFromCode(code, message));
}
}
exports.StorageAPIError = StorageAPIError;

81

out/store/global/__test__/global-storage.test.js

@@ -11,5 +11,18 @@ "use strict";

status: statusCode,
json: jest.fn().mockResolvedValue(Object.assign({}, response))
text: jest.fn().mockResolvedValue(JSON.stringify(response))
});
};
const getApiClientMockInvalidJson = (response, statusCode = 200) => {
return jest.fn().mockReturnValue({
ok: statusCode !== 200 ? false : true,
status: statusCode,
text: jest.fn().mockResolvedValue(response)
});
};
const INVALID_CURSOR_ERROR = {
message: 'error message',
extensions: {
errorType: 'INVALID_CURSOR'
}
};
describe('GlobalStorage', () => {

@@ -67,23 +80,17 @@ function verifyApiClientCalledWith(apiClientMock, variables) {

});
it('should throw an error if the API responds with any status code other than 200', async () => {
it('should throw an error with the returned error message for non 200 status codes', async () => {
const apiClientMock = getApiClientMock({
errors: [
{
extensions: {
statusCode: 400
}
}
]
});
errors: [INVALID_CURSOR_ERROR]
}, 400);
const globalStorage = getStorage(apiClientMock);
const response = globalStorage.get('testKey');
expect(apiClientMock).toHaveBeenCalled();
await expect(response).rejects.toThrow(errors_1.StorageAPIError);
await expect(response).rejects.toThrow(errors_1.StorageAPIError.forErrorCode('CURSOR_INVALID', 'error message'));
});
it('should throw an error if the storage API returns a non 200 status code', async () => {
const apiClientMock = getApiClientMock(null, 400);
const apiClientMock = getApiClientMockInvalidJson(`<xml></xml>`, 400);
const globalStorage = getStorage(apiClientMock);
const response = globalStorage.get('testKey');
expect(apiClientMock).toHaveBeenCalled();
await expect(response).rejects.toThrow(errors_1.StorageAPIError);
await expect(response).rejects.toThrow(errors_1.StorageAPIError.forStatus(400));
});

@@ -118,9 +125,3 @@ });

success: false,
errors: [
{
extensions: {
statusCode: 400
}
}
]
errors: [INVALID_CURSOR_ERROR]
}

@@ -133,10 +134,10 @@ }

expect(apiClientMock).toHaveBeenCalled();
await expect(response).rejects.toThrow(new errors_1.StorageAPIError(400));
await expect(response).rejects.toThrow(errors_1.StorageAPIError.forErrorCode('INVALID_CURSOR', 'error message'));
});
it('should throw an error if the storage API returns a non 200 status code', async () => {
const apiClientMock = getApiClientMock(null, 400);
const apiClientMock = getApiClientMockInvalidJson('', 400);
const globalStorage = getStorage(apiClientMock);
const response = globalStorage.set('testKey', 'testValue');
expect(apiClientMock).toHaveBeenCalled();
await expect(response).rejects.toThrow(new errors_1.StorageAPIError(400));
await expect(response).rejects.toThrow(errors_1.StorageAPIError.forStatus(400));
});

@@ -154,3 +155,3 @@ it('should throw a 500 error if success=false but no errors were returned', async () => {

const globalStorage = getStorage(apiClientMock);
await expect(globalStorage.set('testKey', 'testValue')).rejects.toThrow(new errors_1.StorageAPIError(500));
await expect(globalStorage.set('testKey', 'testValue')).rejects.toThrow(errors_1.StorageAPIError.forStatus(500));
verifyApiClientCalledWith(apiClientMock, {

@@ -191,9 +192,3 @@ input: {

success: false,
errors: [
{
extensions: {
statusCode: 400
}
}
]
errors: [INVALID_CURSOR_ERROR]
}

@@ -206,10 +201,10 @@ }

expect(apiClientMock).toHaveBeenCalled();
await expect(response).rejects.toThrow(new errors_1.StorageAPIError(400));
await expect(response).rejects.toThrow(errors_1.StorageAPIError.forErrorCode('CURSOR_INVALID', 'error message'));
});
it('should throw an error if the storage API returns a non 200 status code', async () => {
const apiClientMock = getApiClientMock(null, 400);
it('should throw an error if the storage API returns a non 200 status code and has no body', async () => {
const apiClientMock = getApiClientMockInvalidJson('', 400);
const globalStorage = getStorage(apiClientMock);
const response = globalStorage.delete('testKey');
expect(apiClientMock).toHaveBeenCalled();
await expect(response).rejects.toThrow(new errors_1.StorageAPIError(400));
await expect(response).rejects.toThrow(errors_1.StorageAPIError.forStatus(400));
});

@@ -295,9 +290,3 @@ });

const apiClientMock = getApiClientMock({
errors: [
{
extensions: {
statusCode: 400
}
}
]
errors: [INVALID_CURSOR_ERROR]
});

@@ -307,10 +296,10 @@ const globalStorage = getStorage(apiClientMock);

expect(apiClientMock).toHaveBeenCalled();
await expect(response).rejects.toThrow(errors_1.StorageAPIError);
await expect(response).rejects.toThrow(errors_1.StorageAPIError.forErrorCode('CURSOR_INVALID', 'error message'));
});
it('should throw an error if the storage API returns a non 200 status code', async () => {
const apiClientMock = getApiClientMock(null, 400);
it('should throw an error if the storage API returns a non 200 status code and has no body', async () => {
const apiClientMock = getApiClientMockInvalidJson('', 400);
const globalStorage = getStorage(apiClientMock);
const response = globalStorage.list({});
expect(apiClientMock).toHaveBeenCalled();
await expect(response).rejects.toThrow(errors_1.StorageAPIError);
await expect(response).rejects.toThrow(errors_1.StorageAPIError.forStatus(400));
});

@@ -317,0 +306,0 @@ });

@@ -5,2 +5,20 @@ "use strict";

const queries_1 = require("./queries");
function assertNoErrors(errors) {
if (errors && errors.length > 0) {
const { message, extensions: { errorType } } = errors[0];
throw errors_1.StorageAPIError.forErrorCode(errorType, message);
}
}
async function getResponseBody(response) {
const responseText = await response.text();
let responseBody;
try {
responseBody = JSON.parse(responseText);
}
catch (error) {
throw errors_1.StorageAPIError.forStatus(response.status);
}
assertNoErrors(responseBody.errors);
return responseBody.data;
}
class GlobalStorage {

@@ -52,24 +70,10 @@ constructor(apiClient) {

const response = await this.apiClient(this.endpoint, this.buildRequest(body));
if (!response.ok) {
throw new errors_1.StorageAPIError(response.status);
}
const { errors, data } = await response.json();
if (errors) {
const { statusCode } = errors[0].extensions;
throw new errors_1.StorageAPIError(statusCode);
}
return data;
return await getResponseBody(response);
}
async mutation(body, mutationMethod) {
const response = await this.apiClient(this.endpoint, this.buildRequest(body));
if (!response.ok) {
throw new errors_1.StorageAPIError(response.status);
}
const { data: { appStorage: { [mutationMethod]: { success, errors } } } } = await response.json();
if (errors && errors.length > 0) {
const { statusCode } = errors[0].extensions;
throw new errors_1.StorageAPIError(statusCode);
}
const { appStorage: { [mutationMethod]: { success, errors } } } = await getResponseBody(response);
assertNoErrors(errors);
if (!success) {
throw new errors_1.StorageAPIError(500);
throw errors_1.StorageAPIError.forStatus(500);
}

@@ -76,0 +80,0 @@ return response;

@@ -48,2 +48,9 @@ "use strict";

success
errors {
message
extensions {
errorType
}
}
}

@@ -67,2 +74,9 @@ }

success
errors {
message
extensions {
errorType
}
}
}

@@ -69,0 +83,0 @@ }

import { DefaultQueryBuilder } from './global/query-api';
import { StorageAPI } from '../index';
export declare const globalStorage: {
query: () => DefaultQueryBuilder;
get: (key: string) => Promise<any>;
set: (key: string, value: any) => Promise<void>;
delete: (key: string) => Promise<void>;
query: () => DefaultQueryBuilder;
};

@@ -9,0 +9,0 @@ declare const _default: StorageAPI;

@@ -23,3 +23,8 @@ "use strict";

const getStorageInstanceWithQuery = (adapter) => {
return Object.assign(Object.assign({}, getStorageInstance(adapter)), { query: () => new query_api_1.DefaultQueryBuilder(adapter) });
return {
get: adapter.get.bind(adapter),
set: adapter.set.bind(adapter),
delete: adapter.delete.bind(adapter),
query: () => new query_api_1.DefaultQueryBuilder(adapter)
};
};

@@ -26,0 +31,0 @@ const productScoped = {

@@ -9,3 +9,3 @@ "use strict";

if (!versionResponse.ok && versionResponse.status !== 404) {
throw new errors_1.StorageAPIError(versionResponse.status);
throw errors_1.StorageAPIError.forStatus(versionResponse.status);
}

@@ -12,0 +12,0 @@ const updatedVersionNumber = await this.getUpdatedVersion(versionResponse);

@@ -15,3 +15,3 @@ "use strict";

}
throw new errors_1.StorageAPIError(response.status);
throw errors_1.StorageAPIError.forStatus(response.status);
}

@@ -24,3 +24,3 @@ const { value } = await response.json();

if (!response.ok) {
throw new errors_1.StorageAPIError(response.status);
throw errors_1.StorageAPIError.forStatus(response.status);
}

@@ -31,3 +31,3 @@ }

if (!response.ok) {
throw new errors_1.StorageAPIError(response.status);
throw errors_1.StorageAPIError.forStatus(response.status);
}

@@ -34,0 +34,0 @@ }

{
"name": "@forge/api",
"version": "0.4.2",
"version": "0.4.3-next.0",
"description": "Forge API methods",

@@ -5,0 +5,0 @@ "author": "Atlassian",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc