Skip to content

Commit

Permalink
Add browser and module field support to package.json processing
Browse files Browse the repository at this point in the history
Closes #2598

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=164176438
  • Loading branch information
anmonteiro authored and dimvar committed Aug 3, 2017
1 parent 6d796c4 commit 51fe34e
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 11 deletions.
18 changes: 18 additions & 0 deletions src/com/google/javascript/jscomp/CompilerOptions.java
Expand Up @@ -1169,6 +1169,15 @@ public void setWrapGoogModulesForWhitespaceOnly(boolean enable) {
/** Which algorithm to use for locating ES6 and CommonJS modules */ /** Which algorithm to use for locating ES6 and CommonJS modules */
ModuleLoader.ResolutionMode moduleResolutionMode; ModuleLoader.ResolutionMode moduleResolutionMode;


/** Which entries to look for in package.json files when processing modules */
List<String> packageJsonEntryNames;

/**
* Needed by {@link RewriteJsonToModule}, but defined here because RewriteJsonToModule is not
* part of the core build.
*/
public static final String PACKAGE_JSON_MAIN = "main";

/** /**
* Should the compiler print its configuration options to stderr when they are initialized? * Should the compiler print its configuration options to stderr when they are initialized?
* *
Expand All @@ -1194,6 +1203,7 @@ public CompilerOptions() {


// Modules // Modules
moduleResolutionMode = ModuleLoader.ResolutionMode.BROWSER; moduleResolutionMode = ModuleLoader.ResolutionMode.BROWSER;
packageJsonEntryNames = ImmutableList.of(CompilerOptions.PACKAGE_JSON_MAIN);


// Checks // Checks
skipNonTranspilationPasses = false; skipNonTranspilationPasses = false;
Expand Down Expand Up @@ -2781,6 +2791,14 @@ public void setModuleResolutionMode(ModuleLoader.ResolutionMode mode) {
this.moduleResolutionMode = mode; this.moduleResolutionMode = mode;
} }


public List<String> getPackageJsonEntryNames() {
return this.packageJsonEntryNames;
}

public void setPackageJsonEntryNames(List<String> names) {
this.packageJsonEntryNames = names;
}

/** Serializes compiler options to a stream. */ /** Serializes compiler options to a stream. */
@GwtIncompatible("ObjectOutputStream") @GwtIncompatible("ObjectOutputStream")
public void serialize(OutputStream objectOutputStream) throws IOException { public void serialize(OutputStream objectOutputStream) throws IOException {
Expand Down
16 changes: 11 additions & 5 deletions src/com/google/javascript/jscomp/RewriteJsonToModule.java
Expand Up @@ -21,6 +21,7 @@
import com.google.javascript.rhino.IR; import com.google.javascript.rhino.IR;
import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Node;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;


/** /**
Expand All @@ -35,7 +36,6 @@ public class RewriteJsonToModule extends NodeTraversal.AbstractPostOrderCallback
implements CompilerPass { implements CompilerPass {
public static final DiagnosticType JSON_UNEXPECTED_TOKEN = public static final DiagnosticType JSON_UNEXPECTED_TOKEN =
DiagnosticType.error("JSC_JSON_UNEXPECTED_TOKEN", "Unexpected JSON token"); DiagnosticType.error("JSC_JSON_UNEXPECTED_TOKEN", "Unexpected JSON token");

private final Map<String, String> packageJsonMainEntries; private final Map<String, String> packageJsonMainEntries;
private final AbstractCompiler compiler; private final AbstractCompiler compiler;


Expand Down Expand Up @@ -136,10 +136,16 @@ private void visitScript(NodeTraversal t, Node n, Node parent) {


String inputPath = t.getInput().getSourceFile().getOriginalPath(); String inputPath = t.getInput().getSourceFile().getOriginalPath();
if (inputPath.endsWith("/package.json") && jsonObject.isObjectLit()) { if (inputPath.endsWith("/package.json") && jsonObject.isObjectLit()) {
Node main = NodeUtil.getFirstPropMatchingKey(jsonObject, "main"); List<String> possibleMainEntries = compiler.getOptions().getPackageJsonEntryNames();
if (main != null && main.isString()) {
String dirName = inputPath.substring(0, inputPath.length() - "package.json".length()); for (String entryName : possibleMainEntries) {
packageJsonMainEntries.put(inputPath, dirName + main.getString()); Node entry = NodeUtil.getFirstPropMatchingKey(jsonObject, entryName);

if (entry != null && entry.isString()) {
String dirName = inputPath.substring(0, inputPath.length() - "package.json".length());
packageJsonMainEntries.put(inputPath, dirName + entry.getString());
break;
}
} }
} }


Expand Down
34 changes: 28 additions & 6 deletions test/com/google/javascript/jscomp/RewriteJsonToModuleTest.java
Expand Up @@ -18,6 +18,7 @@


import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;


import com.google.common.collect.ImmutableList;
import com.google.javascript.jscomp.deps.ModuleLoader; import com.google.javascript.jscomp.deps.ModuleLoader;
import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Node;


Expand All @@ -40,6 +41,8 @@ protected CompilerOptions getOptions() {
// Trigger module processing after parsing. // Trigger module processing after parsing.
options.setProcessCommonJSModules(true); options.setProcessCommonJSModules(true);
options.setModuleResolutionMode(ModuleLoader.ResolutionMode.NODE); options.setModuleResolutionMode(ModuleLoader.ResolutionMode.NODE);
options.setPackageJsonEntryNames(
ImmutableList.of("browser", CompilerOptions.PACKAGE_JSON_MAIN));
return options; return options;
} }


Expand All @@ -50,18 +53,18 @@ protected int getNumRepetitions() {


public void testJsonFile() { public void testJsonFile() {
test( test(
srcs(SourceFile.fromCode("/test.json", "{ \"foo\": \"bar\"}")), srcs(SourceFile.fromCode("/test.json", "{ 'foo': 'bar'}")),
expected("goog.provide('module$test_json'); var module$test_json = { \"foo\": \"bar\"};")); expected("goog.provide('module$test_json'); var module$test_json = { 'foo': 'bar'};"));


assertEquals(0, getLastCompiler().getModuleLoader().getPackageJsonMainEntries().size()); assertEquals(0, getLastCompiler().getModuleLoader().getPackageJsonMainEntries().size());
} }


public void testPackageJsonFile() { public void testPackageJsonFile() {
test( test(
srcs(SourceFile.fromCode("/package.json", "{ \"main\": \"foo/bar/baz.js\"}")), srcs(SourceFile.fromCode("/package.json", "{ 'main': 'foo/bar/baz.js'}")),
expected(lines( expected(lines(
"goog.provide('module$package_json')", "goog.provide('module$package_json')",
"var module$package_json = {\"main\": \"foo/bar/baz.js\"};"))); "var module$package_json = {'main': 'foo/bar/baz.js'};")));


assertEquals(1, getLastCompiler().getModuleLoader().getPackageJsonMainEntries().size()); assertEquals(1, getLastCompiler().getModuleLoader().getPackageJsonMainEntries().size());
assert (getLastCompiler() assert (getLastCompiler()
Expand All @@ -74,11 +77,30 @@ public void testPackageJsonFile() {


public void testPackageJsonWithoutMain() { public void testPackageJsonWithoutMain() {
test( test(
srcs(SourceFile.fromCode("/package.json", "{\"other\": { \"main\": \"foo/bar/baz.js\"}}")), srcs(SourceFile.fromCode("/package.json", "{'other': { 'main': 'foo/bar/baz.js'}}")),
expected(lines( expected(lines(
"goog.provide('module$package_json')", "goog.provide('module$package_json')",
"var module$package_json = {\"other\": { \"main\": \"foo/bar/baz.js\"}};"))); "var module$package_json = {'other': { 'main': 'foo/bar/baz.js'}};")));


assertEquals(0, getLastCompiler().getModuleLoader().getPackageJsonMainEntries().size()); assertEquals(0, getLastCompiler().getModuleLoader().getPackageJsonMainEntries().size());
} }

public void testPackageJsonFileBrowserField() {
test(
srcs(
SourceFile.fromCode(
"/package.json",
"{ 'main': 'foo/bar/baz.js', 'browser': 'browser/foo.js' }")),
expected(
lines(
"goog.provide('module$package_json')",
"var module$package_json = {",
" 'main': 'foo/bar/baz.js',",
" 'browser': 'browser/foo.js'",
"};")));

assertThat(getLastCompiler().getModuleLoader().getPackageJsonMainEntries()).hasSize(1);
assertThat(getLastCompiler().getModuleLoader().getPackageJsonMainEntries())
.containsEntry("/package.json", "/browser/foo.js");
}
} }

0 comments on commit 51fe34e

Please sign in to comment.