Socket
Socket
Sign inDemoInstall

@aws-amplify/graphql-relational-transformer

Package Overview
Dependencies
24
Maintainers
9
Versions
386
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.5.0-gen2-release-0418-2.0 to 2.5.0-gen2-release-0423.0

3

CHANGELOG.md

@@ -6,3 +6,3 @@ # Change Log

# [2.5.0-gen2-release-0418-2.0](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-relational-transformer@2.4.4...@aws-amplify/graphql-relational-transformer@2.5.0-gen2-release-0418-2.0) (2024-04-18)
# [2.5.0-gen2-release-0423.0](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-relational-transformer@2.4.4...@aws-amplify/graphql-relational-transformer@2.5.0-gen2-release-0423.0) (2024-04-23)

@@ -15,2 +15,3 @@ ### Bug Fixes

- propagate operation in references-style ddb resolver ([#2447](https://github.com/aws-amplify/amplify-category-api/issues/2447)) ([460cf21](https://github.com/aws-amplify/amplify-category-api/commit/460cf217ce55ac3ef09749c552aac3a487cded69))
- relational bidirectionality validation and improved error messages ([#2482](https://github.com/aws-amplify/amplify-category-api/issues/2482)) ([568fbc3](https://github.com/aws-amplify/amplify-category-api/commit/568fbc365e4945693f685ba8896d2e5f14031f2d))

@@ -17,0 +18,0 @@ ### Features

@@ -31,2 +31,3 @@ "use strict";

config.referenceNodes = (0, utils_1.getBelongsToReferencesNodes)(config, context);
(0, utils_1.validateReferencesBidirectionality)(config);
};

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

@@ -26,2 +26,3 @@ "use strict";

config.referenceNodes = (0, utils_1.getBelongsToReferencesNodes)(config, context);
(0, utils_1.validateReferencesBidirectionality)(config);
};

@@ -28,0 +29,0 @@ }

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBelongsToDirectiveTransformer = void 0;
const graphql_transformer_core_1 = require("@aws-amplify/graphql-transformer-core");
const belongs_to_directive_ddb_fields_transformer_1 = require("./belongs-to-directive-ddb-fields-transformer");

@@ -20,3 +21,3 @@ const belongs_to_directive_ddb_references_transformer_1 = require("./belongs-to-directive-ddb-references-transformer");

if (config.fields) {
throw new Error('Something went wrong >> cannot have both references and fields.');
throw new graphql_transformer_core_1.InvalidDirectiveError(`fields and references cannot be defined in the same ${config.directiveName}. Use 'references'`);
}

@@ -23,0 +24,0 @@ if (config.references.length < 1) {

@@ -87,4 +87,14 @@ "use strict";

const validate = (config, ctx) => {
var _a, _b;
const { field } = config;
const dbType = (0, graphql_transformer_core_1.getStrategyDbTypeFromTypeNode)(field.type, ctx);
if (!(0, graphql_transformer_common_1.isListType)(field.type)) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`@${graphql_directives_1.HasManyDirective.name} must be used with a list. Use @hasOne for non-list types.`);
}
let dbType;
try {
dbType = (0, graphql_transformer_core_1.getStrategyDbTypeFromTypeNode)(field.type, ctx);
}
catch (_c) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`Object type ${(_b = (_a = field.type) === null || _a === void 0 ? void 0 : _a.name.value) !== null && _b !== void 0 ? _b : field.name} must be annotated with @model.`);
}
config.relatedType = (0, utils_1.getRelatedType)(config, ctx);

@@ -94,5 +104,2 @@ const dataSourceBasedTransformer = (0, has_many_directive_transformer_factory_1.getHasManyDirectiveTransformer)(dbType, config);

(0, utils_1.validateModelDirective)(config);
if (!(0, graphql_transformer_common_1.isListType)(field.type)) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`@${graphql_directives_1.HasManyDirective.name} must be used with a list. Use @hasOne for non-list types.`);
}
config.connectionFields = [];

@@ -99,0 +106,0 @@ (0, utils_1.validateRelatedModelDirective)(config);

