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

@forge/bridge

Package Overview
Dependencies
Maintainers
2
Versions
140
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@forge/bridge - npm Package Compare versions

Comparing version 0.0.0-experimental-906222c to 0.0.0-experimental-c155926

out/events/events.d.ts

135

CHANGELOG.md
# @forge/bridge
## 0.0.0-experimental-906222c
## 0.0.0-experimental-c155926
### Major Changes
### Patch Changes
- 906222c: Add new resolvers
- 2e37968: Add main field to package.json
## 2.5.1-next.0
### Patch Changes
- 6c533774: Add main field to package.json
## 2.5.0
### Minor Changes
- 4eef67b: Fix return type for getContext method
- 6269d73: Fix return type for getContext method
## 2.5.0-next.0
### Minor Changes
- 6269d73d: Fix return type for getContext method
## 2.4.0
### Minor Changes
- 14cd9b0: Add a new view.refresh() method
## 2.4.0-next.0
### Minor Changes
- 14cd9b02: Add a new view.refresh() method
## 2.3.0
### Minor Changes
- ae90999: Add router.reload()
- 27af6ce: Add showFlag API to open flags in products
- d307c8f: Add on and emit methods to Events API
## 2.3.0-next.2
### Minor Changes
- 27af6ce4: Add showFlag API to open flags in products
## 2.3.0-next.1
### Minor Changes
- ae90999: Add router.reload()
## 2.3.0-next.0
### Minor Changes
- d307c8f: Add on and emit methods to Events API
## 2.2.1
### Patch Changes
- 97ce1f3: update history.location in bridge when route changes
## 2.2.1-next.0
### Patch Changes
- 97ce1f3: update history.location in bridge when route changes
## 2.2.0
### Minor Changes
- 6fe6082: Ability to disable close on escape and overlay click for modals
## 2.2.0-next.0
### Minor Changes
- 6fe60823: Ability to disable close on escape and overlay click for modals
## 2.1.3
### Patch Changes
- 7c11b22: Improve error message for when the Custom UI bridge is not available
## 2.1.3-next.0
### Patch Changes
- 7c11b22: Improve error message for when the Custom UI bridge is not available
## 2.1.2
### Patch Changes
- 06edfce: Fix headers for some REST endpoints
## 2.1.2-next.0
### Patch Changes
- 06edfce: Fix headers for some REST endpoints
## 2.1.1
### Patch Changes
- abf359f: Enable requestJira and requestConfluence in Forge bridge to generate correct content type for form data
## 2.1.1-next.0
### Patch Changes
- abf359f: Enable requestJira and requestConfluence in Forge bridge to generate correct content type for form data
## 2.1.0
### Minor Changes
- 63e5561: Add submit method
## 2.1.0-next.0
### Minor Changes
- 63e5561: Add submit method
## 2.0.0

