Skip to content

Commit bf8fbbc

Browse files
authored
Merge pull request #1916 from Haehnchen/feature/1536-manifest-json
#1536 #1020 support manifest.json inside assets
2 parents 00a9593 + 3c4182e commit bf8fbbc

File tree

6 files changed

+100
-5
lines changed

6 files changed

+100
-5
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/asset/AssetDirectoryReader.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.intellij.openapi.vfs.VirtualFileVisitor;
77
import com.intellij.psi.PsiDirectory;
88
import fr.adrienbrault.idea.symfony2plugin.Settings;
9+
import fr.adrienbrault.idea.symfony2plugin.templating.webpack.SymfonyWebpackUtil;
910
import fr.adrienbrault.idea.symfony2plugin.util.ProjectUtil;
1011
import fr.adrienbrault.idea.symfony2plugin.util.SymfonyBundleUtil;
1112
import fr.adrienbrault.idea.symfony2plugin.util.dict.SymfonyBundle;
@@ -71,6 +72,14 @@ public boolean visitFile(@NotNull VirtualFile virtualFile) {
7172
return super.visitFile(virtualFile);
7273
}
7374
});
75+
76+
VirtualFile fileByRelativePath = webDirectory.findFileByRelativePath("build/manifest.json");
77+
if (fileByRelativePath != null) {
78+
SymfonyWebpackUtil.visitManifestJsonEntries(
79+
fileByRelativePath,
80+
pair -> files.add(AssetFile.createVirtualManifestEntry(fileByRelativePath, pair.getFirst()))
81+
);
82+
}
7483
}
7584