@@ -99,4 +99,11 @@ "use strict";

const validate = (config, ctx) => {
var _a, _b;
const { field } = config;
const dbType = (0, graphql_transformer_core_1.getStrategyDbTypeFromTypeNode)(field.type, ctx);
let dbType;
try {
dbType = (0, graphql_transformer_core_1.getStrategyDbTypeFromTypeNode)(field.type, ctx);
}
catch (_c) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`Object type ${(_b = (_a = field.type) === null || _a === void 0 ? void 0 : _a.name.value) !== null && _b !== void 0 ? _b : field.name} must be annotated with @model.`);
}
config.relatedType = (0, utils_1.getRelatedType)(config, ctx);

@@ -103,0 +110,0 @@ const dataSourceBasedTransformer = (0, has_one_directive_transformer_factory_1.getHasOneDirectiveTransformer)(dbType, config);

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

const mappedObjectName = context.resourceHelper.getModelNameMapping(config.object.name.value);
throw new Error(`Invalid @hasMany directive on ${mappedObjectName}.${config.field.name.value} - indexName is not supported with DDB references.`);
throw new Error(`Invalid @hasMany directive on ${mappedObjectName}.${config.field.name.value} - indexName is not supported with DynamoDB references.`);
}

@@ -41,2 +41,3 @@ (0, utils_1.ensureReferencesArray)(config);

config.referenceNodes = (0, utils_1.getReferencesNodes)(config, context);
(0, utils_1.validateReferencesBidirectionality)(config);
};

@@ -43,0 +44,0 @@ }

@@ -25,3 +25,4 @@ "use strict";

(0, utils_1.ensureReferencesArray)(config);
(0, utils_1.getReferencesNodes)(config, context);
config.referenceNodes = (0, utils_1.getReferencesNodes)(config, context);
(0, utils_1.validateReferencesBidirectionality)(config);
};

@@ -28,0 +29,0 @@ }

@@ -7,2 +7,3 @@ "use strict";

const has_many_directive_ddb_references_transformer_1 = require("./has-many-directive-ddb-references-transformer");
const graphql_transformer_core_1 = require("@aws-amplify/graphql-transformer-core");
const hasManyDirectiveMySqlTransformer = new has_many_directive_sql_transformer_1.HasManyDirectiveSQLTransformer();

@@ -21,6 +22,6 @@ const hasManyDirectivePostgresTransformer = new has_many_directive_sql_transformer_1.HasManyDirectiveSQLTransformer();

if (config.fields) {
throw new Error('Something went wrong >> cannot have both references and fields.');
throw new graphql_transformer_core_1.InvalidDirectiveError(`fields and references cannot be defined in the same ${config.directiveName}. Use 'references'`);
}
if (config.references.length < 1) {
throw new Error(`Invalid @hasMany directive on ${config.field.name.value} - empty references list`);
throw new graphql_transformer_core_1.InvalidDirectiveError(`Invalid @hasMany directive on ${config.field.name.value} - empty references list`);
}

@@ -27,0 +28,0 @@ return hasManyDirectiveDdbReferencesTransformer;

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

const mappedObjectName = context.resourceHelper.getModelNameMapping(config.object.name.value);
throw new Error(`Invalid @${config.directiveName} directive on ${mappedObjectName}.${config.field.name.value} - indexName is not supported with DDB references.`);
throw new Error(`Invalid @${config.directiveName} directive on ${mappedObjectName}.${config.field.name.value} - indexName is not supported with DynamoDB references.`);
}

@@ -41,2 +41,3 @@ (0, utils_1.ensureReferencesArray)(config);

config.referenceNodes = (0, utils_1.getReferencesNodes)(config, context);
(0, utils_1.validateReferencesBidirectionality)(config);
};

@@ -43,0 +44,0 @@ }

@@ -25,3 +25,4 @@ "use strict";

(0, utils_1.ensureReferencesArray)(config);
(0, utils_1.getReferencesNodes)(config, context);
config.referenceNodes = (0, utils_1.getReferencesNodes)(config, context);
(0, utils_1.validateReferencesBidirectionality)(config);
};

