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 filterReqHeadersFn = 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 | const stripUrl = (fileUrl) => path.normalize(fileUrl.replace('file://', ''));
|
15 | const getPipeAttributes = (attributes) => {
|
16 | const { primary, id } = attributes;
|
17 | return {
|
18 | primary: !!(primary || primary === ''),
|
19 | id
|
20 | };
|
21 | };
|
22 |
|
23 | module.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 |
|
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 |
|
72 | this.on('error', () => {});
|
73 | }
|
74 |
|
75 | };
|