@@ -10,0 +139,0 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCallBridge = void 0;
exports.getCallBridge = function () {
const errors_1 = require("./errors");
function isBridgeAvailable(bridge) {
return !!(bridge === null || bridge === void 0 ? void 0 : bridge.callBridge);
}
const getCallBridge = () => {
if (!isBridgeAvailable(window.__bridge)) {
throw new errors_1.BridgeAPIError(`
Unable to establish a connection with the Custom UI bridge.
If you are trying to run your app locally, Forge apps only work in the context of Atlassian products. Refer to https://go.atlassian.com/forge-tunneling-with-custom-ui for how to tunnel when using a local development server.
`);
}
return window.__bridge.callBridge;
};
exports.getCallBridge = getCallBridge;

10

out/errors.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BridgeAPIError = void 0;
var tslib_1 = require("tslib");
var BridgeAPIError = (function (_super) {
tslib_1.__extends(BridgeAPIError, _super);
function BridgeAPIError() {
return _super !== null && _super.apply(this, arguments) || this;
}
return BridgeAPIError;
}(Error));
class BridgeAPIError extends Error {
}
exports.BridgeAPIError = BridgeAPIError;
import { getCallBridge } from '../bridge';
export declare const productFetchApi: (callBridge: ReturnType<typeof getCallBridge>) => {
requestConfluence: (restPath: string, fetchOptions?: RequestInit | undefined) => Promise<Response>;
requestJira: (restPath: string, fetchOptions?: RequestInit | undefined) => Promise<Response>;
requestConfluence: (restPath: string, fetchOptions?: RequestInit) => Promise<Response>;
requestJira: (restPath: string, fetchOptions?: RequestInit) => Promise<Response>;
};
//# sourceMappingURL=fetch.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.productFetchApi = void 0;
var tslib_1 = require("tslib");
var isHeadersInstance = function (headers) {
return headers.entries !== undefined;
};
var parseHeaders = function (headers) {
if (!headers)
return {};
return isHeadersInstance(headers) ? Object.fromEntries(headers.entries()) : headers;
};
var parseBody = function (init) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var req, _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
req = new Request('', { body: init === null || init === void 0 ? void 0 : init.body, method: init === null || init === void 0 ? void 0 : init.method });
if (!(req.method !== 'GET')) return [3, 2];
return [4, req.text()];
case 1:
_a = _b.sent();
return [3, 3];
case 2:
_a = null;
_b.label = 3;
case 3: return [2, _a];
const tslib_1 = require("tslib");
const parseBodyAndHeaders = (init) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const req = new Request('', { body: init === null || init === void 0 ? void 0 : init.body, method: init === null || init === void 0 ? void 0 : init.method, headers: init === null || init === void 0 ? void 0 : init.headers });
const body = req.method !== 'GET' ? yield req.text() : null;
const headers = Object.fromEntries(req.headers.entries());
return {
body,
headers: new Headers(headers)
};
});
const productFetchApi = (callBridge) => {
const fetch = (product, restPath, init) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const { body: requestBody, headers: requestHeaders } = yield parseBodyAndHeaders(init);
if (!requestHeaders.has('X-Atlassian-Token')) {
requestHeaders.set('X-Atlassian-Token', 'no-check');
}
const fetchPayload = {
product,
restPath,
fetchRequestInit: Object.assign(Object.assign({}, init), { body: requestBody, headers: [...requestHeaders.entries()] })
};
const { body, headers, statusText, status } = yield callBridge('fetchProduct', fetchPayload);
return new Response(body || null, { headers, status, statusText });
});
}); };
exports.productFetchApi = function (callBridge) {
var fetch = function (product, restPath, init) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var fetchPayload, _a, _b, _c, _d, body, headers, statusText, status;
return tslib_1.__generator(this, function (_e) {
switch (_e.label) {
case 0:
_a = {
product: product,
restPath: restPath
};
_b = [tslib_1.__assign({}, init)];
_c = {};
return [4, parseBody(init)];
case 1:
fetchPayload = (_a.fetchRequestInit = tslib_1.__assign.apply(void 0, _b.concat([(_c.body = _e.sent(), _c.headers = parseHeaders(init === null || init === void 0 ? void 0 : init.headers), _c)])),
_a);
return [4, callBridge('fetchProduct', fetchPayload)];
case 2:
_d = _e.sent(), body = _d.body, headers = _d.headers, statusText = _d.statusText, status = _d.status;
return [2, new Response(body || null, { headers: headers, status: status, statusText: statusText })];
}
});
}); };
return {
requestConfluence: function (restPath, fetchOptions) {
return fetch('confluence', restPath, fetchOptions);
},
requestJira: function (restPath, fetchOptions) {
return fetch('jira', restPath, fetchOptions);
}
requestConfluence: (restPath, fetchOptions) => fetch('confluence', restPath, fetchOptions),
requestJira: (restPath, fetchOptions) => fetch('jira', restPath, fetchOptions)
};
};
exports.productFetchApi = productFetchApi;

@@ -1,2 +0,2 @@

export declare const requestConfluence: (restPath: string, fetchOptions?: RequestInit | undefined) => Promise<Response>, requestJira: (restPath: string, fetchOptions?: RequestInit | undefined) => Promise<Response>;
export declare const requestConfluence: (restPath: string, fetchOptions?: RequestInit) => Promise<Response>, requestJira: (restPath: string, fetchOptions?: RequestInit) => Promise<Response>;
//# sourceMappingURL=index.d.ts.map

@@ -5,4 +5,4 @@ "use strict";

exports.requestJira = exports.requestConfluence = void 0;
var bridge_1 = require("../bridge");
var fetch_1 = require("./fetch");
exports.requestConfluence = (_a = fetch_1.productFetchApi(bridge_1.getCallBridge()), _a.requestConfluence), exports.requestJira = _a.requestJira;
const bridge_1 = require("../bridge");
const fetch_1 = require("./fetch");
_a = (0, fetch_1.productFetchApi)((0, bridge_1.getCallBridge)()), exports.requestConfluence = _a.requestConfluence, exports.requestJira = _a.requestJira;

