Skip to content
This repository was archived by the owner on May 7, 2024. It is now read-only.

Commit 925618b

Browse files
committed
Add dist/ folder to repository
1 parent 4aa603e commit 925618b

File tree

5 files changed

+185
-4
lines changed

5 files changed

+185
-4
lines changed

.gitignore

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
.idea
22
.nyc_output
3-
dist
43
coverage
54
node_modules
65
package-lock.json
7-
tmp
6+
tmp

dist/index.js

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
const loader_utils_1 = require("loader-utils");
4+
const twing_1 = require("twing");
5+
const visitor_1 = require("./visitor");
6+
const sha256 = require('crypto-js/sha256');
7+
const hex = require('crypto-js/enc-hex');
8+
const slash = require('slash');
9+
const validateOptions = require('schema-utils');
10+
const optionsSchema = {
11+
type: 'object',
12+
properties: {
13+
environmentModulePath: {
14+
type: 'string'
15+
},
16+
renderContext: {
17+
type: 'object'
18+
}
19+
},
20+
required: [
21+
'environmentModulePath'
22+
],
23+
additionalProperties: false
24+
};
25+
class PathSupportingArrayLoader extends twing_1.TwingLoaderArray {
26+
getSourceContext(name, from) {
27+
return super.getSourceContext(name, from).then((source) => {
28+
return new twing_1.TwingSource(source.getCode(), source.getName(), name);
29+
});
30+
}
31+
}
32+
async function default_1(source) {
33+
const callback = this.async();
34+
const getTemplateHash = (name) => {
35+
return this.mode !== 'production' ? name : hex.stringify(sha256(name));
36+
};
37+
const options = loader_utils_1.getOptions(this);
38+
validateOptions(optionsSchema, options, 'Twing loader');
39+
let resourcePath = slash(this.resourcePath);
40+
let environmentModulePath = options.environmentModulePath;
41+
let renderContext = options.renderContext;
42+
this.addDependency(slash(environmentModulePath));
43+
// require takes module name separated with forward slashes
44+
let environment = require(slash(environmentModulePath));
45+
let loader = environment.getLoader();
46+
if (renderContext === undefined) {
47+
let parts = [
48+
`const env = require('${slash(environmentModulePath)}');`
49+
];
50+
let key = getTemplateHash(resourcePath);
51+
let sourceContext = new twing_1.TwingSource(source, `${key}`);
52+
let tokenStream;
53+
let nodeModule;
54+
try {
55+
tokenStream = environment.tokenize(sourceContext);
56+
nodeModule = environment.parse(tokenStream);
57+
}
58+
catch (err) {
59+
callback(err);
60+
return null;
61+
}
62+
let visitor = new visitor_1.Visitor(loader, resourcePath, getTemplateHash);
63+
await visitor.visit(nodeModule);
64+
let precompiledTemplate = environment.compile(nodeModule);
65+
parts.push(`let templatesModule = (() => {
66+
let module = {
67+
exports: undefined
68+
};
69+
70+
${precompiledTemplate}
71+
72+
return module.exports;
73+
})();
74+
`);
75+
for (let foundTemplateName of visitor.foundTemplateNames) {
76+
// require takes module name separated with forward slashes
77+
parts.push(`require('${slash(foundTemplateName)}');`);
78+
}
79+
parts.push(`env.registerTemplatesModule(templatesModule, '${key}');`);
80+
parts.push(`
81+
let loadTemplate = () => env.loadTemplate('${key}');
82+
83+
module.exports = (context = {}) => {
84+
return loadTemplate().then((template) => template.render(context));
85+
};`);
86+
callback(null, parts.join('\n'));
87+
}
88+
else {
89+
environment.setLoader(new twing_1.TwingLoaderChain([
90+
new PathSupportingArrayLoader(new Map([
91+
[resourcePath, source]
92+
])),
93+
loader
94+
]));
95+
environment.on('template', (name, from) => {
96+
environment.getLoader().resolve(name, from)
97+
.then((path) => this.addDependency(path))
98+
.catch((e) => { });
99+
});
100+
callback(null, `module.exports = ${JSON.stringify(await environment.render(resourcePath, renderContext))};`);
101+
}
102+
}
103+
exports.default = default_1;
104+
;

