From 72a5e87a3ac56c077ce1c960aee92014071c9e42 Mon Sep 17 00:00:00 2001 From: c3b5aw Date: Fri, 29 Jul 2022 15:27:51 +0200 Subject: [PATCH] feat: 0.0.1-alpha --- .github/workflows/cd.yaml | 27 +++++++++++++++++++++++++++ .prettierrc | 6 ++++++ commitlint.config.js | 9 ++------- examples/server.ts | 2 +- package.json | 15 +++++++++------ src/config.ts | 5 +---- src/index.ts | 17 +++-------------- src/plugins/CostAnalysis.ts | 8 +------- src/plugins/FieldSuggestion.ts | 8 +------- src/plugins/Introspection.ts | 12 +++--------- src/types.ts | 11 ++--------- 11 files changed, 56 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/cd.yaml create mode 100644 .prettierrc diff --git a/.github/workflows/cd.yaml b/.github/workflows/cd.yaml new file mode 100644 index 00000000..09cb5716 --- /dev/null +++ b/.github/workflows/cd.yaml @@ -0,0 +1,27 @@ +name: cd + +on: + push: + tags: + - "v*" + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: softprops/action-gh-release@v1 + + npm-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '16.x' + registry-url: 'https://registry.npmjs.org' + - run: npm install . + - run: npm run build + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..ef937f96 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "parser": "typescript", + "printWidth": 120, + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/commitlint.config.js b/commitlint.config.js index 0ef7137b..9b762020 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -16,14 +16,9 @@ const Configuration = { /* * Custom URL to show upon failure */ - helpUrl: - 'https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines', + helpUrl: 'https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines', rules: { - 'type-enum': [ - 2, - 'always', - ['ci', 'docs', 'feat', 'fix', 'refactor', 'test', 'chore'], - ], + 'type-enum': [2, 'always', ['ci', 'docs', 'feat', 'fix', 'refactor', 'test', 'chore', 'wip']], }, }; diff --git a/examples/server.ts b/examples/server.ts index b4562197..e2040446 100644 --- a/examples/server.ts +++ b/examples/server.ts @@ -62,7 +62,7 @@ const armor = new GQLArmor( }, (status: string, plugin: any) => { console.log(status, plugin._namespace); - } + }, ); const server = armor.apolloServer({ diff --git a/package.json b/package.json index 7c0ec98b..c6dc83f3 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,17 @@ { - "name": "graphql-armor", - "version": "0.0.1", + "name": "@escape.tech/graphql-armor", + "version": "0.0.1-alpha", "description": "", - "main": "index.js", + "main": "dist/index.js", + "files": [ + "dist/**/*.js" + ], "scripts": { - "build": "tsc -p tsconfig.json", - "watch": "tsc -p tsconfig.json -w", + "build": "tsc", + "dev": "tsc -w", "start": "NODE_PATH=dist node dist/index.js", "test": "echo 'NotImplementedError'", - "lint": "yarn prettier . -uw --single-quote", + "lint": "prettier src/ -uw --single-quote", "example": "nodemon --delay 500ms examples/server.ts" }, "repository": { diff --git a/src/config.ts b/src/config.ts index 4a09005f..3ed9b885 100644 --- a/src/config.ts +++ b/src/config.ts @@ -11,10 +11,7 @@ const defaultConfig: ArmorConfig = { FieldSuggestion: DefaultFieldSuggestionConfig, // 0x8 }; -function applyBitwisePermissions( - config: ArmorConfig, - permUID: number -): ArmorConfig { +function applyBitwisePermissions(config: ArmorConfig, permUID: number): ArmorConfig { let keyID = 0; for (const key in defaultConfig) { if (!config.hasOwnProperty(key)) { diff --git a/src/index.ts b/src/index.ts index ecac7898..20141e66 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,13 +4,7 @@ import { Config } from 'apollo-server-core/src/types'; import * as Plugins from './plugins/'; import { ArmorPlugin } from './ArmorPlugin'; -import { - PluginDefinition, - ValidationRule, - ArmorConfig, - PluginUpdateEvent, - PluginState, -} from './types'; +import { PluginDefinition, ValidationRule, ArmorConfig, PluginUpdateEvent, PluginState } from './types'; import { ConfigService } from './config'; export class GQLArmor { @@ -42,9 +36,7 @@ export class GQLArmor { /* * Inject remediations into the ApolloServer constructor */ - public apolloServer( - apolloConfig: Config - ) { + public apolloServer(apolloConfig: Config) { apolloConfig.plugins ??= []; apolloConfig.validationRules ??= []; @@ -65,10 +57,7 @@ export class GQLArmor { // We prepend our plugins/rules // So that we can protect the following user-defined plugins from attacks apolloConfig.plugins = [...apolloPlugins, ...apolloConfig.plugins!]; - apolloConfig.validationRules = [ - ...validationRules, - ...apolloConfig.validationRules!, - ]; + apolloConfig.validationRules = [...validationRules, ...apolloConfig.validationRules!]; return new ApolloServer(apolloConfig); } diff --git a/src/plugins/CostAnalysis.ts b/src/plugins/CostAnalysis.ts index 9f74cd02..d544b003 100644 --- a/src/plugins/CostAnalysis.ts +++ b/src/plugins/CostAnalysis.ts @@ -3,13 +3,7 @@ import { ValidationRule, PluginConfig } from '../types'; import { ComplexityVisitor } from 'graphql-validation-complexity'; -import { - ASTVisitor, - GraphQLError, - TypeInfo, - visit, - visitWithTypeInfo, -} from 'graphql'; +import { ASTVisitor, GraphQLError, TypeInfo, visit, visitWithTypeInfo } from 'graphql'; export type CostAnalysisConfig = { CostAnalysis?: { options: { maxCost: number } } & PluginConfig; diff --git a/src/plugins/FieldSuggestion.ts b/src/plugins/FieldSuggestion.ts index 05afa7ec..edef9010 100644 --- a/src/plugins/FieldSuggestion.ts +++ b/src/plugins/FieldSuggestion.ts @@ -1,11 +1,5 @@ import { ArmorPlugin } from '../ArmorPlugin'; -import { - ValidationRule, - GraphQLError, - ValidationContext, - ASTVisitor, - FieldNode, -} from 'graphql'; +import { ValidationRule, GraphQLError, ValidationContext, ASTVisitor, FieldNode } from 'graphql'; import { PluginConfig } from 'types'; export type FieldSuggestionConfig = { diff --git a/src/plugins/Introspection.ts b/src/plugins/Introspection.ts index a4f5a475..6037bf20 100644 --- a/src/plugins/Introspection.ts +++ b/src/plugins/Introspection.ts @@ -8,24 +8,18 @@ export const DefaultIntrospectionConfig = { options: { headersWhitelist: { 'x-allow-introspection': 'allow', - ...(process.env.ESCAPE_IDENTIFIER - ? { 'x-escape-identifier': process.env.ESCAPE_IDENTIFIER } - : {}), + ...(process.env.ESCAPE_IDENTIFIER ? { 'x-escape-identifier': process.env.ESCAPE_IDENTIFIER } : {}), }, }, }; -const plugin = ({ - options: { headersWhitelist }, -}: PluginConfig): PluginDefinition => { +const plugin = ({ options: { headersWhitelist } }: PluginConfig): PluginDefinition => { return { async requestDidStart({ request }) { if (request.query!.includes('__schema')) { const headers = request.http!.headers; - const whitelistedHeaders = headersWhitelist.filter((header) => - headers.has(header) - ); + const whitelistedHeaders = headersWhitelist.filter((header) => headers.has(header)); if (whitelistedHeaders.length === 0) { throw new Error('Introspection is disabled'); diff --git a/src/types.ts b/src/types.ts index 6c8f7dfa..e33c00ad 100644 --- a/src/types.ts +++ b/src/types.ts @@ -15,10 +15,7 @@ export enum PluginState { REGISTERED = 'registered', UNREGISTERED = 'unregistered', } -export type PluginUpdateEvent = ( - status: PluginState, - plugin: PluginConfig -) => void; +export type PluginUpdateEvent = (status: PluginState, plugin: PluginConfig) => void; // Config export type PluginConfig = { @@ -26,8 +23,4 @@ export type PluginConfig = { enabled?: boolean; options?: any; }; -export type ArmorConfig = - | IntrospectionConfig - | CharacterLimitConfig - | CostAnalysisConfig - | FieldSuggestionConfig; +export type ArmorConfig = IntrospectionConfig | CharacterLimitConfig | CostAnalysisConfig | FieldSuggestionConfig;