UNPKG

2.92 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
6
7var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
9const Asset = require('../Asset');
10
11const localRequire = require('../utils/localRequire');
12
13const Resolver = require('../Resolver');
14
15const fs = require('@parcel/fs');
16
17const os = require('os');
18
19const IMPORT_RE = /^# *import +['"](.*)['"] *;? *$/;
20
21class GraphqlAsset extends Asset {
22 constructor(name, options) {
23 super(name, options);
24 this.type = 'js';
25 this.gqlMap = new Map();
26 this.gqlResolver = new Resolver(Object.assign({}, this.options, {
27 extensions: ['.gql', '.graphql']
28 }));
29 }
30
31 traverseImports(name, code) {
32 var _this = this;
33
34 return (0, _asyncToGenerator2.default)(function* () {
35 _this.gqlMap.set(name, code);
36
37 yield Promise.all(code.split(/\r\n?|\n/).map(line => line.match(IMPORT_RE)).filter(match => !!match).map(
38 /*#__PURE__*/
39 function () {
40 var _ref = (0, _asyncToGenerator2.default)(function* ([, importName]) {
41 let _ref2 = yield _this.gqlResolver.resolve(importName, name),
42 resolved = _ref2.path;
43
44 if (_this.gqlMap.has(resolved)) {
45 return;
46 }
47
48 let code = yield fs.readFile(resolved, 'utf8');
49 yield _this.traverseImports(resolved, code);
50 });
51
52 return function (_x) {
53 return _ref.apply(this, arguments);
54 };
55 }()));
56 })();
57 }
58
59 collectDependencies() {
60 var _iteratorNormalCompletion = true;
61 var _didIteratorError = false;
62 var _iteratorError = undefined;
63
64 try {
65 for (var _iterator = this.gqlMap[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
66 let _step$value = (0, _slicedToArray2.default)(_step.value, 1),
67 path = _step$value[0];
68
69 this.addDependency(path, {
70 includedInParent: true
71 });
72 }
73 } catch (err) {
74 _didIteratorError = true;
75 _iteratorError = err;
76 } finally {
77 try {
78 if (!_iteratorNormalCompletion && _iterator.return != null) {
79 _iterator.return();
80 }
81 } finally {
82 if (_didIteratorError) {
83 throw _iteratorError;
84 }
85 }
86 }
87 }
88
89 parse(code) {
90 var _this2 = this;
91
92 return (0, _asyncToGenerator2.default)(function* () {
93 let gql = yield localRequire('graphql-tag', _this2.name);
94 yield _this2.traverseImports(_this2.name, code);
95 const allCodes = [..._this2.gqlMap.values()].join(os.EOL);
96 return gql(allCodes);
97 })();
98 }
99
100 generate() {
101 return `module.exports=${JSON.stringify(this.ast, null, 2)};`;
102 }
103
104}
105
106module.exports = GraphqlAsset;
\No newline at end of file