@@ -6,2 +6,4 @@ export * from './invoke';

export * from './fetch';
export * from './flag';
export * from './events';
//# sourceMappingURL=index.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./invoke"), exports);

@@ -9,1 +9,3 @@ tslib_1.__exportStar(require("./view"), exports);

tslib_1.__exportStar(require("./fetch"), exports);
tslib_1.__exportStar(require("./flag"), exports);
tslib_1.__exportStar(require("./events"), exports);
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./invoke"), exports);
import { InvokePayload } from '../types';
export declare const invoke: <T>(functionKey: string, payload?: InvokePayload | undefined) => Promise<T>;
export declare const resolver: {
get: (fullPath: string, options: RequestInit) => Promise<Response>;
post: (fullPath: string, options: RequestInit) => Promise<Response>;
put: (fullPath: string, options: RequestInit) => Promise<Response>;
patch: (fullPath: string, options: RequestInit) => Promise<Response>;
delete: (fullPath: string, options: RequestInit) => Promise<Response>;
};
//# sourceMappingURL=invoke.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolver = exports.invoke = void 0;
var tslib_1 = require("tslib");
var bridge_1 = require("../bridge");
var errors_1 = require("../errors");
var utils_1 = require("../utils");
var callBridge = bridge_1.getCallBridge();
var validatePayload = function (payload) {
exports.invoke = void 0;
const bridge_1 = require("../bridge");
const errors_1 = require("../errors");
const utils_1 = require("../utils");
const callBridge = (0, bridge_1.getCallBridge)();
const validatePayload = (payload) => {
if (!payload)
return;
if (Object.values(payload).some(function (val) { return typeof val === 'function'; })) {
if (Object.values(payload).some((val) => typeof val === 'function')) {
throw new errors_1.BridgeAPIError('Passing functions as part of the payload is not supported!');
}
};
var _invoke = function (functionKey, payload) {
const _invoke = (functionKey, payload) => {
if (typeof functionKey !== 'string') {

@@ -21,46 +20,4 @@ throw new errors_1.BridgeAPIError('functionKey must be a string!');

validatePayload(payload);
return callBridge('invoke', { functionKey: functionKey, payload: payload });
return callBridge('invoke', { functionKey, payload });
};
exports.invoke = utils_1.withRateLimiter(_invoke, 20, 2000, 'Resolver calls are rate limited at 20req/2s');
var parseQs = function (qs) {
var query = {};
var items = qs.split('&');
items.forEach(function (item) {
var _a = item.split('='), key = _a[0], value = _a[1];
query[key] = value;
});
return query;
};
var provisionResolverMethod = function (method) {
return function (fullPath, options) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var _a, path, queryString, query, response;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = fullPath.split('?'), path = _a[0], queryString = _a[1];
query = parseQs(queryString);
return [4, exports.invoke(path, {
__meta: {
headers: options.headers,
body: options.body,
query: query,
method: method
}
})];
case 1:
response = _b.sent();
return [2, new Response(response.body, {
headers: new Headers(response.headers),
status: response.statusCode
})];
}
});
}); };
};
exports.resolver = {
get: provisionResolverMethod('GET'),
post: provisionResolverMethod('POST'),
put: provisionResolverMethod('PUT'),
patch: provisionResolverMethod('PATCH'),
delete: provisionResolverMethod('DELETE')
};
exports.invoke = (0, utils_1.withRateLimiter)(_invoke, 20, 2000, 'Resolver calls are rate limited at 20req/2s');
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./modal"), exports);

@@ -6,2 +6,4 @@ export interface ModalOptions {

context?: any;
closeOnEscape?: boolean;
closeOnOverlayClick?: boolean;
}

