Socket
Socket
Sign inDemoInstall

@aws-amplify/graphql-relational-transformer

Package Overview
Dependencies
Maintainers
7
Versions
411
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@aws-amplify/graphql-relational-transformer - npm Package Compare versions

Comparing version 0.3.0-auth-dir-v-next.5 to 0.3.0-headless-s3-not-for-production.0

lib/graphql-many-to-many-transformer.d.ts

55

CHANGELOG.md

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

# [0.3.0-auth-dir-v-next.5](https://github.com/aws-amplify/amplify-cli/compare/@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.4...@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.5) (2021-09-21)
# [0.3.0-headless-s3-not-for-production.0](https://github.com/aws-amplify/amplify-cli/compare/@aws-amplify/graphql-relational-transformer@0.2.1...@aws-amplify/graphql-relational-transformer@0.3.0-headless-s3-not-for-production.0) (2021-09-22)
### Bug Fixes
### Features
* iam resolver check and relational payload ([#8234](https://github.com/aws-amplify/amplify-cli/issues/8234)) ([74ccef0](https://github.com/aws-amplify/amplify-cli/commit/74ccef041a22e92a501f2cedd3bacb4f5bfc1cc6))
* add [@many](https://github.com/many)ToMany directive ([#8195](https://github.com/aws-amplify/amplify-cli/issues/8195)) ([cc644eb](https://github.com/aws-amplify/amplify-cli/commit/cc644ebc4968f29ad6b3f0b42013d7ee6a142f7e))

@@ -18,16 +18,4 @@

# [0.3.0-auth-dir-v-next.4](https://github.com/aws-amplify/amplify-cli/compare/@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.3...@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.4) (2021-09-15)
## [0.2.1](https://github.com/aws-amplify/amplify-cli/compare/@aws-amplify/graphql-relational-transformer@0.2.0...@aws-amplify/graphql-relational-transformer@0.2.1) (2021-09-14)
### Bug Fixes
* udpated snapshot for index and relation directives ([e9bc4af](https://github.com/aws-amplify/amplify-cli/commit/e9bc4af9926ec4219c2af12c9ebced04e5ea2574))
* update hasMany to use join table name, sync config warning, updated unit test ([7863044](https://github.com/aws-amplify/amplify-cli/commit/78630446a7195a4d51ffdf433b173598d70dbaa3))
# [0.3.0-auth-dir-v-next.3](https://github.com/aws-amplify/amplify-cli/compare/@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.2...@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.3) (2021-09-15)
**Note:** Version bump only for package @aws-amplify/graphql-relational-transformer

@@ -39,37 +27,2 @@

# [0.3.0-auth-dir-v-next.2](https://github.com/aws-amplify/amplify-cli/compare/@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.1...@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.2) (2021-09-14)
### Bug Fixes
* **graphql-model-transformer:** use hasAuth flag when sandbox mode is disabled ([#8179](https://github.com/aws-amplify/amplify-cli/issues/8179)) ([727bb6f](https://github.com/aws-amplify/amplify-cli/commit/727bb6ff8c726669f358e5d61fe895229bd7a6a4))
# [0.3.0-auth-dir-v-next.1](https://github.com/aws-amplify/amplify-cli/compare/@aws-amplify/graphql-relational-transformer@0.2.0...@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.1) (2021-09-14)
### Features
* graphql auth v2 add auth on mutation and subscription resolvers ([acaff15](https://github.com/aws-amplify/amplify-cli/commit/acaff150efa7da285330e718aaf3fc36cae465d8))
* **graphql-model-transformer:** set up transformer for sandbox mode directive ([#8138](https://github.com/aws-amplify/amplify-cli/issues/8138)) ([e805311](https://github.com/aws-amplify/amplify-cli/commit/e805311d80393afef7e0bc7ad757b51706e7a3bf))
# [0.3.0-auth-dir-v-next.0](https://github.com/aws-amplify/amplify-cli/compare/@aws-amplify/graphql-relational-transformer@0.2.0...@aws-amplify/graphql-relational-transformer@0.3.0-auth-dir-v-next.0) (2021-09-14)
### Features
* graphql auth v2 add auth on mutation and subscription resolvers ([acaff15](https://github.com/aws-amplify/amplify-cli/commit/acaff150efa7da285330e718aaf3fc36cae465d8))
* **graphql-model-transformer:** set up transformer for sandbox mode directive ([#8138](https://github.com/aws-amplify/amplify-cli/issues/8138)) ([e805311](https://github.com/aws-amplify/amplify-cli/commit/e805311d80393afef7e0bc7ad757b51706e7a3bf))
# 0.2.0 (2021-09-02)

@@ -76,0 +29,0 @@

export { HasOneTransformer } from './graphql-has-one-transformer';
export { HasManyTransformer } from './graphql-has-many-transformer';
export { BelongsToTransformer } from './graphql-belongs-to-transformer';
export { ManyToManyTransformer } from './graphql-many-to-many-transformer';
//# sourceMappingURL=index.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BelongsToTransformer = exports.HasManyTransformer = exports.HasOneTransformer = void 0;
exports.ManyToManyTransformer = exports.BelongsToTransformer = exports.HasManyTransformer = exports.HasOneTransformer = void 0;
var graphql_has_one_transformer_1 = require("./graphql-has-one-transformer");

@@ -10,2 +10,4 @@ Object.defineProperty(exports, "HasOneTransformer", { enumerable: true, get: function () { return graphql_has_one_transformer_1.HasOneTransformer; } });

Object.defineProperty(exports, "BelongsToTransformer", { enumerable: true, get: function () { return graphql_belongs_to_transformer_1.BelongsToTransformer; } });
var graphql_many_to_many_transformer_1 = require("./graphql-many-to-many-transformer");
Object.defineProperty(exports, "ManyToManyTransformer", { enumerable: true, get: function () { return graphql_many_to_many_transformer_1.ManyToManyTransformer; } });
//# sourceMappingURL=index.js.map

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

const utils_1 = require("./utils");
const authFilter = graphql_mapping_template_1.ref('ctx.stash.authFilter');
function makeGetItemConnectionWithKeyResolver(config, ctx) {

@@ -42,5 +41,4 @@ const { connectionFields, field, fields, object, relatedType, relatedTypeIndex } = config;

const partitionKeyName = keySchema[0].attributeName;
let totalExpressions = [`${partitionKeyName} = :${partitionKeyName}`];
let totalExpressionValues = {
[`:${partitionKeyName}`]: graphql_mapping_template_1.ref(`util.parseJson($util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank($ctx.source.${localFields[0]}, "${graphql_transformer_common_1.NONE_VALUE}")))`),
const keyObj = {
[partitionKeyName]: graphql_mapping_template_1.ref(`util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank($ctx.source.${localFields[0]}, "${graphql_transformer_common_1.NONE_VALUE}"))`),
};

@@ -51,24 +49,13 @@ if (relatedTypeIndex.length > 2) {

const condensedSortKeyValue = condenseRangeKey(rangeKeyFields.map(keyField => `\${ctx.source.${keyField}}`));
totalExpressions.push(`${sortKeyName} = :${sortKeyName}`);
totalExpressionValues[`:${sortKeyName}`] = graphql_mapping_template_1.ref(`util.parseJson($util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank("${condensedSortKeyValue}", "${graphql_transformer_common_1.NONE_VALUE}")))`);
keyObj[sortKeyName] = graphql_mapping_template_1.ref(`util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank("${condensedSortKeyValue}", "${graphql_transformer_common_1.NONE_VALUE}"))`);
}
else if (relatedTypeIndex.length === 2) {
const sortKeyName = keySchema[1].attributeName;
totalExpressions.push(`${sortKeyName} = :${sortKeyName}`);
totalExpressionValues[`:${sortKeyName}`] = graphql_mapping_template_1.ref(`util.parseJson($util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank($ctx.source.${localFields[1]}, "${graphql_transformer_common_1.NONE_VALUE}")))`);
keyObj[sortKeyName] = graphql_mapping_template_1.ref(`util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank($ctx.source.${localFields[1]}, "${graphql_transformer_common_1.NONE_VALUE}"))`);
}
const resolver = ctx.resolvers.generateQueryResolver(object.name.value, field.name.value, dataSource, graphql_transformer_core_1.MappingTemplate.s3MappingTemplateFromString(graphql_mapping_template_1.print(graphql_mapping_template_1.ifElse(graphql_mapping_template_1.or(localFields.map(f => graphql_mapping_template_1.raw(`$util.isNull($ctx.source.${f})`))), graphql_mapping_template_1.raw('#return'), graphql_mapping_template_1.compoundExpression([
graphql_mapping_template_1.set(graphql_mapping_template_1.ref('GetRequest'), graphql_mapping_template_1.obj({ version: graphql_mapping_template_1.str('2018-05-29'), operation: graphql_mapping_template_1.str('Query') })),
graphql_mapping_template_1.qref(graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('GetRequest.put'), graphql_mapping_template_1.str('query'), graphql_mapping_template_1.obj({
expression: graphql_mapping_template_1.str(totalExpressions.join(' AND ')),
expressionValues: graphql_mapping_template_1.obj(totalExpressionValues),
}))),
graphql_mapping_template_1.iff(graphql_mapping_template_1.not(graphql_mapping_template_1.isNullOrEmpty(authFilter)), graphql_mapping_template_1.qref(graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('GetRequest.put'), graphql_mapping_template_1.str('filter'), graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('util.parseJson'), graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('util.transform.toDynamoDBFilterExpression'), authFilter))))),
graphql_mapping_template_1.toJson(graphql_mapping_template_1.ref('GetRequest')),
]))), `${object.name.value}.${field.name.value}.req.vtl`), graphql_transformer_core_1.MappingTemplate.s3MappingTemplateFromString(graphql_mapping_template_1.print(graphql_mapping_template_1.DynamoDBMappingTemplate.dynamoDBResponse(false, graphql_mapping_template_1.compoundExpression([
graphql_mapping_template_1.ifElse(graphql_mapping_template_1.and([graphql_mapping_template_1.not(graphql_mapping_template_1.ref('ctx.result.items.isEmpty()')), graphql_mapping_template_1.equals(graphql_mapping_template_1.ref('ctx.result.scannedCount'), graphql_mapping_template_1.int(1))]), graphql_mapping_template_1.toJson(graphql_mapping_template_1.ref('ctx.result.items[0]')), graphql_mapping_template_1.compoundExpression([
graphql_mapping_template_1.iff(graphql_mapping_template_1.and([graphql_mapping_template_1.ref('ctx.result.items.isEmpty()'), graphql_mapping_template_1.equals(graphql_mapping_template_1.ref('ctx.result.scannedCount'), graphql_mapping_template_1.int(1))]), graphql_mapping_template_1.ref('util.unauthorized()')),
graphql_mapping_template_1.toJson(graphql_mapping_template_1.nul()),
])),
]))), `${object.name.value}.${field.name.value}.res.vtl`));
graphql_mapping_template_1.DynamoDBMappingTemplate.getItem({
key: graphql_mapping_template_1.obj(keyObj),
}),
]))), `${object.name.value}.${field.name.value}.req.vtl`), graphql_transformer_core_1.MappingTemplate.s3MappingTemplateFromString(graphql_mapping_template_1.print(graphql_mapping_template_1.DynamoDBMappingTemplate.dynamoDBResponse(false)), `${object.name.value}.${field.name.value}.res.vtl`));
resolver.mapToStack(table.stack);

@@ -100,16 +87,6 @@ ctx.resolvers.addResolver(object.name.value, field.name.value, resolver);

}
setup.push(graphql_mapping_template_1.ifElse(graphql_mapping_template_1.not(graphql_mapping_template_1.isNullOrEmpty(authFilter)), graphql_mapping_template_1.compoundExpression([
graphql_mapping_template_1.set(graphql_mapping_template_1.ref('filter'), authFilter),
graphql_mapping_template_1.iff(graphql_mapping_template_1.not(graphql_mapping_template_1.isNullOrEmpty(graphql_mapping_template_1.ref('ctx.args.filter'))), graphql_mapping_template_1.set(graphql_mapping_template_1.ref('filter'), graphql_mapping_template_1.list([graphql_mapping_template_1.obj({ and: graphql_mapping_template_1.list([graphql_mapping_template_1.ref('filter'), graphql_mapping_template_1.ref('ctx.args.filter')]) })]))),
]), graphql_mapping_template_1.iff(graphql_mapping_template_1.not(graphql_mapping_template_1.isNullOrEmpty(graphql_mapping_template_1.ref('ctx.args.filter'))), graphql_mapping_template_1.set(graphql_mapping_template_1.ref('filter'), graphql_mapping_template_1.ref('ctx.args.filter')))), graphql_mapping_template_1.iff(graphql_mapping_template_1.not(graphql_mapping_template_1.isNullOrEmpty(graphql_mapping_template_1.ref('filter'))), graphql_mapping_template_1.compoundExpression([
graphql_mapping_template_1.set(graphql_mapping_template_1.ref(`filterExpression`), graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('util.parseJson'), graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('util.transform.toDynamoDBFilterExpression'), graphql_mapping_template_1.ref('filter')))),
graphql_mapping_template_1.iff(graphql_mapping_template_1.not(graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('util.isNullOrBlank'), graphql_mapping_template_1.ref('filterExpression.expression'))), graphql_mapping_template_1.compoundExpression([
graphql_mapping_template_1.iff(graphql_mapping_template_1.equals(graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('filterEpression.expressionValues.size')), graphql_mapping_template_1.int(0)), graphql_mapping_template_1.qref(graphql_mapping_template_1.methodCall(graphql_mapping_template_1.ref('filterEpression.remove'), graphql_mapping_template_1.str('expressionValues')))),
graphql_mapping_template_1.set(graphql_mapping_template_1.ref('filter'), graphql_mapping_template_1.ref('filterExpression')),
])),
])));
const queryArguments = {
query: graphql_mapping_template_1.raw('$util.toJson($query)'),
scanIndexForward: graphql_mapping_template_1.ifElse(graphql_mapping_template_1.ref('context.args.sortDirection'), graphql_mapping_template_1.ifElse(graphql_mapping_template_1.equals(graphql_mapping_template_1.ref('context.args.sortDirection'), graphql_mapping_template_1.str('ASC')), graphql_mapping_template_1.bool(true), graphql_mapping_template_1.bool(false)), graphql_mapping_template_1.bool(true)),
filter: graphql_mapping_template_1.ifElse(graphql_mapping_template_1.ref('filter'), graphql_mapping_template_1.ref('util.toJson($filter)'), graphql_mapping_template_1.nul()),
filter: graphql_mapping_template_1.ifElse(graphql_mapping_template_1.ref('context.args.filter'), graphql_mapping_template_1.ref('util.transform.toDynamoDBFilterExpression($ctx.args.filter)'), graphql_mapping_template_1.nul()),
limit: graphql_mapping_template_1.ref('limit'),

@@ -116,0 +93,0 @@ nextToken: graphql_mapping_template_1.ifElse(graphql_mapping_template_1.ref('context.args.nextToken'), graphql_mapping_template_1.ref('util.toJson($context.args.nextToken)'), graphql_mapping_template_1.nul()),

import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
import { HasManyDirectiveConfiguration, HasOneDirectiveConfiguration } from './types';
import { FieldDefinitionNode, ObjectTypeDefinitionNode } from 'graphql';
import { HasManyDirectiveConfiguration, HasOneDirectiveConfiguration, ManyToManyDirectiveConfiguration } from './types';
export declare function extendTypeWithConnection(config: HasManyDirectiveConfiguration, ctx: TransformerContextProvider): void;
export declare function ensureHasOneConnectionField(config: HasOneDirectiveConfiguration, ctx: TransformerContextProvider): void;
export declare function ensureHasManyConnectionField(config: HasManyDirectiveConfiguration, ctx: TransformerContextProvider): void;
export declare function ensureHasManyConnectionField(config: HasManyDirectiveConfiguration | ManyToManyDirectiveConfiguration, ctx: TransformerContextProvider): void;
export declare function getPartitionKeyField(object: ObjectTypeDefinitionNode): FieldDefinitionNode;
//# sourceMappingURL=schema.d.ts.map

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

Object.defineProperty(exports, "__esModule", { value: true });
exports.ensureHasManyConnectionField = exports.ensureHasOneConnectionField = exports.extendTypeWithConnection = void 0;
exports.getPartitionKeyField = exports.ensureHasManyConnectionField = exports.ensureHasOneConnectionField = exports.extendTypeWithConnection = void 0;
const assert_1 = __importDefault(require("assert"));

@@ -42,3 +42,3 @@ const graphql_model_transformer_1 = require("@aws-amplify/graphql-model-transformer");

connectionTypeExtension = graphql_transformer_common_1.extensionWithFields(connectionTypeExtension, [
graphql_transformer_common_1.makeField('items', [], graphql_transformer_common_1.makeListType(graphql_transformer_common_1.makeNamedType(relatedType.name.value))),
graphql_transformer_common_1.makeField('items', [], graphql_transformer_common_1.makeListType(graphql_transformer_common_1.makeNamedType(tableXConnectionName))),
]);

@@ -232,2 +232,17 @@ connectionTypeExtension = graphql_transformer_common_1.extensionWithFields(connectionTypeExtension, [graphql_transformer_common_1.makeField('nextToken', [], graphql_transformer_common_1.makeNamedType('String'))]);

}
function getPartitionKeyField(object) {
const fieldMap = new Map();
let name = 'id';
for (const field of object.fields) {
fieldMap.set(field.name.value, field);
for (const directive of field.directives) {
if (directive.name.value === 'primaryKey') {
name = field.name.value;
break;
}
}
}
return fieldMap.get(name);
}
exports.getPartitionKeyField = getPartitionKeyField;
//# sourceMappingURL=schema.js.map

@@ -37,2 +37,21 @@ import { DirectiveNode, FieldDefinitionNode, ObjectTypeDefinitionNode } from 'graphql';

};
export declare type ManyToManyDirectiveConfiguration = {
directiveName: string;
object: ObjectTypeDefinitionNode;
field: FieldDefinitionNode;
directive: DirectiveNode;
relationName: string;
indexName: string;
fields: string[];
fieldNodes: FieldDefinitionNode[];
relatedType: ObjectTypeDefinitionNode;
relatedTypeIndex: FieldDefinitionNode[];
connectionFields: string[];
limit: number;
};
export declare type ManyToManyRelation = {
name: string;
directive1: ManyToManyDirectiveConfiguration;
directive2: ManyToManyDirectiveConfiguration;
};
//# sourceMappingURL=types.d.ts.map
import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
import { DirectiveNode, FieldDefinitionNode, ObjectTypeDefinitionNode } from 'graphql';
import { BelongsToDirectiveConfiguration, HasManyDirectiveConfiguration, HasOneDirectiveConfiguration } from './types';
import { BelongsToDirectiveConfiguration, HasManyDirectiveConfiguration, HasOneDirectiveConfiguration, ManyToManyDirectiveConfiguration } from './types';
export declare function getRelatedTypeIndex(config: HasOneDirectiveConfiguration, ctx: TransformerContextProvider, indexName?: string): FieldDefinitionNode[];
export declare function ensureFieldsArray(config: HasManyDirectiveConfiguration | HasOneDirectiveConfiguration | BelongsToDirectiveConfiguration): void;
export declare function getModelDirective(objectType: ObjectTypeDefinitionNode): DirectiveNode | undefined;
export declare function validateModelDirective(config: HasManyDirectiveConfiguration | HasOneDirectiveConfiguration | BelongsToDirectiveConfiguration): void;
export declare function validateModelDirective(config: HasManyDirectiveConfiguration | HasOneDirectiveConfiguration | BelongsToDirectiveConfiguration | ManyToManyDirectiveConfiguration): void;
export declare function getRelatedType(config: HasManyDirectiveConfiguration | HasOneDirectiveConfiguration | BelongsToDirectiveConfiguration, ctx: TransformerContextProvider): ObjectTypeDefinitionNode;

@@ -9,0 +9,0 @@ export declare function getFieldsNodes(config: HasManyDirectiveConfiguration | HasOneDirectiveConfiguration | BelongsToDirectiveConfiguration, ctx: TransformerContextProvider): FieldDefinitionNode[];

{
"name": "@aws-amplify/graphql-relational-transformer",
"version": "0.3.0-auth-dir-v-next.5",
"version": "0.3.0-headless-s3-not-for-production.0",
"description": "Amplify GraphQL relational modeling transformers",

@@ -30,4 +30,6 @@ "repository": {

"dependencies": {
"@aws-amplify/graphql-transformer-core": "0.10.0-auth-dir-v-next.3",
"@aws-amplify/graphql-transformer-interfaces": "1.10.0-auth-dir-v-next.1",
"@aws-amplify/graphql-index-transformer": "0.3.3-headless-s3-not-for-production.0",
"@aws-amplify/graphql-model-transformer": "0.6.3-headless-s3-not-for-production.0",
"@aws-amplify/graphql-transformer-core": "0.9.1-headless-s3-not-for-production.0",
"@aws-amplify/graphql-transformer-interfaces": "1.9.1-headless-s3-not-for-production.0",
"@aws-cdk/aws-appsync": "~1.119.0",

@@ -37,8 +39,6 @@ "@aws-cdk/aws-dynamodb": "~1.119.0",

"graphql": "^14.5.8",
"graphql-mapping-template": "4.19.0-auth-dir-v-next.1",
"graphql-transformer-common": "4.19.10-auth-dir-v-next.1"
"graphql-mapping-template": "4.18.3",
"graphql-transformer-common": "4.19.9"
},
"devDependencies": {
"@aws-amplify/graphql-index-transformer": "0.4.0-auth-dir-v-next.4",
"@aws-amplify/graphql-model-transformer": "0.7.0-auth-dir-v-next.4",
"@aws-cdk/assert": "~1.119.0"

@@ -61,3 +61,3 @@ },

},
"gitHead": "6e94f050d76b9fa4061e355e655946ab8dfd5164"
"gitHead": "633fe35382bff0520a342b58bef3647ab07ee8f2"
}

@@ -34,1 +34,11 @@ # GraphQL Relational Modeling Transformers

```
### @manyToMany
The `@manyToMany` directive allows you to define "many to many" relationships between data.
#### Definition
```graphql
directive @manyToMany(relationName: String!, limit: Int = 100) on FIELD_DEFINITION
```

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