1 | "use strict";
|
2 |
|
3 | var _relayCompiler = require("relay-compiler");
|
4 |
|
5 | var _RelayLanguagePluginJavaScript = _interopRequireDefault(require("relay-compiler/lib/language/javascript/RelayLanguagePluginJavaScript"));
|
6 |
|
7 | var _RelaySourceModuleParser = _interopRequireDefault(require("relay-compiler/lib/core/RelaySourceModuleParser"));
|
8 |
|
9 | var _fs = _interopRequireDefault(require("fs"));
|
10 |
|
11 | var _path = _interopRequireDefault(require("path"));
|
12 |
|
13 | var _getSchemaSource = _interopRequireDefault(require("./getSchemaSource"));
|
14 |
|
15 | var _getWriter = _interopRequireDefault(require("./getWriter"));
|
16 |
|
17 | var _getFilepathsFromGlob = _interopRequireDefault(require("./getFilepathsFromGlob"));
|
18 |
|
19 | var _getRelayCompilerPluginHooks = _interopRequireDefault(require("./getRelayCompilerPluginHooks"));
|
20 |
|
21 | var _createRaiseErrorsReporter = _interopRequireDefault(require("./createRaiseErrorsReporter"));
|
22 |
|
23 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
24 |
|
25 | function 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 |
|
27 | function _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 |
|
29 | function _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 |
|
31 | const {
|
32 | schemaExtensions
|
33 | } = _relayCompiler.IRTransforms;
|
34 |
|
35 | function 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 |
|
72 | class 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;
|
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);
|
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 |
|
226 | module.exports = RelayCompilerWebpackPlugin; |
\ | No newline at end of file |