@@ -13,2 +15,4 @@ export declare class Modal {

context: any;
closeOnEscape: boolean;
closeOnOverlayClick: boolean;
constructor(opts?: ModalOptions);

@@ -15,0 +19,0 @@ open(): Promise<void>;

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Modal = void 0;
var tslib_1 = require("tslib");
var bridge_1 = require("../bridge");
var errors_1 = require("../errors");
var callBridge = bridge_1.getCallBridge();
var noop = function () { };
var Modal = (function () {
function Modal(opts) {
const tslib_1 = require("tslib");
const bridge_1 = require("../bridge");
const errors_1 = require("../errors");
const callBridge = (0, bridge_1.getCallBridge)();
const noop = () => { };
class Modal {
constructor(opts) {
var _a, _b;
this.resource = (opts === null || opts === void 0 ? void 0 : opts.resource) || null;

@@ -15,32 +16,26 @@ this.onClose = (opts === null || opts === void 0 ? void 0 : opts.onClose) || noop;

this.context = (opts === null || opts === void 0 ? void 0 : opts.context) || {};
this.closeOnEscape = (_a = opts === null || opts === void 0 ? void 0 : opts.closeOnEscape) !== null && _a !== void 0 ? _a : true;
this.closeOnOverlayClick = (_b = opts === null || opts === void 0 ? void 0 : opts.closeOnOverlayClick) !== null && _b !== void 0 ? _b : true;
}
Modal.prototype.open = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var success, err_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4, callBridge('openModal', {
resource: this.resource,
onClose: this.onClose,
size: this.size,
context: this.context
})];
case 1:
success = _a.sent();
if (success === false) {
throw new errors_1.BridgeAPIError('Unable to open modal.');
}
return [3, 3];
case 2:
err_1 = _a.sent();
throw new errors_1.BridgeAPIError('Unable to open modal.');
case 3: return [2];
open() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
try {
const success = yield callBridge('openModal', {
resource: this.resource,
onClose: this.onClose,
size: this.size,
context: this.context,
closeOnEscape: this.closeOnEscape,
closeOnOverlayClick: this.closeOnOverlayClick
});
if (success === false) {
throw new errors_1.BridgeAPIError('Unable to open modal.');
}
});
}
catch (err) {
throw new errors_1.BridgeAPIError('Unable to open modal.');
}
});
};
return Modal;
}());
}
}
exports.Modal = Modal;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./router"), exports);
export declare const router: {
navigate: (url: string) => Promise<void>;
open: (url: string) => Promise<void>;
reload: () => Promise<void>;
};
//# sourceMappingURL=router.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.router = void 0;
var tslib_1 = require("tslib");
var bridge_1 = require("../bridge");
var callBridge = bridge_1.getCallBridge();
var navigate = function (url) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
return [2, callBridge('navigate', { url: url, type: 'same-tab' })];
}); }); };
var open = function (url) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
return [2, callBridge('navigate', { url: url, type: 'new-tab' })];
}); }); };
const tslib_1 = require("tslib");
const bridge_1 = require("../bridge");
const callBridge = (0, bridge_1.getCallBridge)();
const navigate = (url) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return callBridge('navigate', { url, type: 'same-tab' }); });
const open = (url) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return callBridge('navigate', { url, type: 'new-tab' }); });
const reload = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return callBridge('reload'); });
exports.router = {
navigate: navigate,
open: open
navigate,
open,
reload
};

@@ -8,3 +8,23 @@ export declare type InvokePayload = {

} & Pick<ResponseInit, 'headers' | 'status' | 'statusText'>;
export declare type FullContext = {};
export interface FullContext {
accountId?: string;
cloudId?: string;
extension: ExtensionData;
license?: LicenseState;
localId: string;
locale: string;
moduleKey: string;
siteUrl: string;
timezone: string;
}
interface ExtensionData {
[k: string]: any;
}
interface LicenseState {
isActive?: boolean;
}
export declare type Subscription = {
unsubscribe: () => void;
};
export {};
//# sourceMappingURL=types.d.ts.map

@@ -1,2 +0,2 @@

