diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/app.gradle b/data/apps/test-app-js-41/app/App_Resources/Android/app.gradle
new file mode 100644
index 00000000..72fbcafb
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/Android/app.gradle
@@ -0,0 +1,23 @@
+// Add your native dependencies here:
+
+// Uncomment to add recyclerview-v7 dependency
+//dependencies {
+// compile 'com.android.support:recyclerview-v7:+'
+//}
+
+android {
+ defaultConfig {
+ generatedDensities = []
+ applicationId = "org.nativescript.testappjs41"
+
+ //override supported platforms
+ // ndk {
+ // abiFilters.clear()
+ // abiFilters "armeabi-v7a"
+ // }
+
+ }
+ aaptOptions {
+ additionalParameters "--no-version-vectors"
+ }
+}
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/AndroidManifest.xml b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..9db83215
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/AndroidManifest.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/background.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/background.png
new file mode 100644
index 00000000..eb381c25
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/background.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/icon.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/icon.png
new file mode 100644
index 00000000..9cde84cd
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/icon.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/logo.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/logo.png
new file mode 100644
index 00000000..5218f4c9
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-hdpi/logo.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/background.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/background.png
new file mode 100644
index 00000000..748b2adf
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/background.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/icon.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/icon.png
new file mode 100644
index 00000000..4d6a674b
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/icon.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/logo.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/logo.png
new file mode 100644
index 00000000..b9e102a7
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-ldpi/logo.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/background.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/background.png
new file mode 100644
index 00000000..efeaf290
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/background.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/icon.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/icon.png
new file mode 100644
index 00000000..92ccc85a
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/icon.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/logo.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/logo.png
new file mode 100644
index 00000000..62633876
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-mdpi/logo.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml
new file mode 100644
index 00000000..ada77f92
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml
@@ -0,0 +1,8 @@
+
+ -
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/background.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/background.png
new file mode 100644
index 00000000..612bbd07
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/background.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/icon.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/icon.png
new file mode 100644
index 00000000..8bcde627
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/icon.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/logo.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/logo.png
new file mode 100644
index 00000000..ad8ee2f4
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/logo.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/background.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/background.png
new file mode 100644
index 00000000..0fa88e23
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/background.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/icon.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/icon.png
new file mode 100644
index 00000000..9d81c85d
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/icon.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/logo.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/logo.png
new file mode 100644
index 00000000..66832783
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/logo.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/background.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/background.png
new file mode 100644
index 00000000..c650f643
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/background.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/icon.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/icon.png
new file mode 100644
index 00000000..9a34d0d4
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/icon.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/logo.png b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/logo.png
new file mode 100644
index 00000000..fa6331c8
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/logo.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values-v21/colors.xml b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values-v21/colors.xml
new file mode 100644
index 00000000..a64641a9
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values-v21/colors.xml
@@ -0,0 +1,4 @@
+
+
+ #3d5afe
+
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values-v21/styles.xml b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values-v21/styles.xml
new file mode 100644
index 00000000..dac8727c
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values-v21/styles.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values/colors.xml b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values/colors.xml
new file mode 100644
index 00000000..74ad8829
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values/colors.xml
@@ -0,0 +1,7 @@
+
+
+ #F5F5F5
+ #757575
+ #33B5E5
+ #272734
+
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values/styles.xml b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values/styles.xml
new file mode 100644
index 00000000..c793e6d4
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/Android/src/main/res/values/styles.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..4034b76e
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,98 @@
+{
+ "images" : [
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "icon-29.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "icon-29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "icon-29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "icon-40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "icon-40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "icon-60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "icon-60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "icon-29.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "icon-29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "icon-40.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "icon-40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "icon-76.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "icon-76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "icon-83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "icon-1024.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-1024.png
new file mode 100644
index 00000000..a1d7eb47
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29.png
new file mode 100644
index 00000000..bb9b9e86
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png
new file mode 100644
index 00000000..ec609dcf
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png
new file mode 100644
index 00000000..a9718080
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png
new file mode 100644
index 00000000..214800ee
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png
new file mode 100644
index 00000000..8554b88a
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png
new file mode 100644
index 00000000..a22626ba
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png
new file mode 100644
index 00000000..a22626ba
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png
new file mode 100644
index 00000000..492c9c8e
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png
new file mode 100644
index 00000000..9208113c
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png
new file mode 100644
index 00000000..24415e5a
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png
new file mode 100644
index 00000000..b3ef1bf0
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/Contents.json b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/Contents.json
new file mode 100644
index 00000000..da4a164c
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 00000000..11bfcf55
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,176 @@
+{
+ "images" : [
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "2436h",
+ "filename" : "Default-1125h.png",
+ "minimum-system-version" : "11.0",
+ "orientation" : "portrait",
+ "scale" : "3x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "iphone",
+ "extent" : "full-screen",
+ "filename" : "Default-Landscape-X.png",
+ "minimum-system-version" : "11.0",
+ "subtype" : "2436h",
+ "scale" : "3x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "736h",
+ "filename" : "Default-736h@3x.png",
+ "minimum-system-version" : "8.0",
+ "orientation" : "portrait",
+ "scale" : "3x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "736h",
+ "filename" : "Default-Landscape@3x.png",
+ "minimum-system-version" : "8.0",
+ "orientation" : "landscape",
+ "scale" : "3x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "667h",
+ "filename" : "Default-667h@2x.png",
+ "minimum-system-version" : "8.0",
+ "orientation" : "portrait",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "Default@2x.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "2x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "retina4",
+ "filename" : "Default-568h@2x.png",
+ "minimum-system-version" : "7.0",
+ "orientation" : "portrait",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "filename" : "Default-Portrait.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "filename" : "Default-Landscape.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "filename" : "Default-Portrait@2x.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "filename" : "Default-Landscape@2x.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "Default.png",
+ "extent" : "full-screen",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "Default@2x.png",
+ "extent" : "full-screen",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "Default-568h@2x.png",
+ "extent" : "full-screen",
+ "subtype" : "retina4",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "extent" : "to-status-bar",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "filename" : "Default-Portrait.png",
+ "extent" : "full-screen",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "extent" : "to-status-bar",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "filename" : "Default-Landscape.png",
+ "extent" : "full-screen",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "extent" : "to-status-bar",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "filename" : "Default-Portrait@2x.png",
+ "extent" : "full-screen",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "extent" : "to-status-bar",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "filename" : "Default-Landscape@2x.png",
+ "extent" : "full-screen",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-1125h.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-1125h.png
new file mode 100644
index 00000000..2913f85d
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-1125h.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png
new file mode 100644
index 00000000..d7f17fcd
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png
new file mode 100644
index 00000000..b8841540
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png
new file mode 100644
index 00000000..faab4b63
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape-X.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape-X.png
new file mode 100644
index 00000000..cd94a3ac
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape-X.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png
new file mode 100644
index 00000000..3365ba3c
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png
new file mode 100644
index 00000000..a44945c1
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png
new file mode 100644
index 00000000..e6dca626
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png
new file mode 100644
index 00000000..1a500796
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png
new file mode 100644
index 00000000..73d8b920
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png
new file mode 100644
index 00000000..9f1f6ce3
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png
new file mode 100644
index 00000000..514fc5cd
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json
new file mode 100644
index 00000000..4f4e9c50
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchScreen-AspectFill.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchScreen-AspectFill@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png
new file mode 100644
index 00000000..c293f9c7
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png
new file mode 100644
index 00000000..233693a6
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json
new file mode 100644
index 00000000..23c0ffd7
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchScreen-Center.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchScreen-Center@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png
new file mode 100644
index 00000000..a5a775a2
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png
new file mode 100644
index 00000000..154c1934
Binary files /dev/null and b/data/apps/test-app-js-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png differ
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/Info.plist b/data/apps/test-app-js-41/app/App_Resources/iOS/Info.plist
new file mode 100644
index 00000000..ea3e3ea2
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/iOS/Info.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleDisplayName
+ ${PRODUCT_NAME}
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${PRODUCT_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiresFullScreen
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/LaunchScreen.storyboard b/data/apps/test-app-js-41/app/App_Resources/iOS/LaunchScreen.storyboard
new file mode 100644
index 00000000..c4e5a3f3
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/iOS/LaunchScreen.storyboard
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-js-41/app/App_Resources/iOS/build.xcconfig b/data/apps/test-app-js-41/app/App_Resources/iOS/build.xcconfig
new file mode 100644
index 00000000..4b011849
--- /dev/null
+++ b/data/apps/test-app-js-41/app/App_Resources/iOS/build.xcconfig
@@ -0,0 +1,7 @@
+// You can add custom settings here
+// for example you can uncomment the following line to force distribution code signing
+// CODE_SIGN_IDENTITY = iPhone Distribution
+// To build for device with Xcode 8 you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html
+// DEVELOPMENT_TEAM = YOUR_TEAM_ID;
+ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
diff --git a/data/apps/test-app-js-41/app/app-root.xml b/data/apps/test-app-js-41/app/app-root.xml
new file mode 100644
index 00000000..54e70d97
--- /dev/null
+++ b/data/apps/test-app-js-41/app/app-root.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/data/apps/test-app-js-41/app/app.css b/data/apps/test-app-js-41/app/app.css
new file mode 100644
index 00000000..4a701b9e
--- /dev/null
+++ b/data/apps/test-app-js-41/app/app.css
@@ -0,0 +1,21 @@
+/*
+In NativeScript, the app.css file is where you place CSS rules that
+you would like to apply to your entire application. Check out
+http://docs.nativescript.org/ui/styling for a full list of the CSS
+selectors and properties you can use to style UI components.
+
+/*
+In many cases you may want to use the NativeScript core theme instead
+of writing your own CSS rules. For a full list of class names in the theme
+refer to http://docs.nativescript.org/ui/theme.
+The imported CSS rules must precede all other types of rules.
+*/
+@import '~nativescript-theme-core/css/core.light.css';
+
+/*
+The following CSS rule changes the font size of all UI
+components that have the btn class name.
+*/
+.btn {
+ font-size: 18;
+}
diff --git a/data/apps/test-app-js-41/app/app.js b/data/apps/test-app-js-41/app/app.js
new file mode 100644
index 00000000..adc90737
--- /dev/null
+++ b/data/apps/test-app-js-41/app/app.js
@@ -0,0 +1,15 @@
+/*
+In NativeScript, the app.js file is the entry point to your application.
+You can use this file to perform app-level initialization, but the primary
+purpose of the file is to pass control to the app’s first module.
+*/
+
+require("./bundle-config");
+var application = require("application");
+
+application.run({ moduleName: "app-root" });
+
+/*
+Do not place any code after the application has been started as it will not
+be executed on iOS.
+*/
diff --git a/data/apps/test-app-js-41/app/bundle-config.js b/data/apps/test-app-js-41/app/bundle-config.js
new file mode 100644
index 00000000..56844e28
--- /dev/null
+++ b/data/apps/test-app-js-41/app/bundle-config.js
@@ -0,0 +1,9 @@
+if (global.TNS_WEBPACK) {
+ // Register tns-core-modules UI framework modules
+ require("bundle-entry-points");
+
+ // Register application modules
+ // This will register each `root`, `page`, `fragment` postfixed xml, css, js, ts, scss file in the app/ folder
+ const context = require.context("~/", true, /(root|page|fragment)\.(xml|css|js|ts|scss|less|sass)$/);
+ global.registerWebpackModules(context);
+}
diff --git a/data/apps/test-app-js-41/app/main-page.js b/data/apps/test-app-js-41/app/main-page.js
new file mode 100644
index 00000000..3728a3cd
--- /dev/null
+++ b/data/apps/test-app-js-41/app/main-page.js
@@ -0,0 +1,41 @@
+/*
+In NativeScript, a file with the same name as an XML file is known as
+a code-behind file. The code-behind is a great place to place your view
+logic, and to set up your page’s data binding.
+*/
+
+/*
+NativeScript adheres to the CommonJS specification for dealing with
+JavaScript modules. The CommonJS require() function is how you import
+JavaScript modules defined in other files.
+*/
+var createViewModel = require("./main-view-model").createViewModel;
+
+function onNavigatingTo(args) {
+ /*
+ This gets a reference this page’s UI component. You can
+ view the API reference of the Page to see what’s available at
+ https://docs.nativescript.org/api-reference/classes/_ui_page_.page.html
+ */
+ var page = args.object;
+
+ /*
+ A page’s bindingContext is an object that should be used to perform
+ data binding between XML markup and JavaScript code. Properties
+ on the bindingContext can be accessed using the {{ }} syntax in XML.
+ In this example, the {{ message }} and {{ onTap }} bindings are resolved
+ against the object returned by createViewModel().
+
+ You can learn more about data binding in NativeScript at
+ https://docs.nativescript.org/core-concepts/data-binding.
+ */
+ page.bindingContext = createViewModel();
+}
+
+/*
+Exporting a function in a NativeScript code-behind file makes it accessible
+to the file’s corresponding XML file. In this case, exporting the onNavigatingTo
+function here makes the navigatingTo="onNavigatingTo" binding in this page’s XML
+file work.
+*/
+exports.onNavigatingTo = onNavigatingTo;
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/main-page.xml b/data/apps/test-app-js-41/app/main-page.xml
new file mode 100644
index 00000000..086a82b1
--- /dev/null
+++ b/data/apps/test-app-js-41/app/main-page.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-js-41/app/main-view-model.js b/data/apps/test-app-js-41/app/main-view-model.js
new file mode 100644
index 00000000..c0993f5a
--- /dev/null
+++ b/data/apps/test-app-js-41/app/main-view-model.js
@@ -0,0 +1,24 @@
+var Observable = require("data/observable").Observable;
+
+function getMessage(counter) {
+ if (counter <= 0) {
+ return "Hoorraaay! You unlocked the NativeScript clicker achievement!";
+ } else {
+ return counter + " taps left";
+ }
+}
+
+function createViewModel() {
+ var viewModel = new Observable();
+ viewModel.counter = 42;
+ viewModel.message = getMessage(viewModel.counter);
+
+ viewModel.onTap = function() {
+ this.counter--;
+ this.set("message", getMessage(this.counter));
+ }
+
+ return viewModel;
+}
+
+exports.createViewModel = createViewModel;
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/package.json b/data/apps/test-app-js-41/app/package.json
new file mode 100644
index 00000000..32c257d8
--- /dev/null
+++ b/data/apps/test-app-js-41/app/package.json
@@ -0,0 +1,8 @@
+{
+ "android": {
+ "v8Flags": "--expose_gc"
+ },
+ "main": "app.js",
+ "name": "tns-template-hello-world",
+ "version": "4.1.0"
+}
\ No newline at end of file
diff --git a/data/apps/test-app-js-41/app/references.d.ts b/data/apps/test-app-js-41/app/references.d.ts
new file mode 100644
index 00000000..db28a5d7
--- /dev/null
+++ b/data/apps/test-app-js-41/app/references.d.ts
@@ -0,0 +1 @@
+/// Enable smart suggestions and completions in Visual Studio Code JavaScript projects.
diff --git a/data/apps/test-app-js-41/package.json b/data/apps/test-app-js-41/package.json
new file mode 100644
index 00000000..64c606b4
--- /dev/null
+++ b/data/apps/test-app-js-41/package.json
@@ -0,0 +1,26 @@
+{
+ "description": "NativeScript Application",
+ "license": "SEE LICENSE IN ",
+ "readme": "NativeScript Application",
+ "repository": "",
+ "nativescript": {
+ "id": "org.nativescript.testappjs41",
+ "tns-ios": {
+ "version": "4.1.0"
+ },
+ "tns-android": {
+ "version": "4.1.3"
+ }
+ },
+ "dependencies": {
+ "nativescript-theme-core": "~1.0.4",
+ "tns-core-modules": "~4.1.0"
+ },
+ "devDependencies": {
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lazy": "1.0.11",
+ "nativescript-dev-webpack": "^0.14.0"
+ }
+}
diff --git a/data/apps/test-app-js-41/webpack.config.js b/data/apps/test-app-js-41/webpack.config.js
new file mode 100644
index 00000000..1700a92f
--- /dev/null
+++ b/data/apps/test-app-js-41/webpack.config.js
@@ -0,0 +1,229 @@
+const { join, relative, resolve, sep } = require("path");
+
+const webpack = require("webpack");
+const nsWebpack = require("nativescript-dev-webpack");
+const nativescriptTarget = require("nativescript-dev-webpack/nativescript-target");
+const CleanWebpackPlugin = require("clean-webpack-plugin");
+const CopyWebpackPlugin = require("copy-webpack-plugin");
+const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");
+const { NativeScriptWorkerPlugin } = require("nativescript-worker-loader/NativeScriptWorkerPlugin");
+const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
+
+module.exports = env => {
+ // Add your custom Activities, Services and other android app components here.
+ const appComponents = [
+ "tns-core-modules/ui/frame",
+ "tns-core-modules/ui/frame/activity",
+ ];
+
+ const platform = env && (env.android && "android" || env.ios && "ios");
+ if (!platform) {
+ throw new Error("You need to provide a target platform!");
+ }
+
+ const platforms = ["ios", "android"];
+ const projectRoot = __dirname;
+
+ // Default destination inside platforms//...
+ const dist = resolve(projectRoot, nsWebpack.getAppPath(platform, projectRoot));
+ const appResourcesPlatformDir = platform === "android" ? "Android" : "iOS";
+
+ const {
+ // The 'appPath' and 'appResourcesPath' values are fetched from
+ // the nsconfig.json configuration file
+ // when bundling with `tns run android|ios --bundle`.
+ appPath = "app",
+ appResourcesPath = "app/App_Resources",
+
+ // You can provide the following flags when running 'tns run android|ios'
+ snapshot, // --env.snapshot
+ uglify, // --env.uglify
+ report, // --env.report
+ } = env;
+
+ const appFullPath = resolve(projectRoot, appPath);
+ const appResourcesFullPath = resolve(projectRoot, appResourcesPath);
+
+ const entryModule = nsWebpack.getEntryModule(appFullPath);
+ const entryPath = `.${sep}${entryModule}.js`;
+
+ const config = {
+ mode: uglify ? "production" : "development",
+ context: appFullPath,
+ watchOptions: {
+ ignored: [
+ appResourcesFullPath,
+ // Don't watch hidden files
+ "**/.*",
+ ]
+ },
+ target: nativescriptTarget,
+ entry: {
+ bundle: entryPath,
+ },
+ output: {
+ pathinfo: false,
+ path: dist,
+ libraryTarget: "commonjs2",
+ filename: "[name].js",
+ globalObject: "global",
+ },
+ resolve: {
+ extensions: [".js", ".scss", ".css"],
+ // Resolve {N} system modules from tns-core-modules
+ modules: [
+ "node_modules/tns-core-modules",
+ "node_modules",
+ ],
+ alias: {
+ '~': appFullPath
+ },
+ // don't resolve symlinks to symlinked modules
+ symlinks: false
+ },
+ resolveLoader: {
+ // don't resolve symlinks to symlinked loaders
+ symlinks: false
+ },
+ node: {
+ // Disable node shims that conflict with NativeScript
+ "http": false,
+ "timers": false,
+ "setImmediate": false,
+ "fs": "empty",
+ "__dirname": false,
+ },
+ devtool: "none",
+ optimization: {
+ splitChunks: {
+ cacheGroups: {
+ vendor: {
+ name: "vendor",
+ chunks: "all",
+ test: (module, chunks) => {
+ const moduleName = module.nameForCondition ? module.nameForCondition() : '';
+ return /[\\/]node_modules[\\/]/.test(moduleName) ||
+ appComponents.some(comp => comp === moduleName);
+
+ },
+ enforce: true,
+ },
+ }
+ },
+ minimize: !!uglify,
+ minimizer: [
+ new UglifyJsPlugin({
+ uglifyOptions: {
+ parallel: true,
+ cache: true,
+ output: {
+ comments: false,
+ },
+ compress: {
+ // The Android SBG has problems parsing the output
+ // when these options are enabled
+ 'collapse_vars': platform !== "android",
+ sequences: platform !== "android",
+ }
+ }
+ })
+ ],
+ },
+ module: {
+ rules: [
+ {
+ test: new RegExp(entryPath),
+ use: [
+ // Require all Android app components
+ platform === "android" && {
+ loader: "nativescript-dev-webpack/android-app-components-loader",
+ options: { modules: appComponents }
+ },
+
+ {
+ loader: "nativescript-dev-webpack/bundle-config-loader",
+ options: {
+ loadCss: !snapshot, // load the application css if in debug mode
+ }
+ },
+ ].filter(loader => !!loader)
+ },
+
+ { test: /\.(html|xml)$/, use: "nativescript-dev-webpack/xml-namespace-loader"},
+
+ {
+ test: /\.css$/,
+ use: { loader: "css-loader", options: { minimize: false, url: false } }
+ },
+
+ {
+ test: /\.scss$/,
+ use: [
+ { loader: "css-loader", options: { minimize: false, url: false } },
+ "sass-loader"
+ ]
+ }
+ ]
+ },
+ plugins: [
+ // Define useful constants like TNS_WEBPACK
+ new webpack.DefinePlugin({
+ "global.TNS_WEBPACK": "true",
+ }),
+ // Remove all files from the out dir.
+ new CleanWebpackPlugin([ `${dist}/**/*` ]),
+ // Copy native app resources to out dir.
+ new CopyWebpackPlugin([
+ {
+ from: `${appResourcesFullPath}/${appResourcesPlatformDir}`,
+ to: `${dist}/App_Resources/${appResourcesPlatformDir}`,
+ context: projectRoot
+ },
+ ]),
+ // Copy assets to out dir. Add your own globs as needed.
+ new CopyWebpackPlugin([
+ { from: "fonts/**" },
+ { from: "**/*.jpg" },
+ { from: "**/*.png" },
+ ], { ignore: [`${relative(appPath, appResourcesFullPath)}/**`] }),
+ // Generate a bundle starter script and activate it in package.json
+ new nsWebpack.GenerateBundleStarterPlugin([
+ "./vendor",
+ "./bundle",
+ ]),
+ // For instructions on how to set up workers with webpack
+ // check out https://github.com/nativescript/worker-loader
+ new NativeScriptWorkerPlugin(),
+ new nsWebpack.PlatformFSPlugin({
+ platform,
+ platforms,
+ }),
+ // Does IPC communication with the {N} CLI to notify events when running in watch mode.
+ new nsWebpack.WatchStateLoggerPlugin(),
+ ],
+ };
+
+ if (report) {
+ // Generate report files for bundles content
+ config.plugins.push(new BundleAnalyzerPlugin({
+ analyzerMode: "static",
+ openAnalyzer: false,
+ generateStatsFile: true,
+ reportFilename: resolve(projectRoot, "report", `report.html`),
+ statsFilename: resolve(projectRoot, "report", `stats.json`),
+ }));
+ }
+
+ if (snapshot) {
+ config.plugins.push(new nsWebpack.NativeScriptSnapshotPlugin({
+ chunk: "vendor",
+ requireModules: [
+ "tns-core-modules/bundle-entry-points",
+ ],
+ projectRoot,
+ webpackConfig: config,
+ }));
+ }
+
+ return config;
+};
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/app.gradle b/data/apps/test-app-ng-41/app/App_Resources/Android/app.gradle
new file mode 100644
index 00000000..2163a836
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/Android/app.gradle
@@ -0,0 +1,16 @@
+// Add your native dependencies here:
+
+// Uncomment to add recyclerview-v7 dependency
+//dependencies {
+// compile 'com.android.support:recyclerview-v7:+'
+//}
+
+android {
+ defaultConfig {
+ generatedDensities = []
+ applicationId = "org.nativescript.testappng41"
+ }
+ aaptOptions {
+ additionalParameters "--no-version-vectors"
+ }
+}
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/AndroidManifest.xml b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..9db83215
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/AndroidManifest.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/background.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/background.png
new file mode 100644
index 00000000..eb381c25
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/background.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/icon.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/icon.png
new file mode 100644
index 00000000..9cde84cd
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/icon.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/logo.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/logo.png
new file mode 100644
index 00000000..5218f4c9
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-hdpi/logo.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/background.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/background.png
new file mode 100644
index 00000000..748b2adf
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/background.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/icon.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/icon.png
new file mode 100644
index 00000000..4d6a674b
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/icon.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/logo.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/logo.png
new file mode 100644
index 00000000..b9e102a7
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-ldpi/logo.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/background.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/background.png
new file mode 100644
index 00000000..efeaf290
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/background.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/icon.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/icon.png
new file mode 100644
index 00000000..92ccc85a
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/icon.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/logo.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/logo.png
new file mode 100644
index 00000000..62633876
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-mdpi/logo.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml
new file mode 100644
index 00000000..ada77f92
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml
@@ -0,0 +1,8 @@
+
+ -
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/background.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/background.png
new file mode 100644
index 00000000..612bbd07
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/background.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/icon.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/icon.png
new file mode 100644
index 00000000..8bcde627
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/icon.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/logo.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/logo.png
new file mode 100644
index 00000000..ad8ee2f4
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xhdpi/logo.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/background.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/background.png
new file mode 100644
index 00000000..0fa88e23
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/background.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/icon.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/icon.png
new file mode 100644
index 00000000..9d81c85d
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/icon.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/logo.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/logo.png
new file mode 100644
index 00000000..66832783
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxhdpi/logo.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/background.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/background.png
new file mode 100644
index 00000000..c650f643
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/background.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/icon.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/icon.png
new file mode 100644
index 00000000..9a34d0d4
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/icon.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/logo.png b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/logo.png
new file mode 100644
index 00000000..fa6331c8
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/drawable-xxxhdpi/logo.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values-v21/colors.xml b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values-v21/colors.xml
new file mode 100644
index 00000000..a64641a9
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values-v21/colors.xml
@@ -0,0 +1,4 @@
+
+
+ #3d5afe
+
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values-v21/styles.xml b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values-v21/styles.xml
new file mode 100644
index 00000000..dac8727c
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values-v21/styles.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values/colors.xml b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values/colors.xml
new file mode 100644
index 00000000..74ad8829
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values/colors.xml
@@ -0,0 +1,7 @@
+
+
+ #F5F5F5
+ #757575
+ #33B5E5
+ #272734
+
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values/styles.xml b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values/styles.xml
new file mode 100644
index 00000000..c793e6d4
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/Android/src/main/res/values/styles.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..4034b76e
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,98 @@
+{
+ "images" : [
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "icon-29.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "icon-29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "icon-29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "icon-40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "icon-40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "icon-60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "icon-60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "icon-29.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "icon-29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "icon-40.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "icon-40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "icon-76.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "icon-76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "icon-83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "icon-1024.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-1024.png
new file mode 100644
index 00000000..a1d7eb47
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29.png
new file mode 100644
index 00000000..bb9b9e86
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png
new file mode 100644
index 00000000..ec609dcf
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png
new file mode 100644
index 00000000..a9718080
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png
new file mode 100644
index 00000000..214800ee
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png
new file mode 100644
index 00000000..8554b88a
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png
new file mode 100644
index 00000000..a22626ba
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png
new file mode 100644
index 00000000..a22626ba
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png
new file mode 100644
index 00000000..492c9c8e
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png
new file mode 100644
index 00000000..9208113c
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png
new file mode 100644
index 00000000..24415e5a
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png
new file mode 100644
index 00000000..b3ef1bf0
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/Contents.json b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/Contents.json
new file mode 100644
index 00000000..da4a164c
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 00000000..11bfcf55
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,176 @@
+{
+ "images" : [
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "2436h",
+ "filename" : "Default-1125h.png",
+ "minimum-system-version" : "11.0",
+ "orientation" : "portrait",
+ "scale" : "3x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "iphone",
+ "extent" : "full-screen",
+ "filename" : "Default-Landscape-X.png",
+ "minimum-system-version" : "11.0",
+ "subtype" : "2436h",
+ "scale" : "3x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "736h",
+ "filename" : "Default-736h@3x.png",
+ "minimum-system-version" : "8.0",
+ "orientation" : "portrait",
+ "scale" : "3x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "736h",
+ "filename" : "Default-Landscape@3x.png",
+ "minimum-system-version" : "8.0",
+ "orientation" : "landscape",
+ "scale" : "3x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "667h",
+ "filename" : "Default-667h@2x.png",
+ "minimum-system-version" : "8.0",
+ "orientation" : "portrait",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "Default@2x.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "2x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "retina4",
+ "filename" : "Default-568h@2x.png",
+ "minimum-system-version" : "7.0",
+ "orientation" : "portrait",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "filename" : "Default-Portrait.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "filename" : "Default-Landscape.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "filename" : "Default-Portrait@2x.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "filename" : "Default-Landscape@2x.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "Default.png",
+ "extent" : "full-screen",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "Default@2x.png",
+ "extent" : "full-screen",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "Default-568h@2x.png",
+ "extent" : "full-screen",
+ "subtype" : "retina4",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "extent" : "to-status-bar",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "filename" : "Default-Portrait.png",
+ "extent" : "full-screen",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "extent" : "to-status-bar",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "filename" : "Default-Landscape.png",
+ "extent" : "full-screen",
+ "scale" : "1x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "extent" : "to-status-bar",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "ipad",
+ "filename" : "Default-Portrait@2x.png",
+ "extent" : "full-screen",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "extent" : "to-status-bar",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "landscape",
+ "idiom" : "ipad",
+ "filename" : "Default-Landscape@2x.png",
+ "extent" : "full-screen",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-1125h.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-1125h.png
new file mode 100644
index 00000000..2913f85d
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-1125h.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png
new file mode 100644
index 00000000..d7f17fcd
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png
new file mode 100644
index 00000000..b8841540
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png
new file mode 100644
index 00000000..faab4b63
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape-X.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape-X.png
new file mode 100644
index 00000000..cd94a3ac
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape-X.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png
new file mode 100644
index 00000000..3365ba3c
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png
new file mode 100644
index 00000000..a44945c1
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png
new file mode 100644
index 00000000..e6dca626
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png
new file mode 100644
index 00000000..1a500796
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png
new file mode 100644
index 00000000..73d8b920
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png
new file mode 100644
index 00000000..9f1f6ce3
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png
new file mode 100644
index 00000000..514fc5cd
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json
new file mode 100644
index 00000000..4f4e9c50
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchScreen-AspectFill.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchScreen-AspectFill@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png
new file mode 100644
index 00000000..c293f9c7
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png
new file mode 100644
index 00000000..233693a6
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json
new file mode 100644
index 00000000..23c0ffd7
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchScreen-Center.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchScreen-Center@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png
new file mode 100644
index 00000000..a5a775a2
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png
new file mode 100644
index 00000000..154c1934
Binary files /dev/null and b/data/apps/test-app-ng-41/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png differ
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/Info.plist b/data/apps/test-app-ng-41/app/App_Resources/iOS/Info.plist
new file mode 100644
index 00000000..ea3e3ea2
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/iOS/Info.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleDisplayName
+ ${PRODUCT_NAME}
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${PRODUCT_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiresFullScreen
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/LaunchScreen.storyboard b/data/apps/test-app-ng-41/app/App_Resources/iOS/LaunchScreen.storyboard
new file mode 100644
index 00000000..c4e5a3f3
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/iOS/LaunchScreen.storyboard
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-ng-41/app/App_Resources/iOS/build.xcconfig b/data/apps/test-app-ng-41/app/App_Resources/iOS/build.xcconfig
new file mode 100644
index 00000000..4b011849
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/App_Resources/iOS/build.xcconfig
@@ -0,0 +1,7 @@
+// You can add custom settings here
+// for example you can uncomment the following line to force distribution code signing
+// CODE_SIGN_IDENTITY = iPhone Distribution
+// To build for device with Xcode 8 you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html
+// DEVELOPMENT_TEAM = YOUR_TEAM_ID;
+ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
diff --git a/data/apps/test-app-ng-41/app/README.md b/data/apps/test-app-ng-41/app/README.md
new file mode 100644
index 00000000..132ede3b
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/README.md
@@ -0,0 +1,25 @@
+# NativeScript Angular Template
+
+This template creates a "Hello, world" NativeScript app using TypeScript and Angular.
+
+You can create a new app that uses this template with either the `--template` option.
+
+```
+tns create my-app-name --template tns-template-hello-world-ng
+```
+
+Or the `--ng` shorthand.
+
+```
+tns create my-app-name --ng
+```
+
+> Note: Both commands will create a new NativeScript app that uses the latest version of this template published to [npm] (https://www.npmjs.com/package/tns-template-hello-world-ng).
+
+If you want to create a new app that uses the source of the template from the `master` branch, you can execute the following:
+
+```
+tns create my-app-name --template https://github.com/NativeScript/template-hello-world-ng.git#master
+```
+
+**NB:** Please, have in mind that the master branch may refer to dependencies that are not on NPM yet!
diff --git a/data/apps/test-app-ng-41/app/app.component.html b/data/apps/test-app-ng-41/app/app.component.html
new file mode 100644
index 00000000..8a2c1a75
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/app.component.html
@@ -0,0 +1,2 @@
+
+
diff --git a/data/apps/test-app-ng-41/app/app.component.ts b/data/apps/test-app-ng-41/app/app.component.ts
new file mode 100644
index 00000000..b95dd6f0
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/app.component.ts
@@ -0,0 +1,8 @@
+import { Component } from "@angular/core";
+
+@Component({
+ selector: "ns-app",
+ templateUrl: "app.component.html",
+})
+
+export class AppComponent { }
diff --git a/data/apps/test-app-ng-41/app/app.css b/data/apps/test-app-ng-41/app/app.css
new file mode 100644
index 00000000..d23504c4
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/app.css
@@ -0,0 +1,12 @@
+/*
+In NativeScript, the app.css file is where you place CSS rules that
+you would like to apply to your entire application. Check out
+http://docs.nativescript.org/ui/styling for a full list of the CSS
+selectors and properties you can use to style UI components.
+
+/*
+In many cases you may want to use the NativeScript core theme instead
+of writing your own CSS rules. For a full list of class names in the theme
+refer to http://docs.nativescript.org/ui/theme.
+*/
+@import '~nativescript-theme-core/css/core.light.css';
diff --git a/data/apps/test-app-ng-41/app/app.module.ngfactory.d.ts b/data/apps/test-app-ng-41/app/app.module.ngfactory.d.ts
new file mode 100644
index 00000000..793157de
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/app.module.ngfactory.d.ts
@@ -0,0 +1,4 @@
+/**
+ * A dynamically generated module when compiled with AoT.
+ */
+export const AppModuleNgFactory: any;
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/app.module.ts b/data/apps/test-app-ng-41/app/app.module.ts
new file mode 100644
index 00000000..5f3f2e17
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/app.module.ts
@@ -0,0 +1,39 @@
+import { NgModule, NO_ERRORS_SCHEMA } from "@angular/core";
+import { NativeScriptModule } from "nativescript-angular/nativescript.module";
+import { AppRoutingModule } from "./app.routing";
+import { AppComponent } from "./app.component";
+
+import { ItemService } from "./item/item.service";
+import { ItemsComponent } from "./item/items.component";
+import { ItemDetailComponent } from "./item/item-detail.component";
+
+// Uncomment and add to NgModule imports if you need to use two-way binding
+// import { NativeScriptFormsModule } from "nativescript-angular/forms";
+
+// Uncomment and add to NgModule imports if you need to use the HTTP wrapper
+// import { NativeScriptHttpModule } from "nativescript-angular/http";
+
+@NgModule({
+ bootstrap: [
+ AppComponent
+ ],
+ imports: [
+ NativeScriptModule,
+ AppRoutingModule
+ ],
+ declarations: [
+ AppComponent,
+ ItemsComponent,
+ ItemDetailComponent
+ ],
+ providers: [
+ ItemService
+ ],
+ schemas: [
+ NO_ERRORS_SCHEMA
+ ]
+})
+/*
+Pass your application module to the bootstrapModule function located in main.ts to start your app
+*/
+export class AppModule { }
diff --git a/data/apps/test-app-ng-41/app/app.routing.ts b/data/apps/test-app-ng-41/app/app.routing.ts
new file mode 100644
index 00000000..26c691b5
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/app.routing.ts
@@ -0,0 +1,18 @@
+import { NgModule } from "@angular/core";
+import { NativeScriptRouterModule } from "nativescript-angular/router";
+import { Routes } from "@angular/router";
+
+import { ItemsComponent } from "./item/items.component";
+import { ItemDetailComponent } from "./item/item-detail.component";
+
+const routes: Routes = [
+ { path: "", redirectTo: "/items", pathMatch: "full" },
+ { path: "items", component: ItemsComponent },
+ { path: "item/:id", component: ItemDetailComponent },
+];
+
+@NgModule({
+ imports: [NativeScriptRouterModule.forRoot(routes)],
+ exports: [NativeScriptRouterModule]
+})
+export class AppRoutingModule { }
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/item/item-detail.component.html b/data/apps/test-app-ng-41/app/item/item-detail.component.html
new file mode 100644
index 00000000..3bbd174c
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/item/item-detail.component.html
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-ng-41/app/item/item-detail.component.ts b/data/apps/test-app-ng-41/app/item/item-detail.component.ts
new file mode 100644
index 00000000..9183f787
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/item/item-detail.component.ts
@@ -0,0 +1,24 @@
+import { Component, OnInit } from "@angular/core";
+import { ActivatedRoute } from "@angular/router";
+
+import { Item } from "./item";
+import { ItemService } from "./item.service";
+
+@Component({
+ selector: "ns-details",
+ moduleId: module.id,
+ templateUrl: "./item-detail.component.html",
+})
+export class ItemDetailComponent implements OnInit {
+ item: Item;
+
+ constructor(
+ private itemService: ItemService,
+ private route: ActivatedRoute
+ ) { }
+
+ ngOnInit(): void {
+ const id = +this.route.snapshot.params["id"];
+ this.item = this.itemService.getItem(id);
+ }
+}
diff --git a/data/apps/test-app-ng-41/app/item/item.service.ts b/data/apps/test-app-ng-41/app/item/item.service.ts
new file mode 100644
index 00000000..0feb6c5f
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/item/item.service.ts
@@ -0,0 +1,39 @@
+import { Injectable } from "@angular/core";
+
+import { Item } from "./item";
+
+@Injectable()
+export class ItemService {
+ private items = new Array- (
+ { id: 1, name: "Ter Stegen", role: "Goalkeeper" },
+ { id: 3, name: "Piqué", role: "Defender" },
+ { id: 4, name: "I. Rakitic", role: "Midfielder" },
+ { id: 5, name: "Sergio", role: "Midfielder" },
+ { id: 6, name: "Denis Suárez", role: "Midfielder" },
+ { id: 7, name: "Arda", role: "Midfielder" },
+ { id: 8, name: "A. Iniesta", role: "Midfielder" },
+ { id: 9, name: "Suárez", role: "Forward" },
+ { id: 10, name: "Messi", role: "Forward" },
+ { id: 11, name: "Neymar", role: "Forward" },
+ { id: 12, name: "Rafinha", role: "Midfielder" },
+ { id: 13, name: "Cillessen", role: "Goalkeeper" },
+ { id: 14, name: "Mascherano", role: "Defender" },
+ { id: 17, name: "Paco Alcácer", role: "Forward" },
+ { id: 18, name: "Jordi Alba", role: "Defender" },
+ { id: 19, name: "Digne", role: "Defender" },
+ { id: 20, name: "Sergi Roberto", role: "Midfielder" },
+ { id: 21, name: "André Gomes", role: "Midfielder" },
+ { id: 22, name: "Aleix Vidal", role: "Midfielder" },
+ { id: 23, name: "Umtiti", role: "Defender" },
+ { id: 24, name: "Mathieu", role: "Defender" },
+ { id: 25, name: "Masip", role: "Goalkeeper" },
+ );
+
+ getItems(): Item[] {
+ return this.items;
+ }
+
+ getItem(id: number): Item {
+ return this.items.filter(item => item.id === id)[0];
+ }
+}
diff --git a/data/apps/test-app-ng-41/app/item/item.ts b/data/apps/test-app-ng-41/app/item/item.ts
new file mode 100644
index 00000000..950fba44
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/item/item.ts
@@ -0,0 +1,5 @@
+export interface Item {
+ id: number;
+ name: string;
+ role: string;
+}
diff --git a/data/apps/test-app-ng-41/app/item/items.component.html b/data/apps/test-app-ng-41/app/item/items.component.html
new file mode 100644
index 00000000..55e87e3a
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/item/items.component.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/apps/test-app-ng-41/app/item/items.component.ts b/data/apps/test-app-ng-41/app/item/items.component.ts
new file mode 100644
index 00000000..0ea98c8c
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/item/items.component.ts
@@ -0,0 +1,21 @@
+import { Component, OnInit } from "@angular/core";
+
+import { Item } from "./item";
+import { ItemService } from "./item.service";
+
+@Component({
+ selector: "ns-items",
+ moduleId: module.id,
+ templateUrl: "./items.component.html",
+})
+export class ItemsComponent implements OnInit {
+ items: Item[];
+
+ // This pattern makes use of Angular’s dependency injection implementation to inject an instance of the ItemService service into this class.
+ // Angular knows about this service because it is included in your app’s main NgModule, defined in app.module.ts.
+ constructor(private itemService: ItemService) { }
+
+ ngOnInit(): void {
+ this.items = this.itemService.getItems();
+ }
+}
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/app/main.aot.ts b/data/apps/test-app-ng-41/app/main.aot.ts
new file mode 100644
index 00000000..d5ff77a7
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/main.aot.ts
@@ -0,0 +1,7 @@
+// this import should be first in order to load some required settings (like globals and reflect-metadata)
+import { platformNativeScript } from "nativescript-angular/platform-static";
+
+// "./app.module.ngfactory" is a dynamically generated module when compiled with AoT.
+import { AppModuleNgFactory } from "./app.module.ngfactory";
+
+platformNativeScript().bootstrapModuleFactory(AppModuleNgFactory);
diff --git a/data/apps/test-app-ng-41/app/main.ts b/data/apps/test-app-ng-41/app/main.ts
new file mode 100644
index 00000000..a84cb884
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/main.ts
@@ -0,0 +1,10 @@
+// this import should be first in order to load some required settings (like globals and reflect-metadata)
+import { platformNativeScriptDynamic } from "nativescript-angular/platform";
+
+import { AppModule } from "./app.module";
+
+// A traditional NativeScript application starts by initializing global objects, setting up global CSS rules, creating, and navigating to the main page.
+// Angular applications need to take care of their own initialization: modules, components, directives, routes, DI providers.
+// A NativeScript Angular app needs to make both paradigms work together, so we provide a wrapper platform object, platformNativeScriptDynamic,
+// that sets up a NativeScript application and can bootstrap the Angular framework.
+platformNativeScriptDynamic().bootstrapModule(AppModule);
diff --git a/data/apps/test-app-ng-41/app/package.json b/data/apps/test-app-ng-41/app/package.json
new file mode 100644
index 00000000..bbc53fcb
--- /dev/null
+++ b/data/apps/test-app-ng-41/app/package.json
@@ -0,0 +1,8 @@
+{
+ "android": {
+ "v8Flags": "--expose_gc"
+ },
+ "main": "main.js",
+ "name": "tns-template-hello-world-ng",
+ "version": "4.1.0"
+}
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/package.json b/data/apps/test-app-ng-41/package.json
new file mode 100644
index 00000000..e118fe3f
--- /dev/null
+++ b/data/apps/test-app-ng-41/package.json
@@ -0,0 +1,40 @@
+{
+ "description": "NativeScript Application",
+ "license": "SEE LICENSE IN ",
+ "readme": "NativeScript Application",
+ "repository": "",
+ "nativescript": {
+ "id": "org.nativescript.testappng41",
+ "tns-android": {
+ "version": "4.1.3"
+ }
+ },
+ "dependencies": {
+ "@angular/animations": "~6.0.0",
+ "@angular/common": "~6.0.0",
+ "@angular/compiler": "~6.0.0",
+ "@angular/core": "~6.0.0",
+ "@angular/forms": "~6.0.0",
+ "@angular/http": "~6.0.0",
+ "@angular/platform-browser": "~6.0.0",
+ "@angular/platform-browser-dynamic": "~6.0.0",
+ "@angular/router": "~6.0.0",
+ "nativescript-angular": "~6.0.0",
+ "nativescript-theme-core": "~1.0.4",
+ "reflect-metadata": "~0.1.8",
+ "rxjs": "~6.1.0",
+ "tns-core-modules": "~4.1.0",
+ "zone.js": "^0.8.26"
+ },
+ "devDependencies": {
+ "@angular-devkit/build-angular": "~0.7.0-rc.0",
+ "@angular/compiler-cli": "~6.1.0-beta.1",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lazy": "1.0.11",
+ "nativescript-dev-typescript": "~0.7.0",
+ "nativescript-dev-webpack": "^0.14.0",
+ "typescript": "~2.7.2"
+ }
+}
diff --git a/data/apps/test-app-ng-41/tsconfig.esm.json b/data/apps/test-app-ng-41/tsconfig.esm.json
new file mode 100644
index 00000000..95f2ecee
--- /dev/null
+++ b/data/apps/test-app-ng-41/tsconfig.esm.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig",
+ "compilerOptions": {
+ "module": "es2015",
+ "moduleResolution": "node"
+ }
+}
diff --git a/data/apps/test-app-ng-41/tsconfig.json b/data/apps/test-app-ng-41/tsconfig.json
new file mode 100644
index 00000000..4d138d1f
--- /dev/null
+++ b/data/apps/test-app-ng-41/tsconfig.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es5",
+ "experimentalDecorators": true,
+ "emitDecoratorMetadata": true,
+ "noEmitHelpers": true,
+ "noEmitOnError": true,
+ "lib": [
+ "es6",
+ "dom",
+ "es2015.iterable"
+ ],
+ "baseUrl": ".",
+ "paths": {
+ "~/*": [
+ "app/*"
+ ],
+ "*": [
+ "./node_modules/tns-core-modules/*",
+ "./node_modules/*"
+ ]
+ }
+ },
+ "exclude": [
+ "node_modules",
+ "platforms"
+ ]
+}
\ No newline at end of file
diff --git a/data/apps/test-app-ng-41/webpack.config.js b/data/apps/test-app-ng-41/webpack.config.js
new file mode 100644
index 00000000..97c3beb2
--- /dev/null
+++ b/data/apps/test-app-ng-41/webpack.config.js
@@ -0,0 +1,268 @@
+const { join, relative, resolve, sep } = require("path");
+
+const webpack = require("webpack");
+const nsWebpack = require("nativescript-dev-webpack");
+const nativescriptTarget = require("nativescript-dev-webpack/nativescript-target");
+const { PlatformReplacementHost } = require("nativescript-dev-webpack/host/platform");
+const CleanWebpackPlugin = require("clean-webpack-plugin");
+const CopyWebpackPlugin = require("copy-webpack-plugin");
+const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");
+const { NativeScriptWorkerPlugin } = require("nativescript-worker-loader/NativeScriptWorkerPlugin");
+const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
+const { AngularCompilerPlugin } = require("@ngtools/webpack");
+
+module.exports = env => {
+ // Add your custom Activities, Services and other Android app components here.
+ const appComponents = [
+ "tns-core-modules/ui/frame",
+ "tns-core-modules/ui/frame/activity",
+ ];
+
+ const platform = env && (env.android && "android" || env.ios && "ios");
+ if (!platform) {
+ throw new Error("You need to provide a target platform!");
+ }
+
+ const extensions = ["tns", platform];
+ const platformHost = new PlatformReplacementHost(extensions);
+
+ const projectRoot = __dirname;
+
+ // Default destination inside platforms//...
+ const dist = resolve(projectRoot, nsWebpack.getAppPath(platform, projectRoot));
+ const appResourcesPlatformDir = platform === "android" ? "Android" : "iOS";
+
+ const {
+ // The 'appPath' and 'appResourcesPath' values are fetched from
+ // the nsconfig.json configuration file
+ // when bundling with `tns run android|ios --bundle`.
+ appPath = "app",
+ appResourcesPath = "app/App_Resources",
+
+ // You can provide the following flags when running 'tns run android|ios'
+ aot, // --env.aot
+ snapshot, // --env.snapshot
+ uglify, // --env.uglify
+ report, // --env.report
+ } = env;
+
+ const appFullPath = resolve(projectRoot, appPath);
+ const appResourcesFullPath = resolve(projectRoot, appResourcesPath);
+
+ const entryModule = aot ?
+ nsWebpack.getAotEntryModule(appFullPath) :
+ `${nsWebpack.getEntryModule(appFullPath)}.ts`;
+ const entryPath = `.${sep}${entryModule}`;
+
+ const config = {
+ mode: uglify ? "production" : "development",
+ context: appFullPath,
+ watchOptions: {
+ ignored: [
+ appResourcesFullPath,
+ // Don't watch hidden files
+ "**/.*",
+ ]
+ },
+ target: nativescriptTarget,
+ entry: {
+ bundle: entryPath,
+ },
+ output: {
+ pathinfo: false,
+ path: dist,
+ libraryTarget: "commonjs2",
+ filename: "[name].js",
+ globalObject: "global",
+ },
+ resolve: {
+ extensions: [".ts", ".js", ".scss", ".css"],
+ // Resolve {N} system modules from tns-core-modules
+ modules: [
+ resolve(__dirname, "node_modules/tns-core-modules"),
+ resolve(__dirname, "node_modules"),
+ "node_modules/tns-core-modules",
+ "node_modules",
+ ],
+ alias: {
+ '~': appFullPath
+ },
+ symlinks: true
+ },
+ resolveLoader: {
+ symlinks: false
+ },
+ node: {
+ // Disable node shims that conflict with NativeScript
+ "http": false,
+ "timers": false,
+ "setImmediate": false,
+ "fs": "empty",
+ "__dirname": false,
+ },
+ devtool: "none",
+ optimization: {
+ splitChunks: {
+ cacheGroups: {
+ vendor: {
+ name: "vendor",
+ chunks: "all",
+ test: (module, chunks) => {
+ const moduleName = module.nameForCondition ? module.nameForCondition() : '';
+ return /[\\/]node_modules[\\/]/.test(moduleName) ||
+ appComponents.some(comp => comp === moduleName);
+ },
+ enforce: true,
+ },
+ }
+ },
+ minimize: !!uglify,
+ minimizer: [
+ new UglifyJsPlugin({
+ uglifyOptions: {
+ parallel: true,
+ cache: true,
+ output: {
+ comments: false,
+ },
+ compress: {
+ // The Android SBG has problems parsing the output
+ // when these options are enabled
+ 'collapse_vars': platform !== "android",
+ sequences: platform !== "android",
+ }
+ }
+ })
+ ],
+ },
+ module: {
+ rules: [
+ {
+ test: new RegExp(entryPath),
+ use: [
+ // Require all Android app components
+ platform === "android" && {
+ loader: "nativescript-dev-webpack/android-app-components-loader",
+ options: { modules: appComponents }
+ },
+
+ {
+ loader: "nativescript-dev-webpack/bundle-config-loader",
+ options: {
+ angular: true,
+ loadCss: !snapshot, // load the application css if in debug mode
+ }
+ },
+ ].filter(loader => !!loader)
+ },
+
+ { test: /\.html$|\.xml$/, use: "raw-loader" },
+
+ // tns-core-modules reads the app.css and its imports using css-loader
+ {
+ test: /[\/|\\]app\.css$/,
+ use: {
+ loader: "css-loader",
+ options: { minimize: false, url: false },
+ }
+ },
+ {
+ test: /[\/|\\]app\.scss$/,
+ use: [
+ { loader: "css-loader", options: { minimize: false, url: false } },
+ "sass-loader"
+ ]
+ },
+
+ // Angular components reference css files and their imports using raw-loader
+ { test: /\.css$/, exclude: /[\/|\\]app\.css$/, use: "raw-loader" },
+ { test: /\.scss$/, exclude: /[\/|\\]app\.scss$/, use: ["raw-loader", "resolve-url-loader", "sass-loader"] },
+
+ // Compile TypeScript files with ahead-of-time compiler.
+ {
+ test: /.ts$/, use: [
+ "nativescript-dev-webpack/moduleid-compat-loader",
+ "@ngtools/webpack",
+ ]
+ },
+
+ // Mark files inside `@angular/core` as using SystemJS style dynamic imports.
+ // Removing this will cause deprecation warnings to appear.
+ {
+ test: /[\/\\]@angular[\/\\]core[\/\\].+\.js$/,
+ parser: { system: true },
+ },
+ ],
+ },
+ plugins: [
+ // Define useful constants like TNS_WEBPACK
+ new webpack.DefinePlugin({
+ "global.TNS_WEBPACK": "true",
+ }),
+ // Remove all files from the out dir.
+ new CleanWebpackPlugin([ `${dist}/**/*` ]),
+ // Copy native app resources to out dir.
+ new CopyWebpackPlugin([
+ {
+ from: `${appResourcesFullPath}/${appResourcesPlatformDir}`,
+ to: `${dist}/App_Resources/${appResourcesPlatformDir}`,
+ context: projectRoot
+ },
+ ]),
+ // Copy assets to out dir. Add your own globs as needed.
+ new CopyWebpackPlugin([
+ { from: "fonts/**" },
+ { from: "**/*.jpg" },
+ { from: "**/*.png" },
+ ], { ignore: [`${relative(appPath, appResourcesFullPath)}/**`] }),
+ // Generate a bundle starter script and activate it in package.json
+ new nsWebpack.GenerateBundleStarterPlugin([
+ "./vendor",
+ "./bundle",
+ ]),
+ // For instructions on how to set up workers with webpack
+ // check out https://github.com/nativescript/worker-loader
+ new NativeScriptWorkerPlugin(),
+
+ new AngularCompilerPlugin({
+ host: platformHost,
+ entryModule: resolve(appPath, "app.module#AppModule"),
+ tsConfigPath: join(__dirname, "tsconfig.esm.json"),
+ skipCodeGeneration: !aot,
+ }),
+ // Does IPC communication with the {N} CLI to notify events when running in watch mode.
+ new nsWebpack.WatchStateLoggerPlugin(),
+ ],
+ };
+
+ if (report) {
+ // Generate report files for bundles content
+ config.plugins.push(new BundleAnalyzerPlugin({
+ analyzerMode: "static",
+ openAnalyzer: false,
+ generateStatsFile: true,
+ reportFilename: resolve(projectRoot, "report", `report.html`),
+ statsFilename: resolve(projectRoot, "report", `stats.json`),
+ }));
+ }
+
+ if (snapshot) {
+ config.plugins.push(new nsWebpack.NativeScriptSnapshotPlugin({
+ chunk: "vendor",
+ angular: true,
+ requireModules: [
+ "reflect-metadata",
+ "@angular/platform-browser",
+ "@angular/core",
+ "@angular/common",
+ "@angular/router",
+ "nativescript-angular/platform-static",
+ "nativescript-angular/router",
+ ],
+ projectRoot,
+ webpackConfig: config,
+ }));
+ }
+
+ return config;
+};
diff --git a/tests/regression/regression_tests_js.py b/tests/regression/regression_tests_js.py
index 194db275..21f85f8b 100644
--- a/tests/regression/regression_tests_js.py
+++ b/tests/regression/regression_tests_js.py
@@ -29,7 +29,7 @@ class RegressionTestsJS(BaseClass):
css_change = ['app/app.css', '18', '32']
target_app = os.path.join(TEST_RUN_HOME, BaseClass.app_name)
- source_app = os.path.join(TEST_RUN_HOME, 'data', 'apps', 'test-app-js-34')
+ source_app = os.path.join(TEST_RUN_HOME, 'data', 'apps', 'test-app-js-41')
@classmethod
def setUpClass(cls):
diff --git a/tests/regression/regression_tests_ng.py b/tests/regression/regression_tests_ng.py
index f57e9aee..a56ec10f 100644
--- a/tests/regression/regression_tests_ng.py
+++ b/tests/regression/regression_tests_ng.py
@@ -28,7 +28,7 @@ class RegressionTestsNG(BaseClass):
css_change = ['app/app.css', 'core.light.css', 'core.dark.css']
target_app = os.path.join(TEST_RUN_HOME, BaseClass.app_name)
- source_app = os.path.join(TEST_RUN_HOME, 'data', 'apps', 'test-app-ng-34')
+ source_app = os.path.join(TEST_RUN_HOME, 'data', 'apps', 'test-app-ng-41')
@classmethod
def setUpClass(cls):