@@ -28,0 +29,0 @@ }

@@ -7,2 +7,3 @@ "use strict";

const has_one_directive_ddb_references_transformer_1 = require("./has-one-directive-ddb-references-transformer");
const graphql_transformer_core_1 = require("@aws-amplify/graphql-transformer-core");
const hasOneDirectiveMySqlTransformer = new has_one_directive_sql_transformer_1.HasOneDirectiveSQLTransformer();

@@ -21,3 +22,3 @@ const hasOneDirectivePostgresTransformer = new has_one_directive_sql_transformer_1.HasOneDirectiveSQLTransformer();

if (config.fields) {
throw new Error('Something went wrong >> cannot have both references and fields.');
throw new graphql_transformer_core_1.InvalidDirectiveError(`fields and references cannot be defined in the same ${config.directiveName}. Use 'references'`);
}

@@ -24,0 +25,0 @@ if (config.references.length < 1) {

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

if (references.length < 1) {
throw new Error('references should be populated.');
throw new graphql_transformer_core_1.InvalidDirectiveError(`Expected references for @${config.directiveName} on ${object.name.value}.${field.name.value}`);
}

@@ -101,3 +101,3 @@ const primaryKeyFields = (0, graphql_transformer_core_1.getPrimaryKeyFields)(object);

if (references.length < 1) {
throw new Error('references should be populated.');
throw new graphql_transformer_core_1.InvalidDirectiveError(`Expected references for @${config.directiveName} on ${object.name.value}.${field.name.value}`);
}

@@ -104,0 +104,0 @@ const primaryKeyFields = (0, graphql_transformer_core_1.getPrimaryKeyFields)(object);

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

if (references.length < 1 || referenceNodes.length < 1) {
throw new Error('references should not be empty here');
throw new Error(`references not found for ${config.object.name.value}.${config.field.name.value} @${config.directiveName}`);
}

@@ -44,3 +44,5 @@ const relatedTable = (0, graphql_transformer_core_1.getTable)(ctx, relatedType);

if (gsis.some((gsi) => gsi.indexName === indexName)) {
return;
throw new graphql_transformer_core_1.InvalidDirectiveError(`Global secondary index ${indexName} defined on ${relatedType.name.value} conflicts with the naming convention` +
' used to create implicit GSIs for querying relationships.' +
' Please rename your @index');
}

@@ -178,3 +180,3 @@ const referenceNode = referenceNodes[0];

throw new Error(`
Mutation type name is undefined when updated mutation resolvers for composite sortKeys used in DDB references based relationships.
Mutation type name is undefined when updated mutation resolvers for composite sortKeys used in DynamoDB references based relationships.
This should not happen, please file a bug at https://github.com/aws-amplify/amplify-category-api/issues/new/choose`);

@@ -181,0 +183,0 @@ }

