You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.3 KiB
80 lines
2.3 KiB
define(["dojo/regexp"], function(dojoRegExp) { |
|
return { |
|
start:function( |
|
id, |
|
referenceModule, |
|
bc |
|
) { |
|
var |
|
getHasPluginDependency = function(){ |
|
var hasPlugin = bc.amdResources["dojo/has"]; |
|
if(!hasPlugin){ |
|
bc.log("dojoHasMissingPlugin"); |
|
return []; |
|
}else{ |
|
return [hasPlugin]; |
|
} |
|
}, |
|
|
|
has = function(featureId) { |
|
var value = bc.staticHasFeatures[featureId]; |
|
return (value===undefined || value==-1) ? undefined : value; |
|
}, |
|
|
|
tokens = id.match(/[\?:]|[^:\?]*/g), |
|
|
|
i = 0, |
|
|
|
get = function(skip){ |
|
var operator, term = tokens[i++]; |
|
if(term == ":"){ |
|
// empty string module name; therefore, no dependency |
|
return ""; |
|
}else{ |
|
// postfixed with a ? means it is a feature to branch on, the term is the name of the feature |
|
if(tokens[i++] == "?"){ |
|
var hasResult = has(term); |
|
if(hasResult===undefined){ |
|
return undefined; |
|
}else if(!skip && hasResult){ |
|
// matched the feature, get the first value from the options |
|
return get(); |
|
}else{ |
|
// did not match, get the second value, passing over the first |
|
get(true); |
|
return get(skip); |
|
} |
|
} |
|
// a module |
|
return term===undefined ? "" : term; |
|
} |
|
}, |
|
|
|
resolvedId = get(); |
|
|
|
// we only need the plugin if we need to resolve at run time |
|
if(resolvedId===undefined){ |
|
bc.log("dojoHasUnresolvedMid", ["plugin resource id", id, "reference module id", referenceModule && referenceModule.mid]); |
|
return getHasPluginDependency(); |
|
} |
|
|
|
var regex = new RegExp("((dojo\\/)|([./]+))has\\!" + dojoRegExp.escapeString(id)); |
|
if(!resolvedId){ |
|
// replace the unneeded module with a module that's guaranteed available |
|
// this keeps the module order, and therefore, argument order to the factory correct |
|
referenceModule.text = referenceModule.text.replace(regex, "require"); |
|
return []; |
|
}else{ |
|
var |
|
module = bc.getAmdModule(resolvedId, referenceModule); |
|
if(module){ |
|
referenceModule.text = referenceModule.text.replace(regex, resolvedId); |
|
return [module]; |
|
}else{ |
|
bc.log("dojoHasMissingMid", ["plugin resource id", id, "resolved plugin resource id", moduleInfo.mid, "reference module id", referenceModule && referenceModule.mid]); |
|
return getHasPluginDependency(); |
|
} |
|
} |
|
} |
|
}; |
|
});
|
|
|