Fixes #606 - named single-file component doesn't work

This commit is contained in:
Patrick Steele-Idem 2017-03-07 12:07:41 -07:00
parent 3e9b0d000e
commit 80628146ad
6 changed files with 78 additions and 60 deletions

View File

@ -1,15 +1,15 @@
'use strict'; 'use strict';
var nodePath = require('path'); const nodePath = require('path');
var fs = require('fs'); const fs = require('fs');
var stripJsonComments = require('strip-json-comments'); const stripJsonComments = require('strip-json-comments');
var tagDefFromCode = require('./tag-def-from-code'); const tagDefFromCode = require('./tag-def-from-code');
var loaders = require('./loaders'); const loaders = require('./loaders');
var fsReadOptions = { encoding: 'utf8' }; const fsReadOptions = { encoding: 'utf8' };
var extend = require('raptor-util/extend'); const extend = require('raptor-util/extend');
var types = require('./types'); const types = require('./types');
var tagFileTypes = [ const tagFileTypes = [
'template', 'template',
'renderer', 'renderer',
'transformer', 'transformer',
@ -17,7 +17,7 @@ var tagFileTypes = [
'node-factory', 'node-factory',
]; ];
var searchFiles = [ const searchFiles = [
{ name:'index.marko', type:'template' }, { name:'index.marko', type:'template' },
{ name:'renderer', type:'renderer' }, { name:'renderer', type:'renderer' },
{ name:'index', type:'renderer' }, { name:'index', type:'renderer' },
@ -41,13 +41,13 @@ function createDefaultTagDef() {
} }
function getFileMap(dirname) { function getFileMap(dirname) {
var fileMap = {}; let fileMap = {};
var files = fs.readdirSync(dirname); let files = fs.readdirSync(dirname);
files.forEach(file => { files.forEach(file => {
var extName = nodePath.extname(file); let extName = nodePath.extname(file);
var baseName = file.slice(0, -1*extName.length); let baseName = file.slice(0, -1*extName.length);
var fullPath = nodePath.join(dirname, file); let fullPath = nodePath.join(dirname, file);
fileMap[baseName] = fileMap[baseName] || {}; fileMap[baseName] = fileMap[baseName] || {};
fileMap[baseName][extName] = fullPath; fileMap[baseName][extName] = fullPath;
fileMap[file] = fileMap[file] || {}; fileMap[file] = fileMap[file] || {};
@ -58,7 +58,7 @@ function getFileMap(dirname) {
} }
function getPath(filename, fileMap) { function getPath(filename, fileMap) {
var file = fileMap[filename]; let file = fileMap[filename];
if(!file) return; if(!file) return;
if(file.__path) return file.__path; if(file.__path) return file.__path;
@ -72,12 +72,12 @@ function findAndSetFile(tagDef, tagDirname) {
return; return;
} }
var fileMap = getFileMap(tagDirname); let fileMap = getFileMap(tagDirname);
for(var i = 0; i < searchFiles.length; i++) { for(let i = 0; i < searchFiles.length; i++) {
var name = searchFiles[i].name; let name = searchFiles[i].name;
var type = searchFiles[i].type; let type = searchFiles[i].type;
var path = getPath(name, fileMap); let path = getPath(name, fileMap);
if(path) { if(path) {
tagDef[type] = path; tagDef[type] = path;
@ -87,7 +87,7 @@ function findAndSetFile(tagDef, tagDirname) {
} }
function hasFile(tagDef) { function hasFile(tagDef) {
for(var i = 0; i < tagFileTypes.length; i++) { for(let i = 0; i < tagFileTypes.length; i++) {
if(tagDef[tagFileTypes[i]]) return true; if(tagDef[tagFileTypes[i]]) return true;
} }
return false; return false;
@ -100,7 +100,7 @@ function hasFile(tagDef) {
* @param {String} taglib the taglib that is being loaded * @param {String} taglib the taglib that is being loaded
*/ */
module.exports = function scanTagsDir(tagsConfigPath, tagsConfigDirname, dir, taglib, dependencyChain) { module.exports = function scanTagsDir(tagsConfigPath, tagsConfigDirname, dir, taglib, dependencyChain) {
var prefix; let prefix;
if (typeof dir === 'object') { if (typeof dir === 'object') {
prefix = dir.prefix; prefix = dir.prefix;
@ -113,53 +113,66 @@ module.exports = function scanTagsDir(tagsConfigPath, tagsConfigDirname, dir, ta
} }
dir = nodePath.resolve(tagsConfigDirname, dir); dir = nodePath.resolve(tagsConfigDirname, dir);
var children = fs.readdirSync(dir); let children = fs.readdirSync(dir);
var rendererJSFile; let rendererJSFile;
for (var i=0, len=children.length; i<len; i++) { for (let i=0, len=children.length; i<len; i++) {
rendererJSFile = null; rendererJSFile = null;
var childFilename = children[i]; let childFilename = children[i];
if (childFilename === 'node_modules') { if (childFilename === 'node_modules') {
continue; continue;
} }
var tagName = prefix + childFilename; let tagName;
var tagDirname = nodePath.join(dir, childFilename); let tagDef = null;
var tagJsonPath = nodePath.join(tagDirname, 'marko-tag.json'); let tagDirname;
var tagDef = null; let tagJsonPath;
var hasTagJson = false; let ext = nodePath.extname(childFilename);
if (fs.existsSync(tagJsonPath)) { if (ext === '.marko') {
hasTagJson = true; tagName = childFilename.slice(0, 0 - ext.length);
// marko-tag.json exists in the directory, use that as the tag definition tagDirname = dir;
try {
tagDef = JSON.parse(stripJsonComments(fs.readFileSync(tagJsonPath, fsReadOptions)));
} catch(e) {
throw new Error('Unable to parse JSON file at path "' + tagJsonPath + '". Error: ' + e);
}
} else {
tagJsonPath = null;
tagDef = createDefaultTagDef(); tagDef = createDefaultTagDef();
} tagDef.template = nodePath.join(dir, childFilename);
} else {
tagName = prefix + childFilename;
if (!hasFile(tagDef)) { tagDirname = nodePath.join(dir, childFilename);
var fileWasSet = findAndSetFile(tagDef, tagDirname); tagJsonPath = nodePath.join(tagDirname, 'marko-tag.json');
if(!fileWasSet) {
if (hasTagJson) { let hasTagJson = false;
throw new Error('Invalid tag file: ' + tagJsonPath + '. Neither a renderer or a template was found for tag. ' + JSON.stringify(tagDef, null, 2)); if (fs.existsSync(tagJsonPath)) {
} else { hasTagJson = true;
// Skip this directory... there doesn't appear to be anything in it // marko-tag.json exists in the directory, use that as the tag definition
continue; try {
tagDef = JSON.parse(stripJsonComments(fs.readFileSync(tagJsonPath, fsReadOptions)));
} catch(e) {
throw new Error('Unable to parse JSON file at path "' + tagJsonPath + '". Error: ' + e);
}
} else {
tagJsonPath = null;
tagDef = createDefaultTagDef();
}
if (!hasFile(tagDef)) {
let fileWasSet = findAndSetFile(tagDef, tagDirname);
if(!fileWasSet) {
if (hasTagJson) {
throw new Error('Invalid tag file: ' + tagJsonPath + '. Neither a renderer or a template was found for tag. ' + JSON.stringify(tagDef, null, 2));
} else {
// Skip this directory... there doesn't appear to be anything in it
continue;
}
} }
} }
}
if (!hasTagJson && (tagDef.renderer || tagDef.template)) { if (!hasTagJson && (tagDef.renderer || tagDef.template)) {
let templateCode = fs.readFileSync(tagDef.renderer || tagDef.template, fsReadOptions); let templateCode = fs.readFileSync(tagDef.renderer || tagDef.template, fsReadOptions);
let extractedTagDef = tagDefFromCode.extractTagDef(templateCode); let extractedTagDef = tagDefFromCode.extractTagDef(templateCode);
if (extractedTagDef) { if (extractedTagDef) {
extend(tagDef, extractedTagDef); extend(tagDef, extractedTagDef);
}
} }
} }
@ -171,10 +184,9 @@ module.exports = function scanTagsDir(tagsConfigPath, tagsConfigDirname, dir, ta
tagDependencyChain = dependencyChain.append(tagDirname); tagDependencyChain = dependencyChain.append(tagDirname);
} }
let tag = new types.Tag(tagJsonPath || tagDirname);
var tag = new types.Tag(tagJsonPath || tagDirname);
loaders.loadTagFromProps(tag, tagDef, tagDependencyChain); loaders.loadTagFromProps(tag, tagDef, tagDependencyChain);
tag.name = tag.name || tagName; tag.name = tag.name || tagName;
taglib.addTag(tag); taglib.addTag(tag);
} }
}; };

View File

@ -0,0 +1 @@
<div>Bye ${input.name}!</div>

View File

@ -0,0 +1 @@
<div>Hello ${input.name}!</div>

View File

@ -0,0 +1 @@
<div>Hello Frank!</div><div>Bye Frank!</div>

View File

@ -0,0 +1,2 @@
<hello name="Frank"/>
<bye name="Frank"/>

View File

@ -0,0 +1 @@
exports.templateData = {};