@frontegg/client
Advanced tools
Comparing version 5.1.3-alpha.1 to 5.2.0-alpha.1
@@ -18,2 +18,3 @@ /// <reference types="node" /> | ||
forUser<T extends TEntity>(entity: T): EntitlementsUserScoped<T>; | ||
forFronteggToken(token: string): Promise<EntitlementsUserScoped>; | ||
private loadVendorEntitlements; | ||
@@ -20,0 +21,0 @@ private refreshSnapshot; |
@@ -14,2 +14,5 @@ "use strict"; | ||
const entitlements_user_scoped_1 = require("./entitlements.user-scoped"); | ||
const identity_1 = require("../identity"); | ||
const entitlements_javascript_commons_1 = require("@frontegg/entitlements-javascript-commons"); | ||
const frontegg_entity_helper_1 = require("./helpers/frontegg-entity.helper"); | ||
class EntitlementsClient extends events.EventEmitter { | ||
@@ -46,2 +49,12 @@ constructor(httpClient, options = {}) { | ||
} | ||
async forFronteggToken(token) { | ||
if (!this.cache) { | ||
throw new Error('EntitlementsClient is not initialized yet.'); | ||
} | ||
const tokenData = await identity_1.IdentityClient.getInstance().validateToken(token); | ||
const customAttributes = (0, frontegg_entity_helper_1.appendUserIdAttribute)((0, entitlements_javascript_commons_1.prepareAttributes)({ | ||
jwt: tokenData, | ||
}), tokenData); | ||
return new entitlements_user_scoped_1.EntitlementsUserScoped(tokenData, this.cache, customAttributes); | ||
} | ||
async loadVendorEntitlements() { | ||
@@ -48,0 +61,0 @@ const entitlementsData = await this.httpClient.get('/api/v1/vendor-entitlements'); |
import { IsEntitledResult } from './types'; | ||
import { TEntity } from '../identity/types'; | ||
import { EntitlementsCache } from './storage/types'; | ||
import { CustomAttributes } from '@frontegg/entitlements-javascript-commons'; | ||
export type IsEntitledToPermissionInput = { | ||
@@ -13,11 +14,15 @@ permissionKey: string; | ||
private readonly cache; | ||
private readonly predefinedAttributes; | ||
private readonly tenantId; | ||
private readonly userId?; | ||
private readonly permissions; | ||
constructor(entity: T, cache: EntitlementsCache); | ||
private findUserId; | ||
isEntitledToFeature(featureKey: string): Promise<IsEntitledResult>; | ||
isEntitledToPermission(permissionKey: string): Promise<IsEntitledResult>; | ||
isEntitledTo(featureOrPermission: IsEntitledToPermissionInput): Promise<IsEntitledResult>; | ||
isEntitledTo(featureOrPermission: IsEntitledToFeatureInput): Promise<IsEntitledResult>; | ||
private readonly permissionRegexps; | ||
constructor(entity: T, cache: EntitlementsCache, predefinedAttributes?: CustomAttributes); | ||
isEntitledToFeature(featureKey: string, attributes?: CustomAttributes): Promise<IsEntitledResult>; | ||
private getEntitlementResult; | ||
private getFeatureFlagResult; | ||
private hasPermission; | ||
isEntitledToPermission(permissionKey: string, attributes?: CustomAttributes): Promise<IsEntitledResult>; | ||
isEntitledTo(featureOrPermission: IsEntitledToPermissionInput, attributes?: Record<string, any>): Promise<IsEntitledResult>; | ||
isEntitledTo(featureOrPermission: IsEntitledToFeatureInput, attributes?: Record<string, any>): Promise<IsEntitledResult>; | ||
} |
@@ -5,30 +5,39 @@ "use strict"; | ||
const types_1 = require("./types"); | ||
const types_2 = require("../identity/types"); | ||
const types_3 = require("./storage/types"); | ||
const types_2 = require("./storage/types"); | ||
const exp_time_utils_1 = require("./storage/exp-time.utils"); | ||
const entitlements_javascript_commons_1 = require("@frontegg/entitlements-javascript-commons"); | ||
const frontegg_entity_helper_1 = require("./helpers/frontegg-entity.helper"); | ||
class EntitlementsUserScoped { | ||
constructor(entity, cache) { | ||
constructor(entity, cache, predefinedAttributes = {}) { | ||
this.entity = entity; | ||
this.cache = cache; | ||
this.predefinedAttributes = predefinedAttributes; | ||
this.permissions = []; | ||
this.permissionRegexps = []; | ||
this.tenantId = entity.tenantId; | ||
const entityWithUserId = entity; | ||
this.userId = this.findUserId(entityWithUserId); | ||
this.userId = (0, frontegg_entity_helper_1.findUserId)(entity); | ||
const entityWithPossiblePermissions = entity; | ||
if (Array.isArray(entityWithPossiblePermissions.permissions)) { | ||
this.permissions = entityWithPossiblePermissions.permissions; | ||
entityWithPossiblePermissions.permissions.forEach(permission => { | ||
if (permission.includes('*')) { | ||
this.permissionRegexps.push((0, entitlements_javascript_commons_1.createPermissionCheckRegex)(permission)); | ||
} | ||
else { | ||
this.permissions.push(permission); | ||
} | ||
}); | ||
} | ||
else { | ||
this.permissions = []; | ||
} | ||
} | ||
findUserId(entity) { | ||
switch (entity.type) { | ||
case types_2.tokenTypes.UserToken: | ||
return entity.sub; | ||
case types_2.tokenTypes.UserApiToken: | ||
case types_2.tokenTypes.UserAccessToken: | ||
return entity.userId; | ||
async isEntitledToFeature(featureKey, attributes = {}) { | ||
const isEntitledResult = await this.getEntitlementResult(featureKey); | ||
if (!isEntitledResult.result) { | ||
const ffResult = await this.getFeatureFlagResult(featureKey, { ...attributes, ...this.predefinedAttributes }); | ||
if (ffResult.result) { | ||
return ffResult; | ||
} | ||
// else: just return result & justification of entitlements | ||
} | ||
return isEntitledResult; | ||
} | ||
async isEntitledToFeature(featureKey) { | ||
async getEntitlementResult(featureKey) { | ||
const tenantEntitlementExpTime = await this.cache.getEntitlementExpirationTime(featureKey, this.tenantId); | ||
@@ -46,3 +55,3 @@ const userEntitlementExpTime = this.userId | ||
} | ||
else if (expTime === types_3.NO_EXPIRE || expTime > new Date().getTime()) { | ||
else if (expTime === types_2.NO_EXPIRE || expTime > new Date().getTime()) { | ||
return { | ||
@@ -59,4 +68,21 @@ result: true, | ||
} | ||
async isEntitledToPermission(permissionKey) { | ||
if (this.permissions === undefined || this.permissions.indexOf(permissionKey) < 0) { | ||
async getFeatureFlagResult(featureKey, attributes) { | ||
const featureFlags = await this.cache.getFeatureFlags(featureKey); | ||
for (const flag of featureFlags) { | ||
const ffResult = (0, entitlements_javascript_commons_1.evaluateFeatureFlag)(flag, attributes); | ||
if ((ffResult === null || ffResult === void 0 ? void 0 : ffResult.treatment) === entitlements_javascript_commons_1.TreatmentEnum.True) { | ||
return { result: true }; | ||
} | ||
} | ||
return { | ||
result: false, | ||
justification: types_1.EntitlementJustifications.MISSING_FEATURE, | ||
}; | ||
} | ||
hasPermission(permissionKey) { | ||
return this.permissions.includes(permissionKey) || | ||
this.permissionRegexps.some(regex => regex.test(permissionKey)); | ||
} | ||
async isEntitledToPermission(permissionKey, attributes = {}) { | ||
if (!this.hasPermission(permissionKey)) { | ||
return { | ||
@@ -73,3 +99,3 @@ result: false, | ||
for (const feature of features) { | ||
const isEntitledToFeatureResult = await this.isEntitledToFeature(feature); | ||
const isEntitledToFeatureResult = await this.isEntitledToFeature(feature, attributes); | ||
if (isEntitledToFeatureResult.result === true) { | ||
@@ -89,3 +115,3 @@ return { | ||
} | ||
async isEntitledTo({ featureKey, permissionKey, }) { | ||
async isEntitledTo({ featureKey, permissionKey, }, attributes = {}) { | ||
if (featureKey && permissionKey) { | ||
@@ -95,6 +121,6 @@ throw new Error('Cannot check both feature and permission entitlement at the same time.'); | ||
else if (featureKey !== undefined) { | ||
return this.isEntitledToFeature(featureKey); | ||
return this.isEntitledToFeature(featureKey, attributes); | ||
} | ||
else if (permissionKey !== undefined) { | ||
return this.isEntitledToPermission(permissionKey); | ||
return this.isEntitledToPermission(permissionKey, attributes); | ||
} | ||
@@ -101,0 +127,0 @@ else { |
import { FeatureKey } from '../../types'; | ||
export declare const ENTITLEMENTS_MAP_KEY = "entitlements"; | ||
export declare const PERMISSIONS_MAP_KEY = "permissions"; | ||
export declare const FEAT_TO_FLAG_MAP_KEY = "feats_to_flags"; | ||
export declare const SRC_BUNDLES_KEY = "src_bundles"; | ||
export declare const SRC_FEATURE_FLAGS = "src_feature_flags"; | ||
export declare function getFeatureEntitlementKey(featKey: FeatureKey, tenantId: string, userId?: string): string; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.getFeatureEntitlementKey = exports.SRC_BUNDLES_KEY = exports.PERMISSIONS_MAP_KEY = exports.ENTITLEMENTS_MAP_KEY = void 0; | ||
exports.getFeatureEntitlementKey = exports.SRC_FEATURE_FLAGS = exports.SRC_BUNDLES_KEY = exports.FEAT_TO_FLAG_MAP_KEY = exports.PERMISSIONS_MAP_KEY = exports.ENTITLEMENTS_MAP_KEY = void 0; | ||
exports.ENTITLEMENTS_MAP_KEY = 'entitlements'; | ||
exports.PERMISSIONS_MAP_KEY = 'permissions'; | ||
exports.FEAT_TO_FLAG_MAP_KEY = 'feats_to_flags'; | ||
exports.SRC_BUNDLES_KEY = 'src_bundles'; | ||
exports.SRC_FEATURE_FLAGS = 'src_feature_flags'; | ||
function getFeatureEntitlementKey(featKey, tenantId, userId = '') { | ||
@@ -8,0 +10,0 @@ return `${tenantId}:${userId}:${featKey}`; |
@@ -1,4 +0,6 @@ | ||
import { EntitlementsCache, ExpirationTime } from '../types'; | ||
import { FeatureKey, TenantId, UserId, VendorEntitlementsDto } from '../../types'; | ||
import { Permission } from '../../../identity/types'; | ||
import type { EntitlementsCache, ExpirationTime } from '../types'; | ||
import type { FeatureKey, TenantId, UserId } from '../../types'; | ||
import type { Permission } from '../../../identity/types'; | ||
import type { VendorEntitlementsV1 } from '../../api-types'; | ||
import type { FeatureFlag } from '@frontegg/entitlements-javascript-commons/dist/feature-flags/types'; | ||
export declare class InMemoryEntitlementsCache implements EntitlementsCache { | ||
@@ -10,12 +12,9 @@ readonly revision: string; | ||
getLinkedFeatures(permissionKey: Permission): Promise<Set<string>>; | ||
static initialize(data: VendorEntitlementsDto, revPrefix?: string): InMemoryEntitlementsCache; | ||
private buildSource; | ||
getFeatureFlags(featureKey: string): Promise<FeatureFlag[]>; | ||
static initialize(data: VendorEntitlementsV1.GetDTO, revPrefix?: string): InMemoryEntitlementsCache; | ||
private setupEntitlementsReadModel; | ||
private setupPermissionsReadModel; | ||
private ensureSetInMap; | ||
private ensureMapInMap; | ||
private ensureArrayInMap; | ||
private parseExpirationTime; | ||
private setupFeatureFlagsReadModel; | ||
clear(): Promise<void>; | ||
shutdown(): Promise<void>; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.InMemoryEntitlementsCache = void 0; | ||
const types_1 = require("../types"); | ||
const in_memory_cache_key_utils_1 = require("./in-memory.cache-key.utils"); | ||
const NodeCache = require("node-cache"); | ||
const exp_time_utils_1 = require("../exp-time.utils"); | ||
const types_2 = require("./types"); | ||
const sources_mapper_1 = require("./mappers/sources.mapper"); | ||
const helper_1 = require("./mappers/helper"); | ||
class InMemoryEntitlementsCache { | ||
@@ -33,81 +33,17 @@ constructor(revision) { | ||
} | ||
async getFeatureFlags(featureKey) { | ||
var _a; | ||
return ((_a = this.nodeCache.get(in_memory_cache_key_utils_1.FEAT_TO_FLAG_MAP_KEY)) === null || _a === void 0 ? void 0 : _a.get(featureKey)) || []; | ||
} | ||
static initialize(data, revPrefix) { | ||
const cache = new InMemoryEntitlementsCache(revPrefix !== null && revPrefix !== void 0 ? revPrefix : data.snapshotOffset.toString()); | ||
const { data: { features, entitlements, featureBundles }, } = data; | ||
// build source structure | ||
const sourceData = cache.buildSource(featureBundles, features, entitlements); | ||
cache.nodeCache.set(in_memory_cache_key_utils_1.SRC_BUNDLES_KEY, sourceData); | ||
const { entitlements: e10sSourceData, featureFlags: ffSourceData } = new sources_mapper_1.SourcesMapper(data.data).buildSources(); | ||
cache.nodeCache.set(in_memory_cache_key_utils_1.SRC_BUNDLES_KEY, e10sSourceData); | ||
// setup data for SDK to work | ||
cache.setupEntitlementsReadModel(sourceData); | ||
cache.setupPermissionsReadModel(sourceData); | ||
cache.setupEntitlementsReadModel(e10sSourceData); | ||
cache.setupPermissionsReadModel(e10sSourceData); | ||
cache.setupFeatureFlagsReadModel(ffSourceData); | ||
return cache; | ||
} | ||
buildSource(bundles, features, entitlements) { | ||
const bundlesMap = new Map(); | ||
const unbundledFeaturesIds = new Set(); | ||
// helper features maps | ||
const featuresMap = new Map(); | ||
features.forEach((feat) => { | ||
const [id, key, permissions] = feat; | ||
featuresMap.set(id, { | ||
id, | ||
key, | ||
permissions: new Set(permissions || []), | ||
}); | ||
unbundledFeaturesIds.add(id); | ||
}); | ||
// initialize bundles map | ||
bundles.forEach((bundle) => { | ||
const [id, featureIds] = bundle; | ||
bundlesMap.set(id, { | ||
id, | ||
user_entitlements: new Map(), | ||
tenant_entitlements: new Map(), | ||
features: new Map(featureIds.reduce((prev, fId) => { | ||
const featSource = featuresMap.get(fId); | ||
if (!featSource) { | ||
// TODO: issue warning here! | ||
} | ||
else { | ||
prev.push([featSource.key, featSource]); | ||
// mark feature as bundled | ||
unbundledFeaturesIds.delete(fId); | ||
} | ||
return prev; | ||
}, [])), | ||
}); | ||
}); | ||
// fill bundles with entitlements | ||
entitlements.forEach((entitlement) => { | ||
const [featureBundleId, tenantId, userId, expirationDate] = entitlement; | ||
const bundle = bundlesMap.get(featureBundleId); | ||
if (bundle) { | ||
if (userId) { | ||
// that's user-targeted entitlement | ||
const tenantUserEntitlements = this.ensureMapInMap(bundle.user_entitlements, tenantId); | ||
const usersEntitlements = this.ensureArrayInMap(tenantUserEntitlements, userId); | ||
usersEntitlements.push(this.parseExpirationTime(expirationDate)); | ||
} | ||
else { | ||
// that's tenant-targeted entitlement | ||
const tenantEntitlements = this.ensureArrayInMap(bundle.tenant_entitlements, tenantId); | ||
tenantEntitlements.push(this.parseExpirationTime(expirationDate)); | ||
} | ||
} | ||
else { | ||
// TODO: issue warning here! | ||
} | ||
}); | ||
// make "dummy" bundle for unbundled features | ||
bundlesMap.set(types_2.UNBUNDLED_SRC_ID, { | ||
id: types_2.UNBUNDLED_SRC_ID, | ||
user_entitlements: new Map(), | ||
tenant_entitlements: new Map(), | ||
features: new Map([...unbundledFeaturesIds.values()].map((fId) => { | ||
const featSource = featuresMap.get(fId); | ||
return [featSource.key, featSource]; | ||
})), | ||
}); | ||
return bundlesMap; | ||
} | ||
setupEntitlementsReadModel(src) { | ||
@@ -142,3 +78,3 @@ const entitlementsReadModel = new Map(); | ||
feature.permissions.forEach((permission) => { | ||
this.ensureSetInMap(permissionsReadModel, permission).add(feature.key); | ||
(0, helper_1.ensureSetInMap)(permissionsReadModel, permission).add(feature.key); | ||
}); | ||
@@ -149,26 +85,5 @@ }); | ||
} | ||
ensureSetInMap(map, mapKey) { | ||
if (!map.has(mapKey)) { | ||
map.set(mapKey, new Set()); | ||
} | ||
return map.get(mapKey); | ||
setupFeatureFlagsReadModel(src) { | ||
this.nodeCache.set(in_memory_cache_key_utils_1.FEAT_TO_FLAG_MAP_KEY, src); | ||
} | ||
ensureMapInMap(map, mapKey) { | ||
if (!map.has(mapKey)) { | ||
map.set(mapKey, new Map()); | ||
} | ||
return map.get(mapKey); | ||
} | ||
ensureArrayInMap(map, mapKey) { | ||
if (!map.has(mapKey)) { | ||
map.set(mapKey, []); | ||
} | ||
return map.get(mapKey); | ||
} | ||
parseExpirationTime(time) { | ||
if (time !== undefined && time !== null) { | ||
return new Date(time).getTime(); | ||
} | ||
return types_1.NO_EXPIRE; | ||
} | ||
async clear() { | ||
@@ -175,0 +90,0 @@ this.nodeCache.del(this.nodeCache.keys()); |
import { Permission } from '../../../identity/types'; | ||
import { FeatureKey, TenantId, UserId } from '../../types'; | ||
import { ExpirationTime } from '../types'; | ||
import { FeatureFlag } from '@frontegg/entitlements-javascript-commons/dist/feature-flags/types'; | ||
export declare const UNBUNDLED_SRC_ID = "__unbundled__"; | ||
@@ -21,1 +22,6 @@ export type FeatureEntitlementKey = string; | ||
export type BundlesSource = Map<string, SingleBundleSource>; | ||
export type FeatureFlagsSource = Map<FeatureKey, FeatureFlag[]>; | ||
export type Sources = { | ||
entitlements: BundlesSource; | ||
featureFlags: FeatureFlagsSource; | ||
}; |
import { FeatureKey } from '../types'; | ||
import { FeatureFlag } from '@frontegg/entitlements-javascript-commons/dist/feature-flags/types'; | ||
export declare const NO_EXPIRE = -1; | ||
@@ -14,2 +15,6 @@ export type ExpirationTime = number | typeof NO_EXPIRE; | ||
/** | ||
* Get all feature-flags with given feature configured. | ||
*/ | ||
getFeatureFlags(featureKey: string): Promise<FeatureFlag[]>; | ||
/** | ||
* Remove all cached data. | ||
@@ -16,0 +21,0 @@ */ |
@@ -1,3 +0,3 @@ | ||
import { RetryOptions } from '../../utils'; | ||
import { Permission } from '../identity/types'; | ||
import type { RetryOptions } from '../../utils'; | ||
import type { VendorEntitlementsV1 } from './api-types'; | ||
export declare enum EntitlementJustifications { | ||
@@ -16,15 +16,6 @@ MISSING_FEATURE = "missing-feature", | ||
export type FeatureId = string; | ||
export type FeatureTuple = [FeatureId, FeatureKey, Permission[]]; | ||
export type FeatureBundleId = string; | ||
export type FeatureBundleTuple = [FeatureBundleId, FeatureId[]]; | ||
export type ExpirationDate = string | null; | ||
export type EntitlementTuple = [FeatureBundleId, TenantId, UserId?, ExpirationDate?]; | ||
export interface VendorEntitlementsDto { | ||
data: { | ||
features: FeatureTuple[]; | ||
featureBundles: FeatureBundleTuple[]; | ||
entitlements: EntitlementTuple[]; | ||
}; | ||
snapshotOffset: number; | ||
} | ||
export type FeatureTuple = VendorEntitlementsV1.Entitlements.Feature.Tuple; | ||
export type FeatureBundleTuple = VendorEntitlementsV1.Entitlements.FeatureSet.Tuple; | ||
export type EntitlementTuple = VendorEntitlementsV1.Entitlements.Tuple; | ||
export type FeatureFlagTuple = VendorEntitlementsV1.FeatureFlags.Tuple; | ||
export interface VendorEntitlementsSnapshotOffsetDto { | ||
@@ -31,0 +22,0 @@ snapshotOffset: number; |
@@ -29,3 +29,3 @@ export declare enum AuthHeaderType { | ||
export type TEntity = TUserEntity | TTenantEntity; | ||
export interface IEntity { | ||
export type IEntity = { | ||
id?: string; | ||
@@ -35,8 +35,8 @@ sub: string; | ||
type: tokenTypes; | ||
} | ||
export interface IEntityWithRoles extends IEntity { | ||
}; | ||
export type IEntityWithRoles = IEntity & { | ||
roles: Role[]; | ||
permissions: Permission[]; | ||
} | ||
export interface IUser extends IEntityWithRoles { | ||
}; | ||
export type IUser = IEntityWithRoles & { | ||
type: tokenTypes.UserToken; | ||
@@ -52,12 +52,12 @@ metadata: Record<string, any>; | ||
superUser?: true; | ||
} | ||
export interface IApiToken extends IEntityWithRoles { | ||
}; | ||
export type IApiToken = IEntityWithRoles & { | ||
createdByUserId: string; | ||
type: tokenTypes.TenantApiToken | tokenTypes.UserApiToken; | ||
metadata: Record<string, unknown>; | ||
} | ||
export interface ITenantApiToken extends IApiToken { | ||
}; | ||
export type ITenantApiToken = IApiToken & { | ||
type: tokenTypes.TenantApiToken; | ||
} | ||
export interface IUserApiToken extends IApiToken { | ||
}; | ||
export type IUserApiToken = IApiToken & { | ||
type: tokenTypes.UserApiToken; | ||
@@ -67,13 +67,13 @@ email: string; | ||
userId: string; | ||
} | ||
export interface IAccessToken extends IEntity { | ||
}; | ||
export type IAccessToken = IEntity & { | ||
type: tokenTypes.TenantAccessToken | tokenTypes.UserAccessToken; | ||
} | ||
export interface ITenantAccessToken extends IAccessToken { | ||
}; | ||
export type ITenantAccessToken = IAccessToken & { | ||
type: tokenTypes.TenantAccessToken; | ||
} | ||
export interface IUserAccessToken extends IAccessToken { | ||
}; | ||
export type IUserAccessToken = IAccessToken & { | ||
type: tokenTypes.UserAccessToken; | ||
userId: string; | ||
} | ||
}; | ||
export interface IEmptyAccessToken { | ||
@@ -80,0 +80,0 @@ empty: true; |
@@ -0,1 +1,8 @@ | ||
# [5.2.0-alpha.1](https://github.com/frontegg/nodejs-sdk/compare/5.1.3-alpha.1...5.2.0-alpha.1) (2023-10-31) | ||
### Features | ||
* **feature-flags:** introduced feature-flags functionality ([#165](https://github.com/frontegg/nodejs-sdk/issues/165)) ([1923129](https://github.com/frontegg/nodejs-sdk/commit/1923129f669811f52ff2afc451de6cbf7e033b67)) | ||
## [5.1.3-alpha.1](https://github.com/frontegg/nodejs-sdk/compare/5.1.2...5.1.3-alpha.1) (2023-10-31) | ||
@@ -2,0 +9,0 @@ |
{ | ||
"name": "@frontegg/client", | ||
"version": "5.1.3-alpha.1", | ||
"version": "5.2.0-alpha.1", | ||
"description": "Frontegg Javascript Library for backend node servers", | ||
@@ -25,2 +25,3 @@ "main": "dist/index.js", | ||
"dependencies": { | ||
"@frontegg/entitlements-javascript-commons": "^1.0.0-alpha.17", | ||
"@slack/web-api": "^6.7.2", | ||
@@ -45,2 +46,3 @@ "axios": "^0.27.2", | ||
"devDependencies": { | ||
"@fast-check/jest": "^1.7.3", | ||
"@semantic-release/changelog": "^6.0.1", | ||
@@ -47,0 +49,0 @@ "@semantic-release/git": "^10.0.1", |
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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
218477
236
2946
8
26
+ Added@frontegg/entitlements-javascript-commons@^1.0.0-alpha.17
+ Added@frontegg/entitlements-javascript-commons@1.1.2(transitive)