import { DirectiveNode, FieldDefinitionNode, ObjectTypeDefinitionNode, ObjectTypeExtensionNode } from 'graphql';
import { WritableDraft } from 'immer/dist/types/types-external';
export type ReferencesRelationalDirectiveConfiguration = HasManyDirectiveConfiguration | HasOneDirectiveConfiguration | BelongsToDirectiveConfiguration;
export type HasOneDirectiveConfiguration = {

@@ -4,0 +5,0 @@ directiveName: string;

import { FieldMapEntry, ResolverReferenceEntry, TransformerContextProvider, TransformerResourceHelperProvider } from '@aws-amplify/graphql-transformer-interfaces';
import type { TransformParameters } from '@aws-amplify/graphql-transformer-interfaces';
import { DirectiveNode, FieldDefinitionNode, ObjectTypeDefinitionNode } from 'graphql';
import { BelongsToDirectiveConfiguration, HasManyDirectiveConfiguration, HasOneDirectiveConfiguration, ManyToManyDirectiveConfiguration } from './types';
import { BelongsToDirectiveConfiguration, HasManyDirectiveConfiguration, HasOneDirectiveConfiguration, ManyToManyDirectiveConfiguration, ReferencesRelationalDirectiveConfiguration } from './types';
export declare const validateParentReferencesFields: (config: HasManyDirectiveConfiguration | HasOneDirectiveConfiguration, ctx: TransformerContextProvider) => void;

@@ -10,3 +10,3 @@ export declare const validateChildReferencesFields: (config: BelongsToDirectiveConfiguration, ctx: TransformerContextProvider) => void;

export declare const ensureReferencesArray: (config: HasManyDirectiveConfiguration | HasOneDirectiveConfiguration | BelongsToDirectiveConfiguration) => void;
export declare const ensureReferencesBidirectionality: (config: HasManyDirectiveConfiguration | BelongsToDirectiveConfiguration) => void;
export declare const validateReferencesBidirectionality: (config: ReferencesRelationalDirectiveConfiguration) => void;
export declare const getModelDirective: (objectType: ObjectTypeDefinitionNode) => DirectiveNode | undefined;

@@ -13,0 +13,0 @@ export declare const validateModelDirective: (config: HasManyDirectiveConfiguration | HasOneDirectiveConfiguration | BelongsToDirectiveConfiguration | ManyToManyDirectiveConfiguration) => void;

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getObjectPrimaryKey = exports.registerManyToManyForeignKeyMappings = exports.registerHasManyForeignKeyMappings = exports.registerHasOneForeignKeyMappings = exports.validateDisallowedDataStoreRelationships = exports.getBackendConnectionAttributeName = exports.getSortKeyConnectionAttributeName = exports.getManyToManyConnectionAttributeName = exports.getConnectionAttributeName = exports.validateRelatedModelDirective = exports.getBelongsToReferencesNodes = exports.getReferencesNodes = exports.getFieldsNodes = exports.getRelatedType = exports.validateModelDirective = exports.getModelDirective = exports.ensureReferencesBidirectionality = exports.ensureReferencesArray = exports.ensureFieldsArray = exports.getRelatedTypeIndex = exports.validateChildReferencesFields = exports.validateParentReferencesFields = void 0;
exports.getObjectPrimaryKey = exports.registerManyToManyForeignKeyMappings = exports.registerHasManyForeignKeyMappings = exports.registerHasOneForeignKeyMappings = exports.validateDisallowedDataStoreRelationships = exports.getBackendConnectionAttributeName = exports.getSortKeyConnectionAttributeName = exports.getManyToManyConnectionAttributeName = exports.getConnectionAttributeName = exports.validateRelatedModelDirective = exports.getBelongsToReferencesNodes = exports.getReferencesNodes = exports.getFieldsNodes = exports.getRelatedType = exports.validateModelDirective = exports.getModelDirective = exports.validateReferencesBidirectionality = exports.ensureReferencesArray = exports.ensureFieldsArray = exports.getRelatedTypeIndex = exports.validateChildReferencesFields = exports.validateParentReferencesFields = void 0;
const graphql_transformer_core_1 = require("@aws-amplify/graphql-transformer-core");
const graphql_1 = require("graphql");
const graphql_transformer_common_1 = require("graphql-transformer-common");
const graphql_directives_1 = require("@aws-amplify/graphql-directives");
const validateParentReferencesFields = (config, ctx) => {

@@ -112,3 +113,3 @@ const { directiveName, object, references, relatedType } = config;

if (config.references) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`DynamoDB models do not support 'references' on @${config.directiveName} directive.`);
throw new graphql_transformer_core_1.InvalidDirectiveError(`'references' defined on ${config.object.name.value}.${config.field.name.value} @${config.directive}. Expecting 'fields' only.`);
}

@@ -128,3 +129,3 @@ if (!config.fields) {

if (config.fields) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`Relational database models do not support 'fields' on @${config.directiveName} directive.`);
throw new graphql_transformer_core_1.InvalidDirectiveError(`'fields' defined on ${config.object.name.value}.${config.field.name.value} @${config.directive}. Expecting 'references' only.`);
}

