mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #606 - named single-file component doesn't work
This commit is contained in:
parent
3e9b0d000e
commit
80628146ad
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -0,0 +1 @@
|
|||||||
|
<div>Bye ${input.name}!</div>
|
||||||
@ -0,0 +1 @@
|
|||||||
|
<div>Hello ${input.name}!</div>
|
||||||
@ -0,0 +1 @@
|
|||||||
|
<div>Hello Frank!</div><div>Bye Frank!</div>
|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
<hello name="Frank"/>
|
||||||
|
<bye name="Frank"/>
|
||||||
1
test/autotests/render/custom-tag-components-file/test.js
Normal file
1
test/autotests/render/custom-tag-components-file/test.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
exports.templateData = {};
|
||||||
Loading…
x
Reference in New Issue
Block a user