UNPKG

2.71 kBJavaScriptView Raw
1'use strict';
2
3const path = require('path');
4const fs = require('fs');
5const EventEmitter = require('events').EventEmitter;
6const requestHandler = require('./lib/request-handler');
7const fetchTemplate = require('./lib/fetch-template');
8const parseTemplate = require('./lib/parse-template');
9const requestFragment = require('./lib/request-fragment');
10const filterHeadersFn = require('./lib/filter-headers');
11const PIPE_DEFINITION = fs.readFileSync(path.resolve(__dirname, 'src/pipe.min.js'));
12const AMD_LOADER_URL = 'https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.min.js';
13
14
15const stripUrl = (fileUrl) => path.normalize(fileUrl.replace('file://', ''));
16const getPipeAttributes = (attributes) => {
17 const { primary, id } = attributes;
18 return {
19 primary: !!(primary || primary === ''),
20 id
21 };
22};
23
24module.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 // Allow reading from fs for inlining AMD
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 // To Prevent from exiting the process - https://nodejs.org/api/events.html#events_error_events
65 this.on('error', () => {});
66 }
67
68};