export declare const withRateLimiter: <Fn extends (...args: any[]) => any>(wrappedFn: Fn, maxOps: number, intervalInMs: number, exceededErrorMessage?: string | undefined) => <T>(...args: Parameters<Fn>) => Promise<T>;
export declare const withRateLimiter: <Fn extends (...args: any[]) => any>(wrappedFn: Fn, maxOps: number, intervalInMs: number, exceededErrorMessage?: string) => <T>(...args: Parameters<Fn>) => Promise<T>;
//# sourceMappingURL=index.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.withRateLimiter = void 0;
var tslib_1 = require("tslib");
var errors_1 = require("../errors");
exports.withRateLimiter = function (wrappedFn, maxOps, intervalInMs, exceededErrorMessage) {
var start = Date.now();
var numOps = 0;
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
const tslib_1 = require("tslib");
const errors_1 = require("../errors");
const withRateLimiter = (wrappedFn, maxOps, intervalInMs, exceededErrorMessage) => {
let start = Date.now();
let numOps = 0;
return (...args) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const now = Date.now();
const elapsed = now - start;
if (elapsed > intervalInMs) {
start = now;
numOps = 0;
}
return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var now, elapsed;
return tslib_1.__generator(this, function (_a) {
now = Date.now();
elapsed = now - start;
if (elapsed > intervalInMs) {
start = now;
numOps = 0;
}
if (numOps >= maxOps) {
throw new errors_1.BridgeAPIError(exceededErrorMessage || 'Too many invocations.');
}
numOps = numOps + 1;
return [2, wrappedFn.apply(void 0, args)];
});
});
};
if (numOps >= maxOps) {
throw new errors_1.BridgeAPIError(exceededErrorMessage || 'Too many invocations.');
}
numOps = numOps + 1;
return wrappedFn(...args);
});
};
exports.withRateLimiter = withRateLimiter;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.close = void 0;
var tslib_1 = require("tslib");
var bridge_1 = require("../bridge");
var errors_1 = require("../errors");
var callBridge = bridge_1.getCallBridge();
exports.close = function (payload) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var success, e_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4, callBridge('close', payload)];
case 1:
success = _a.sent();
if (success === false) {
throw new errors_1.BridgeAPIError("this resource's view is not closable.");
}
return [3, 3];
case 2:
e_1 = _a.sent();
throw new errors_1.BridgeAPIError("this resource's view is not closable.");
case 3: return [2];
const tslib_1 = require("tslib");
const bridge_1 = require("../bridge");
const errors_1 = require("../errors");
const callBridge = (0, bridge_1.getCallBridge)();
const close = (payload) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
try {
const success = yield callBridge('close', payload);
if (success === false) {
throw new errors_1.BridgeAPIError("this resource's view is not closable.");
}
});
}); };
}
catch (e) {
throw new errors_1.BridgeAPIError("this resource's view is not closable.");
}
});
exports.close = close;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createHistory = void 0;
var bridge_1 = require("../bridge");
var callBridge = bridge_1.getCallBridge();
exports.createHistory = function () {
return callBridge('createHistory');
};
const tslib_1 = require("tslib");
const bridge_1 = require("../bridge");
const callBridge = (0, bridge_1.getCallBridge)();
const createHistory = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const history = yield callBridge('createHistory');
history.listen((location) => {
history.location = location;
});
return history;
});
exports.createHistory = createHistory;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getContext = void 0;
var bridge_1 = require("../bridge");
var callBridge = bridge_1.getCallBridge();
exports.getContext = function () {
const bridge_1 = require("../bridge");
const callBridge = (0, bridge_1.getCallBridge)();
const getContext = () => {
return callBridge('getContext');
};
exports.getContext = getContext;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./view"), exports);
export declare const view: {
submit: (payload?: any) => Promise<void>;
close: (payload?: any) => Promise<void>;
refresh: (payload?: any) => Promise<void>;
createHistory: () => Promise<import("history").History<unknown>>;

@@ -4,0 +6,0 @@ getContext: () => Promise<import("../types").FullContext>;

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.view = void 0;
var close_1 = require("./close");
var createHistory_1 = require("./createHistory");
var getContext_1 = require("./getContext");
const submit_1 = require("./submit");
const close_1 = require("./close");
const refresh_1 = require("./refresh");
const createHistory_1 = require("./createHistory");
const getContext_1 = require("./getContext");
exports.view = {
submit: submit_1.submit,
close: close_1.close,
refresh: refresh_1.refresh,
createHistory: createHistory_1.createHistory,
getContext: getContext_1.getContext
};
{
"name": "@forge/bridge",
"version": "0.0.0-experimental-906222c",
"version": "0.0.0-experimental-c155926",
"description": "Forge bridge API for custom UI apps",
"author": "Atlassian",
"license": "UNLICENSED",
"main": "out/index.js",
"browser": "out/index.js",

@@ -19,5 +20,5 @@ "types": "out/index.d.ts",

"history": "4.10.1",
"jest-date-mock": "^1.0.8",
"isomorphic-fetch": "^3.0.0"
"isomorphic-fetch": "^3.0.0",
"jest-date-mock": "^1.0.8"
}
}

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

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

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