dist/visitor.js

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
exports.Visitor = void 0;
4+
const twing_1 = require("twing");
5+
const fs_1 = require("fs");
6+
const slash = require('slash');
7+
class Visitor {
8+
constructor(loader, from, getTemplateHash) {
9+
this._loader = loader;
10+
this._from = new twing_1.TwingSource('', from, from);
11+
this._getTemplateHash = getTemplateHash;
12+
this._foundTemplateNames = [];
13+
}
14+
get foundTemplateNames() {
15+
return this._foundTemplateNames;
16+
}
17+
async visit(node) {
18+
const processExpressionNode = async (node) => {
19+
if (node.type === null) {
20+
return;
21+
}
22+
const pushValue = async (value) => {
23+
if (await this._loader.exists(value, this._from)) {
24+
value = await this._loader.resolve(value, this._from);
25+
if (fs_1.existsSync(value)) {
26+
if (!this._foundTemplateNames.includes(value)) {
27+
this._foundTemplateNames.push(value);
28+
}
29+
value = this._getTemplateHash(slash(value));
30+
}
31+
}
32+
return value;
33+
};
34+
if (node.type.toString() === 'expression_array') {
35+
for (let [index, constantNode] of node.getNodes()) {
36+
if (index % 2) {
37+
await processExpressionNode(constantNode);
38+
}
39+
}
40+
}
41+
if (node.type.toString() === 'expression_conditional') {
42+
let expr2 = node.getNode('expr2');
43+
let expr3 = node.getNode('expr3');
44+
await processExpressionNode(expr2);
45+
await processExpressionNode(expr3);
46+
}
47+
if (node.type.toString() === 'expression_constant') {
48+
node.setAttribute('value', await pushValue(node.getAttribute('value')));
49+
}
50+
};
51+
if (node.type !== null) {
52+
// include function
53+
if ((node.type.toString() === 'expression_function') && (node.getAttribute('name') === 'include')) {
54+
await processExpressionNode(node.getNode('arguments').getNode(0));
55+
}
56+
// import and include tags
57+
if ((node.type.toString() === 'import') || (node.type.toString() === 'include')) {
58+
if (node.hasNode('expr')) {
59+
await processExpressionNode(node.getNode('expr'));
60+
}
61+
}
62+
// extends and embed tags
63+
if ((node.type.toString() === 'module')) {
64+
if (node.hasNode('parent')) {
65+
await processExpressionNode(node.getNode('parent'));
66+
}
67+
for (let embeddedTemplate of node.getAttribute('embedded_templates')) {
68+
await this.visit(embeddedTemplate);
69+
}
70+
}
71+
}
72+
for (let [key, subNode] of node.getNodes()) {
73+
await this.visit(subNode);
74+
}
75+
}
76+
;
77+
}
78+
exports.Visitor = Visitor;

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"test:integration": "npm run build && ts-node node_modules/tape/bin/tape 'test/integration/**/test.ts' | tap-bail | tap-spec",
1111
"cover": "rimraf .nyc_output coverage && nyc npm run test:unit",
1212
"coverage": "nyc report --reporter=text-lcov | coveralls",
13-
"prepare": "npm run build"
13+
"prepublishOnly": "npm run build"
1414
},
1515
"files": [
1616
"dist/",

src/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class PathSupportingArrayLoader extends TwingLoaderArray {
3939
}
4040
}
4141

42-
export default async function (this: loader.LoaderContext, source: string) {
42+
export default async function (this:loader.LoaderContext, source: string):Promise<string | Buffer | void | undefined> {
4343
const callback = this.async();
4444

4545
const getTemplateHash = (name: string) => {

0 commit comments

Comments
 (0)