New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@4c/graphql-node-resource

Package Overview
Dependencies
Maintainers
4
Versions
41
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@4c/graphql-node-resource - npm Package Compare versions

Comparing version 2.0.0 to 4.0.0-alpha.0

__mocks__/node-fetch.ts

15

lib/api/HttpApi.js

@@ -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 @@ }

{
"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"
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc