From eea63329d75a0386db743a1ae7b477763c5ba1d2 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 2 Mar 2022 10:40:07 -0600 Subject: [PATCH 01/40] working on adding some typedefs --- lib/typedefs.ts | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 31 +++++++++++++++++++++++++---- tsconfig.json | 22 ++++++++++++++++++++ 3 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 lib/typedefs.ts create mode 100644 tsconfig.json diff --git a/lib/typedefs.ts b/lib/typedefs.ts new file mode 100644 index 0000000..b2b6f54 --- /dev/null +++ b/lib/typedefs.ts @@ -0,0 +1,53 @@ +import { GraphQLSchema, Source, DocumentNode, GraphQLResolveInfo } from 'graphql'; +import { IMocks, IResolvers } from 'graphql-tools'; +import { DirectiveUseMap } from 'graphql-tools'; + +export type ContextFunction = ((ctx: any) => any); + +export interface IContextMiddleware { + name: string + fn: ContextFunction +} + +export interface IContextConfig { + namespace: string + factory: ContextFunction +} + +export interface IContextWrapper extends ContextFunction { + use: (name: string|ContextFunction|null, fn?: ContextFunction|string) => void +} + +export interface IGraphQLComponentConfig { + component: IGraphQLComponent + exclude: string[] +} + +export interface IGraphQLComponent { + execute: (input: string, options: { root: any, context: {}, variables: {} }) => Promise + schema: GraphQLSchema + types: (string | Source | DocumentNode)[] + resolvers: IResolvers + imports?: IGraphQLComponent[] | IGraphQLComponentConfig[] + context: ContextFunction + mocks: IMocks +} + +export interface IGraphQLComponentOptions { + types?: (string | Source | DocumentNode)[] + resolvers?: IResolvers + imports?: (IGraphQLComponent|IGraphQLComponentConfig)[] + mocks?: MocksConfigFunction + directives?: DirectiveUseMap + context?: IContextConfig + useMocks?: boolean + federation?: boolean + preserveTypeResolvers?: boolean + dataSources?: any[] //fix this + dataSourceOverrides?: any[] //fix this + makeExecutableSchema?: any //fix this +}; + +export type MocksConfigFunction = (IMocks) => IMocks; + +export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; \ No newline at end of file diff --git a/package.json b/package.json index a052a3b..a048ae8 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,11 @@ "module", "component" ], - "main": "lib/index.js", + "main": "dist/index.js", "scripts": { - "test": "tape lib/*/**/__tests__.js lib/__tests__.js", + "build": "tsc", + "prepublish": "npm run build", + "test": "ts-node node_modules/.bin/tape lib/*/**/__tests__.ts lib/__tests__.ts", "start-composition": "DEBUG=graphql-component:* node examples/composition/server/index.js", "start-federation": "DEBUG=graphql-component:* node examples/federation/run-federation-example.js", "lint": "eslint lib", @@ -22,8 +24,11 @@ "license": "MIT", "dependencies": { "@apollo/federation": "^0.28.0", + "@types/graphql": "^14.5.0", + "@types/node": "^17.0.21", "debug": "^4.3.1", - "graphql-tools": "^7.0.5" + "graphql-tools": "^7.0.5", + "typescript": "^4.6.2" }, "peerDependencies": { "graphql": "^15.0.0" @@ -37,6 +42,24 @@ "graphql-tag": "^2.12.4", "nyc": "^14.1.1", "sinon": "^12.0.1", - "tape": "^4.9.1" + "tape": "^4.9.1", + "ts-node": "^10.6.0" + }, + "nyc": { + "include": [ + "src/**/*.ts" + ], + "extension": [ + ".ts" + ], + "require": [ + "ts-node/register" + ], + "reporter": [ + "text-summary", + "html" + ], + "sourceMap": true, + "instrument": true } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f354069 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "module": "commonjs", + "target": "esnext", + "lib": ["esnext"], + "noImplicitAny": false, + "suppressImplicitAnyIndexErrors": true, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "inlineSourceMap": true, + "declaration": true, + "esModuleInterop": true, + "types" : ["node", "graphql"], + "outDir": "./dist", + "rootDir": "./src", + }, + "exclude": ["node_modules"], + "include": [ + "./src" + ] +} From e20e1bf91a28f22a4c711177dcc3b7a597e7ae81 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 23 Mar 2022 10:33:37 -0500 Subject: [PATCH 02/40] more to do --- dist/index.d.ts | 75 ++ dist/index.js | 292 ++++++++ lib/__tests__.js | 1293 ----------------------------------- lib/context/__tests__.js | 128 ---- lib/context/index.js | 64 -- lib/datasource/__tests__.js | 173 ----- lib/datasource/index.js | 49 -- lib/index.d.ts | 66 -- lib/index.js | 209 ------ lib/resolvers/__tests__.js | 225 ------ lib/resolvers/index.js | 96 --- lib/transforms/__tests__.js | 51 -- lib/transforms/index.js | 47 -- lib/typedefs.ts | 53 -- package.json | 8 +- src/index.ts | 450 ++++++++++++ test/test.ts | 177 +++++ 17 files changed, 998 insertions(+), 2458 deletions(-) create mode 100644 dist/index.d.ts create mode 100644 dist/index.js delete mode 100644 lib/__tests__.js delete mode 100644 lib/context/__tests__.js delete mode 100644 lib/context/index.js delete mode 100644 lib/datasource/__tests__.js delete mode 100644 lib/datasource/index.js delete mode 100644 lib/index.d.ts delete mode 100644 lib/index.js delete mode 100644 lib/resolvers/__tests__.js delete mode 100644 lib/resolvers/index.js delete mode 100644 lib/transforms/__tests__.js delete mode 100644 lib/transforms/index.js delete mode 100644 lib/typedefs.ts create mode 100644 src/index.ts create mode 100644 test/test.ts diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..f208b86 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,75 @@ +import { GraphQLResolveInfo, GraphQLSchema } from 'graphql'; +import { IResolvers, DirectiveUseMap, SubschemaConfig, PruneSchemaOptions, ITypedef, IMocks } from 'graphql-tools'; +export declare type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; +export interface IGraphQLComponentConfigObject { + component: IGraphQLComponent; + configuration?: SubschemaConfig; +} +export declare type ContextFunction = ((ctx: any) => any); +export interface IDataSource { + name: string; +} +export declare type DataSourceMap = { + [key: string]: IDataSource; +}; +export declare type DataSourceInjectionFunction = ((ctx: any) => DataSourceMap); +export interface IContextConfig { + namespace: string; + factory: ContextFunction; +} +export interface IContextWrapper extends ContextFunction { + use: (name: string | ContextFunction | null, fn?: ContextFunction | string) => void; +} +export interface IGraphQLComponentOptions { + types?: ITypedef | ITypedef[]; + resolvers?: IResolvers; + mocks?: IMocks; + directives?: DirectiveUseMap; + imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; + context?: IContextConfig; + dataSources?: any[]; + dataSourceOverrides?: any; + pruneSchema?: boolean; + pruneSchemaOptions?: PruneSchemaOptions; + federation?: boolean; +} +export interface IGraphQLComponent { + readonly name: string; + readonly schema: GraphQLSchema; + readonly context: IContextWrapper; + readonly types: ITypedef[]; + readonly resolvers: IResolvers; + readonly imports?: IGraphQLComponentConfigObject[]; + readonly directives?: DirectiveUseMap; + readonly dataSources?: IDataSource[]; + federation?: boolean; + overrideDataSources: (dataSources: DataSourceMap, context: any) => void; +} +export default class GraphQLComponent implements IGraphQLComponent { + _schema: GraphQLSchema; + _types: ITypedef[]; + _resolvers: IResolvers; + _mocks: IMocks; + _directives: DirectiveUseMap; + _imports: IGraphQLComponentConfigObject[]; + _context: ContextFunction; + _dataSources: IDataSource[]; + _dataSourceOverrides: IDataSource[]; + _pruneSchema: boolean; + _pruneSchemaOptions: PruneSchemaOptions; + _federation: boolean; + _dataSourceInjection: DataSourceInjectionFunction; + constructor({ types, resolvers, mocks, directives, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, federation }: IGraphQLComponentOptions); + overrideDataSources(dataSources: DataSourceMap, context: any): void; + get name(): string; + get schema(): GraphQLSchema; + get context(): IContextWrapper; + get types(): ITypedef[]; + get resolvers(): IResolvers; + get imports(): IGraphQLComponentConfigObject[]; + get directives(): DirectiveUseMap; + get dataSources(): IDataSource[]; + set federation(flag: boolean); + get federation(): boolean; + get dataSourceInjection(): DataSourceInjectionFunction; +} diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..e7f8f25 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,292 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const debug = require('debug')('graphql-component'); +const federation_1 = require("@apollo/federation"); +const graphql_1 = require("graphql"); +const graphql_tools_1 = require("graphql-tools"); +class GraphQLComponent { + _schema; + _types; + _resolvers; + _mocks; + _directives; + _imports; + _context; + _dataSources; + _dataSourceOverrides; + _pruneSchema; + _pruneSchemaOptions; + _federation; + _dataSourceInjection; + constructor({ types, resolvers, mocks, directives, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, federation }) { + this._types = Array.isArray(types) ? types : [types]; + this._resolvers = bindResolvers(this, resolvers); + this._mocks = mocks; + this._directives = directives; + this._federation = federation; + this._dataSources = dataSources; + this._dataSourceOverrides = dataSourceOverrides; + this._pruneSchema = pruneSchema; + this._pruneSchemaOptions = pruneSchemaOptions; + this._imports = imports && imports.length > 0 ? imports.map((i) => { + // check for a GraphQLComponent instance to construct a configuration object from it + if (i instanceof GraphQLComponent) { + // if the importing component (ie. this component) has federation set to true - set federation: true + // for all of its imported components + if (this._federation === true) { + i.federation = true; + } + return { component: i }; + } + else { + const importConfiguration = i; + if (this._federation === true) { + importConfiguration.component.federation = true; + } + return importConfiguration; + } + }) : []; + this._context = async () => { + const ctx = {}; + for (const { component } of this.imports) { + Object.assign(ctx, await component.context(context)); + } + if (context) { + debug(`building ${context.namespace} context`); + if (!ctx[context.namespace]) { + ctx[context.namespace] = {}; + } + Object.assign(ctx[context.namespace], await context.factory.call(this, context)); + } + return ctx; + }; + } + overrideDataSources(dataSources, context) { + Object.assign(dataSources, this._dataSourceInjection(context)); + return; + } + get name() { + return this.constructor.name; + } + get schema() { + if (this._schema) { + return this._schema; + } + let makeSchema = undefined; + if (this._federation) { + makeSchema = (schemaConfig) => { + const schema = (0, federation_1.buildFederatedSchema)(schemaConfig); + // allows a federated schema to have custom directives using the old class based directive implementation + if (this._directives) { + graphql_tools_1.SchemaDirectiveVisitor.visitSchemaDirectives(schema, this._directives); + } + return schema; + }; + } + else { + makeSchema = graphql_tools_1.makeExecutableSchema; + } + if (this._imports.length > 0) { + // iterate through the imports and construct subschema configuration objects + const subschemas = this._imports.map((imp) => { + const { component, configuration = {} } = imp; + return { + schema: component.schema, + ...configuration + }; + }); + // construct an aggregate schema from the schemas of imported + // components and this component's types/resolvers (if present) + this._schema = (0, graphql_tools_1.stitchSchemas)({ + subschemas, + typeDefs: this._types, + resolvers: this._resolvers, + schemaDirectives: this._directives + }); + } + else { + const schemaConfig = { + typeDefs: (0, graphql_tools_1.mergeTypeDefs)(this._types), + resolvers: this._resolvers, + schemaDirectives: this._directives + }; + this._schema = makeSchema(schemaConfig); + } + if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { + debug(`adding default mocks to the schema for ${this.name}`); + // if mocks are a boolean support simply applying default mocks + this._schema = (0, graphql_tools_1.addMocksToSchema)({ schema: this._schema, preserveResolvers: true }); + } + else if (this._mocks !== undefined && typeof this._mocks === 'object') { + debug(`adding custom mocks to the schema for ${this.name}`); + // else if mocks is an object, that means the user provided + // custom mocks, with which we pass them to addMocksToSchema so they are applied + this._schema = (0, graphql_tools_1.addMocksToSchema)({ schema: this._schema, mocks: this._mocks, preserveResolvers: true }); + } + if (this._pruneSchema) { + debug(`pruning the schema for ${this.name}`); + this._schema = (0, graphql_tools_1.pruneSchema)(this._schema, this._pruneSchemaOptions); + } + debug(`created schema for ${this.name}`); + return this._schema; + } + get context() { + const middleware = []; + const contextFunction = this.context; + const dataSourceInject = (context = {}) => { + const intercept = (instance, context) => { + debug(`intercepting ${instance.constructor.name}`); + return new Proxy(instance, { + get(target, key) { + if (typeof target[key] !== 'function' || key === instance.constructor.name) { + return target[key]; + } + const original = target[key]; + return function (...args) { + return original.call(instance, context, ...args); + }; + } + }); + }; + const dataSources = {}; + for (const { component } of this.imports) { + component.overrideDataSources(dataSources, context); + } + for (const override of this._dataSourceOverrides) { + debug(`overriding datasource ${override.constructor.name}`); + dataSources[override.constructor.name] = intercept(override, context); + } + if (this.dataSources && this.dataSources.length > 0) { + for (const dataSource of this.dataSources) { + const name = dataSource.constructor.name; + if (!dataSources[name]) { + dataSources[name] = intercept(dataSource, context); + } + } + } + return dataSources; + }; + const context = async (context) => { + debug(`building root context`); + for (let { name, fn } of middleware) { + debug(`applying ${name} middleware`); + context = await fn(context); + } + const componentContext = await contextFunction(context); + const globalContext = { + ...context, + ...componentContext + }; + globalContext.dataSources = dataSourceInject(globalContext); + return globalContext; + }; + context.use = function (name, fn) { + if (typeof name === 'function') { + fn = name; + name = 'unknown'; + } + debug(`adding ${name} middleware`); + middleware.push({ name, fn }); + }; + return context; + } + get types() { + return this._types; + } + get resolvers() { + return this._resolvers; + } + get imports() { + return this._imports; + } + get directives() { + return this._directives; + } + get dataSources() { + return this._dataSources; + } + set federation(flag) { + this._federation = flag; + } + get federation() { + return this._federation; + } + get dataSourceInjection() { + return this._dataSourceInjection; + } +} +exports.default = GraphQLComponent; +/** + * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided + * @param {string} parentType - the type whose field resolver is being + * wrapped/memoized + * @param {string} fieldName - the field on the parentType whose resolver + * function is being wrapped/memoized + * @param {function} resolve - the resolver function that parentType. + * fieldName is mapped to + * @returns {function} a function that wraps the input resolver function and + * whose closure scope contains a WeakMap to achieve memoization of the wrapped + * input resolver function + */ +const memoize = function (parentType, fieldName, resolve) { + const _cache = new WeakMap(); + return function _memoizedResolver(_, args, context, info) { + const path = info && info.path && info.path.key; + const key = `${path}_${JSON.stringify(args)}`; + debug(`executing ${parentType}.${fieldName}`); + let cached = _cache.get(context); + if (cached && cached[key]) { + debug(`return cached result of memoized ${parentType}.${fieldName}`); + return cached[key]; + } + if (!cached) { + cached = {}; + } + const result = resolve(_, args, context, info); + cached[key] = result; + _cache.set(context, cached); + debug(`cached ${parentType}.${fieldName}`); + return result; + }; +}; +/** + * make 'this' in resolver functions equal to the input bindContext + * @param {Object} bind - the object context to bind to resolver functions + * @param {Object} resolvers - the resolver map containing the resolver + * functions to bind + * @returns {Object} - an object identical in structure to the input resolver + * map, except with resolver function bound to the input argument bind + */ +const bindResolvers = function (bindContext, resolvers = {}) { + const boundResolvers = {}; + for (const [type, fields] of Object.entries(resolvers)) { + // dont bind an object that is an instance of a graphql scalar + if (fields instanceof graphql_1.GraphQLScalarType) { + debug(`not binding ${type}'s fields since ${type}'s fields are an instance of GraphQLScalarType`); + boundResolvers[type] = fields; + continue; + } + if (!boundResolvers[type]) { + boundResolvers[type] = {}; + } + for (const [field, resolver] of Object.entries(fields)) { + if (['Query', 'Mutation'].indexOf(type) > -1) { + debug(`memoized ${type}.${field}`); + boundResolvers[type][field] = memoize(type, field, resolver.bind(bindContext)); + } + else { + // only bind resolvers that are functions + if (typeof resolver === 'function') { + debug(`binding ${type}.${field}`); + boundResolvers[type][field] = resolver.bind(bindContext); + } + else { + debug(`not binding ${type}.${field} since ${field} is not mapped to a function`); + boundResolvers[type][field] = resolver; + } + } + } + } + return boundResolvers; +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGlEQWF1QjtBQXVEdkIsTUFBcUIsZ0JBQWdCO0lBQ25DLE9BQU8sQ0FBZ0I7SUFDdkIsTUFBTSxDQUFhO0lBQ25CLFVBQVUsQ0FBdUI7SUFDakMsTUFBTSxDQUFTO0lBQ2YsV0FBVyxDQUFrQjtJQUM3QixRQUFRLENBQWtDO0lBQzFDLFFBQVEsQ0FBa0I7SUFDMUIsWUFBWSxDQUFnQjtJQUM1QixvQkFBb0IsQ0FBZ0I7SUFDcEMsWUFBWSxDQUFVO0lBQ3RCLG1CQUFtQixDQUFvQjtJQUN2QyxXQUFXLENBQVU7SUFDckIsb0JBQW9CLENBQThCO0lBRWxELFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUVoQyxJ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 \ No newline at end of file diff --git a/lib/__tests__.js b/lib/__tests__.js deleted file mode 100644 index 58445eb..0000000 --- a/lib/__tests__.js +++ /dev/null @@ -1,1293 +0,0 @@ -'use strict'; - -const Test = require('tape'); -const gql = require('graphql-tag'); -const { SchemaDirectiveVisitor } = require('@graphql-tools/utils'); -const graphql = require('graphql'); -const GraphQLComponent = require('./index'); - -Test('GraphQLComponent instance API (getters/setters)', (t) => { - - t.test('component name (anonymous constructor)', (st) => { - const component = new GraphQLComponent(); - t.equals(component.name, 'GraphQLComponent', `unnamed constructor results in component named 'GraphQLComponent'`); - st.end(); - }) - - t.test('component name (named constructor)', (st) => { - class Named extends GraphQLComponent {} - const component = new Named(); - t.equals(component.name, 'Named', `named constructor results in 'Named'`); - st.end(); - }); - - t.test('component context', (st) => { - const component = new GraphQLComponent(); - const context = component.context; - st.ok(typeof context === 'function', 'context is a function'); - st.ok(typeof context.use === 'function', 'context has a use funtion'); - st.end(); - }); - - t.test('component types', (st) => { - const component = new GraphQLComponent({ - types: `type Query { a: String }`, - imports: [new GraphQLComponent({ - types: `type Query { b: B } type B { someField: String}`} - )] - }); - - st.deepEquals(component.types, [`type Query { a: String }`], `only the component's own types are returned`); - st.end(); - }); - - t.test('component resolvers', (st) => { - const component = new GraphQLComponent({ - resolvers: { - Query: { - a() { return 'hello'} - } - }, - imports: [new GraphQLComponent({ - resolvers: { - Query: { - b() { - return 'goodbye'; - } - } - } - })] - }); - - st.equals(Object.keys(component.resolvers.Query).length, 1, `only the component's own resolvers are returned`); - st.end(); - }); - - t.test('component imports', (st) => { - const childThatAlsoHasImports = new GraphQLComponent({ - types: `type Query { c: String }`, - resolvers: { Query: { c() { return 'hello' }}}, - imports: [new GraphQLComponent()] - }); - const root = new GraphQLComponent({ - imports: [ - childThatAlsoHasImports - ] - }); - st.equals(root.imports.length, 1, `only component's own imports are returned`); - st.end(); - }); - - t.test('component directives', (st) => { - const component = new GraphQLComponent({ - directives: { parentDirective: () => {}}, - imports: [new GraphQLComponent({ - directives: { childDirective: () => {}} - })] - }); - - st.equals(Object.keys(component.directives).length, 1, `only component's own directives are returned`); - st.end(); - }); - - t.test('component datasources', (st) => { - const component = new GraphQLComponent({ - dataSources: ['parentDataSourcePlaceHolder'], - imports: [new GraphQLComponent({ - dataSources: ['childDataSourcePlaceHolder'] - })] - }); - - st.equals(Object.keys(component.dataSources).length, 1, `only component's own dataSources are returned`); - st.end(); - }); -}); - -Test(`graphql-tools accessible from GraphQLComponent resolver 'this'`, async (t) => { - const component = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - name: String - } - `, - resolvers: { - Query: { - foo() { - t.ok(this.graphqlTools, 'graphqlTools is defined on resolver this'); - } - } - } - }); - - const document = gql` - query { - foo { - name - } - } - `; - - await graphql.execute({ - document, - schema: component.schema, - contextValue: {} - }); - t.end(); -}); - -// mocks tests -Test(`default mocks applied to component's schema when mocks passed as boolean`, (t) => { - const mockedSchemaComponent = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - a: Int - b: Float - c: String - d: Boolean - } - `, - mocks: true - }); - - const document = gql` - query { - foo { - a - b - c - d - } - } - `; - - const { data: { foo } } = graphql.execute({ - document, - schema: mockedSchemaComponent.schema, - contextValue: {} - }); - - t.ok(typeof foo.a === 'number', 'Foo.a is random number'); - t.ok(typeof foo.b === 'number', 'Foo.b is random number'); - t.equal(foo.c, 'Hello World', 'Foo.c is Hello World'); - t.ok(typeof foo.d === 'boolean', 'Foo.d is boolean'); - t.end(); -}); - -Test(`default mocks applied only to imported component's schema`, async (t) => { - const mockedSchemaComponent = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - a: Int - b: Float - c: String - d: Boolean - } - `, - mocks: true - }); - - const composite = new GraphQLComponent({ - types: ` - type Query { - bar: Bar - } - - type Bar { - barField: String - f: Foo - } - `, - resolvers: { - Query: { - bar() { - return { - barField: 'barField', - } - } - }, - Bar: { - f(root, args, context, info) { - return GraphQLComponent.delegateToComponent(mockedSchemaComponent, { - operation: 'query', - fieldName: 'foo', - context, - info - }); - } - } - }, - imports: [mockedSchemaComponent] - }); - - const document = gql` - query { - bar { - barField - f { - a - b - c - d - } - } - } - `; - - const { data: { bar: { barField, f }} } = await graphql.execute({ - document, - schema: composite.schema, - contextValue: {} - }); - - t.equals(barField, 'barField', 'non-mocked value in root component is present') - t.ok(typeof f.a === 'number', 'Foo.a is random number'); - t.ok(typeof f.b === 'number', 'Foo.b is random number'); - t.equal(f.c, 'Hello World', 'Foo.c is Hello World'); - t.ok(typeof f.d === 'boolean', 'Foo.d is boolean'); - t.end(); -}); - -Test('default mocks applied to imported and composite component', async (t) => { - const mockedSchemaComponent = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - a: Int - b: Float - c: String - d: Boolean - } - `, - mocks: true - }); - - const composite = new GraphQLComponent({ - types: ` - type Query { - bar: Bar - } - - type Bar { - barField: String - f: Foo - compositeMockedField: String - } - `, - resolvers: { - Query: { - bar() { - return { - barField: 'barField', - } - } - }, - Bar: { - f(root, args, context, info) { - return GraphQLComponent.delegateToComponent(mockedSchemaComponent, { - operation: 'query', - fieldName: 'foo', - context, - info - }); - } - } - }, - imports: [mockedSchemaComponent], - mocks: true - }); - - const document = gql` - query { - bar { - barField - f { - a - b - c - d - } - compositeMockedField - } - } - `; - - const { data: { bar: { barField, f, compositeMockedField }} } = await graphql.execute({ - document, - schema: composite.schema, - contextValue: {} - }); - - t.equals(barField, 'barField', 'non-mocked value in root component is present'); - t.equals(compositeMockedField, 'Hello World', 'compositeMockedField is Hello World'); - t.ok(typeof f.a === 'number', 'Foo.a is random number'); - t.ok(typeof f.b === 'number', 'Foo.b is random number'); - t.equal(f.c, 'Hello World', 'Foo.c is Hello World'); - t.ok(typeof f.d === 'boolean', 'Foo.d is boolean'); - t.end(); -}); - -Test(`custom mocks applied to component's schema when mocks passed as object`, (t) => { - const mockedSchemaComponent = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - a: Int - b: Float - c: String - d: Boolean - } - `, - mocks: { - Int: () => 123456789, - Float: () => 3.1415926, - String: () => 'custom string', - Boolean: () => false - } - }); - - const document = gql` - query { - foo { - a - b - c - d - } - } - `; - - const { data: { foo } } = graphql.execute({ - document, - schema: mockedSchemaComponent.schema, - contextValue: {} - }); - - t.equal(foo.a, 123456789, 'Foo.a is a custom mocked Int'); - t.equal(foo.b, 3.1415926, 'Foo.b is custom mocked Float'); - t.equal(foo.c, 'custom string', 'Foo.c is a custom mocked string'); - t.equal(foo.d, false, 'Foo.d is a custom mocked boolean (false)'); - t.end(); -}); - -// delegate tests -Test('delegate from root-type resolver', async (t) => { - const primitive = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - a: String - } - `, - resolvers: { - Query: { - foo() { - return { a: 'a' }; - } - } - } - }); - - const composite = new GraphQLComponent({ - types: ` - type Query { - bar: Foo - } - - type Foo { - b: Int - } - `, - resolvers: { - Query: { - async bar(root, args, context, info) { - const subFoo = await GraphQLComponent.delegateToComponent(primitive, { - operation: 'query', - fieldName: 'foo', - context, - info - }); - - return { ...subFoo, b: 1 }; - } - } - }, - imports: [primitive] - }); - - const document = gql` - query { - bar { - a - b - } - } - `; - - const { data, errors } = await graphql.execute({ - schema: composite.schema, - document, - contextValue: {} - }); - - t.deepEqual(data, { bar: { a: 'a', b: 1}}, 'expected result'); - t.notOk(errors, 'no errors') - t.end(); -}); - -Test('delegate from non root-type resolver', async (t) => { - const primitive = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - a: String - } - `, - resolvers: { - Query: { - foo() { - return { a: 'a' }; - } - } - } - }); - - const composite = new GraphQLComponent({ - types: ` - type Query { - bar: Bar - } - - type Bar { - barField: String - foo: Foo - } - `, - resolvers: { - Query: { - async bar() { - return { barField: 'barField' }; - } - }, - Bar: { - foo(root, args, context, info) { - return GraphQLComponent.delegateToComponent(primitive, { - operation: 'query', - fieldName: 'foo', - context, - info - }); - } - } - }, - imports: [primitive] - }); - - const document = gql` - query { - bar { - barField - foo { - a - } - } - } - `; - - const { data, errors } = await graphql.execute({ - schema: composite.schema, - document, - contextValue: {} - }); - - t.deepEqual(data, { bar: { barField: 'barField', foo: { a: 'a'}}}, 'expected result'); - t.notOk(errors, 'no errors') - t.end(); -}); - -Test('delegate results in non-root type field resolver running in delegatee', async (t) => { - let fooFieldResolverCallCount = 0; - const primitive = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - a: String - fprime: FooPrime - } - - type FooPrime { - prime: String - } - `, - resolvers: { - Query: { - foo() { - return { a: 'a', somethingToTransform: 'hello' }; - } - }, - Foo: { - fprime(root) { - fooFieldResolverCallCount += 1; - if (root.somethingToTransform) { - return { prime: root.somethingToTransform }; - } - } - } - } - }); - - const composite = new GraphQLComponent({ - types: ` - type Query { - bar: Foo - } - - type Foo { - compositeFooField: String - } - `, - resolvers: { - Query: { - async bar(root, args, context, info) { - const subFoo = await GraphQLComponent.delegateToComponent(primitive, { - operation: 'query', - fieldName: 'foo', - context, - info - }); - return { ...subFoo, compositeFooField: 'compositeFooField' }; - } - } - }, - imports: [primitive] - }); - - const document = gql` - query { - bar { - compositeFooField - a - fprime { - prime - } - } - } - `; - - const { data, errors } = await graphql.execute({ - schema: composite.schema, - document, - contextValue: {} - }); - - t.notOk(errors, 'no errors'); - t.deepEqual(data, { bar: { compositeFooField: 'compositeFooField', a: 'a', fprime: { prime: 'hello'}}}, 'expected result'); - t.equal(fooFieldResolverCallCount, 1, 'non root type field resolver in delegatee only called once'); - t.end(); -}); - -Test('delegation resolves nested abstract type resolved without error', async (t) => { - let resolveTypeCount = 0; - let materialNonRootResolverCount = 0; - const primitive = new GraphQLComponent({ - types: ` - type Query { - thingsById(id: ID): ThingsConnection - } - - type ThingsConnection { - edges: [ThingEdge] - } - - type ThingEdge { - node: Thing - } - - interface Thing { - id: ID - } - - type Book implements Thing { - id: ID - title: String - } - - type Mug implements Thing { - id: ID - material: String - } - `, - resolvers: { - Query: { - thingsById() { - return { - edges: [ - { - node: { - id: 1, - title: 'A tale of two cities' - } - }, - { - node: { - id: 2, - } - } - ] - } - } - }, - Thing: { - __resolveType(result) { - resolveTypeCount += 1; - if (result.title) { - return 'Book'; - } - return 'Mug'; - } - }, - Mug: { - material() { - materialNonRootResolverCount += 1; - return 'ceramic'; - } - } - } - }); - - const composite = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - things: ThingsConnection - } - `, - resolvers: { - Query: { - async foo() { - return {}; - } - }, - Foo: { - things(_root, _args, context, info) { - return GraphQLComponent.delegateToComponent(primitive, { - operation: 'query', - fieldName: 'thingsById', - info, - context - }); - } - } - }, - imports: [primitive] - }); - - const document = gql` - query { - foo { - things { - edges { - node { - id - ... on Book { - title - } - ... on Mug { - material - } - } - } - } - } - } - ` - - const { data, errors } = await graphql.execute({ - document, - schema: composite.schema, - contextValue: {} - }); - const expectedResult = { - foo: { - things: { - edges: [ - { - node: { - id: '1', - title: 'A tale of two cities' - } - }, - { - node: { - id: '2', - material: 'ceramic' - } - } - ] - } - } - } - t.deepEquals(data, expectedResult, 'data is resolved as expected'); - t.equals(resolveTypeCount, 2, '__resolveType called once per item as expected'); - t.equals(materialNonRootResolverCount, 1, 'Mug non-root resolver is only executed 1 time as expected'); - t.notOk(errors, 'no errors'); - t.end(); -}); - -Test('error from delegatee propagated back to delegator and abstracted (looks like it came from resolver that called delegate)', async (t) => { - const primitive = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - b: String - } - `, - resolvers: { - Query: { - foo() { - throw new Error('db retrieval error'); - } - } - } - }); - - const composite = new GraphQLComponent({ - types: ` - - type Query { - bar: Bar - } - - type Bar { - a: String - b: String - } - `, - resolvers: { - Query: { - bar(root, args, context, info) { - return GraphQLComponent.delegateToComponent(primitive, { - query: 'operation', - fieldName: 'foo', - context, - info - }); - } - } - } - }); - - const document = gql` - query { - bar { - a - b - } - } - `; - - const { data, errors } = await graphql.execute({ - schema: composite.schema, - document, - contextValue: {} - }); - - t.notOk(data.bar, 'bar is null as expected'); - t.equals(errors.length, 1, '1 error as expected'); - t.equals(errors[0].message, 'db retrieval error'); - t.deepEqual(errors[0].path, ['bar'], 'error path appears as though error came from delegateToComponent calling resolver'); - t.end(); -}); - -Test('delegateToComponent maintains backwards compatibility for changed option keys (contextValue and targetRootField)', async (t) => { - const primitive = new GraphQLComponent({ - types: ` - type Query { - foo: Foo - } - - type Foo { - a: String - } - `, - resolvers: { - Query: { - foo() { - return { a: 'a' }; - } - } - } - }); - - const composite = new GraphQLComponent({ - types: ` - type Query { - bar: Foo - } - - type Foo { - b: Int - } - `, - resolvers: { - Query: { - async bar(root, args, context, info) { - const subFoo = await GraphQLComponent.delegateToComponent(primitive, { - operation: 'query', - targetRootField: 'foo', - contextValue: context, - info - }); - - return { ...subFoo, b: 1 }; - } - } - }, - imports: [primitive] - }); - - const document = gql` - query { - bar { - a - b - } - } - `; - - const { data, errors } = await graphql.execute({ - schema: composite.schema, - document, - contextValue: {} - }); - - t.deepEqual(data, { bar: { a: 'a', b: 1}}, 'expected result'); - t.notOk(errors, 'no errors') - t.end(); -}); - -// directive tests - -// TODO: implement directive tests to test directive behavior between imports, etc - -// federation tests -Test('components with federated schemas can be stitched locally by importing root', (t) => { - const fedComponent1 = new GraphQLComponent({ - types: ` - type Query { - property(id: ID!): Property - } - - type Property @key(fields: "id") { - id: ID! - geo: [String] - } - `, - resolvers: { - Query: { - property(_, {id}) { - return { - id, - geo: ['lat', 'long'] - } - } - } - }, - federation: true - }); - - const fedComponent2 = new GraphQLComponent({ - types: ` - type Query { - reviews(propertyId: ID!): [Review] - } - - type Review @key(fields: "id") { - id: ID! - content: String - } - - type Property { - addedPropertyField: String - } - `, - resolvers: { - Query: { - reviews() { - return { - id: 'rev-id-1', - content: 'some-content' - } - } - }, - }, - federation: true - }); - - const emptyRoot = new GraphQLComponent({ - imports: [fedComponent1, fedComponent2] - }); - - const { schema } = emptyRoot; - - const _serviceType = schema.getType('_Service'); - const _serviceTypeFields = _serviceType.getFields(); - const _entityType = schema.getType('_Entity'); - const _entityTypeTypes = _entityType.getTypes(); - const _anyScalar = schema.getType('_Any'); - const queryFields = schema.getType('Query').getFields(); - const propertyTypeFields = schema.getType('Property').getFields(); - - t.ok(_serviceType, 'federated _Service type exists'); - t.ok(_serviceTypeFields['sdl'], '_Service type sdl field exists'); - t.ok(_entityType, 'federated _Entity type exists'); - t.equals(_entityTypeTypes.length, 2, '2 entities'); - t.deepEqual(_entityTypeTypes.map((e) => e.name), ['Property', 'Review'], 'entities are Property and Review as declared via @keys directive'); - t.ok(_anyScalar, 'scalar _Any exists'); - t.deepEqual(Object.keys(queryFields), ['_entities', '_service', 'property', 'reviews'], 'federated query fields and user declared query fields are present'); - t.deepEqual(Object.keys(propertyTypeFields), ['id', 'geo', 'addedPropertyField'], 'Property type fields is union between imported components (ie. property type is merged)'); - t.end(); -}); - -Test(`importing root specifies 'federation: true' results in all components creating federated schemas`, (t) => { - const fedComponent1 = new GraphQLComponent({ - types: ` - type Query { - property(id: ID!): Property - } - - type Property @key(fields: "id") { - id: ID! - geo: [String] - } - `, - resolvers: { - Query: { - property(_, {id}) { - return { - id, - geo: ['lat', 'long'] - } - } - } - }, - }); - - const fedComponent2 = new GraphQLComponent({ - types: ` - type Query { - reviews(propertyId: ID!): [Review] - } - - type Review @key(fields: "id") { - id: ID! - content: String - } - - type Property { - addedPropertyField: String - } - `, - resolvers: { - Query: { - reviews() { - return { - id: 'rev-id-1', - content: 'some-content' - } - } - }, - }, - }); - - const emptyRoot = new GraphQLComponent({ - imports: [fedComponent1, fedComponent2], - federation: true - }); - - const { schema: fedComponent1Schema } = fedComponent1; - const _serviceTypeFedComponent1 = fedComponent1Schema.getType('_Service'); - const _serviceTypeFieldsFedComponent1 = _serviceTypeFedComponent1.getFields(); - const _entityTypeFedComponent1 = fedComponent1Schema.getType('_Entity'); - const _entityTypeTypesFedComponent1 = _entityTypeFedComponent1.getTypes(); - const _anyScalarFedComponent1 = fedComponent1Schema.getType('_Any'); - const queryFieldsFedComponent1 = fedComponent1Schema.getType('Query').getFields(); - - t.ok(_serviceTypeFedComponent1, `federated _Service type exists in fedComponent1's federated schema`); - t.ok(_serviceTypeFieldsFedComponent1['sdl'], `_Service type sdl field exists in fedComponent1's federated schema`); - t.ok(_entityTypeFedComponent1, `federated _Entity type exists in fedComponent1's federated schema`); - t.equals(_entityTypeTypesFedComponent1.length, 1, `1 entity in fedComponent1's federated schema`); - t.ok(_anyScalarFedComponent1, `scalar _Any exists in fedComponent1's federated schema`); - t.deepEqual(Object.keys(queryFieldsFedComponent1), ['_entities', '_service', 'property'], `federated query fields and user declared query fields are present in fedComponent1's federated schema`); - t.ok(fedComponent1._federation, `federation flag is true in imported component, even though it was not set in imported component's constructor`); - - const { schema: fedComponent2Schema } = fedComponent1; - const _serviceTypeFedComponent2 = fedComponent2Schema.getType('_Service'); - const _serviceTypeFieldsFedComponent2 = _serviceTypeFedComponent2.getFields(); - const _entityTypeFedComponent2 = fedComponent2Schema.getType('_Entity'); - const _entityTypeTypesFedComponent2 = _entityTypeFedComponent2.getTypes(); - const _anyScalarFedComponent2 = fedComponent2Schema.getType('_Any'); - const queryFieldsFedComponent2 = fedComponent2Schema.getType('Query').getFields(); - - t.ok(_serviceTypeFedComponent2, `federated _Service type exists in fedComponent2's federated schema`); - t.ok(_serviceTypeFieldsFedComponent2['sdl'], `_Service type sdl field exists in fedComponent2's federated schema`); - t.ok(_entityTypeFedComponent2, `federated _Entity type exists in fedComponent1's federated schema`); - t.equals(_entityTypeTypesFedComponent2.length, 1, `1 entity in fedComponent2's federated schema`); - t.ok(_anyScalarFedComponent2, `scalar _Any exists in fedComponent1's federated schema`); - t.deepEqual(Object.keys(queryFieldsFedComponent2), ['_entities', '_service', 'property'], `federated query fields and user declared query fields are present in fedComponent2's federated schema`); - t.ok(fedComponent2._federation, `federation flag is true in imported component, even though it was not set in imported component's constructor`); - - const { schema } = emptyRoot; - - const _serviceType = schema.getType('_Service'); - const _serviceTypeFields = _serviceType.getFields(); - const _entityType = schema.getType('_Entity'); - const _entityTypeTypes = _entityType.getTypes(); - const _anyScalar = schema.getType('_Any'); - const queryFields = schema.getType('Query').getFields(); - const propertyTypeFields = schema.getType('Property').getFields(); - - t.ok(_serviceType, 'federated _Service type exists in root federated schema'); - t.ok(_serviceTypeFields['sdl'], '_Service type sdl field exists in root federated schema'); - t.ok(_entityType, 'federated _Entity type exists in root federated schema'); - t.equals(_entityTypeTypes.length, 2, '2 entities in root federated schema'); - t.deepEqual(_entityTypeTypes.map((e) => e.name), ['Property', 'Review'], 'entities are Property and Review as declared via @keys directive in root federated schema in root federated schema'); - t.ok(_anyScalar, 'scalar _Any exists'); - t.deepEqual(Object.keys(queryFields), ['_entities', '_service', 'property', 'reviews'], 'federated query fields and user declared query fields are present in root federated schema'); - t.deepEqual(Object.keys(propertyTypeFields), ['id', 'geo', 'addedPropertyField'], 'Property type fields is union between imported components (ie. property type is merged) in root federated schema'); - t.end(); -}) - -Test('federated schema can include custom directive', (t) => { - class CustomDirective extends SchemaDirectiveVisitor { - // required for our dummy "custom" directive (ie. implement the SchemaDirectiveVisitor interface) - visitFieldDefinition() { - return; - } - } - - const component = new GraphQLComponent({ - types: ` - directive @custom on FIELD_DEFINITION - - type Query { - property(id: ID!): Property @custom - } - type Property @key(fields: "id") { - id: ID! - geo: [String] - } - extend type Extended @key(fields: "id") { - id: ID! @external - newProp: String - } - `, - resolvers: { - Query: { - property(_, { id }) { - return { - id, - geo: ['lat', 'long'] - } - } - }, - }, - directives: { custom: CustomDirective }, - federation: true - }); - - t.test('federated schema created without error', (t) => { - t.plan(1); - t.doesNotThrow(() => { - component.schema; - }, 'can return a buildFederatedSchema schema'); - }); - - t.test('custom directive added to federated schema', (t) => { - t.plan(1); - const { schema: { _directives: schemaDirectives } } = component; - t.equals(schemaDirectives.filter((directive) => directive.name === 'custom').length, 1, `federated schema has '@custom' directive`); - }); - - t.test('extended properties maintained after adding custom directive', (t) => { - t.plan(2); - const { schema: { _typeMap: { Extended } } } = component; - t.equals(Extended.extensionASTNodes.length, 1, 'Extension AST Nodes is defined'); - t.equals(Extended.extensionASTNodes[0].fields.filter((field) => field.name.value === "id" && field.directives[0].name.value === "external").length, 1, `id field marked external`); - }); -}); - -Test('pruning schema', (t) => { - - t.test('does not prune types used only at root', (t) => { - const component1 = new GraphQLComponent({ - types: ` - type Query { - property(id: ID!): Property - } - - type Property { - id: ID! - geo: [String] - } - `, - resolvers: { - Query: { - property(_, { id }) { - return { - id, - geo: ['lat', 'long'] - } - } - } - } - }); - - const component2 = new GraphQLComponent({ - types: ` - type Query { - reviews(propertyId: ID!): [Review] - } - - type Review { - id: ID! - content: String - } - - type Property { - reviews: [Review] - } - `, - resolvers: { - Query: { - reviews() { - return { - id: 'rev-id-1', - content: 'content' - } - } - }, - } - }); - - const rootComponent = new GraphQLComponent({ - imports: [component1, component2], - pruneSchema: true - }); - - const { schema } = rootComponent; - - t.ok(schema.getType('Property'), 'Property type exists'); - t.ok(schema.getType('Review'), 'Review type exists'); - - t.end(); - }); - - t.test('Unused types not removed if prune is false', (t) => { - - const component = new GraphQLComponent({ - types: ` - type Query { - reviews(propertyId: ID!): [Review] - } - - type Review { - id: ID! - content: String - } - - type Property { - reviews: [Review] - } - `, - resolvers: { - Query: { - reviews() { - return { - id: 'rev-id-1', - content: 'content' - } - } - }, - }, - pruneSchema: false - }); - - const { schema } = component; - - t.ok(schema.getType('Property'), 'Property type exists'); - t.ok(schema.getType('Review'), 'Review type exists'); - - t.end(); - }); - - t.test('prune removed unused types', (t) => { - - const component = new GraphQLComponent({ - types: ` - type Query { - reviews(propertyId: ID!): [Review] - } - - type Review { - id: ID! - content: String - } - - type Property { - reviews: [Review] - } - `, - resolvers: { - Query: { - reviews() { - return { - id: 'rev-id-1', - content: 'content' - } - } - }, - }, - pruneSchema: true - }); - - const { schema } = component; - - t.ok(!schema.getType('Property'), 'Property type was pruned'); - t.ok(schema.getType('Review'), 'Review type exists'); - - t.end(); - }); -}); \ No newline at end of file diff --git a/lib/context/__tests__.js b/lib/context/__tests__.js deleted file mode 100644 index a63e693..0000000 --- a/lib/context/__tests__.js +++ /dev/null @@ -1,128 +0,0 @@ -'use strict'; - -const Test = require('tape'); -const { createContext, wrapContext } = require('./index'); -const GraphQLComponent = require('../index'); - -Test('context builder', async (t) => { - t.plan(3); - - const component = new GraphQLComponent({ - imports: [ - { - component: new GraphQLComponent({ - context: { namespace: 'import', factory: () => true} - }) - } - ] - }); - - const context = createContext(component, { namespace: 'test', factory: () => true }); - - const result = await context({}); - - t.ok(typeof result === 'object', 'returned object'); - t.ok(result.test, 'namespace populated'); - t.ok(result.import, 'import namespace populated'); -}); - -Test('context builder with namespace merge', async (t) => { - t.plan(2); - - const component = new GraphQLComponent({ - imports: [ - { - component: new GraphQLComponent({ - context: { namespace: 'test', factory: () => ({ existing: true })} - }) - } - ] - }); - - const context = createContext(component, { namespace: 'test', factory: () => ({ value: true }) }); - - const result = await context({}); - - t.ok(typeof result === 'object', 'returned object'); - t.ok(result.test.existing && result.test.value, 'namespace merged'); -}); - -Test('component context', async (t) => { - t.plan(2); - - const context = wrapContext({ - _context() {}, - _dataSourceInjection() {} - }); - - const result = await context({ default1: true, default2: true }); - - t.ok(typeof result === 'object', 'returned object'); - t.ok(result.default1 && result.default2, 'default values maintained'); -}); - -Test('component context once', async (t) => { - t.plan(3); - - const { context } = new GraphQLComponent({ - context: { namespace: 'parent', factory: (context) => { - t.equal(context.called, 1, 'import modified global context'); - context.called++; - return Object.assign({}, context); - }}, - imports: [ - { - component: new GraphQLComponent({ - context: { namespace: 'import', factory: (context) => { - t.equal(context.called, 0, 'initial global context'); - context.called++; - return Object.assign({}, context); - }} - }) - } - ] - }); - - const result = await context({ called: 0 }); - - //The global context didn't reset because root wrapper context didn't get called again - t.equal(result.called, 2, 'called root once'); -}); - -Test('context middleware', async (t) => { - t.plan(3); - - const context = wrapContext({ - _context() {}, - _dataSourceInjection() {} - }); - - context.use('test', () => { - return { test: true }; - }); - - const result = await context({ default: true }); - - t.ok(typeof result === 'object', 'returned object'); - t.ok(result.test, 'middleware populated'); - t.ok(!result.default, 'middleware mutated'); -}); - -Test('unnamed context middleware', async (t) => { - t.plan(3); - - const context = wrapContext({ - _context() {}, - _dataSourceInjection() {} - }); - - context.use(() => { - return { test: true }; - }); - - const result = await context({ default: true }); - - t.ok(typeof result === 'object', 'returned object'); - t.ok(result.test, 'middleware populated'); - t.ok(!result.default, 'middleware mutated'); -}); \ No newline at end of file diff --git a/lib/context/index.js b/lib/context/index.js deleted file mode 100644 index 956773a..0000000 --- a/lib/context/index.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict'; - -const debug = require('debug')('graphql-component:context'); - -const createContext = function (root, ctxConfig) { - return async function (context) { - const ctx = {}; - - for (const { component } of root.imports) { - Object.assign(ctx, await component._context(context)); - } - - if (ctxConfig) { - debug(`building ${ctxConfig.namespace} context`); - - if (!ctx[ctxConfig.namespace]) { - ctx[ctxConfig.namespace] = {}; - } - - Object.assign(ctx[ctxConfig.namespace], await ctxConfig.factory.call(root, context)); - } - - return ctx; - }; -}; - -const wrapContext = function (component) { - const middleware = []; - const contextFunction = component._context; - const dataSourceInject = component._dataSourceInjection; - - const context = async function (context) { - debug(`building ${component._id} root context`); - - for (let { name, fn } of middleware) { - debug(`applying ${name} middleware`); - context = await fn(context); - } - - const componentContext = await contextFunction(context); - - const globalContext = { - ...context, - ...componentContext - }; - - globalContext.dataSources = dataSourceInject(globalContext); - - return globalContext; - }; - - context.use = function (name, fn) { - if (typeof name === 'function') { - fn = name; - name = 'unknown'; - } - debug(`adding ${name} middleware`); - middleware.push({ name, fn }); - }; - - return context; -}; - -module.exports = { createContext, wrapContext }; \ No newline at end of file diff --git a/lib/datasource/__tests__.js b/lib/datasource/__tests__.js deleted file mode 100644 index db95ef5..0000000 --- a/lib/datasource/__tests__.js +++ /dev/null @@ -1,173 +0,0 @@ -'use strict'; - -const Test = require('tape'); -const { intercept, createDataSourceInjection } = require('./index'); -const GraphQLComponent = require('../index'); - -Test('intercepts', (t) => { - - t.test('intercept proxy', (t) => { - t.plan(4); - - const proxy = intercept(new class DataSource { - constructor() { - this.instanceField = 'some instance field value' - } - static get name() { - return 'TestDataSource'; - } - test(...args) { - t.equal(args.length, 2, 'added additional arg'); - t.equal(args[0].data, 'test', 'injected the right data'); - t.equal(args[1], 'test', 'data still passed to original call'); - t.equal(this.instanceField, 'some instance field value', '`this` is correctly bound datasource instance methods') - } - }, { - data: 'test' - }); - - proxy.test('test'); - }); - - t.test('do not intercept proxy fields', (t) => { - t.plan(1); - - const proxy = intercept(new class DataSource { - constructor() { - this.instanceField = 'some instance field value' - } - static get name() { - return 'TestDataSource'; - } - }); - - t.equal(proxy.instanceField, 'some instance field value', 'field ok'); - }); - -}); - -Test('injection', (t) => { - t.test('dataSource injection function empty', (t) => { - t.plan(1); - - const injection = createDataSourceInjection({ - imports: [] - }); - - t.doesNotThrow(() => { - injection(); - }, 'no exception thrown'); - }); - - t.test('dataSource injection function', (t) => { - t.plan(4); - - class DataSource { - static get name() { - return 'TestDataSourceInjection'; - } - test(...args) { - t.equal(args.length, 2, 'added additional arg'); - t.equal(args[0].data, 'test', 'injected the right data'); - t.equal(args[1], 'test', 'data still passed to original call'); - } - } - - const component = { - dataSources: [new DataSource()], - imports: [] - }; - - const injection = createDataSourceInjection(component); - - const globalContext = { data: 'test' }; - - globalContext.dataSources = injection(globalContext); - - t.ok(globalContext.dataSources && globalContext.dataSources.TestDataSourceInjection, 'dataSource added to context'); - - globalContext.dataSources.TestDataSourceInjection.test('test'); - }); - - t.test('dataSource override', (t) => { - t.plan(4); - - class DataSource { - static get name() { - return 'TestDataSourceInjection'; - } - test(...args) { - t.equal(args.length, 2, 'added additional arg'); - t.equal(args[0].data, 'test', 'injected the right data'); - t.equal(args[1], 'test', 'data still passed to original call'); - } - } - - const component = { - dataSources: [new class Default { - static get name() { - return 'TestDataSourceInjection'; - } - }], - imports: [] - }; - - const injection = createDataSourceInjection(component, [new DataSource()]); - - const globalContext = { data: 'test' }; - - globalContext.dataSources = injection(globalContext); - - t.ok(globalContext.dataSources && globalContext.dataSources.TestDataSourceInjection, 'dataSource added to context'); - - globalContext.dataSources.TestDataSourceInjection.test('test'); - }); - - t.test('dataSource injection function imports', (t) => { - t.plan(1); - - const injection = createDataSourceInjection({ - imports: [ - { - component: { - _dataSourceInjection: createDataSourceInjection({ imports: [] }), - imports: [] - } - } - ] - }); - - t.doesNotThrow(() => { - injection({}); - }, 'no exception thrown'); - }); -}); - -Test('integration: data source', (t) => { - - t.test('component and context injection', async (t) => { - t.plan(4); - - class DataSource { - static get name() { - return 'TestDataSource'; - } - test(...args) { - t.equal(args.length, 2, 'added additional arg'); - t.equal(args[0].data, 'test', 'injected the right data'); - t.equal(args[1], 'test', 'data still passed to original call'); - } - } - - const { context } = new GraphQLComponent({ - dataSources: [new DataSource()] - }); - - const globalContext = await context({ data: 'test' }); - - t.ok(globalContext.dataSources && globalContext.dataSources.TestDataSource, 'dataSource added to context'); - - globalContext.dataSources.TestDataSource.test('test'); - }); - -}); \ No newline at end of file diff --git a/lib/datasource/index.js b/lib/datasource/index.js deleted file mode 100644 index 0946096..0000000 --- a/lib/datasource/index.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; - -const debug = require('debug')('graphql-component:datasource'); - -const intercept = function (instance, context) { - debug(`intercepting ${instance.constructor.name}`); - - return new Proxy(instance, { - get(target, key) { - if (typeof target[key] !== 'function' || key === instance.constructor.name) { - return target[key]; - } - const original = target[key]; - - return function (...args) { - return original.call(instance, context, ...args); - }; - } - }); -}; - -const createDataSourceInjection = function (root, dataSourceOverrides = []) { - return function (context = {}) { - const dataSources = {}; - - for (const { component } of root.imports) { - Object.assign(dataSources, component._dataSourceInjection(context)); - } - - for (const override of dataSourceOverrides) { - debug(`overriding datasource ${override.constructor.name}`); - dataSources[override.constructor.name] = intercept(override, context); - } - - if (root.dataSources && root.dataSources.length > 0) { - for (const dataSource of root.dataSources) { - const name = dataSource.constructor.name; - if (!dataSources[name]) { - dataSources[name] = intercept(dataSource, context); - } - } - } - - return dataSources; - }; - -}; - -module.exports = { intercept, createDataSourceInjection }; \ No newline at end of file diff --git a/lib/index.d.ts b/lib/index.d.ts deleted file mode 100644 index 98d9acc..0000000 --- a/lib/index.d.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { DocumentNode, GraphQLSchema, Source } from 'graphql'; -import { DirectiveUseMap, IDelegateToSchemaOptions, IExecutableSchemaDefinition, IResolvers, IMocks, PruneSchemaOptions } from 'graphql-tools' - -interface IGraphQLComponentConfigObject { - component: GraphQLComponent; - excludes?: string[]; -} - -type ContextFunction = ((ctx: any) => any); - -interface IContextMiddleware { - name: string - fn: ContextFunction -} - -interface IContextConfig { - namespace: string - factory: ContextFunction -} - -interface IContextWrapper extends ContextFunction { - use: (name: string|ContextFunction|null, fn?: ContextFunction|string) => void -} - -interface IGraphQLComponentOptions { - types?: (string | Source | DocumentNode)[] | (string | Source | DocumentNode); - resolvers?: IResolvers; - mocks?: boolean | MocksConfigFunction; - directives?: DirectiveUseMap; - federation?: boolean; - makeExecutableSchema?: ({ - typeDefs, - resolvers, - resolverValidationOptions, - parseOptions, - inheritResolversFromInterfaces, - pruningOptions, - updateResolversInPlace, - schemaExtensions - }) => IExecutableSchemaDefinition; - imports?: GraphQLComponent[] | IGraphQLComponentConfigObject[]; - context?: IContextConfig; - dataSources?: any[]; - dataSourceOverrides?: any; - pruneSchema?: boolean; - pruneSchemaOptions?: PruneSchemaOptions -} - -type MocksConfigFunction = (IMocks) => IMocks; - -export default class GraphQLComponent { - constructor(options?: IGraphQLComponentOptions); - static delegateToComponent(component: GraphQLComponent, options: IDelegateToSchemaOptions): Promise - readonly name: string; - readonly schema: GraphQLSchema; - readonly context: { - (arg: any): Promise; - use(name: any, fn: any): void; - }; - readonly types: string[]; - readonly resolvers: object; - readonly imports: IGraphQLComponentConfigObject[]; - readonly mocks: any; - readonly directives: any; - readonly dataSources: any[]; -} diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index f89a32e..0000000 --- a/lib/index.js +++ /dev/null @@ -1,209 +0,0 @@ -'use strict'; - -const { buildFederatedSchema } = require('@apollo/federation'); - -const { - stitchSchemas, - delegateToSchema, - mergeTypeDefs, - addMocksToSchema, - makeExecutableSchema, - pruneSchema, - SchemaDirectiveVisitor -} = require('graphql-tools'); - -const { bindResolvers } = require('./resolvers'); -const { wrapContext, createContext } = require('./context'); -const { createDataSourceInjection } = require('./datasource'); -const { exclusions } = require('./transforms'); - -const debug = require('debug')('graphql-component:schema'); - -class GraphQLComponent { - constructor({ - types = [], - resolvers = {}, - mocks = undefined, - directives = {}, - federation = false, - imports = [], - context = undefined, - dataSources = [], - dataSourceOverrides = [], - pruneSchema = false, - pruneSchemaOptions = {} - } = {}) { - debug(`creating a GraphQLComponent instance`); - - this._types = Array.isArray(types) ? types : [types]; - - this._resolvers = bindResolvers(this, resolvers); - - this._mocks = mocks; - - this._directives = directives; - - this._federation = federation; - - this._imports = imports && imports.length > 0 ? imports.map((i) => { - // check for a GraphQLComponent instance to construct a configuration object from it - if (i instanceof GraphQLComponent) { - // if the importing component (ie. this component) has federation set to true - set federation: true - // for all of its imported components - if (this._federation === true) { - i.federation = true; - } - return { component: i, exclude: [] }; - } - // check for a configuration object and simply return it - else if (((typeof i === 'function') || (typeof i === 'object')) && i.component) { - // if the importing component (ie. this component) has federation set to true - set federation: true - // for all of its imported components - if (this._federation === true) { - i.component.federation = true; - } - return i; - } - throw new Error(`import in ${this.name} not an instance of GraphQLComponent or component configuration object: { component: , exclude: [] }`); - }) : []; - - this._context = createContext(this, context); - - this._dataSources = dataSources; - - this._pruneSchema = pruneSchema; - - this._pruneSchemaOptions = pruneSchemaOptions; - - this._schema = undefined; - - this._dataSourceInjection = createDataSourceInjection(this, dataSourceOverrides); - - this.graphqlTools = require('graphql-tools'); - } - - get name() { - return this.constructor.name; - } - - static delegateToComponent(component, options) { - options.schema = component.schema; - // adapt v2 delegate options to v3 options to maintain backwards compatibility - if (options.contextValue) { - options.context = options.contextValue; - delete options.contextValue; - } - - if (options.targetRootField) { - options.fieldName = options.targetRootField; - delete options.targetRootField; - } - - return delegateToSchema(options); - } - - - _getMakeSchemaFunction() { - if (this._federation) { - return (schemaConfig) => { - const schema = buildFederatedSchema(schemaConfig); - - // allows a federated schema to have custom directives using the old class based directive implementation - if (this._directives) { - SchemaDirectiveVisitor.visitSchemaDirectives(schema, this._directives); - } - - return schema; - }; - } - - return makeExecutableSchema; - } - - get schema() { - if (this._schema) { - return this._schema; - } - - if (this._imports.length > 0) { - // iterate through the imports and construct subschema configuration objects - const subschemas = this._imports.map((imp) => { - const { component, exclude } = imp; - return { - schema: component.schema, - transforms: exclusions(exclude) - } - }); - - // construct an aggregate schema from the schemas of imported - // components and this component's types/resolvers (if present) - this._schema = stitchSchemas({ - subschemas, - typeDefs: this._types, - resolvers: this._resolvers, - schemaDirectives: this._directives - }); - } - else { - const schemaConfig = { - typeDefs: mergeTypeDefs(this._types), - resolvers: this._resolvers, - schemaDirectives: this._directives - } - - const makeSchema = this._getMakeSchemaFunction(); - - this._schema = makeSchema(schemaConfig); - } - - if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { - debug(`adding default mocks to the schema for ${this.name}`); - // if mocks are a boolean support simply applying default mocks - this._schema = addMocksToSchema({schema: this._schema, preserveResolvers: true}); - } - else if (this._mocks !== undefined && typeof this._mocks === 'object') { - debug(`adding custom mocks to the schema for ${this.name}`); - // else if mocks is an object, that means the user provided - // custom mocks, with which we pass them to addMocksToSchema so they are applied - this._schema = addMocksToSchema({schema: this._schema, mocks: this._mocks, preserveResolvers: true}); - } - - if (this._pruneSchema) { - this._schema = pruneSchema(this._schema, this._pruneSchemaOptions); - } - - debug(`created schema for ${this.name}`); - - return this._schema; - } - - get context() { - return wrapContext(this); - } - - get types() { - return this._types; - } - - get resolvers() { - return this._resolvers; - } - - get imports() { - return this._imports; - } - - get directives() { - return this._directives; - } - - get dataSources() { - return this._dataSources; - } - - set federation(flag) { - this._federation = flag; - } -} - -module.exports = GraphQLComponent; diff --git a/lib/resolvers/__tests__.js b/lib/resolvers/__tests__.js deleted file mode 100644 index 4434789..0000000 --- a/lib/resolvers/__tests__.js +++ /dev/null @@ -1,225 +0,0 @@ -'use strict'; - -const Test = require('tape'); -const { GraphQLScalarType } = require('graphql'); -const { - memoize, - bindResolvers, -} = require('./index'); - -Test('memoize()', (t) => { - t.test('memoize() a resolver function', (st) => { - let resolverRunCount = 0; - - const resolverToMemoize = function () { - resolverRunCount += 1; - return resolverRunCount; - }; - - const memoizedResolver = memoize('Query', 'test', resolverToMemoize); - - const parent = {}; - const args = {}; - const context = {}; - const info = { - path: { - key: 'test' - } - } - - let callCount = memoizedResolver(parent, args, context, info); - - st.equal(callCount, 1, 'first call of memoized resolver returns expected value'); - - callCount = memoizedResolver(parent, args, context, info); - - st.equal(callCount, 1, 'second call of memoizedResolver function doesnt call underlying resolver'); - st.end(); - }); - - t.test('memoize() with different operation aliases', (st) => { - let resolverRunCount = 0; - - const resolverToMemoize = function () { - resolverRunCount += 1; - return resolverRunCount; - }; - - const memoizedResolver = memoize('Query', 'test', resolverToMemoize); - - const parent = {}; - const args = {}; - const context = {}; - const infoWithAlias1 = { path: { key: 'alias1' } }; - const infoWithAlias2 = { path: { key: 'alias2' } }; - - let callCount = memoizedResolver(parent, args, context, infoWithAlias1); - - st.equal(callCount, 1, 'first call returns expected call count of 1'); - - callCount = memoizedResolver(parent, args, context, infoWithAlias2); - - st.equal(callCount, 2, 'second call of same resolver with different alias results in cache miss and call count 2'); - st.end(); - }); - - t.test('memoize() with different context', (st) => { - let resolverRunCount = 0; - - const resolverToMemoize = function () { - resolverRunCount += 1; - return resolverRunCount; - }; - - const memoizedResolver = memoize('Query', 'test', resolverToMemoize); - - const parent = {}; - const args = {}; - let context = {}; - const info = { path: { key: 'test'} }; - - let callCount = memoizedResolver(parent, args, context, info); - - st.equal(callCount, 1, 'first call returns expected call count of 1'); - - callCount = memoizedResolver(parent, args, context, info); - - st.equal(callCount, 1, 'second call with same context returns expected call count of 1'); - - // set context to a new reference - context = {}; - callCount = memoizedResolver(parent, args, context, info); - - st.equal(callCount, 2, 'third call with different context results in cache miss and expected call count 2'); - st.end(); - }); - - t.test('memoize() with different args', (st) => { - let resolverRunCount = 0; - - const resolverToMemoize = function () { - resolverRunCount += 1; - return resolverRunCount; - }; - - const memoizedResolver = memoize('Query', 'test', resolverToMemoize); - - const parent = {}; - const args = {}; - const context = {}; - const info = { path: { key: 'test'} }; - - let callCount = memoizedResolver(parent, args, context, info); - - st.equal(callCount, 1, 'first call returns expected call count of 1'); - - args.foo = 'bar'; - callCount = memoizedResolver(parent, args, context, info); - - st.equal(callCount, 2, 'second call with different args results in cache miss and expected call count 2'); - st.end(); - }); -}); - -Test('bindResolvers()', (t) => { - t.test('bind Query field resolver function', (st) => { - const resolvers = { - Query: { - test() { - return this.id; - } - } - }; - - const bound = bindResolvers({ id: 1 }, resolvers); - - const value = bound.Query.test({}, {}, {}, { parentType: 'Query', path: { key: 'test' } }); - - st.equal(value, 1, 'Query field resolver is bound'); - st.end(); - }); - - t.test('bind Mutation field resolver function', (st) => { - const resolvers = { - Mutation: { - test() { - return this.id; - } - } - }; - - const bound = bindResolvers({ id: 1 }, resolvers); - - const value = bound.Mutation.test({}, {}, {}, { parentType: 'Mutation', path: { key: 'test' } }); - - st.equal(value, 1, 'Mutation field resolver is bound'); - st.end(); - }); - - t.test('bind Subscription field resolver object', (st) => { - - const resolvers = { - Subscription: { - someSub: { - subscribe: () => { st.notOk(this.id, 'subscription subscribe() resolver was not bound')} - } - } - }; - - const bound = bindResolvers({ id: 1 }, resolvers); - // call the wrapped resolver result to assert this test case - bound.Subscription.someSub.subscribe(); - st.end(); - }); - - t.test('bind an enum remap', (st) => { - const resolvers = { - FooBarEnumType: { - FOO: 1, - BAR: 2 - } - } - - const bound = bindResolvers({id: 1}, resolvers); - st.equal(bound.FooBarEnumType.FOO, 1, 'enum remap runs through bindResolvers() without error, left as is'); - st.end(); - }); - - t.test('bind non root type field resolver', (st) => { - const resolvers = { - SomeType: { - test() { - return this.id; - } - } - }; - - const bound = bindResolvers({ id: 1 }, resolvers); - - const value = bound.SomeType.test({}, {}, {}, { parentType: 'SomeType', path: { key: 'test' } }); - - st.equal(value, 1, 'SomeType field resolver is bound'); - st.end(); - }); - - t.test('bind a custom GraphQLScalarType resolver', (st) => { - const CustomScalarType = new GraphQLScalarType({ - name: 'CustomScalarType', - description: 'foo bar custom scalar type', - serialize() {}, - parseValue() {}, - parseLiteral() {} - }) - const resolvers = { - Query: { - foo() {} - }, - CustomScalarType - }; - const bound = bindResolvers({ id: 1}, resolvers); - st.equal(bound.CustomScalarType, CustomScalarType, 'wrapped reference is equal to original reference (returned as is)'); - st.end(); - }); -}); - - diff --git a/lib/resolvers/index.js b/lib/resolvers/index.js deleted file mode 100644 index 329709e..0000000 --- a/lib/resolvers/index.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -const debug = require('debug')('graphql-component:resolver'); -const { GraphQLScalarType } = require('graphql'); - -/** - * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided - * @param {string} parentType - the type whose field resolver is being - * wrapped/memoized - * @param {string} fieldName - the field on the parentType whose resolver - * function is being wrapped/memoized - * @param {function} resolve - the resolver function that parentType. - * fieldName is mapped to - * @returns {function} a function that wraps the input resolver function and - * whose closure scope contains a WeakMap to achieve memoization of the wrapped - * input resolver function - */ - const memoize = function (parentType, fieldName, resolve) { - const _cache = new WeakMap(); - - return function _memoizedResolver(_, args, context, info) { - const path = info && info.path && info.path.key; - const key = `${path}_${JSON.stringify(args)}`; - - debug(`executing ${parentType}.${fieldName}`); - - let cached = _cache.get(context); - - if (cached && cached[key]) { - debug(`return cached result of memoized ${parentType}.${fieldName}`); - return cached[key]; - } - - if (!cached) { - cached = {}; - } - - const result = resolve(_, args, context, info); - - cached[key] = result; - - _cache.set(context, cached); - - debug(`cached ${parentType}.${fieldName}`); - - return result; - }; -}; - -/** - * make 'this' in resolver functions equal to the input bindContext - * @param {Object} bind - the object context to bind to resolver functions - * @param {Object} resolvers - the resolver map containing the resolver - * functions to bind - * @returns {Object} - an object identical in structure to the input resolver - * map, except with resolver function bound to the input argument bind - */ -const bindResolvers = function (bindContext, resolvers = {}) { - const boundResolvers = {}; - - for (const [type, fields] of Object.entries(resolvers)) { - // dont bind an object that is an instance of a graphql scalar - if (fields instanceof GraphQLScalarType) { - debug(`not binding ${type}'s fields since ${type}'s fields are an instance of GraphQLScalarType`) - boundResolvers[type] = fields; - continue; - } - - if (!boundResolvers[type]) { - boundResolvers[type] = {}; - } - - for (const [field, resolver] of Object.entries(fields)) { - if (['Query', 'Mutation'].indexOf(type) > -1) { - debug(`memoized ${type}.${field}`); - boundResolvers[type][field] = memoize(type, field, resolver.bind(bindContext)); - } - else { - // only bind resolvers that are functions - if (typeof resolver === 'function') { - debug(`binding ${type}.${field}`); - boundResolvers[type][field] = resolver.bind(bindContext); - } - else { - debug(`not binding ${type}.${field} since ${field} is not mapped to a function`); - boundResolvers[type][field] = resolver; - } - } - } - } - - return boundResolvers; -} - -module.exports = { bindResolvers, memoize }; - diff --git a/lib/transforms/__tests__.js b/lib/transforms/__tests__.js deleted file mode 100644 index ba42364..0000000 --- a/lib/transforms/__tests__.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; - -const { exclusions } = require('./index.js'); -const Test = require('tape'); -const { FilterTypes, FilterObjectFields } = require('graphql-tools'); - -Test('exclusions() accepts null exclude arg', (t) => { - t.plan(1); - - t.doesNotThrow(() => { - exclusions(); - }, 'does not explode'); -}); - -Test('exclusions() throws an error if passed a malformed exclusion', (t) => { - try { - exclusions(['mal.form.ed']); - } catch (e) { - t.equals(e.message, `'mal.form.ed' is malformed, should be of form 'type[.[field]]'`) - } - t.end(); -}); - -Test('exclusions() simply returns exclusions passed as objects', (t) => { - const filterType = new FilterTypes(); - const result = exclusions([filterType]); - console.log(result); - t.equals(result.length, 1, '1 transform is returned') - t.equals(result[0], filterType, 'transform is returned as is, since it was an object'); - t.end(); -}); - -Test(`exclusions() converts 'Type' only exclusion to FilterTypes transform`, (t) => { - const result = exclusions(['Query']); - t.ok(result[0] instanceof FilterTypes, 'resulting transform is an instance of graphql-tools FilterTypes'); - t.end(); -}); - -Test(`exclusions() converts 'Type.*' exclusion to FilterTypes transform`, (t) => { - const result = exclusions(['Query.*']); - t.ok(result[0] instanceof FilterTypes, 'resulting transform is an instance of graphql-tools FilterTypes'); - t.end(); -}); - -Test(`exclusions() converts 'Type.field' exclusion to FilterObjectFields transform`, (t) => { - const result = exclusions(['Query.foo']); - t.ok(result[0] instanceof FilterObjectFields, 'resulting transform is instance of graphql-tools FilterObjectFields'); - t.end(); -}); - -// TODO: actual type exclusions tests on GraphQLComponent instances here \ No newline at end of file diff --git a/lib/transforms/index.js b/lib/transforms/index.js deleted file mode 100644 index 505cc68..0000000 --- a/lib/transforms/index.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -const { FilterTypes, FilterObjectFields } = require('graphql-tools'); - -const exclusions = function(exclusions = []) { - return exclusions.map((exclusion) => { - if (typeof exclusion === 'string') { - const parts = exclusion.split('.'); - let type; - let field; - if (parts.length === 1) { - type = parts[0]; - } - else if (parts.length === 2) { - type = parts[0]; - field = parts[1]; - } - else { - throw new Error(`'${exclusion}' is malformed, should be of form 'type[.[field]]'`) - } - - // specific type/field exclusion such as 'Query.foo' - if (type && field && field !== '*') { - return new FilterObjectFields((typeName, fieldName) => { - if (typeName === type && field === fieldName) { - return false; - } - return true; - }) - } - // type only exclusion (such as 'Query') or type and all fields exclusions (such as 'Query.*') - else if (type && !field || (type && field && field === '*')) { - return new FilterTypes(graphqlObjectType => { - if (graphqlObjectType.name === type) { - return false; - } - return true; - }) - } - // assume that someone passed in a valid graphql-tools transform - } else if (typeof exclusion === 'object') { - return exclusion; - } - }); -} - -module.exports = { exclusions }; \ No newline at end of file diff --git a/lib/typedefs.ts b/lib/typedefs.ts deleted file mode 100644 index b2b6f54..0000000 --- a/lib/typedefs.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { GraphQLSchema, Source, DocumentNode, GraphQLResolveInfo } from 'graphql'; -import { IMocks, IResolvers } from 'graphql-tools'; -import { DirectiveUseMap } from 'graphql-tools'; - -export type ContextFunction = ((ctx: any) => any); - -export interface IContextMiddleware { - name: string - fn: ContextFunction -} - -export interface IContextConfig { - namespace: string - factory: ContextFunction -} - -export interface IContextWrapper extends ContextFunction { - use: (name: string|ContextFunction|null, fn?: ContextFunction|string) => void -} - -export interface IGraphQLComponentConfig { - component: IGraphQLComponent - exclude: string[] -} - -export interface IGraphQLComponent { - execute: (input: string, options: { root: any, context: {}, variables: {} }) => Promise - schema: GraphQLSchema - types: (string | Source | DocumentNode)[] - resolvers: IResolvers - imports?: IGraphQLComponent[] | IGraphQLComponentConfig[] - context: ContextFunction - mocks: IMocks -} - -export interface IGraphQLComponentOptions { - types?: (string | Source | DocumentNode)[] - resolvers?: IResolvers - imports?: (IGraphQLComponent|IGraphQLComponentConfig)[] - mocks?: MocksConfigFunction - directives?: DirectiveUseMap - context?: IContextConfig - useMocks?: boolean - federation?: boolean - preserveTypeResolvers?: boolean - dataSources?: any[] //fix this - dataSourceOverrides?: any[] //fix this - makeExecutableSchema?: any //fix this -}; - -export type MocksConfigFunction = (IMocks) => IMocks; - -export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; \ No newline at end of file diff --git a/package.json b/package.json index a048ae8..adfd5ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graphql-component", - "version": "3.0.1", + "version": "4.0.0-alpha.1", "description": "Build, customize and compose GraphQL schemas in a componentized fashion", "keywords": [ "graphql", @@ -13,9 +13,9 @@ "scripts": { "build": "tsc", "prepublish": "npm run build", - "test": "ts-node node_modules/.bin/tape lib/*/**/__tests__.ts lib/__tests__.ts", - "start-composition": "DEBUG=graphql-component:* node examples/composition/server/index.js", - "start-federation": "DEBUG=graphql-component:* node examples/federation/run-federation-example.js", + "test": "ts-node node_modules/.bin/tape test/**.ts", + "start-composition": "DEBUG=graphql-component node examples/composition/server/index.js", + "start-federation": "DEBUG=graphql-component node examples/federation/run-federation-example.js", "lint": "eslint lib", "cover": "nyc npm test" }, diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..d150571 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,450 @@ + +const debug = require('debug')('graphql-component'); + +import { buildFederatedSchema } from '@apollo/federation'; +import { GraphQLResolveInfo, GraphQLScalarType, GraphQLSchema } from 'graphql'; + +import { + stitchSchemas, + mergeTypeDefs, + addMocksToSchema, + makeExecutableSchema, + pruneSchema, + SchemaDirectiveVisitor, + IResolvers, + DirectiveUseMap, + SubschemaConfig, + PruneSchemaOptions, + ITypedef, + IMocks +} from 'graphql-tools'; + +export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; + +export interface IGraphQLComponentConfigObject { + component: IGraphQLComponent; + configuration?: SubschemaConfig; //TODO README +} + +export type ContextFunction = ((ctx: any) => any); + +export interface IDataSource { + name: string +} + +export type DataSourceMap = {[key: string]: IDataSource}; + +export type DataSourceInjectionFunction = ((ctx: any) => DataSourceMap); + +export interface IContextConfig { + namespace: string; + factory: ContextFunction; +} + +export interface IContextWrapper extends ContextFunction { + use: (name: string|ContextFunction|null, fn?: ContextFunction|string) => void; +} + +export interface IGraphQLComponentOptions { + types?: ITypedef | ITypedef[] + resolvers?: IResolvers; + mocks?: IMocks; + directives?: DirectiveUseMap; + imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; + context?: IContextConfig; + dataSources?: any[]; + dataSourceOverrides?: any; + pruneSchema?: boolean; + pruneSchemaOptions?: PruneSchemaOptions + federation?: boolean; +} + +export interface IGraphQLComponent { + readonly name: string; + readonly schema: GraphQLSchema; + readonly context: IContextWrapper; + readonly types: ITypedef[]; + readonly resolvers: IResolvers; + readonly imports?: IGraphQLComponentConfigObject[]; + readonly directives?: DirectiveUseMap; + readonly dataSources?: IDataSource[]; + federation?: boolean; + overrideDataSources: (dataSources: DataSourceMap, context: any) => void +} + +export default class GraphQLComponent implements IGraphQLComponent { + _schema: GraphQLSchema; + _types: ITypedef[]; + _resolvers: IResolvers; + _mocks: IMocks; + _directives: DirectiveUseMap; + _imports: IGraphQLComponentConfigObject[]; + _context: ContextFunction; + _dataSources: IDataSource[]; + _dataSourceOverrides: IDataSource[]; + _pruneSchema: boolean; + _pruneSchemaOptions: PruneSchemaOptions + _federation: boolean; + _dataSourceInjection: DataSourceInjectionFunction; + + constructor({ + types, + resolvers, + mocks, + directives, + imports, + context, + dataSources, + dataSourceOverrides, + pruneSchema, + pruneSchemaOptions, + federation + }: IGraphQLComponentOptions) { + + this._types = Array.isArray(types) ? types : [types]; + + this._resolvers = bindResolvers(this, resolvers); + + this._mocks = mocks; + + this._directives = directives; + + this._federation = federation; + + this._dataSources = dataSources; + + this._dataSourceOverrides = dataSourceOverrides; + + this._pruneSchema = pruneSchema; + + this._pruneSchemaOptions = pruneSchemaOptions; + + this._imports = imports && imports.length > 0 ? imports.map((i) => { + // check for a GraphQLComponent instance to construct a configuration object from it + if (i instanceof GraphQLComponent) { + // if the importing component (ie. this component) has federation set to true - set federation: true + // for all of its imported components + if (this._federation === true) { + i.federation = true; + } + + return { component: i }; + } + else { + const importConfiguration = i as IGraphQLComponentConfigObject; + + if (this._federation === true) { + importConfiguration.component.federation = true; + } + return importConfiguration; + } + }) : []; + + + this._context = async (): Promise => { + const ctx = {}; + + for (const { component } of this.imports) { + Object.assign(ctx, await component.context(context)); + } + + if (context) { + debug(`building ${context.namespace} context`); + + if (!ctx[context.namespace]) { + ctx[context.namespace] = {}; + } + + Object.assign(ctx[context.namespace], await context.factory.call(this, context)); + } + + return ctx; + }; + + } + + overrideDataSources(dataSources: DataSourceMap, context: any): void { + Object.assign(dataSources, this._dataSourceInjection(context)); + return; + } + + get name(): string { + return this.constructor.name; + } + + get schema() : GraphQLSchema { + if (this._schema) { + return this._schema; + } + + let makeSchema: (schemaConfig: any) => GraphQLSchema = undefined; + + if (this._federation) { + makeSchema = (schemaConfig): GraphQLSchema => { + const schema = buildFederatedSchema(schemaConfig); + + // allows a federated schema to have custom directives using the old class based directive implementation + if (this._directives) { + SchemaDirectiveVisitor.visitSchemaDirectives(schema, this._directives); + } + + return schema; + }; + } + else { + makeSchema = makeExecutableSchema; + } + + if (this._imports.length > 0) { + // iterate through the imports and construct subschema configuration objects + const subschemas = this._imports.map((imp) => { + const { component, configuration = {} } = imp; + + return { + schema: component.schema, + ...configuration + }; + }); + + // construct an aggregate schema from the schemas of imported + // components and this component's types/resolvers (if present) + this._schema = stitchSchemas({ + subschemas, + typeDefs: this._types, + resolvers: this._resolvers, + schemaDirectives: this._directives + }); + } + else { + const schemaConfig = { + typeDefs: mergeTypeDefs(this._types), + resolvers: this._resolvers, + schemaDirectives: this._directives + } + + this._schema = makeSchema(schemaConfig); + } + + if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { + debug(`adding default mocks to the schema for ${this.name}`); + // if mocks are a boolean support simply applying default mocks + this._schema = addMocksToSchema({schema: this._schema, preserveResolvers: true}); + } + else if (this._mocks !== undefined && typeof this._mocks === 'object') { + debug(`adding custom mocks to the schema for ${this.name}`); + // else if mocks is an object, that means the user provided + // custom mocks, with which we pass them to addMocksToSchema so they are applied + this._schema = addMocksToSchema({schema: this._schema, mocks: this._mocks, preserveResolvers: true}); + } + + if (this._pruneSchema) { + debug(`pruning the schema for ${this.name}`); + this._schema = pruneSchema(this._schema, this._pruneSchemaOptions); + } + + debug(`created schema for ${this.name}`); + + return this._schema; + } + + get context() : IContextWrapper { + const middleware = []; + const contextFunction = this.context; + + //TODO: FIX THIS + // const dataSourceInject = (context: any = {}) : DataSourceMap => { + // const intercept = (instance: IDataSource, context: any) => { + // debug(`intercepting ${instance.constructor.name}`); + + // return new Proxy(instance, { + // get(target, key) { + // if (typeof target[key] !== 'function' || key === instance.constructor.name) { + // return target[key]; + // } + // const original = target[key]; + + // return function (...args) { + // return original.call(instance, context, ...args); + // }; + // } + // }); + // }; + + // const dataSources = {}; + + // for (const { component } of this.imports) { + // component.overrideDataSources(dataSources, dataSourceInject(context)); + // } + + // for (const override of this._dataSourceOverrides) { + // debug(`overriding datasource ${override.constructor.name}`); + // dataSources[override.constructor.name] = intercept(override, context); + // } + + // if (this.dataSources && this.dataSources.length > 0) { + // for (const dataSource of this.dataSources) { + // const name = dataSource.constructor.name; + // if (!dataSources[name]) { + // dataSources[name] = intercept(dataSource, context); + // } + // } + // } + + // return dataSources; + // }; + + const context = async (context): Promise => { + debug(`building root context`); + + for (let { name, fn } of middleware) { + debug(`applying ${name} middleware`); + context = await fn(context); + } + + const componentContext = await contextFunction(context); + + const globalContext = { + ...context, + ...componentContext + }; + + globalContext.dataSources = dataSourceInject(globalContext); + + return globalContext; + }; + + context.use = function (name, fn) { + if (typeof name === 'function') { + fn = name; + name = 'unknown'; + } + debug(`adding ${name} middleware`); + middleware.push({ name, fn }); + }; + + return context; + } + + get types(): ITypedef[] { + return this._types; + } + + get resolvers(): IResolvers { + return this._resolvers; + } + + get imports(): IGraphQLComponentConfigObject[] { + return this._imports; + } + + get directives(): DirectiveUseMap { + return this._directives; + } + + get dataSources(): IDataSource[] { + return this._dataSources; + } + + set federation(flag) { + this._federation = flag; + } + + get federation(): boolean { + return this._federation; + } + + get dataSourceInjection(): DataSourceInjectionFunction { + return this._dataSourceInjection; + } + +} + + +/** + * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided + * @param {string} parentType - the type whose field resolver is being + * wrapped/memoized + * @param {string} fieldName - the field on the parentType whose resolver + * function is being wrapped/memoized + * @param {function} resolve - the resolver function that parentType. + * fieldName is mapped to + * @returns {function} a function that wraps the input resolver function and + * whose closure scope contains a WeakMap to achieve memoization of the wrapped + * input resolver function + */ + const memoize = function (parentType: string, fieldName: string, resolve: ResolverFunction): ResolverFunction { + const _cache = new WeakMap(); + + return function _memoizedResolver(_, args, context, info) { + const path = info && info.path && info.path.key; + const key = `${path}_${JSON.stringify(args)}`; + + debug(`executing ${parentType}.${fieldName}`); + + let cached = _cache.get(context); + + if (cached && cached[key]) { + debug(`return cached result of memoized ${parentType}.${fieldName}`); + return cached[key]; + } + + if (!cached) { + cached = {}; + } + + const result = resolve(_, args, context, info); + + cached[key] = result; + + _cache.set(context, cached); + + debug(`cached ${parentType}.${fieldName}`); + + return result; + }; +}; + +/** + * make 'this' in resolver functions equal to the input bindContext + * @param {Object} bind - the object context to bind to resolver functions + * @param {Object} resolvers - the resolver map containing the resolver + * functions to bind + * @returns {Object} - an object identical in structure to the input resolver + * map, except with resolver function bound to the input argument bind + */ +const bindResolvers = function (bindContext: IGraphQLComponent, resolvers: IResolvers = {}): IResolvers { + const boundResolvers = {}; + + for (const [type, fields] of Object.entries(resolvers)) { + // dont bind an object that is an instance of a graphql scalar + if (fields instanceof GraphQLScalarType) { + debug(`not binding ${type}'s fields since ${type}'s fields are an instance of GraphQLScalarType`) + boundResolvers[type] = fields; + continue; + } + + if (!boundResolvers[type]) { + boundResolvers[type] = {}; + } + + for (const [field, resolver] of Object.entries(fields)) { + if (['Query', 'Mutation'].indexOf(type) > -1) { + debug(`memoized ${type}.${field}`); + boundResolvers[type][field] = memoize(type, field, resolver.bind(bindContext)); + } + else { + // only bind resolvers that are functions + if (typeof resolver === 'function') { + debug(`binding ${type}.${field}`); + boundResolvers[type][field] = resolver.bind(bindContext); + } + else { + debug(`not binding ${type}.${field} since ${field} is not mapped to a function`); + boundResolvers[type][field] = resolver; + } + } + } + } + + return boundResolvers; +} \ No newline at end of file diff --git a/test/test.ts b/test/test.ts new file mode 100644 index 0000000..7a1dfeb --- /dev/null +++ b/test/test.ts @@ -0,0 +1,177 @@ + +import { SchemaDirectiveVisitor } from 'apollo-server'; +import { test } from 'tape'; +import GraphQLComponent from '../src'; + +test('component names', (t) => { + + t.test('generic name for anonymous constructor', (t) => { + t.plan(1); + + const component = new GraphQLComponent({}); + + t.equals(component.name, 'GraphQLComponent', `unnamed constructor results in component named 'GraphQLComponent'`); + }); + + t.test('component name (named constructor)', (t) => { + t.plan(1); + + class Named extends GraphQLComponent {} + + const component = new Named({}); + + t.equals(component.name, 'Named', `named constructor reflects class name`); + }); + +}); + +test('getters tests', (t) => { + + t.test('component types', (t) => { + t.plan(1); + + const component = new GraphQLComponent({ + types: `type Query { a: String }`, + imports: [new GraphQLComponent({ + types: `type Query { b: B } type B { someField: String}`} + )] + }); + + t.deepEquals(component.types, [`type Query { a: String }`], `only the component's own types are returned`); + }); + + t.test('component resolvers', (t) => { + t.plan(1); + + const component = new GraphQLComponent({ + resolvers: { + Query: { + a() { return 'hello'} + } + }, + imports: [new GraphQLComponent({ + resolvers: { + Query: { + b() { + return 'goodbye'; + } + } + } + })] + }); + + t.equals(Object.keys(component.resolvers.Query).length, 1, `only the component's own resolvers are returned`); + }); + + t.test('component imports', (t) => { + t.plan(1); + + const childThatAlsoHasImports = new GraphQLComponent({ + types: `type Query { c: String }`, + resolvers: { Query: { c() { return 'hello' }}}, + imports: [new GraphQLComponent({})] + }); + const root = new GraphQLComponent({ + imports: [ + childThatAlsoHasImports + ] + }); + t.equals(root.imports.length, 1, `only component's own imports are returned`); + }); + + t.test('component directives', (t) => { + t.plan(1); + + const component = new GraphQLComponent({ + directives: { parentDirective: () => {}}, + imports: [new GraphQLComponent({ + directives: { childDirective: () => {}} + })] + }); + + t.equals(Object.keys(component.directives).length, 1, `only component's own directives are returned`); + }); + + t.test('component datasources', (t) => { + t.plan(1); + + const component = new GraphQLComponent({ + dataSources: ['parentDataSourcePlaceHolder'], + imports: [new GraphQLComponent({ + dataSources: ['childDataSourcePlaceHolder'] + })] + }); + + t.equals(Object.keys(component.dataSources).length, 1, `only component's own dataSources are returned`); + }); + +}); + +test('federation', (t) => { + + t.test('federated schema can include custom directive', (t) => { + class CustomDirective extends SchemaDirectiveVisitor { + // required for our dummy "custom" directive (ie. implement the SchemaDirectiveVisitor interface) + visitFieldDefinition() { + return; + } + } + + const component = new GraphQLComponent({ + types: ` + directive @custom on FIELD_DEFINITION + type Query { + property(id: ID!): Property @custom + } + type Property @key(fields: "id") { + id: ID! + geo: [String] + } + extend type Extended @key(fields: "id") { + id: ID! @external + newProp: String + } + `, + resolvers: { + Query: { + property(_, { id }) { + return { + id, + geo: ['lat', 'long'] + } + } + }, + }, + directives: { custom: CustomDirective }, + federation: true + }); + + t.test('federated schema created without error', (t) => { + t.plan(1); + t.doesNotThrow(() => { + component.schema; + }, 'can return a buildFederatedSchema schema'); + }); + + t.test('custom directive added to federated schema', (t) => { + t.plan(1); + const { schema } = component; + + const schemaDirectives = schema.getDirectives(); + + t.equals(schemaDirectives.filter((directive) => directive.name === 'custom').length, 1, `federated schema has '@custom' directive`); + }); + + t.test('extended properties maintained after adding custom directive', (t) => { + t.plan(2); + const { schema } = component; + const Extended = schema.getTypeMap().Extended; + const astNodes = Extended.extensionASTNodes[0] as any; + + t.equals(Extended.extensionASTNodes.length, 1, 'Extension AST Nodes is defined'); + t.equals(astNodes.fields.filter((field) => field.name.value === "id" && field.directives[0].name.value === "external").length, 1, `id field marked external`); + + }); + }); + +}); From 1f14cb4391c122123449c1330652def231828555 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Fri, 4 Nov 2022 11:55:43 -0500 Subject: [PATCH 03/40] initial tests passing --- TODO.md | 6 ++ package.json | 11 +++- src/index.ts | 166 +++++++++++++++++++++++++++++---------------------- test/test.ts | 39 ++++-------- 4 files changed, 120 insertions(+), 102 deletions(-) create mode 100644 TODO.md diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..ba6ea81 --- /dev/null +++ b/TODO.md @@ -0,0 +1,6 @@ +Remaining to-dos for version 4: + +- [x] Alternative for schema directive visitor (add custom directives after creating federated schema) +- [ ] Document transforms +- [ ] Fix context injection +- [ ] \ No newline at end of file diff --git a/package.json b/package.json index adfd5ef..4de939f 100644 --- a/package.json +++ b/package.json @@ -24,16 +24,21 @@ "license": "MIT", "dependencies": { "@apollo/federation": "^0.28.0", + "@graphql-tools/delegate": "^8.7.6", + "@graphql-tools/merge": "^8.2.9", + "@graphql-tools/mock": "^8.6.7", + "@graphql-tools/schema": "^8.3.9", + "@graphql-tools/stitch": "^8.6.8", + "@graphql-tools/utils": "^8.6.8", "@types/graphql": "^14.5.0", "@types/node": "^17.0.21", - "debug": "^4.3.1", - "graphql-tools": "^7.0.5", - "typescript": "^4.6.2" + "debug": "^4.3.1" }, "peerDependencies": { "graphql": "^15.0.0" }, "devDependencies": { + "typescript": "^4.6.2", "@apollo/gateway": "^0.28.2", "apollo-server": "^2.25.0", "casual": "^1.6.0", diff --git a/src/index.ts b/src/index.ts index d66220f..705dcab 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,20 +4,19 @@ const debug = require('debug')('graphql-component'); import { buildFederatedSchema } from '@apollo/federation'; import { GraphQLResolveInfo, GraphQLScalarType, GraphQLSchema } from 'graphql'; +import { mergeTypeDefs } from '@graphql-tools/merge'; import { - stitchSchemas, - mergeTypeDefs, - addMocksToSchema, - makeExecutableSchema, pruneSchema, - SchemaDirectiveVisitor, IResolvers, - DirectiveUseMap, - SubschemaConfig, PruneSchemaOptions, - ITypedef, - IMocks -} from 'graphql-tools'; + TypeSource, + mapSchema, + SchemaMapper +} from '@graphql-tools/utils'; +import { makeExecutableSchema } from '@graphql-tools/schema'; +import { stitchSchemas } from '@graphql-tools/stitch'; +import { addMocksToSchema, IMocks } from '@graphql-tools/mock'; +import { SubschemaConfig } from '@graphql-tools/delegate'; export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; @@ -32,6 +31,10 @@ export interface IDataSource { name: string } +export type DataSource = { + [P in keyof T]: T[P] extends (ctx: any, ...p: infer P) => infer R ? (...p: P) => R : never +} + export type DataSourceMap = {[key: string]: IDataSource}; export type DataSourceInjectionFunction = ((ctx: any) => DataSourceMap); @@ -46,27 +49,26 @@ export interface IContextWrapper extends ContextFunction { } export interface IGraphQLComponentOptions { - types?: ITypedef | ITypedef[] + types?: TypeSource resolvers?: IResolvers; mocks?: IMocks; - directives?: DirectiveUseMap; imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; context?: IContextConfig; - dataSources?: any[]; - dataSourceOverrides?: any; + dataSources?: IDataSource[]; + dataSourceOverrides?: IDataSource[]; pruneSchema?: boolean; pruneSchemaOptions?: PruneSchemaOptions federation?: boolean; + transforms?: SchemaMapper[] } export interface IGraphQLComponent { readonly name: string; readonly schema: GraphQLSchema; readonly context: IContextWrapper; - readonly types: ITypedef[]; + readonly types: TypeSource; readonly resolvers: IResolvers; readonly imports?: IGraphQLComponentConfigObject[]; - readonly directives?: DirectiveUseMap; readonly dataSources?: IDataSource[]; federation?: boolean; overrideDataSources: (dataSources: DataSourceMap, context: any) => void @@ -74,10 +76,9 @@ export interface IGraphQLComponent { export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; - _types: ITypedef[]; + _types: TypeSource; _resolvers: IResolvers; _mocks: IMocks; - _directives: DirectiveUseMap; _imports: IGraphQLComponentConfigObject[]; _context: ContextFunction; _dataSources: IDataSource[]; @@ -86,19 +87,20 @@ export default class GraphQLComponent implements IGraphQLComponent { _pruneSchemaOptions: PruneSchemaOptions _federation: boolean; _dataSourceInjection: DataSourceInjectionFunction; + _transforms: SchemaMapper[] constructor({ types, resolvers, mocks, - directives, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, - federation + federation, + transforms }: IGraphQLComponentOptions) { this._types = Array.isArray(types) ? types : [types]; @@ -106,11 +108,11 @@ export default class GraphQLComponent implements IGraphQLComponent { this._resolvers = bindResolvers(this, resolvers); this._mocks = mocks; - - this._directives = directives; this._federation = federation; + this._transforms = transforms; + this._dataSources = dataSources; this._dataSourceOverrides = dataSourceOverrides; @@ -181,14 +183,7 @@ export default class GraphQLComponent implements IGraphQLComponent { if (this._federation) { makeSchema = (schemaConfig): GraphQLSchema => { - const schema = buildFederatedSchema(schemaConfig); - - // allows a federated schema to have custom directives using the old class based directive implementation - if (this._directives) { - SchemaDirectiveVisitor.visitSchemaDirectives(schema, this._directives); - } - - return schema; + return buildFederatedSchema(schemaConfig); //TODO: custom schema directives (alternative to SchemaDirectiveVisitor) }; } else { @@ -212,20 +207,23 @@ export default class GraphQLComponent implements IGraphQLComponent { subschemas, typeDefs: this._types, resolvers: this._resolvers, - schemaDirectives: this._directives, mergeDirectives: true }); } else { const schemaConfig = { typeDefs: mergeTypeDefs(this._types), - resolvers: this._resolvers, - schemaDirectives: this._directives + resolvers: this._resolvers } this._schema = makeSchema(schemaConfig); } + //TODO: add documentation + if (this._transforms) { + this._schema = transformSchema(this._schema, this._transforms); + } + if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { debug(`adding default mocks to the schema for ${this.name}`); // if mocks are a boolean support simply applying default mocks @@ -253,46 +251,46 @@ export default class GraphQLComponent implements IGraphQLComponent { const contextFunction = this.context; //TODO: FIX THIS - // const dataSourceInject = (context: any = {}) : DataSourceMap => { - // const intercept = (instance: IDataSource, context: any) => { - // debug(`intercepting ${instance.constructor.name}`); - - // return new Proxy(instance, { - // get(target, key) { - // if (typeof target[key] !== 'function' || key === instance.constructor.name) { - // return target[key]; - // } - // const original = target[key]; - - // return function (...args) { - // return original.call(instance, context, ...args); - // }; - // } - // }); - // }; + const dataSourceInject = (context: any = {}) : DataSourceMap => { + const intercept = (instance: IDataSource, context: any) => { + debug(`intercepting ${instance.constructor.name}`); + + return new Proxy(instance, { + get(target, key) { + if (typeof target[key] !== 'function' || key === instance.constructor.name) { + return target[key]; + } + const original = target[key]; + + return function (...args) { + return original.call(instance, context, ...args); + }; + } + }) as any as DataSource; + }; - // const dataSources = {}; + const dataSources = {}; - // for (const { component } of this.imports) { - // component.overrideDataSources(dataSources, dataSourceInject(context)); - // } + for (const { component } of this.imports) { + component.overrideDataSources(dataSources, dataSourceInject(context)); + } - // for (const override of this._dataSourceOverrides) { - // debug(`overriding datasource ${override.constructor.name}`); - // dataSources[override.constructor.name] = intercept(override, context); - // } + for (const override of this._dataSourceOverrides) { + debug(`overriding datasource ${override.constructor.name}`); + dataSources[override.constructor.name] = intercept(override, context); + } - // if (this.dataSources && this.dataSources.length > 0) { - // for (const dataSource of this.dataSources) { - // const name = dataSource.constructor.name; - // if (!dataSources[name]) { - // dataSources[name] = intercept(dataSource, context); - // } - // } - // } + if (this.dataSources && this.dataSources.length > 0) { + for (const dataSource of this.dataSources) { + const name = dataSource.constructor.name; + if (!dataSources[name]) { + dataSources[name] = intercept(dataSource, context); + } + } + } - // return dataSources; - // }; + return dataSources; + }; const context = async (context): Promise => { debug(`building root context`); @@ -326,7 +324,7 @@ export default class GraphQLComponent implements IGraphQLComponent { return context; } - get types(): ITypedef[] { + get types(): TypeSource { return this._types; } @@ -338,10 +336,6 @@ export default class GraphQLComponent implements IGraphQLComponent { return this._imports; } - get directives(): DirectiveUseMap { - return this._directives; - } - get dataSources(): IDataSource[] { return this._dataSources; } @@ -448,4 +442,30 @@ const bindResolvers = function (bindContext: IGraphQLComponent, resolvers: IReso } return boundResolvers; +}; + +const transformSchema = function (schema: GraphQLSchema, transforms: SchemaMapper[]) { + const functions = {}; + const mapping = {}; + + for (const transform of transforms) { + for (const [key, fn] of Object.entries(transform)) { + if (!mapping[key]) { + functions[key] = []; + mapping[key] = function (arg) { + while (functions[key].length) { + const mapper = functions[key].shift(); + arg = mapper(arg); + if (!arg) { + break; + } + } + return arg; + } + } + functions[key].push(fn); + } + } + + return mapSchema(schema, mapping); } \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index b88bbe6..47c2c4c 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,5 +1,7 @@ +import { MapperKind } from '@graphql-tools/utils'; import { SchemaDirectiveVisitor } from 'apollo-server'; +import { GraphQLFieldConfig, GraphQLSchema } from 'graphql'; import { test } from 'tape'; import GraphQLComponent from '../src'; @@ -79,26 +81,17 @@ test('getters tests', (t) => { t.equals(root.imports.length, 1, `only component's own imports are returned`); }); - t.test('component directives', (t) => { - t.plan(1); - - const component = new GraphQLComponent({ - directives: { parentDirective: () => {}}, - imports: [new GraphQLComponent({ - directives: { childDirective: () => {}} - })] - }); - - t.equals(Object.keys(component.directives).length, 1, `only component's own directives are returned`); - }); - t.test('component datasources', (t) => { t.plan(1); const component = new GraphQLComponent({ - dataSources: ['parentDataSourcePlaceHolder'], + dataSources: [new class ParentDataSource { + name: 'ParentDataSource' + }], imports: [new GraphQLComponent({ - dataSources: ['childDataSourcePlaceHolder'] + dataSources: [new class ChildDataSource { + name: 'ChildDataSource' + }] })] }); @@ -164,7 +157,11 @@ test('federation', (t) => { } }, }, - directives: { custom: CustomDirective }, + transforms: [{ + [MapperKind.OBJECT_FIELD]: (fieldConfig) => { + return fieldConfig; + } + }], federation: true }); @@ -184,16 +181,6 @@ test('federation', (t) => { t.equals(schemaDirectives.filter((directive) => directive.name === 'custom').length, 1, `federated schema has '@custom' directive`); }); - t.test('extended properties maintained after adding custom directive', (t) => { - t.plan(2); - const { schema } = component; - const Extended = schema.getTypeMap().Extended; - const astNodes = Extended.extensionASTNodes[0] as any; - - t.equals(Extended.extensionASTNodes.length, 1, 'Extension AST Nodes is defined'); - t.equals(astNodes.fields.filter((field) => field.name.value === "id" && field.directives[0].name.value === "external").length, 1, `id field marked external`); - - }); }); }); From da12c62350c75221853cf4aa02851869d9d5624c Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Fri, 15 Nov 2024 08:08:33 -0600 Subject: [PATCH 04/40] Fixed context injection, datasources, and converted examples/composition to TS. Added tests for above as well. --- README.md | 2 +- TODO.md | 9 +- dist/index.d.ts | 35 ++--- dist/index.js | 81 +++++++---- .../listing-component/{index.js => index.ts} | 16 ++- .../{resolvers.js => resolvers.ts} | 16 +-- .../composition/listing-component/types.js | 8 -- .../composition/listing-component/types.ts | 7 + .../{datasource.js => datasource.ts} | 8 +- .../composition/property-component/index.js | 14 -- .../composition/property-component/index.ts | 15 ++ .../{resolvers.js => resolvers.ts} | 4 +- .../composition/property-component/types.js | 8 -- .../composition/property-component/types.ts | 7 + .../{datasource.js => datasource.ts} | 8 +- .../composition/reviews-component/index.js | 14 -- .../composition/reviews-component/index.ts | 12 ++ .../{resolvers.js => resolvers.ts} | 2 +- .../composition/reviews-component/types.js | 8 -- .../composition/reviews-component/types.ts | 7 + .../composition/server/{index.js => index.ts} | 0 src/index.ts | 72 ++++------ test/test.ts | 136 +++++++++++++++++- tsconfig.json | 1 - 24 files changed, 316 insertions(+), 174 deletions(-) rename examples/composition/listing-component/{index.js => index.ts} (53%) rename examples/composition/listing-component/{resolvers.js => resolvers.ts} (62%) delete mode 100644 examples/composition/listing-component/types.js create mode 100644 examples/composition/listing-component/types.ts rename examples/composition/property-component/{datasource.js => datasource.ts} (72%) delete mode 100644 examples/composition/property-component/index.js create mode 100644 examples/composition/property-component/index.ts rename examples/composition/property-component/{resolvers.js => resolvers.ts} (75%) delete mode 100644 examples/composition/property-component/types.js create mode 100644 examples/composition/property-component/types.ts rename examples/composition/reviews-component/{datasource.js => datasource.ts} (87%) delete mode 100644 examples/composition/reviews-component/index.js create mode 100644 examples/composition/reviews-component/index.ts rename examples/composition/reviews-component/{resolvers.js => resolvers.ts} (88%) delete mode 100644 examples/composition/reviews-component/types.js create mode 100644 examples/composition/reviews-component/types.ts rename examples/composition/server/{index.js => index.ts} (100%) diff --git a/README.md b/README.md index ea12dfa..2fcb8c9 100644 --- a/README.md +++ b/README.md @@ -46,13 +46,13 @@ federation (2 subschema services implemented via `GraphQLComponent` and a vanill - `resolvers` - a resolver map (ie. a two level map whose first level keys are types from the SDL, mapped to objects, whose keys are fields on those types and values are resolver functions) - `imports` - an optional array of imported components for the schema to be merged with. - `context` - an optional object { namespace, factory } for contributing to context. - - `directives` - an optional object containing custom schema directives. - `mocks` - a boolean (to enable default mocks) or an object to pass in custom mocks - `dataSources` - an array of data sources instances to make available on `context.dataSources` . - `dataSourceOverrides` - overrides for data sources in the component tree. - `federation` - make this component's schema an Apollo Federated schema (default: `false`). - `pruneSchema` - (optional) prune the schema according to [pruneSchema in graphql-tools](https://www.graphql-tools.com/docs/api/modules/utils_src#pruneschema) (default: false) - `pruneSchemaOptions` - (optional) schema options as per [PruneSchemaOptions in graphql-tools](https://www.graphql-tools.com/docs/api/interfaces/utils_src.PruneSchemaOptions) + - `transforms` - An array of schema transforms to apply to the component's schema. - `static GraphQLComponent.delegateToComponent(component, options)` - a wrapper function that utilizes `graphql-tools` `delegateToSchema()` to delegate the calling resolver's selection set to a root type field (`Query`, `Mutuation`) of another `GraphQLComponent`'s schema - `component` (instance of `GraphQLComponent`) - the component's whose schema will be the target of the delegated operation diff --git a/TODO.md b/TODO.md index ba6ea81..d278b88 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,9 @@ Remaining to-dos for version 4: - [x] Alternative for schema directive visitor (add custom directives after creating federated schema) -- [ ] Document transforms -- [ ] Fix context injection -- [ ] \ No newline at end of file +- [x] Document transforms, including directives +- [x] Fix context injection +- [ ] IGraphQLComponentConfigObject documentation +- [ ] SubschemaConfig documentation +- [x] Fix composition examples +- [ ] Fix federations examples \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index f208b86..f11df46 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,18 +1,23 @@ import { GraphQLResolveInfo, GraphQLSchema } from 'graphql'; -import { IResolvers, DirectiveUseMap, SubschemaConfig, PruneSchemaOptions, ITypedef, IMocks } from 'graphql-tools'; -export declare type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; +import { IResolvers, PruneSchemaOptions, TypeSource, SchemaMapper } from '@graphql-tools/utils'; +import { IMocks } from '@graphql-tools/mock'; +import { SubschemaConfig } from '@graphql-tools/delegate'; +export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; export interface IGraphQLComponentConfigObject { component: IGraphQLComponent; configuration?: SubschemaConfig; } -export declare type ContextFunction = ((ctx: any) => any); +export type ContextFunction = ((ctx: any) => any); export interface IDataSource { name: string; } -export declare type DataSourceMap = { +export type DataSource = { + [P in keyof T]: T[P] extends (ctx: any, ...p: infer P) => infer R ? (...p: P) => R : never; +}; +export type DataSourceMap = { [key: string]: IDataSource; }; -export declare type DataSourceInjectionFunction = ((ctx: any) => DataSourceMap); +export type DataSourceInjectionFunction = ((ctx: any) => DataSourceMap); export interface IContextConfig { namespace: string; factory: ContextFunction; @@ -21,36 +26,34 @@ export interface IContextWrapper extends ContextFunction { use: (name: string | ContextFunction | null, fn?: ContextFunction | string) => void; } export interface IGraphQLComponentOptions { - types?: ITypedef | ITypedef[]; + types?: TypeSource; resolvers?: IResolvers; mocks?: IMocks; - directives?: DirectiveUseMap; imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; context?: IContextConfig; - dataSources?: any[]; - dataSourceOverrides?: any; + dataSources?: IDataSource[]; + dataSourceOverrides?: IDataSource[]; pruneSchema?: boolean; pruneSchemaOptions?: PruneSchemaOptions; federation?: boolean; + transforms?: SchemaMapper[]; } export interface IGraphQLComponent { readonly name: string; readonly schema: GraphQLSchema; readonly context: IContextWrapper; - readonly types: ITypedef[]; + readonly types: TypeSource; readonly resolvers: IResolvers; readonly imports?: IGraphQLComponentConfigObject[]; - readonly directives?: DirectiveUseMap; readonly dataSources?: IDataSource[]; federation?: boolean; overrideDataSources: (dataSources: DataSourceMap, context: any) => void; } export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; - _types: ITypedef[]; + _types: TypeSource; _resolvers: IResolvers; _mocks: IMocks; - _directives: DirectiveUseMap; _imports: IGraphQLComponentConfigObject[]; _context: ContextFunction; _dataSources: IDataSource[]; @@ -59,15 +62,15 @@ export default class GraphQLComponent implements IGraphQLComponent { _pruneSchemaOptions: PruneSchemaOptions; _federation: boolean; _dataSourceInjection: DataSourceInjectionFunction; - constructor({ types, resolvers, mocks, directives, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, federation }: IGraphQLComponentOptions); + _transforms: SchemaMapper[]; + constructor({ types, resolvers, mocks, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, federation, transforms }: IGraphQLComponentOptions); overrideDataSources(dataSources: DataSourceMap, context: any): void; get name(): string; get schema(): GraphQLSchema; get context(): IContextWrapper; - get types(): ITypedef[]; + get types(): TypeSource; get resolvers(): IResolvers; get imports(): IGraphQLComponentConfigObject[]; - get directives(): DirectiveUseMap; get dataSources(): IDataSource[]; set federation(flag: boolean); get federation(): boolean; diff --git a/dist/index.js b/dist/index.js index e7f8f25..e5a3ff6 100644 --- a/dist/index.js +++ b/dist/index.js @@ -3,13 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); const debug = require('debug')('graphql-component'); const federation_1 = require("@apollo/federation"); const graphql_1 = require("graphql"); -const graphql_tools_1 = require("graphql-tools"); +const merge_1 = require("@graphql-tools/merge"); +const utils_1 = require("@graphql-tools/utils"); +const schema_1 = require("@graphql-tools/schema"); +const stitch_1 = require("@graphql-tools/stitch"); +const mock_1 = require("@graphql-tools/mock"); class GraphQLComponent { _schema; _types; _resolvers; _mocks; - _directives; _imports; _context; _dataSources; @@ -18,14 +21,15 @@ class GraphQLComponent { _pruneSchemaOptions; _federation; _dataSourceInjection; - constructor({ types, resolvers, mocks, directives, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, federation }) { + _transforms; + constructor({ types, resolvers, mocks, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, federation, transforms }) { this._types = Array.isArray(types) ? types : [types]; this._resolvers = bindResolvers(this, resolvers); this._mocks = mocks; - this._directives = directives; this._federation = federation; - this._dataSources = dataSources; - this._dataSourceOverrides = dataSourceOverrides; + this._transforms = transforms; + this._dataSources = dataSources || []; + this._dataSourceOverrides = dataSourceOverrides || []; this._pruneSchema = pruneSchema; this._pruneSchemaOptions = pruneSchemaOptions; this._imports = imports && imports.length > 0 ? imports.map((i) => { @@ -75,16 +79,11 @@ class GraphQLComponent { let makeSchema = undefined; if (this._federation) { makeSchema = (schemaConfig) => { - const schema = (0, federation_1.buildFederatedSchema)(schemaConfig); - // allows a federated schema to have custom directives using the old class based directive implementation - if (this._directives) { - graphql_tools_1.SchemaDirectiveVisitor.visitSchemaDirectives(schema, this._directives); - } - return schema; + return (0, federation_1.buildFederatedSchema)(schemaConfig); //TODO: custom schema directives (alternative to SchemaDirectiveVisitor) }; } else { - makeSchema = graphql_tools_1.makeExecutableSchema; + makeSchema = schema_1.makeExecutableSchema; } if (this._imports.length > 0) { // iterate through the imports and construct subschema configuration objects @@ -97,42 +96,46 @@ class GraphQLComponent { }); // construct an aggregate schema from the schemas of imported // components and this component's types/resolvers (if present) - this._schema = (0, graphql_tools_1.stitchSchemas)({ + this._schema = (0, stitch_1.stitchSchemas)({ subschemas, typeDefs: this._types, resolvers: this._resolvers, - schemaDirectives: this._directives + mergeDirectives: true }); } else { const schemaConfig = { - typeDefs: (0, graphql_tools_1.mergeTypeDefs)(this._types), - resolvers: this._resolvers, - schemaDirectives: this._directives + typeDefs: (0, merge_1.mergeTypeDefs)(this._types), + resolvers: this._resolvers }; this._schema = makeSchema(schemaConfig); } + //TODO: add documentation + if (this._transforms) { + this._schema = transformSchema(this._schema, this._transforms); + } if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { debug(`adding default mocks to the schema for ${this.name}`); // if mocks are a boolean support simply applying default mocks - this._schema = (0, graphql_tools_1.addMocksToSchema)({ schema: this._schema, preserveResolvers: true }); + this._schema = (0, mock_1.addMocksToSchema)({ schema: this._schema, preserveResolvers: true }); } else if (this._mocks !== undefined && typeof this._mocks === 'object') { debug(`adding custom mocks to the schema for ${this.name}`); // else if mocks is an object, that means the user provided // custom mocks, with which we pass them to addMocksToSchema so they are applied - this._schema = (0, graphql_tools_1.addMocksToSchema)({ schema: this._schema, mocks: this._mocks, preserveResolvers: true }); + this._schema = (0, mock_1.addMocksToSchema)({ schema: this._schema, mocks: this._mocks, preserveResolvers: true }); } if (this._pruneSchema) { debug(`pruning the schema for ${this.name}`); - this._schema = (0, graphql_tools_1.pruneSchema)(this._schema, this._pruneSchemaOptions); + this._schema = (0, utils_1.pruneSchema)(this._schema, this._pruneSchemaOptions); } debug(`created schema for ${this.name}`); return this._schema; } get context() { const middleware = []; - const contextFunction = this.context; + const contextFunction = this._context; + //TODO: FIX THIS const dataSourceInject = (context = {}) => { const intercept = (instance, context) => { debug(`intercepting ${instance.constructor.name}`); @@ -149,9 +152,9 @@ class GraphQLComponent { }); }; const dataSources = {}; - for (const { component } of this.imports) { - component.overrideDataSources(dataSources, context); - } + // for (const { component } of this.imports) { + // component.overrideDataSources(dataSources, dataSourceInject(context)); + // } for (const override of this._dataSourceOverrides) { debug(`overriding datasource ${override.constructor.name}`); dataSources[override.constructor.name] = intercept(override, context); @@ -199,9 +202,6 @@ class GraphQLComponent { get imports() { return this._imports; } - get directives() { - return this._directives; - } get dataSources() { return this._dataSources; } @@ -289,4 +289,27 @@ const bindResolvers = function (bindContext, resolvers = {}) { } return boundResolvers; }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGlEQWF1QjtBQXVEdkIsTUFBcUIsZ0JBQWdCO0lBQ25DLE9BQU8sQ0FBZ0I7SUFDdkIsTUFBTSxDQUFhO0lBQ25CLFVBQVUsQ0FBdUI7SUFDakMsTUFBTSxDQUFTO0lBQ2YsV0FBVyxDQUFrQjtJQUM3QixRQUFRLENBQWtDO0lBQzFDLFFBQVEsQ0FBa0I7SUFDMUIsWUFBWSxDQUFnQjtJQUM1QixvQkFBb0IsQ0FBZ0I7SUFDcEMsWUFBWSxDQUFVO0lBQ3RCLG1CQUFtQixDQUFvQjtJQUN2QyxXQUFXLENBQVU7SUFDckIsb0JBQW9CLENBQThCO0lBRWxELFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUVoQyxJ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 \ No newline at end of file +const transformSchema = function (schema, transforms) { + const functions = {}; + const mapping = {}; + for (const transform of transforms) { + for (const [key, fn] of Object.entries(transform)) { + if (!mapping[key]) { + functions[key] = []; + mapping[key] = function (arg) { + while (functions[key].length) { + const mapper = functions[key].shift(); + arg = mapper(arg); + if (!arg) { + break; + } + } + return arg; + }; + } + functions[key].push(fn); + } + } + return (0, utils_1.mapSchema)(schema, mapping); +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBUztJQUNmLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQixvQkFBb0IsQ0FBOEI7SUFDbEQsV0FBVyxDQUFnQjtJQUUzQixZQUFZLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsRUFDZTtRQUV6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxV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 \ No newline at end of file diff --git a/examples/composition/listing-component/index.js b/examples/composition/listing-component/index.ts similarity index 53% rename from examples/composition/listing-component/index.js rename to examples/composition/listing-component/index.ts index 0a7fe4a..ce8525f 100644 --- a/examples/composition/listing-component/index.js +++ b/examples/composition/listing-component/index.ts @@ -1,12 +1,16 @@ 'use strict'; -const GraphQLComponent = require('../../../lib/index'); -const Property = require('../property-component'); -const Reviews = require('../reviews-component'); -const resolvers = require('./resolvers'); -const types = require('./types'); +import { types } from "./types"; +import { resolvers } from "./resolvers"; +import GraphQLComponent from "../../../src"; +import Property from "../property-component"; +import Reviews from "../reviews-component"; -class ListingComponent extends GraphQLComponent { + +export default class ListingComponent extends GraphQLComponent { + propertyComponent: Property; + reviewsComponent: Reviews; + constructor(options) { const propertyComponent = new Property(); const reviewsComponent = new Reviews(); diff --git a/examples/composition/listing-component/resolvers.js b/examples/composition/listing-component/resolvers.ts similarity index 62% rename from examples/composition/listing-component/resolvers.js rename to examples/composition/listing-component/resolvers.ts index 004c891..faec880 100644 --- a/examples/composition/listing-component/resolvers.js +++ b/examples/composition/listing-component/resolvers.ts @@ -1,8 +1,8 @@ 'use strict'; -const GraphQLComponent = require('../../../lib'); +import { delegateToSchema } from '@graphql-tools/delegate'; -const resolvers = { +export const resolvers = { Query: { async listing(_, { id }) { return { id }; @@ -10,16 +10,18 @@ const resolvers = { }, Listing: { property(root, args, context, info) { - return GraphQLComponent.delegateToComponent(this.propertyComponent, { + return delegateToSchema({ + schema: this.propertyComponent.schema, args: { id: root.id }, context, info - }) + }); }, reviews(root, args, context, info) { - return GraphQLComponent.delegateToComponent(this.reviewsComponent, { + return delegateToSchema({ + schema: this.reviewsComponent.schema, operation: 'query', fieldName: 'reviewsByPropertyId', args: { @@ -27,9 +29,7 @@ const resolvers = { }, context, info - }) + }); } } }; - -module.exports = resolvers; diff --git a/examples/composition/listing-component/types.js b/examples/composition/listing-component/types.js deleted file mode 100644 index fed9e29..0000000 --- a/examples/composition/listing-component/types.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -const types = fs.readFileSync(path.resolve(path.join(__dirname, 'schema.graphql')), 'utf-8'); - -module.exports = types; diff --git a/examples/composition/listing-component/types.ts b/examples/composition/listing-component/types.ts new file mode 100644 index 0000000..bb101ca --- /dev/null +++ b/examples/composition/listing-component/types.ts @@ -0,0 +1,7 @@ +'use strict'; + +import fs from 'fs'; +import path from 'path'; + +export const types = fs.readFileSync(path.resolve(path.join(__dirname, 'schema.graphql')), 'utf-8'); + diff --git a/examples/composition/property-component/datasource.js b/examples/composition/property-component/datasource.ts similarity index 72% rename from examples/composition/property-component/datasource.js rename to examples/composition/property-component/datasource.ts index 0c8ce72..9a3c471 100644 --- a/examples/composition/property-component/datasource.js +++ b/examples/composition/property-component/datasource.ts @@ -5,10 +5,10 @@ const propertiesDB = { 2: { id: 2, geo: ['111.1111', '222.2222']} } -class PropertyDataSource { +export default class PropertyDataSource { + name = 'PropertyDataSource'; + getPropertyById(context, id) { return propertiesDB[id]; } -} - -module.exports = PropertyDataSource; \ No newline at end of file +} \ No newline at end of file diff --git a/examples/composition/property-component/index.js b/examples/composition/property-component/index.js deleted file mode 100644 index 45f15e8..0000000 --- a/examples/composition/property-component/index.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -const GraphQLComponent = require('../../../lib/index'); -const PropertyDataSource = require('./datasource'); -const resolvers = require('./resolvers'); -const types = require('./types'); - -class PropertyComponent extends GraphQLComponent { - constructor({ dataSources = [new PropertyDataSource()], ...options } = {}) { - super({ types, resolvers, dataSources, ...options }); - } -} - -module.exports = PropertyComponent; diff --git a/examples/composition/property-component/index.ts b/examples/composition/property-component/index.ts new file mode 100644 index 0000000..bc94c49 --- /dev/null +++ b/examples/composition/property-component/index.ts @@ -0,0 +1,15 @@ +'use strict'; + +import { types } from "./types"; +import GraphQLComponent from "../../../src"; +import { resolvers } from "./resolvers"; +import PropertyDataSource from "./datasource"; + + +export default class PropertyComponent extends GraphQLComponent { + constructor({ dataSources = [new PropertyDataSource()], ...options } = {}) { + super({ types, resolvers, dataSources, ...options }); + } +} + +module.exports = PropertyComponent; diff --git a/examples/composition/property-component/resolvers.js b/examples/composition/property-component/resolvers.ts similarity index 75% rename from examples/composition/property-component/resolvers.js rename to examples/composition/property-component/resolvers.ts index a1d048b..5c58aa8 100644 --- a/examples/composition/property-component/resolvers.js +++ b/examples/composition/property-component/resolvers.ts @@ -1,11 +1,9 @@ 'use strict'; -const resolvers = { +export const resolvers = { Query: { property(_, { id }, { dataSources }) { return dataSources.PropertyDataSource.getPropertyById(id); } } }; - -module.exports = resolvers; diff --git a/examples/composition/property-component/types.js b/examples/composition/property-component/types.js deleted file mode 100644 index fed9e29..0000000 --- a/examples/composition/property-component/types.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -const types = fs.readFileSync(path.resolve(path.join(__dirname, 'schema.graphql')), 'utf-8'); - -module.exports = types; diff --git a/examples/composition/property-component/types.ts b/examples/composition/property-component/types.ts new file mode 100644 index 0000000..bb101ca --- /dev/null +++ b/examples/composition/property-component/types.ts @@ -0,0 +1,7 @@ +'use strict'; + +import fs from 'fs'; +import path from 'path'; + +export const types = fs.readFileSync(path.resolve(path.join(__dirname, 'schema.graphql')), 'utf-8'); + diff --git a/examples/composition/reviews-component/datasource.js b/examples/composition/reviews-component/datasource.ts similarity index 87% rename from examples/composition/reviews-component/datasource.js rename to examples/composition/reviews-component/datasource.ts index 45a6951..f19ba28 100644 --- a/examples/composition/reviews-component/datasource.js +++ b/examples/composition/reviews-component/datasource.ts @@ -6,10 +6,10 @@ const reviewsDB = { 2: [ { id: 'rev-id-2-a', content: 'This property was amazing for our extended family'}, { id: 'rev-id-2-b', content: 'I loved the proximity to the beach'}, { id: 'rev-id-2-c', content: 'The bed was not comfortable at all'}] } -class ReviewsDataSource { +export default class ReviewsDataSource { + name = 'ReviewsDataSource'; + getReviewsByPropertyId(context, propertyId) { return reviewsDB[propertyId] } -}; - -module.exports = ReviewsDataSource; \ No newline at end of file +}; \ No newline at end of file diff --git a/examples/composition/reviews-component/index.js b/examples/composition/reviews-component/index.js deleted file mode 100644 index 74ddea5..0000000 --- a/examples/composition/reviews-component/index.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -const GraphQLComponent = require('../../../lib/index'); -const ReviewsDataSource = require('./datasource'); -const resolvers = require('./resolvers'); -const types = require('./types'); - -class ReviewsComponent extends GraphQLComponent { - constructor({ dataSources = [new ReviewsDataSource()], ...options } = {}) { - super({ types, resolvers, dataSources, ...options }); - } -} - -module.exports = ReviewsComponent; diff --git a/examples/composition/reviews-component/index.ts b/examples/composition/reviews-component/index.ts new file mode 100644 index 0000000..fcf83a7 --- /dev/null +++ b/examples/composition/reviews-component/index.ts @@ -0,0 +1,12 @@ +'use strict'; + +import { types } from "./types"; +import GraphQLComponent from "../../../src"; +import { resolvers } from "./resolvers"; +import ReviewsDataSource from "./datasource"; + +export default class ReviewsComponent extends GraphQLComponent { + constructor({ dataSources = [new ReviewsDataSource()], ...options } = {}) { + super({ types, resolvers, dataSources, ...options }); + } +} diff --git a/examples/composition/reviews-component/resolvers.js b/examples/composition/reviews-component/resolvers.ts similarity index 88% rename from examples/composition/reviews-component/resolvers.js rename to examples/composition/reviews-component/resolvers.ts index f346603..f97e659 100644 --- a/examples/composition/reviews-component/resolvers.js +++ b/examples/composition/reviews-component/resolvers.ts @@ -1,6 +1,6 @@ 'use strict'; -const resolvers = { +export const resolvers = { Query: { reviewsByPropertyId(_, { propertyId }, { dataSources }) { return dataSources.ReviewsDataSource.getReviewsByPropertyId(propertyId); diff --git a/examples/composition/reviews-component/types.js b/examples/composition/reviews-component/types.js deleted file mode 100644 index fed9e29..0000000 --- a/examples/composition/reviews-component/types.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -const types = fs.readFileSync(path.resolve(path.join(__dirname, 'schema.graphql')), 'utf-8'); - -module.exports = types; diff --git a/examples/composition/reviews-component/types.ts b/examples/composition/reviews-component/types.ts new file mode 100644 index 0000000..bb101ca --- /dev/null +++ b/examples/composition/reviews-component/types.ts @@ -0,0 +1,7 @@ +'use strict'; + +import fs from 'fs'; +import path from 'path'; + +export const types = fs.readFileSync(path.resolve(path.join(__dirname, 'schema.graphql')), 'utf-8'); + diff --git a/examples/composition/server/index.js b/examples/composition/server/index.ts similarity index 100% rename from examples/composition/server/index.js rename to examples/composition/server/index.ts diff --git a/src/index.ts b/src/index.ts index 705dcab..8033d11 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ - const debug = require('debug')('graphql-component'); import { buildFederatedSchema } from '@apollo/federation'; @@ -22,7 +21,7 @@ export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolv export interface IGraphQLComponentConfigObject { component: IGraphQLComponent; - configuration?: SubschemaConfig; //TODO README + configuration?: SubschemaConfig; } export type ContextFunction = ((ctx: any) => any); @@ -68,10 +67,10 @@ export interface IGraphQLComponent { readonly context: IContextWrapper; readonly types: TypeSource; readonly resolvers: IResolvers; - readonly imports?: IGraphQLComponentConfigObject[]; + readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; - federation?: boolean; overrideDataSources: (dataSources: DataSourceMap, context: any) => void + federation?: boolean; } export default class GraphQLComponent implements IGraphQLComponent { @@ -113,28 +112,23 @@ export default class GraphQLComponent implements IGraphQLComponent { this._transforms = transforms; - this._dataSources = dataSources; + this._dataSources = dataSources || []; - this._dataSourceOverrides = dataSourceOverrides; + this._dataSourceOverrides = dataSourceOverrides || []; this._pruneSchema = pruneSchema; this._pruneSchemaOptions = pruneSchemaOptions; - this._imports = imports && imports.length > 0 ? imports.map((i) => { - // check for a GraphQLComponent instance to construct a configuration object from it + this._imports = imports && imports.length > 0 ? imports.map((i: GraphQLComponent | IGraphQLComponentConfigObject) => { if (i instanceof GraphQLComponent) { - // if the importing component (ie. this component) has federation set to true - set federation: true - // for all of its imported components if (this._federation === true) { i.federation = true; } - return { component: i }; - } + } else { const importConfiguration = i as IGraphQLComponentConfigObject; - if (this._federation === true) { importConfiguration.component.federation = true; } @@ -143,21 +137,25 @@ export default class GraphQLComponent implements IGraphQLComponent { }) : []; - this._context = async (): Promise => { - const ctx = {}; + this._context = async (globalContext: any): Promise => { + const ctx = Object.assign({}, globalContext); for (const { component } of this.imports) { - Object.assign(ctx, await component.context(context)); + Object.assign(ctx, await component.context(ctx)); } if (context) { debug(`building ${context.namespace} context`); - + if (!ctx[context.namespace]) { ctx[context.namespace] = {}; } + + if (ctx[context.namespace]) { + + } - Object.assign(ctx[context.namespace], await context.factory.call(this, context)); + Object.assign(ctx[context.namespace], await context.factory.call(this, ctx)); } return ctx; @@ -183,7 +181,7 @@ export default class GraphQLComponent implements IGraphQLComponent { if (this._federation) { makeSchema = (schemaConfig): GraphQLSchema => { - return buildFederatedSchema(schemaConfig); //TODO: custom schema directives (alternative to SchemaDirectiveVisitor) + return buildFederatedSchema(schemaConfig); }; } else { @@ -219,7 +217,6 @@ export default class GraphQLComponent implements IGraphQLComponent { this._schema = makeSchema(schemaConfig); } - //TODO: add documentation if (this._transforms) { this._schema = transformSchema(this._schema, this._transforms); } @@ -246,47 +243,38 @@ export default class GraphQLComponent implements IGraphQLComponent { return this._schema; } - get context() : IContextWrapper { + get context(): IContextWrapper { const middleware = []; - const contextFunction = this.context; - - //TODO: FIX THIS - const dataSourceInject = (context: any = {}) : DataSourceMap => { + const contextFunction = this._context; + + const dataSourceInject = (context: any = {}): DataSourceMap => { const intercept = (instance: IDataSource, context: any) => { debug(`intercepting ${instance.constructor.name}`); - + return new Proxy(instance, { get(target, key) { if (typeof target[key] !== 'function' || key === instance.constructor.name) { return target[key]; } const original = target[key]; - + return function (...args) { return original.call(instance, context, ...args); }; } }) as any as DataSource; }; - - const dataSources = {}; - for (const { component } of this.imports) { - component.overrideDataSources(dataSources, dataSourceInject(context)); - } + const dataSources = {}; - for (const override of this._dataSourceOverrides) { - debug(`overriding datasource ${override.constructor.name}`); - dataSources[override.constructor.name] = intercept(override, context); + // Inject data sources + for (const dataSource of this._dataSources) { + dataSources[dataSource.name] = intercept(dataSource, context); } - if (this.dataSources && this.dataSources.length > 0) { - for (const dataSource of this.dataSources) { - const name = dataSource.constructor.name; - if (!dataSources[name]) { - dataSources[name] = intercept(dataSource, context); - } - } + // Override data sources + for (const dataSourceOverride of this._dataSourceOverrides) { + dataSources[dataSourceOverride.name] = intercept(dataSourceOverride, context); } return dataSources; diff --git a/test/test.ts b/test/test.ts index 47c2c4c..dc5c2c5 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,9 +1,9 @@ -import { MapperKind } from '@graphql-tools/utils'; -import { SchemaDirectiveVisitor } from 'apollo-server'; -import { GraphQLFieldConfig, GraphQLSchema } from 'graphql'; +import { DirectiveLocation, MapperKind, mapSchema } from '@graphql-tools/utils'; +import { RenameTypes, SchemaDirectiveVisitor } from 'apollo-server'; +import { graphql, GraphQLDirective, GraphQLFieldConfig, GraphQLSchema, GraphQLString } from 'graphql'; import { test } from 'tape'; -import GraphQLComponent from '../src'; +import GraphQLComponent, { IDataSource } from '../src'; test('component names', (t) => { @@ -184,3 +184,131 @@ test('federation', (t) => { }); }); + +test('context', async (t) => { + t.plan(3); + + const component = new GraphQLComponent({ + context: { + namespace: 'test', + factory: (ctx) => { + t.equals(ctx.globalValue, 'global', 'context factory receives global context'); + return { value: 'local' }; + } + } + }); + + const context = await component.context({ globalValue: 'global' }); + + t.equals(context.test.value, 'local', 'context namespaced value is correct'); + t.equals(context.globalValue, 'global', 'context.globalValue is correct'); + + +}); + +test('data source injection', async (t) => { + t.plan(2); + + const dataSource = new class TestDataSource implements IDataSource { + name = 'TestDataSource'; + value = 'original'; + }; + + const component = new GraphQLComponent({ + dataSources: [ + dataSource + ] + }); + + const context = await component.context({ globalValue: 'global' }); + + t.ok(context.dataSources.TestDataSource, 'data source is correctly injected'); + t.equal(context.dataSources.TestDataSource.value, 'original', 'data source is correctly injected'); +}); + +test('data source injection', async (t) => { + t.plan(2); + + const dataSource = new class TestDataSource implements IDataSource { + name = 'TestDataSource'; + value = 'original'; + }; + + const dataSourceOverride = new class MockTestDataSource implements IDataSource { + name = 'TestDataSource'; + value = 'override'; + }; + + const component = new GraphQLComponent({ + dataSources: [ + dataSource + ], + dataSourceOverrides: [ + dataSourceOverride + ] + }); + + const context = await component.context({ globalValue: 'global' }); + + t.ok(context.dataSources.TestDataSource, 'data source is correctly injected'); + t.equal(context.dataSources.TestDataSource.value, 'override', 'data source is correctly injected'); +}); + +test('transform with custom directive', async (t) => { + t.plan(1); + + const types = ` + directive @customDirective(argName: String) on FIELD_DEFINITION + + type Query { + hello: String @customDirective(argName: "example") + } + `; + + const resolvers = { + Query: { + hello: () => 'Hello world!' + } + }; + + const customDirective = new GraphQLDirective({ + name: 'customDirective', + locations: [DirectiveLocation.FIELD_DEFINITION], + args: { + argName: { type: GraphQLString } + } + }); + + const component = new GraphQLComponent({ + types, + resolvers, + transforms: [ + { + [MapperKind.FIELD]: (fieldConfig) => { + const directives = fieldConfig.astNode?.directives || []; + if (directives.some(directive => directive.name.value === 'customDirective')) { + fieldConfig.description = 'This field has a custom directive'; + } + return fieldConfig; + } + } + ] + }); + + const transformedSchema = component.schema; + + const query = ` + { + __type(name: "Query") { + fields { + name + description + } + } + } + `; + + const result = await graphql(transformedSchema, query); + + t.equal(result.data?.__type?.fields.find(field => field.name === 'hello')?.description, 'This field has a custom directive', 'custom directive is correctly applied'); +}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index f354069..b0238e9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,6 @@ "target": "esnext", "lib": ["esnext"], "noImplicitAny": false, - "suppressImplicitAnyIndexErrors": true, "moduleResolution": "node", "emitDecoratorMetadata": true, "inlineSourceMap": true, From 1518635b40cb4036cf1578a0f17bc0c21c9d07ca Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Fri, 15 Nov 2024 16:47:39 -0600 Subject: [PATCH 05/40] Fixed examples, fixed dataSources in contrext. --- .../property-component/resolvers.ts | 4 +- examples/composition/server/index.ts | 2 +- package.json | 4 +- src/index.ts | 162 +++++++++--------- test/test.ts | 1 - 5 files changed, 84 insertions(+), 89 deletions(-) diff --git a/examples/composition/property-component/resolvers.ts b/examples/composition/property-component/resolvers.ts index 5c58aa8..6ae48dd 100644 --- a/examples/composition/property-component/resolvers.ts +++ b/examples/composition/property-component/resolvers.ts @@ -2,8 +2,8 @@ export const resolvers = { Query: { - property(_, { id }, { dataSources }) { - return dataSources.PropertyDataSource.getPropertyById(id); + property(_, { id }, context) { + return context.dataSources.PropertyDataSource.getPropertyById(id); } } }; diff --git a/examples/composition/server/index.ts b/examples/composition/server/index.ts index f85544c..08c9056 100644 --- a/examples/composition/server/index.ts +++ b/examples/composition/server/index.ts @@ -4,7 +4,7 @@ const ListingComponent = require('../listing-component'); const { schema, context } = new ListingComponent(); -const server = new ApolloServer({ schema, context, tracing: true }); +const server = new ApolloServer({ schema, context, tracing: false }); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`) diff --git a/package.json b/package.json index 4de939f..64c49a2 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "build": "tsc", "prepublish": "npm run build", "test": "ts-node node_modules/.bin/tape test/**.ts", - "start-composition": "DEBUG=graphql-component node examples/composition/server/index.js", - "start-federation": "DEBUG=graphql-component node examples/federation/run-federation-example.js", + "start-composition": "DEBUG=graphql-component ts-node examples/composition/server/index.ts", + "start-federation": "DEBUG=graphql-component ts-node examples/federation/run-federation-example.ts", "lint": "eslint lib", "cover": "nyc npm test" }, diff --git a/src/index.ts b/src/index.ts index 8033d11..ff1a9d8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -69,7 +69,6 @@ export interface IGraphQLComponent { readonly resolvers: IResolvers; readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; - overrideDataSources: (dataSources: DataSourceMap, context: any) => void federation?: boolean; } @@ -85,7 +84,7 @@ export default class GraphQLComponent implements IGraphQLComponent { _pruneSchema: boolean; _pruneSchemaOptions: PruneSchemaOptions _federation: boolean; - _dataSourceInjection: DataSourceInjectionFunction; + _dataSourceContextInject: DataSourceInjectionFunction; _transforms: SchemaMapper[] constructor({ @@ -116,6 +115,8 @@ export default class GraphQLComponent implements IGraphQLComponent { this._dataSourceOverrides = dataSourceOverrides || []; + this._dataSourceContextInject = createDataSourceContextInjector(this._dataSources, this._dataSourceOverrides); + this._pruneSchema = pruneSchema; this._pruneSchemaOptions = pruneSchemaOptions; @@ -138,24 +139,24 @@ export default class GraphQLComponent implements IGraphQLComponent { this._context = async (globalContext: any): Promise => { - const ctx = Object.assign({}, globalContext); + const ctx = { + dataSources: this._dataSourceContextInject({ globalContext }) + }; for (const { component } of this.imports) { - Object.assign(ctx, await component.context(ctx)); + const { dataSources, ...importedContext } = await component.context(globalContext); + Object.assign(ctx.dataSources, dataSources); + Object.assign(ctx, importedContext); } - + if (context) { debug(`building ${context.namespace} context`); if (!ctx[context.namespace]) { ctx[context.namespace] = {}; } - - if (ctx[context.namespace]) { - - } - Object.assign(ctx[context.namespace], await context.factory.call(this, ctx)); + Object.assign(ctx[context.namespace], await context.factory.call(this, globalContext)); } return ctx; @@ -163,9 +164,39 @@ export default class GraphQLComponent implements IGraphQLComponent { } - overrideDataSources(dataSources: DataSourceMap, context: any): void { - Object.assign(dataSources, this._dataSourceInjection(context)); - return; + get context(): IContextWrapper { + const middleware = []; + + const contextFn = async (context): Promise => { + debug(`building root context`); + + for (let { name, fn } of middleware) { + debug(`applying ${name} middleware`); + context = await fn(context); + } + + const componentContext = await this._context(context); + + const globalContext = { + ...context, + ...componentContext + }; + + //globalContext.dataSources = this._dataSourceContextInject({ globalContext }); + + return globalContext; + }; + + contextFn.use = function (name, fn) { + if (typeof name === 'function') { + fn = name; + name = 'unknown'; + } + debug(`adding ${name} middleware`); + middleware.push({ name, fn }); + }; + + return contextFn; } get name(): string { @@ -243,75 +274,6 @@ export default class GraphQLComponent implements IGraphQLComponent { return this._schema; } - get context(): IContextWrapper { - const middleware = []; - const contextFunction = this._context; - - const dataSourceInject = (context: any = {}): DataSourceMap => { - const intercept = (instance: IDataSource, context: any) => { - debug(`intercepting ${instance.constructor.name}`); - - return new Proxy(instance, { - get(target, key) { - if (typeof target[key] !== 'function' || key === instance.constructor.name) { - return target[key]; - } - const original = target[key]; - - return function (...args) { - return original.call(instance, context, ...args); - }; - } - }) as any as DataSource; - }; - - const dataSources = {}; - - // Inject data sources - for (const dataSource of this._dataSources) { - dataSources[dataSource.name] = intercept(dataSource, context); - } - - // Override data sources - for (const dataSourceOverride of this._dataSourceOverrides) { - dataSources[dataSourceOverride.name] = intercept(dataSourceOverride, context); - } - - return dataSources; - }; - - const context = async (context): Promise => { - debug(`building root context`); - - for (let { name, fn } of middleware) { - debug(`applying ${name} middleware`); - context = await fn(context); - } - - const componentContext = await contextFunction(context); - - const globalContext = { - ...context, - ...componentContext - }; - - globalContext.dataSources = dataSourceInject(globalContext); - - return globalContext; - }; - - context.use = function (name, fn) { - if (typeof name === 'function') { - fn = name; - name = 'unknown'; - } - debug(`adding ${name} middleware`); - middleware.push({ name, fn }); - }; - - return context; - } - get types(): TypeSource { return this._types; } @@ -337,11 +299,45 @@ export default class GraphQLComponent implements IGraphQLComponent { } get dataSourceInjection(): DataSourceInjectionFunction { - return this._dataSourceInjection; + return this._dataSourceContextInject; } } +const createDataSourceContextInjector = (dataSources: IDataSource[], dataSourceOverrides: IDataSource[]): DataSourceInjectionFunction => { + const intercept = (instance: IDataSource, context: any) => { + debug(`intercepting ${instance.constructor.name}`); + + return new Proxy(instance, { + get(target, key) { + if (typeof target[key] !== 'function' || key === instance.constructor.name) { + return target[key]; + } + const original = target[key]; + + return function (...args) { + return original.call(instance, context, ...args); + }; + } + }) as any as DataSource; + }; + + return (context: any = {}): DataSourceMap => { + const proxiedDataSources = {}; + + // Inject data sources + for (const dataSource of dataSources) { + proxiedDataSources[dataSource.name] = intercept(dataSource, context); + } + + // Override data sources + for (const dataSourceOverride of dataSourceOverrides) { + proxiedDataSources[dataSourceOverride.name] = intercept(dataSourceOverride, context); + } + + return proxiedDataSources; + }; +}; /** * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided diff --git a/test/test.ts b/test/test.ts index dc5c2c5..b12a736 100644 --- a/test/test.ts +++ b/test/test.ts @@ -202,7 +202,6 @@ test('context', async (t) => { t.equals(context.test.value, 'local', 'context namespaced value is correct'); t.equals(context.globalValue, 'global', 'context.globalValue is correct'); - }); From 8b450f2fa4d8aea0e857cf5151c0b1ef92c30824 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Mon, 18 Nov 2024 15:43:11 -0600 Subject: [PATCH 06/40] added some documentation --- dist/index.d.ts | 11 +- dist/index.js | 157 +++++++++--------- .../listing-component/resolvers.ts | 6 +- src/index.ts | 23 ++- 4 files changed, 104 insertions(+), 93 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index f11df46..3d29392 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -44,10 +44,10 @@ export interface IGraphQLComponent { readonly context: IContextWrapper; readonly types: TypeSource; readonly resolvers: IResolvers; - readonly imports?: IGraphQLComponentConfigObject[]; + readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; + readonly dataSourcesOverrides?: IDataSource[]; federation?: boolean; - overrideDataSources: (dataSources: DataSourceMap, context: any) => void; } export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; @@ -61,18 +61,17 @@ export default class GraphQLComponent implements IGraphQLComponent { _pruneSchema: boolean; _pruneSchemaOptions: PruneSchemaOptions; _federation: boolean; - _dataSourceInjection: DataSourceInjectionFunction; + _dataSourceContextInject: DataSourceInjectionFunction; _transforms: SchemaMapper[]; constructor({ types, resolvers, mocks, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, federation, transforms }: IGraphQLComponentOptions); - overrideDataSources(dataSources: DataSourceMap, context: any): void; + get context(): IContextWrapper; get name(): string; get schema(): GraphQLSchema; - get context(): IContextWrapper; get types(): TypeSource; get resolvers(): IResolvers; get imports(): IGraphQLComponentConfigObject[]; get dataSources(): IDataSource[]; + get dataSourcesOverrides(): IDataSource[]; set federation(flag: boolean); get federation(): boolean; - get dataSourceInjection(): DataSourceInjectionFunction; } diff --git a/dist/index.js b/dist/index.js index e5a3ff6..1029113 100644 --- a/dist/index.js +++ b/dist/index.js @@ -20,7 +20,7 @@ class GraphQLComponent { _pruneSchema; _pruneSchemaOptions; _federation; - _dataSourceInjection; + _dataSourceContextInject; _transforms; constructor({ types, resolvers, mocks, imports, context, dataSources, dataSourceOverrides, pruneSchema, pruneSchemaOptions, federation, transforms }) { this._types = Array.isArray(types) ? types : [types]; @@ -30,13 +30,11 @@ class GraphQLComponent { this._transforms = transforms; this._dataSources = dataSources || []; this._dataSourceOverrides = dataSourceOverrides || []; + this._dataSourceContextInject = createDataSourceContextInjector(this._dataSources, this._dataSourceOverrides); this._pruneSchema = pruneSchema; this._pruneSchemaOptions = pruneSchemaOptions; this._imports = imports && imports.length > 0 ? imports.map((i) => { - // check for a GraphQLComponent instance to construct a configuration object from it if (i instanceof GraphQLComponent) { - // if the importing component (ie. this component) has federation set to true - set federation: true - // for all of its imported components if (this._federation === true) { i.federation = true; } @@ -50,24 +48,49 @@ class GraphQLComponent { return importConfiguration; } }) : []; - this._context = async () => { - const ctx = {}; + this._context = async (globalContext) => { + const ctx = { + dataSources: this._dataSourceContextInject({ globalContext }) + }; for (const { component } of this.imports) { - Object.assign(ctx, await component.context(context)); + const { dataSources, ...importedContext } = await component.context(globalContext); + Object.assign(ctx.dataSources, dataSources); + Object.assign(ctx, importedContext); } if (context) { debug(`building ${context.namespace} context`); if (!ctx[context.namespace]) { ctx[context.namespace] = {}; } - Object.assign(ctx[context.namespace], await context.factory.call(this, context)); + Object.assign(ctx[context.namespace], await context.factory.call(this, globalContext)); } return ctx; }; } - overrideDataSources(dataSources, context) { - Object.assign(dataSources, this._dataSourceInjection(context)); - return; + get context() { + const middleware = []; + const contextFn = async (context) => { + debug(`building root context`); + for (let { name, fn } of middleware) { + debug(`applying ${name} middleware`); + context = await fn(context); + } + const componentContext = await this._context(context); + const globalContext = { + ...context, + ...componentContext + }; + return globalContext; + }; + contextFn.use = function (name, fn) { + if (typeof name === 'function') { + fn = name; + name = 'unknown'; + } + debug(`adding ${name} middleware`); + middleware.push({ name, fn }); + }; + return contextFn; } get name() { return this.constructor.name; @@ -79,7 +102,7 @@ class GraphQLComponent { let makeSchema = undefined; if (this._federation) { makeSchema = (schemaConfig) => { - return (0, federation_1.buildFederatedSchema)(schemaConfig); //TODO: custom schema directives (alternative to SchemaDirectiveVisitor) + return (0, federation_1.buildFederatedSchema)(schemaConfig); }; } else { @@ -110,7 +133,6 @@ class GraphQLComponent { }; this._schema = makeSchema(schemaConfig); } - //TODO: add documentation if (this._transforms) { this._schema = transformSchema(this._schema, this._transforms); } @@ -132,67 +154,6 @@ class GraphQLComponent { debug(`created schema for ${this.name}`); return this._schema; } - get context() { - const middleware = []; - const contextFunction = this._context; - //TODO: FIX THIS - const dataSourceInject = (context = {}) => { - const intercept = (instance, context) => { - debug(`intercepting ${instance.constructor.name}`); - return new Proxy(instance, { - get(target, key) { - if (typeof target[key] !== 'function' || key === instance.constructor.name) { - return target[key]; - } - const original = target[key]; - return function (...args) { - return original.call(instance, context, ...args); - }; - } - }); - }; - const dataSources = {}; - // for (const { component } of this.imports) { - // component.overrideDataSources(dataSources, dataSourceInject(context)); - // } - for (const override of this._dataSourceOverrides) { - debug(`overriding datasource ${override.constructor.name}`); - dataSources[override.constructor.name] = intercept(override, context); - } - if (this.dataSources && this.dataSources.length > 0) { - for (const dataSource of this.dataSources) { - const name = dataSource.constructor.name; - if (!dataSources[name]) { - dataSources[name] = intercept(dataSource, context); - } - } - } - return dataSources; - }; - const context = async (context) => { - debug(`building root context`); - for (let { name, fn } of middleware) { - debug(`applying ${name} middleware`); - context = await fn(context); - } - const componentContext = await contextFunction(context); - const globalContext = { - ...context, - ...componentContext - }; - globalContext.dataSources = dataSourceInject(globalContext); - return globalContext; - }; - context.use = function (name, fn) { - if (typeof name === 'function') { - fn = name; - name = 'unknown'; - } - debug(`adding ${name} middleware`); - middleware.push({ name, fn }); - }; - return context; - } get types() { return this._types; } @@ -205,17 +166,51 @@ class GraphQLComponent { get dataSources() { return this._dataSources; } + get dataSourcesOverrides() { + return this._dataSourceOverrides; + } set federation(flag) { this._federation = flag; } get federation() { return this._federation; } - get dataSourceInjection() { - return this._dataSourceInjection; - } } exports.default = GraphQLComponent; +/** + * Wraps data sources with a proxy that intercepts calls to data source methods and injects the current context + * @param {IDataSource[]} dataSources + * @param {IDataSource[]} dataSourceOverrides + * @returns {DataSourceInjectionFunction} a function that returns a map of data sources with methods that have been intercepted + */ +const createDataSourceContextInjector = (dataSources, dataSourceOverrides) => { + const intercept = (instance, context) => { + debug(`intercepting ${instance.constructor.name}`); + return new Proxy(instance, { + get(target, key) { + if (typeof target[key] !== 'function' || key === instance.constructor.name) { + return target[key]; + } + const original = target[key]; + return function (...args) { + return original.call(instance, context, ...args); + }; + } + }); + }; + return (context = {}) => { + const proxiedDataSources = {}; + // Inject data sources + for (const dataSource of dataSources) { + proxiedDataSources[dataSource.name] = intercept(dataSource, context); + } + // Override data sources + for (const dataSourceOverride of dataSourceOverrides) { + proxiedDataSources[dataSourceOverride.name] = intercept(dataSourceOverride, context); + } + return proxiedDataSources; + }; +}; /** * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided * @param {string} parentType - the type whose field resolver is being @@ -289,6 +284,12 @@ const bindResolvers = function (bindContext, resolvers = {}) { } return boundResolvers; }; +/** + * Transforms a schema using the provided transforms + * @param {GraphQLSchema} schema The schema to transform + * @param {SchemaMapper[]} transforms An array of schema transforms + * @returns {GraphQLSchema} The transformed schema + */ const transformSchema = function (schema, transforms) { const functions = {}; const mapping = {}; @@ -312,4 +313,4 @@ const transformSchema = function (schema, transforms) { } return (0, utils_1.mapSchema)(schema, mapping); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBUztJQUNmLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQixvQkFBb0IsQ0FBOEI7SUFDbEQsV0FBVyxDQUFnQjtJQUUzQixZQUFZLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsRUFDZTtRQUV6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxV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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBUztJQUNmLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUUzQixZQUFZLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsRUFDZTtRQUV6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDO1FBRXRDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7UUFFdEQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLCtCQUErQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFOUcsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFFaEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO1FBRTlDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBbUQsRUFBRSxFQUFFO1lBQ2xILElBQUksQ0FBQyxZQUFZLGdCQUFnQixFQUFFO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO29CQUM3QixDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDckI7Z0JBQ0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUN6QjtpQkFDSTtnQkFDSCxNQUFNLG1CQUFtQixHQUFHLENBQWtDLENBQUM7Z0JBQy9ELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQUU7b0JBQzdCLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2lCQUNqRDtnQkFDRCxPQUFPLG1CQUFtQixDQUFDO2FBQzVCO1FBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUdSLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxFQUFFLGFBQWtCLEVBQWdCLEVBQUU7WUFDekQsTUFBTSxHQUFHLEdBQUc7Z0JBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDO2FBQzlELENBQUM7WUFFRixLQUFLLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUN4QyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsZUFBZSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2FBQ3JDO1lBRUQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsS0FBSyxDQUFDLFlBQVksT0FBTyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUM7Z0JBRS9DLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUMzQixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDN0I7Z0JBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDeEY7WUFFRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQztJQUVKLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFFdEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBZ0IsRUFBRTtZQUNoRCxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUUvQixLQUFLLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksVUFBVSxFQUFFO2dCQUNuQyxLQUFLLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDN0I7WUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0RCxNQUFNLGFBQWEsR0FBRztnQkFDcEIsR0FBRyxPQUFPO2dCQUNWLEdBQUcsZ0JBQWdCO2FBQ3BCLENBQUM7WUFFRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFFRixTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsSUFBSSxFQUFFLEVBQUU7WUFDaEMsSUFBSSxPQUFPLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQzlCLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQ1YsSUFBSSxHQUFHLFNBQVMsQ0FBQzthQUNsQjtZQUNELEtBQUssQ0FBQyxVQUFVLElBQUksYUFBYSxDQUFDLENBQUM7WUFDbkMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxVQUFVLEdBQXlDLFNBQVMsQ0FBQztRQUVqRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsVUFBVSxHQUFHLENBQUMsWUFBWSxFQUFpQixFQUFFO2dCQUMzQyxPQUFPLElBQUEsaUNBQW9CLEVBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDO1NBQ0g7YUFDSTtZQUNILFVBQVUsR0FBRyw2QkFBb0IsQ0FBQztTQUNuQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLDRFQUE0RTtZQUM1RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMzQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Z0JBRTlDLE9BQU87b0JBQ0wsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO29CQUN4QixHQUFHLGFBQWE7aUJBQ2pCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILDZEQUE2RDtZQUM3RCwrREFBK0Q7WUFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFBLHNCQUFhLEVBQUM7Z0JBQzNCLFVBQVU7Z0JBQ1YsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzFCLGVBQWUsRUFBRSxJQUFJO2FBQ3RCLENBQUMsQ0FBQztTQUNKO2FBQ0k7WUFDSCxNQUFNLFlBQVksR0FBRztnQkFDbkIsUUFBUSxFQUFFLElBQUEscUJBQWEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDM0IsQ0FBQTtZQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3pGLEtBQUssQ0FBQywwQ0FBMEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDN0QsK0RBQStEO1lBQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7U0FDbEY7YUFDSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDckUsS0FBSyxDQUFDLHlDQUF5QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM1RCwyREFBMkQ7WUFDM0QsZ0ZBQWdGO1lBQ2hGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7U0FDdEc7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsS0FBSyxDQUFDLDBCQUEwQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsbUJBQVcsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3BFO1FBRUQsS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV6QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBRUY7QUFwT0QsbUNBb09DO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLCtCQUErQixHQUFHLENBQUMsV0FBMEIsRUFBRSxtQkFBa0MsRUFBK0IsRUFBRTtJQUN0SSxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQXFCLEVBQUUsT0FBWSxFQUFFLEVBQUU7UUFDeEQsS0FBSyxDQUFDLGdCQUFnQixRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbkQsT0FBTyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDekIsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHO2dCQUNiLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssVUFBVSxJQUFJLEdBQUcsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtvQkFDMUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BCO2dCQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFN0IsT0FBTyxVQUFVLEdBQUcsSUFBSTtvQkFDdEIsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDO1lBQ0osQ0FBQztTQUNGLENBQXVDLENBQUM7SUFDM0MsQ0FBQyxDQUFDO0lBRUYsT0FBTyxDQUFDLFVBQWUsRUFBRSxFQUFpQixFQUFFO1FBQzFDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRTlCLHNCQUFzQjtRQUN0QixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtZQUNwQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN0RTtRQUVELHdCQUF3QjtRQUN4QixLQUFLLE1BQU0sa0JBQWtCLElBQUksbUJBQW1CLEVBQUU7WUFDcEQsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3RGO1FBRUQsT0FBTyxrQkFBa0IsQ0FBQztJQUM1QixDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNGLE1BQU0sT0FBTyxHQUFHLFVBQVUsVUFBa0IsRUFBRSxTQUFpQixFQUFFLE9BQXlCO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFFN0IsT0FBTyxTQUFTLGlCQUFpQixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUk7UUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBRTlDLEtBQUssQ0FBQyxhQUFhLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFakMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLEtBQUssQ0FBQyxvQ0FBb0MsVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDckUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEI7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxHQUFHLEVBQUUsQ0FBQztTQUNiO1FBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFFckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFNUIsS0FBSyxDQUFDLFVBQVUsVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFM0MsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNILE1BQU0sYUFBYSxHQUFHLFVBQVUsV0FBOEIsRUFBRSxZQUF3QixFQUFFO0lBQ3hGLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUUxQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUN0RCw4REFBOEQ7UUFDOUQsSUFBSSxNQUFNLFlBQVksMkJBQWlCLEVBQUU7WUFDdkMsS0FBSyxDQUFDLGVBQWUsSUFBSSxtQkFBbUIsSUFBSSxnREFBZ0QsQ0FBQyxDQUFBO1lBQ2pHLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDOUIsU0FBUztTQUNWO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6QixjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQzNCO1FBRUQsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQzVDLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2FBQ2hGO2lCQUNJO2dCQUNILHlDQUF5QztnQkFDekMsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7b0JBQ2xDLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUNsQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDMUQ7cUJBQ0k7b0JBQ0gsS0FBSyxDQUFDLGVBQWUsSUFBSSxJQUFJLEtBQUssVUFBVSxLQUFLLDhCQUE4QixDQUFDLENBQUM7b0JBQ2pGLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUM7aUJBQ3hDO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLGVBQWUsR0FBRyxVQUFVLE1BQXFCLEVBQUUsVUFBMEI7SUFDakYsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUVuQixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtRQUNoQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVyxHQUFHO29CQUMzQixPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUU7d0JBQzVCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDdEMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDbEIsSUFBSSxDQUFDLEdBQUcsRUFBRTs0QkFDUixNQUFNO3lCQUNQO3FCQUNGO29CQUNELE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUMsQ0FBQTthQUNGO1lBQ0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtLQUNKO0lBRUQsT0FBTyxJQUFBLGlCQUFTLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/examples/composition/listing-component/resolvers.ts b/examples/composition/listing-component/resolvers.ts index faec880..8c43e74 100644 --- a/examples/composition/listing-component/resolvers.ts +++ b/examples/composition/listing-component/resolvers.ts @@ -1,6 +1,6 @@ 'use strict'; -import { delegateToSchema } from '@graphql-tools/delegate'; +import { delegateToSchema, IDelegateToSchemaOptions } from '@graphql-tools/delegate'; export const resolvers = { Query: { @@ -19,10 +19,10 @@ export const resolvers = { info }); }, - reviews(root, args, context, info) { + reviews(root, args, context, info) {; return delegateToSchema({ schema: this.reviewsComponent.schema, - operation: 'query', + operationName: 'query', fieldName: 'reviewsByPropertyId', args: { propertyId: root.id diff --git a/src/index.ts b/src/index.ts index ff1a9d8..1436d7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -69,6 +69,7 @@ export interface IGraphQLComponent { readonly resolvers: IResolvers; readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; + readonly dataSourcesOverrides?: IDataSource[]; federation?: boolean; } @@ -182,8 +183,6 @@ export default class GraphQLComponent implements IGraphQLComponent { ...componentContext }; - //globalContext.dataSources = this._dataSourceContextInject({ globalContext }); - return globalContext; }; @@ -290,6 +289,10 @@ export default class GraphQLComponent implements IGraphQLComponent { return this._dataSources; } + get dataSourcesOverrides(): IDataSource[] { + return this._dataSourceOverrides; + } + set federation(flag) { this._federation = flag; } @@ -298,12 +301,14 @@ export default class GraphQLComponent implements IGraphQLComponent { return this._federation; } - get dataSourceInjection(): DataSourceInjectionFunction { - return this._dataSourceContextInject; - } - } +/** + * Wraps data sources with a proxy that intercepts calls to data source methods and injects the current context + * @param {IDataSource[]} dataSources + * @param {IDataSource[]} dataSourceOverrides + * @returns {DataSourceInjectionFunction} a function that returns a map of data sources with methods that have been intercepted + */ const createDataSourceContextInjector = (dataSources: IDataSource[], dataSourceOverrides: IDataSource[]): DataSourceInjectionFunction => { const intercept = (instance: IDataSource, context: any) => { debug(`intercepting ${instance.constructor.name}`); @@ -428,6 +433,12 @@ const bindResolvers = function (bindContext: IGraphQLComponent, resolvers: IReso return boundResolvers; }; +/** + * Transforms a schema using the provided transforms + * @param {GraphQLSchema} schema The schema to transform + * @param {SchemaMapper[]} transforms An array of schema transforms + * @returns {GraphQLSchema} The transformed schema + */ const transformSchema = function (schema: GraphQLSchema, transforms: SchemaMapper[]) { const functions = {}; const mapping = {}; From 44056567284cda0b21c1ff3504562dd7077a7630 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 19 Nov 2024 09:37:34 -0600 Subject: [PATCH 07/40] Added more tests --- test/test.ts | 65 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/test/test.ts b/test/test.ts index b12a736..3c1f939 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,7 +1,6 @@ - import { DirectiveLocation, MapperKind, mapSchema } from '@graphql-tools/utils'; import { RenameTypes, SchemaDirectiveVisitor } from 'apollo-server'; -import { graphql, GraphQLDirective, GraphQLFieldConfig, GraphQLSchema, GraphQLString } from 'graphql'; +import { graphql, GraphQLDirective, GraphQLFieldConfig, GraphQLSchema, GraphQLString, printSchema } from 'graphql'; import { test } from 'tape'; import GraphQLComponent, { IDataSource } from '../src'; @@ -310,4 +309,64 @@ test('transform with custom directive', async (t) => { const result = await graphql(transformedSchema, query); t.equal(result.data?.__type?.fields.find(field => field.name === 'hello')?.description, 'This field has a custom directive', 'custom directive is correctly applied'); -}); \ No newline at end of file +}); + +test('schema composition', async (t) => { + t.plan(2); + + const component = new GraphQLComponent({ + imports: [ + new GraphQLComponent({ + types: ` + type Property { + id: ID! + name: String + } + ` + }), + new GraphQLComponent({ + types: ` + type Review { + id: ID! + content: String + } + ` + }) + ] + }); + + const schema = component.schema; + + t.ok(schema.getType('Property'), 'Property type is present in the composed schema'); + t.ok(schema.getType('Review'), 'Review type is present in the composed schema'); +}); + +test('schema pruning', async (t) => { + t.plan(2); + + const component = new GraphQLComponent({ + types: ` + type Query { + hello: UsedType + } + type UsedType { + id: ID! + } + type UnusedType { + id: ID! + } + `, + resolvers: { + Query: { + hello: () => 'Hello world!' + } + }, + pruneSchema: true + }); + + const schema = component.schema; + + t.ok(schema.getType('UsedType'), 'UsedType type is present in the composed schema'); + t.ok(!schema.getType('UnusedType'), 'unused type is pruned from the schema'); +}); + From 3d8db332ea05f7f9260eaff96e654c61d4797dce Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 19 Nov 2024 09:55:56 -0600 Subject: [PATCH 08/40] fallback name for data sources is the class name --- dist/index.js | 6 +++--- examples/federation/property-service/index.js | 2 +- examples/federation/reviews-service/index.js | 2 +- package.json | 2 +- src/index.ts | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/index.js b/dist/index.js index 1029113..3811110 100644 --- a/dist/index.js +++ b/dist/index.js @@ -202,11 +202,11 @@ const createDataSourceContextInjector = (dataSources, dataSourceOverrides) => { const proxiedDataSources = {}; // Inject data sources for (const dataSource of dataSources) { - proxiedDataSources[dataSource.name] = intercept(dataSource, context); + proxiedDataSources[dataSource.name || dataSource.constructor.name] = intercept(dataSource, context); } // Override data sources for (const dataSourceOverride of dataSourceOverrides) { - proxiedDataSources[dataSourceOverride.name] = intercept(dataSourceOverride, context); + proxiedDataSources[dataSourceOverride.name || dataSourceOverride.constructor.name] = intercept(dataSourceOverride, context); } return proxiedDataSources; }; @@ -313,4 +313,4 @@ const transformSchema = function (schema, transforms) { } return (0, utils_1.mapSchema)(schema, mapping); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBUztJQUNmLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUUzQixZQUFZLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsRUFDZTtRQUV6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxV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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBUztJQUNmLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUUzQixZQUFZLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsRUFDZTtRQUV6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxV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 \ No newline at end of file diff --git a/examples/federation/property-service/index.js b/examples/federation/property-service/index.js index a6b7c78..47402be 100644 --- a/examples/federation/property-service/index.js +++ b/examples/federation/property-service/index.js @@ -1,7 +1,7 @@ 'use strict'; const { ApolloServer } = require('apollo-server'); -const GraphQLComponent = require('../../../lib'); +const GraphQLComponent = require('../../../dist').default; const PropertyDataSource = require('./datasource'); const resolvers = require('./resolvers'); const types = require('./types'); diff --git a/examples/federation/reviews-service/index.js b/examples/federation/reviews-service/index.js index 2600fe4..03740e4 100644 --- a/examples/federation/reviews-service/index.js +++ b/examples/federation/reviews-service/index.js @@ -1,7 +1,7 @@ 'use strict'; const { ApolloServer } = require('apollo-server'); -const GraphQLComponent = require('../../../lib'); +const GraphQLComponent = require('../../../dist').default; const ReviewsDataSource = require('./datasource'); const resolvers = require('./resolvers'); const types = require('./types'); diff --git a/package.json b/package.json index 64c49a2..8c3dfac 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "prepublish": "npm run build", "test": "ts-node node_modules/.bin/tape test/**.ts", "start-composition": "DEBUG=graphql-component ts-node examples/composition/server/index.ts", - "start-federation": "DEBUG=graphql-component ts-node examples/federation/run-federation-example.ts", + "start-federation": "DEBUG=graphql-component node examples/federation/run-federation-example.js", "lint": "eslint lib", "cover": "nyc npm test" }, diff --git a/src/index.ts b/src/index.ts index 1436d7c..da90e40 100644 --- a/src/index.ts +++ b/src/index.ts @@ -332,12 +332,12 @@ const createDataSourceContextInjector = (dataSources: IDataSource[], dataSourceO // Inject data sources for (const dataSource of dataSources) { - proxiedDataSources[dataSource.name] = intercept(dataSource, context); + proxiedDataSources[dataSource.name || dataSource.constructor.name] = intercept(dataSource, context); } // Override data sources for (const dataSourceOverride of dataSourceOverrides) { - proxiedDataSources[dataSourceOverride.name] = intercept(dataSourceOverride, context); + proxiedDataSources[dataSourceOverride.name || dataSourceOverride.constructor.name] = intercept(dataSourceOverride, context); } return proxiedDataSources; From 7dab075386c7e18483861e2a50c0df1dd7de1ecc Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 19 Nov 2024 09:56:44 -0600 Subject: [PATCH 09/40] latest build --- dist/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/index.js b/dist/index.js index 3811110..a94ee57 100644 --- a/dist/index.js +++ b/dist/index.js @@ -313,4 +313,4 @@ const transformSchema = function (schema, transforms) { } return (0, utils_1.mapSchema)(schema, mapping); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBUztJQUNmLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUUzQixZQUFZLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsRUFDZTtRQUV6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxV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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBUztJQUNmLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUUzQixZQUFZLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsRUFDZTtRQUV6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxV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 \ No newline at end of file From 3602b8f7caeed3c0f70b86d6c7e7f24012b75b26 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 19 Nov 2024 10:13:00 -0600 Subject: [PATCH 10/40] added a resolve binding test --- test/test.ts | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/test/test.ts b/test/test.ts index 3c1f939..65eef2a 100644 --- a/test/test.ts +++ b/test/test.ts @@ -370,3 +370,42 @@ test('schema pruning', async (t) => { t.ok(!schema.getType('UnusedType'), 'unused type is pruned from the schema'); }); +test('resolver binding', async (t) => { + t.plan(1); + + class MyComponent extends GraphQLComponent { + value: string; + + constructor(options) { + super(options); + this.value = 'Hello world!'; + } + }; + + const component = new MyComponent({ + types: ` + type Query { + hello: String + } + `, + resolvers: { + Query: { + hello() { + return this.value; + } + } + } + }); + + const schema = component.schema; + + const query = ` + { + hello + } + `; + + const result = await graphql(schema, query, null, {}); + + t.equal(result.data?.hello, 'Hello world!', 'resolver correctly binds to context'); +}); \ No newline at end of file From 21c993e572e8be15d024b041c2070a449bde4535 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 19 Nov 2024 10:24:13 -0600 Subject: [PATCH 11/40] added a memoize test --- test/test.ts | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/test.ts b/test/test.ts index 65eef2a..9fc9038 100644 --- a/test/test.ts +++ b/test/test.ts @@ -408,4 +408,41 @@ test('resolver binding', async (t) => { const result = await graphql(schema, query, null, {}); t.equal(result.data?.hello, 'Hello world!', 'resolver correctly binds to context'); +}); + +test('resolve memoization', async (t) => { + t.plan(1); + + let count = 0; + + const component = new GraphQLComponent({ + types: ` + type Query { + hello: String + } + `, + resolvers: { + Query: { + hello: () => { + count++; + return 'Hello world!'; + } + } + } + }); + + const schema = component.schema; + + const query = ` + { + hello + } + `; + + const ctx = {}; + + const result1 = await graphql(schema, query, null, ctx, { operationName: 'first' }); + const result2 = await graphql(schema, query, null, ctx, { operationName: 'second' }); + + t.equal(count, 1, 'resolver is memoized'); }); \ No newline at end of file From 50ff5cd1d0ca0fbb7ad95a5427263a9962cd6dd7 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 19 Nov 2024 17:20:44 -0600 Subject: [PATCH 12/40] added more test coverage --- .nycrc | 11 ----- TODO.md | 10 +++- package.json | 5 +- src/index.ts | 11 +++-- test/test.ts | 134 +++++++++++++++++++++++++++++++++++++++++++++++--- tsconfig.json | 3 +- 6 files changed, 146 insertions(+), 28 deletions(-) delete mode 100644 .nycrc diff --git a/.nycrc b/.nycrc deleted file mode 100644 index 47b8989..0000000 --- a/.nycrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "check-coverage": true, - "statements": 80, - "branches": 80, - "functions": 80, - "lines": 80, - "exclude": [ - "**/__tests__.js" - ], - "reporter": ["html", "text"] -} \ No newline at end of file diff --git a/TODO.md b/TODO.md index d278b88..cfb438b 100644 --- a/TODO.md +++ b/TODO.md @@ -1,9 +1,15 @@ Remaining to-dos for version 4: +- [ ] More test coverage - [x] Alternative for schema directive visitor (add custom directives after creating federated schema) - [x] Document transforms, including directives - [x] Fix context injection - [ ] IGraphQLComponentConfigObject documentation -- [ ] SubschemaConfig documentation - [x] Fix composition examples -- [ ] Fix federations examples \ No newline at end of file +- [x] Fix federations examples +- [ ] Revert composition examples to JS again +- [ ] Update readme + - [ ] Repository structure + - [ ] API + - [ ] Component options + - [ ] Imports / excludes docs reference to SubschemaConfig diff --git a/package.json b/package.json index 8c3dfac..ea0cf2f 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "scripts": { "build": "tsc", "prepublish": "npm run build", - "test": "ts-node node_modules/.bin/tape test/**.ts", + "test": "tape -r ts-node/register test/**.ts", "start-composition": "DEBUG=graphql-component ts-node examples/composition/server/index.ts", "start-federation": "DEBUG=graphql-component node examples/federation/run-federation-example.js", "lint": "eslint lib", @@ -65,6 +65,7 @@ "html" ], "sourceMap": true, - "instrument": true + "instrument": true, + "all": true } } diff --git a/src/index.ts b/src/index.ts index da90e40..af5ff86 100644 --- a/src/index.ts +++ b/src/index.ts @@ -166,12 +166,11 @@ export default class GraphQLComponent implements IGraphQLComponent { } get context(): IContextWrapper { - const middleware = []; const contextFn = async (context): Promise => { debug(`building root context`); - for (let { name, fn } of middleware) { + for (let { name, fn } of contextFn._middleware) { debug(`applying ${name} middleware`); context = await fn(context); } @@ -186,13 +185,17 @@ export default class GraphQLComponent implements IGraphQLComponent { return globalContext; }; - contextFn.use = function (name, fn) { + contextFn._middleware = []; + + contextFn.use = function (name: string, fn: ContextFunction): IContextWrapper { if (typeof name === 'function') { fn = name; name = 'unknown'; } debug(`adding ${name} middleware`); - middleware.push({ name, fn }); + contextFn._middleware.push({ name, fn }); + + return contextFn; }; return contextFn; diff --git a/test/test.ts b/test/test.ts index 9fc9038..99096bc 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,6 +1,6 @@ import { DirectiveLocation, MapperKind, mapSchema } from '@graphql-tools/utils'; import { RenameTypes, SchemaDirectiveVisitor } from 'apollo-server'; -import { graphql, GraphQLDirective, GraphQLFieldConfig, GraphQLSchema, GraphQLString, printSchema } from 'graphql'; +import { graphql, GraphQLDirective, GraphQLFieldConfig, GraphQLObjectType, GraphQLSchema, GraphQLString, printSchema } from 'graphql'; import { test } from 'tape'; import GraphQLComponent, { IDataSource } from '../src'; @@ -26,6 +26,21 @@ test('component names', (t) => { }); +test('component types as array', (t) => { + + t.plan(2); + + const component = new GraphQLComponent({ + types: [ + `type Query { hello: String }` + ] + }); + + t.ok(component.schema, 'component with types as array can be created'); + t.ok(component.schema.getQueryType(), 'component with types as array can be created'); + +}); + test('getters tests', (t) => { t.test('component types', (t) => { @@ -124,13 +139,7 @@ test('component directives imports', (t) => { test('federation', (t) => { t.test('federated schema can include custom directive', (t) => { - class CustomDirective extends SchemaDirectiveVisitor { - // required for our dummy "custom" directive (ie. implement the SchemaDirectiveVisitor interface) - visitFieldDefinition() { - return; - } - } - + const component = new GraphQLComponent({ types: ` directive @custom on FIELD_DEFINITION @@ -182,6 +191,52 @@ test('federation', (t) => { }); + t.test('imported federated components will merge correctly', (t) => { + + t.plan(1); + + const component = new GraphQLComponent({ + types: ` + type Outer { + id: ID! + } + `, + federation: true, + pruneSchema: false, + imports: [ + new GraphQLComponent({ + types: ` + type Inner { + id: ID! + } + `, + pruneSchema: false + }) + ] + }); + + t.ok(component.imports[0].component.federation, 'imported federated component types are merged'); + + }); + +}); + +test('imports as configuration', (t) => { + + t.plan(1); + + const component = new GraphQLComponent({ + imports: [ + { + component: new GraphQLComponent({ + types: `type Query { hello: String }` + }) + } + ] + }); + + t.ok(component.schema.getQueryType(), 'component with imports as configuration can be created'); + }); test('context', async (t) => { @@ -204,6 +259,69 @@ test('context', async (t) => { }); +test('context with subcontext', async (t) => { + t.plan(1); + + const component = new GraphQLComponent({ + types: `type Query { hello: String }`, + context: { + namespace: 'test', + factory: (ctx) => { + return { value: 'local' }; + } + }, + imports: [ + new GraphQLComponent({ + types: `type Query { subhello: String }`, + context: { + namespace: 'subtest', + factory: (ctx) => { + return { value: 'sublocal' }; + } + } + }) + ] + }); + + const context = await component.context({}); + + t.equals(context.subtest.value, 'sublocal', 'subcontext value is correct'); +}); + +test('middleware', async (t) => { + + t.plan(3); + + const component = new GraphQLComponent({ + types: `type Query { hello: String }`, + resolvers: { + Query: { + hello() { + return 'Hello world!'; + } + } + }, + context: { + namespace: 'componentContext', + factory: (ctx) => { + return { value: 'local' }; + } + } + }); + + const context = component.context; + + context.use((ctx) => { + t.ok(ctx, 'middleware executed'); + return { middlware: 'middleware' }; + }); + + const { componentContext, middlware } = await context({}); + + t.equals(componentContext.value, 'local', 'component context added'); + t.equals(middlware, 'middleware', 'middleware context added'); +}); + test('data source injection', async (t) => { t.plan(2); diff --git a/tsconfig.json b/tsconfig.json index b0238e9..372d170 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,5 +17,6 @@ "exclude": ["node_modules"], "include": [ "./src" - ] + ], + "sourceMap": true } From ca80be8704a45458cbb0a073e15a4a7a71450911 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 20 Nov 2024 07:22:52 -0600 Subject: [PATCH 13/40] correct context being objected to data source --- src/index.ts | 6 +++--- test/test.ts | 11 +++++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index af5ff86..3bf50dc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -50,7 +50,7 @@ export interface IContextWrapper extends ContextFunction { export interface IGraphQLComponentOptions { types?: TypeSource resolvers?: IResolvers; - mocks?: IMocks; + mocks?: boolean | IMocks; imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; context?: IContextConfig; dataSources?: IDataSource[]; @@ -77,7 +77,7 @@ export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; _types: TypeSource; _resolvers: IResolvers; - _mocks: IMocks; + _mocks: boolean | IMocks; _imports: IGraphQLComponentConfigObject[]; _context: ContextFunction; _dataSources: IDataSource[]; @@ -141,7 +141,7 @@ export default class GraphQLComponent implements IGraphQLComponent { this._context = async (globalContext: any): Promise => { const ctx = { - dataSources: this._dataSourceContextInject({ globalContext }) + dataSources: this._dataSourceContextInject(globalContext) }; for (const { component } of this.imports) { diff --git a/test/test.ts b/test/test.ts index 99096bc..60c7116 100644 --- a/test/test.ts +++ b/test/test.ts @@ -323,11 +323,18 @@ test('middleware', async (t) => { }); test('data source injection', async (t) => { - t.plan(2); + t.plan(5); const dataSource = new class TestDataSource implements IDataSource { name = 'TestDataSource'; value = 'original'; + + getTestValue(ctx, arg) { + t.ok(ctx, 'context is correctly injected'); + t.equal(ctx.globalValue, 'global', 'context is correctly injected'); + t.equal(arg, 1, 'arguments are correctly injected'); + return this.value; + } }; const component = new GraphQLComponent({ @@ -339,7 +346,7 @@ test('data source injection', async (t) => { const context = await component.context({ globalValue: 'global' }); t.ok(context.dataSources.TestDataSource, 'data source is correctly injected'); - t.equal(context.dataSources.TestDataSource.value, 'original', 'data source is correctly injected'); + t.equal(context.dataSources.TestDataSource.getTestValue(1), 'original', 'data source is correctly injected'); }); test('data source injection', async (t) => { From e646fbdd584561253d17943d76d0818684651eb9 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 20 Nov 2024 13:16:35 -0600 Subject: [PATCH 14/40] updates, readme --- CHANGELOG.md | 161 ++------------------------------------------------- README.md | 55 +++++++++++------- TODO.md | 13 +++-- src/index.ts | 1 + test/test.ts | 11 ++-- 5 files changed, 54 insertions(+), 187 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b24abe..8099430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,158 +1,5 @@ +### v4.0.0 -### v3.0.2 - -- [FIXED] - imported components directives are merged into final schema - -### v3.0.1 - -- [FIXED] - if `exclude` is undefined in a component config - -### v3.0.0 - -- Modernized to utilize new graphql-tools -- [BREAKING] - directives are not imported and maintained throughout the tree : top level component is responsible for directive implementations - -### v2.2.0 - -- [FEATURE] - Add "hook" for custom `makeExecutableSchema` function - -### v2.1.7 - -- [FIXED] - Explicitly removed wrapping of the federation `__resolveReference()` resolver which was preventing `__resolveReference()` from running when using `graphql-component` to build federated schemas in seperate graphql services. - -### v2.1.6 - -- [FIXED] - A bug with `graphql-component` being used in a federated schema was brought to our attention and was attributed to the non-root type field resolver wrapping performed to help prevent double execution of resolvers with local delegation. Effectively, the resolver wrapping functionality was causing a null value to be returned (by attempting to return a value from the root arg) when the wrapper should have been calling through to the actual resolver. To fix this, separate wrapper functions are used for fields that begin with `__` (such as `__resolveType()`) versus "normal" non-root type fields. These separated wrapper functions look for similar but slightly different conditions to determine whether to "short circuit" an already computed result which ensures that the wrapper functions are short circuiting or calling through to the actual resolver in the desired situations. - -### v2.1.5 - -- [FIXED] - delegateToComponent()'s second parameter is an options object that supports an `args` key for passing arguments to the target GraphQL operation via JavaScript from the calling resolver. Previously, if you attempted to pass an array (wrapping any form of JavaScript scalar) a type coersion error would surface. delegateToComponent's options.args parameter now supports passing Array like arguments as expected. - -### v2.1.4 - -- [REVERT] - reverting both fixes in [2.1.2](https://github.com/ExpediaGroup/graphql-component/releases/tag/v2.1.2). The change made to unify exclusions and return pre-computed results from non-root resolvers resulted in non-root resolvers not executing when they should have. Being able to exclude non-root resolvers (not their types) is a valid work around in certain situations. - -### v2.1.3 - -- [FIXED] - modified automatic pruning mechanism during delegation to use parent types/parent type fields instead of getFieldDef() - -### v2.1.2 - -- [FIXED] - non-root resolvers being executed twice in certain delegate situations -- [FIXED] - resolver exclusion now works identical to type exclusion. Only root types (`Query`, `Mutation`, `Subscription`) and/or fields on root types can be excluded, which was not the case for resolver functions prior to this fix. - -### v2.1.1 - -- update `@apollo/federation` to `^0.20.4` - -### v2.1.0 - -- [FEATURE] `delegateToComponent()` - automatically prune fields from the delegated document selection set that are not defined in the schema (component) being delegated to. This will reduced potential down stream errors as well as ensures no unintended fields are forwarded and all fields forwarded can be resolved by the schema be delegated to. This feature addresses some edge cases around variable forwarding that were not addressed in prior patch releases `2.0.4` and `2.0.5`. - -### v2.0.5 - -- [FIXED] Reinstated variable passing to the sub-document created by `delegateToComponent()`. All variable values will be forwarded to the delegated operation, but only the variable definitions for input types or types that are in the target schema will be forwarded. This prevents errors in certain delegate situations while also allowing valid resolution of args passed as variables. - -### v2.0.4 - -- [FIXED] the error path on errors surfaced through `delegateToComponent()` calls such that error path takes into account the already traversed path and exclusions -- [FIXED] Variables from an outer operation are no longer forwarded to the sub operation created by `delegateToComponent()` this is to avoid passing along variables for types that dont exist in the schema being delegated to. - -### v2.0.3 - -- [FIXED] individual field exclusions during import - individual field exclusions will no longer modify the original resolver map that is being imported. -- [FIXED] tightened up argument forwarding when using `delegateToComponent()` - only arguments the target field is expecting will be extracted from the calling resolver or from the `args` object provided to `delegateToComponent()` depending on the situation. Previously, there were some unintended argument leakage in certain edge cases. - -### v2.0.2 - -- [FIXED] importing directives - -### v2.0.1 - -- [FIXED] error merging to iteratively consider the merge path to properly merge errors in complex situations such as lists - -### v2.0.0 - -- [BREAKING] removed fragment helpers -- [BREAKING] `schemaDirectives` (which returned merged directives) removed from component api -- [BREAKING] removed `proxyImportedResolvers` feature flag -- [BREAKING] removed `execute` -- [FEATURE] added `delegateToComponent` to replace `execute` -- [FEATURE] args can be overridden/passed via `delegateToComponent` -- [FEATURE] added `targetRootField` option to `delegateToComponent` -- [FIXED] delegation for subscription operations -- [FIXED] Memoizing resolvers didn't take into account aliased requests -- [FIXED] delegating an operation that contains an abstract type -- [DOCS] added documentation for `delegateToComponent` -- [CLEANUP] use fieldNodes to build sub-operation document in delegateToComponent such that the original operation document isn't unintentionally modified -- [CLEANUP] removal of proxy resolvers creation when importing resolvers -- [CLEANUP] Refactor how imports are merged together to be optimized and only run when a schema is requested -- [CLEANUP] Moved tests alongside source code - -### v1.3.1 - -- Fixed exclude mapping in GraphQLComponent constructor - Array.map was erroniously changed to Array.filter - -### v1.3.0 - -- Imported resolvers will delegate to the imported component schema to which they belong. -- Remove `this._context` as default value for context in `execute()` requiring `execute()` users to pass in context from a calling resolver. -- Remove binding of `GraphQLComponent` class context to Subscription resolvers. -- Apply proxyImportedResolvers regardless of how the way a component is imported and whether or not exclusions are provided. proxyImportedResolvers can still be turned off for an imported component if the component is passed via config object. - -### v1.2.4 - -- Execute flag `mergeErrors` allows inline errors to facilitate returning multiple errors from resolvers that use `execute`. - -### v1.2.3 - -- Allow extended properties in federated schema with custom directives - -### v1.2.2 - -- Allow custom directives in federation (#40) - -### v1.2.1 - -- Clean up empty types that were excluded (#38) -- Reduced package size with npmignore - -### v1.2.0 - -- Added federation support -- New license copyright - -### v1.1.3 - -- Fixed data source proxy losing instance binding -- Upgraded to graphql peer ^14 - -### v1.1.1 - -- `execute` now supports both document objects and strings. - -### v1.1.1 - -- [BREAKING from 1.1.0 (sorry, but it is 5 minutes later)]: data sources appear by constructor name on context - -### v1.1.0 - -- Added first class data source support and overriding - -### v1.0.4 - -- Fixes #23 - -### v1.0.3 - -- Disabling type resolvers from memoization — this doesn't work right for type resolvers. - -### v1.0.2 - -- Outer global context setup occurs only once when `context` is fetched off component. - -### v1.0.1 - -- Fixed .npmignore to not include misc files that added to the package size - -### v1.0.0 — promoted from alpha.23 +- Converted to TS +- BREAKING excludes removed as an option. Transforms used instead. +- BREAKING \ No newline at end of file diff --git a/README.md b/README.md index 2fcb8c9..49a1fc1 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Read more about the idea [here](https://medium.com/expedia-group-tech/graphql-co Generally speaking, each instance of `GraphQLComponent` has reference to an instance of [`GraphQLSchema`](https://graphql.org/graphql-js/type/#graphqlschema). This instance of `GraphQLSchema` is built in a several ways, depending on the options passed to a given `GraphQLComponent`'s constructor. -* when a `GraphQLComponent` instance has `imports` (ie. other `GraphQLComponent` instances or component configuration objects) [graphql-tools stitchSchemas()](https://www.graphql-tools.com/docs/schema-stitching/) is used to create a "gateway" or aggregate schema that is the combination of the underlying imported schemas, and the typeDefs/resolvers passed to the root or importing `GraphQLComponent` +* when a `GraphQLComponent` instance has `imports` (ie. other `GraphQLComponent` instances or component [SubschemaConfig](https://the-guild.dev/graphql/stitching/docs/getting-started/remote-subschemas#configuring-subschemas) configuration objects) is used to create a "gateway" or aggregate schema that is the combination of the underlying imported schemas, and the typeDefs/resolvers passed to the root or importing `GraphQLComponent` * when a `GraphQLComponent` has no imports, graphql-tools' `makeExecuteableSchema({typeDefs, resolvers})` is used to generate an executable GraphQL schema using the passed/required inputs. It's worth noting that `GraphQLComponent` can also be used to construct componentized Apollo Federated schemas. That is, if you pass the `federation: true` flag to a GraphQLComponent constructor, `@apollo/federation`'s [buildSubgraphSchema()](https://www.apollographql.com/docs/federation/api/apollo-subgraph/) is used in lieu of graphql-tools `makeExecutableSchema({...})` and the above still schema construction rule applies. The general use case here might be to help modularize an individual federated subschema service implementation. @@ -25,7 +25,7 @@ federation (2 subschema services implemented via `GraphQLComponent` and a vanill ### Repository structure -- `lib` - the graphql-component code. +- `src` - the graphql-component code. - `examples/composition` - a simple example of composition using `graphql-component` - `examples/federation` - a simple example of building a federated schema using `graphql-component` @@ -41,7 +41,7 @@ federation (2 subschema services implemented via `GraphQLComponent` and a vanill `GraphQLComponent` uses [debug]() for local stdout based debug logging. Enable all debug logging with the node environment variable `DEBUG=graphql-component:*`. Generally speaking, most debug output occurs during `GraphQLComponent` construction. # API -- `GraphQLComponent(options)` - the component class, which may also be extended. Its options include: +- `GraphQLComponent(options: IGraphQLComponentOptions)` - the component class, which may also be extended. Its options include: - `types` - a string or array of strings of GraphQL SDL defining the type definitions for this component - `resolvers` - a resolver map (ie. a two level map whose first level keys are types from the SDL, mapped to objects, whose keys are fields on those types and values are resolver functions) - `imports` - an optional array of imported components for the schema to be merged with. @@ -68,14 +68,29 @@ federation (2 subschema services implemented via `GraphQLComponent` and a vanill A GraphQLComponent instance (ie, `new GraphQLComponent({...})`) has the following API: +```typescript +interface IGraphQLComponent { + readonly name: string; + readonly schema: GraphQLSchema; + readonly context: IContextWrapper; + readonly types: TypeSource; + readonly resolvers: IResolvers; + readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; + readonly dataSources?: IDataSource[]; + readonly dataSourcesOverrides?: IDataSource[]; + federation?: boolean; +} +``` + +- `name` - the component name - `schema` - getter that this component's `GraphQLSchema` object (ie. the "executable" schema that is constructed as described above) - `context` - context function that builds context for all components in the tree. - `types` - this component's types. - `resolvers` - this component's resolvers. - `imports` - this component's imported components in the form of import configuration objects -- `mocks` - custom mocks for this component. -- `directives` - this component's directives. - `dataSources` - this component's data source(s), if any. +- `dataSourceOverrides` - this component's data source overrides, if any. +- `federation` - if this schema should be a federated schema. # General usage @@ -129,7 +144,7 @@ const server = new ApolloServer({ Imports can be a configuration object supplying the following properties: - `component` - the component instance to import. -- `exclude` - fields on types to exclude from the component being imported, if any. +- `configuration` - a `SubschemaConfig` : see [SubschemaConfig](https://the-guild.dev/graphql/stitching/docs/getting-started/remote-subschemas#configuring-subschemas) ### Exclude @@ -195,28 +210,28 @@ new GraphQLComponent({ ### Override data sources -Since data sources are added to the context based on the constructor name, it is possible to simply override data sources by passing the same class name or overriding the constructor name: +Since data sources are added to the context based on the constructor name, it is possible to simply override data sources by passing the same class name or overriding the constructor name. + +`datSourceOverrides` is provided as a way to facilitate mixing in specific overrides while preserving defaults. + +Example: ```javascript -const { schema, context } = new GraphQLComponent({ - imports: [ - { - component: new Property(), - exclude: ['Mutation.*'] - }, - { - component: new Reviews(), - exclude: ['Mutation.*'] - } - ], + +class PropertyComponent extends new GraphQLComponent { + constructor(options) { + super({ dataSources: [new PropertyDataSource()], ...options }); + } +} + +const { schema, context } = new PropertyComponent({ dataSourceOverrides: [ - new class PropertyMock { + new class MockDataSource { static get name() { return 'PropertyDataSource'; } //...etc } - ] }); ``` diff --git a/TODO.md b/TODO.md index cfb438b..e7f2ad3 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,6 @@ Remaining to-dos for version 4: -- [ ] More test coverage +- [x] More test coverage - [x] Alternative for schema directive visitor (add custom directives after creating federated schema) - [x] Document transforms, including directives - [x] Fix context injection @@ -8,8 +8,9 @@ Remaining to-dos for version 4: - [x] Fix composition examples - [x] Fix federations examples - [ ] Revert composition examples to JS again -- [ ] Update readme - - [ ] Repository structure - - [ ] API - - [ ] Component options - - [ ] Imports / excludes docs reference to SubschemaConfig +- [x] Update readme + - [x] Repository structure + - [x] API + - [x] Component options + - [x] Imports / excludes docs reference to SubschemaConfig +- [ ] Move to latest stitch functionality in @graphql-tools/stitch diff --git a/src/index.ts b/src/index.ts index 3bf50dc..6c3a505 100644 --- a/src/index.ts +++ b/src/index.ts @@ -140,6 +140,7 @@ export default class GraphQLComponent implements IGraphQLComponent { this._context = async (globalContext: any): Promise => { + //TODO: currently the context injected into data sources won't have data sources on it const ctx = { dataSources: this._dataSourceContextInject(globalContext) }; diff --git a/test/test.ts b/test/test.ts index 60c7116..021ae50 100644 --- a/test/test.ts +++ b/test/test.ts @@ -362,10 +362,13 @@ test('data source injection', async (t) => { value = 'override'; }; - const component = new GraphQLComponent({ - dataSources: [ - dataSource - ], + class MyComponent extends GraphQLComponent { + constructor(options) { + super({ dataSources: [dataSource], ...options }); + } + } + + const component = new MyComponent({ dataSourceOverrides: [ dataSourceOverride ] From e4aabb224f9315b3a51a1add4776cbe6e8027b1d Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 20 Nov 2024 15:22:36 -0600 Subject: [PATCH 15/40] updated dependencies --- CHANGELOG.md | 2 +- TODO.md | 4 ++-- dist/index.d.ts | 4 ++-- dist/index.js | 12 +++++++----- package.json | 46 ++++++++++++++++++++++++---------------------- test/test.ts | 19 +++++++++---------- 6 files changed, 45 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8099430..425b862 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ### v4.0.0 - Converted to TS -- BREAKING excludes removed as an option. Transforms used instead. +- BREAKING excludes removed as an option in import configuration. Transforms used instead as part of a `SubschemaConfig`. - BREAKING \ No newline at end of file diff --git a/TODO.md b/TODO.md index e7f2ad3..02cbe98 100644 --- a/TODO.md +++ b/TODO.md @@ -4,7 +4,7 @@ Remaining to-dos for version 4: - [x] Alternative for schema directive visitor (add custom directives after creating federated schema) - [x] Document transforms, including directives - [x] Fix context injection -- [ ] IGraphQLComponentConfigObject documentation +- [x] IGraphQLComponentConfigObject documentation - [x] Fix composition examples - [x] Fix federations examples - [ ] Revert composition examples to JS again @@ -13,4 +13,4 @@ Remaining to-dos for version 4: - [x] API - [x] Component options - [x] Imports / excludes docs reference to SubschemaConfig -- [ ] Move to latest stitch functionality in @graphql-tools/stitch +- [ ] Move to latest stitch functionality in @graphql-tools/stitch (big change) diff --git a/dist/index.d.ts b/dist/index.d.ts index 3d29392..05d705e 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -28,7 +28,7 @@ export interface IContextWrapper extends ContextFunction { export interface IGraphQLComponentOptions { types?: TypeSource; resolvers?: IResolvers; - mocks?: IMocks; + mocks?: boolean | IMocks; imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; context?: IContextConfig; dataSources?: IDataSource[]; @@ -53,7 +53,7 @@ export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; _types: TypeSource; _resolvers: IResolvers; - _mocks: IMocks; + _mocks: boolean | IMocks; _imports: IGraphQLComponentConfigObject[]; _context: ContextFunction; _dataSources: IDataSource[]; diff --git a/dist/index.js b/dist/index.js index a94ee57..cb59fde 100644 --- a/dist/index.js +++ b/dist/index.js @@ -49,8 +49,9 @@ class GraphQLComponent { } }) : []; this._context = async (globalContext) => { + //TODO: currently the context injected into data sources won't have data sources on it const ctx = { - dataSources: this._dataSourceContextInject({ globalContext }) + dataSources: this._dataSourceContextInject(globalContext) }; for (const { component } of this.imports) { const { dataSources, ...importedContext } = await component.context(globalContext); @@ -68,10 +69,9 @@ class GraphQLComponent { }; } get context() { - const middleware = []; const contextFn = async (context) => { debug(`building root context`); - for (let { name, fn } of middleware) { + for (let { name, fn } of contextFn._middleware) { debug(`applying ${name} middleware`); context = await fn(context); } @@ -82,13 +82,15 @@ class GraphQLComponent { }; return globalContext; }; + contextFn._middleware = []; contextFn.use = function (name, fn) { if (typeof name === 'function') { fn = name; name = 'unknown'; } debug(`adding ${name} middleware`); - middleware.push({ name, fn }); + contextFn._middleware.push({ name, fn }); + return contextFn; }; return contextFn; } @@ -313,4 +315,4 @@ const transformSchema = function (schema, transforms) { } return (0, utils_1.mapSchema)(schema, mapping); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBUztJQUNmLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUUzQixZQUFZLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsRUFDZTtRQUV6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxV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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBbUI7SUFDekIsUUFBUSxDQUFrQztJQUMxQyxRQUFRLENBQWtCO0lBQzFCLFlBQVksQ0FBZ0I7SUFDNUIsb0JBQW9CLENBQWdCO0lBQ3BDLFlBQVksQ0FBVTtJQUN0QixtQkFBbUIsQ0FBb0I7SUFDdkMsV0FBVyxDQUFVO0lBQ3JCLHdCQUF3QixDQUE4QjtJQUN0RCxXQUFXLENBQWdCO0lBRTNCLFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFH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 \ No newline at end of file diff --git a/package.json b/package.json index ea0cf2f..b0e77cb 100644 --- a/package.json +++ b/package.json @@ -17,38 +17,40 @@ "start-composition": "DEBUG=graphql-component ts-node examples/composition/server/index.ts", "start-federation": "DEBUG=graphql-component node examples/federation/run-federation-example.js", "lint": "eslint lib", - "cover": "nyc npm test" + "cover": "nyc npm test", + "update-deps": "ncu -u && npm install" }, "author": "Trevor Livingston ", "repository": "https://github.com/ExpediaGroup/graphql-component", "license": "MIT", "dependencies": { - "@apollo/federation": "^0.28.0", - "@graphql-tools/delegate": "^8.7.6", - "@graphql-tools/merge": "^8.2.9", - "@graphql-tools/mock": "^8.6.7", - "@graphql-tools/schema": "^8.3.9", - "@graphql-tools/stitch": "^8.6.8", - "@graphql-tools/utils": "^8.6.8", + "@apollo/federation": "^0.38.1", + "@graphql-tools/delegate": "^10.2.0", + "@graphql-tools/merge": "^9.0.9", + "@graphql-tools/mock": "^9.0.6", + "@graphql-tools/schema": "^10.0.8", + "@graphql-tools/stitch": "^9.4.0", + "@graphql-tools/utils": "^10.5.6", "@types/graphql": "^14.5.0", - "@types/node": "^17.0.21", - "debug": "^4.3.1" + "@types/node": "^22.9.1", + "debug": "^4.3.7" }, "peerDependencies": { - "graphql": "^15.0.0" + "graphql": "^16.0.0" }, "devDependencies": { - "typescript": "^4.6.2", - "@apollo/gateway": "^0.28.2", - "apollo-server": "^2.25.0", - "casual": "^1.6.0", - "eslint": "^6.5.1", - "graphql": "^15.0.0", - "graphql-tag": "^2.12.4", - "nyc": "^14.1.1", - "sinon": "^12.0.1", - "tape": "^4.9.1", - "ts-node": "^10.6.0" + "@apollo/gateway": "^2.9.3", + "apollo-server": "^3.13.0", + "casual": "^1.6.2", + "eslint": "^9.15.0", + "graphql": "^16.9.0", + "graphql-tag": "^2.12.6", + "nyc": "^17.1.0", + "sinon": "^19.0.2", + "tape": "^5.9.0", + "ts-node": "^10.9.2", + "typescript": "^5.6.3", + "npm-check-updates": "^17.1.11" }, "nyc": { "include": [ diff --git a/test/test.ts b/test/test.ts index 021ae50..6b7812a 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,6 +1,5 @@ -import { DirectiveLocation, MapperKind, mapSchema } from '@graphql-tools/utils'; -import { RenameTypes, SchemaDirectiveVisitor } from 'apollo-server'; -import { graphql, GraphQLDirective, GraphQLFieldConfig, GraphQLObjectType, GraphQLSchema, GraphQLString, printSchema } from 'graphql'; +import { DirectiveLocation, MapperKind } from '@graphql-tools/utils'; +import { graphql, GraphQLDirective, GraphQLString } from 'graphql'; import { test } from 'tape'; import GraphQLComponent, { IDataSource } from '../src'; @@ -434,9 +433,9 @@ test('transform with custom directive', async (t) => { } `; - const result = await graphql(transformedSchema, query); - - t.equal(result.data?.__type?.fields.find(field => field.name === 'hello')?.description, 'This field has a custom directive', 'custom directive is correctly applied'); + const result = await graphql({ schema: transformedSchema, source: query }) as any; + + t.equal(result.data?.__type?.fields?.find(field => field.name === 'hello')?.description, 'This field has a custom directive', 'custom directive is correctly applied'); }); test('schema composition', async (t) => { @@ -533,7 +532,7 @@ test('resolver binding', async (t) => { } `; - const result = await graphql(schema, query, null, {}); + const result = await graphql({ schema, source: query, contextValue: {} }); t.equal(result.data?.hello, 'Hello world!', 'resolver correctly binds to context'); }); @@ -567,10 +566,10 @@ test('resolve memoization', async (t) => { } `; - const ctx = {}; + const ctx = { v: 1 }; - const result1 = await graphql(schema, query, null, ctx, { operationName: 'first' }); - const result2 = await graphql(schema, query, null, ctx, { operationName: 'second' }); + const result1 = await graphql({ schema, source: query, contextValue: ctx }); + const result2 = await graphql({ schema, source: query, contextValue: ctx }); t.equal(count, 1, 'resolver is memoized'); }); \ No newline at end of file From 28f83f2e653563016ad78d4ae82263c282498832 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 20 Nov 2024 15:24:24 -0600 Subject: [PATCH 16/40] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 425b862..812d514 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,4 +2,4 @@ - Converted to TS - BREAKING excludes removed as an option in import configuration. Transforms used instead as part of a `SubschemaConfig`. -- BREAKING \ No newline at end of file +- BREAKING upgraded to graphql 16.9+ peer \ No newline at end of file From cca6297bbdb372774d67690cbf08f43b16a1f0d8 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 20 Nov 2024 15:30:24 -0600 Subject: [PATCH 17/40] added type to context --- dist/index.d.ts | 10 +++++++--- dist/index.js | 2 +- src/index.ts | 12 +++++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 05d705e..28022e8 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -7,17 +7,20 @@ export interface IGraphQLComponentConfigObject { component: IGraphQLComponent; configuration?: SubschemaConfig; } -export type ContextFunction = ((ctx: any) => any); +type GlobalContext = { + [key: string]: unknown; +}; +export type ContextFunction = ((ctx: GlobalContext) => any); export interface IDataSource { name: string; } export type DataSource = { - [P in keyof T]: T[P] extends (ctx: any, ...p: infer P) => infer R ? (...p: P) => R : never; + [P in keyof T]: T[P] extends (ctx: GlobalContext, ...p: infer P) => infer R ? (...p: P) => R : never; }; export type DataSourceMap = { [key: string]: IDataSource; }; -export type DataSourceInjectionFunction = ((ctx: any) => DataSourceMap); +export type DataSourceInjectionFunction = ((ctx: GlobalContext) => DataSourceMap); export interface IContextConfig { namespace: string; factory: ContextFunction; @@ -75,3 +78,4 @@ export default class GraphQLComponent implements IGraphQLComponent { set federation(flag: boolean); get federation(): boolean; } +export {}; diff --git a/dist/index.js b/dist/index.js index cb59fde..21e7ebc 100644 --- a/dist/index.js +++ b/dist/index.js @@ -315,4 +315,4 @@ const transformSchema = function (schema, transforms) { } return (0, utils_1.mapSchema)(schema, mapping); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUEyRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBbUI7SUFDekIsUUFBUSxDQUFrQztJQUMxQyxRQUFRLENBQWtCO0lBQzFCLFlBQVksQ0FBZ0I7SUFDNUIsb0JBQW9CLENBQWdCO0lBQ3BDLFlBQVksQ0FBVTtJQUN0QixtQkFBbUIsQ0FBb0I7SUFDdkMsV0FBVyxDQUFVO0lBQ3JCLHdCQUF3QixDQUE4QjtJQUN0RCxXQUFXLENBQWdCO0lBRTNCLFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFH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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUE2RC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBbUI7SUFDekIsUUFBUSxDQUFrQztJQUMxQyxRQUFRLENBQWtCO0lBQzFCLFlBQVksQ0FBZ0I7SUFDNUIsb0JBQW9CLENBQWdCO0lBQ3BDLFlBQVksQ0FBVTtJQUN0QixtQkFBbUIsQ0FBb0I7SUFDdkMsV0FBVyxDQUFVO0lBQ3JCLHdCQUF3QixDQUE4QjtJQUN0RCxXQUFXLENBQWdCO0lBRTNCLFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFH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 \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 6c3a505..ce614b8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,19 +24,21 @@ export interface IGraphQLComponentConfigObject { configuration?: SubschemaConfig; } -export type ContextFunction = ((ctx: any) => any); +type GlobalContext = { [key: string]: unknown }; + +export type ContextFunction = ((ctx: GlobalContext) => any); export interface IDataSource { name: string } export type DataSource = { - [P in keyof T]: T[P] extends (ctx: any, ...p: infer P) => infer R ? (...p: P) => R : never + [P in keyof T]: T[P] extends (ctx: GlobalContext, ...p: infer P) => infer R ? (...p: P) => R : never } export type DataSourceMap = {[key: string]: IDataSource}; -export type DataSourceInjectionFunction = ((ctx: any) => DataSourceMap); +export type DataSourceInjectionFunction = ((ctx: GlobalContext) => DataSourceMap); export interface IContextConfig { namespace: string; @@ -139,7 +141,7 @@ export default class GraphQLComponent implements IGraphQLComponent { }) : []; - this._context = async (globalContext: any): Promise => { + this._context = async (globalContext: GlobalContext): Promise => { //TODO: currently the context injected into data sources won't have data sources on it const ctx = { dataSources: this._dataSourceContextInject(globalContext) @@ -168,7 +170,7 @@ export default class GraphQLComponent implements IGraphQLComponent { get context(): IContextWrapper { - const contextFn = async (context): Promise => { + const contextFn = async (context): Promise => { debug(`building root context`); for (let { name, fn } of contextFn._middleware) { From d41301095416d9cd6ae0ad25b37962cb8fe84c1e Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Thu, 21 Nov 2024 08:41:08 -0600 Subject: [PATCH 18/40] fixed examples again --- examples/composition/listing-component/resolvers.ts | 4 ++-- examples/composition/property-component/index.ts | 2 -- examples/composition/property-component/resolvers.ts | 4 ++-- examples/composition/property-component/schema.graphql | 2 +- examples/composition/reviews-component/resolvers.ts | 2 -- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/examples/composition/listing-component/resolvers.ts b/examples/composition/listing-component/resolvers.ts index 8c43e74..3eb84d1 100644 --- a/examples/composition/listing-component/resolvers.ts +++ b/examples/composition/listing-component/resolvers.ts @@ -1,6 +1,6 @@ 'use strict'; -import { delegateToSchema, IDelegateToSchemaOptions } from '@graphql-tools/delegate'; +import { delegateToSchema } from '@graphql-tools/delegate'; export const resolvers = { Query: { @@ -12,6 +12,7 @@ export const resolvers = { property(root, args, context, info) { return delegateToSchema({ schema: this.propertyComponent.schema, + fieldName: 'propertyById', args: { id: root.id }, @@ -22,7 +23,6 @@ export const resolvers = { reviews(root, args, context, info) {; return delegateToSchema({ schema: this.reviewsComponent.schema, - operationName: 'query', fieldName: 'reviewsByPropertyId', args: { propertyId: root.id diff --git a/examples/composition/property-component/index.ts b/examples/composition/property-component/index.ts index bc94c49..aaefe00 100644 --- a/examples/composition/property-component/index.ts +++ b/examples/composition/property-component/index.ts @@ -5,11 +5,9 @@ import GraphQLComponent from "../../../src"; import { resolvers } from "./resolvers"; import PropertyDataSource from "./datasource"; - export default class PropertyComponent extends GraphQLComponent { constructor({ dataSources = [new PropertyDataSource()], ...options } = {}) { super({ types, resolvers, dataSources, ...options }); } } -module.exports = PropertyComponent; diff --git a/examples/composition/property-component/resolvers.ts b/examples/composition/property-component/resolvers.ts index 6ae48dd..2894433 100644 --- a/examples/composition/property-component/resolvers.ts +++ b/examples/composition/property-component/resolvers.ts @@ -2,8 +2,8 @@ export const resolvers = { Query: { - property(_, { id }, context) { - return context.dataSources.PropertyDataSource.getPropertyById(id); + propertyById(_, { id }, { dataSources}) { + return dataSources.PropertyDataSource.getPropertyById(id); } } }; diff --git a/examples/composition/property-component/schema.graphql b/examples/composition/property-component/schema.graphql index b8a8f0b..cc832ec 100644 --- a/examples/composition/property-component/schema.graphql +++ b/examples/composition/property-component/schema.graphql @@ -4,5 +4,5 @@ type Property { } type Query { - property(id: ID!) : Property + propertyById(id: ID!) : Property } diff --git a/examples/composition/reviews-component/resolvers.ts b/examples/composition/reviews-component/resolvers.ts index f97e659..5e6c925 100644 --- a/examples/composition/reviews-component/resolvers.ts +++ b/examples/composition/reviews-component/resolvers.ts @@ -7,5 +7,3 @@ export const resolvers = { } } }; - -module.exports = resolvers; From 5bd591b46d91c871239e70e45021b7a4a58953d5 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Thu, 21 Nov 2024 08:43:20 -0600 Subject: [PATCH 19/40] corrected dataSourceOverrides name --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index ce614b8..20abe9d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -71,7 +71,7 @@ export interface IGraphQLComponent { readonly resolvers: IResolvers; readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; - readonly dataSourcesOverrides?: IDataSource[]; + readonly dataSourceOverrides?: IDataSource[]; federation?: boolean; } @@ -295,7 +295,7 @@ export default class GraphQLComponent implements IGraphQLComponent { return this._dataSources; } - get dataSourcesOverrides(): IDataSource[] { + get dataSourceOverrides(): IDataSource[] { return this._dataSourceOverrides; } From 1d9217ce18e9ece33ca9f6c21dbb5bc1f033d36c Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Thu, 21 Nov 2024 08:44:01 -0600 Subject: [PATCH 20/40] latest build --- dist/index.d.ts | 4 ++-- dist/index.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 28022e8..efb9894 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -49,7 +49,7 @@ export interface IGraphQLComponent { readonly resolvers: IResolvers; readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; - readonly dataSourcesOverrides?: IDataSource[]; + readonly dataSourceOverrides?: IDataSource[]; federation?: boolean; } export default class GraphQLComponent implements IGraphQLComponent { @@ -74,7 +74,7 @@ export default class GraphQLComponent implements IGraphQLComponent { get resolvers(): IResolvers; get imports(): IGraphQLComponentConfigObject[]; get dataSources(): IDataSource[]; - get dataSourcesOverrides(): IDataSource[]; + get dataSourceOverrides(): IDataSource[]; set federation(flag: boolean); get federation(): boolean; } diff --git a/dist/index.js b/dist/index.js index 21e7ebc..0abf5e3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -168,7 +168,7 @@ class GraphQLComponent { get dataSources() { return this._dataSources; } - get dataSourcesOverrides() { + get dataSourceOverrides() { return this._dataSourceOverrides; } set federation(flag) { @@ -315,4 +315,4 @@ const transformSchema = function (schema, transforms) { } return (0, utils_1.mapSchema)(schema, mapping); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUE2RC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBbUI7SUFDekIsUUFBUSxDQUFrQztJQUMxQyxRQUFRLENBQWtCO0lBQzFCLFlBQVksQ0FBZ0I7SUFDNUIsb0JBQW9CLENBQWdCO0lBQ3BDLFlBQVksQ0FBVTtJQUN0QixtQkFBbUIsQ0FBb0I7SUFDdkMsV0FBVyxDQUFVO0lBQ3JCLHdCQUF3QixDQUE4QjtJQUN0RCxXQUFXLENBQWdCO0lBRTNCLFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFH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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUE2RC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBbUI7SUFDekIsUUFBUSxDQUFrQztJQUMxQyxRQUFRLENBQWtCO0lBQzFCLFlBQVksQ0FBZ0I7SUFDNUIsb0JBQW9CLENBQWdCO0lBQ3BDLFlBQVksQ0FBVTtJQUN0QixtQkFBbUIsQ0FBb0I7SUFDdkMsV0FBVyxDQUFVO0lBQ3JCLHdCQUF3QixDQUE4QjtJQUN0RCxXQUFXLENBQWdCO0lBRTNCLFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFH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 \ No newline at end of file From 5426b3db0fa8278d6385f52dd3c7e1e9528511a3 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Thu, 21 Nov 2024 09:04:52 -0600 Subject: [PATCH 21/40] added mocks tests --- test/test.ts | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/test.ts b/test/test.ts index 6b7812a..03bdd7c 100644 --- a/test/test.ts +++ b/test/test.ts @@ -572,4 +572,62 @@ test('resolve memoization', async (t) => { const result2 = await graphql({ schema, source: query, contextValue: ctx }); t.equal(count, 1, 'resolver is memoized'); +}); + +test('mocks', async (t) => { + + t.test('default mocks', async (t) => { + t.plan(1); + + const component = new GraphQLComponent({ + types: ` + type Query { + hello: String + } + `, + mocks: true + }); + + const schema = component.schema; + + const query = ` + { + hello + } + `; + + const result = await graphql({ schema, source: query }); + + t.ok(result.data?.hello, 'default mocks are used'); + }); + + t.test('custom mocks applied', async (t) => { + t.plan(1); + + const component = new GraphQLComponent({ + types: ` + type Query { + hello: String + } + `, + mocks: { + Query: () => ({ + hello: 'Custom hello world!' + }) + } + }); + + const schema = component.schema; + + const query = ` + { + hello + } + `; + + const result = await graphql({ schema, source: query }); + + t.equal(result.data?.hello, 'Custom hello world!', 'custom mocks are used'); + }); + }); \ No newline at end of file From 2829731f5c0b0bfbe7acc30afce407ec2754f6a5 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 28 Jan 2025 10:18:20 -0600 Subject: [PATCH 22/40] Updated versioning to reflect the proper version planned --- CHANGELOG.md | 3 ++- package.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 812d514..3b0eeaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ -### v4.0.0 +### v6.0.0 - Converted to TS +- BREAKING removed `delegateToComponent` - BREAKING excludes removed as an option in import configuration. Transforms used instead as part of a `SubschemaConfig`. - BREAKING upgraded to graphql 16.9+ peer \ No newline at end of file diff --git a/package.json b/package.json index b0e77cb..e9e1aac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graphql-component", - "version": "4.0.0-alpha.1", + "version": "6.0.0-alpha.1", "description": "Build, customize and compose GraphQL schemas in a componentized fashion", "keywords": [ "graphql", From d017b5a694e181e1368385c2f23c97d11fb58b54 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 28 Jan 2025 11:17:17 -0600 Subject: [PATCH 23/40] export GlobalContext, clean up typing for IResolvers --- src/index.ts | 798 +++++++++++++++++++++++++-------------------------- 1 file changed, 399 insertions(+), 399 deletions(-) diff --git a/src/index.ts b/src/index.ts index 20abe9d..4549e0d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,472 +1,472 @@ -const debug = require('debug')('graphql-component'); - -import { buildFederatedSchema } from '@apollo/federation'; -import { GraphQLResolveInfo, GraphQLScalarType, GraphQLSchema } from 'graphql'; - -import { mergeTypeDefs } from '@graphql-tools/merge'; -import { - pruneSchema, - IResolvers, - PruneSchemaOptions, - TypeSource, - mapSchema, - SchemaMapper -} from '@graphql-tools/utils'; -import { makeExecutableSchema } from '@graphql-tools/schema'; -import { stitchSchemas } from '@graphql-tools/stitch'; -import { addMocksToSchema, IMocks } from '@graphql-tools/mock'; -import { SubschemaConfig } from '@graphql-tools/delegate'; - -export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; - -export interface IGraphQLComponentConfigObject { - component: IGraphQLComponent; - configuration?: SubschemaConfig; -} - -type GlobalContext = { [key: string]: unknown }; - -export type ContextFunction = ((ctx: GlobalContext) => any); - -export interface IDataSource { - name: string -} - -export type DataSource = { - [P in keyof T]: T[P] extends (ctx: GlobalContext, ...p: infer P) => infer R ? (...p: P) => R : never -} - -export type DataSourceMap = {[key: string]: IDataSource}; - -export type DataSourceInjectionFunction = ((ctx: GlobalContext) => DataSourceMap); - -export interface IContextConfig { - namespace: string; - factory: ContextFunction; -} - -export interface IContextWrapper extends ContextFunction { - use: (name: string|ContextFunction|null, fn?: ContextFunction|string) => void; -} - -export interface IGraphQLComponentOptions { - types?: TypeSource - resolvers?: IResolvers; - mocks?: boolean | IMocks; - imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; - context?: IContextConfig; - dataSources?: IDataSource[]; - dataSourceOverrides?: IDataSource[]; - pruneSchema?: boolean; - pruneSchemaOptions?: PruneSchemaOptions - federation?: boolean; - transforms?: SchemaMapper[] -} - -export interface IGraphQLComponent { - readonly name: string; - readonly schema: GraphQLSchema; - readonly context: IContextWrapper; - readonly types: TypeSource; - readonly resolvers: IResolvers; - readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; - readonly dataSources?: IDataSource[]; - readonly dataSourceOverrides?: IDataSource[]; - federation?: boolean; -} - -export default class GraphQLComponent implements IGraphQLComponent { - _schema: GraphQLSchema; - _types: TypeSource; - _resolvers: IResolvers; - _mocks: boolean | IMocks; - _imports: IGraphQLComponentConfigObject[]; - _context: ContextFunction; - _dataSources: IDataSource[]; - _dataSourceOverrides: IDataSource[]; - _pruneSchema: boolean; - _pruneSchemaOptions: PruneSchemaOptions - _federation: boolean; - _dataSourceContextInject: DataSourceInjectionFunction; - _transforms: SchemaMapper[] - - constructor({ - types, - resolvers, - mocks, - imports, - context, - dataSources, - dataSourceOverrides, + const debug = require('debug')('graphql-component'); + + import { buildFederatedSchema } from '@apollo/federation'; + import { GraphQLResolveInfo, GraphQLScalarType, GraphQLSchema } from 'graphql'; + + import { mergeTypeDefs } from '@graphql-tools/merge'; + import { pruneSchema, - pruneSchemaOptions, - federation, - transforms - }: IGraphQLComponentOptions) { - - this._types = Array.isArray(types) ? types : [types]; + IResolvers, + PruneSchemaOptions, + TypeSource, + mapSchema, + SchemaMapper + } from '@graphql-tools/utils'; + import { makeExecutableSchema } from '@graphql-tools/schema'; + import { stitchSchemas } from '@graphql-tools/stitch'; + import { addMocksToSchema, IMocks } from '@graphql-tools/mock'; + import { SubschemaConfig } from '@graphql-tools/delegate'; + + export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; + + export interface IGraphQLComponentConfigObject { + component: IGraphQLComponent; + configuration?: SubschemaConfig; + } - this._resolvers = bindResolvers(this, resolvers); - - this._mocks = mocks; + export type GlobalContext = { [key: string]: unknown }; - this._federation = federation; + export type ContextFunction = ((ctx: GlobalContext) => any); - this._transforms = transforms; + export interface IDataSource { + name: string + } - this._dataSources = dataSources || []; + export type DataSource = { + [P in keyof T]: T[P] extends (ctx: GlobalContext, ...p: infer P) => infer R ? (...p: P) => R : never + } - this._dataSourceOverrides = dataSourceOverrides || []; + export type DataSourceMap = {[key: string]: IDataSource}; - this._dataSourceContextInject = createDataSourceContextInjector(this._dataSources, this._dataSourceOverrides); + export type DataSourceInjectionFunction = ((ctx: GlobalContext) => DataSourceMap); - this._pruneSchema = pruneSchema; + export interface IContextConfig { + namespace: string; + factory: ContextFunction; + } - this._pruneSchemaOptions = pruneSchemaOptions; + export interface IContextWrapper extends ContextFunction { + use: (name: string|ContextFunction|null, fn?: ContextFunction|string) => void; + } - this._imports = imports && imports.length > 0 ? imports.map((i: GraphQLComponent | IGraphQLComponentConfigObject) => { - if (i instanceof GraphQLComponent) { - if (this._federation === true) { - i.federation = true; - } - return { component: i }; - } - else { - const importConfiguration = i as IGraphQLComponentConfigObject; - if (this._federation === true) { - importConfiguration.component.federation = true; - } - return importConfiguration; - } - }) : []; + export interface IGraphQLComponentOptions { + types?: TypeSource + resolvers?: IResolvers; + mocks?: boolean | IMocks; + imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; + context?: IContextConfig; + dataSources?: IDataSource[]; + dataSourceOverrides?: IDataSource[]; + pruneSchema?: boolean; + pruneSchemaOptions?: PruneSchemaOptions + federation?: boolean; + transforms?: SchemaMapper[] + } + export interface IGraphQLComponent { + readonly name: string; + readonly schema: GraphQLSchema; + readonly context: IContextWrapper; + readonly types: TypeSource; + readonly resolvers: IResolvers; + readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; + readonly dataSources?: IDataSource[]; + readonly dataSourceOverrides?: IDataSource[]; + federation?: boolean; + } - this._context = async (globalContext: GlobalContext): Promise => { - //TODO: currently the context injected into data sources won't have data sources on it - const ctx = { - dataSources: this._dataSourceContextInject(globalContext) - }; - - for (const { component } of this.imports) { - const { dataSources, ...importedContext } = await component.context(globalContext); - Object.assign(ctx.dataSources, dataSources); - Object.assign(ctx, importedContext); - } + export default class GraphQLComponent implements IGraphQLComponent { + _schema: GraphQLSchema; + _types: TypeSource; + _resolvers: IResolvers; + _mocks: boolean | IMocks; + _imports: IGraphQLComponentConfigObject[]; + _context: ContextFunction; + _dataSources: IDataSource[]; + _dataSourceOverrides: IDataSource[]; + _pruneSchema: boolean; + _pruneSchemaOptions: PruneSchemaOptions + _federation: boolean; + _dataSourceContextInject: DataSourceInjectionFunction; + _transforms: SchemaMapper[] + + constructor({ + types, + resolvers, + mocks, + imports, + context, + dataSources, + dataSourceOverrides, + pruneSchema, + pruneSchemaOptions, + federation, + transforms + }: IGraphQLComponentOptions) { + + this._types = Array.isArray(types) ? types : [types]; - if (context) { - debug(`building ${context.namespace} context`); + this._resolvers = bindResolvers(this, resolvers); + + this._mocks = mocks; - if (!ctx[context.namespace]) { - ctx[context.namespace] = {}; - } - - Object.assign(ctx[context.namespace], await context.factory.call(this, globalContext)); - } - - return ctx; - }; + this._federation = federation; - } + this._transforms = transforms; - get context(): IContextWrapper { + this._dataSources = dataSources || []; - const contextFn = async (context): Promise => { - debug(`building root context`); - - for (let { name, fn } of contextFn._middleware) { - debug(`applying ${name} middleware`); - context = await fn(context); - } - - const componentContext = await this._context(context); - - const globalContext = { - ...context, - ...componentContext - }; - - return globalContext; - }; - - contextFn._middleware = []; + this._dataSourceOverrides = dataSourceOverrides || []; - contextFn.use = function (name: string, fn: ContextFunction): IContextWrapper { - if (typeof name === 'function') { - fn = name; - name = 'unknown'; - } - debug(`adding ${name} middleware`); - contextFn._middleware.push({ name, fn }); - - return contextFn; - }; - - return contextFn; - } + this._dataSourceContextInject = createDataSourceContextInjector(this._dataSources, this._dataSourceOverrides); - get name(): string { - return this.constructor.name; - } + this._pruneSchema = pruneSchema; + + this._pruneSchemaOptions = pruneSchemaOptions; + + this._imports = imports && imports.length > 0 ? imports.map((i: GraphQLComponent | IGraphQLComponentConfigObject) => { + if (i instanceof GraphQLComponent) { + if (this._federation === true) { + i.federation = true; + } + return { component: i }; + } + else { + const importConfiguration = i as IGraphQLComponentConfigObject; + if (this._federation === true) { + importConfiguration.component.federation = true; + } + return importConfiguration; + } + }) : []; + + + this._context = async (globalContext: GlobalContext): Promise => { + //TODO: currently the context injected into data sources won't have data sources on it + const ctx = { + dataSources: this._dataSourceContextInject(globalContext) + }; + + for (const { component } of this.imports) { + const { dataSources, ...importedContext } = await component.context(globalContext); + Object.assign(ctx.dataSources, dataSources); + Object.assign(ctx, importedContext); + } + + if (context) { + debug(`building ${context.namespace} context`); + + if (!ctx[context.namespace]) { + ctx[context.namespace] = {}; + } + + Object.assign(ctx[context.namespace], await context.factory.call(this, globalContext)); + } + + return ctx; + }; - get schema() : GraphQLSchema { - if (this._schema) { - return this._schema; } - let makeSchema: (schemaConfig: any) => GraphQLSchema = undefined; + get context(): IContextWrapper { + + const contextFn = async (context): Promise => { + debug(`building root context`); + + for (let { name, fn } of contextFn._middleware) { + debug(`applying ${name} middleware`); + context = await fn(context); + } + + const componentContext = await this._context(context); + + const globalContext = { + ...context, + ...componentContext + }; + + return globalContext; + }; + + contextFn._middleware = []; - if (this._federation) { - makeSchema = (schemaConfig): GraphQLSchema => { - return buildFederatedSchema(schemaConfig); + contextFn.use = function (name: string, fn: ContextFunction): IContextWrapper { + if (typeof name === 'function') { + fn = name; + name = 'unknown'; + } + debug(`adding ${name} middleware`); + contextFn._middleware.push({ name, fn }); + + return contextFn; }; + + return contextFn; } - else { - makeSchema = makeExecutableSchema; + + get name(): string { + return this.constructor.name; } - if (this._imports.length > 0) { - // iterate through the imports and construct subschema configuration objects - const subschemas = this._imports.map((imp) => { - const { component, configuration = {} } = imp; + get schema() : GraphQLSchema { + if (this._schema) { + return this._schema; + } - return { - schema: component.schema, - ...configuration + let makeSchema: (schemaConfig: any) => GraphQLSchema = undefined; + + if (this._federation) { + makeSchema = (schemaConfig): GraphQLSchema => { + return buildFederatedSchema(schemaConfig); }; - }); - - // construct an aggregate schema from the schemas of imported - // components and this component's types/resolvers (if present) - this._schema = stitchSchemas({ - subschemas, - typeDefs: this._types, - resolvers: this._resolvers, - mergeDirectives: true - }); - } - else { - const schemaConfig = { - typeDefs: mergeTypeDefs(this._types), - resolvers: this._resolvers + } + else { + makeSchema = makeExecutableSchema; } - this._schema = makeSchema(schemaConfig); - } + if (this._imports.length > 0) { + // iterate through the imports and construct subschema configuration objects + const subschemas = this._imports.map((imp) => { + const { component, configuration = {} } = imp; + + return { + schema: component.schema, + ...configuration + }; + }); + + // construct an aggregate schema from the schemas of imported + // components and this component's types/resolvers (if present) + this._schema = stitchSchemas({ + subschemas, + typeDefs: this._types, + resolvers: this._resolvers, + mergeDirectives: true + }); + } + else { + const schemaConfig = { + typeDefs: mergeTypeDefs(this._types), + resolvers: this._resolvers + } - if (this._transforms) { - this._schema = transformSchema(this._schema, this._transforms); - } + this._schema = makeSchema(schemaConfig); + } - if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { - debug(`adding default mocks to the schema for ${this.name}`); - // if mocks are a boolean support simply applying default mocks - this._schema = addMocksToSchema({schema: this._schema, preserveResolvers: true}); - } - else if (this._mocks !== undefined && typeof this._mocks === 'object') { - debug(`adding custom mocks to the schema for ${this.name}`); - // else if mocks is an object, that means the user provided - // custom mocks, with which we pass them to addMocksToSchema so they are applied - this._schema = addMocksToSchema({schema: this._schema, mocks: this._mocks, preserveResolvers: true}); - } + if (this._transforms) { + this._schema = transformSchema(this._schema, this._transforms); + } + + if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { + debug(`adding default mocks to the schema for ${this.name}`); + // if mocks are a boolean support simply applying default mocks + this._schema = addMocksToSchema({schema: this._schema, preserveResolvers: true}); + } + else if (this._mocks !== undefined && typeof this._mocks === 'object') { + debug(`adding custom mocks to the schema for ${this.name}`); + // else if mocks is an object, that means the user provided + // custom mocks, with which we pass them to addMocksToSchema so they are applied + this._schema = addMocksToSchema({schema: this._schema, mocks: this._mocks, preserveResolvers: true}); + } - if (this._pruneSchema) { - debug(`pruning the schema for ${this.name}`); - this._schema = pruneSchema(this._schema, this._pruneSchemaOptions); + if (this._pruneSchema) { + debug(`pruning the schema for ${this.name}`); + this._schema = pruneSchema(this._schema, this._pruneSchemaOptions); + } + + debug(`created schema for ${this.name}`); + + return this._schema; } - debug(`created schema for ${this.name}`); + get types(): TypeSource { + return this._types; + } - return this._schema; - } + get resolvers(): IResolvers { + return this._resolvers; + } - get types(): TypeSource { - return this._types; - } + get imports(): IGraphQLComponentConfigObject[] { + return this._imports; + } - get resolvers(): IResolvers { - return this._resolvers; - } + get dataSources(): IDataSource[] { + return this._dataSources; + } - get imports(): IGraphQLComponentConfigObject[] { - return this._imports; - } + get dataSourceOverrides(): IDataSource[] { + return this._dataSourceOverrides; + } - get dataSources(): IDataSource[] { - return this._dataSources; - } + set federation(flag) { + this._federation = flag; + } - get dataSourceOverrides(): IDataSource[] { - return this._dataSourceOverrides; - } + get federation(): boolean { + return this._federation; + } - set federation(flag) { - this._federation = flag; } - get federation(): boolean { - return this._federation; - } + /** + * Wraps data sources with a proxy that intercepts calls to data source methods and injects the current context + * @param {IDataSource[]} dataSources + * @param {IDataSource[]} dataSourceOverrides + * @returns {DataSourceInjectionFunction} a function that returns a map of data sources with methods that have been intercepted + */ + const createDataSourceContextInjector = (dataSources: IDataSource[], dataSourceOverrides: IDataSource[]): DataSourceInjectionFunction => { + const intercept = (instance: IDataSource, context: any) => { + debug(`intercepting ${instance.constructor.name}`); + + return new Proxy(instance, { + get(target, key) { + if (typeof target[key] !== 'function' || key === instance.constructor.name) { + return target[key]; + } + const original = target[key]; -} - -/** - * Wraps data sources with a proxy that intercepts calls to data source methods and injects the current context - * @param {IDataSource[]} dataSources - * @param {IDataSource[]} dataSourceOverrides - * @returns {DataSourceInjectionFunction} a function that returns a map of data sources with methods that have been intercepted - */ -const createDataSourceContextInjector = (dataSources: IDataSource[], dataSourceOverrides: IDataSource[]): DataSourceInjectionFunction => { - const intercept = (instance: IDataSource, context: any) => { - debug(`intercepting ${instance.constructor.name}`); - - return new Proxy(instance, { - get(target, key) { - if (typeof target[key] !== 'function' || key === instance.constructor.name) { - return target[key]; + return function (...args) { + return original.call(instance, context, ...args); + }; } - const original = target[key]; - - return function (...args) { - return original.call(instance, context, ...args); - }; - } - }) as any as DataSource; - }; + }) as any as DataSource; + }; - return (context: any = {}): DataSourceMap => { - const proxiedDataSources = {}; + return (context: any = {}): DataSourceMap => { + const proxiedDataSources = {}; - // Inject data sources - for (const dataSource of dataSources) { - proxiedDataSources[dataSource.name || dataSource.constructor.name] = intercept(dataSource, context); - } + // Inject data sources + for (const dataSource of dataSources) { + proxiedDataSources[dataSource.name || dataSource.constructor.name] = intercept(dataSource, context); + } - // Override data sources - for (const dataSourceOverride of dataSourceOverrides) { - proxiedDataSources[dataSourceOverride.name || dataSourceOverride.constructor.name] = intercept(dataSourceOverride, context); - } + // Override data sources + for (const dataSourceOverride of dataSourceOverrides) { + proxiedDataSources[dataSourceOverride.name || dataSourceOverride.constructor.name] = intercept(dataSourceOverride, context); + } - return proxiedDataSources; + return proxiedDataSources; + }; }; -}; - -/** - * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided - * @param {string} parentType - the type whose field resolver is being - * wrapped/memoized - * @param {string} fieldName - the field on the parentType whose resolver - * function is being wrapped/memoized - * @param {function} resolve - the resolver function that parentType. - * fieldName is mapped to - * @returns {function} a function that wraps the input resolver function and - * whose closure scope contains a WeakMap to achieve memoization of the wrapped - * input resolver function - */ - const memoize = function (parentType: string, fieldName: string, resolve: ResolverFunction): ResolverFunction { - const _cache = new WeakMap(); - - return function _memoizedResolver(_, args, context, info) { - const path = info && info.path && info.path.key; - const key = `${path}_${JSON.stringify(args)}`; - - debug(`executing ${parentType}.${fieldName}`); - - let cached = _cache.get(context); - - if (cached && cached[key]) { - debug(`return cached result of memoized ${parentType}.${fieldName}`); - return cached[key]; - } - if (!cached) { - cached = {}; - } + /** + * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided + * @param {string} parentType - the type whose field resolver is being + * wrapped/memoized + * @param {string} fieldName - the field on the parentType whose resolver + * function is being wrapped/memoized + * @param {function} resolve - the resolver function that parentType. + * fieldName is mapped to + * @returns {function} a function that wraps the input resolver function and + * whose closure scope contains a WeakMap to achieve memoization of the wrapped + * input resolver function + */ + const memoize = function (parentType: string, fieldName: string, resolve: ResolverFunction): ResolverFunction { + const _cache = new WeakMap(); + + return function _memoizedResolver(_, args, context, info) { + const path = info && info.path && info.path.key; + const key = `${path}_${JSON.stringify(args)}`; + + debug(`executing ${parentType}.${fieldName}`); + + let cached = _cache.get(context); + + if (cached && cached[key]) { + debug(`return cached result of memoized ${parentType}.${fieldName}`); + return cached[key]; + } - const result = resolve(_, args, context, info); + if (!cached) { + cached = {}; + } + + const result = resolve(_, args, context, info); - cached[key] = result; + cached[key] = result; - _cache.set(context, cached); + _cache.set(context, cached); - debug(`cached ${parentType}.${fieldName}`); + debug(`cached ${parentType}.${fieldName}`); - return result; + return result; + }; }; -}; - -/** - * make 'this' in resolver functions equal to the input bindContext - * @param {Object} bind - the object context to bind to resolver functions - * @param {Object} resolvers - the resolver map containing the resolver - * functions to bind - * @returns {Object} - an object identical in structure to the input resolver - * map, except with resolver function bound to the input argument bind - */ -const bindResolvers = function (bindContext: IGraphQLComponent, resolvers: IResolvers = {}): IResolvers { - const boundResolvers = {}; - - for (const [type, fields] of Object.entries(resolvers)) { - // dont bind an object that is an instance of a graphql scalar - if (fields instanceof GraphQLScalarType) { - debug(`not binding ${type}'s fields since ${type}'s fields are an instance of GraphQLScalarType`) - boundResolvers[type] = fields; - continue; - } - if (!boundResolvers[type]) { - boundResolvers[type] = {}; - } + /** + * make 'this' in resolver functions equal to the input bindContext + * @param {Object} bind - the object context to bind to resolver functions + * @param {Object} resolvers - the resolver map containing the resolver + * functions to bind + * @returns {Object} - an object identical in structure to the input resolver + * map, except with resolver function bound to the input argument bind + */ + const bindResolvers = function (bindContext: IGraphQLComponent, resolvers: IResolvers = {}): IResolvers { + const boundResolvers = {}; + + for (const [type, fields] of Object.entries(resolvers)) { + // dont bind an object that is an instance of a graphql scalar + if (fields instanceof GraphQLScalarType) { + debug(`not binding ${type}'s fields since ${type}'s fields are an instance of GraphQLScalarType`) + boundResolvers[type] = fields; + continue; + } - for (const [field, resolver] of Object.entries(fields)) { - if (['Query', 'Mutation'].indexOf(type) > -1) { - debug(`memoized ${type}.${field}`); - boundResolvers[type][field] = memoize(type, field, resolver.bind(bindContext)); + if (!boundResolvers[type]) { + boundResolvers[type] = {}; } - else { - // only bind resolvers that are functions - if (typeof resolver === 'function') { - debug(`binding ${type}.${field}`); - boundResolvers[type][field] = resolver.bind(bindContext); + + for (const [field, resolver] of Object.entries(fields)) { + if (['Query', 'Mutation'].indexOf(type) > -1) { + debug(`memoized ${type}.${field}`); + boundResolvers[type][field] = memoize(type, field, resolver.bind(bindContext)); } else { - debug(`not binding ${type}.${field} since ${field} is not mapped to a function`); - boundResolvers[type][field] = resolver; + // only bind resolvers that are functions + if (typeof resolver === 'function') { + debug(`binding ${type}.${field}`); + boundResolvers[type][field] = resolver.bind(bindContext); + } + else { + debug(`not binding ${type}.${field} since ${field} is not mapped to a function`); + boundResolvers[type][field] = resolver; + } } } } - } - return boundResolvers; -}; - -/** - * Transforms a schema using the provided transforms - * @param {GraphQLSchema} schema The schema to transform - * @param {SchemaMapper[]} transforms An array of schema transforms - * @returns {GraphQLSchema} The transformed schema - */ -const transformSchema = function (schema: GraphQLSchema, transforms: SchemaMapper[]) { - const functions = {}; - const mapping = {}; - - for (const transform of transforms) { - for (const [key, fn] of Object.entries(transform)) { - if (!mapping[key]) { - functions[key] = []; - mapping[key] = function (arg) { - while (functions[key].length) { - const mapper = functions[key].shift(); - arg = mapper(arg); - if (!arg) { - break; + return boundResolvers; + }; + + /** + * Transforms a schema using the provided transforms + * @param {GraphQLSchema} schema The schema to transform + * @param {SchemaMapper[]} transforms An array of schema transforms + * @returns {GraphQLSchema} The transformed schema + */ + const transformSchema = function (schema: GraphQLSchema, transforms: SchemaMapper[]) { + const functions = {}; + const mapping = {}; + + for (const transform of transforms) { + for (const [key, fn] of Object.entries(transform)) { + if (!mapping[key]) { + functions[key] = []; + mapping[key] = function (arg) { + while (functions[key].length) { + const mapper = functions[key].shift(); + arg = mapper(arg); + if (!arg) { + break; + } } + return arg; } - return arg; } + functions[key].push(fn); } - functions[key].push(fn); - } - } + } - return mapSchema(schema, mapping); -} \ No newline at end of file + return mapSchema(schema, mapping); + } \ No newline at end of file From 2cbb86a8dbe2601dbdbc8324eb9a29dde8dcf548 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 28 Jan 2025 11:55:14 -0600 Subject: [PATCH 24/40] Updated context to not only be extendable with a given type, but to by default have introspection into the dataSources field. --- .../property-component/resolvers.ts | 2 +- src/index.ts | 30 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/examples/composition/property-component/resolvers.ts b/examples/composition/property-component/resolvers.ts index 2894433..f1e1ab1 100644 --- a/examples/composition/property-component/resolvers.ts +++ b/examples/composition/property-component/resolvers.ts @@ -2,7 +2,7 @@ export const resolvers = { Query: { - propertyById(_, { id }, { dataSources}) { + propertyById(_, { id }, { dataSources }) { return dataSources.PropertyDataSource.getPropertyById(id); } } diff --git a/src/index.ts b/src/index.ts index 4549e0d..58d2d2a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,21 +24,23 @@ configuration?: SubschemaConfig; } - export type GlobalContext = { [key: string]: unknown }; + export interface ComponentContext extends Record { + dataSources: DataSourceMap; + } - export type ContextFunction = ((ctx: GlobalContext) => any); + export type ContextFunction = ((context: Record) => any); export interface IDataSource { name: string } export type DataSource = { - [P in keyof T]: T[P] extends (ctx: GlobalContext, ...p: infer P) => infer R ? (...p: P) => R : never + [P in keyof T]: T[P] extends (context: ComponentContext, ...p: infer P) => infer R ? (...p: P) => R : never } export type DataSourceMap = {[key: string]: IDataSource}; - export type DataSourceInjectionFunction = ((ctx: GlobalContext) => DataSourceMap); + export type DataSourceInjectionFunction = ((context: Record) => DataSourceMap); export interface IContextConfig { namespace: string; @@ -49,9 +51,9 @@ use: (name: string|ContextFunction|null, fn?: ContextFunction|string) => void; } - export interface IGraphQLComponentOptions { + export interface IGraphQLComponentOptions { types?: TypeSource - resolvers?: IResolvers; + resolvers?: IResolvers; mocks?: boolean | IMocks; imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; context?: IContextConfig; @@ -63,22 +65,22 @@ transforms?: SchemaMapper[] } - export interface IGraphQLComponent { + export interface IGraphQLComponent { readonly name: string; readonly schema: GraphQLSchema; readonly context: IContextWrapper; readonly types: TypeSource; - readonly resolvers: IResolvers; + readonly resolvers: IResolvers; readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; readonly dataSourceOverrides?: IDataSource[]; federation?: boolean; } - export default class GraphQLComponent implements IGraphQLComponent { + export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; _types: TypeSource; - _resolvers: IResolvers; + _resolvers: IResolvers; _mocks: boolean | IMocks; _imports: IGraphQLComponentConfigObject[]; _context: ContextFunction; @@ -141,7 +143,7 @@ }) : []; - this._context = async (globalContext: GlobalContext): Promise => { + this._context = async (globalContext: Record): Promise => { //TODO: currently the context injected into data sources won't have data sources on it const ctx = { dataSources: this._dataSourceContextInject(globalContext) @@ -163,14 +165,14 @@ Object.assign(ctx[context.namespace], await context.factory.call(this, globalContext)); } - return ctx; + return ctx as TContextType; }; } get context(): IContextWrapper { - const contextFn = async (context): Promise => { + const contextFn = async (context): Promise => { debug(`building root context`); for (let { name, fn } of contextFn._middleware) { @@ -283,7 +285,7 @@ return this._types; } - get resolvers(): IResolvers { + get resolvers(): IResolvers { return this._resolvers; } From 415083e727eca6541c981937aad31d4e45166b7e Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 28 Jan 2025 12:55:21 -0600 Subject: [PATCH 25/40] Recent build --- dist/index.d.ts | 27 +++++++++++++-------------- dist/index.js | 2 +- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index efb9894..d0ecf49 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -7,20 +7,20 @@ export interface IGraphQLComponentConfigObject { component: IGraphQLComponent; configuration?: SubschemaConfig; } -type GlobalContext = { - [key: string]: unknown; -}; -export type ContextFunction = ((ctx: GlobalContext) => any); +export interface ComponentContext extends Record { + dataSources: DataSourceMap; +} +export type ContextFunction = ((context: Record) => any); export interface IDataSource { name: string; } export type DataSource = { - [P in keyof T]: T[P] extends (ctx: GlobalContext, ...p: infer P) => infer R ? (...p: P) => R : never; + [P in keyof T]: T[P] extends (context: ComponentContext, ...p: infer P) => infer R ? (...p: P) => R : never; }; export type DataSourceMap = { [key: string]: IDataSource; }; -export type DataSourceInjectionFunction = ((ctx: GlobalContext) => DataSourceMap); +export type DataSourceInjectionFunction = ((context: Record) => DataSourceMap); export interface IContextConfig { namespace: string; factory: ContextFunction; @@ -28,9 +28,9 @@ export interface IContextConfig { export interface IContextWrapper extends ContextFunction { use: (name: string | ContextFunction | null, fn?: ContextFunction | string) => void; } -export interface IGraphQLComponentOptions { +export interface IGraphQLComponentOptions { types?: TypeSource; - resolvers?: IResolvers; + resolvers?: IResolvers; mocks?: boolean | IMocks; imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; context?: IContextConfig; @@ -41,21 +41,21 @@ export interface IGraphQLComponentOptions { federation?: boolean; transforms?: SchemaMapper[]; } -export interface IGraphQLComponent { +export interface IGraphQLComponent { readonly name: string; readonly schema: GraphQLSchema; readonly context: IContextWrapper; readonly types: TypeSource; - readonly resolvers: IResolvers; + readonly resolvers: IResolvers; readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; readonly dataSourceOverrides?: IDataSource[]; federation?: boolean; } -export default class GraphQLComponent implements IGraphQLComponent { +export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; _types: TypeSource; - _resolvers: IResolvers; + _resolvers: IResolvers; _mocks: boolean | IMocks; _imports: IGraphQLComponentConfigObject[]; _context: ContextFunction; @@ -71,11 +71,10 @@ export default class GraphQLComponent implements IGraphQLComponent { get name(): string; get schema(): GraphQLSchema; get types(): TypeSource; - get resolvers(): IResolvers; + get resolvers(): IResolvers; get imports(): IGraphQLComponentConfigObject[]; get dataSources(): IDataSource[]; get dataSourceOverrides(): IDataSource[]; set federation(flag: boolean); get federation(): boolean; } -export {}; diff --git a/dist/index.js b/dist/index.js index 0abf5e3..f4b2d95 100644 --- a/dist/index.js +++ b/dist/index.js @@ -315,4 +315,4 @@ const transformSchema = function (schema, transforms) { } return (0, utils_1.mapSchema)(schema, mapping); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUE2RC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBbUI7SUFDekIsUUFBUSxDQUFrQztJQUMxQyxRQUFRLENBQWtCO0lBQzFCLFlBQVksQ0FBZ0I7SUFDNUIsb0JBQW9CLENBQWdCO0lBQ3BDLFlBQVksQ0FBVTtJQUN0QixtQkFBbUIsQ0FBb0I7SUFDdkMsV0FBVyxDQUFVO0lBQ3JCLHdCQUF3QixDQUE4QjtJQUN0RCxXQUFXLENBQWdCO0lBRTNCLFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFH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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUErRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQWdDO0lBQzFDLE1BQU0sQ0FBbUI7SUFDekIsUUFBUSxDQUFrQztJQUMxQyxRQUFRLENBQWtCO0lBQzFCLFlBQVksQ0FBZ0I7SUFDNUIsb0JBQW9CLENBQWdCO0lBQ3BDLFlBQVksQ0FBVTtJQUN0QixtQkFBbUIsQ0FBb0I7SUFDdkMsV0FBVyxDQUFVO0lBQ3JCLHdCQUF3QixDQUE4QjtJQUN0RCxXQUFXLENBQWdCO0lBRTNCLFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFH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 \ No newline at end of file From 982724644276a2c90be947a739bc7fc7e9150822 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Tue, 28 Jan 2025 14:33:07 -0600 Subject: [PATCH 26/40] updated eslint --- .eslintrc | 12 - eslint.config.mjs | 16 + package-lock.json | 5543 --------------------------------------------- package.json | 10 +- src/index.ts | 787 +++---- 5 files changed, 417 insertions(+), 5951 deletions(-) delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs delete mode 100644 package-lock.json diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 30e9725..0000000 --- a/.eslintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["eslint:recommended"], - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, - "env": { - "browser": false, - "node": true, - "es6": true - } -} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..ba00bc5 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,16 @@ +import globals from "globals"; +import tseslint from "typescript-eslint"; + + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + {files: ["**/*.{js,mjs,cjs,ts}"]}, + {files: ["**/*.js"], languageOptions: {sourceType: "script"}}, + {languageOptions: { globals: globals.node }}, + ...tseslint.configs.recommended, + { + rules: { + "@typescript-eslint/no-explicit-any": "off" + } +} +]; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 815636a..0000000 --- a/package-lock.json +++ /dev/null @@ -1,5543 +0,0 @@ -{ - "name": "graphql-component", - "version": "3.0.4", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@apollo/client": { - "version": "3.6.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/client/-/client-3.6.9.tgz", - "integrity": "sha1-rQ7i46PJLb7UrNaRe2FYpJJznZQ=", - "optional": true, - "requires": { - "@graphql-typed-document-node/core": "^3.1.1", - "@wry/context": "^0.6.0", - "@wry/equality": "^0.5.0", - "@wry/trie": "^0.3.0", - "graphql-tag": "^2.12.6", - "hoist-non-react-statics": "^3.3.2", - "optimism": "^0.16.1", - "prop-types": "^15.7.2", - "symbol-observable": "^4.0.0", - "ts-invariant": "^0.10.3", - "tslib": "^2.3.0", - "zen-observable-ts": "^1.2.5" - } - }, - "@apollo/federation": { - "version": "0.28.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/federation/-/federation-0.28.0.tgz", - "integrity": "sha1-u/zePzJ7PsZdz9mMb1LWYjo4slE=", - "requires": { - "apollo-graphql": "^0.9.3", - "apollo-server-types": "^3.0.2", - "lodash.xorby": "^4.7.0" - } - }, - "@apollo/gateway": { - "version": "0.28.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/gateway/-/gateway-0.28.3.tgz", - "integrity": "sha1-nav8Zq3a3/gSGC/1Jmc8bPZnltc=", - "dev": true, - "requires": { - "@apollo/federation": "^0.25.1", - "@apollo/query-planner": "^0.2.1", - "@types/node-fetch": "2.5.10", - "apollo-graphql": "^0.9.3", - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-core": "^2.23.0", - "apollo-server-env": "^3.0.0", - "apollo-server-errors": "^2.5.0", - "apollo-server-types": "^0.9.0", - "loglevel": "^1.6.1", - "make-fetch-happen": "^8.0.0", - "pretty-format": "^26.0.0" - }, - "dependencies": { - "@apollo/federation": { - "version": "0.25.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/federation/-/federation-0.25.2.tgz", - "integrity": "sha1-ELLiKsIOZHAf1tMdmrv39BGwN2M=", - "dev": true, - "requires": { - "apollo-graphql": "^0.9.3", - "lodash.xorby": "^4.7.0" - } - }, - "@apollo/protobufjs": { - "version": "1.2.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", - "integrity": "sha1-S9ks13Acyu9tUXzbda8nVfBJ+Hw=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - } - }, - "apollo-reporting-protobuf": { - "version": "0.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", - "integrity": "sha1-rp2WeTTT2O2Bb8haDYBo70XDcbk=", - "dev": true, - "requires": { - "@apollo/protobufjs": "1.2.2" - } - }, - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha1-BzPC71CupZbMkM9ApT9uoq1ALNA=", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - }, - "apollo-server-types": { - "version": "0.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-types/-/apollo-server-types-0.9.0.tgz", - "integrity": "sha1-zPVQszsHxIxy8QT74odiMrQEhIs=", - "dev": true, - "requires": { - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - } - } - }, - "@apollo/protobufjs": { - "version": "1.2.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/protobufjs/-/protobufjs-1.2.4.tgz", - "integrity": "sha1-2RPnYnIQ7F79dYzut1HHdsaLoTM=", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - } - }, - "@apollo/query-planner": { - "version": "0.2.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/query-planner/-/query-planner-0.2.3.tgz", - "integrity": "sha1-gBiuEsJFQYOFQcx7INamKFVpGOU=", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "deep-equal": "^2.0.5", - "pretty-format": "^26.0.0" - } - }, - "@apollo/utils.keyvaluecache": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz", - "integrity": "sha1-RvMQ+FkGfv6foSYVbGlU+DgQgNI=", - "requires": { - "@apollo/utils.logger": "^1.0.0", - "lru-cache": "^7.10.1" - } - }, - "@apollo/utils.logger": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/utils.logger/-/utils.logger-1.0.0.tgz", - "integrity": "sha1-bjRgoiUMLvfCw7C+a14UihWW8Ss=" - }, - "@apollographql/apollo-tools": { - "version": "0.5.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz", - "integrity": "sha1-yzmYxs8S5JS5DHM/RN2ZNeLYGWw=", - "dev": true - }, - "@apollographql/graphql-playground-html": { - "version": "1.6.27", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz", - "integrity": "sha1-vJq2DpRFqiqIE7TpTxUvpyt1YzU=", - "dev": true, - "requires": { - "xss": "^1.0.8" - } - }, - "@apollographql/graphql-upload-8-fork": { - "version": "8.1.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz", - "integrity": "sha1-oNTg1c7I4SbXi9kVwmTWuQ9XhLw=", - "dev": true, - "requires": { - "@types/express": "*", - "@types/fs-capacitor": "*", - "@types/koa": "*", - "busboy": "^0.3.1", - "fs-capacitor": "^2.0.4", - "http-errors": "^1.7.3", - "object-path": "^0.11.4" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha1-OyXTjIlgC6otzCGe36iKdOssQno=", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/generator": { - "version": "7.18.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/generator/-/generator-7.18.10.tgz", - "integrity": "sha1-eU8yi/q9y68Ov5v5G1tXth+neio=", - "dev": true, - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha1-DAzumzXSyhkEeHVoZbs1KEIvUb4=", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha1-lA5ghKVd7oZ9M7Tkh9omdjZehrA=", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha1-1NLI+0uuqlxouZzIJFxWVU+SZng=", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha1-c2eUm8dbIMbVpdSpe7ooJK6O8HU=", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha1-GB8i0o6+GzhX+ldfXCkLGq9lm1Y=", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha1-nJfjDTGyuMcqHQiYTyyptXTXoHY=", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha1-gRWGAek+JWN5Wty/vfXWS+Py7N8=", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.18.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/parser/-/parser-7.18.10.tgz", - "integrity": "sha1-lLX4UiNW5p6Cdydq32ftKAyQ7ME=", - "dev": true - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha1-b5E0g1lw0dvwg1wNEAyfON4MXnE=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.18.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/traverse/-/traverse-7.18.10.tgz", - "integrity": "sha1-N62X0csA76hpuR3V0ZUPimzwywg=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/globals/-/globals-11.12.0.tgz", - "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.18.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha1-SQjoG2sznKfGt6VVpfwpRG8m3eY=", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha1-VVGTqy47s7atw9VRycAw2ehg2vY=", - "dev": true - }, - "@graphql-tools/merge": { - "version": "8.3.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@graphql-tools/merge/-/merge-8.3.1.tgz", - "integrity": "sha1-BhIZQq0omCoUY128h7XUiKBB1yI=", - "requires": { - "@graphql-tools/utils": "8.9.0", - "tslib": "^2.4.0" - }, - "dependencies": { - "@graphql-tools/utils": { - "version": "8.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@graphql-tools/utils/-/utils-8.9.0.tgz", - "integrity": "sha1-xqpfZRycmeGspVUQryG1bsKWzbc=", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@graphql-tools/schema": { - "version": "8.5.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@graphql-tools/schema/-/schema-8.5.1.tgz", - "integrity": "sha1-wvL/FEg4CRmjMDEjmclHHbJYC1g=", - "requires": { - "@graphql-tools/merge": "8.3.1", - "@graphql-tools/utils": "8.9.0", - "tslib": "^2.4.0", - "value-or-promise": "1.0.11" - }, - "dependencies": { - "@graphql-tools/utils": { - "version": "8.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@graphql-tools/utils/-/utils-8.9.0.tgz", - "integrity": "sha1-xqpfZRycmeGspVUQryG1bsKWzbc=", - "requires": { - "tslib": "^2.4.0" - } - } - } - }, - "@graphql-tools/utils": { - "version": "8.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@graphql-tools/utils/-/utils-8.9.0.tgz", - "integrity": "sha1-xqpfZRycmeGspVUQryG1bsKWzbc=", - "requires": { - "tslib": "^2.4.0" - } - }, - "@graphql-typed-document-node/core": { - "version": "3.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@graphql-typed-document-node/core/-/core-3.1.1.tgz", - "integrity": "sha1-B214zpmCIljPgT7MHn+kYPp00FI=", - "optional": true - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha1-vvWlMgMOHYii9abZM/hOlyJu1I4=", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@josephg/resolvable": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@josephg/resolvable/-/resolvable-1.0.1.tgz", - "integrity": "sha1-abxNt1TXnhovF6ZQ00ZuA42Upes=", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha1-wa7cYehT8rufXf5tRELTtWWyU7k=", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha1-IgOxGMFXchrd/mnUe3BGVGMGbXg=", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha1-fGz5mNbSC5FMClWpGuko/yWWXnI=", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha1-rdTJjTQUcqKJGQtCTvvbCWmRuyQ=", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha1-sjGggdj2Z5bkda1Yih70cxEnAe0=", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha1-cvcZ/pNeaHxWpPrs88A9BrpZMlc=", - "dev": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha1-GoLD43L3yuklPrZtclQ9a4aFxnQ=", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha1-OALd0hpQqUm2ch3dcto25n5/Gy0=", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha1-P9wrbLWJNbIb+40WJesTAEhDFuc=", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha1-Yn9/TL21bmQZ+iwaPkdRzk9qALE=", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha1-WYGo2xi1a6OO8O+32ZWxKqe1GRg=", - "dev": true - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha1-zLkURTYBeaBOf+av94wA/8Hur4I=", - "dev": true - }, - "@types/accepts": { - "version": "1.3.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-w0vsEVz8dG4E/loFnfTOfns5FXU=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha1-rqIFnii3ZYY5CBNHrE+rPeFm5vA=", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha1-X89q5EXkAh0fwiGaSHPMc6O7KtE=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/content-disposition": { - "version": "0.5.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/content-disposition/-/content-disposition-0.5.5.tgz", - "integrity": "sha1-ZQgg6V3jRuH4TjBmfRaMj9JapuM=", - "dev": true - }, - "@types/cookies": { - "version": "0.7.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/cookies/-/cookies-0.7.7.tgz", - "integrity": "sha1-epJFPR0WOJwFpTAe71ZvNJRs/YE=", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "@types/cors": { - "version": "2.8.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/cors/-/cors-2.8.10.tgz", - "integrity": "sha1-YcyEaYSeW83QxwRBIiZcOc7BDPQ=", - "dev": true - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/express/-/express-4.17.13.tgz", - "integrity": "sha1-p24plXKJmbq1GjP6vOHXBaNwkDQ=", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha1-Dy+ZYX+o+WlhcMRhUsz3UAs0rAQ=", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/fs-capacitor": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", - "integrity": "sha1-FxE+JYF/WE9YEA+3oI7tKIuBlW4=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-assert": { - "version": "1.5.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/http-assert/-/http-assert-1.5.3.tgz", - "integrity": "sha1-7449Go1Gw4fwSrDy6KuMsMUHhmE=", - "dev": true - }, - "@types/http-errors": { - "version": "1.8.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/http-errors/-/http-errors-1.8.2.tgz", - "integrity": "sha1-cxW0xMVPgtE/phwijsXC6lzJ4OE=", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha1-hGfUs8CHgF1jWASAiQeRJ3zjXEQ=", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha1-wUwk8Y6oGQwRjudWK3/5mjZVJoY=", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha1-kVP+mLuivVZaY63ZQ21vDX+EaP8=", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/keygrip": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha1-UTq/0lbXrQvx7hhzYGMXszsbKnI=", - "dev": true - }, - "@types/koa": { - "version": "2.13.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/koa/-/koa-2.13.5.tgz", - "integrity": "sha1-ZLPKTVTgjABi6J7GZsn0VEOyGmE=", - "dev": true, - "requires": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha1-hesugKxQvpXzfM+MQHwJu+NGjp0=", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/long/-/long-4.0.2.tgz", - "integrity": "sha1-t0EpcZ/I0RwBhoAQCC1IO3VFWRo=" - }, - "@types/mime": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/mime/-/mime-3.0.0.tgz", - "integrity": "sha1-6amQOJRAXGplUfF3TfTmTZgE1pw=", - "dev": true - }, - "@types/node": { - "version": "10.17.60", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/node/-/node-10.17.60.tgz", - "integrity": "sha1-NfPWIT2u2V2n8Pc+dbzGmA6QWXs=" - }, - "@types/node-fetch": { - "version": "2.5.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/node-fetch/-/node-fetch-2.5.10.tgz", - "integrity": "sha1-m01KBCVWL5/OpwsSyz/N2UbKgTI=", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss=", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha1-zWZ7z90CUhOq+3ylkVqTJZCs3Nw=", - "dev": true - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha1-x5MP9hr7M04SGp2ngKrA2bjzQVU=", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/ws": { - "version": "7.4.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha1-98OQo296Bnmqad4tUBMZ9PjZtwI=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "15.0.14", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha1-Jtgh3biecEkhYLZtEKDrbfj2+wY=", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha1-DGDlN/p5D1+Ucu0ndsK3HsEXNRs=", - "dev": true - }, - "@wry/context": { - "version": "0.6.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@wry/context/-/context-0.6.1.tgz", - "integrity": "sha1-w8KcCtYirbAPalMwPE+WXuBuvrI=", - "optional": true, - "requires": { - "tslib": "^2.3.0" - } - }, - "@wry/equality": { - "version": "0.5.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@wry/equality/-/equality-0.5.2.tgz", - "integrity": "sha1-csinp9iE3/MLYS9PhGTromwIDnM=", - "optional": true, - "requires": { - "tslib": "^2.3.0" - } - }, - "@wry/trie": { - "version": "0.3.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@wry/trie/-/trie-0.3.1.tgz", - "integrity": "sha1-Inm3kPFQMvi86n/JRNJ5iOWzsTk=", - "optional": true, - "requires": { - "tslib": "^2.3.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha1-C/C+EltnAUrcsLCSHmLbe//hay4=", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha1-p5dcu5+Ds2fwbJDMUf8o/n1Jlxc=", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo=", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "apollo-cache-control": { - "version": "0.14.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz", - "integrity": "sha1-lfIMPgPnmU4NG9SMWa6utXXtDOc=", - "dev": true, - "requires": { - "apollo-server-env": "^3.1.0", - "apollo-server-plugin-base": "^0.13.0" - }, - "dependencies": { - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha1-BzPC71CupZbMkM9ApT9uoq1ALNA=", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - } - } - }, - "apollo-datasource": { - "version": "0.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-datasource/-/apollo-datasource-0.9.0.tgz", - "integrity": "sha1-sLKRMlemEDpfTAPLVteKMOnYUNs=", - "dev": true, - "requires": { - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - }, - "dependencies": { - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha1-BzPC71CupZbMkM9ApT9uoq1ALNA=", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - } - } - }, - "apollo-graphql": { - "version": "0.9.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-graphql/-/apollo-graphql-0.9.7.tgz", - "integrity": "sha1-MxhQk7SXpXjy32GrjsxkR9cArmQ=", - "requires": { - "core-js-pure": "^3.10.2", - "lodash.sortby": "^4.7.0", - "sha.js": "^2.4.11" - } - }, - "apollo-link": { - "version": "1.2.14", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-link/-/apollo-link-1.2.14.tgz", - "integrity": "sha1-P+2ktH+eu6f0Fgvvi5d7pyW2hNk=", - "dev": true, - "requires": { - "apollo-utilities": "^1.3.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3", - "zen-observable-ts": "^0.8.21" - }, - "dependencies": { - "ts-invariant": { - "version": "0.4.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ts-invariant/-/ts-invariant-0.4.4.tgz", - "integrity": "sha1-l6UjUYaI+TqvrQGw6A64A+sqvYY=", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", - "dev": true - }, - "zen-observable-ts": { - "version": "0.8.21", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", - "integrity": "sha1-hdADH7veHro80H07qQ2iQSFfQh0=", - "dev": true, - "requires": { - "tslib": "^1.9.3", - "zen-observable": "^0.8.0" - } - } - } - }, - "apollo-reporting-protobuf": { - "version": "3.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.2.tgz", - "integrity": "sha1-IHjFPTFAvGIhxgQMUyZiPgwhyNQ=", - "requires": { - "@apollo/protobufjs": "1.2.4" - } - }, - "apollo-server": { - "version": "2.25.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server/-/apollo-server-2.25.4.tgz", - "integrity": "sha1-2geENA3e/PUItLRXROPGFkDE7x0=", - "dev": true, - "requires": { - "apollo-server-core": "^2.25.4", - "apollo-server-express": "^2.25.4", - "express": "^4.0.0", - "graphql-subscriptions": "^1.0.0", - "graphql-tools": "^4.0.8", - "stoppable": "^1.1.0" - }, - "dependencies": { - "graphql-tools": { - "version": "4.0.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graphql-tools/-/graphql-tools-4.0.8.tgz", - "integrity": "sha1-5/ufDUNAj7CHi6ZrUizocbr+nTA=", - "dev": true, - "requires": { - "apollo-link": "^1.2.14", - "apollo-utilities": "^1.0.1", - "deprecated-decorator": "^0.1.6", - "iterall": "^1.1.3", - "uuid": "^3.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true - } - } - }, - "apollo-server-caching": { - "version": "0.7.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz", - "integrity": "sha1-5tHmjju1ccumOmH2C0NPt3HG/zk=", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "apollo-server-core": { - "version": "2.25.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-core/-/apollo-server-core-2.25.4.tgz", - "integrity": "sha1-pWQ3ZJYBZxPH3OqsPZ5lLHpDMmA=", - "dev": true, - "requires": { - "@apollographql/apollo-tools": "^0.5.0", - "@apollographql/graphql-playground-html": "1.6.27", - "@apollographql/graphql-upload-8-fork": "^8.1.3", - "@josephg/resolvable": "^1.0.0", - "@types/ws": "^7.0.0", - "apollo-cache-control": "^0.14.0", - "apollo-datasource": "^0.9.0", - "apollo-graphql": "^0.9.0", - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0", - "apollo-server-errors": "^2.5.0", - "apollo-server-plugin-base": "^0.13.0", - "apollo-server-types": "^0.9.0", - "apollo-tracing": "^0.15.0", - "async-retry": "^1.2.1", - "fast-json-stable-stringify": "^2.0.0", - "graphql-extensions": "^0.15.0", - "graphql-tag": "^2.11.0", - "graphql-tools": "^4.0.8", - "loglevel": "^1.6.7", - "lru-cache": "^6.0.0", - "sha.js": "^2.4.11", - "subscriptions-transport-ws": "^0.9.19", - "uuid": "^8.0.0" - }, - "dependencies": { - "@apollo/protobufjs": { - "version": "1.2.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", - "integrity": "sha1-S9ks13Acyu9tUXzbda8nVfBJ+Hw=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - } - }, - "apollo-reporting-protobuf": { - "version": "0.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", - "integrity": "sha1-rp2WeTTT2O2Bb8haDYBo70XDcbk=", - "dev": true, - "requires": { - "@apollo/protobufjs": "1.2.2" - } - }, - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha1-BzPC71CupZbMkM9ApT9uoq1ALNA=", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - }, - "apollo-server-types": { - "version": "0.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-types/-/apollo-server-types-0.9.0.tgz", - "integrity": "sha1-zPVQszsHxIxy8QT74odiMrQEhIs=", - "dev": true, - "requires": { - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - }, - "graphql-tools": { - "version": "4.0.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graphql-tools/-/graphql-tools-4.0.8.tgz", - "integrity": "sha1-5/ufDUNAj7CHi6ZrUizocbr+nTA=", - "dev": true, - "requires": { - "apollo-link": "^1.2.14", - "apollo-utilities": "^1.0.1", - "deprecated-decorator": "^0.1.6", - "iterall": "^1.1.3", - "uuid": "^3.1.0" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true - } - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "apollo-server-env": { - "version": "4.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-4.2.1.tgz", - "integrity": "sha1-6lsZRKzNvboxHxeeTfrspILCAYU=", - "requires": { - "node-fetch": "^2.6.7" - } - }, - "apollo-server-errors": { - "version": "2.5.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz", - "integrity": "sha1-XRAkEXx0lqKXnj40kItWhf4RK2g=", - "dev": true - }, - "apollo-server-express": { - "version": "2.25.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-express/-/apollo-server-express-2.25.4.tgz", - "integrity": "sha1-vTceldj94FFuhn8GcoG3ocPYJgw=", - "dev": true, - "requires": { - "@apollographql/graphql-playground-html": "1.6.27", - "@types/accepts": "^1.3.5", - "@types/body-parser": "1.19.0", - "@types/cors": "2.8.10", - "@types/express": "^4.17.12", - "@types/express-serve-static-core": "^4.17.21", - "accepts": "^1.3.5", - "apollo-server-core": "^2.25.4", - "apollo-server-types": "^0.9.0", - "body-parser": "^1.18.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "graphql-subscriptions": "^1.0.0", - "graphql-tools": "^4.0.8", - "parseurl": "^1.3.2", - "subscriptions-transport-ws": "^0.9.19", - "type-is": "^1.6.16" - }, - "dependencies": { - "@apollo/protobufjs": { - "version": "1.2.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", - "integrity": "sha1-S9ks13Acyu9tUXzbda8nVfBJ+Hw=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - } - }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha1-BoWzxH6zAG/+0RfN1VFkth+AU48=", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "apollo-reporting-protobuf": { - "version": "0.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", - "integrity": "sha1-rp2WeTTT2O2Bb8haDYBo70XDcbk=", - "dev": true, - "requires": { - "@apollo/protobufjs": "1.2.2" - } - }, - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha1-BzPC71CupZbMkM9ApT9uoq1ALNA=", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - }, - "apollo-server-types": { - "version": "0.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-types/-/apollo-server-types-0.9.0.tgz", - "integrity": "sha1-zPVQszsHxIxy8QT74odiMrQEhIs=", - "dev": true, - "requires": { - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - }, - "graphql-tools": { - "version": "4.0.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graphql-tools/-/graphql-tools-4.0.8.tgz", - "integrity": "sha1-5/ufDUNAj7CHi6ZrUizocbr+nTA=", - "dev": true, - "requires": { - "apollo-link": "^1.2.14", - "apollo-utilities": "^1.0.1", - "deprecated-decorator": "^0.1.6", - "iterall": "^1.1.3", - "uuid": "^3.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true - } - } - }, - "apollo-server-plugin-base": { - "version": "0.13.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz", - "integrity": "sha1-P4V1GkINPEYlNVtss/vdKsvnHxM=", - "dev": true, - "requires": { - "apollo-server-types": "^0.9.0" - }, - "dependencies": { - "@apollo/protobufjs": { - "version": "1.2.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", - "integrity": "sha1-S9ks13Acyu9tUXzbda8nVfBJ+Hw=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - } - }, - "apollo-reporting-protobuf": { - "version": "0.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", - "integrity": "sha1-rp2WeTTT2O2Bb8haDYBo70XDcbk=", - "dev": true, - "requires": { - "@apollo/protobufjs": "1.2.2" - } - }, - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha1-BzPC71CupZbMkM9ApT9uoq1ALNA=", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - }, - "apollo-server-types": { - "version": "0.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-types/-/apollo-server-types-0.9.0.tgz", - "integrity": "sha1-zPVQszsHxIxy8QT74odiMrQEhIs=", - "dev": true, - "requires": { - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - } - } - }, - "apollo-server-types": { - "version": "3.6.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-types/-/apollo-server-types-3.6.2.tgz", - "integrity": "sha1-NLsMM1/M4wV8vfcrO2PaGC3m/IQ=", - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "@apollo/utils.logger": "^1.0.0", - "apollo-reporting-protobuf": "^3.3.2", - "apollo-server-env": "^4.2.1" - } - }, - "apollo-tracing": { - "version": "0.15.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-tracing/-/apollo-tracing-0.15.0.tgz", - "integrity": "sha1-I3+7v2aa7kNwt+kIG2heq6qM6Eo=", - "dev": true, - "requires": { - "apollo-server-env": "^3.1.0", - "apollo-server-plugin-base": "^0.13.0" - }, - "dependencies": { - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha1-BzPC71CupZbMkM9ApT9uoq1ALNA=", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - } - } - }, - "apollo-utilities": { - "version": "1.3.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-utilities/-/apollo-utilities-1.3.4.tgz", - "integrity": "sha1-YSnkOOi+IBtsVbDxPOSdLHF1yc8=", - "dev": true, - "requires": { - "@wry/equality": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "@wry/equality": { - "version": "0.1.11", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@wry/equality/-/equality-0.1.11.tgz", - "integrity": "sha1-NcsVbkqWaVqoGp7MTQN4e8F/F5A=", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - }, - "ts-invariant": { - "version": "0.4.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ts-invariant/-/ts-invariant-0.4.4.tgz", - "integrity": "sha1-l6UjUYaI+TqvrQGw6A64A+sqvYY=", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", - "dev": true - } - } - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha1-BGpSrlgqIovXL1is++KWfGeHWas=", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha1-gWfoAIn3i/9wqZ4gvUIB1GY7Cm8=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", - "dev": true - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha1-Dn82wE2EeOeli9vtgM7fl3eF8oA=", - "dev": true, - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha1-kvlWFlAQadB9EO2y/DfT4cZRI7c=", - "dev": true - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", - "dev": true - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha1-Peab2JARwRVz17/uamTxG2vSfMU=", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/depd/-/depd-2.0.0.tgz", - "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha1-t3dKFIbvc892Z6ya4IWMASxXudM=", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha1-VcsADM8dSHKL0jxoWgY5mM8aG2M=", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "busboy": { - "version": "0.3.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha1-FwiZJ0xb84quJ9XGK3EmjNWF/Rs=", - "dev": true, - "requires": { - "dicer": "0.3.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha1-iwvuuYYFrfGxKPpDhkA8AJ4CIaU=", - "dev": true - }, - "cacache": { - "version": "15.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha1-3IU4D7L1Vv492kxxm/oOyHWn8es=", - "dev": true, - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha1-YB1GuR7Kh2h6KB5xzvmXkbDvynA=", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "casual": { - "version": "1.6.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/casual/-/casual-1.6.2.tgz", - "integrity": "sha1-9WuHETrpmmu6ReBL36BoykQ/noU=", - "dev": true, - "requires": { - "mersenne-twister": "^1.0.1", - "moment": "^2.15.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", - "dev": true - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha1-Fb++U9LqtM9w8YqM1o6+Wzyx3s4=", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY=", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/commander/-/commander-2.20.3.tgz", - "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha1-i4K076yCUSoCuwsdzsnSxejrW/4=", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - } - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha1-0fXXGt7GVYxY84mYfDZqpH6ZT4s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "core-js-pure": { - "version": "3.24.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/core-js-pure/-/core-js-pure-3.24.1.tgz", - "integrity": "sha1-iDnd5dpUVSG/KC/rfcbQtCXzn9M=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cors/-/cors-2.8.5.tgz", - "integrity": "sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha1-QNXqSh3vKprN0HulwLAkbvc9wQ0=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - } - } - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/debug/-/debug-4.3.4.tgz", - "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "2.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha1-Vc0v4ybYP5y/cmHvDgYLP3JMXLk=", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", - "isarray": "^2.0.5", - "object-is": "^1.1.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=", - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha1-CxTXvX++svNXLDp+2oDqXVf7BbE=", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "deprecated-decorator": { - "version": "0.1.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha1-SANzVQmti+VSk0xn32FPlOZvoBU=", - "dev": true - }, - "dicer": { - "version": "0.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha1-6s2Ys7+/kuirXC/bcaqsRLsGuHI=", - "dev": true, - "requires": { - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "5.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/diff/-/diff-5.1.0.tgz", - "integrity": "sha1-vFLSmMXqjfkZSAAiREXtQ//IfkA=", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha1-+ULyIA0ow6dvvdbw7p8yV8ii6QU=", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha1-VldK/deR9UqOmyeFwFgqLSYhD6k=", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha1-I8Lzt1b/38YI0w4nyalBAkgH5/k=", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha1-AnKSzW70S9ErGRO4KBFvVHh9GBQ=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha1-hz8+hEGN5O4Zxb51KZCy5EcY0J4=", - "dev": true - }, - "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha1-kjTFSrpxNIbX694CIIZK9eKyg/c=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha1-njr0B0Wd7tR+mpH5uIWoTrBcVh0=", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha1-YiYtZylzn5J1cjgkMC+yJ8jJP/s=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha1-fe8D0kMtyuS6HWEURcSDlgYiVfY=", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/semver/-/semver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8=", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/espree/-/espree-6.2.1.tgz", - "integrity": "sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o=", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha1-LT1I+cNGaY/Og6hdfWZOmFNd9uc=", - "dev": true - }, - "express": { - "version": "4.18.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/express/-/express-4.18.1.tgz", - "integrity": "sha1-d5fei5xyyFe5zQ4Upe6oBmYmfK8=", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.10.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/depd/-/depd-2.0.0.tgz", - "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha1-t3dKFIbvc892Z6ya4IWMASxXudM=", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha1-VcsADM8dSHKL0jxoWgY5mM8aG2M=", - "dev": true - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/figures/-/figures-3.2.0.tgz", - "integrity": "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha1-fSP+VzGyB7RkDk/NAK7B+SB6ezI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha1-VcsADM8dSHKL0jxoWgY5mM8aG2M=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha1-RXWyHivO50NKqb5mL0t7X5wrUTg=", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha1-abRH6IoKXTLD5whPPxcQA0shN24=", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha1-69U3kbeDVqma+aMA1CgsTV65dV8=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "fs-capacitor": { - "version": "2.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/fs-capacitor/-/fs-capacitor-2.0.4.tgz", - "integrity": "sha1-WiLnLUCuUHi0/mT+TQjA0/yIrTw=", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha1-zOBQX+H/uAUD5vnkbMZORqEqliE=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha1-BAT+TuK6L2B/Dg7DyAuumUEzuDQ=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha1-M2l1Ej4FrQt7pB8VLuSq2+ps9Zg=", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha1-f9uByQAQH71WTdXxowr1qtweWNY=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/glob/-/glob-7.2.3.tgz", - "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/globals/-/globals-12.4.0.tgz", - "integrity": "sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg=", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha1-FH06AG2kyjzhRyjHrvwofDZ9emw=", - "dev": true - }, - "graphql": { - "version": "15.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha1-M0EOlrAS+jvbEJHMmalHadshKzg=", - "dev": true - }, - "graphql-extensions": { - "version": "0.15.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graphql-extensions/-/graphql-extensions-0.15.0.tgz", - "integrity": "sha1-PykfknSHawwon6QGGQmhJni9mBc=", - "dev": true, - "requires": { - "@apollographql/apollo-tools": "^0.5.0", - "apollo-server-env": "^3.1.0", - "apollo-server-types": "^0.9.0" - }, - "dependencies": { - "@apollo/protobufjs": { - "version": "1.2.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", - "integrity": "sha1-S9ks13Acyu9tUXzbda8nVfBJ+Hw=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - } - }, - "apollo-reporting-protobuf": { - "version": "0.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", - "integrity": "sha1-rp2WeTTT2O2Bb8haDYBo70XDcbk=", - "dev": true, - "requires": { - "@apollo/protobufjs": "1.2.2" - } - }, - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha1-BzPC71CupZbMkM9ApT9uoq1ALNA=", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - }, - "apollo-server-types": { - "version": "0.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/apollo-server-types/-/apollo-server-types-0.9.0.tgz", - "integrity": "sha1-zPVQszsHxIxy8QT74odiMrQEhIs=", - "dev": true, - "requires": { - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - } - } - }, - "graphql-subscriptions": { - "version": "1.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", - "integrity": "sha1-IUKy1ylmHd+We3OI988d1M8uBh0=", - "dev": true, - "requires": { - "iterall": "^1.3.0" - } - }, - "graphql-tag": { - "version": "2.12.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha1-1EGlacHSU37xDKPRYztIclMptfE=", - "requires": { - "tslib": "^2.1.0" - } - }, - "graphql-tools": { - "version": "8.3.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/graphql-tools/-/graphql-tools-8.3.1.tgz", - "integrity": "sha1-ubTOhm5XR7LbSCjt697k/vEdKEc=", - "requires": { - "@apollo/client": "~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0 || ~3.6.0", - "@graphql-tools/schema": "8.5.1", - "tslib": "^2.4.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha1-CHG9Pj1RYm9soJZmaLo11WAtbqo=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha1-YQcIYAYG02lh7QTBlhk7amB/qGE=", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha1-u3ssQ0klHc6HsSX3vfh0qnyLOfg=", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U=", - "optional": true, - "requires": { - "react-is": "^16.7.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM=", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha1-SekcXL82yblLz81xwj1SSex045A=", - "dev": true - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha1-fD8oV3y8iiBziEVdvWIpXtB71ow=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha1-ioyO9/WTLM+VPClsqCkblap0qjo=", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY=", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE=", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha1-BNF2sq8Er8FXqD/XwQDpjuCq0AM=", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ip/-/ip-2.0.0.tgz", - "integrity": "sha1-TPSrGC/uIxTHXt4SdvjIC0eZNto=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=", - "dev": true - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha1-4cNEKc1Rxt2eCeB5njluJ7GanGk=", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha1-AJItuMm/c+gbejNYJ7wqQ/K5ESc=", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha1-e/bwOigAO4s5Zd46wm9mTXZfMVA=", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha1-WdUK2kxFJReE6ZBPUkbHQvB6Qvw=", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha1-kHVfpMJWLcHF1AJHYNYRm5TKGOw=", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha1-jyWcVztgtqMtQFihoHQwwKc0THk=", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha1-ptrJO2NbBjymhyI23oiRClevE5w=", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha1-JG130ocefZ9a6x1UufUscTKezmc=", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha1-UAi1m9xDtpggHRj2KzeyyiQ+jPI=", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha1-lSnzg6kzggXol2XgOS78LxAPBvI=", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha1-RWnWenR6HOWplN/U723Op258Ch0=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha1-Z18KtpUD+tSx2En3NrqsqAM0T0k=", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha1-yVaV84PU+PYN8fBCUqlVDhW1sTM=", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha1-pfY9kfC7wMPkee9MXeAnM17G1jA=", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/semver/-/semver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha1-WoETzXRtQ8SInro2qxDn1QybTzM=", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha1-KEmXxIIRdS7EhiU9qX44ed77qMg=", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha1-XZOfYjfXtIOTzAlZ6rQM1P0FaTE=", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "iterall": { - "version": "1.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha1-r8sISS4pFcvYoIhOuTqMlNDXL+o=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha1-715Ymvth5dZrJOynSUCaiTmox0Q=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.xorby": { - "version": "4.7.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lodash.xorby/-/lodash.xorby-4.7.0.tgz", - "integrity": "sha1-nBmm+fBjputT3QPBtocXmYAUY9c=" - }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha1-5+xzpX4ee0GctsasBr8FC2c1YRQ=", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/long/-/long-4.0.0.tgz", - "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", - "optional": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "7.13.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lru-cache/-/lru-cache-7.13.1.tgz", - "integrity": "sha1-JnqB+9CIEyfEaoHFkiYGos/jNsQ=" - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - } - } - }, - "make-fetch-happen": { - "version": "8.0.14", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", - "integrity": "sha1-qrpzrgq1WGrY6qaL2DMyZpOT4iI=", - "dev": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.0.5", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, - "mersenne-twister": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mersenne-twister/-/mersenne-twister-1.1.0.tgz", - "integrity": "sha1-+RZhjuQ9cXnvz2Qb7EUx65Zwl4o=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mime/-/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha1-hjelt1nqDW6YcCz7OpKDMjyTr0Q=", - "dev": true - }, - "minipass": { - "version": "3.3.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha1-ypn5Xdd8Q8ena/UebSAAJe7g/64=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha1-114AkdqsGw/9fp1BYp+v99DB8bY=", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha1-aEcveXEcCEZXwGfFxq2Tzd6oIUw=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha1-cO5afFBSBwr6z7wil36nne81O3A=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha1-6Q00Zrogm5MkUVCKEc49NjIUWTE=", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", - "dev": true - }, - "moment": { - "version": "2.29.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/moment/-/moment-2.29.4.tgz", - "integrity": "sha1-Pb4FKIn+fBsu2Wb8s6dzKJZO8Qg=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha1-WOMjpy/twNb5zU0x/kn1FHlZDM0=", - "dev": true - }, - "nested-error-stacks": { - "version": "2.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha1-JsijzubMBfvPHjM80vw+ADMmwLU=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", - "dev": true - }, - "nise": { - "version": "5.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/nise/-/nise-5.1.1.tgz", - "integrity": "sha1-rEI34NeF7Py4PiDziRhZddpcMfM=", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha1-iHs7qdhDk+h6CgufTLdWGYtTVIo=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha1-JN6fuoJ+O0rkTciyAlajeRYAUq0=", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - } - } - }, - "nyc": { - "version": "14.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha1-FR1kpqn59ZCKG3MjOTHkoKMHXus=", - "dev": true, - "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha1-wGQfJjlFMvKKuNeWq5VOQ8AJqOo=", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha1-ud7qpfx/GEag+uzc7sE45XePU6w=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", - "dev": true - }, - "object-path": { - "version": "0.11.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha1-7QAsArvdAHC3iidFXorgH8FNR0I=", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha1-eWXmQ3pXJ4tYc4ODGpuClFWkvDc=", - "dev": true, - "requires": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" - } - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha1-WMjEQRblSEWtV/FKsQsDUzGErD8=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optimism": { - "version": "0.16.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/optimism/-/optimism-0.16.1.tgz", - "integrity": "sha1-fI78HzF58YMHuIfhjBXFtxM/bn0=", - "optional": true, - "requires": { - "@wry/context": "^0.6.0", - "@wry/trie": "^0.3.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha1-uy+Vpe2i7BaOySdOBqdHw+KQTSs=", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha1-UBg/LTbJ4+Uo6gqGBd/1fOl2+I4=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/pify/-/pify-4.0.1.tgz", - "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha1-41wnBfFMt/4v6U+geDRbREEg/JM=", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "react-is": { - "version": "17.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha1-5pHUqOnHiTZWVVOas3J2Kw77VPA=", - "dev": true - } - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/progress/-/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha1-/3R6E2IKtXumiPX8Z4VUEMNw2iI=", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "dependencies": { - "retry": { - "version": "0.12.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - } - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha1-Z9h78aaU9IQ1zzMsJK8QIUoxQLU=", - "optional": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/qs/-/qs-6.10.3.tgz", - "integrity": "sha1-1s3hsv/Kh7WqV4iYFsX4FTXiLo4=", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha1-/hsWKLGBtwAhXl/UI4n5i3E5KFc=", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/depd/-/depd-2.0.0.tgz", - "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha1-t3dKFIbvc892Z6ya4IWMASxXudM=", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha1-VcsADM8dSHKL0jxoWgY5mM8aG2M=", - "dev": true - } - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ=", - "optional": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha1-GyIcYIi6d5lgHICPkRYcZuWPiXg=", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha1-h8qzD4D2ZmAYGju3v1mBqHKzZ6w=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha1-J8suu1P5GrtJRwqSi7p1WAZqwXc=", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dev": true, - "requires": { - "through": "~2.3.4" - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/retry/-/retry-0.13.1.tgz", - "integrity": "sha1-GFsVh6z2eRnWOzVzSeA1N7JIRlg=", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha1-kKwBisq/SRv2UEQjXVhjxNq4BMk=", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/semver/-/semver-7.3.7.tgz", - "integrity": "sha1-EsW2Sa/b+QSXB3luIqQCiBTOUj8=", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/send/-/send-0.18.0.tgz", - "integrity": "sha1-ZwFnzGVLBfWqSnZ/kRO7NxvHBr4=", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/depd/-/depd-2.0.0.tgz", - "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha1-t3dKFIbvc892Z6ya4IWMASxXudM=", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ms/-/ms-2.1.3.tgz", - "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha1-VcsADM8dSHKL0jxoWgY5mM8aG2M=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha1-+q7wjP/goaYvYMrQxOUTz/CslUA=", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha1-785cj9wQTudRslxY1CkAEfpeos8=", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk=", - "dev": true - }, - "sinon": { - "version": "12.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/sinon/-/sinon-12.0.1.tgz", - "integrity": "sha1-Mx7vhymHUuG4imYraZ+Y5APIWek=", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^8.1.0", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - } - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha1-bh1x+k8YwF99D/IW3RakgdDo2a4=", - "dev": true - }, - "socks": { - "version": "2.7.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/socks/-/socks-2.7.0.tgz", - "integrity": "sha1-+SJazbhB6HTcol+HDpEwmQ85E9A=", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha1-Ay+1gwSKKev/7C5qc/ygdh9IF34=", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "spawn-wrap": { - "version": "1.4.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/spawn-wrap/-/spawn-wrap-1.4.3.tgz", - "integrity": "sha1-gbdnDhcMyiR9gL9frwz7cTvc+Eg=", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha1-fe8D0kMtyuS6HWEURcSDlgYiVfY=", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha1-UMDYxAoU7Bv0Sbrmmg6kaFqdn5U=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha1-Y45OQ54v+9LNKJd21cpFfE9Roq8=", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stoppable": { - "version": "1.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha1-MtpWjoPqSIsI5NfqLDvMnXUBXVs=", - "dev": true - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "string.prototype.trim": { - "version": "1.2.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz", - "integrity": "sha1-gklgeH2zep4kcRgC7QwdHAJU+D4=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha1-kUpluqqyX73U7ikcp93lfoacuNA=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha1-VGbZO6WM+iE0g5+B1/QkN+jAH+8=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha1-Fk2qyHqy1vbbOimHXi0XZlgtq+0=", - "dev": true - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", - "dev": true - }, - "subscriptions-transport-ws": { - "version": "0.9.19", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz", - "integrity": "sha1-EMoy9+KR1e6Otyi5wC5DxSYGzc8=", - "dev": true, - "requires": { - "backo2": "^1.0.2", - "eventemitter3": "^3.1.0", - "iterall": "^1.2.1", - "symbol-observable": "^1.0.4", - "ws": "^5.2.0 || ^6.0.0 || ^7.0.0" - }, - "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ=", - "dev": true - } - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha1-btpL00SjyUrqN21MwxvHcxEDngk=", - "dev": true - }, - "symbol-observable": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha1-W0JfGSJ56H8vm5N6yFQNGYSzkgU=", - "optional": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/table/-/table-5.4.6.tgz", - "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "tape": { - "version": "4.15.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/tape/-/tape-4.15.1.tgz", - "integrity": "sha1-iPtmKWWhH5vhvdsEwRZi1+zrEp4=", - "dev": true, - "requires": { - "call-bind": "~1.0.2", - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "glob": "~7.2.0", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.1.4", - "minimist": "~1.2.6", - "object-inspect": "~1.12.0", - "resolve": "~1.22.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.5", - "through": "~2.3.8" - }, - "dependencies": { - "deep-equal": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - } - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/tar/-/tar-6.1.11.tgz", - "integrity": "sha1-Z2CjjwA6+hsv/Q/+npq70Oqz1iE=", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha1-w9Ph4xHrfuQF4JLawQrv0JCR6sA=", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha1-O+NDIaiKgg7RvYDfqjPkefu43TU=", - "dev": true - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "ts-invariant": { - "version": "0.10.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ts-invariant/-/ts-invariant-0.10.3.tgz", - "integrity": "sha1-PgSP+W6RRZ/8oBME28f2HB9kL2w=", - "optional": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha1-fOyqfwc85oCgWEeqd76UEJjzbcM=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha1-KQMgIQV9Xmzb0IxRKcIm3/jtb54=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util.promisify": { - "version": "1.1.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha1-d4MvV87SyUeBdBScrpuW6ZGM1Us=", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-promise": { - "version": "1.0.11", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/value-or-promise/-/value-or-promise-1.0.11.tgz", - "integrity": "sha1-PpApmvMd0BT+hD/jCc76fB2UsUA=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha1-cOq3Hru9Ku+vMvkXCC/GLNy3CQY=", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-typed-array": { - "version": "1.1.8", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha1-DP1TQBpvM02Q7REldUpC7WY+sB8=", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/write/-/write-1.0.3.tgz", - "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha1-fe8D0kMtyuS6HWEURcSDlgYiVfY=", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha1-H9Lprh3z51uNjDZ0Q8aS1MqB9IE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/ws/-/ws-7.5.9.tgz", - "integrity": "sha1-VPp9sp9MfOxosd3TqJ3gmZQrtZE=", - "dev": true - }, - "xss": { - "version": "1.0.13", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/xss/-/xss-1.0.13.tgz", - "integrity": "sha1-bkj2FhKLOfNm363FdBHh61s0HGw=", - "dev": true, - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8=", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "zen-observable": { - "version": "0.8.15", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha1-lkFcUS2OP/2SCv04iWBOMLnqrBU=" - }, - "zen-observable-ts": { - "version": "1.2.5", - "resolved": "https://artylab.expedia.biz/api/npm/public-npm-virtual/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", - "integrity": "sha1-bG2eo9OoQoEsbpUZIJNloSK6i1g=", - "optional": true, - "requires": { - "zen-observable": "0.8.15" - } - } - } -} diff --git a/package.json b/package.json index e9e1aac..288072e 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "test": "tape -r ts-node/register test/**.ts", "start-composition": "DEBUG=graphql-component ts-node examples/composition/server/index.ts", "start-federation": "DEBUG=graphql-component node examples/federation/run-federation-example.js", - "lint": "eslint lib", + "lint": "npx eslint src/index.ts", "cover": "nyc npm test", "update-deps": "ncu -u && npm install" }, @@ -40,17 +40,21 @@ }, "devDependencies": { "@apollo/gateway": "^2.9.3", + "@typescript-eslint/eslint-plugin": "^8.22.0", + "@typescript-eslint/parser": "^8.22.0", "apollo-server": "^3.13.0", "casual": "^1.6.2", - "eslint": "^9.15.0", + "eslint": "^9.19.0", + "globals": "^15.14.0", "graphql": "^16.9.0", "graphql-tag": "^2.12.6", + "npm-check-updates": "^17.1.11", "nyc": "^17.1.0", "sinon": "^19.0.2", "tape": "^5.9.0", "ts-node": "^10.9.2", "typescript": "^5.6.3", - "npm-check-updates": "^17.1.11" + "typescript-eslint": "^8.22.0" }, "nyc": { "include": [ diff --git a/src/index.ts b/src/index.ts index 58d2d2a..3928bd8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,474 +1,475 @@ - const debug = require('debug')('graphql-component'); - - import { buildFederatedSchema } from '@apollo/federation'; - import { GraphQLResolveInfo, GraphQLScalarType, GraphQLSchema } from 'graphql'; - - import { mergeTypeDefs } from '@graphql-tools/merge'; - import { +import debugConfig from 'debug'; +import { buildFederatedSchema } from '@apollo/federation'; +import { GraphQLResolveInfo, GraphQLScalarType, GraphQLSchema } from 'graphql'; + +import { mergeTypeDefs } from '@graphql-tools/merge'; +import { + pruneSchema, + IResolvers, + PruneSchemaOptions, + TypeSource, + mapSchema, + SchemaMapper +} from '@graphql-tools/utils'; +import { makeExecutableSchema } from '@graphql-tools/schema'; +import { stitchSchemas } from '@graphql-tools/stitch'; +import { addMocksToSchema, IMocks } from '@graphql-tools/mock'; +import { SubschemaConfig } from '@graphql-tools/delegate'; + +const debug = debugConfig('graphql-component'); + +export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; + +export interface IGraphQLComponentConfigObject { + component: IGraphQLComponent; + configuration?: SubschemaConfig; +} + +export interface ComponentContext extends Record { + dataSources: DataSourceMap; +} + +export type ContextFunction = ((context: Record) => any); + +export interface IDataSource { + name: string +} + +export type DataSource = { + [P in keyof T]: T[P] extends (context: ComponentContext, ...p: infer P) => infer R ? (...p: P) => R : never +} + +export type DataSourceMap = { [key: string]: IDataSource }; + +export type DataSourceInjectionFunction = ((context: Record) => DataSourceMap); + +export interface IContextConfig { + namespace: string; + factory: ContextFunction; +} + +export interface IContextWrapper extends ContextFunction { + use: (name: string | ContextFunction | null, fn?: ContextFunction | string) => void; +} + +export interface IGraphQLComponentOptions { + types?: TypeSource + resolvers?: IResolvers; + mocks?: boolean | IMocks; + imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; + context?: IContextConfig; + dataSources?: IDataSource[]; + dataSourceOverrides?: IDataSource[]; + pruneSchema?: boolean; + pruneSchemaOptions?: PruneSchemaOptions + federation?: boolean; + transforms?: SchemaMapper[] +} + +export interface IGraphQLComponent { + readonly name: string; + readonly schema: GraphQLSchema; + readonly context: IContextWrapper; + readonly types: TypeSource; + readonly resolvers: IResolvers; + readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; + readonly dataSources?: IDataSource[]; + readonly dataSourceOverrides?: IDataSource[]; + federation?: boolean; +} + +export default class GraphQLComponent implements IGraphQLComponent { + _schema: GraphQLSchema; + _types: TypeSource; + _resolvers: IResolvers; + _mocks: boolean | IMocks; + _imports: IGraphQLComponentConfigObject[]; + _context: ContextFunction; + _dataSources: IDataSource[]; + _dataSourceOverrides: IDataSource[]; + _pruneSchema: boolean; + _pruneSchemaOptions: PruneSchemaOptions + _federation: boolean; + _dataSourceContextInject: DataSourceInjectionFunction; + _transforms: SchemaMapper[] + + constructor({ + types, + resolvers, + mocks, + imports, + context, + dataSources, + dataSourceOverrides, pruneSchema, - IResolvers, - PruneSchemaOptions, - TypeSource, - mapSchema, - SchemaMapper - } from '@graphql-tools/utils'; - import { makeExecutableSchema } from '@graphql-tools/schema'; - import { stitchSchemas } from '@graphql-tools/stitch'; - import { addMocksToSchema, IMocks } from '@graphql-tools/mock'; - import { SubschemaConfig } from '@graphql-tools/delegate'; - - export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; - - export interface IGraphQLComponentConfigObject { - component: IGraphQLComponent; - configuration?: SubschemaConfig; - } + pruneSchemaOptions, + federation, + transforms + }: IGraphQLComponentOptions) { - export interface ComponentContext extends Record { - dataSources: DataSourceMap; - } + this._types = Array.isArray(types) ? types : [types]; - export type ContextFunction = ((context: Record) => any); + this._resolvers = bindResolvers(this, resolvers); - export interface IDataSource { - name: string - } + this._mocks = mocks; - export type DataSource = { - [P in keyof T]: T[P] extends (context: ComponentContext, ...p: infer P) => infer R ? (...p: P) => R : never - } + this._federation = federation; - export type DataSourceMap = {[key: string]: IDataSource}; + this._transforms = transforms; - export type DataSourceInjectionFunction = ((context: Record) => DataSourceMap); + this._dataSources = dataSources || []; - export interface IContextConfig { - namespace: string; - factory: ContextFunction; - } + this._dataSourceOverrides = dataSourceOverrides || []; - export interface IContextWrapper extends ContextFunction { - use: (name: string|ContextFunction|null, fn?: ContextFunction|string) => void; - } + this._dataSourceContextInject = createDataSourceContextInjector(this._dataSources, this._dataSourceOverrides); - export interface IGraphQLComponentOptions { - types?: TypeSource - resolvers?: IResolvers; - mocks?: boolean | IMocks; - imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; - context?: IContextConfig; - dataSources?: IDataSource[]; - dataSourceOverrides?: IDataSource[]; - pruneSchema?: boolean; - pruneSchemaOptions?: PruneSchemaOptions - federation?: boolean; - transforms?: SchemaMapper[] - } + this._pruneSchema = pruneSchema; - export interface IGraphQLComponent { - readonly name: string; - readonly schema: GraphQLSchema; - readonly context: IContextWrapper; - readonly types: TypeSource; - readonly resolvers: IResolvers; - readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; - readonly dataSources?: IDataSource[]; - readonly dataSourceOverrides?: IDataSource[]; - federation?: boolean; - } + this._pruneSchemaOptions = pruneSchemaOptions; - export default class GraphQLComponent implements IGraphQLComponent { - _schema: GraphQLSchema; - _types: TypeSource; - _resolvers: IResolvers; - _mocks: boolean | IMocks; - _imports: IGraphQLComponentConfigObject[]; - _context: ContextFunction; - _dataSources: IDataSource[]; - _dataSourceOverrides: IDataSource[]; - _pruneSchema: boolean; - _pruneSchemaOptions: PruneSchemaOptions - _federation: boolean; - _dataSourceContextInject: DataSourceInjectionFunction; - _transforms: SchemaMapper[] - - constructor({ - types, - resolvers, - mocks, - imports, - context, - dataSources, - dataSourceOverrides, - pruneSchema, - pruneSchemaOptions, - federation, - transforms - }: IGraphQLComponentOptions) { - - this._types = Array.isArray(types) ? types : [types]; - - this._resolvers = bindResolvers(this, resolvers); - - this._mocks = mocks; - - this._federation = federation; - - this._transforms = transforms; - - this._dataSources = dataSources || []; - - this._dataSourceOverrides = dataSourceOverrides || []; - - this._dataSourceContextInject = createDataSourceContextInjector(this._dataSources, this._dataSourceOverrides); - - this._pruneSchema = pruneSchema; - - this._pruneSchemaOptions = pruneSchemaOptions; - - this._imports = imports && imports.length > 0 ? imports.map((i: GraphQLComponent | IGraphQLComponentConfigObject) => { - if (i instanceof GraphQLComponent) { - if (this._federation === true) { - i.federation = true; - } - return { component: i }; - } - else { - const importConfiguration = i as IGraphQLComponentConfigObject; - if (this._federation === true) { - importConfiguration.component.federation = true; - } - return importConfiguration; + this._imports = imports && imports.length > 0 ? imports.map((i: GraphQLComponent | IGraphQLComponentConfigObject) => { + if (i instanceof GraphQLComponent) { + if (this._federation === true) { + i.federation = true; } - }) : []; - - - this._context = async (globalContext: Record): Promise => { - //TODO: currently the context injected into data sources won't have data sources on it - const ctx = { - dataSources: this._dataSourceContextInject(globalContext) - }; - - for (const { component } of this.imports) { - const { dataSources, ...importedContext } = await component.context(globalContext); - Object.assign(ctx.dataSources, dataSources); - Object.assign(ctx, importedContext); + return { component: i }; + } + else { + const importConfiguration = i as IGraphQLComponentConfigObject; + if (this._federation === true) { + importConfiguration.component.federation = true; } + return importConfiguration; + } + }) : []; - if (context) { - debug(`building ${context.namespace} context`); - if (!ctx[context.namespace]) { - ctx[context.namespace] = {}; - } - - Object.assign(ctx[context.namespace], await context.factory.call(this, globalContext)); - } - - return ctx as TContextType; + this._context = async (globalContext: Record): Promise => { + //TODO: currently the context injected into data sources won't have data sources on it + const ctx = { + dataSources: this._dataSourceContextInject(globalContext) }; - } + for (const { component } of this.imports) { + const { dataSources, ...importedContext } = await component.context(globalContext); + Object.assign(ctx.dataSources, dataSources); + Object.assign(ctx, importedContext); + } - get context(): IContextWrapper { + if (context) { + debug(`building ${context.namespace} context`); - const contextFn = async (context): Promise => { - debug(`building root context`); - - for (let { name, fn } of contextFn._middleware) { - debug(`applying ${name} middleware`); - context = await fn(context); + if (!ctx[context.namespace]) { + ctx[context.namespace] = {}; } - - const componentContext = await this._context(context); - - const globalContext = { - ...context, - ...componentContext - }; - - return globalContext; - }; - - contextFn._middleware = []; - contextFn.use = function (name: string, fn: ContextFunction): IContextWrapper { - if (typeof name === 'function') { - fn = name; - name = 'unknown'; - } - debug(`adding ${name} middleware`); - contextFn._middleware.push({ name, fn }); - - return contextFn; - }; - - return contextFn; - } + Object.assign(ctx[context.namespace], await context.factory.call(this, globalContext)); + } - get name(): string { - return this.constructor.name; - } + return ctx as TContextType; + }; - get schema() : GraphQLSchema { - if (this._schema) { - return this._schema; - } + } - let makeSchema: (schemaConfig: any) => GraphQLSchema = undefined; + get context(): IContextWrapper { - if (this._federation) { - makeSchema = (schemaConfig): GraphQLSchema => { - return buildFederatedSchema(schemaConfig); - }; - } - else { - makeSchema = makeExecutableSchema; - } + const contextFn = async (context): Promise => { + debug(`building root context`); - if (this._imports.length > 0) { - // iterate through the imports and construct subschema configuration objects - const subschemas = this._imports.map((imp) => { - const { component, configuration = {} } = imp; - - return { - schema: component.schema, - ...configuration - }; - }); - - // construct an aggregate schema from the schemas of imported - // components and this component's types/resolvers (if present) - this._schema = stitchSchemas({ - subschemas, - typeDefs: this._types, - resolvers: this._resolvers, - mergeDirectives: true - }); + for (const { name, fn } of contextFn._middleware) { + debug(`applying ${name} middleware`); + context = await fn(context); } - else { - const schemaConfig = { - typeDefs: mergeTypeDefs(this._types), - resolvers: this._resolvers - } - this._schema = makeSchema(schemaConfig); - } + const componentContext = await this._context(context); - if (this._transforms) { - this._schema = transformSchema(this._schema, this._transforms); - } + const globalContext = { + ...context, + ...componentContext + }; - if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { - debug(`adding default mocks to the schema for ${this.name}`); - // if mocks are a boolean support simply applying default mocks - this._schema = addMocksToSchema({schema: this._schema, preserveResolvers: true}); - } - else if (this._mocks !== undefined && typeof this._mocks === 'object') { - debug(`adding custom mocks to the schema for ${this.name}`); - // else if mocks is an object, that means the user provided - // custom mocks, with which we pass them to addMocksToSchema so they are applied - this._schema = addMocksToSchema({schema: this._schema, mocks: this._mocks, preserveResolvers: true}); - } + return globalContext; + }; - if (this._pruneSchema) { - debug(`pruning the schema for ${this.name}`); - this._schema = pruneSchema(this._schema, this._pruneSchemaOptions); + contextFn._middleware = []; + + contextFn.use = function (name: string, fn: ContextFunction): IContextWrapper { + if (typeof name === 'function') { + fn = name; + name = 'unknown'; } + debug(`adding ${name} middleware`); + contextFn._middleware.push({ name, fn }); + + return contextFn; + }; - debug(`created schema for ${this.name}`); + return contextFn; + } + get name(): string { + return this.constructor.name; + } + + get schema(): GraphQLSchema { + if (this._schema) { return this._schema; } - get types(): TypeSource { - return this._types; - } + let makeSchema: (schemaConfig: any) => GraphQLSchema = undefined; - get resolvers(): IResolvers { - return this._resolvers; + if (this._federation) { + makeSchema = (schemaConfig): GraphQLSchema => { + return buildFederatedSchema(schemaConfig); + }; + } + else { + makeSchema = makeExecutableSchema; } - get imports(): IGraphQLComponentConfigObject[] { - return this._imports; + if (this._imports.length > 0) { + // iterate through the imports and construct subschema configuration objects + const subschemas = this._imports.map((imp) => { + const { component, configuration = {} } = imp; + + return { + schema: component.schema, + ...configuration + }; + }); + + // construct an aggregate schema from the schemas of imported + // components and this component's types/resolvers (if present) + this._schema = stitchSchemas({ + subschemas, + typeDefs: this._types, + resolvers: this._resolvers, + mergeDirectives: true + }); } + else { + const schemaConfig = { + typeDefs: mergeTypeDefs(this._types), + resolvers: this._resolvers + } - get dataSources(): IDataSource[] { - return this._dataSources; + this._schema = makeSchema(schemaConfig); } - get dataSourceOverrides(): IDataSource[] { - return this._dataSourceOverrides; + if (this._transforms) { + this._schema = transformSchema(this._schema, this._transforms); } - set federation(flag) { - this._federation = flag; + if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { + debug(`adding default mocks to the schema for ${this.name}`); + // if mocks are a boolean support simply applying default mocks + this._schema = addMocksToSchema({ schema: this._schema, preserveResolvers: true }); + } + else if (this._mocks !== undefined && typeof this._mocks === 'object') { + debug(`adding custom mocks to the schema for ${this.name}`); + // else if mocks is an object, that means the user provided + // custom mocks, with which we pass them to addMocksToSchema so they are applied + this._schema = addMocksToSchema({ schema: this._schema, mocks: this._mocks, preserveResolvers: true }); } - get federation(): boolean { - return this._federation; + if (this._pruneSchema) { + debug(`pruning the schema for ${this.name}`); + this._schema = pruneSchema(this._schema, this._pruneSchemaOptions); } + debug(`created schema for ${this.name}`); + + return this._schema; } - /** - * Wraps data sources with a proxy that intercepts calls to data source methods and injects the current context - * @param {IDataSource[]} dataSources - * @param {IDataSource[]} dataSourceOverrides - * @returns {DataSourceInjectionFunction} a function that returns a map of data sources with methods that have been intercepted - */ - const createDataSourceContextInjector = (dataSources: IDataSource[], dataSourceOverrides: IDataSource[]): DataSourceInjectionFunction => { - const intercept = (instance: IDataSource, context: any) => { - debug(`intercepting ${instance.constructor.name}`); - - return new Proxy(instance, { - get(target, key) { - if (typeof target[key] !== 'function' || key === instance.constructor.name) { - return target[key]; - } - const original = target[key]; + get types(): TypeSource { + return this._types; + } - return function (...args) { - return original.call(instance, context, ...args); - }; - } - }) as any as DataSource; - }; + get resolvers(): IResolvers { + return this._resolvers; + } - return (context: any = {}): DataSourceMap => { - const proxiedDataSources = {}; + get imports(): IGraphQLComponentConfigObject[] { + return this._imports; + } - // Inject data sources - for (const dataSource of dataSources) { - proxiedDataSources[dataSource.name || dataSource.constructor.name] = intercept(dataSource, context); - } + get dataSources(): IDataSource[] { + return this._dataSources; + } - // Override data sources - for (const dataSourceOverride of dataSourceOverrides) { - proxiedDataSources[dataSourceOverride.name || dataSourceOverride.constructor.name] = intercept(dataSourceOverride, context); - } + get dataSourceOverrides(): IDataSource[] { + return this._dataSourceOverrides; + } - return proxiedDataSources; - }; - }; + set federation(flag) { + this._federation = flag; + } - /** - * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided - * @param {string} parentType - the type whose field resolver is being - * wrapped/memoized - * @param {string} fieldName - the field on the parentType whose resolver - * function is being wrapped/memoized - * @param {function} resolve - the resolver function that parentType. - * fieldName is mapped to - * @returns {function} a function that wraps the input resolver function and - * whose closure scope contains a WeakMap to achieve memoization of the wrapped - * input resolver function - */ - const memoize = function (parentType: string, fieldName: string, resolve: ResolverFunction): ResolverFunction { - const _cache = new WeakMap(); - - return function _memoizedResolver(_, args, context, info) { - const path = info && info.path && info.path.key; - const key = `${path}_${JSON.stringify(args)}`; - - debug(`executing ${parentType}.${fieldName}`); - - let cached = _cache.get(context); - - if (cached && cached[key]) { - debug(`return cached result of memoized ${parentType}.${fieldName}`); - return cached[key]; - } + get federation(): boolean { + return this._federation; + } + +} + +/** + * Wraps data sources with a proxy that intercepts calls to data source methods and injects the current context + * @param {IDataSource[]} dataSources + * @param {IDataSource[]} dataSourceOverrides + * @returns {DataSourceInjectionFunction} a function that returns a map of data sources with methods that have been intercepted + */ +const createDataSourceContextInjector = (dataSources: IDataSource[], dataSourceOverrides: IDataSource[]): DataSourceInjectionFunction => { + const intercept = (instance: IDataSource, context: any) => { + debug(`intercepting ${instance.constructor.name}`); + + return new Proxy(instance, { + get(target, key) { + if (typeof target[key] !== 'function' || key === instance.constructor.name) { + return target[key]; + } + const original = target[key]; - if (!cached) { - cached = {}; + return function (...args) { + return original.call(instance, context, ...args); + }; } + }) as any as DataSource; + }; - const result = resolve(_, args, context, info); + return (context: any = {}): DataSourceMap => { + const proxiedDataSources = {}; - cached[key] = result; + // Inject data sources + for (const dataSource of dataSources) { + proxiedDataSources[dataSource.name || dataSource.constructor.name] = intercept(dataSource, context); + } - _cache.set(context, cached); + // Override data sources + for (const dataSourceOverride of dataSourceOverrides) { + proxiedDataSources[dataSourceOverride.name || dataSourceOverride.constructor.name] = intercept(dataSourceOverride, context); + } - debug(`cached ${parentType}.${fieldName}`); + return proxiedDataSources; + }; +}; + +/** + * memoizes resolver functions such that calls of an identical resolver (args/context/path) within the same request context are avoided + * @param {string} parentType - the type whose field resolver is being + * wrapped/memoized + * @param {string} fieldName - the field on the parentType whose resolver + * function is being wrapped/memoized + * @param {function} resolve - the resolver function that parentType. + * fieldName is mapped to + * @returns {function} a function that wraps the input resolver function and + * whose closure scope contains a WeakMap to achieve memoization of the wrapped + * input resolver function + */ +const memoize = function (parentType: string, fieldName: string, resolve: ResolverFunction): ResolverFunction { + const _cache = new WeakMap(); + + return function _memoizedResolver(_, args, context, info) { + const path = info && info.path && info.path.key; + const key = `${path}_${JSON.stringify(args)}`; + + debug(`executing ${parentType}.${fieldName}`); + + let cached = _cache.get(context); + + if (cached && cached[key]) { + debug(`return cached result of memoized ${parentType}.${fieldName}`); + return cached[key]; + } - return result; - }; + if (!cached) { + cached = {}; + } + + const result = resolve(_, args, context, info); + + cached[key] = result; + + _cache.set(context, cached); + + debug(`cached ${parentType}.${fieldName}`); + + return result; }; +}; + +/** + * make 'this' in resolver functions equal to the input bindContext + * @param {Object} bind - the object context to bind to resolver functions + * @param {Object} resolvers - the resolver map containing the resolver + * functions to bind + * @returns {Object} - an object identical in structure to the input resolver + * map, except with resolver function bound to the input argument bind + */ +const bindResolvers = function (bindContext: IGraphQLComponent, resolvers: IResolvers = {}): IResolvers { + const boundResolvers = {}; + + for (const [type, fields] of Object.entries(resolvers)) { + // dont bind an object that is an instance of a graphql scalar + if (fields instanceof GraphQLScalarType) { + debug(`not binding ${type}'s fields since ${type}'s fields are an instance of GraphQLScalarType`) + boundResolvers[type] = fields; + continue; + } - /** - * make 'this' in resolver functions equal to the input bindContext - * @param {Object} bind - the object context to bind to resolver functions - * @param {Object} resolvers - the resolver map containing the resolver - * functions to bind - * @returns {Object} - an object identical in structure to the input resolver - * map, except with resolver function bound to the input argument bind - */ - const bindResolvers = function (bindContext: IGraphQLComponent, resolvers: IResolvers = {}): IResolvers { - const boundResolvers = {}; - - for (const [type, fields] of Object.entries(resolvers)) { - // dont bind an object that is an instance of a graphql scalar - if (fields instanceof GraphQLScalarType) { - debug(`not binding ${type}'s fields since ${type}'s fields are an instance of GraphQLScalarType`) - boundResolvers[type] = fields; - continue; - } + if (!boundResolvers[type]) { + boundResolvers[type] = {}; + } - if (!boundResolvers[type]) { - boundResolvers[type] = {}; + for (const [field, resolver] of Object.entries(fields)) { + if (['Query', 'Mutation'].indexOf(type) > -1) { + debug(`memoized ${type}.${field}`); + boundResolvers[type][field] = memoize(type, field, resolver.bind(bindContext)); } - - for (const [field, resolver] of Object.entries(fields)) { - if (['Query', 'Mutation'].indexOf(type) > -1) { - debug(`memoized ${type}.${field}`); - boundResolvers[type][field] = memoize(type, field, resolver.bind(bindContext)); + else { + // only bind resolvers that are functions + if (typeof resolver === 'function') { + debug(`binding ${type}.${field}`); + boundResolvers[type][field] = resolver.bind(bindContext); } else { - // only bind resolvers that are functions - if (typeof resolver === 'function') { - debug(`binding ${type}.${field}`); - boundResolvers[type][field] = resolver.bind(bindContext); - } - else { - debug(`not binding ${type}.${field} since ${field} is not mapped to a function`); - boundResolvers[type][field] = resolver; - } + debug(`not binding ${type}.${field} since ${field} is not mapped to a function`); + boundResolvers[type][field] = resolver; } } } + } - return boundResolvers; - }; - - /** - * Transforms a schema using the provided transforms - * @param {GraphQLSchema} schema The schema to transform - * @param {SchemaMapper[]} transforms An array of schema transforms - * @returns {GraphQLSchema} The transformed schema - */ - const transformSchema = function (schema: GraphQLSchema, transforms: SchemaMapper[]) { - const functions = {}; - const mapping = {}; - - for (const transform of transforms) { - for (const [key, fn] of Object.entries(transform)) { - if (!mapping[key]) { - functions[key] = []; - mapping[key] = function (arg) { - while (functions[key].length) { - const mapper = functions[key].shift(); - arg = mapper(arg); - if (!arg) { - break; - } - } - return arg; + return boundResolvers; +}; + +/** + * Transforms a schema using the provided transforms + * @param {GraphQLSchema} schema The schema to transform + * @param {SchemaMapper[]} transforms An array of schema transforms + * @returns {GraphQLSchema} The transformed schema + */ +const transformSchema = function (schema: GraphQLSchema, transforms: SchemaMapper[]) { + const functions = {}; + const mapping = {}; + + for (const transform of transforms) { + for (const [key, fn] of Object.entries(transform)) { + if (!mapping[key]) { + functions[key] = []; + mapping[key] = function (arg) { + while (functions[key].length) { + const mapper = functions[key].shift(); + arg = mapper(arg); + if (!arg) { + break; } } - functions[key].push(fn); + return arg; } + } + functions[key].push(fn); } + } - return mapSchema(schema, mapping); - } \ No newline at end of file + return mapSchema(schema, mapping); +} \ No newline at end of file From 9373e04d71583d525b09de5f1f7eb0ed9e54c2a2 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 16 Apr 2025 13:47:26 -0500 Subject: [PATCH 27/40] More tests, fixed transforms. --- dist/index.d.ts | 9 ++ dist/index.js | 203 ++++++++++++++++++++++++----------------- package.json | 18 +++- src/index.ts | 218 ++++++++++++++++++++++++++------------------ test/context.ts | 42 +++++++++ test/datasources.ts | 54 +++++++++++ test/schema.ts | 53 +++++++++++ test/validation.ts | 24 +++++ 8 files changed, 439 insertions(+), 182 deletions(-) create mode 100644 test/context.ts create mode 100644 test/datasources.ts create mode 100644 test/schema.ts create mode 100644 test/validation.ts diff --git a/dist/index.d.ts b/dist/index.d.ts index d0ecf49..b797cf9 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -52,6 +52,11 @@ export interface IGraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; _types: TypeSource; @@ -66,6 +71,7 @@ export default class GraphQLComponent { debug(`building root context`); - for (let { name, fn } of contextFn._middleware) { + const middleware = contextFn._middleware || []; + for (const { name, fn } of middleware) { debug(`applying ${name} middleware`); context = await fn(context); } @@ -98,63 +110,67 @@ class GraphQLComponent { return this.constructor.name; } get schema() { - if (this._schema) { - return this._schema; - } - let makeSchema = undefined; - if (this._federation) { - makeSchema = (schemaConfig) => { - return (0, federation_1.buildFederatedSchema)(schemaConfig); - }; - } - else { - makeSchema = schema_1.makeExecutableSchema; - } - if (this._imports.length > 0) { - // iterate through the imports and construct subschema configuration objects - const subschemas = this._imports.map((imp) => { - const { component, configuration = {} } = imp; - return { - schema: component.schema, - ...configuration + try { + if (this._schema) { + return this._schema; + } + let makeSchema; + if (this._federation) { + makeSchema = federation_1.buildFederatedSchema; + } + else { + makeSchema = schema_1.makeExecutableSchema; + } + if (this._imports.length > 0) { + // iterate through the imports and construct subschema configuration objects + const subschemas = this._imports.map((imp) => { + const { component, configuration = {} } = imp; + return { + schema: component.schema, + ...configuration + }; + }); + // construct an aggregate schema from the schemas of imported + // components and this component's types/resolvers (if present) + this._schema = (0, stitch_1.stitchSchemas)({ + subschemas, + typeDefs: this._types, + resolvers: this._resolvers, + mergeDirectives: true + }); + } + else { + const schemaConfig = { + typeDefs: (0, merge_1.mergeTypeDefs)(this._types), + resolvers: this._resolvers }; - }); - // construct an aggregate schema from the schemas of imported - // components and this component's types/resolvers (if present) - this._schema = (0, stitch_1.stitchSchemas)({ - subschemas, - typeDefs: this._types, - resolvers: this._resolvers, - mergeDirectives: true - }); - } - else { - const schemaConfig = { - typeDefs: (0, merge_1.mergeTypeDefs)(this._types), - resolvers: this._resolvers - }; - this._schema = makeSchema(schemaConfig); - } - if (this._transforms) { - this._schema = transformSchema(this._schema, this._transforms); - } - if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { - debug(`adding default mocks to the schema for ${this.name}`); - // if mocks are a boolean support simply applying default mocks - this._schema = (0, mock_1.addMocksToSchema)({ schema: this._schema, preserveResolvers: true }); - } - else if (this._mocks !== undefined && typeof this._mocks === 'object') { - debug(`adding custom mocks to the schema for ${this.name}`); - // else if mocks is an object, that means the user provided - // custom mocks, with which we pass them to addMocksToSchema so they are applied - this._schema = (0, mock_1.addMocksToSchema)({ schema: this._schema, mocks: this._mocks, preserveResolvers: true }); + this._schema = makeSchema(schemaConfig); + } + if (this._transforms) { + this._schema = this.transformSchema(this._schema, this._transforms); + } + if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { + debug(`adding default mocks to the schema for ${this.name}`); + // if mocks are a boolean support simply applying default mocks + this._schema = (0, mock_1.addMocksToSchema)({ schema: this._schema, preserveResolvers: true }); + } + else if (this._mocks !== undefined && typeof this._mocks === 'object') { + debug(`adding custom mocks to the schema for ${this.name}`); + // else if mocks is an object, that means the user provided + // custom mocks, with which we pass them to addMocksToSchema so they are applied + this._schema = (0, mock_1.addMocksToSchema)({ schema: this._schema, mocks: this._mocks, preserveResolvers: true }); + } + if (this._pruneSchema) { + debug(`pruning the schema for ${this.name}`); + this._schema = (0, utils_1.pruneSchema)(this._schema, this._pruneSchemaOptions); + } + debug(`created schema for ${this.name}`); + return this._schema; } - if (this._pruneSchema) { - debug(`pruning the schema for ${this.name}`); - this._schema = (0, utils_1.pruneSchema)(this._schema, this._pruneSchemaOptions); + catch (error) { + debug(`Error creating schema for ${this.name}: ${error}`); + throw new Error(`Failed to create schema for component ${this.name}: ${error.message}`); } - debug(`created schema for ${this.name}`); - return this._schema; } get types() { return this._types; @@ -177,6 +193,50 @@ class GraphQLComponent { get federation() { return this._federation; } + dispose() { + this._schema = null; + this._types = null; + this._resolvers = null; + this._imports = null; + this._dataSources = null; + this._dataSourceOverrides = null; + } + transformSchema(schema, transforms) { + if (this._transformedSchema) { + return this._transformedSchema; + } + const functions = {}; + const mapping = {}; + for (const transform of transforms) { + for (const [key, fn] of Object.entries(transform)) { + if (!mapping[key]) { + functions[key] = []; + let result = undefined; + mapping[key] = function (...args) { + while (functions[key].length) { + const mapper = functions[key].shift(); + result = mapper(...args); + if (!result) { + break; + } + } + return result; + }; + } + functions[key].push(fn); + } + } + this._transformedSchema = (0, utils_1.mapSchema)(schema, mapping); + return this._transformedSchema; + } + validateConfig(options) { + if (options.federation && !options.types) { + throw new Error('Federation requires type definitions'); + } + if (options.mocks && typeof options.mocks !== 'boolean' && typeof options.mocks !== 'object') { + throw new Error('mocks must be either boolean or object'); + } + } } exports.default = GraphQLComponent; /** @@ -286,33 +346,4 @@ const bindResolvers = function (bindContext, resolvers = {}) { } return boundResolvers; }; -/** - * Transforms a schema using the provided transforms - * @param {GraphQLSchema} schema The schema to transform - * @param {SchemaMapper[]} transforms An array of schema transforms - * @returns {GraphQLSchema} The transformed schema - */ -const transformSchema = function (schema, transforms) { - const functions = {}; - const mapping = {}; - for (const transform of transforms) { - for (const [key, fn] of Object.entries(transform)) { - if (!mapping[key]) { - functions[key] = []; - mapping[key] = function (arg) { - while (functions[key].length) { - const mapper = functions[key].shift(); - arg = mapper(arg); - if (!arg) { - break; - } - } - return arg; - }; - } - functions[key].push(fn); - } - } - return (0, utils_1.mapSchema)(schema, mapping); -}; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVwRCxtREFBMEQ7QUFDMUQscUNBQStFO0FBRS9FLGdEQUFxRDtBQUNyRCxnREFPOEI7QUFDOUIsa0RBQTZEO0FBQzdELGtEQUFzRDtBQUN0RCw4Q0FBK0Q7QUErRC9ELE1BQXFCLGdCQUFnQjtJQUNuQyxPQUFPLENBQWdCO0lBQ3ZCLE1BQU0sQ0FBYTtJQUNuQixVQUFVLENBQWdDO0lBQzFDLE1BQU0sQ0FBbUI7SUFDekIsUUFBUSxDQUFrQztJQUMxQyxRQUFRLENBQWtCO0lBQzFCLFlBQVksQ0FBZ0I7SUFDNUIsb0JBQW9CLENBQWdCO0lBQ3BDLFlBQVksQ0FBVTtJQUN0QixtQkFBbUIsQ0FBb0I7SUFDdkMsV0FBVyxDQUFVO0lBQ3JCLHdCQUF3QixDQUE4QjtJQUN0RCxXQUFXLENBQWdCO0lBRTNCLFlBQVksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsVUFBVSxFQUNlO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFH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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBZ0M7QUFDaEMsbURBQTBEO0FBQzFELHFDQUErRTtBQUUvRSxnREFBcUQ7QUFDckQsZ0RBTzhCO0FBQzlCLGtEQUE2RDtBQUM3RCxrREFBc0Q7QUFDdEQsOENBQStEO0FBRy9ELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBVyxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUE4RC9DOzs7O0dBSUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFDbkMsT0FBTyxDQUFnQjtJQUN2QixNQUFNLENBQWE7SUFDbkIsVUFBVSxDQUFnQztJQUMxQyxNQUFNLENBQW1CO0lBQ3pCLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUNuQixrQkFBa0IsQ0FBZ0I7SUFFMUMsWUFBWSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixVQUFVLEVBQ2U7UUFFekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXBCLElBQUksQ0FBQyxXQUFXLEdB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 \ No newline at end of file diff --git a/package.json b/package.json index 288072e..60f70f9 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,15 @@ "scripts": { "build": "tsc", "prepublish": "npm run build", - "test": "tape -r ts-node/register test/**.ts", + "test": "tape -r ts-node/register \"test/**/*.ts\"", "start-composition": "DEBUG=graphql-component ts-node examples/composition/server/index.ts", "start-federation": "DEBUG=graphql-component node examples/federation/run-federation-example.js", "lint": "npx eslint src/index.ts", "cover": "nyc npm test", - "update-deps": "ncu -u && npm install" + "update-deps": "ncu -u && npm install", + "format": "prettier --write \"src/**/*.ts\"", + "precommit": "npm run lint && npm run test", + "prepare": "husky install" }, "author": "Trevor Livingston ", "repository": "https://github.com/ExpediaGroup/graphql-component", @@ -31,8 +34,6 @@ "@graphql-tools/schema": "^10.0.8", "@graphql-tools/stitch": "^9.4.0", "@graphql-tools/utils": "^10.5.6", - "@types/graphql": "^14.5.0", - "@types/node": "^22.9.1", "debug": "^4.3.7" }, "peerDependencies": { @@ -40,6 +41,8 @@ }, "devDependencies": { "@apollo/gateway": "^2.9.3", + "@types/graphql": "^14.5.0", + "@types/node": "^22.9.1", "@typescript-eslint/eslint-plugin": "^8.22.0", "@typescript-eslint/parser": "^8.22.0", "apollo-server": "^3.13.0", @@ -54,7 +57,9 @@ "tape": "^5.9.0", "ts-node": "^10.9.2", "typescript": "^5.6.3", - "typescript-eslint": "^8.22.0" + "typescript-eslint": "^8.22.0", + "husky": "^8.0.0", + "prettier": "^2.8.8" }, "nyc": { "include": [ @@ -73,5 +78,8 @@ "sourceMap": true, "instrument": true, "all": true + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/src/index.ts b/src/index.ts index 3928bd8..f065685 100644 --- a/src/index.ts +++ b/src/index.ts @@ -78,6 +78,11 @@ export interface IGraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; _types: TypeSource; @@ -92,6 +97,7 @@ export default class GraphQLComponent => { + const contextFn = async (context: Record): Promise => { debug(`building root context`); - - for (const { name, fn } of contextFn._middleware) { + + const middleware: MiddlewareEntry[] = (contextFn as any)._middleware || []; + + for (const { name, fn } of middleware) { debug(`applying ${name} middleware`); context = await fn(context); } @@ -212,74 +222,76 @@ export default class GraphQLComponent GraphQLSchema = undefined; + try { + if (this._schema) { + return this._schema; + } - if (this._federation) { - makeSchema = (schemaConfig): GraphQLSchema => { - return buildFederatedSchema(schemaConfig); - }; - } - else { - makeSchema = makeExecutableSchema; - } + let makeSchema: (schemaConfig: any) => GraphQLSchema; - if (this._imports.length > 0) { - // iterate through the imports and construct subschema configuration objects - const subschemas = this._imports.map((imp) => { - const { component, configuration = {} } = imp; + if (this._federation) { + makeSchema = buildFederatedSchema; + } else { + makeSchema = makeExecutableSchema; + } - return { - schema: component.schema, - ...configuration - }; - }); - - // construct an aggregate schema from the schemas of imported - // components and this component's types/resolvers (if present) - this._schema = stitchSchemas({ - subschemas, - typeDefs: this._types, - resolvers: this._resolvers, - mergeDirectives: true - }); - } - else { - const schemaConfig = { - typeDefs: mergeTypeDefs(this._types), - resolvers: this._resolvers + if (this._imports.length > 0) { + // iterate through the imports and construct subschema configuration objects + const subschemas = this._imports.map((imp) => { + const { component, configuration = {} } = imp; + + return { + schema: component.schema, + ...configuration + }; + }); + + // construct an aggregate schema from the schemas of imported + // components and this component's types/resolvers (if present) + this._schema = stitchSchemas({ + subschemas, + typeDefs: this._types, + resolvers: this._resolvers, + mergeDirectives: true + }); } + else { + const schemaConfig = { + typeDefs: mergeTypeDefs(this._types), + resolvers: this._resolvers + } - this._schema = makeSchema(schemaConfig); - } + this._schema = makeSchema(schemaConfig); + } - if (this._transforms) { - this._schema = transformSchema(this._schema, this._transforms); - } + if (this._transforms) { + this._schema = this.transformSchema(this._schema, this._transforms); + } - if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { - debug(`adding default mocks to the schema for ${this.name}`); - // if mocks are a boolean support simply applying default mocks - this._schema = addMocksToSchema({ schema: this._schema, preserveResolvers: true }); - } - else if (this._mocks !== undefined && typeof this._mocks === 'object') { - debug(`adding custom mocks to the schema for ${this.name}`); - // else if mocks is an object, that means the user provided - // custom mocks, with which we pass them to addMocksToSchema so they are applied - this._schema = addMocksToSchema({ schema: this._schema, mocks: this._mocks, preserveResolvers: true }); - } + if (this._mocks !== undefined && typeof this._mocks === 'boolean' && this._mocks === true) { + debug(`adding default mocks to the schema for ${this.name}`); + // if mocks are a boolean support simply applying default mocks + this._schema = addMocksToSchema({ schema: this._schema, preserveResolvers: true }); + } + else if (this._mocks !== undefined && typeof this._mocks === 'object') { + debug(`adding custom mocks to the schema for ${this.name}`); + // else if mocks is an object, that means the user provided + // custom mocks, with which we pass them to addMocksToSchema so they are applied + this._schema = addMocksToSchema({ schema: this._schema, mocks: this._mocks, preserveResolvers: true }); + } - if (this._pruneSchema) { - debug(`pruning the schema for ${this.name}`); - this._schema = pruneSchema(this._schema, this._pruneSchemaOptions); - } + if (this._pruneSchema) { + debug(`pruning the schema for ${this.name}`); + this._schema = pruneSchema(this._schema, this._pruneSchemaOptions); + } - debug(`created schema for ${this.name}`); + debug(`created schema for ${this.name}`); - return this._schema; + return this._schema; + } catch (error) { + debug(`Error creating schema for ${this.name}: ${error}`); + throw new Error(`Failed to create schema for component ${this.name}: ${error.message}`); + } } get types(): TypeSource { @@ -310,6 +322,57 @@ export default class GraphQLComponent { + t.test('should build context with middleware', async (assert) => { + const component = new GraphQLComponent({ + types: `type Query { test: String }` + }); + + const contextFn = component.context; + contextFn.use('test', async (ctx) => ({ + ...ctx, + testValue: 'test' + })); + + const context = await contextFn({}); + assert.equal(context.testValue, 'test', 'middleware was applied'); + assert.end(); + }); + + t.test('should handle multiple middleware in order', async (assert) => { + const component = new GraphQLComponent({ + types: `type Query { test: String }` + }); + + const contextFn = component.context; + contextFn.use('first', async (ctx) => ({ + ...ctx, + value: 1 + })); + contextFn.use('second', async (ctx) => ({ + ...ctx, + value: (ctx.value as number) + 1 + })); + + const context = await contextFn({}); + assert.equal(context.value, 2, 'middleware executed in order'); + assert.end(); + }); + + t.end(); +}); \ No newline at end of file diff --git a/test/datasources.ts b/test/datasources.ts new file mode 100644 index 0000000..7b6d097 --- /dev/null +++ b/test/datasources.ts @@ -0,0 +1,54 @@ +import test from 'tape'; +import GraphQLComponent from '../src/index'; + +test('GraphQLComponent DataSource Tests', (t) => { + t.test('should inject context into data source methods', async (assert) => { + class TestDataSource { + name = 'test'; + getData(context, arg) { + return `${context.value}-${arg}`; + } + } + + const component = new GraphQLComponent({ + types: `type Query { test: String }`, + dataSources: [new TestDataSource()] + }); + + const context = await component.context({ value: 'test' }); + const result = context.dataSources.test.getData('arg'); + + assert.equal(result, 'test-arg', 'context was injected into data source method'); + assert.end(); + }); + + t.test('should allow data source overrides', async (assert) => { + class TestDataSource { + name = 'test'; + getData() { + return 'original'; + } + } + + class OverrideDataSource { + name = 'test'; + getData() { + return 'override'; + } + } + + const component = new GraphQLComponent({ + types: `type Query { test: String }`, + dataSources: [new TestDataSource()], + dataSourceOverrides: [new OverrideDataSource()] + }); + + const context = await component.context({}); + const result = context.dataSources.test.getData(); + + assert.equal(result, 'override', 'data source was overridden'); + assert.end(); + }); + + t.end(); +}); \ No newline at end of file diff --git a/test/schema.ts b/test/schema.ts new file mode 100644 index 0000000..e14928a --- /dev/null +++ b/test/schema.ts @@ -0,0 +1,53 @@ +import test from 'tape'; +import GraphQLComponent from '../src/index'; +import { MapperKind } from '@graphql-tools/utils'; + +test('GraphQLComponent Schema Tests', (t) => { + t.test('should create basic schema', (assert) => { + const types = ` + type Query { + hello: String + } + `; + + const resolvers = { + Query: { + hello: () => 'world' + } + }; + + const component = new GraphQLComponent({ types, resolvers }); + assert.ok(component.schema, 'schema was created'); + assert.end(); + }); + + t.test('should handle schema transforms', (assert) => { + const types = ` + type Query { + hello: String + } + `; + + const transforms = [{ + [MapperKind.OBJECT_FIELD]: (fieldConfig, fieldName) => { + if (fieldName === 'hello') { + return { + ...fieldConfig, + description: 'A hello world field' + }; + } + return fieldConfig; + } + }]; + + const component = new GraphQLComponent({ types, transforms, resolvers: { + Query: { + hello: () => 'world' + } + } }); + assert.ok(component.schema?.getQueryType()?.getFields().hello.description === 'A hello world field', 'transform was applied'); + assert.end(); + }); + + t.end(); +}); \ No newline at end of file diff --git a/test/validation.ts b/test/validation.ts new file mode 100644 index 0000000..07b14b3 --- /dev/null +++ b/test/validation.ts @@ -0,0 +1,24 @@ +import test from 'tape'; +import GraphQLComponent from '../src/index'; + +test('GraphQLComponent Configuration Validation', (t) => { + t.test('should throw error when federation enabled without types', (assert) => { + assert.throws( + () => new GraphQLComponent({ federation: true }), + /Federation requires type definitions/, + 'throws error when federation enabled without types' + ); + assert.end(); + }); + + t.test('should throw error for invalid mocks configuration', (assert) => { + assert.throws( + () => new GraphQLComponent({ types: ['type Query { test: String }'], mocks: 'invalid' as any }), + /mocks must be either boolean or object/, + 'throws error for invalid mocks value' + ); + assert.end(); + }); + + t.end(); +}); \ No newline at end of file From a03b067c23037c5e712f2e18ec2df9d0b54ba125 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 16 Apr 2025 13:50:16 -0500 Subject: [PATCH 28/40] bumped version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60f70f9..0839ea4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graphql-component", - "version": "6.0.0-alpha.1", + "version": "6.0.0-alpha.2", "description": "Build, customize and compose GraphQL schemas in a componentized fashion", "keywords": [ "graphql", From 2059c355860e8066079c3f5341434d4800717e67 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Thu, 24 Apr 2025 11:18:53 -0500 Subject: [PATCH 29/40] Able to mix together contexts from wrapping components... Maybe don't need this! --- src/README-context-utils.md | 50 +++++++++++++++++++++++++++++++++++++ src/index.ts | 16 ++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/README-context-utils.md diff --git a/src/README-context-utils.md b/src/README-context-utils.md new file mode 100644 index 0000000..387ae15 --- /dev/null +++ b/src/README-context-utils.md @@ -0,0 +1,50 @@ +# Context Utilities for GraphQL Component + +This package includes utility types to help with TypeScript type safety when composing GraphQL components. + +## Merging Component Contexts + +When composing multiple GraphQL components, you often need to merge their contexts to maintain type safety. The `MergeComponentContexts` utility type helps with this. + +### Example Usage + +```typescript +import { MergeComponentContexts } from 'graphql-component'; +import UserComponentContext from './user-component/context'; +import ProductComponentContext from './product-component/context'; +import OrderComponentContext from './order-component/context'; + +// Define the merged context type using the utility +type ComposedComponentContext = MergeComponentContexts<[ + UserComponentContext, + ProductComponentContext, + OrderComponentContext +]>; + +// Use in your component +export default class ComposedComponent extends GraphQLComponent { + constructor(options = {}) { + const userComponent = new UserComponent(); + const productComponent = new ProductComponent(); + const orderComponent = new OrderComponent(); + + super({ + imports: [ + { component: userComponent }, + { component: productComponent }, + { component: orderComponent } + ], + // ...other options + }); + } +} +``` + +This will properly merge the `dataSources` from all the imported components, providing full type safety. + +## Benefits + +- Type-safe access to all data sources from imported components +- Autocomplete support in your IDE +- Type checking for resolver functions +- No need to manually maintain merged context types \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index f065685..1d14fe0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,6 +18,22 @@ import { SubschemaConfig } from '@graphql-tools/delegate'; const debug = debugConfig('graphql-component'); +// Re-export the context utility types +/** + * Utility type to extract and merge contexts from multiple components + * @template TContexts - Array of component context types to merge + */ +export type MergeComponentContexts = ComponentContext & { + dataSources: UnionToIntersection +}; + +/** + * Utility type to convert a union type to an intersection type + * This allows multiple component dataSources to be merged correctly + */ +export type UnionToIntersection = + (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; + export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; export interface IGraphQLComponentConfigObject { From 7e8d609efb53ffb92809cea0b8c588028071ae78 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Thu, 24 Apr 2025 11:19:19 -0500 Subject: [PATCH 30/40] Update README --- README.md | 288 ++++++++++++++++++++---------------------------------- 1 file changed, 107 insertions(+), 181 deletions(-) diff --git a/README.md b/README.md index 725e350..649e54c 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,86 @@ -![](https://github.com/ExpediaGroup/graphql-component/workflows/Build/badge.svg) +# GraphQL Component -# GraphQL schema components. +![Build Status](https://github.com/ExpediaGroup/graphql-component/workflows/Build/badge.svg) -This project is designed to facilitate componentized or modularized development of GraphQL schemas. +A library for building modular and composable GraphQL schemas through a component-based architecture. -Read more about the idea [here](https://medium.com/expedia-group-tech/graphql-component-architecture-principles-homeaway-ede8a58d6fde). +## Overview -`graphql-component` lets you build a schema progressively through a tree (facilitated through `imports`) of GraphQLComponent instances. Each GraphQLComponent instance encapsulates an executable GraphQL schema, specifically a `graphql-js` GraphQLSchema object. See the API below, but the encapsulated schema is accessible through a simple `schema` getter on a given `GraphQLComponent` instance. +`graphql-component` enables you to build GraphQL schemas progressively through a tree of components. Each component encapsulates its own schema, resolvers, and data sources, making it easier to build and maintain large GraphQL APIs. -Generally speaking, each instance of `GraphQLComponent` has reference to an instance of [`GraphQLSchema`](https://graphql.org/graphql-js/type/#graphqlschema). This instance of `GraphQLSchema` is built in a several ways, depending on the options passed to a given `GraphQLComponent`'s constructor. +Read more about the architecture principles in our [blog post](https://medium.com/expedia-group-tech/graphql-component-architecture-principles-homeaway-ede8a58d6fde). -* when a `GraphQLComponent` instance has `imports` (ie. other `GraphQLComponent` instances or component [SubschemaConfig](https://the-guild.dev/graphql/stitching/docs/getting-started/remote-subschemas#configuring-subschemas) configuration objects) is used to create a "gateway" or aggregate schema that is the combination of the underlying imported schemas, and the typeDefs/resolvers passed to the root or importing `GraphQLComponent` -* when a `GraphQLComponent` has no imports, graphql-tools' `makeExecuteableSchema({typeDefs, resolvers})` is used to generate an executable GraphQL schema using the passed/required inputs. +## Features -It's worth noting that `GraphQLComponent` can also be used to construct componentized Apollo Federated schemas. That is, if you pass the `federation: true` flag to a GraphQLComponent constructor, `@apollo/federation`'s [buildSubgraphSchema()](https://www.apollographql.com/docs/federation/api/apollo-subgraph/) is used in lieu of graphql-tools `makeExecutableSchema({...})` and the above still schema construction rule applies. The general use case here might be to help modularize an individual federated subschema service implementation. +- 🔧 **Modular Schema Design**: Build schemas through composable components +- 🔄 **Schema Stitching**: Merge multiple component schemas seamlessly +- 🚀 **Apollo Federation Support**: Build federated subgraphs with component architecture +- 📦 **Data Source Management**: Simplified data source injection and overrides +- 🛠️ **Flexible Configuration**: Extensive options for schema customization -### Running the examples +## Installation -local schema composition: - * can be run with `npm run start-composition` +```bash +npm install graphql-component +``` + +## Quick Start + +```javascript +const GraphQLComponent = require('graphql-component'); + +const { schema, context } = new GraphQLComponent({ + types, + resolvers +}); +``` + +## Core Concepts -federation (2 subschema services implemented via `GraphQLComponent` and a vanilla Apollo Gateway): - * can be run with `npm run start-federation` +### Schema Construction -### Repository structure +A `GraphQLComponent` instance creates a GraphQL schema in one of two ways: -- `src` - the graphql-component code. -- `examples/composition` - a simple example of composition using `graphql-component` -- `examples/federation` - a simple example of building a federated schema using `graphql-component` +1. **With Imports**: Creates a gateway/aggregate schema by combining imported component schemas with local types/resolvers +2. **Without Imports**: Uses `makeExecutableSchema()` to generate a schema from local types/resolvers -### Running examples: -* composition: `npm run start-composition` -* federation: `npm run start-federation` -* go to `localhost:4000/graphql` - * for composition this will bring up the GraphQL Playground for a plain old Apollo Server - * for the federation example this will bring up the GraphQL Playground for an Apollo Federated Gateway +### Federation Support -### Debug output +To create Apollo Federation subgraphs, set `federation: true` in the component options: -`GraphQLComponent` uses [debug]() for local stdout based debug logging. Enable all debug logging with the node environment variable `DEBUG=graphql-component:*`. Generally speaking, most debug output occurs during `GraphQLComponent` construction. +```javascript +const component = new GraphQLComponent({ + types, + resolvers, + federation: true +}); +``` -# API -- `GraphQLComponent(options: IGraphQLComponentOptions)` - the component class, which may also be extended. Its options include: - - `types` - a string or array of strings of GraphQL SDL defining the type definitions for this component - - `resolvers` - a resolver map (ie. a two level map whose first level keys are types from the SDL, mapped to objects, whose keys are fields on those types and values are resolver functions) - - `imports` - an optional array of imported components for the schema to be merged with. - - `context` - an optional object { namespace, factory } for contributing to context. - - `mocks` - a boolean (to enable default mocks) or an object to pass in custom mocks - - `dataSources` - an array of data sources instances to make available on `context.dataSources` . - - `dataSourceOverrides` - overrides for data sources in the component tree. - - `federation` - make this component's schema an Apollo Federated schema (default: `false`). - - `pruneSchema` - (optional) prune the schema according to [pruneSchema in graphql-tools](https://www.graphql-tools.com/docs/api/modules/utils_src#pruneschema) (default: false) - - `pruneSchemaOptions` - (optional) schema options as per [PruneSchemaOptions in graphql-tools](https://www.graphql-tools.com/docs/api/interfaces/utils_src.PruneSchemaOptions) - - `transforms` - An array of schema transforms to apply to the component's schema. +This uses `@apollo/federation`'s `buildSubgraphSchema()` instead of `makeExecutableSchema()`. -- `static GraphQLComponent.delegateToComponent(component, options)` - a wrapper function that utilizes `graphql-tools` `delegateToSchema()` to delegate the calling resolver's selection set to a root type field (`Query`, `Mutuation`) of another `GraphQLComponent`'s schema - - `component` (instance of `GraphQLComponent`) - the component's whose schema will be the target of the delegated operation - - `options` (`object`) - - `operation` (optional, can be inferred from `info`): `query` or `mutation` - - `fieldName` (optional, can be inferred if target field has same name as calling resolver's field): the target root type (`Query`, `Mutation`) field in the target `GraphQLComponent`'s schema - - `context` (required) - the `context` object from resolver that calls `delegateToComponent` - - `info` (required) - the `info` object from the resolver that calls `delegateToComponent` - - `args` (`object`, optional) - an object literal whose keys/values are passed as args to the delegatee's target field resolver. By default, the resolver's args from which `delegateToComponent` is called will be passed if the target field has an argument of the same name. Otherwise, arguments passed via the `args` object will override the calling resolver's args of the same name. - - `transforms` (optional `Array`): Transform being a valid `graphql-tools` transform +## API Reference - - please see `graphql-tools` [delegateToSchema](https://www.graphql-tools.com/docs/schema-delegation/#delegatetoschema) documentation for more details on available `options` since the delegateToComponent functions is simply an adapter for the `GraphQLComponent` API. +### GraphQLComponent Constructor -A GraphQLComponent instance (ie, `new GraphQLComponent({...})`) has the following API: +```typescript +new GraphQLComponent(options: IGraphQLComponentOptions) +``` + +#### Options + +- `types`: `string | string[]` - GraphQL SDL type definitions +- `resolvers`: `object` - Resolver map for the schema +- `imports`: `Array` - Components to import +- `context`: `{ namespace: string, factory: Function }` - Context configuration +- `mocks`: `boolean | object` - Enable default or custom mocks +- `dataSources`: `Array` - Data source instances +- `dataSourceOverrides`: `Array` - Override default data sources +- `federation`: `boolean` - Enable Apollo Federation support (default: `false`) +- `pruneSchema`: `boolean` - Enable schema pruning (default: `false`) +- `pruneSchemaOptions`: `object` - Schema pruning options +- `transforms`: `Array` - Schema transformation functions + +### Component Instance Properties ```typescript interface IGraphQLComponent { @@ -77,119 +91,53 @@ interface IGraphQLComponent { readonly resolvers: IResolvers; readonly imports?: (IGraphQLComponent | IGraphQLComponentConfigObject)[]; readonly dataSources?: IDataSource[]; - readonly dataSourcesOverrides?: IDataSource[]; + readonly dataSourceOverrides?: IDataSource[]; federation?: boolean; } ``` -- `name` - the component name -- `schema` - getter that this component's `GraphQLSchema` object (ie. the "executable" schema that is constructed as described above) -- `context` - context function that builds context for all components in the tree. -- `types` - this component's types. -- `resolvers` - this component's resolvers. -- `imports` - this component's imported components in the form of import configuration objects -- `dataSources` - this component's data source(s), if any. -- `dataSourceOverrides` - this component's data source overrides, if any. -- `federation` - if this schema should be a federated schema. - -# General usage +## Usage Examples -Creating a component using the GraphQLComponent class: +### Component Extension ```javascript -const GraphQLComponent = require('graphql-component'); - -const { schema, context } = new GraphQLComponent({ types, resolvers }); -``` - -### Encapsulating state - -Typically the best way to make a re-useable component with instance data will be to extend `GraphQLComponent`. - -```javascript -const GraphQLComponent = require('graphql-component'); -const resolvers = require('./resolvers'); -const types = require('./types'); -const mocks = require('./mocks'); - class PropertyComponent extends GraphQLComponent { - constructor({ types, resolvers }) { - super({ types, resolvers }); + constructor(options) { + super({ + types, + resolvers, + ...options + }); } } - -module.exports = PropertyComponent; ``` -### Aggregation - -Example to merge multiple components: +### Schema Aggregation ```javascript const { schema, context } = new GraphQLComponent({ imports: [ - new Property(), - new Reviews() + new PropertyComponent(), + new ReviewsComponent() ] }); -const server = new ApolloServer({ - schema, - context -}); -``` - -### Import configuration - -Imports can be a configuration object supplying the following properties: - -- `component` - the component instance to import. -- `configuration` - a `SubschemaConfig` : see [SubschemaConfig](https://the-guild.dev/graphql/stitching/docs/getting-started/remote-subschemas#configuring-subschemas) - -### Exclude - -You can exclude whole types or individual fields on types. - -```javascript -const { schema, context } = new GraphQLComponent({ - imports: [ - { - component: new Property(), - exclude: ['Mutation.*'] - }, - { - component: new Reviews(), - exclude: ['Mutation.*'] - } - ] -}); +const server = new ApolloServer({ schema, context }); ``` -The excluded types will not appear in the aggregate or gateway schema exposed by the root component, but are still present in the schema encapsulated by the underlying component. This can keep from leaking unintended API surface area, if desired. You can still delegate calls to imported component's schema to utilize the excluded field under the covers. +### Data Sources -### Data Source support - -Data sources in `graphql-component` do not extend `apollo-datasource`'s `DataSource` class. - -Instead, data sources in components will be injected into the context, but wrapped in a proxy such that the global -context will be injected as the first argument of any function implemented in a data source class. - -This allows there to exist one instance of a data source for caching or other statefulness (like circuit breakers), -while still ensuring that a data source will have the current context. - -For example, a data source should be implemented like: +Data sources in `graphql-component` use a proxy-based approach for context injection: ```javascript class PropertyDataSource { async getPropertyById(context, id) { - //do some work... + // context is automatically injected + return await this.fetchProperty(id); } } -``` -This data source would be executed without passing the `context` manually: - -```javascript +// Usage in resolvers const resolvers = { Query: { property(_, { id }, { dataSources }) { @@ -197,69 +145,47 @@ const resolvers = { } } } -``` - -Setting up a component to use a data source might look like: -```javascript +// Component configuration new GraphQLComponent({ - //... dataSources: [new PropertyDataSource()] -}) +}); ``` -### Override data sources - -Since data sources are added to the context based on the constructor name, it is possible to simply override data sources by passing the same class name or overriding the constructor name. +## Examples -`datSourceOverrides` is provided as a way to facilitate mixing in specific overrides while preserving defaults. +The repository includes example implementations: -Example: - -```javascript - -class PropertyComponent extends new GraphQLComponent { - constructor(options) { - super({ dataSources: [new PropertyDataSource()], ...options }); - } -} +### Local Schema Composition +```bash +npm run start-composition +``` -const { schema, context } = new PropertyComponent({ - dataSourceOverrides: [ - new class MockDataSource { - static get name() { - return 'PropertyDataSource'; - } - //...etc - } -}); +### Federation Example +```bash +npm run start-federation ``` -### Decorating the global context +Both examples are accessible at `http://localhost:4000/graphql` -Example context argument: +## Debugging -```javascript -const context = { - namespace: 'myNamespace', - factory: function ({ req }) { - return 'my value'; - } -}; +Enable debug logging with: +```bash +DEBUG=graphql-component:* node your-app.js ``` -After this, resolver `context` will contain `{ ..., myNamespace: 'my value' }`. +## Repository Structure -### Context middleware +- `src/` - Core library code +- `examples/` + - `composition/` - Schema composition example + - `federation/` - Federation implementation example -It may be necessary to transform the context before invoking component context. +## Contributing -```javascript -const { schema, context } = new GraphQLComponent({types, resolvers, context}); +Please read our contributing guidelines (link) for details on our code of conduct and development process. -context.use('transformRawRequest', ({ request }) => { - return { req: request.raw.req }; -}); -``` +## License -Using `context` now in `apollo-server-hapi` for example, will transform the context to one similar to default `apollo-server`. +This project is licensed under the MIT License - see the LICENSE file for details. From 8c2fa1fcc0fd7bd3f123b76c82ea6a307daff709 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Fri, 25 Apr 2025 10:50:05 -0500 Subject: [PATCH 31/40] Fixed types for datasources. --- src/index.ts | 34 +++++++++++- test/datasources.ts | 130 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 161 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1d14fe0..28d6ba6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -48,11 +48,41 @@ export interface ComponentContext extends Record { export type ContextFunction = ((context: Record) => any); export interface IDataSource { - name: string + name: string; + [key: string | symbol]: any; } +/** + * Type for implementing data sources + * When defining a data source class, methods should accept context as their first parameter + * @example + * class MyDataSource { + * name = 'MyDataSource'; + * + * // Context is required as first parameter when implementing + * getData(context: ComponentContext, id: string) { + * return { id }; + * } + * } + */ +export type DataSourceDefinition = { + [P in keyof T]: T[P] extends Function ? (context: ComponentContext, ...args: any[]) => any : T[P]; +} + +/** + * Type for consuming data sources in resolvers + * When using a data source method, the context is automatically injected + * @example + * // In a resolver: + * Query: { + * getData(_, { id }, context) { + * // Context is automatically injected, so you don't pass it + * return context.dataSources.MyDataSource.getData(id); + * } + * } + */ export type DataSource = { - [P in keyof T]: T[P] extends (context: ComponentContext, ...p: infer P) => infer R ? (...p: P) => R : never + [P in keyof T]: T[P] extends (context: ComponentContext, ...p: infer P) => infer R ? (...p: P) => R : T[P]; } export type DataSourceMap = { [key: string]: IDataSource }; diff --git a/test/datasources.ts b/test/datasources.ts index 7b6d097..0ec21e7 100644 --- a/test/datasources.ts +++ b/test/datasources.ts @@ -1,5 +1,7 @@ import test from 'tape'; -import GraphQLComponent from '../src/index'; +import GraphQLComponent, { DataSourceDefinition, DataSource, ComponentContext } from '../src/index'; +import { IResolvers } from '@graphql-tools/utils'; +import { GraphQLResolveInfo } from 'graphql'; test('GraphQLComponent DataSource Tests', (t) => { t.test('should inject context into data source methods', async (assert) => { @@ -50,5 +52,131 @@ test('GraphQLComponent DataSource Tests', (t) => { assert.end(); }); + t.test('should preserve non-function properties', async (assert) => { + class TestDataSource { + name = 'test'; + staticValue = 'static value'; + getData(context) { + return this.staticValue; + } + } + + const component = new GraphQLComponent({ + types: `type Query { test: String }`, + dataSources: [new TestDataSource()] + }); + + const context = await component.context({}); + + assert.equal(context.dataSources.test.staticValue, 'static value', 'static property was preserved'); + assert.equal(context.dataSources.test.getData(), 'static value', 'method can access static property'); + assert.end(); + }); + + t.test('should verify DataSourceDefinition type at compile time', async (assert) => { + // This test doesn't run any assertions, it's just to verify the types compile + + // Explicit typing with DataSourceDefinition to demonstrate proper usage + class TypedDataSource implements DataSourceDefinition<{ + getData: (context: ComponentContext, id: string) => { id: string, extra: string }; + getMultiple: (context: ComponentContext, ids: string[]) => { id: string }[]; + staticProp: string; + }> { + name = 'typed'; + staticProp = 'static value'; + + getData(context: ComponentContext, id: string) { + return { id, extra: context.value as string }; + } + + getMultiple(context: ComponentContext, ids: string[]) { + return ids.map(id => ({ id })); + } + } + + const component = new GraphQLComponent({ + types: `type Query { test: String }`, + dataSources: [new TypedDataSource()] + }); + + const context = await component.context({ value: 'test-value' }); + + // Using DataSource type demonstrates automatic context injection + const typedDS = context.dataSources.typed as DataSource; + + const result1 = typedDS.getData('123'); + const result2 = typedDS.getMultiple(['1', '2', '3']); + + assert.equal(result1.id, '123', 'typed data source returns correct id'); + assert.equal(result1.extra, 'test-value', 'typed data source includes context value'); + assert.equal(result2.length, 3, 'typed data source handles multiple ids'); + assert.equal(typedDS.staticProp, 'static value', 'static property preserved in typed data source'); + assert.end(); + }); + + t.test('should verify DataSource type in resolvers', async (assert) => { + // Define data source with required context parameter + class UserDataSource implements DataSourceDefinition<{ + getUserById: (context: ComponentContext, id: string) => { id: string, name: string }; + getUsersByRole: (context: ComponentContext, role: string) => { id: string, name: string }[]; + }> { + name = 'users'; + + getUserById(context: ComponentContext, id: string) { + // Implementation requires context + return { id, name: `User ${id}` }; + } + + getUsersByRole(context: ComponentContext, role: string) { + // Implementation requires context + return [ + { id: '1', name: 'User 1' }, + { id: '2', name: 'User 2' } + ]; + } + } + + // Define resolvers with explicit Query type + const resolvers = { + Query: { + // In resolvers, we don't need to pass context to data source methods + user: (_: any, { id }: { id: string }, context: ComponentContext, info: GraphQLResolveInfo) => { + // Context is injected automatically - call without passing context + return context.dataSources.users.getUserById(id); + }, + usersByRole: (_: any, { role }: { role: string }, context: ComponentContext, info: GraphQLResolveInfo) => { + // Context is injected automatically - call without passing context + return context.dataSources.users.getUsersByRole(role); + } + } + }; + + const component = new GraphQLComponent({ + types: ` + type User { + id: ID! + name: String! + } + type Query { + user(id: ID!): User + usersByRole(role: String!): [User] + } + `, + resolvers, + dataSources: [new UserDataSource()] + }); + + const context = await component.context({}); + + // Test resolver behavior with null info parameter + const user = await resolvers.Query.user(null, { id: '123' }, context, null as any); + const users = await resolvers.Query.usersByRole(null, { role: 'admin' }, context, null as any); + + assert.equal(user.id, '123', 'resolver correctly called data source'); + assert.equal(user.name, 'User 123', 'data source returned correct user name'); + assert.equal(users.length, 2, 'resolver correctly called multi-user data source'); + assert.end(); + }); + t.end(); }); \ No newline at end of file From c582e570cb565102c5429431207d3178b083779e Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Fri, 25 Apr 2025 10:50:21 -0500 Subject: [PATCH 32/40] Next version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0839ea4..89e050d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graphql-component", - "version": "6.0.0-alpha.2", + "version": "6.0.0-alpha.3", "description": "Build, customize and compose GraphQL schemas in a componentized fashion", "keywords": [ "graphql", From 4e68e3b9864d592037f29549cab50ce8b3a75132 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Fri, 25 Apr 2025 14:13:33 -0500 Subject: [PATCH 33/40] Updated composition examples datasource types --- examples/composition/property-component/datasource.ts | 6 +++--- examples/composition/property-component/index.ts | 2 +- examples/composition/property-component/resolvers.ts | 2 +- examples/composition/reviews-component/datasource.ts | 6 ++++-- examples/composition/reviews-component/index.ts | 1 - examples/composition/reviews-component/resolvers.ts | 1 - 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/composition/property-component/datasource.ts b/examples/composition/property-component/datasource.ts index 9a3c471..a1c14c1 100644 --- a/examples/composition/property-component/datasource.ts +++ b/examples/composition/property-component/datasource.ts @@ -1,14 +1,14 @@ -'use strict'; +import { DataSourceDefinition, ComponentContext } from '../../../src'; const propertiesDB = { 1: { id: 1, geo: ['41.40338', '2.17403']}, 2: { id: 2, geo: ['111.1111', '222.2222']} } -export default class PropertyDataSource { +export default class PropertyDataSource implements DataSourceDefinition { name = 'PropertyDataSource'; - getPropertyById(context, id) { + getPropertyById(context: ComponentContext, id: string) { return propertiesDB[id]; } } \ No newline at end of file diff --git a/examples/composition/property-component/index.ts b/examples/composition/property-component/index.ts index aaefe00..bccc28d 100644 --- a/examples/composition/property-component/index.ts +++ b/examples/composition/property-component/index.ts @@ -1,4 +1,4 @@ -'use strict'; + import { types } from "./types"; import GraphQLComponent from "../../../src"; diff --git a/examples/composition/property-component/resolvers.ts b/examples/composition/property-component/resolvers.ts index f1e1ab1..e3aff87 100644 --- a/examples/composition/property-component/resolvers.ts +++ b/examples/composition/property-component/resolvers.ts @@ -1,4 +1,4 @@ -'use strict'; + export const resolvers = { Query: { diff --git a/examples/composition/reviews-component/datasource.ts b/examples/composition/reviews-component/datasource.ts index f19ba28..6234aa6 100644 --- a/examples/composition/reviews-component/datasource.ts +++ b/examples/composition/reviews-component/datasource.ts @@ -1,15 +1,17 @@ 'use strict'; +import { ComponentContext, DataSourceDefinition } from "../../../src"; + // reviews indexed by property id const reviewsDB = { 1: [ { id: 'rev-id-1-a', content: 'this property was great'}, { id: 'rev-id-1-b', content: 'this property was terrible'}], 2: [ { id: 'rev-id-2-a', content: 'This property was amazing for our extended family'}, { id: 'rev-id-2-b', content: 'I loved the proximity to the beach'}, { id: 'rev-id-2-c', content: 'The bed was not comfortable at all'}] } -export default class ReviewsDataSource { +export default class ReviewsDataSource implements DataSourceDefinition { name = 'ReviewsDataSource'; - getReviewsByPropertyId(context, propertyId) { + getReviewsByPropertyId(context: ComponentContext, propertyId: string) { return reviewsDB[propertyId] } }; \ No newline at end of file diff --git a/examples/composition/reviews-component/index.ts b/examples/composition/reviews-component/index.ts index fcf83a7..7524075 100644 --- a/examples/composition/reviews-component/index.ts +++ b/examples/composition/reviews-component/index.ts @@ -1,4 +1,3 @@ -'use strict'; import { types } from "./types"; import GraphQLComponent from "../../../src"; diff --git a/examples/composition/reviews-component/resolvers.ts b/examples/composition/reviews-component/resolvers.ts index 5e6c925..cb90584 100644 --- a/examples/composition/reviews-component/resolvers.ts +++ b/examples/composition/reviews-component/resolvers.ts @@ -1,4 +1,3 @@ -'use strict'; export const resolvers = { Query: { From fdfd53f85ee196f137cb3f463320c10475c2a439 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Fri, 25 Apr 2025 14:19:00 -0500 Subject: [PATCH 34/40] Updated documentation and removed unnecessary types and files. --- README.md | 134 +++++++++++++++++++++++++++++++++--- src/README-context-utils.md | 50 -------------- src/index.ts | 16 ----- 3 files changed, 123 insertions(+), 77 deletions(-) delete mode 100644 src/README-context-utils.md diff --git a/README.md b/README.md index 649e54c..ad490f9 100644 --- a/README.md +++ b/README.md @@ -127,31 +127,143 @@ const server = new ApolloServer({ schema, context }); ### Data Sources -Data sources in `graphql-component` use a proxy-based approach for context injection: +Data sources in `graphql-component` use a proxy-based approach for context injection. The library provides two key types to assist with correct implementation: -```javascript -class PropertyDataSource { - async getPropertyById(context, id) { - // context is automatically injected - return await this.fetchProperty(id); +```typescript +// When implementing a data source: +class MyDataSource implements DataSourceDefinition { + name = 'MyDataSource'; + + // Context must be the first parameter when implementing + async getUserById(context: ComponentContext, id: string) { + // Use context for auth, config, etc. + return { id, name: 'User Name' }; } } -// Usage in resolvers +// In resolvers, context is automatically injected: const resolvers = { Query: { - property(_, { id }, { dataSources }) { - return dataSources.PropertyDataSource.getPropertyById(id); + user(_, { id }, context) { + // Don't need to pass context - it's injected automatically + return context.dataSources.MyDataSource.getUserById(id); } } } -// Component configuration +// Add to component: new GraphQLComponent({ - dataSources: [new PropertyDataSource()] + types, + resolvers, + dataSources: [new MyDataSource()] }); ``` +#### Data Source Types + +- `DataSourceDefinition`: Interface for implementing data sources - methods must accept context as first parameter +- `DataSource`: Type representing data sources after proxy wrapping - context is automatically injected + +This type system ensures proper context handling while providing a clean API for resolver usage. + +#### TypeScript Example + +```typescript +import { + GraphQLComponent, + DataSourceDefinition, + ComponentContext +} from 'graphql-component'; + +// Define your data source with proper types +class UsersDataSource implements DataSourceDefinition { + name = 'users'; + + // Static property + defaultRole = 'user'; + + // Context is required as first parameter when implementing + async getUserById(context: ComponentContext, id: string): Promise { + // Access context properties (auth, etc.) + const apiKey = context.config?.apiKey; + + // Implementation details... + return { id, name: 'User Name', role: this.defaultRole }; + } + + async getUsersByRole(context: ComponentContext, role: string): Promise { + // Implementation details... + return [ + { id: '1', name: 'User 1', role }, + { id: '2', name: 'User 2', role } + ]; + } +} + +// In resolvers, the context is automatically injected +const resolvers = { + Query: { + user: (_, { id }, context) => { + // No need to pass context - it's injected by the proxy + return context.dataSources.users.getUserById(id); + }, + usersByRole: (_, { role }, context) => { + // No need to pass context - it's injected by the proxy + return context.dataSources.users.getUsersByRole(role); + } + } +}; + +// Component configuration +const usersComponent = new GraphQLComponent({ + types: ` + type User { + id: ID! + name: String! + role: String! + } + + type Query { + user(id: ID!): User + usersByRole(role: String!): [User] + } + `, + resolvers, + dataSources: [new UsersDataSource()] +}); +``` + +#### Data Source Overrides + +You can override data sources when needed (for testing or extending functionality). The override must follow the same interface: + +```typescript +// For testing - create a mock data source +class MockUsersDataSource implements DataSourceDefinition { + name = 'users'; + defaultRole = 'admin'; + + async getUserById(context: ComponentContext, id: string) { + return { id, name: 'Mock User', role: this.defaultRole }; + } + + async getUsersByRole(context: ComponentContext, role: string) { + return [{ id: 'mock', name: 'Mock User', role }]; + } +} + +// Use the component with overrides +const testComponent = new GraphQLComponent({ + imports: [usersComponent], + dataSourceOverrides: [new MockUsersDataSource()] +}); + +// In tests +const context = await testComponent.context({}); +const mockUser = await context.dataSources.users.getUserById('any-id'); +// mockUser will be { id: 'any-id', name: 'Mock User', role: 'admin' } +``` + ## Examples The repository includes example implementations: diff --git a/src/README-context-utils.md b/src/README-context-utils.md deleted file mode 100644 index 387ae15..0000000 --- a/src/README-context-utils.md +++ /dev/null @@ -1,50 +0,0 @@ -# Context Utilities for GraphQL Component - -This package includes utility types to help with TypeScript type safety when composing GraphQL components. - -## Merging Component Contexts - -When composing multiple GraphQL components, you often need to merge their contexts to maintain type safety. The `MergeComponentContexts` utility type helps with this. - -### Example Usage - -```typescript -import { MergeComponentContexts } from 'graphql-component'; -import UserComponentContext from './user-component/context'; -import ProductComponentContext from './product-component/context'; -import OrderComponentContext from './order-component/context'; - -// Define the merged context type using the utility -type ComposedComponentContext = MergeComponentContexts<[ - UserComponentContext, - ProductComponentContext, - OrderComponentContext -]>; - -// Use in your component -export default class ComposedComponent extends GraphQLComponent { - constructor(options = {}) { - const userComponent = new UserComponent(); - const productComponent = new ProductComponent(); - const orderComponent = new OrderComponent(); - - super({ - imports: [ - { component: userComponent }, - { component: productComponent }, - { component: orderComponent } - ], - // ...other options - }); - } -} -``` - -This will properly merge the `dataSources` from all the imported components, providing full type safety. - -## Benefits - -- Type-safe access to all data sources from imported components -- Autocomplete support in your IDE -- Type checking for resolver functions -- No need to manually maintain merged context types \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 28d6ba6..f83d27c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,22 +18,6 @@ import { SubschemaConfig } from '@graphql-tools/delegate'; const debug = debugConfig('graphql-component'); -// Re-export the context utility types -/** - * Utility type to extract and merge contexts from multiple components - * @template TContexts - Array of component context types to merge - */ -export type MergeComponentContexts = ComponentContext & { - dataSources: UnionToIntersection -}; - -/** - * Utility type to convert a union type to an intersection type - * This allows multiple component dataSources to be merged correctly - */ -export type UnionToIntersection = - (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; - export type ResolverFunction = (_: any, args: any, ctx: any, info: GraphQLResolveInfo) => any; export interface IGraphQLComponentConfigObject { From 8f92b7c21daa0a587cde9b04793313552e0c44fb Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Fri, 25 Apr 2025 14:37:39 -0500 Subject: [PATCH 35/40] Updated federation and fixed linting --- .../federation/{gateway.js => gateway.ts} | 12 ++++----- .../federation/gateway/{index.js => index.ts} | 13 ++++------ .../federation/property-service/datasource.js | 14 ---------- .../federation/property-service/datasource.ts | 23 ++++++++++++++++ .../property-service/{index.js => index.ts} | 23 +++++++++------- .../federation/property-service/resolvers.js | 16 ------------ .../federation/property-service/resolvers.ts | 18 +++++++++++++ .../property-service/{types.js => types.ts} | 6 ++--- .../{datasource.js => datasource.ts} | 15 ++++++++--- .../reviews-service/{index.js => index.ts} | 26 ++++++++++--------- .../federation/reviews-service/resolvers.js | 16 ------------ .../federation/reviews-service/resolvers.ts | 18 +++++++++++++ ...seDirective.js => toUppercaseDirective.ts} | 12 ++++----- .../reviews-service/{types.js => types.ts} | 6 ++--- examples/federation/run-federation-example.js | 11 -------- examples/federation/run-federation-example.ts | 11 ++++++++ package.json | 2 +- src/index.ts | 1 + 18 files changed, 132 insertions(+), 111 deletions(-) rename examples/federation/{gateway.js => gateway.ts} (62%) rename examples/federation/gateway/{index.js => index.ts} (61%) delete mode 100644 examples/federation/property-service/datasource.js create mode 100644 examples/federation/property-service/datasource.ts rename examples/federation/property-service/{index.js => index.ts} (51%) delete mode 100644 examples/federation/property-service/resolvers.js create mode 100644 examples/federation/property-service/resolvers.ts rename examples/federation/property-service/{types.js => types.ts} (58%) rename examples/federation/reviews-service/{datasource.js => datasource.ts} (53%) rename examples/federation/reviews-service/{index.js => index.ts} (51%) delete mode 100644 examples/federation/reviews-service/resolvers.js create mode 100644 examples/federation/reviews-service/resolvers.ts rename examples/federation/reviews-service/{toUppercaseDirective.js => toUppercaseDirective.ts} (62%) rename examples/federation/reviews-service/{types.js => types.ts} (58%) delete mode 100644 examples/federation/run-federation-example.js create mode 100644 examples/federation/run-federation-example.ts diff --git a/examples/federation/gateway.js b/examples/federation/gateway.ts similarity index 62% rename from examples/federation/gateway.js rename to examples/federation/gateway.ts index 0a3da29..b41b264 100644 --- a/examples/federation/gateway.js +++ b/examples/federation/gateway.ts @@ -1,8 +1,7 @@ -const { ApolloServer } = require('apollo-server'); -const { ApolloGateway } = require('@apollo/gateway'); +import { ApolloServer } from 'apollo-server'; +import { ApolloGateway } from '@apollo/gateway'; - -const run = async function() { +const run = async function(): Promise { const gateway = new ApolloGateway({ serviceList: [ { name: 'property', url: 'http://localhost:4001' }, @@ -11,12 +10,11 @@ const run = async function() { }); const server = new ApolloServer({ - gateway, - subscriptions: false + gateway }); const { url } = await server.listen({port: 4000}); console.log(`🚀 Gateway ready at ${url}`); } -module.exports = { run }; \ No newline at end of file +export { run }; \ No newline at end of file diff --git a/examples/federation/gateway/index.js b/examples/federation/gateway/index.ts similarity index 61% rename from examples/federation/gateway/index.js rename to examples/federation/gateway/index.ts index 6930ba2..a34a8c0 100644 --- a/examples/federation/gateway/index.js +++ b/examples/federation/gateway/index.ts @@ -1,8 +1,7 @@ +import { ApolloServer } from 'apollo-server'; +import { ApolloGateway } from '@apollo/gateway'; -const { ApolloServer } = require('apollo-server'); -const { ApolloGateway } = require('@apollo/gateway'); - -const startGateway = async () => { +const startGateway = async (): Promise => { const gateway = new ApolloGateway({ serviceList: [ { name: 'property', url: 'http://localhost:4001' }, @@ -11,13 +10,11 @@ const startGateway = async () => { }); const server = new ApolloServer({ - gateway, - subscriptions: false + gateway }); const { url } = await server.listen({port: 4000}); console.log(`🚀 Gateway ready at ${url}`); } -module.exports = startGateway; - +export default startGateway; \ No newline at end of file diff --git a/examples/federation/property-service/datasource.js b/examples/federation/property-service/datasource.js deleted file mode 100644 index 0c8ce72..0000000 --- a/examples/federation/property-service/datasource.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -const propertiesDB = { - 1: { id: 1, geo: ['41.40338', '2.17403']}, - 2: { id: 2, geo: ['111.1111', '222.2222']} -} - -class PropertyDataSource { - getPropertyById(context, id) { - return propertiesDB[id]; - } -} - -module.exports = PropertyDataSource; \ No newline at end of file diff --git a/examples/federation/property-service/datasource.ts b/examples/federation/property-service/datasource.ts new file mode 100644 index 0000000..39433ed --- /dev/null +++ b/examples/federation/property-service/datasource.ts @@ -0,0 +1,23 @@ +'use strict'; + +import { ComponentContext, DataSourceDefinition } from "../../../src"; + +interface Property { + id: number; + geo: string[]; +} + +const propertiesDB: Record = { + 1: { id: 1, geo: ['41.40338', '2.17403']}, + 2: { id: 2, geo: ['111.1111', '222.2222']} +} + +class PropertyDataSource implements DataSourceDefinition { + name = 'PropertyDataSource'; + + getPropertyById(context: ComponentContext, id: string): Property | undefined { + return propertiesDB[id]; + } +} + +export default PropertyDataSource; \ No newline at end of file diff --git a/examples/federation/property-service/index.js b/examples/federation/property-service/index.ts similarity index 51% rename from examples/federation/property-service/index.js rename to examples/federation/property-service/index.ts index 47402be..9771489 100644 --- a/examples/federation/property-service/index.js +++ b/examples/federation/property-service/index.ts @@ -1,18 +1,22 @@ 'use strict'; -const { ApolloServer } = require('apollo-server'); -const GraphQLComponent = require('../../../dist').default; -const PropertyDataSource = require('./datasource'); -const resolvers = require('./resolvers'); -const types = require('./types'); +import { ApolloServer } from 'apollo-server'; +import GraphQLComponent from '../../../dist'; +import PropertyDataSource from './datasource'; +import resolvers from './resolvers'; +import types from './types'; + +interface PropertyComponentOptions { + [key: string]: any; +} class PropertyComponent extends GraphQLComponent { - constructor(options) { + constructor(options: PropertyComponentOptions) { super(options); } } -const run = async function () { +const run = async function (): Promise { const { schema, context } = new PropertyComponent({ types, resolvers, @@ -22,12 +26,11 @@ const run = async function () { const server = new ApolloServer({ schema, - context, - subscriptions: false, + context }); const { url } = await server.listen({port: 4001}) console.log(`🚀 Property service ready at ${url}`) } -module.exports = { run }; \ No newline at end of file +export { run }; \ No newline at end of file diff --git a/examples/federation/property-service/resolvers.js b/examples/federation/property-service/resolvers.js deleted file mode 100644 index 6783afe..0000000 --- a/examples/federation/property-service/resolvers.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -const resolvers = { - Query: { - property(_, { id }, { dataSources }) { - return dataSources.PropertyDataSource.getPropertyById(id); - } - }, - Property: { - __resolveReference(ref, { dataSources }) { - return dataSources.PropertyDataSource.getPropertyById(ref.id); - } - } -}; - -module.exports = resolvers; \ No newline at end of file diff --git a/examples/federation/property-service/resolvers.ts b/examples/federation/property-service/resolvers.ts new file mode 100644 index 0000000..76d4d70 --- /dev/null +++ b/examples/federation/property-service/resolvers.ts @@ -0,0 +1,18 @@ +'use strict'; + +import { ComponentContext } from "../../../src"; + +const resolvers = { + Query: { + property(_: any, { id }: { id: string }, { dataSources }: ComponentContext) { + return dataSources.PropertyDataSource.getPropertyById(id); + } + }, + Property: { + __resolveReference(ref: { id: string }, { dataSources }: ComponentContext) { + return dataSources.PropertyDataSource.getPropertyById(ref.id); + } + } +}; + +export default resolvers; \ No newline at end of file diff --git a/examples/federation/property-service/types.js b/examples/federation/property-service/types.ts similarity index 58% rename from examples/federation/property-service/types.js rename to examples/federation/property-service/types.ts index 46e4320..ad19bcb 100644 --- a/examples/federation/property-service/types.js +++ b/examples/federation/property-service/types.ts @@ -1,8 +1,8 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); +import * as fs from 'fs'; +import * as path from 'path'; const types = fs.readFileSync(path.resolve(path.join(__dirname, 'schema.graphql')), 'utf-8'); -module.exports = types; \ No newline at end of file +export default types; \ No newline at end of file diff --git a/examples/federation/reviews-service/datasource.js b/examples/federation/reviews-service/datasource.ts similarity index 53% rename from examples/federation/reviews-service/datasource.js rename to examples/federation/reviews-service/datasource.ts index 3b63177..4cf17cb 100644 --- a/examples/federation/reviews-service/datasource.js +++ b/examples/federation/reviews-service/datasource.ts @@ -1,15 +1,22 @@ 'use strict'; +import { ComponentContext, DataSourceDefinition } from "../../../src"; + +interface Review { + id: string; + content: string; +} + // reviews indexed by property id -const reviewsDB = { +const reviewsDB: Record = { 1: [ { id: 'rev-id-1-a', content: 'this property was great'}, { id: 'rev-id-1-b', content: 'this property was terrible'}], 2: [ { id: 'rev-id-2-a', content: 'This property was amazing for our extended family'}, { id: 'rev-id-2-b', content: 'I loved the proximity to the beach'}, { id: 'rev-id-2-c', content: 'The bed was not comfortable at all'}] } -class ReviewsDataSource { - getReviewsByPropertyId(context, propertyId) { +class ReviewsDataSource implements DataSourceDefinition { + getReviewsByPropertyId(context: ComponentContext, propertyId: string): Review[] | undefined { return reviewsDB[propertyId]; } } -module.exports = ReviewsDataSource; \ No newline at end of file +export default ReviewsDataSource; \ No newline at end of file diff --git a/examples/federation/reviews-service/index.js b/examples/federation/reviews-service/index.ts similarity index 51% rename from examples/federation/reviews-service/index.js rename to examples/federation/reviews-service/index.ts index 98d82c8..3ef35ef 100644 --- a/examples/federation/reviews-service/index.js +++ b/examples/federation/reviews-service/index.ts @@ -1,19 +1,23 @@ 'use strict'; -const { ApolloServer } = require('apollo-server'); -const GraphQLComponent = require('../../../dist').default; -const ReviewsDataSource = require('./datasource'); -const resolvers = require('./resolvers'); -const types = require('./types'); -const toUppercaseDirective = require('./toUppercaseDirective') +import { ApolloServer } from 'apollo-server'; +import GraphQLComponent from '../../../dist'; +import ReviewsDataSource from './datasource'; +import resolvers from './resolvers'; +import types from './types'; +import toUppercaseDirective from './toUppercaseDirective'; + +interface ReviewsComponentOptions { + [key: string]: any; +} class ReviewsComponent extends GraphQLComponent { - constructor(options) { + constructor(options: ReviewsComponentOptions) { super(options); } } -const run = async function () { +const run = async function (): Promise { const { schema, context } = new ReviewsComponent({ types, resolvers, @@ -26,13 +30,11 @@ const run = async function () { const server = new ApolloServer({ schema, - context, - subscriptions: false + context }); const { url } = await server.listen({port: 4002}) console.log(`🚀 Reviews service ready at ${url}`) - } -module.exports = { run }; \ No newline at end of file +export { run }; \ No newline at end of file diff --git a/examples/federation/reviews-service/resolvers.js b/examples/federation/reviews-service/resolvers.js deleted file mode 100644 index 4527f98..0000000 --- a/examples/federation/reviews-service/resolvers.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -const resolvers = { - Query: { - reviewsByPropertyId(_, { propertyId }, { dataSources }) { - return dataSources.ReviewsDataSource.getReviewsByPropertyId(propertyId); - } - }, - Property: { - reviews(root, _args, { dataSources }) { - return dataSources.ReviewsDataSource.getReviewsByPropertyId(root.id); - } - } -}; - -module.exports = resolvers; \ No newline at end of file diff --git a/examples/federation/reviews-service/resolvers.ts b/examples/federation/reviews-service/resolvers.ts new file mode 100644 index 0000000..65837d0 --- /dev/null +++ b/examples/federation/reviews-service/resolvers.ts @@ -0,0 +1,18 @@ +'use strict'; + +import { ComponentContext } from "../../../src"; + +const resolvers = { + Query: { + reviewsByPropertyId(_: any, { propertyId }: { propertyId: string }, { dataSources }: ComponentContext) { + return dataSources.ReviewsDataSource.getReviewsByPropertyId(propertyId); + } + }, + Property: { + reviews(root: { id: string }, _args: any, { dataSources }: ComponentContext) { + return dataSources.ReviewsDataSource.getReviewsByPropertyId(root.id); + } + } +}; + +export default resolvers; \ No newline at end of file diff --git a/examples/federation/reviews-service/toUppercaseDirective.js b/examples/federation/reviews-service/toUppercaseDirective.ts similarity index 62% rename from examples/federation/reviews-service/toUppercaseDirective.js rename to examples/federation/reviews-service/toUppercaseDirective.ts index 532bd33..dd3997c 100644 --- a/examples/federation/reviews-service/toUppercaseDirective.js +++ b/examples/federation/reviews-service/toUppercaseDirective.ts @@ -1,15 +1,15 @@ -const {getDirective, MapperKind, mapSchema} = require("@graphql-tools/utils"); -const {defaultFieldResolver} = require("graphql"); +import { getDirective, MapperKind, mapSchema } from "@graphql-tools/utils"; +import { defaultFieldResolver, GraphQLSchema } from "graphql"; -function toUppercaseDirective(directiveName) { - return (schema) => mapSchema(schema, { +function toUppercaseDirective(directiveName: string) { + return (schema: GraphQLSchema) => mapSchema(schema, { [MapperKind.OBJECT_FIELD]: (fieldConfig) => { const upperDirective = getDirective(schema, fieldConfig, directiveName)?.[0]; if (upperDirective) { const {resolve = defaultFieldResolver} = fieldConfig; return { ...fieldConfig, - resolve: async function (source, args, context, info) { + resolve: async function (source: any, args: any, context: any, info: any) { const result = await resolve(source, args, context, info); if (typeof result === 'string') { return result.toUpperCase(); @@ -22,4 +22,4 @@ function toUppercaseDirective(directiveName) { }) } -module.exports = toUppercaseDirective \ No newline at end of file +export default toUppercaseDirective; \ No newline at end of file diff --git a/examples/federation/reviews-service/types.js b/examples/federation/reviews-service/types.ts similarity index 58% rename from examples/federation/reviews-service/types.js rename to examples/federation/reviews-service/types.ts index 46e4320..ad19bcb 100644 --- a/examples/federation/reviews-service/types.js +++ b/examples/federation/reviews-service/types.ts @@ -1,8 +1,8 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); +import * as fs from 'fs'; +import * as path from 'path'; const types = fs.readFileSync(path.resolve(path.join(__dirname, 'schema.graphql')), 'utf-8'); -module.exports = types; \ No newline at end of file +export default types; \ No newline at end of file diff --git a/examples/federation/run-federation-example.js b/examples/federation/run-federation-example.js deleted file mode 100644 index 0cf76f1..0000000 --- a/examples/federation/run-federation-example.js +++ /dev/null @@ -1,11 +0,0 @@ -const { run: runReviewsService } = require('./reviews-service'); -const { run: runPropertyService } = require('./property-service'); -const { run: runGateway } = require('./gateway'); - -const start = async () => { - await runReviewsService(); - await runPropertyService(); - await runGateway(); -} - -start(); \ No newline at end of file diff --git a/examples/federation/run-federation-example.ts b/examples/federation/run-federation-example.ts new file mode 100644 index 0000000..3a1dfe5 --- /dev/null +++ b/examples/federation/run-federation-example.ts @@ -0,0 +1,11 @@ +import { run as runReviewsService } from './reviews-service'; +import { run as runPropertyService } from './property-service'; +import { run as runGateway } from './gateway'; + +const start = async (): Promise => { + await runReviewsService(); + await runPropertyService(); + await runGateway(); +} + +start(); \ No newline at end of file diff --git a/package.json b/package.json index 89e050d..eb623bd 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "prepublish": "npm run build", "test": "tape -r ts-node/register \"test/**/*.ts\"", "start-composition": "DEBUG=graphql-component ts-node examples/composition/server/index.ts", - "start-federation": "DEBUG=graphql-component node examples/federation/run-federation-example.js", + "start-federation": "DEBUG=graphql-component ts-node examples/federation/run-federation-example.ts", "lint": "npx eslint src/index.ts", "cover": "nyc npm test", "update-deps": "ncu -u && npm install", diff --git a/src/index.ts b/src/index.ts index f83d27c..6063fb9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -50,6 +50,7 @@ export interface IDataSource { * } */ export type DataSourceDefinition = { + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type [P in keyof T]: T[P] extends Function ? (context: ComponentContext, ...args: any[]) => any : T[P]; } From dae38e5f2d996bb3f87819617bad4ff78d429bba Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 7 May 2025 10:38:18 -0500 Subject: [PATCH 36/40] removed TODO.md --- TODO.md | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 TODO.md diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 02cbe98..0000000 --- a/TODO.md +++ /dev/null @@ -1,16 +0,0 @@ -Remaining to-dos for version 4: - -- [x] More test coverage -- [x] Alternative for schema directive visitor (add custom directives after creating federated schema) -- [x] Document transforms, including directives -- [x] Fix context injection -- [x] IGraphQLComponentConfigObject documentation -- [x] Fix composition examples -- [x] Fix federations examples -- [ ] Revert composition examples to JS again -- [x] Update readme - - [x] Repository structure - - [x] API - - [x] Component options - - [x] Imports / excludes docs reference to SubschemaConfig -- [ ] Move to latest stitch functionality in @graphql-tools/stitch (big change) From 854bee4949c643c1245b3f555adc72e9a7e0481a Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 7 May 2025 10:43:40 -0500 Subject: [PATCH 37/40] removed trailing comma --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 372d170..97f5e07 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,7 @@ "esModuleInterop": true, "types" : ["node", "graphql"], "outDir": "./dist", - "rootDir": "./src", + "rootDir": "./src" }, "exclude": ["node_modules"], "include": [ From 47377e8853a68ac7b07b3e196d7711108aa0288d Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Wed, 7 May 2025 10:45:25 -0500 Subject: [PATCH 38/40] bumped version to next official release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eb623bd..8b9489b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graphql-component", - "version": "6.0.0-alpha.3", + "version": "6.0.0", "description": "Build, customize and compose GraphQL schemas in a componentized fashion", "keywords": [ "graphql", From 6c1a7723df3e7cc410f16ea71bf7341acaa16706 Mon Sep 17 00:00:00 2001 From: Trevor Livingston Date: Thu, 8 May 2025 09:35:31 -0500 Subject: [PATCH 39/40] latest build --- dist/index.d.ts | 31 ++++++++++++++++++++++++++++++- dist/index.js | 2 +- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index b797cf9..55579f4 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -13,9 +13,38 @@ export interface ComponentContext extends Record { export type ContextFunction = ((context: Record) => any); export interface IDataSource { name: string; + [key: string | symbol]: any; } +/** + * Type for implementing data sources + * When defining a data source class, methods should accept context as their first parameter + * @example + * class MyDataSource { + * name = 'MyDataSource'; + * + * // Context is required as first parameter when implementing + * getData(context: ComponentContext, id: string) { + * return { id }; + * } + * } + */ +export type DataSourceDefinition = { + [P in keyof T]: T[P] extends Function ? (context: ComponentContext, ...args: any[]) => any : T[P]; +}; +/** + * Type for consuming data sources in resolvers + * When using a data source method, the context is automatically injected + * @example + * // In a resolver: + * Query: { + * getData(_, { id }, context) { + * // Context is automatically injected, so you don't pass it + * return context.dataSources.MyDataSource.getData(id); + * } + * } + */ export type DataSource = { - [P in keyof T]: T[P] extends (context: ComponentContext, ...p: infer P) => infer R ? (...p: P) => R : never; + [P in keyof T]: T[P] extends (context: ComponentContext, ...p: infer P) => infer R ? (...p: P) => R : T[P]; }; export type DataSourceMap = { [key: string]: IDataSource; diff --git a/dist/index.js b/dist/index.js index 0aec779..6eb74a0 100644 --- a/dist/index.js +++ b/dist/index.js @@ -346,4 +346,4 @@ const bindResolvers = function (bindContext, resolvers = {}) { } return boundResolvers; }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBZ0M7QUFDaEMsbURBQTBEO0FBQzFELHFDQUErRTtBQUUvRSxnREFBcUQ7QUFDckQsZ0RBTzhCO0FBQzlCLGtEQUE2RDtBQUM3RCxrREFBc0Q7QUFDdEQsOENBQStEO0FBRy9ELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBVyxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUE4RC9DOzs7O0dBSUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFDbkMsT0FBTyxDQUFnQjtJQUN2QixNQUFNLENBQWE7SUFDbkIsVUFBVSxDQUFnQztJQUMxQyxNQUFNLENBQW1CO0lBQ3pCLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUNuQixrQkFBa0IsQ0FBZ0I7SUFFMUMsWUFBWSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixVQUFVLEVBQ2U7UUFFekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXBCLElBQUksQ0FBQyxXQUFXLEdB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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBZ0M7QUFDaEMsbURBQTBEO0FBQzFELHFDQUErRTtBQUUvRSxnREFBcUQ7QUFDckQsZ0RBTzhCO0FBQzlCLGtEQUE2RDtBQUM3RCxrREFBc0Q7QUFDdEQsOENBQStEO0FBRy9ELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBVyxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUE2Ri9DOzs7O0dBSUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFDbkMsT0FBTyxDQUFnQjtJQUN2QixNQUFNLENBQWE7SUFDbkIsVUFBVSxDQUFnQztJQUMxQyxNQUFNLENBQW1CO0lBQ3pCLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUNuQixrQkFBa0IsQ0FBZ0I7SUFFMUMsWUFBWSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixVQUFVLEVBQ2U7UUFFekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXBCLElBQUksQ0FBQyxXQUFXLEdB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 \ No newline at end of file From e051fc80d00e6b57ff549cdfd07dd7ecc77082cc Mon Sep 17 00:00:00 2001 From: meliu Date: Wed, 2 Jul 2025 15:31:43 +0800 Subject: [PATCH 40/40] fix: make 'name' property optional in IDataSource interface feat: update GraphQLComponent class to implement IGraphQLComponent with generic context type chore: add backward compatibility for GraphQLComponent using CommonJS module exports --- dist/index.d.ts | 4 ++-- dist/index.js | 4 +++- src/index.ts | 7 +++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 55579f4..b681b94 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -12,7 +12,7 @@ export interface ComponentContext extends Record { } export type ContextFunction = ((context: Record) => any); export interface IDataSource { - name: string; + name?: string; [key: string | symbol]: any; } /** @@ -86,7 +86,7 @@ export interface IGraphQLComponent implements IGraphQLComponent { +export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; _types: TypeSource; _resolvers: IResolvers; diff --git a/dist/index.js b/dist/index.js index 6eb74a0..5062b24 100644 --- a/dist/index.js +++ b/dist/index.js @@ -239,6 +239,8 @@ class GraphQLComponent { } } exports.default = GraphQLComponent; +// For backward compatibility +module.exports = GraphQLComponent; /** * Wraps data sources with a proxy that intercepts calls to data source methods and injects the current context * @param {IDataSource[]} dataSources @@ -346,4 +348,4 @@ const bindResolvers = function (bindContext, resolvers = {}) { } return boundResolvers; }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBZ0M7QUFDaEMsbURBQTBEO0FBQzFELHFDQUErRTtBQUUvRSxnREFBcUQ7QUFDckQsZ0RBTzhCO0FBQzlCLGtEQUE2RDtBQUM3RCxrREFBc0Q7QUFDdEQsOENBQStEO0FBRy9ELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBVyxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUE2Ri9DOzs7O0dBSUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFDbkMsT0FBTyxDQUFnQjtJQUN2QixNQUFNLENBQWE7SUFDbkIsVUFBVSxDQUFnQztJQUMxQyxNQUFNLENBQW1CO0lBQ3pCLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUNuQixrQkFBa0IsQ0FBZ0I7SUFFMUMsWUFBWSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixVQUFVLEVBQ2U7UUFFekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXBCLElBQUksQ0FBQyxXQUFXLEdB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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBZ0M7QUFDaEMsbURBQTBEO0FBQzFELHFDQUErRTtBQUUvRSxnREFBcUQ7QUFDckQsZ0RBTzhCO0FBQzlCLGtEQUE2RDtBQUM3RCxrREFBc0Q7QUFDdEQsOENBQStEO0FBRy9ELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBVyxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUE2Ri9DOzs7O0dBSUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFDbkMsT0FBTyxDQUFnQjtJQUN2QixNQUFNLENBQWE7SUFDbkIsVUFBVSxDQUFnQztJQUMxQyxNQUFNLENBQW1CO0lBQ3pCLFFBQVEsQ0FBa0M7SUFDMUMsUUFBUSxDQUFrQjtJQUMxQixZQUFZLENBQWdCO0lBQzVCLG9CQUFvQixDQUFnQjtJQUNwQyxZQUFZLENBQVU7SUFDdEIsbUJBQW1CLENBQW9CO0lBQ3ZDLFdBQVcsQ0FBVTtJQUNyQix3QkFBd0IsQ0FBOEI7SUFDdEQsV0FBVyxDQUFnQjtJQUNuQixrQkFBa0IsQ0FBZ0I7SUFFMUMsWUFBWSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixVQUFVLEVBQ2U7UUFFekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXBCLElBQUksQ0FBQyxXQUFXLEdB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 \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 6063fb9..f0f9727 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,7 +32,7 @@ export interface ComponentContext extends Record { export type ContextFunction = ((context: Record) => any); export interface IDataSource { - name: string; + name?: string; [key: string | symbol]: any; } @@ -114,7 +114,7 @@ export interface IGraphQLComponent implements IGraphQLComponent { +export default class GraphQLComponent implements IGraphQLComponent { _schema: GraphQLSchema; _types: TypeSource; _resolvers: IResolvers; @@ -406,6 +406,9 @@ export default class GraphQLComponent