1 | 'use strict';
|
2 |
|
3 | const path = require('path');
|
4 | const fs = require('fs');
|
5 | const EventEmitter = require('events').EventEmitter;
|
6 | const requestHandler = require('./lib/request-handler');
|
7 | const fetchTemplate = require('./lib/fetch-template');
|
8 | const parseTemplate = require('./lib/parse-template');
|
9 | const requestFragment = require('./lib/request-fragment');
|
10 | const filterHeadersFn = require('./lib/filter-headers');
|
11 | const PIPE_DEFINITION = fs.readFileSync(path.resolve(__dirname, 'src/pipe.min.js'));
|
12 | const AMD_LOADER_URL = 'https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.min.js';
|
13 |
|
14 |
|
15 | const stripUrl = (fileUrl) => path.normalize(fileUrl.replace('file://', ''));
|
16 | const getPipeAttributes = (attributes) => {
|
17 | const { primary, id } = attributes;
|
18 | return {
|
19 | primary: !!(primary || primary === ''),
|
20 | id
|
21 | };
|
22 | };
|
23 |
|
24 | module.exports = class Tailor extends EventEmitter {
|
25 |
|
26 | constructor (options) {
|
27 | super();
|
28 | const { amdLoaderUrl = AMD_LOADER_URL, templatesPath, filterHeaders = filterHeadersFn } = options;
|
29 | let memoizedDefinition;
|
30 | const pipeChunk = (amdLoaderUrl, pipeInstanceName) => {
|
31 | if (!memoizedDefinition) {
|
32 |
|
33 | if (amdLoaderUrl.startsWith('file://')) {
|
34 | let fileData = fs.readFileSync(stripUrl(amdLoaderUrl), 'utf-8');
|
35 | memoizedDefinition = `<script>${fileData}\n`;
|
36 | } else {
|
37 | memoizedDefinition = `<script src="${amdLoaderUrl}"></script>\n<script>`;
|
38 | }
|
39 | }
|
40 | return new Buffer(`${memoizedDefinition}var ${pipeInstanceName}=${PIPE_DEFINITION}</script>\n`);
|
41 | };
|
42 |
|
43 | const requestOptions = Object.assign({
|
44 | fetchContext: () => Promise.resolve({}),
|
45 | fetchTemplate: fetchTemplate(
|
46 | templatesPath ||
|
47 | path.join(process.cwd(), 'templates')
|
48 | ),
|
49 | fragmentTag: 'fragment',
|
50 | handledTags: [],
|
51 | handleTag: () => '',
|
52 | requestFragment: requestFragment(filterHeaders),
|
53 | pipeInstanceName: 'Pipe',
|
54 | pipeDefinition: pipeChunk.bind(null, amdLoaderUrl),
|
55 | pipeAttributes: getPipeAttributes
|
56 | }, options);
|
57 |
|
58 | requestOptions.parseTemplate = parseTemplate(
|
59 | [requestOptions.fragmentTag].concat(requestOptions.handledTags),
|
60 | ['script', requestOptions.fragmentTag]
|
61 | );
|
62 |
|
63 | this.requestHandler = requestHandler.bind(this, requestOptions);
|
64 |
|
65 | this.on('error', () => {});
|
66 | }
|
67 |
|
68 | };
|