@4c/graphql-node-resource
Advanced tools
Comparing version 2.0.0 to 4.0.0-alpha.0
@@ -6,2 +6,4 @@ "use strict"; | ||
var _querystring = _interopRequireDefault(require("querystring")); | ||
var _dataloader = _interopRequireDefault(require("dataloader")); | ||
@@ -11,2 +13,4 @@ | ||
var _invariant = _interopRequireDefault(require("invariant")); | ||
var _chunk = _interopRequireDefault(require("lodash/chunk")); | ||
@@ -20,6 +24,2 @@ | ||
var _invariant = _interopRequireDefault(require("invariant")); | ||
var _querystring = _interopRequireDefault(require("querystring")); | ||
var _urlJoin = _interopRequireDefault(require("../utils/urlJoin")); | ||
@@ -99,7 +99,2 @@ | ||
}; | ||
} // eslint-disable-next-line require-await | ||
async request(_method, _reqUrl, _data) { | ||
throw new Error('Not Implemented'); | ||
} | ||
@@ -152,3 +147,3 @@ | ||
const chunkedItems = await Promise.all((0, _chunk.default)(keys, this.numKeysPerChunk).map(chunkKeys => this.request('GET', getPath(chunkKeys)))); | ||
const items = (0, _flatten.default)(chunkedItems).filter(Boolean); | ||
const items = (0, _flatten.default)(chunkedItems).filter(item => !!item); | ||
const itemsByKey = {}; | ||
@@ -155,0 +150,0 @@ keys.forEach(key => { |
"use strict"; | ||
exports.__esModule = true; | ||
exports.CreateNodeTypeArgs = exports.NodeFieldConfigMap = exports.NodeFieldConfig = exports.NodeFieldResolver = exports.utils = void 0; | ||
exports.HttpResourceOptions = exports.HttpContext = exports.Endpoint = exports.JsonApiError = exports.NodeTypeConfig = exports.HttpApiOptions = exports.PaginationResult = exports.Data = exports.Args = exports.RequestOptions = exports.HttpMethod = exports.setup = exports.RESOURCE_CACHE_KEY = exports.utils = void 0; | ||
var _HttpResource = _interopRequireDefault(require("./resources/HttpResource")); | ||
var _fetch = _interopRequireWildcard(require("./api/fetch")); | ||
exports.fetch = _fetch.default; | ||
exports.HttpMethod = _fetch.HttpMethod; | ||
exports.RequestOptions = _fetch.RequestOptions; | ||
var _HttpApi = _interopRequireWildcard(require("./api/HttpApi")); | ||
exports.HttpApi = _HttpApi.default; | ||
exports.Args = _HttpApi.Args; | ||
exports.Data = _HttpApi.Data; | ||
exports.PaginationResult = _HttpApi.PaginationResult; | ||
exports.HttpApiOptions = _HttpApi.HttpApiOptions; | ||
var _HttpError = _interopRequireWildcard(require("./api/HttpError")); | ||
exports.HttpError = _HttpError.default; | ||
exports.JsonApiError = _HttpError.JsonApiError; | ||
var _HttpResource = _interopRequireWildcard(require("./resources/HttpResource")); | ||
exports.HttpResource = _HttpResource.default; | ||
exports.Endpoint = _HttpResource.Endpoint; | ||
exports.HttpContext = _HttpResource.HttpContext; | ||
exports.HttpResourceOptions = _HttpResource.HttpResourceOptions; | ||
@@ -18,22 +40,10 @@ var _PaginatedHttpResource = _interopRequireDefault(require("./resources/PaginatedHttpResource")); | ||
var _HttpApi = _interopRequireDefault(require("./api/HttpApi")); | ||
var _createResolve = _interopRequireDefault(require("./types/createResolve")); | ||
exports.HttpApi = _HttpApi.default; | ||
exports.createResolve = _createResolve.default; | ||
var _HttpError = _interopRequireDefault(require("./api/HttpError")); | ||
exports.HttpError = _HttpError.default; | ||
var _fetch = _interopRequireDefault(require("./api/fetch")); | ||
exports.fetch = _fetch.default; | ||
var _NodeType = _interopRequireWildcard(require("./types/NodeType")); | ||
exports.createNodeType = _NodeType.default; | ||
exports.RESOURCE_CACHE_KEY = _NodeType.RESOURCE_CACHE_KEY; | ||
exports.NodeFieldResolver = _NodeType.NodeFieldResolver; | ||
exports.NodeFieldConfig = _NodeType.NodeFieldConfig; | ||
exports.NodeFieldConfigMap = _NodeType.NodeFieldConfigMap; | ||
exports.CreateNodeTypeArgs = _NodeType.CreateNodeTypeArgs; | ||
exports.NodeType = _NodeType.default; | ||
exports.NodeTypeConfig = _NodeType.NodeTypeConfig; | ||
@@ -48,2 +58,12 @@ var _asType = _interopRequireDefault(require("./utils/asType")); | ||
var _Context = require("./types/Context"); | ||
exports.RESOURCE_CACHE_KEY = _Context.RESOURCE_CACHE_KEY; | ||
var _config = require("./config"); | ||
exports.setup = _config.setup; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } | ||
@@ -53,4 +73,2 @@ | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
const utils = { | ||
@@ -57,0 +75,0 @@ asType: _asType.default, |
@@ -7,17 +7,4 @@ "use strict"; | ||
class Resource { | ||
// eslint-disable-next-line no-unused-vars | ||
constructor(context, config) { | ||
constructor(context) { | ||
this.context = context; | ||
} // eslint-disable-next-line no-unused-vars | ||
get(id) { | ||
throw new Error('not implemented'); | ||
} // TODO: Once we have a concept of a model, this should go on there. | ||
makeId({ | ||
id | ||
}) { | ||
return id; | ||
} | ||
@@ -24,0 +11,0 @@ |
"use strict"; | ||
exports.__esModule = true; | ||
exports.default = createNodeType; | ||
exports.RESOURCE_CACHE_KEY = void 0; | ||
exports.default = void 0; | ||
@@ -11,78 +10,29 @@ var _graphql = require("graphql"); | ||
var _invariant = _interopRequireDefault(require("invariant")); | ||
var _camelCase = _interopRequireDefault(require("lodash/camelCase")); | ||
var _snakeCase = _interopRequireDefault(require("lodash/snakeCase")); | ||
var _config = require("../config"); | ||
var _pluralize = _interopRequireDefault(require("pluralize")); | ||
var _invariant = _interopRequireDefault(require("invariant")); | ||
var _asType = _interopRequireDefault(require("../utils/asType")); | ||
var _resolveThunk = _interopRequireDefault(require("../utils/resolveThunk")); | ||
var _Resource = _interopRequireDefault(require("../resources/Resource")); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
/* eslint-disable no-underscore-dangle */ | ||
// Apollo Server shallowly clones the context for each request in a batch, | ||
// making the context object inappropriate as a batch-level cache key. Use this | ||
// to manually assign a cache key for the full batch. | ||
const RESOURCE_CACHE_KEY = Symbol('resource cache key'); | ||
exports.RESOURCE_CACHE_KEY = RESOURCE_CACHE_KEY; | ||
// eslint-disable-next-line max-classes-per-file | ||
// eslint-disable-next-line import/no-cycle | ||
function getLocalIdFieldName(name, localIdFieldName) { | ||
if (localIdFieldName !== undefined) return localIdFieldName; | ||
return `${(0, _camelCase.default)(name)}Id`; | ||
} | ||
function createNodeType({ | ||
fieldNameResolver = d => d, | ||
localIdFieldMode = 'omit', | ||
getDefaultResourceConfig = name => ({ | ||
endpoint: (0, _pluralize.default)((0, _snakeCase.default)(name)) | ||
}) | ||
} = {}) { | ||
// eslint-disable-next-line no-use-before-define | ||
const TYPES = new Map(); | ||
const { | ||
nodeInterface, | ||
nodeField, | ||
nodesField | ||
} = (0, _graphqlRelay.nodeDefinitions)(async (globalId, context) => { | ||
const { | ||
type, | ||
id | ||
} = (0, _graphqlRelay.fromGlobalId)(globalId); | ||
const resolvesType = TYPES.get(type); | ||
!resolvesType ? process.env.NODE_ENV !== "production" ? (0, _invariant.default)(false, 'There is no matching type') : invariant(false) : void 0; | ||
const item = await resolvesType.getResource(context).get(id); | ||
if (!item) return null; | ||
return { | ||
$type: type, | ||
...item | ||
}; | ||
}, obj => TYPES.get(obj.$type)); | ||
function getNodeResource(context, info) { | ||
// eslint-disable-next-line no-use-before-define | ||
const parentType = (0, _asType.default)(info.parentType, NodeType); | ||
return parentType.getResource(context); | ||
class NodeType extends _graphql.GraphQLObjectType { | ||
getNodeObject(obj, context) { | ||
const resource = this.getResource(context); | ||
return resource.get(this.getLocalId(obj)); | ||
} | ||
function getLocalId(obj, context, info) { | ||
const id = getNodeResource(context, info).makeId(obj); | ||
if (!id) throw new Error('null local id'); | ||
return id; | ||
} | ||
function getNodeObject(obj, context, info) { | ||
const resource = getNodeResource(context, info); | ||
return resource.get(resource.makeId(obj)); | ||
} | ||
async function getAsyncNodeValue(obj, fieldName, context, info) { | ||
const fullObj = await getNodeObject(obj, context, info); | ||
return fullObj && fullObj[fieldName]; | ||
} | ||
function getNodeValue(obj, fieldName, context, info) { | ||
async getNodeValue(obj, fieldName, context) { | ||
if (obj[fieldName] === undefined) { | ||
return getAsyncNodeValue(obj, fieldName, context, info); | ||
const fullObj = await this.getNodeObject(obj, context); | ||
return fullObj && fullObj[fieldName]; | ||
} | ||
@@ -93,130 +43,87 @@ | ||
async function asyncResolve(resolve, obj, args, context, info) { | ||
const fullObj = await getNodeObject(obj, context, info); | ||
return fullObj && resolve(fullObj, args, context, info); | ||
getLocalId(obj) { | ||
const id = this.makeId(obj); | ||
if (!id) throw new Error('null local id'); | ||
return id; | ||
} | ||
function createResolve(resolve, objFields) { | ||
const fieldNames = Object.keys(objFields); | ||
return function augmentedResolve(obj, args, context, info) { | ||
for (const fieldName of fieldNames) { | ||
if (obj[fieldName] === undefined) { | ||
return asyncResolve(resolve, obj, args, context, info); | ||
} | ||
} | ||
constructor({ | ||
name, | ||
interfaces, | ||
localIdFieldName, | ||
fields, | ||
createResource, | ||
makeId, | ||
...rest | ||
}) { | ||
if ((0, _config.needsSetup)()) { | ||
throw new Error('you must first call setup'); | ||
} | ||
return resolve(obj, args, context, info); | ||
}; | ||
} | ||
if (_config.config.localIdFieldMode !== 'omit') { | ||
// eslint-disable-next-line no-param-reassign | ||
localIdFieldName = getLocalIdFieldName(name, localIdFieldName); | ||
} else { | ||
!!localIdFieldName ? process.env.NODE_ENV !== "production" ? (0, _invariant.default)(false, "must not specify localIdFieldName when localIdFieldMode is 'omit'") : invariant(false) : void 0; | ||
} | ||
const resolveLocalId = (obj, args, context, info) => getLocalId(obj, context, info); | ||
super({ ...rest, | ||
name, | ||
interfaces: () => [...((0, _resolveThunk.default)(interfaces) || []), _config.config.nodeInterface], | ||
fields: () => { | ||
const fieldConfig = { | ||
id: (0, _graphqlRelay.globalIdField)(undefined, object => this.getLocalId(object)) | ||
}; // This will only be set if localIdFieldMode is not 'omit'. | ||
const fieldResolve = (obj, args, context, info) => getNodeValue(obj, fieldNameResolver(info.fieldName, obj, args, context, info), context, info); | ||
if (localIdFieldName) { | ||
fieldConfig[localIdFieldName] = { | ||
type: _graphql.GraphQLString, | ||
deprecationReason: _config.config.localIdFieldMode === 'deprecated' ? 'local IDs are deprecated; use "handle" if available or "id" for the global ID' : null, | ||
resolve: obj => this.getLocalId(obj) | ||
}; | ||
} | ||
function getLocalIdFieldName(name, localIdFieldName) { | ||
if (localIdFieldName !== undefined) return localIdFieldName; | ||
return `${(0, _camelCase.default)(name)}Id`; | ||
} | ||
function makeFields(fields, localIdFieldName) { | ||
return () => { | ||
const idFields = { | ||
id: (0, _graphqlRelay.globalIdField)(null, getLocalId) | ||
}; // This will only be set if localIdFieldMode is not 'omit'. | ||
if (localIdFieldName) { | ||
idFields[localIdFieldName] = { | ||
type: _graphql.GraphQLString, | ||
deprecationReason: localIdFieldMode === 'deprecated' ? 'local IDs are deprecated; use "handle" if available or "id" for the global ID' : null, | ||
resolve: resolveLocalId | ||
}; | ||
Object.entries((0, _resolveThunk.default)(fields)).forEach(([fieldName, { | ||
resolve, | ||
...field | ||
}]) => { | ||
fieldConfig[fieldName] = { ...field, | ||
resolve: resolve || ((obj, _args, context, info) => this.getNodeValue(obj, info.fieldName, context)) | ||
}; | ||
}); | ||
return fieldConfig; | ||
} | ||
}); | ||
const { | ||
connectionType, | ||
edgeType | ||
} = (0, _graphqlRelay.connectionDefinitions)({ | ||
nodeType: this | ||
}); | ||
this.Connection = connectionType; | ||
this.Edge = edgeType; | ||
this.localIdFieldName = localIdFieldName; | ||
this.createResource = createResource; | ||
const augmentedFields = (0, _resolveThunk.default)(fields); | ||
Object.keys(augmentedFields).forEach(fieldName => { | ||
// TODO: Find a Flow-friendly Object.entries pattern. | ||
const field = augmentedFields[fieldName]; | ||
this.makeId = makeId || (({ | ||
id | ||
}) => id); | ||
if (field.resolve) { | ||
return; | ||
} | ||
augmentedFields[fieldName] = { ...field, | ||
resolve: fieldResolve | ||
}; | ||
}); | ||
return { ...idFields, | ||
...augmentedFields | ||
}; | ||
}; | ||
_config.config.nodeTypesByName.set(name, this); | ||
} | ||
const Resources = new WeakMap(); | ||
getResource(context) { | ||
let resource = _config.config.resourceManager.get(context, this.name); | ||
class NodeType extends _graphql.GraphQLObjectType { | ||
constructor({ | ||
name, | ||
interfaces, | ||
localIdFieldName, | ||
fields, | ||
Resource: NodeResource, | ||
resourceConfig, | ||
...config | ||
}) { | ||
if (localIdFieldMode !== 'omit') { | ||
// eslint-disable-next-line no-param-reassign | ||
localIdFieldName = getLocalIdFieldName(name, localIdFieldName); | ||
} else { | ||
!!localIdFieldName ? process.env.NODE_ENV !== "production" ? (0, _invariant.default)(false, "must not specify localIdFieldName when localIdFieldMode is 'omit'") : invariant(false) : void 0; | ||
} | ||
if (!resource) { | ||
resource = this.createResource(context); | ||
super({ ...config, | ||
name, | ||
interfaces: () => [...((0, _resolveThunk.default)(interfaces) || []), nodeInterface], | ||
fields: makeFields(fields, localIdFieldName) | ||
}); | ||
const { | ||
connectionType, | ||
edgeType | ||
} = (0, _graphqlRelay.connectionDefinitions)({ | ||
nodeType: this | ||
}); | ||
this.Connection = connectionType; | ||
this.Edge = edgeType; | ||
this.localIdFieldName = localIdFieldName; | ||
this.NodeResource = NodeResource; | ||
this.resourceConfig = resourceConfig || getDefaultResourceConfig(name); | ||
TYPES.set(name, this); | ||
_config.config.resourceManager.set(context, this.name, resource); | ||
} | ||
getResource(context) { | ||
const cacheKey = context[RESOURCE_CACHE_KEY] || context; | ||
let resources = Resources.get(cacheKey); | ||
return resource; | ||
} | ||
if (!resources) { | ||
// eslint-disable-next-line no-param-reassign | ||
resources = new Map(); | ||
Resources.set(cacheKey, resources); | ||
} | ||
} | ||
let resource = resources.get(this.name); | ||
if (!resource) { | ||
resource = new this.NodeResource(context, this.resourceConfig); | ||
resources.set(this.name, resource); | ||
} | ||
return (0, _asType.default)(resource, this.NodeResource); | ||
} | ||
} | ||
return { | ||
NodeType, | ||
getNodeResource, | ||
getNodeValue, | ||
nodeField, | ||
nodesField, | ||
createResolve | ||
}; | ||
} | ||
exports.default = NodeType; |
@@ -6,6 +6,9 @@ "use strict"; | ||
var _isObject = _interopRequireDefault(require("lodash/isObject")); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function asType(obj, klass) { | ||
if (!(obj instanceof klass)) { | ||
const ctor = // $FlowFixMe | ||
typeof obj === 'object' && obj.constructor && obj.constructor.name; | ||
const ctor = (0, _isObject.default)(obj) && obj.constructor && obj.constructor.name; | ||
throw new Error(`"${String(ctor || obj)}" is not an instance of ${String(klass)}`); | ||
@@ -12,0 +15,0 @@ } |
@@ -7,4 +7,3 @@ "use strict"; | ||
function resolveThunk(thunk) { | ||
// $FlowFixMe | ||
return typeof thunk === 'function' ? thunk() : thunk; | ||
return thunk instanceof Function ? thunk() : thunk; | ||
} |
@@ -15,3 +15,3 @@ "use strict"; | ||
if (!data || typeof data !== 'object') { | ||
if (typeof data !== 'object' || !data) { | ||
return data; | ||
@@ -18,0 +18,0 @@ } |
119
package.json
{ | ||
"name": "@4c/graphql-node-resource", | ||
"version": "2.0.0", | ||
"files": [ | ||
"lib", | ||
"es" | ||
], | ||
"version": "4.0.0-alpha.0", | ||
"main": "lib/index.js", | ||
"module": "es/index.js", | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/4Catalyzer/graphql-node-resource.git" | ||
}, | ||
"author": "4Catalyzer", | ||
"license": "MIT", | ||
"scripts": { | ||
"build": "npm run clean && npm run build:cjs && npm run build:esm && npm run build:flow", | ||
"build:cjs": "babel src -d lib --ignore __tests__", | ||
"build:esm": "BABEL_ENV=esm babel src --out-dir es --ignore __tests__", | ||
"build:flow": "for file in $(find ./src -name '*.js' -not -path '*/__tests__*'); do cp \"$file\" `echo \"$file\" | sed 's/\\/src\\//\\/lib\\//g'`.flow; cp \"$file\" `echo \"$file\" | sed 's/\\/src\\//\\/es\\//g'`.flow; done", | ||
"check": "flow check", | ||
"clean": "rm -rf lib es", | ||
"format": "eslint . --fix && prettier --write --ignore-path .eslintignore '**/*.{json,css,md}'", | ||
"lint": "npm run check && eslint . && prettier --list-different --ignore-path .eslintignore '**/*.{json,css}'", | ||
"prepublish": "npm run build", | ||
"build": "4c build src", | ||
"prepublishOnly": "yarn run build", | ||
"tdd": "jest --watch", | ||
"test": "npm run lint && jest --coverage" | ||
"test": "yarn lint && yarn typecheck && jest", | ||
"testonly": "jest", | ||
"lint": "4c lint src './*'", | ||
"format": "4c format src './*'", | ||
"release": "4c release", | ||
"typecheck": "tsc --noEmit && tsc -p test --noEmit" | ||
}, | ||
"publishConfig": { | ||
"access": "public" | ||
}, | ||
"prettier": "@4c/prettier-config", | ||
"husky": { | ||
@@ -29,23 +32,12 @@ "hooks": { | ||
"lint-staged": { | ||
"*.js": [ | ||
"eslint --fix", | ||
"git add" | ||
], | ||
"*.{json,css,md}": [ | ||
"prettier --write --ignore-path .eslintignore", | ||
"git add" | ||
"*": [ | ||
"yarn 4c lint --fix" | ||
] | ||
}, | ||
"prettier": { | ||
"printWidth": 79, | ||
"singleQuote": true, | ||
"trailingComma": "all" | ||
}, | ||
"jest": { | ||
"collectCoverageFrom": [ | ||
"src/**" | ||
], | ||
"preset": "@4c/jest-preset", | ||
"testEnvironment": "node" | ||
}, | ||
"release": { | ||
"pkgRoot": "lib", | ||
"extends": [ | ||
@@ -55,8 +47,14 @@ "@4c/semantic-release-config" | ||
}, | ||
"repository": "https://github.com/4Catalyzer/graphql-server.git", | ||
"author": "4Catalyzer", | ||
"license": "MIT", | ||
"dependencies": { | ||
"@types/graphql": "^14.5.0", | ||
"@types/graphql-relay": "^0.4.11", | ||
"@types/invariant": "^2.2.31", | ||
"@types/jest": "^25.1.0", | ||
"@types/lodash": "^4.14.149", | ||
"@types/node": "^13.5.0", | ||
"@types/node-fetch": "^2.5.4", | ||
"@types/pluralize": "^0.0.29", | ||
"dataloader": "^2.0.0", | ||
"express": "^4.17.1", | ||
"fetch-mock": "^8.3.2", | ||
"form-data": "^3.0.0", | ||
@@ -66,3 +64,4 @@ "invariant": "^2.2.4", | ||
"node-fetch": "^2.6.0", | ||
"pluralize": "^8.0.0" | ||
"pluralize": "^8.0.0", | ||
"utility-types": "^3.10.0" | ||
}, | ||
@@ -74,30 +73,34 @@ "peerDependencies": { | ||
"devDependencies": { | ||
"@4c/babel-preset": "^7.2.1", | ||
"@4c/semantic-release-config": "^2.0.3", | ||
"@babel/cli": "^7.7.0", | ||
"@babel/core": "^7.7.2", | ||
"@babel/preset-flow": "^7.0.0", | ||
"babel-jest": "^24.9.0", | ||
"codecov": "^3.6.1", | ||
"eslint": "^6.6.0", | ||
"eslint-config-4catalyzer-flow": "^1.0.1", | ||
"eslint-config-4catalyzer-jest": "^2.0.1", | ||
"eslint-config-prettier": "^6.6.0", | ||
"eslint-plugin-flowtype": "^4.4.1", | ||
"eslint-plugin-import": "^2.18.2", | ||
"eslint-plugin-jest": "^22.21.0", | ||
"eslint-plugin-prettier": "^3.1.1", | ||
"fetch-mock": "^8.0.0", | ||
"flow-bin": "^0.110.1", | ||
"graphql": "^14.5.8", | ||
"@4c/babel-preset": "^7.3.0", | ||
"@4c/cli": "^1.0.5", | ||
"@4c/import-sort": "^4.3.6", | ||
"@4c/jest-preset": "^1.4.4", | ||
"@4c/prettier-config": "^1.1.0", | ||
"@4c/semantic-release-config": "^2.0.4", | ||
"@4c/tsconfig": "^0.3.0", | ||
"@babel/cli": "^7.8.3", | ||
"@babel/core": "^7.8.3", | ||
"@babel/preset-typescript": "^7.8.3", | ||
"@typescript-eslint/eslint-plugin": "^2.18.0", | ||
"codecov": "^3.6.2", | ||
"eslint": "^6.8.0", | ||
"eslint-config-4catalyzer": "^1.0.2", | ||
"eslint-config-4catalyzer-jest": "^2.0.3", | ||
"eslint-config-4catalyzer-typescript": "^1.1.5", | ||
"eslint-config-prettier": "^6.10.0", | ||
"eslint-plugin-import": "^2.20.0", | ||
"eslint-plugin-jest": "^23.6.0", | ||
"eslint-plugin-prettier": "^3.1.2", | ||
"graphql": "^14.6.0", | ||
"graphql-relay": "^0.6.0", | ||
"husky": "^3.1.0", | ||
"jest": "^24.9.0", | ||
"lint-staged": "^9.4.3", | ||
"husky": "^4.2.1", | ||
"jest": "^25.1.0", | ||
"lint-staged": "^10.0.3", | ||
"prettier": "^1.19.1", | ||
"semantic-release": "^15.13.31" | ||
"semantic-release": "^17.0.1", | ||
"typescript": "^3.7.5" | ||
}, | ||
"engines": { | ||
"node": ">=10.0.0" | ||
"node": ">=v10.18.1" | ||
} | ||
} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
599866
79
2204
4
19
28
2
2
+ Added@types/graphql@^14.5.0
+ Added@types/graphql-relay@^0.4.11
+ Added@types/invariant@^2.2.31
+ Added@types/jest@^25.1.0
+ Added@types/lodash@^4.14.149
+ Added@types/node@^13.5.0
+ Added@types/node-fetch@^2.5.4
+ Added@types/pluralize@^0.0.29
+ Addedfetch-mock@^8.3.2
+ Addedutility-types@^3.10.0
+ Added@jest/types@25.5.0(transitive)
+ Added@types/graphql@14.5.0(transitive)
+ Added@types/graphql-relay@0.4.11(transitive)
+ Added@types/invariant@2.2.37(transitive)
+ Added@types/istanbul-lib-coverage@2.0.6(transitive)
+ Added@types/istanbul-lib-report@3.0.3(transitive)
+ Added@types/istanbul-reports@1.1.2(transitive)
+ Added@types/jest@25.2.3(transitive)
+ Added@types/lodash@4.17.15(transitive)
+ Added@types/node@13.13.52(transitive)
+ Added@types/node-fetch@2.6.12(transitive)
+ Added@types/pluralize@0.0.29(transitive)
+ Added@types/yargs@15.0.19(transitive)
+ Added@types/yargs-parser@21.0.3(transitive)
+ Addedansi-regex@5.0.1(transitive)
+ Addedansi-styles@4.3.0(transitive)
+ Addedbabel-runtime@6.26.0(transitive)
+ Addedchalk@3.0.0(transitive)
+ Addedcolor-convert@2.0.1(transitive)
+ Addedcolor-name@1.1.4(transitive)
+ Addedcore-js@2.6.123.40.0(transitive)
+ Addeddiff-sequences@25.2.6(transitive)
+ Addedfetch-mock@8.3.2(transitive)
+ Addedform-data@4.0.2(transitive)
+ Addedget-intrinsic@1.2.7(transitive)
+ Addedglob-to-regexp@0.4.1(transitive)
+ Addedgraphql@14.7.0(transitive)
+ Addedhas-flag@4.0.0(transitive)
+ Addediterall@1.3.0(transitive)
+ Addedjest-diff@25.5.0(transitive)
+ Addedjest-get-type@25.2.6(transitive)
+ Addedlodash.isequal@4.5.0(transitive)
+ Addedlodash.sortby@4.7.0(transitive)
+ Addedpath-to-regexp@2.4.0(transitive)
+ Addedpretty-format@25.5.0(transitive)
+ Addedpunycode@2.3.1(transitive)
+ Addedquerystring@0.2.1(transitive)
+ Addedreact-is@16.13.1(transitive)
+ Addedregenerator-runtime@0.11.1(transitive)
+ Addedsupports-color@7.2.0(transitive)
+ Addedtr46@1.0.1(transitive)
+ Addedutility-types@3.11.0(transitive)
+ Addedwebidl-conversions@4.0.2(transitive)
+ Addedwhatwg-url@6.5.0(transitive)
- Removedget-intrinsic@1.3.0(transitive)