@@ -142,8 +143,82 @@ if (!config.references) {

exports.ensureReferencesArray = ensureReferencesArray;
const ensureReferencesBidirectionality = (config) => {
if (config.fields) {
throw new graphql_transformer_core_1.InvalidDirectiveError('fields and references cannot be used together.');
const getReferencesAssociatedField = (config) => {
var _a;
const { object } = config;
const expectedBidirectionalErrorMessages = () => {
const associatedDirectiveTypes = getAssociatedRelationalDirectiveTypes(config.directiveName);
const associatedDirectiveDescription = associatedDirectiveTypes.map((directiveName) => `@${directiveName}`).join(' or ');
return (`Add a ${associatedDirectiveDescription} field in ${config.relatedType.name.value} to match the @${config.directiveName}` +
` field ${config.object.name.value}.${config.field.name.value}`);
};
const associatedConnection = (_a = config.relatedType.fields) === null || _a === void 0 ? void 0 : _a.flatMap((associatedField) => {
var _a, _b, _c;
if ((0, graphql_transformer_common_1.getBaseType)(associatedField.type) !== object.name.value) {
return [];
}
const associatedRelationalDirective = (_a = associatedField.directives) === null || _a === void 0 ? void 0 : _a.find((directive) => {
return getAssociatedRelationalDirectiveTypes(config.directiveName)
.map((directiveType) => directiveType)
.includes(directive.name.value);
});
if (!associatedRelationalDirective) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`Uni-directional relationships are not supported. ${expectedBidirectionalErrorMessages()}`);
}
const associatedDirectiveReferencesArgNode = (_c = (_b = associatedRelationalDirective.arguments) === null || _b === void 0 ? void 0 : _b.find((arg) => arg.name.value === 'references')) === null || _c === void 0 ? void 0 : _c.value;
const getReferencesFromArgNode = (argument) => {
if (argument.kind === 'ListValue') {
return argument.values.map((value) => value.value);
}
return [argument.value];
};
const associatedReferences = getReferencesFromArgNode(associatedDirectiveReferencesArgNode);
return [
{
associatedField,
associatedReferences,
},
];
});
if (!associatedConnection || associatedConnection.length === 0) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`Uni-directional relationships are not supported. ${expectedBidirectionalErrorMessages()}`);
}
return associatedConnection[0];
};
exports.ensureReferencesBidirectionality = ensureReferencesBidirectionality;
const referenceFieldTypeMatchesPrimaryKey = (a, b) => {
const areEquivalentTypes = (c, d) => {
const matching = ['ID', 'String'];
return c === d || (matching.includes(c) && matching.includes(d));
};
const typeA = (0, graphql_transformer_common_1.unwrapNonNull)(a.type).name.value;
const typeB = (0, graphql_transformer_common_1.unwrapNonNull)(b.type).name.value;
return areEquivalentTypes(typeA, typeB);
};
const validateReferencesBidirectionality = (config) => {
var _a;
const { directiveName, object, references, referenceNodes, relatedType } = config;
const { associatedReferences } = getReferencesAssociatedField(config);
if (!(references.length === associatedReferences.length) ||
!references.every((reference, index) => reference === associatedReferences[index])) {
throw new Error('');
}
const primaryModel = directiveName === 'belongsTo' ? relatedType : object;
const relatedModel = directiveName === 'belongsTo' ? object : relatedType;
const primaryKeyFieldNames = (0, graphql_transformer_core_1.getPrimaryKeyFields)(primaryModel);
const primaryKeys = (_a = primaryModel.fields) === null || _a === void 0 ? void 0 : _a.filter((field) => primaryKeyFieldNames.includes(field.name.value));
if (!primaryKeys) {
throw new Error(`
Expected to find primary keys on ${primaryModel.name.value} while validating relational bidirectionaly.
This shouldn't happen -- please open an issue at https://github.com/aws-amplify/amplify-category-api
`);
}
primaryKeys
.map((key, index) => [key, referenceNodes[index]])
.forEach(([primaryKey, referenceField]) => {
if (!referenceFieldTypeMatchesPrimaryKey(primaryKey, referenceField)) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`Type mismatch between primary key field(s) of ${primaryModel.name.value}` +
` and reference fields of ${relatedModel.name.value}.` +
` Type of ${primaryModel.name.value}.${primaryKey.name.value} does not match type of ${relatedModel.name.value}.${referenceField.name.value}`);
}
});
};
exports.validateReferencesBidirectionality = validateReferencesBidirectionality;
const getModelDirective = (objectType) => {

@@ -184,6 +259,17 @@ return objectType.directives.find((directive) => directive.name.value === 'model');

exports.getFieldsNodes = getFieldsNodes;
const getAssociatedRelationalDirectiveTypes = (sourceRelationalDirectiveType) => {
switch (sourceRelationalDirectiveType) {
case graphql_directives_1.HasOneDirective.name:
case graphql_directives_1.HasManyDirective.name:
return [graphql_directives_1.BelongsToDirective.name];
case graphql_directives_1.BelongsToDirective.name:
return [graphql_directives_1.HasOneDirective.name, graphql_directives_1.HasManyDirective.name];
default:
throw new Error(`Unexpected directive type ${sourceRelationalDirectiveType}`);
}
};
const getReferencesNodes = (config, ctx) => {
const { directiveName, references, relatedType } = config;
const enums = ctx.output.getTypeDefinitionsOfKind(graphql_1.Kind.ENUM_TYPE_DEFINITION);
return references.map((fieldName) => {
const referenceNodes = references.map((fieldName) => {
const fieldNode = relatedType.fields.find((field) => field.name.value === fieldName);

@@ -198,2 +284,9 @@ if (!fieldNode) {

});
const firstReferenceNodeIsNonNull = (0, graphql_1.isNonNullType)(referenceNodes[0]);
referenceNodes.slice(1).forEach((node) => {
if ((0, graphql_1.isNonNullType)(node) !== firstReferenceNodeIsNonNull) {
throw new graphql_transformer_core_1.InvalidDirectiveError('reference fields must have consistent nullability');
}
});
return referenceNodes;
};

@@ -200,0 +293,0 @@ exports.getReferencesNodes = getReferencesNodes;

{
"name": "@aws-amplify/graphql-relational-transformer",
"version": "2.5.0-gen2-release-0418-2.0",
"version": "2.5.0-gen2-release-0423.0",
"description": "Amplify GraphQL relational modeling transformers",

@@ -31,14 +31,14 @@ "repository": {

"dependencies": {
"@aws-amplify/graphql-directives": "1.1.0-gen2-release-0418-2.0",
"@aws-amplify/graphql-index-transformer": "2.4.0-gen2-release-0418-2.0",
"@aws-amplify/graphql-model-transformer": "2.9.0-gen2-release-0418-2.0",
"@aws-amplify/graphql-transformer-core": "2.6.1-gen2-release-0418-2.0",
"@aws-amplify/graphql-transformer-interfaces": "3.7.0-gen2-release-0418-2.0",
"@aws-amplify/graphql-directives": "1.1.0-gen2-release-0423.0",
"@aws-amplify/graphql-index-transformer": "2.4.0-gen2-release-0423.0",
"@aws-amplify/graphql-model-transformer": "2.9.0-gen2-release-0423.0",
"@aws-amplify/graphql-transformer-core": "2.7.0-gen2-release-0423.0",
"@aws-amplify/graphql-transformer-interfaces": "3.7.0-gen2-release-0423.0",
"graphql": "^15.5.0",
"graphql-mapping-template": "4.20.15",
"graphql-transformer-common": "4.30.1-gen2-release-0418-2.0",
"graphql-transformer-common": "4.30.1-gen2-release-0423.0",
"immer": "^9.0.12"
},
"devDependencies": {
"@aws-amplify/graphql-transformer-test-utils": "0.5.1-gen2-release-0418-2.0"
"@aws-amplify/graphql-transformer-test-utils": "0.5.1-gen2-release-0423.0"
},

@@ -83,3 +83,3 @@ "peerDependencies": {

},
"gitHead": "1752c32dcd54a85370c3ea3f298e25fe25909d93"
"gitHead": "f450cc3e4a785bd0068a1cdb070c424328b64a8c"
}

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

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

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

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc