Allow source processors to be registered for .js files.

We now fall back to hardcoded JS support only when no source processor is
registered, instead of simply ignoring .js source processors.
This commit is contained in:
Ben Newman
2015-07-13 14:48:19 -04:00
parent 181f7c1c93
commit 5bbcaedc01
3 changed files with 48 additions and 38 deletions

View File

@@ -60,8 +60,11 @@ _.extend(exports.SourceProcessor.prototype, {
// Represents a set of SourceProcessors available in a given package. They may
// not have conflicting extensions or filenames.
export class SourceProcessorSet {
constructor(myPackageDisplayName,
{ hardcodeJs, singlePackage, allowConflicts }) {
constructor(myPackageDisplayName, {
hardcodeJs,
singlePackage,
allowConflicts,
} = {}) {
// For error messages only.
this._myPackageDisplayName = myPackageDisplayName;
// If this represents the SourceProcessors *registered* by a single package
@@ -206,13 +209,6 @@ export class SourceProcessorSet {
// don't use iteration functions, so we can return (and start at #1)
for (let i = 1; i < parts.length; i++) {
const extension = parts.slice(i).join('.');
// We specially handle 'js' in the build tool, because you can't provide a
// plugin to handle 'js' files, because the plugin would need to be built
// with JavaScript itself! Places that hardcode JS are tagged with
// #HardcodeJs.
if (this._hardcodeJs && extension === 'js') {
return new SourceClassification('extension', {extension});
}
if (this._byExtension.hasOwnProperty(extension)) {
return new SourceClassification('extension', {
@@ -222,6 +218,13 @@ export class SourceProcessorSet {
});
}
if (this._hardcodeJs && extension === 'js') {
// If there is no special sourceProcessor for handling a .js file,
// we can still classify it as extension/js, only without any
// source processors. #HardcodeJs
return new SourceClassification('extension', {extension});
}
if (this._legacyHandlers.hasOwnProperty(extension)) {
const legacy = this._legacyHandlers[extension];
if (legacy.archMatching &&
@@ -251,17 +254,28 @@ export class SourceProcessorSet {
appReadDirectoryOptions(arch) {
const include = [];
const names = [];
let addedJs = false;
function addExtension(ext) {
include.push(new RegExp('\\.' + utils.quotemeta(ext) + '$'));
if (ext === 'js') {
addedJs = true;
}
}
_.each(this._byExtension, (sourceProcessors, ext) => {
if (sourceProcessors.some(sp => sp.relevantForArch(arch))) {
addExtension(ext);
}
});
Object.keys(this._legacyHandlers).forEach(addExtension);
this._hardcodeJs && addExtension('js');
if (this._hardcodeJs && ! addedJs) {
// If there is no sourceProcessor for handling .js files, we still
// want to make sure they get picked up when we're reading the
// contents of app directories. #HardcodeJs
addExtension('js');
}
_.each(this._byFilename, (sourceProcessors, filename) => {
if (sourceProcessors.some(sp => sp.relevantForArch(arch))) {

View File

@@ -264,29 +264,25 @@ var ResourceSlot = function (unibuildResourceInfo,
self.sourceProcessor = sourceProcessor;
self.packageSourceBatch = packageSourceBatch;
if (self.inputResource.type === "source" &&
self.inputResource.extension === "js") {
// #HardcodeJs
if (self.inputResource.type === "source") {
if (sourceProcessor) {
throw Error("sourceProcessor found for js source? " +
JSON.stringify(unibuildResourceInfo));
}
self.addJavaScript({
// XXX it's a shame to keep converting between Buffer and string, but
// files.convertToStandardLineEndings only works on strings for now
data: self.inputResource.data.toString('utf8'),
path: self.inputResource.path,
hash: self.inputResource.hash,
bare: self.inputResource.fileOptions &&
(self.inputResource.fileOptions.bare ||
// XXX eventually get rid of backward-compatibility "raw" name
// XXX COMPAT WITH 0.6.4
self.inputResource.fileOptions.raw)
});
} else if (self.inputResource.type === "source") {
if (! sourceProcessor) {
throw Error("no sourceProcessor for source? " +
JSON.stringify(unibuildResourceInfo));
// If we have a sourceProcessor, it will handle the adding of the
// final processed JavaScript.
} else if (self.inputResource.extension === "js") {
// If there is no sourceProcessor for a .js file, add the source
// directly to the output. #HardcodeJs
self.addJavaScript({
// XXX it's a shame to keep converting between Buffer and string, but
// files.convertToStandardLineEndings only works on strings for now
data: self.inputResource.data.toString('utf8'),
path: self.inputResource.path,
hash: self.inputResource.hash,
bare: self.inputResource.fileOptions &&
(self.inputResource.fileOptions.bare ||
// XXX eventually get rid of backward-compatibility "raw" name
// XXX COMPAT WITH 0.6.4
self.inputResource.fileOptions.raw)
});
}
} else {
if (sourceProcessor) {
@@ -395,10 +391,7 @@ var PackageSourceBatch = function (unibuild, processor) {
let sourceProcessor = null;
if (resource.type === "source") {
var extension = resource.extension;
if (extension === 'js') {
// #HardcodeJs In this case, we just leave buildPlugin null; it is
// specially handled by ResourceSlot too.
} else if (extension === null) {
if (extension === null) {
const filename = files.pathBasename(resource.path);
sourceProcessor = sourceProcessorSet.getByFilename(filename);
if (! sourceProcessor) {
@@ -411,7 +404,9 @@ var PackageSourceBatch = function (unibuild, processor) {
}
} else {
sourceProcessor = sourceProcessorSet.getByExtension(extension);
if (! sourceProcessor) {
// If resource.extension === 'js', it's ok for there to be no
// sourceProcessor, since we #HardcodeJs in ResourceSlot.
if (! sourceProcessor && extension !== 'js') {
buildmessage.error(
`no plugin found for ${ resource.path } in ` +
`${ unibuild.pkg.displayName() }; a plugin for *.${ extension } ` +

View File

@@ -1149,7 +1149,8 @@ _.extend(Isopack.prototype, {
// If we're going to write a legacy prelink file later, track the
// original form of the resource object (with the source in a Buffer,
// etc) instead of the later version. #HardcodeJs
if (writeLegacyBuilds && resource.type === "source" &&
if (writeLegacyBuilds &&
resource.type === "source" &&
resource.extension == "js") {
jsResourcesForLegacyPrelink.push({
data: resource.data,