UNPKG

2.91 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 filterReqHeadersFn = 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
14const stripUrl = (fileUrl) => path.normalize(fileUrl.replace('file://', ''));
15const getPipeAttributes = (attributes) => {
16 const { primary, id } = attributes;
17 return {
18 primary: !!(primary || primary === ''),
19 id
20 };
21};
22
23module.exports = class Tailor extends EventEmitter {
24
25 constructor (options) {
26 super();
27 const {
28 amdLoaderUrl = AMD_LOADER_URL,
29 filterRequestHeaders = options.filterHeaders || filterReqHeadersFn,
30 maxAssetLinks,
31 templatesPath,
32 } = options;
33
34 options.maxAssetLinks = isNaN(maxAssetLinks) ? 1 : Math.max(1, maxAssetLinks);
35
36 let memoizedDefinition;
37 const pipeChunk = (amdLoaderUrl, pipeInstanceName) => {
38 if (!memoizedDefinition) {
39 // Allow reading from fs for inlining AMD
40 if (amdLoaderUrl.startsWith('file://')) {
41 let fileData = fs.readFileSync(stripUrl(amdLoaderUrl), 'utf-8');
42 memoizedDefinition = `<script>${fileData}\n`;
43 } else {
44 memoizedDefinition = `<script src="${amdLoaderUrl}"></script>\n<script>`;
45 }
46 }
47 return Buffer.from(`${memoizedDefinition}var ${pipeInstanceName}=${PIPE_DEFINITION}</script>\n`);
48 };
49
50 const requestOptions = Object.assign({
51 fetchContext: () => Promise.resolve({}),
52 fetchTemplate: fetchTemplate(
53 templatesPath ||
54 path.join(process.cwd(), 'templates')
55 ),
56 fragmentTag: 'fragment',
57 handledTags: [],
58 handleTag: () => '',
59 requestFragment: requestFragment(filterRequestHeaders),
60 pipeInstanceName: 'Pipe',
61 pipeDefinition: pipeChunk.bind(null, amdLoaderUrl),
62 pipeAttributes: getPipeAttributes
63 }, options);
64
65 requestOptions.parseTemplate = parseTemplate(
66 [requestOptions.fragmentTag].concat(requestOptions.handledTags),
67 ['script', requestOptions.fragmentTag]
68 );
69
70 this.requestHandler = requestHandler.bind(this, requestOptions);
71 // To Prevent from exiting the process - https://nodejs.org/api/events.html#events_error_events
72 this.on('error', () => {});
73 }
74
75};