UNPKG

8.2 kBJavaScriptView Raw
1"use strict";
2
3var _relayCompiler = require("relay-compiler");
4
5var _RelayLanguagePluginJavaScript = _interopRequireDefault(require("relay-compiler/lib/language/javascript/RelayLanguagePluginJavaScript"));
6
7var _RelaySourceModuleParser = _interopRequireDefault(require("relay-compiler/lib/core/RelaySourceModuleParser"));
8
9var _fs = _interopRequireDefault(require("fs"));
10
11var _path = _interopRequireDefault(require("path"));
12
13var _getSchemaSource = _interopRequireDefault(require("./getSchemaSource"));
14
15var _getWriter = _interopRequireDefault(require("./getWriter"));
16
17var _getFilepathsFromGlob = _interopRequireDefault(require("./getFilepathsFromGlob"));
18
19var _getRelayCompilerPluginHooks = _interopRequireDefault(require("./getRelayCompilerPluginHooks"));
20
21var _createRaiseErrorsReporter = _interopRequireDefault(require("./createRaiseErrorsReporter"));
22
23function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
25function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
26
27function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
28
29function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
30
31const {
32 schemaExtensions
33} = _relayCompiler.IRTransforms;
34
35function createParserConfigs({
36 baseDir,
37 getParser,
38 sourceParserName,
39 languagePlugin,
40 include,
41 exclude,
42 schema,
43 extensions
44}) {
45 const sourceModuleParser = (0, _RelaySourceModuleParser.default)(languagePlugin.findGraphQLTags);
46 const fileOptions = {
47 extensions,
48 include,
49 exclude
50 };
51 return {
52 [sourceParserName]: {
53 baseDir,
54 getFileFilter: sourceModuleParser.getFileFilter,
55 getParser: getParser || sourceModuleParser.getParser,
56 getSchemaSource: () => (0, _getSchemaSource.default)(schema),
57 schemaExtensions,
58 filepaths: (0, _getFilepathsFromGlob.default)(baseDir, fileOptions)
59 },
60 graphql: {
61 baseDir,
62 getParser: _relayCompiler.DotGraphQLParser.getParser,
63 getSchemaSource: () => (0, _getSchemaSource.default)(schema),
64 schemaExtensions,
65 filepaths: (0, _getFilepathsFromGlob.default)(baseDir, _objectSpread({}, fileOptions, {
66 extensions: ['graphql']
67 }))
68 }
69 };
70}
71
72class RelayCompilerWebpackPlugin {
73 constructor(options) {
74 _defineProperty(this, "parserConfigs", void 0);
75
76 _defineProperty(this, "writerConfigs", void 0);
77
78 _defineProperty(this, "languagePlugin", void 0);
79
80 _defineProperty(this, "options", void 0);
81
82 if (!options) {
83 throw new Error('You must provide options to RelayCompilerWebpackPlugin.');
84 }
85
86 if (!options.schema) {
87 throw new Error('You must provide a Relay Schema.');
88 }
89
90 if (typeof options.schema === 'string' && !_fs.default.existsSync(options.schema)) {
91 throw new Error(`Could not find the [schema] provided (${options.schema}).`);
92 }
93
94 if (!options.src) {
95 throw new Error('You must provide a Relay `src` path.');
96 }
97
98 if (!_fs.default.existsSync(options.src)) {
99 throw new Error(`Could not find the [src] provided (${options.src})`);
100 }
101
102 this.options = options;
103 }
104
105 createWriterConfigs({
106 sourceParserName,
107 languagePlugin,
108 config
109 }) {
110 return {
111 [languagePlugin.outputExtension]: {
112 writeFiles: (0, _getWriter.default)(languagePlugin, config),
113 isGeneratedFile: filePath => {
114 if (filePath.endsWith(`.graphql.${languagePlugin.outputExtension}`)) {
115 if (this.options.artifactDirectory) {
116 return filePath.startsWith(this.options.artifactDirectory);
117 }
118
119 return filePath.includes('__generated__');
120 }
121
122 return false;
123 },
124 parser: sourceParserName,
125 baseParsers: ['graphql']
126 }
127 };
128 }
129
130 async compile(issuer, request, compilation, hooks) {
131 let logger; // webpack 4.38+
132
133 if (compilation.getLogger) {
134 logger = compilation.getLogger('RelayCompilerPlugin');
135 }
136
137 const reporter = this.options.getReporter ? this.options.getReporter(logger) : (0, _createRaiseErrorsReporter.default)(logger); // Can this be set up in constructor and use same instance every time?
138
139 const runner = new _relayCompiler.Runner({
140 parserConfigs: this.parserConfigs,
141 writerConfigs: this.writerConfigs,
142 reporter,
143 onlyValidate: false,
144 skipPersist: true
145 });
146 return hooks.beforeWrite.promise().then(() => runner.compile(this.languagePlugin.outputExtension)).then(compileResult => hooks.afterWrite.promise(compileResult));
147 }
148
149 cachedCompiler(compilation) {
150 const hooks = (0, _getRelayCompilerPluginHooks.default)(compilation);
151 let result;
152 return (issuer, request) => {
153 if (!result) result = this.compile(issuer, request, compilation, hooks);
154 return result;
155 };
156 }
157
158 runCompile(compile, result, callback) {
159 if (result && result.contextInfo.issuer && (this.options.artifactDirectory || result.request.match(/__generated__/))) {
160 const request = _path.default.resolve(_path.default.dirname(result.contextInfo.issuer), result.request);
161
162 if (this.options.artifactDirectory && !request.startsWith(this.options.artifactDirectory)) {
163 callback(null, result);
164 return;
165 }
166
167 compile(result.contextInfo.issuer, request).then(() => callback(null, result)).catch(error => callback(error));
168 return;
169 }
170
171 callback(null, result);
172 }
173
174 apply(compiler) {
175 const {
176 options
177 } = this;
178
179 const language = (options.languagePlugin || _RelayLanguagePluginJavaScript.default)();
180
181 const extensions = options.extensions !== undefined ? options.extensions : language.inputExtensions;
182 const sourceParserName = extensions.join('/');
183 const include = options.include !== undefined ? options.include : ['**'];
184 const exclude = options.exclude !== undefined ? options.exclude : ['**/node_modules/**', '**/__mocks__/**', '**/__tests__/**', '**/__generated__/**'];
185 this.parserConfigs = createParserConfigs({
186 sourceParserName,
187 languagePlugin: language,
188 include,
189 exclude,
190 schema: options.schema,
191 getParser: options.getParser,
192 baseDir: options.src,
193 extensions
194 });
195 this.writerConfigs = this.createWriterConfigs({
196 sourceParserName,
197 languagePlugin: language,
198 config: _objectSpread({}, options.config, {
199 outputDir: options.artifactDirectory,
200 baseDir: options.src
201 })
202 });
203 this.languagePlugin = language;
204
205 if (compiler.hooks) {
206 compiler.hooks.compilation.tap('RelayCompilerWebpackPlugin', (compilation, params) => {
207 const compile = this.cachedCompiler(compilation);
208 params.normalModuleFactory.hooks.beforeResolve.tapAsync('RelayCompilerWebpackPlugin', (result, callback) => {
209 this.runCompile(compile, result, callback);
210 });
211 });
212 } else {
213 compiler.plugin('compilation', (compilation, params) => {
214 const compile = this.cachedCompiler(compilation);
215 params.normalModuleFactory.plugin('before-resolve', (result, callback) => {
216 this.runCompile(compile, result, callback);
217 });
218 });
219 }
220 }
221
222}
223
224_defineProperty(RelayCompilerWebpackPlugin, "getHooks", _getRelayCompilerPluginHooks.default);
225
226module.exports = RelayCompilerWebpackPlugin;
\No newline at end of file