7685
if(!this.includeBundleDir) {
@@ -116,7 +125,7 @@ public Collection<VirtualFile> resolveAssetFile(@NotNull Project project, @NotNu
116125
// TODO: '@SampleBundle/Resources/public/js/*'
117126
// TODO: '@SampleBundle/Resources/public/js/*.js'
118127
if(filename.startsWith("@")) {
119-
Collection<VirtualFile> files = new ArrayList<>();
128+
Collection<VirtualFile> files = new HashSet<>();
120129

121130
int i = filename.indexOf("/");
122131
if(i > 0) {
@@ -144,7 +153,7 @@ public Collection<VirtualFile> resolveAssetFile(@NotNull Project project, @NotNu
144153
return files;
145154
}
146155

147-
Collection<VirtualFile> files = new ArrayList<>();
156+
Collection<VirtualFile> files = new HashSet<>();
148157

149158
for (VirtualFile webDirectory : getProjectAssetRoot(project)) {
150159
Matcher matcher = Pattern.compile("^(.*[/\\\\])\\*([.\\w+]*)$").matcher(assetName);
@@ -158,6 +167,18 @@ public Collection<VirtualFile> resolveAssetFile(@NotNull Project project, @NotNu
158167
// "/*.js"
159168
files.addAll(collectWildcardDirectories(matcher, webDirectory));
160169
}
170+
171+
VirtualFile fileByRelativePath = webDirectory.findFileByRelativePath("build/manifest.json");
172+
if (fileByRelativePath != null) {
173+
SymfonyWebpackUtil.visitManifestJsonEntries(
174+
fileByRelativePath,
175+
pair -> {
176+
if (filename.equalsIgnoreCase(pair.getFirst())) {
177+
files.add(fileByRelativePath);
178+
}
179+
}
180+
);
181+
}
161182
}
162183

163184
return files;

src/main/java/fr/adrienbrault/idea/symfony2plugin/asset/AssetFile.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public class AssetFile {
1919

2020
private String prefix = "";
2121

22+
private String string = null;
23+
2224
public AssetFile(@NotNull VirtualFile assetFile, @NotNull AssetEnum.Position assetPosition, @NotNull VirtualFile relativeFolder, @NotNull String prefix) {
2325
this(assetFile, assetPosition, relativeFolder);
2426
this.prefix = prefix;
@@ -30,6 +32,19 @@ public AssetFile(@NotNull VirtualFile assetFile, @NotNull AssetEnum.Position ass
3032
this.relativeFolder = relativeFolder;
3133
}
3234

35+
private AssetFile(@NotNull VirtualFile assetFile, @NotNull AssetEnum.Position assetPosition) {
36+
this.assetFile = assetFile;
37+
this.assetPosition = assetPosition;
38+
}
39+
40+
public static AssetFile createVirtualManifestEntry(@NotNull VirtualFile manifestJson, @NotNull String name) {
41+
AssetFile myAssetFile = new AssetFile(manifestJson, AssetEnum.Position.Web);
42+
43+
myAssetFile.string = name;
44+
45+
return myAssetFile;
46+
}
47+
3348
@NotNull
3449
public VirtualFile getFile() {
3550
return assetFile;
@@ -41,6 +56,8 @@ public AssetEnum.Position getAssetPosition() {
4156
}
4257

4358
public String toString() {
44-
return this.prefix + VfsUtil.getRelativePath(assetFile, relativeFolder, '/');
59+
return this.string != null
60+
? this.string
61+
: this.prefix + VfsUtil.getRelativePath(assetFile, relativeFolder, '/');
4562
}
4663
}

src/main/java/fr/adrienbrault/idea/symfony2plugin/installer/SymfonyInstallerUtil.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,6 @@ public static String getReleaseUrl() {
133133
}
134134
}
135135

136-
System.out.println(lastReleaseUrl);
137-
138136
String contents;
139137
try {
140138
java.io.InputStream is = new java.net.URL(lastReleaseUrl + "?per_page=100").openStream();

src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/webpack/SymfonyWebpackUtil.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
import com.intellij.psi.search.FilenameIndex;
1313
import com.intellij.psi.search.GlobalSearchScope;
1414
import fr.adrienbrault.idea.symfony2plugin.util.ProjectUtil;
15+
import org.apache.commons.lang.StringUtils;
1516
import org.jetbrains.annotations.NotNull;
1617

1718
import java.io.IOException;
19+
import java.util.Map;
1820
import java.util.function.Consumer;
1921
import java.util.regex.Matcher;
2022
import java.util.regex.Pattern;
@@ -42,6 +44,16 @@ public static void visitAllEntryFileTypes(@NotNull Project project, @NotNull Con
4244
}
4345
}
4446

47+
/**
48+
* {
49+
* "build/app.js": "/build/app.123abc.js",
50+
* "build/dashboard.css": "/build/dashboard.a4bf2d.css"
51+
* }
52+
*/
53+
public static void visitManifestJsonEntries(@NotNull VirtualFile virtualFile, @NotNull Consumer<Pair<String, String>> consumer) {
54+
visitManifestJson(virtualFile, consumer);
55+
}
56+
4557
/**
4658
* {
4759
* "entrypoints": {
@@ -109,6 +121,38 @@ private static void visitWebpackConfiguration(@NotNull VirtualFile virtualFile,
109121
}
110122
}
111123

124+
/**
125+
* {
126+
* "build/app.js": "/build/app.123abc.js",
127+
* "build/dashboard.css": "/build/dashboard.a4bf2d.css"
128+
* }
129+
*/
130+
private static void visitManifestJson(@NotNull VirtualFile virtualFile, @NotNull Consumer<Pair<String, String>> consumer) {
131+
JsonElement jsonElement;
132+
try {
133+
String s = StreamUtil.readText(virtualFile.getInputStream(), "UTF-8");
134+
jsonElement = JsonParser.parseString(s);
135+
} catch (JsonSyntaxException | IOException e) {
136+
return;
137+
}
138+
139+
for (Map.Entry<String, JsonElement> entry : jsonElement.getAsJsonObject().entrySet()) {
140+
String key = entry.getKey();
141+
if (StringUtils.isBlank(key)) {
142+
continue;
143+
}
144+
145+
JsonElement value = entry.getValue();
146+
147+
String content = null;
148+
if (value.isJsonPrimitive()) {
149+
content = value.getAsString();
150+
}
151+
152+
consumer.accept(Pair.create(key, content));
153+
}
154+
}
155+
112156
private static boolean isTestFile(@NotNull Project project, @NotNull VirtualFile virtualFile) {
113157
// ignore: "vendor/symonfy/.../tests/fixtures/build/entrypoints.json"
114158
String path = VfsUtil.getRelativePath(virtualFile, ProjectUtil.getProjectDir(project), '/');

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/webpack/SymfonyWebpackUtilTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.adrienbrault.idea.symfony2plugin.tests.templating.webpack;
22

3+
import com.intellij.openapi.vfs.VirtualFile;
34
import fr.adrienbrault.idea.symfony2plugin.templating.webpack.SymfonyWebpackUtil;
45
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
56

@@ -28,4 +29,13 @@ public void testVisitEntries() {
2829
SymfonyWebpackUtil.visitAllEntryFileTypes(myFixture.getProject(), pair -> entries.add(pair.second));
2930
assertContainsElements(entries, "foo", "foobar", "entry_foobar_2", "addStyleEntryFoobar");
3031
}
32+
33+
public void testVisitManifestJsonEntries() {
34+
VirtualFile virtualFile = myFixture.copyFileToProject("manifest.json");
35+
36+
Set<String> entries = new HashSet<>();
37+
38+
SymfonyWebpackUtil.visitManifestJsonEntries(virtualFile, pair -> entries.add(pair.getFirst()));
39+
assertContainsElements(entries, "build/app.js", "build/dashboard.css", "build/images/logo.png");
40+
}
3141
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"build/app.js": "/build/app.123abc.js",
3+
"build/dashboard.css": "/build/dashboard.a4bf2d.css",
4+
"build/images/logo.png": "/build/images/logo.3eed42.png"
5+
}

0 commit comments

Comments
 (0)