graphql-import-macro
TypeScript icon, indicating that this package has built-in type declarations

1.0.0 • Public • Published

graphql-import-macro

license standard-readme compliant

A parser and expander for GraphQL imports, with minimal dependencies.

Table of Contents

Background

There is a relatively standardized syntax for imports in GraphQL. This library aims to provide a reference implementation with minimal dependencies.

The primary target audience of this library are tools that want to support a standardized GraphQL import.

Goals

  • Provide reusabily and allow the DRY principal in GraphQL. Primarily focusing on GraphQL Document.

Non-goals

Install

npm install graphql-import-macro

Usage

import {parse, Source} from "graphql";
import {processDocumentImports} from "graphql-import-macro";

const ast = parse(new Source(content, path));

const resolvedAst = await processDocumentImports(ast);

console.log(resolvedAst);

Supported Syntax

Whitespace is ignored, except where necessary to parse tokens (import, *, ,, and from).

Macro Matcher

All matches of the following RegEX will be treated as imports:

#\s*import\s+(.+)\s*(?:\n|\r(?!\n)|\r\n|$)

Regular expression visualization

See:

Supported Import Formats

Import all:

#import 'path.graphql'
#import * from 'path.graphql'

Named Import:

#import A, B, C from 'path.graphql'

Group 1 from all imports will be matched against the following RegEx

^(?:(?:\*|((?:[_A-Za-z][_0-9A-Za-z]+\s*,\s*)*[_A-Za-z][_0-9A-Za-z]+))\s+from\s+|)?(?:'(.+)'|"(.+)")$

Regular expression visualization

  • Group 1 is used to determine if all or some of the imported file should be included.
  • Group 2 & 3 are used to get the relative file path.

API

Documents

Each AST DocumentNode must be created from a Source instantiated with at least two parameters. This ensures that correct path information is attached.

import {parse, Source} from "graphql";

const ast = parse(new Source(content, path));

processDocumentImports(ast, importResolver?)

Given an AST and optional resolver, parses imports and expands them recursively.

The loader argument can be passed to use custom loading logic and must conform to the following:

import type {DocumentNode} from "graphql";

let importResolver: (from: string, to: string) => Promise<DocumentNode>;

Contributing

PRs accepted. Commit messages must conform to the default Semantic Release format.

Small note: If editing the Readme, please conform to the standard-readme specification.

License

MIT © Tyler David Jones

Readme

Keywords

Package Sidebar

Install

npm i graphql-import-macro

Weekly Downloads

16,204

Version

1.0.0

License

MIT

Unpacked Size

28.8 kB

Total Files

17

Last publish

Collaborators

  • squirly