Fixes #225 - Marko v3: Migrate <cached-fragment>

This commit is contained in:
Patrick Steele-Idem 2016-02-12 16:20:15 -07:00
parent e8e4ef332d
commit 763b8b7c70
12 changed files with 177 additions and 15 deletions

View File

@ -145,6 +145,7 @@ taglibLookup.registerTaglib(require.resolve('../taglibs/core/marko.json'));
taglibLookup.registerTaglib(require.resolve('../taglibs/layout/marko.json'));
taglibLookup.registerTaglib(require.resolve('../taglibs/html/marko.json'));
taglibLookup.registerTaglib(require.resolve('../taglibs/async/marko.json'));
taglibLookup.registerTaglib(require.resolve('../taglibs/cache/marko.json'));

View File

@ -0,0 +1,9 @@
var defaultCacheManagerPath = require.resolve('./default-cache-manager');
module.exports = function(el, context) {
if (!el.hasAttribute('cache-manager')) {
var requirePath = context.getRequirePath(defaultCacheManagerPath);
var defaultCacheManagerVar = context.importModule('__defaultCacheManager', requirePath);
el.setAttributeValue('cache-manager', defaultCacheManagerVar);
}
};

49
taglibs/cache/cached-fragment-tag.js vendored Normal file
View File

@ -0,0 +1,49 @@
/*
* Copyright 2011 eBay Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
module.exports = {
render: function (input, out) {
var cacheKey = input.cacheKey;
if (!cacheKey) {
throw new Error('cache-key is required for <cached-fragment>');
}
var cacheManager = input.cacheManager;
var cache = cacheManager.getCache(input.cacheName || 'marko/cached-fragment');
var asyncOut = out.beginAsync();
cache.get(cacheKey,
{
builder: function(callback) {
var result = out.captureString(function () {
if (input.renderBody) {
input.renderBody(out);
}
});
callback(null, result);
}
}, function(err, result) {
if (err) {
return asyncOut.error(err);
}
asyncOut.end(result);
});
}
};

37
taglibs/cache/default-cache-manager.js vendored Normal file
View File

@ -0,0 +1,37 @@
var caches = {};
function createCache() {
var cache = {};
return {
get: function(cacheKey, options, callback) {
var value = cache[cacheKey];
if (value !== undefined) {
return callback(null, value);
}
var builder = options.builder;
builder(function(err, value) {
if (err) {
return callback(err);
}
if (value === undefined) {
value = null;
}
cache[cacheKey] = value;
callback(null, value);
});
}
};
}
var defaultCacheManager = {
getCache: function(cacheName) {
return caches[cacheName] || (caches[cacheName] = createCache());
}
};
module.exports = defaultCacheManager;

9
taglibs/cache/marko.json vendored Normal file
View File

@ -0,0 +1,9 @@
{
"<cached-fragment>": {
"renderer": "./cached-fragment-tag",
"@cache-key": "string",
"@cache-name": "string",
"@cache-manager": "string",
"transformer": "./cached-fragment-tag-transformer.js"
}
}

View File

@ -0,0 +1 @@
myCacheManager:Count: 0Count: 0myCacheManager:Count: 1myCacheManager:Count: 2Count: 2myCacheManager:Count: 3

View File

@ -0,0 +1,15 @@
<var count=0/>
<macro foo(cacheName, cacheKey)>
<cached-fragment cache-key=cacheKey cache-name=cacheName cache-manager=data.myCacheManager>
Count: ${count++}
</cached-fragment>
</macro>
<foo('cacheA', 'keyA')/>
<foo('cacheA', 'keyA')/>
<foo('cacheA', 'keyB')/>
<foo('cacheB', 'keyA')/>
<foo('cacheB', 'keyA')/>
<foo('cacheB', 'keyB')/>

View File

@ -0,0 +1,41 @@
var caches = {};
function createCache() {
var cache = {};
return {
get: function(cacheKey, options, callback) {
setTimeout(function() {
var value = cache[cacheKey];
if (value !== undefined) {
return callback(null, value);
}
var builder = options.builder;
builder(function(err, value) {
if (err) {
return callback(err);
}
if (value === undefined) {
value = null;
}
cache[cacheKey] = value;
callback(null, 'myCacheManager:' + value);
});
}, 10);
}
};
}
var myCacheManager = {
getCache: function(cacheName) {
return caches[cacheName] || (caches[cacheName] = createCache());
}
};
exports.templateData = {
myCacheManager: myCacheManager
};

View File

@ -0,0 +1,15 @@
<var count=0/>
<macro foo(cacheName, cacheKey)>
<cached-fragment cache-key=cacheKey cache-name=cacheName>
Count: ${count++}
</cached-fragment>
</macro>
<foo('cacheA', 'keyA')/>
<foo('cacheA', 'keyA')/>
<foo('cacheA', 'keyB')/>
<foo('cacheB', 'keyA')/>
<foo('cacheB', 'keyA')/>
<foo('cacheB', 'keyB')/>

View File

@ -1,15 +0,0 @@
<var name="count" value="0"/>
<def function="foo(cacheName, cacheKey)">
<cached-fragment cache-key="$cacheKey" cache-name="$cacheName">
Count: ${count++}
</cached-fragment>
</def>
<invoke function="foo('cacheA', 'keyA')"/>
<invoke function="foo('cacheA', 'keyA')"/>
<invoke function="foo('cacheA', 'keyB')"/>
<invoke function="foo('cacheB', 'keyA')"/>
<invoke function="foo('cacheB', 'keyA')"/>
<invoke function="foo('cacheB', 'keyB')"/>