npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

graphql-schema-sushi

v1.2.6

Published

- recompose-schema - [`new GraphQLField()`](#GraphQLField) - [`withAfterware()`](#withAfterware) - [`withArgs()`](#withArgs) - [`withAuthentication()`](#withAuthentication) - [`withConnection()`](#withConnection) - [`withCursorPagination()`](#

Downloads

37

Readme

graphql-schema-sushi

new GraphQLField()

use class extends

class Node extends GraphQLField {
  type = null;

  args = {};

  description = null;

  deprecationReason = null;

  resolve = null;

  subscribe = null;
}

use new object

new GraphQLField({
  name: "Node",
  type: null,
  args: {},
  description: null,
  deprecationReason: null,
  resolve: null,
  subscribe: null,
});

withAfterware()

const field = new GraphQLField();
function handler(source, args, context, info, results) {
  return newResults; // use original results when no return
}
export default field |> withAfterware(handler);

withArgs()

handler mode

const field = new GraphQLField({
 // will get original args and handler replies
 resolve: (source, { ...args, ...replies }, context, info, results) {}
});
function handler(source, args, context, info) {
  return replies;
}
export default field |> withArgs(handler);

static object

const field = new GraphQLField({
 // will get original args and { id: 50 }
 resolve: (source, { ...args, ...{ id: 50 } }, context, info, results) {}
});
export default field |> withArgs({ id: 50 });

withAuthentication()

const field = new GraphQLField();
// throw new error when context.auth.user is null or undefined
export default field
  |> withArgs({
    error: AuthenticationError,
  });

withConnection()

// QueryNodes.js
const field = new GraphQLField({
  name: "Nodes",
  type: GraphQLInt,
});
export default field |> withConnection();

// Schema.js
import QueryNodes from "./QueryNodes";
new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "Query",
    fields: () => ({
      nodes: QueryNodes,
    }),
  }),
});

output

type Query {
  nodes: [Int]
}

withCursorPagination()

// QueryNodes.js
const dataSource = {
  fetchPage({ after, first }) {
    return _.assign([...nodes], { totalCount, hasNextPage });
  }
}
const field = new GraphQLField({
  name: 'Nodes',
  type: GraphQLInt
  resolve() { return dataSource; }
});
export default field |> withCursorPagination();

// Schema.js
import QueryNodes from './QueryNodes';
new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "Query",
    fields: () => ({
      nodes: QueryNodes,
    }),
  }),
});

output

type NodesEdge {
  cursor: ID
  node: Int
}

type PageInfo {
  endCursor: ID
  hasNextPage: Boolean
}

type Nodes {
  totalCount: Int
  edges: [NodesEdge]
  pageInfo: PageInfo
}

type Query {
  nodes(first: Int, after: ID): Nodes
}

withFilter()

const field = new GraphQLField({
  name: "Node",
  type: GraphQLInt,
});
function handler(source, args, context, info) {
  return true; // will output null when no return or return false;
}
export default field |> withFilter(handler);

withMiddleware()

const field = new GraphQLField({
  name: "Node",
  type: GraphQLInt,
});
function handler(source, args, context, info) {
  return [source, args, context, info]; // use original data when no return
}
export default field |> withMiddleware(handler);

withMutation()

// UpdateNodeMutation.js
const field = new GraphQLField({
  name: 'Node',

  // input fields
  args: {
    id: { type: ID },
  }

  // output fields
  type: {
    status: { type: GraphQLBoolean },
    node: { type: GraphQLInt },
  },

  resolve: () => {}
});
export default field |> withMutation();

// Schema.js
import UpdateNodeMutation from './UpdateNodeMutation';
new GraphQLSchema({
  mutation: new GraphQLObjectType({
    name: "Mutation",
    fields: () => ({
      updateNode: UpdateNodeMutation,
    }),
  }),
});

output

input NodeInput {
  id: ID
}

type NodePayload {
  status: GraphQLBoolean
  node: GraphQLInt
}

type Mutation {
  updateNode(input: NodeInput!): NodePayload
}

withOffsetPagination()

// QueryNodes.js
const dataSource = {
  fetchPage({ offset, first }) {
    return _.assign([...nodes], { totalCount });
  }
}
const field = new GraphQLField({
  name: 'Nodes',
  type: GraphQLInt
  resolve() { return dataSource; }
});
export default field |> withOffsetPagination();

// Schema.js
import QueryNodes from './QueryNodes';
new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "Query",
    fields: () => ({
      nodes: QueryNodes,
    }),
  }),
});
type Nodes {
  totalCount: Int
  nodes: [Int]
}

type Query {
  nodes(first: Int, offset: Int): Nodes
}