From 3f7bf676ff4321d7c490099e3c72687ad68d46a2 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Tue, 6 Oct 2020 08:19:15 -0700 Subject: [PATCH 01/15] feat(webpack): angular configuration support for environment handling (#8938) --- .../webpack/helpers/angular-config-parser.js | 104 ++++++++++++++++++ packages/webpack/templates/webpack.angular.js | 22 +++- .../webpack/templates/webpack.config.spec.ts | 11 ++ 3 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 packages/webpack/helpers/angular-config-parser.js diff --git a/packages/webpack/helpers/angular-config-parser.js b/packages/webpack/helpers/angular-config-parser.js new file mode 100644 index 000000000..b664af14b --- /dev/null +++ b/packages/webpack/helpers/angular-config-parser.js @@ -0,0 +1,104 @@ +const { resolve } = require('path'); +const fs = require('fs'); + +const parseWorkspaceConfig = function(platform, envConfigs, projectName, debug) { + if (debug) { + console.log('-- config DEBUG ---'); + console.log('platform:', platform); + console.log('configuration:', envConfigs); + } + // configuration file replacements + const fileReplacements = {}; + // anything other than .ts files should be added as part of copy plugin + const copyReplacements = []; + if (hasConfigurations(envConfigs)) { + envConfigs = envConfigs.split(',').map(e => e.trim()); + + const configData = findConfig(__dirname); + const rootPath = configData.rootPath; + const workspaceConfig = configData.workspaceConfig; + + if (workspaceConfig && projectName) { + const projectSettings = workspaceConfig.projects[projectName]; + if (projectSettings) { + + // default project configurations + for (const envConfig of envConfigs) { + if (projectSettings.configurations && projectSettings.configurations[envConfig]) { + if (projectSettings.configurations[envConfig].fileReplacements) { + for (const fileReplace of projectSettings.configurations[envConfig].fileReplacements) { + if (debug) { + console.log('project fileReplacement:', fileReplace); + } + if (fileReplace.replace.indexOf('.ts') > -1) { + fileReplacements[resolve(__dirname, `${rootPath}${fileReplace.replace}`)] = resolve(__dirname, `${rootPath}${fileReplace.with}`); + } else { + copyReplacements.push({ from: resolve(__dirname, `${rootPath}${fileReplace.with}`), to: resolve(__dirname, `${rootPath}${fileReplace.replace}`), force: true }); + } + } + } + } + } + // platform specific configurations (always override top level project configurations) + for (const envConfig of envConfigs) { + if (projectSettings.architect && projectSettings.architect[platform]) { + const platformConfig = projectSettings.architect[platform].configurations; + if (platformConfig && platformConfig[envConfig] && platformConfig[envConfig].fileReplacements) { + for (const fileReplace of platformConfig[envConfig].fileReplacements) { + if (debug) { + console.log(`"${platform}" specific fileReplacement:`, fileReplace); + } + if (fileReplace.replace.indexOf('.ts') > -1) { + fileReplacements[resolve(__dirname, `${rootPath}${fileReplace.replace}`)] = resolve(__dirname, `${rootPath}${fileReplace.with}`); + } else { + copyReplacements.push({ from: resolve(__dirname, `${rootPath}${fileReplace.with}`), to: resolve(__dirname, `${rootPath}${fileReplace.replace}`), force: true }); + } + } + } + } + } + } + } + } + + if (debug && copyReplacements.length) { + console.log('Adding to CopyWebpackPlugin:', copyReplacements); + } + + return { + fileReplacements, + copyReplacements + }; +} + +const findConfig = function(projectDir, rootPath = '') { + // support workspace.json and angular.json configurations + const angularConfigName = 'angular.json'; + const angularConfig = resolve(projectDir, angularConfigName); + const workspaceConfigName = 'workspace.json'; + const workspaceConfig = resolve(projectDir, workspaceConfigName); + if (fs.existsSync(workspaceConfig)) { + return { + rootPath, + workspaceConfig: require(workspaceConfig) + }; + } else if (fs.existsSync(angularConfig)) { + return { + rootPath, + workspaceConfig: require(angularConfig) + }; + } else { + rootPath += '../'; + return findConfig(resolve(projectDir, '..'), rootPath); + } +} + +const hasConfigurations = function(envConfigs) { + return envConfigs && envConfigs !== 'undefined'; +} + +module.exports = { + parseWorkspaceConfig, + findConfig, + hasConfigurations +}; \ No newline at end of file diff --git a/packages/webpack/templates/webpack.angular.js b/packages/webpack/templates/webpack.angular.js index be7cba6ba..33088382a 100644 --- a/packages/webpack/templates/webpack.angular.js +++ b/packages/webpack/templates/webpack.angular.js @@ -8,6 +8,9 @@ const { nsSupportHmrNg } = require('@nativescript/webpack/transformers/ns-support-hmr-ng'); const { nsTransformNativeClassesNg } = require("@nativescript/webpack/transformers/ns-transform-native-classes-ng"); +const { + parseWorkspaceConfig, hasConfigurations +} = require('@nativescript/webpack/helpers/angular-config-parser'); const { getMainModulePath } = require('@nativescript/webpack/utils/ast-utils'); @@ -54,6 +57,8 @@ module.exports = env => { // You can provide the following flags when running 'tns run android|ios' snapshot, // --env.snapshot, production, // --env.production + configuration, // --env.configuration (consistent with angular cli usage) + projectName, // --env.projectName (drive configuration through angular projects) uglify, // --env.uglify report, // --env.report sourceMap, // --env.sourceMap @@ -68,20 +73,29 @@ module.exports = env => { compileSnapshot // --env.compileSnapshot } = env; + const { fileReplacements, copyReplacements } = parseWorkspaceConfig(platform, configuration, projectName); + const useLibs = compileSnapshot; const isAnySourceMapEnabled = !!sourceMap || !!hiddenSourceMap; const externals = nsWebpack.getConvertedExternals(env.externals); const appFullPath = resolve(projectRoot, appPath); const appResourcesFullPath = resolve(projectRoot, appResourcesPath); let tsConfigName = 'tsconfig.json'; - let tsConfigTnsName = 'tsconfig.tns.json'; let tsConfigPath = resolve(projectRoot, tsConfigName); + const tsConfigTnsName = 'tsconfig.tns.json'; const tsConfigTnsPath = resolve(projectRoot, tsConfigTnsName); if (fs.existsSync(tsConfigTnsPath)) { - // still support shared angular app configurations + // support shared angular app configurations tsConfigName = tsConfigTnsName; tsConfigPath = tsConfigTnsPath; } + const tsConfigEnvName = 'tsconfig.env.json'; + const tsConfigEnvPath = resolve(projectRoot, tsConfigEnvName); + if (hasConfigurations(configuration) && fs.existsSync(tsConfigEnvPath)) { + // when configurations are used, switch to environments supported config + tsConfigName = tsConfigEnvName; + tsConfigPath = tsConfigEnvPath; + } const entryModule = `${nsWebpack.getEntryModule(appFullPath, platform)}.ts`; const entryPath = `.${sep}${entryModule}`; const entries = { bundle: entryPath }; @@ -104,6 +118,7 @@ module.exports = env => { const copyTargets = [ { from: 'assets/**', noErrorOnMissing: true, globOptions: { dot: false, ...copyIgnore } }, { from: 'fonts/**', noErrorOnMissing: true, globOptions: { dot: false, ...copyIgnore } }, + ...copyReplacements ]; if (!production) { @@ -217,7 +232,8 @@ module.exports = env => { '~/package.json': resolve(projectRoot, 'package.json'), '~': appFullPath, "tns-core-modules": "@nativescript/core", - "nativescript-angular": "@nativescript/angular" + "nativescript-angular": "@nativescript/angular", + ...fileReplacements }, symlinks: true }, diff --git a/packages/webpack/templates/webpack.config.spec.ts b/packages/webpack/templates/webpack.config.spec.ts index 595957968..9e59dd2f3 100644 --- a/packages/webpack/templates/webpack.config.spec.ts +++ b/packages/webpack/templates/webpack.config.spec.ts @@ -57,6 +57,17 @@ const webpackConfigAngular = proxyquire('./webpack.angular', { return FakeNativeClassTransformerFlag; }, }, + '@nativescript/webpack/helpers/angular-config-parser': { + parseWorkspaceConfig: (platform, envConfigs, rootPath = '') => { + return { + fileReplacements: {}, + copyReplacements: [], + }; + }, + hasConfigurations: (envConfigs) => { + return false; + } + }, '@nativescript/webpack/utils/ast-utils': { getMainModulePath: () => { return 'fakePath'; From db5db5ef7e3edbdf9140e3e35fb449df42532fad Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Tue, 6 Oct 2020 08:51:36 -0700 Subject: [PATCH 02/15] chore(release): @nativescript/webpack@3.0.6 --- packages/webpack/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webpack/package.json b/packages/webpack/package.json index 408d23b13..fc7fc41aa 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "3.0.5", + "version": "3.0.6", "main": "index", "description": "Webpack plugin for NativeScript", "homepage": "https://nativescript.org", From ee05b4466336858bd7e2dcb651deb15ba74fc8c2 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Tue, 6 Oct 2020 16:28:35 -0700 Subject: [PATCH 03/15] feat(webpack): angular configuration schema validation compliance --- .../webpack/helpers/angular-config-parser.js | 23 +++++++++++-------- packages/webpack/package.json | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/webpack/helpers/angular-config-parser.js b/packages/webpack/helpers/angular-config-parser.js index b664af14b..b96be3a2a 100644 --- a/packages/webpack/helpers/angular-config-parser.js +++ b/packages/webpack/helpers/angular-config-parser.js @@ -24,16 +24,19 @@ const parseWorkspaceConfig = function(platform, envConfigs, projectName, debug) // default project configurations for (const envConfig of envConfigs) { - if (projectSettings.configurations && projectSettings.configurations[envConfig]) { - if (projectSettings.configurations[envConfig].fileReplacements) { - for (const fileReplace of projectSettings.configurations[envConfig].fileReplacements) { - if (debug) { - console.log('project fileReplacement:', fileReplace); - } - if (fileReplace.replace.indexOf('.ts') > -1) { - fileReplacements[resolve(__dirname, `${rootPath}${fileReplace.replace}`)] = resolve(__dirname, `${rootPath}${fileReplace.with}`); - } else { - copyReplacements.push({ from: resolve(__dirname, `${rootPath}${fileReplace.with}`), to: resolve(__dirname, `${rootPath}${fileReplace.replace}`), force: true }); + if (projectSettings.architect.default && projectSettings.architect.default.configurations) { + const defaultConfigurations = projectSettings.architect.default.configurations; + if (defaultConfigurations && defaultConfigurations[envConfig]) { + if (defaultConfigurations[envConfig].fileReplacements) { + for (const fileReplace of defaultConfigurations[envConfig].fileReplacements) { + if (debug) { + console.log('project fileReplacement:', fileReplace); + } + if (fileReplace.replace.indexOf('.ts') > -1) { + fileReplacements[resolve(__dirname, `${rootPath}${fileReplace.replace}`)] = resolve(__dirname, `${rootPath}${fileReplace.with}`); + } else { + copyReplacements.push({ from: resolve(__dirname, `${rootPath}${fileReplace.with}`), to: resolve(__dirname, `${rootPath}${fileReplace.replace}`), force: true }); + } } } } diff --git a/packages/webpack/package.json b/packages/webpack/package.json index fc7fc41aa..8d41314a6 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "3.0.6", + "version": "3.0.7", "main": "index", "description": "Webpack plugin for NativeScript", "homepage": "https://nativescript.org", From 6a24061f544d316d4e14f2ab3828719827c95c04 Mon Sep 17 00:00:00 2001 From: Nathanael Anderson Date: Fri, 9 Oct 2020 21:14:27 -0500 Subject: [PATCH 04/15] chore: Update License --- LICENSE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 061c44028..451412229 100755 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright (c) 2015-2019 Progress Software Corporation + Copyright (c) 2020, nStudio, LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -198,4 +198,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. From ad2575991aa53c1a1806dfd5dc5e368e1674d73c Mon Sep 17 00:00:00 2001 From: Nathanael Anderson Date: Sat, 10 Oct 2020 11:34:44 -0500 Subject: [PATCH 05/15] fix(ios): iOS 10 support with adjustment to UILayoutGuide (#8954) --- packages/core/ui/core/view/view-helper/index.ios.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/ui/core/view/view-helper/index.ios.ts b/packages/core/ui/core/view/view-helper/index.ios.ts index 6801ee879..a53ec6f5d 100644 --- a/packages/core/ui/core/view/view-helper/index.ios.ts +++ b/packages/core/ui/core/view/view-helper/index.ios.ts @@ -201,7 +201,7 @@ export class IOSHelper { static initLayoutGuide(controller: UIViewController) { const rootView = controller.view; - const layoutGuide = UILayoutGuide.alloc().init(); + const layoutGuide = UILayoutGuide.new(); rootView.addLayoutGuide(layoutGuide); NSLayoutConstraint.activateConstraints([layoutGuide.topAnchor.constraintEqualToAnchor(controller.topLayoutGuide.bottomAnchor), layoutGuide.bottomAnchor.constraintEqualToAnchor(controller.bottomLayoutGuide.topAnchor), layoutGuide.leadingAnchor.constraintEqualToAnchor(rootView.leadingAnchor), layoutGuide.trailingAnchor.constraintEqualToAnchor(rootView.trailingAnchor)]); From 5be39082e118dbc08ca734794a4acbf6d25fbecf Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Sat, 10 Oct 2020 09:39:44 -0700 Subject: [PATCH 06/15] chore(release): @nativescript/core@7.0.11 --- CHANGELOG.md | 15 +++++++++++++++ packages/core/package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 493fe2aea..0d201a54c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## [7.0.10](https://github.com/NativeScript/NativeScript/compare/7.0.10-core...7.0.10) (2020-10-10) + + +### Bug Fixes + +* **ios:** iOS 10 support with adjustment to UILayoutGuide ([#8954](https://github.com/NativeScript/NativeScript/issues/8954)) ([ad25759](https://github.com/NativeScript/NativeScript/commit/ad2575991aa53c1a1806dfd5dc5e368e1674d73c)) + + +### Features + +* **webpack:** angular configuration schema validation compliance ([ee05b44](https://github.com/NativeScript/NativeScript/commit/ee05b4466336858bd7e2dcb651deb15ba74fc8c2)) +* **webpack:** angular configuration support for environment handling ([#8938](https://github.com/NativeScript/NativeScript/issues/8938)) ([3f7bf67](https://github.com/NativeScript/NativeScript/commit/3f7bf676ff4321d7c490099e3c72687ad68d46a2)) + + + ## [7.0.10](https://github.com/NativeScript/NativeScript/compare/7.0.9-core...7.0.10) (2020-10-03) diff --git a/packages/core/package.json b/packages/core/package.json index fde515bb3..9afe0deb4 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,7 @@ "main": "index", "types": "index.d.ts", "description": "NativeScript Core Modules", - "version": "7.0.10", + "version": "7.0.11", "homepage": "https://nativescript.org", "repository": { "type": "git", From 32404246a15d5a76f35a4436172e27590b8e1bef Mon Sep 17 00:00:00 2001 From: Nathanael Anderson Date: Tue, 13 Oct 2020 14:42:46 -0500 Subject: [PATCH 07/15] chore: update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 5ef9b1bb0..810b02be0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,6 +12,7 @@ Provide version numbers for the following components (information can be retriev - Cross-platform modules: - Android Runtime: - iOS Runtime: + - XCode Version: - Plugin(s): **Describe the bug** From 0afea8681c62071823804f392ab8d595e61190ff Mon Sep 17 00:00:00 2001 From: Janos Hrubos <33330538+janoshrubos@users.noreply.github.com> Date: Sat, 17 Oct 2020 21:31:20 +0200 Subject: [PATCH 08/15] feat(webpack): add svelte support (#8963) --- .../webpack/helpers/projectFilesManager.js | 12 +- packages/webpack/helpers/projectHelpers.js | 10 +- .../webpack/templates/webpack.config.spec.ts | 8 +- packages/webpack/templates/webpack.svelte.js | 364 ++++++++++++++++++ 4 files changed, 387 insertions(+), 7 deletions(-) create mode 100644 packages/webpack/templates/webpack.svelte.js diff --git a/packages/webpack/helpers/projectFilesManager.js b/packages/webpack/helpers/projectFilesManager.js index 28fbcbf6b..856c80b1e 100644 --- a/packages/webpack/helpers/projectFilesManager.js +++ b/packages/webpack/helpers/projectFilesManager.js @@ -1,7 +1,7 @@ const path = require("path"); const fs = require("fs"); -const { isTypeScript, isAngular, isVue, isReact, isShared, isPlugin } = require("./projectHelpers"); +const { isTypeScript, isAngular, isVue, isReact, isSvelte, isShared, isPlugin } = require("./projectHelpers"); function addProjectFiles(projectDir) { const projectTemplates = getProjectTemplates(projectDir); @@ -73,6 +73,8 @@ function getProjectTemplates(projectDir) { templates = getVueTemplates(WEBPACK_CONFIG_NAME); } else if (isReact({ projectDir })) { templates = getReactTemplates(WEBPACK_CONFIG_NAME); + } else if (isSvelte({ projectDir })) { + templates = getSvelteTemplates(WEBPACK_CONFIG_NAME); } else if (isTypeScript({ projectDir })) { templates = getTypeScriptTemplates(WEBPACK_CONFIG_NAME); } else { @@ -113,6 +115,12 @@ function getReactTemplates(webpackConfigName) { }; } +function getSvelteTemplates(webpackConfigName) { + return { + "webpack.svelte.js": webpackConfigName + }; +} + function getJavaScriptTemplates(webpackConfigName) { return { "webpack.javascript.js": webpackConfigName, @@ -141,4 +149,4 @@ module.exports = { removeProjectFiles, forceUpdateProjectFiles, compareProjectFiles, -}; \ No newline at end of file +}; diff --git a/packages/webpack/helpers/projectHelpers.js b/packages/webpack/helpers/projectHelpers.js index 57b6105cd..77bd60804 100644 --- a/packages/webpack/helpers/projectHelpers.js +++ b/packages/webpack/helpers/projectHelpers.js @@ -51,6 +51,13 @@ const isReact = ({ projectDir, packageJson } = {}) => { .some(dependency => dependency === "react-nativescript"); }; +const isSvelte = ({ projectDir, packageJson } = {}) => { + packageJson = packageJson || getPackageJson(projectDir); + + return packageJson.dependencies && Object.keys(packageJson.dependencies) + .some(dependency => dependency === "svelte-native"); +}; + const getPackageJson = projectDir => { const packageJsonPath = getPackageJsonPath(projectDir); const result = readJsonFile(packageJsonPath); @@ -102,7 +109,7 @@ const getPackageJsonPath = projectDir => { } else { return getPackageJsonPath(resolve(projectDir, '..')); } - + } const getNsConfigPath = projectDir => resolve(projectDir, "nsconfig.json"); @@ -145,6 +152,7 @@ module.exports = { getAngularVersion, isVue, isReact, + isSvelte, isTypeScript, writePackageJson, convertSlashesInPath, diff --git a/packages/webpack/templates/webpack.config.spec.ts b/packages/webpack/templates/webpack.config.spec.ts index 9e59dd2f3..84de508a4 100644 --- a/packages/webpack/templates/webpack.config.spec.ts +++ b/packages/webpack/templates/webpack.config.spec.ts @@ -63,10 +63,10 @@ const webpackConfigAngular = proxyquire('./webpack.angular', { fileReplacements: {}, copyReplacements: [], }; - }, - hasConfigurations: (envConfigs) => { - return false; - } + }, + hasConfigurations: (envConfigs) => { + return false; + }, }, '@nativescript/webpack/utils/ast-utils': { getMainModulePath: () => { diff --git a/packages/webpack/templates/webpack.svelte.js b/packages/webpack/templates/webpack.svelte.js new file mode 100644 index 000000000..7013c4522 --- /dev/null +++ b/packages/webpack/templates/webpack.svelte.js @@ -0,0 +1,364 @@ +const { join, relative, resolve, sep } = require("path"); +const fs = require('fs'); + +const webpack = require("webpack"); +const nsWebpack = require("@nativescript/webpack"); +const nativescriptTarget = require("@nativescript/webpack/nativescript-target"); +const { getNoEmitOnErrorFromTSConfig } = require("@nativescript/webpack/utils/tsconfig-utils"); +const { CleanWebpackPlugin } = require("clean-webpack-plugin"); +const CopyWebpackPlugin = require("copy-webpack-plugin"); +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); +const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer"); +const { NativeScriptWorkerPlugin } = require("nativescript-worker-loader/NativeScriptWorkerPlugin"); +const TerserPlugin = require("terser-webpack-plugin"); +const hashSalt = Date.now().toString(); +const preprocessConfig = require("./svelte.config.js"); +const svelteNativePreprocessor = require("svelte-native-preprocessor"); + +module.exports = env => { + // Add your custom Activities, Services and other Android app components here. + const appComponents = env.appComponents || []; + appComponents.push(...[ + "@nativescript/core/ui/frame", + "@nativescript/core/ui/frame/activity", + ]); + + const platform = env && (env.android && "android" || env.ios && "ios" || env.platform); + if (!platform) { + throw new Error("You need to provide a target platform!"); + } + + const platforms = ["ios", "android"]; + const projectRoot = __dirname; + + if (env.platform) { + platforms.push(env.platform); + } + + // Default destination inside platforms//... + const dist = resolve(projectRoot, nsWebpack.getAppPath(platform, projectRoot)); + + const { + // The 'appPath' and 'appResourcesPath' values are fetched from + // the nsconfig.json configuration file. + appPath = "src", + appResourcesPath = "App_Resources", + + // You can provide the following flags when running 'tns run android|ios' + snapshot, // --env.snapshot + production, // --env.production + uglify, // --env.uglify + report, // --env.report + sourceMap, // --env.sourceMap + hiddenSourceMap, // --env.hiddenSourceMap + hmr, // --env.hmr, + unitTesting, // --env.unitTesting, + testing, // --env.testing + verbose, // --env.verbose + snapshotInDocker, // --env.snapshotInDocker + skipSnapshotTools, // --env.skipSnapshotTools + compileSnapshot // --env.compileSnapshot + } = env; + + const useLibs = compileSnapshot; + const isAnySourceMapEnabled = !!sourceMap || !!hiddenSourceMap; + const externals = nsWebpack.getConvertedExternals(env.externals); + + let appFullPath = resolve(projectRoot, appPath); + if (!fs.existsSync(appFullPath)) { + // some apps use 'app' directory + appFullPath = resolve(projectRoot, 'app'); + } + const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot }); + let coreModulesPackageName = "tns-core-modules"; + const alias = env.alias || {}; + alias['~/package.json'] = resolve(projectRoot, 'package.json'); + alias['~'] = appFullPath; + + if (hasRootLevelScopedModules) { + coreModulesPackageName = "@nativescript/core"; + alias["tns-core-modules"] = coreModulesPackageName; + } + const appResourcesFullPath = resolve(projectRoot, appResourcesPath); + + const copyIgnore = { ignore: [`${relative(appPath, appResourcesFullPath)}/**`] }; + + const entryModule = nsWebpack.getEntryModule(appFullPath, platform); + const entryPath = `.${sep}${entryModule}.ts`; + const entries = env.entries || {}; + entries.bundle = entryPath; + + const tsConfigPath = resolve(projectRoot, "tsconfig.json"); + + const areCoreModulesExternal = Array.isArray(env.externals) && env.externals.some(e => e.indexOf("@nativescript") > -1); + if (platform === "ios" && !areCoreModulesExternal && !testing) { + entries["tns_modules/@nativescript/core/inspector_modules"] = "inspector_modules"; + }; + + let sourceMapFilename = nsWebpack.getSourceMapFilename(hiddenSourceMap, __dirname, dist); + + const itemsToClean = [`${dist}/**/*`]; + if (platform === "android") { + itemsToClean.push(`${join(projectRoot, "platforms", "android", "app", "src", "main", "assets", "snapshots")}`); + itemsToClean.push(`${join(projectRoot, "platforms", "android", "app", "build", "configurations", "nativescript-android-snapshot")}`); + } + + const noEmitOnErrorFromTSConfig = getNoEmitOnErrorFromTSConfig(tsConfigPath); + + nsWebpack.processAppComponents(appComponents, platform); + const config = { + mode: production ? "production" : "development", + context: appFullPath, + externals, + watchOptions: { + ignored: [ + appResourcesFullPath, + // Don't watch hidden files + "**/.*", + ] + }, + target: nativescriptTarget, + entry: entries, + output: { + pathinfo: false, + path: dist, + sourceMapFilename, + libraryTarget: "commonjs2", + filename: "[name].js", + globalObject: "global", + hashSalt + }, + resolve: { + extensions: [".ts", ".mjs", ".js", ".svelte", ".scss", ".css"], + // Resolve {N} system modules from @nativescript/core + modules: [ + resolve(__dirname, `node_modules/${coreModulesPackageName}`), + resolve(__dirname, "node_modules"), + `node_modules/${coreModulesPackageName}`, + "node_modules", + ], + alias, + // resolve symlinks to symlinked modules + symlinks: true + }, + 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: hiddenSourceMap ? "hidden-source-map" : (sourceMap ? "inline-source-map" : "none"), + optimization: { + runtimeChunk: "single", + noEmitOnErrors: noEmitOnErrorFromTSConfig, + 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 TerserPlugin({ + parallel: true, + cache: true, + sourceMap: isAnySourceMapEnabled, + terserOptions: { + output: { + comments: false, + semicolons: !isAnySourceMapEnabled + }, + compress: { + // The Android SBG has problems parsing the output + // when these options are enabled + 'collapse_vars': platform !== "android", + sequences: platform !== "android", + } + } + }) + ], + }, + module: { + rules: [ + { + include: join(appFullPath, entryPath), + use: [ + // Require all Android app components + platform === "android" && { + loader: "@nativescript/webpack/helpers/android-app-components-loader", + options: { modules: appComponents } + }, + + { + loader: "@nativescript/webpack/bundle-config-loader", + options: { + loadCss: !snapshot, // load the application css if in debug mode + unitTesting, + appFullPath, + projectRoot, + ignoredFiles: nsWebpack.getUserDefinedEntries(entries, platform) + } + }, + ].filter(loader => !!loader) + }, + + { + test: /\.(ts|css|scss|html|xml)$/, + use: "@nativescript/webpack/hmr/hot-loader" + }, + + { test: /\.(html|xml)$/, use: "@nativescript/webpack/helpers/xml-namespace-loader" }, + + { + test: /\.css$/, + use: "@nativescript/webpack/helpers/css2json-loader" + }, + + { + test: /\.scss$/, + use: [ + "@nativescript/webpack/helpers/css2json-loader", + "sass-loader" + ] + }, + + { + test: /\.mjs$/, + type: 'javascript/auto', + }, + { + test: /\.ts$/, + use: { + loader: "ts-loader", + options: { + configFile: tsConfigPath, + // https://github.com/TypeStrong/ts-loader/blob/ea2fcf925ec158d0a536d1e766adfec6567f5fb4/README.md#faster-builds + // https://github.com/TypeStrong/ts-loader/blob/ea2fcf925ec158d0a536d1e766adfec6567f5fb4/README.md#hot-module-replacement + transpileOnly: true, + allowTsInNodeModules: true, + compilerOptions: { + sourceMap: isAnySourceMapEnabled, + declaration: false + }, + getCustomTransformers: (program) => ({ + before: [ + require("@nativescript/webpack/transformers/ns-transform-native-classes").default + ] + }) + }, + } + }, + { + test: /\.svelte$/, + exclude: /node_modules/, + use: [ + { + loader: 'svelte-loader-hot', + options: { + dev: env.production ? false : true, + preprocess: [preprocessConfig.preprocess, svelteNativePreprocessor()], + hotReload: env.production ? false : true, + hotOptions: { + injectCss: false, + native: true + } + } + } + ] + } + ] + }, + plugins: [ + // Define useful constants like TNS_WEBPACK + new webpack.DefinePlugin({ + "global.TNS_WEBPACK": "true", + "global.isAndroid": platform === 'android', + "global.isIOS": platform === 'ios', + "process": "global.process", + }), + // Remove all files from the out dir. + new CleanWebpackPlugin({ + cleanOnceBeforeBuildPatterns: itemsToClean, + verbose: !!verbose + }), + // Copy assets + new CopyWebpackPlugin({ + patterns: [ + { from: 'assets/**', noErrorOnMissing: true, globOptions: { dot: false, ...copyIgnore } }, + { from: 'fonts/**', noErrorOnMissing: true, globOptions: { dot: false, ...copyIgnore } }, + { from: '**/*.jpg', noErrorOnMissing: true, globOptions: { dot: false, ...copyIgnore } }, + { from: '**/*.png', noErrorOnMissing: true, globOptions: { dot: false, ...copyIgnore } }, + ], + }), + new nsWebpack.GenerateNativeScriptEntryPointsPlugin("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(), + // https://github.com/TypeStrong/ts-loader/blob/ea2fcf925ec158d0a536d1e766adfec6567f5fb4/README.md#faster-builds + // https://github.com/TypeStrong/ts-loader/blob/ea2fcf925ec158d0a536d1e766adfec6567f5fb4/README.md#hot-module-replacement + new ForkTsCheckerWebpackPlugin({ + async: false, + typescript: { + configFile: tsConfigPath, + memoryLimit: 4096, + diagnosticOptions: { + syntactic: true, + semantic: true + } + } + }) + ], + }; + + 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: [ + "@nativescript/core/bundle-entry-points", + ], + projectRoot, + webpackConfig: config, + snapshotInDocker, + skipSnapshotTools, + useLibs + })); + } + + if (hmr) { + config.plugins.push(new webpack.HotModuleReplacementPlugin()); + } + + return config; +}; From 5c1b7f6d76c19877da1f47a0696dfbbd89b5fd00 Mon Sep 17 00:00:00 2001 From: Nathanael Anderson Date: Sat, 17 Oct 2020 18:07:03 -0500 Subject: [PATCH 09/15] fix(core): ObservableArray tests and a typo (#8968) --- .../src/data/observable-array-tests.ts | 101 ++++++++++++++++++ packages/core/data/observable-array/index.ts | 17 ++- .../core/ui/text-base/formatted-string.ts | 2 +- 3 files changed, 117 insertions(+), 3 deletions(-) diff --git a/apps/automated/src/data/observable-array-tests.ts b/apps/automated/src/data/observable-array-tests.ts index 3c4d0e8b9..1d41cb036 100644 --- a/apps/automated/src/data/observable-array-tests.ts +++ b/apps/automated/src/data/observable-array-tests.ts @@ -360,6 +360,85 @@ export const test_ObservableArray_spliceShouldRemoveSpecifiedNumberOfElementsSta export const test_ObservableArray_spliceShouldRemoveSpecifiedNumberOfElementsStartingFromSpecifiedIndexAndRaiseChangeEventWithCorrectArgs = function () { let result: ChangedData; + // >> observable-array-splice-change + const array = new ObservableArray([1, 2, 3, 4]); + + array.on(ObservableArray.changeEvent, (args: ChangedData) => { + // Argument (args) is ChangedData. + // args.eventName is "change". + // args.action is "splice". + // args.index is the start index. + // args.removed.length is equal to the number of deleted items. + // args.addedCount is 0. + + // >> (hide) + result = args; + // << (hide) + }); + + array.splice(1, 2); + // << observable-array-splice-change + + TKUnit.assert(result.eventName === ObservableArray.changeEvent && result.action === ChangeType.Splice && result.removed.length === 2 && result.index === 1 && result.addedCount === 0, "ObservableArray splice() should raise 'change' event with correct args!"); +}; + +export const test_ObservableArray_spliceShouldAddSpecifiedNumberOfElementsStartingFromSpecifiedIndexAndRaiseChangeEventWithCorrectArgs = function () { + let result: ChangedData; + + // >> observable-array-splice-change + const array = new ObservableArray([0]); + + array.on(ObservableArray.changeEvent, (args: ChangedData) => { + // Argument (args) is ChangedData. + // args.eventName is "change". + // args.action is "splice". + // args.index is the start index. + // args.removed.length is equal to the number of deleted items. + // args.addedCount is 0. + + // >> (hide) + result = args; + // << (hide) + }); + + // Because their is only one item in the above array the item index should be + // normalized to Index 1. + array.splice(2, 0, 1); + // << observable-array-splice-change + + TKUnit.assert(result.eventName === ObservableArray.changeEvent && result.action === ChangeType.Splice && result.removed.length === 0 && result.index === 1 && result.addedCount === 1, "ObservableArray splice() should raise 'change' event with correct args!"); +}; + +export const test_ObservableArray_spliceShouldAddDeleteSpecifiedNumberOfElementsStartingFromSpecifiedIndexAndRaiseChangeEventWithCorrectArgs = function () { + let result: ChangedData; + + // >> observable-array-splice-change + const array = new ObservableArray([0]); + + array.on(ObservableArray.changeEvent, (args: ChangedData) => { + // Argument (args) is ChangedData. + // args.eventName is "change". + // args.action is "splice". + // args.index is the start index. + // args.removed.length is equal to the number of deleted items. + // args.addedCount is 1. + + // >> (hide) + result = args; + // << (hide) + }); + + // Because we are starting at index 2, their is NOTHING to delete + // So the Starting index should actually be normalized to Index 1 + array.splice(2, 2, 1); + // << observable-array-splice-change + + TKUnit.assert(result.eventName === ObservableArray.changeEvent && result.action === ChangeType.Splice && result.removed.length === 0 && result.index === 1 && result.addedCount === 1, "ObservableArray splice() should raise 'change' event with correct args!"); +}; + +export const test_ObservableArray_spliceShouldRemoveSpecifiedNumberOfElementsStartingFromSpecifiedIndexAndRaiseChangeEventWithCorrectedArgs = function () { + let result: ChangedData; + // >> observable-array-splice-change const array = new ObservableArray([1, 2, 3]); @@ -526,6 +605,28 @@ export const test_ObservableArray_settingLengthToSomethingPerformsSplice = funct TKUnit.assertTrue(changeRaised); }; +export const test_ObservableArray_settingLengthToSomethingPerformsSpliceAdded = function () { + const array = new ObservableArray([1, 2, 3]); + let changeRaised = false; + + array.on('change', (args: ChangedData) => { + changeRaised = true; + TKUnit.assertEqual(args.object, array); + TKUnit.assertEqual(args.eventName, 'change'); + TKUnit.assertEqual(args.action, ChangeType.Splice); + + // Because the array only has 3 elements, the index it starts the change at is #2 + TKUnit.assertEqual(args.index, 3); + TKUnit.assertEqual(args.addedCount, 2); + TKUnit.arrayAssert(args.removed, []); + }); + + array.length = 5; + + TKUnit.assertEqual(array.length, 5); + TKUnit.assertTrue(changeRaised); +}; + const array = new ObservableArray(); // We do not have indexer! diff --git a/packages/core/data/observable-array/index.ts b/packages/core/data/observable-array/index.ts index 6f1123e19..1ad212a9c 100644 --- a/packages/core/data/observable-array/index.ts +++ b/packages/core/data/observable-array/index.ts @@ -32,6 +32,7 @@ export interface ChangedData extends EventData { * Number of added items. */ addedCount: number; + } const CHANGE = 'change'; @@ -113,7 +114,11 @@ export class ObservableArray extends Observable { set length(value: number) { if (types.isNumber(value) && this._array && this._array.length !== value) { - this.splice(value, this._array.length - value); + let added=[]; + for (let i=this._array.length;i < value;++i) { + added.push(undefined); + } + this.splice(value, this._array.length - value, ...added); } } @@ -246,7 +251,15 @@ export class ObservableArray extends Observable { eventName: CHANGE, object: this, action: ChangeType.Splice, - index: Math.max(Math.min(start, this._array.length-1), 0), + + // The logic here is a bit weird; so lets explain why it is written this way + // First of all, if you ADD any items to the array, we want the index to point to + // the first value of the index, so this fixes it when you put a value to high in + // If you remove items from the array, then the index needs to point to the INDEX + // where you removed the item. + // If you add and remove items, the index will point to the remove location as that + // is the index you passed in. + index: Math.max(Math.min(start, length - (result.length > 0 ? 1 : 0)), 0), removed: result, addedCount: this._array.length + result.length - length, }); diff --git a/packages/core/ui/text-base/formatted-string.ts b/packages/core/ui/text-base/formatted-string.ts index 96f5401f3..1251df8dc 100644 --- a/packages/core/ui/text-base/formatted-string.ts +++ b/packages/core/ui/text-base/formatted-string.ts @@ -103,7 +103,7 @@ export class FormattedString extends ViewBase implements FormattedStringDefiniti // First add to logical tree so that inherited properties are set. this._addView(span); - // Then attach handlers - we skip the first nofitication because + // Then attach handlers - we skip the first notification because // we raise change for the whole instance. this.addPropertyChangeHandler(span); } From 99bb067420871078c40454eec842fad6cbede0f7 Mon Sep 17 00:00:00 2001 From: DimitrisRK Date: Mon, 19 Oct 2020 01:44:27 +0300 Subject: [PATCH 10/15] fix(android): BottomNavigation error on back press (application exit) (#8970) --- packages/core/ui/frame/index.android.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/core/ui/frame/index.android.ts b/packages/core/ui/frame/index.android.ts index 91cd68408..bc635bbb9 100644 --- a/packages/core/ui/frame/index.android.ts +++ b/packages/core/ui/frame/index.android.ts @@ -954,10 +954,13 @@ class FragmentCallbacksImplementation implements AndroidFragmentCallbacks { const hasRemovingParent = fragment.getRemovingParentFragment(); if (hasRemovingParent) { - const bitmapDrawable = new android.graphics.drawable.BitmapDrawable(application.android.context.getResources(), this.backgroundBitmap); - this.frame._originalBackground = this.frame.backgroundColor || new Color('White'); - this.frame.nativeViewProtected.setBackgroundDrawable(bitmapDrawable); - this.backgroundBitmap = null; + const nativeFrameView = this.frame.nativeViewProtected; + if (nativeFrameView) { + const bitmapDrawable = new android.graphics.drawable.BitmapDrawable(application.android.context.getResources(), this.backgroundBitmap); + this.frame._originalBackground = this.frame.backgroundColor || new Color('White'); + nativeFrameView.setBackgroundDrawable(bitmapDrawable); + this.backgroundBitmap = null; + } } } finally { superFunc.call(fragment); From 2243660080ce6877d68a3f32fd64625f86023f77 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 19 Oct 2020 09:28:05 -0700 Subject: [PATCH 11/15] feat(core): TypeScript 4 + cleanup (#8967) --- .eslintrc | 42 - .eslintrc.json | 40 + .github/workflows/npm_release.yml | 2 +- .vscode/extensions.json | 8 + apps/toolbox/package.json | 8 +- apps/ui/package.json | 10 +- jest.config.js | 8 +- jest.preset.js | 11 + migrations.json | 109 ++- nx.json | 92 ++- package.json | 143 ++-- packages/core-compat/.npmignore | 4 - packages/core-compat/README.md | 3 - .../application-settings.d.ts | 1 - .../application-settings.js | 2 - .../application-settings.ts | 1 - .../application-settings/index.d.ts | 1 - .../core-compat/application-settings/index.js | 2 - .../core-compat/application-settings/index.ts | 1 - .../core-compat/application/application.d.ts | 1 - .../core-compat/application/application.js | 2 - .../core-compat/application/application.ts | 1 - packages/core-compat/application/index.d.ts | 1 - packages/core-compat/application/index.js | 2 - packages/core-compat/application/index.ts | 1 - packages/core-compat/bundle-entry-points.d.ts | 1 - packages/core-compat/bundle-entry-points.js | 2 - packages/core-compat/bundle-entry-points.ts | 2 - packages/core-compat/color/color.d.ts | 1 - packages/core-compat/color/color.js | 2 - packages/core-compat/color/color.ts | 1 - packages/core-compat/color/index.d.ts | 1 - packages/core-compat/color/index.js | 2 - packages/core-compat/color/index.ts | 1 - .../core-compat/data/observable/index.d.ts | 1 - packages/core-compat/data/observable/index.js | 2 - packages/core-compat/data/observable/index.ts | 1 - .../data/observable/observable.d.ts | 1 - .../core-compat/data/observable/observable.js | 2 - .../core-compat/data/observable/observable.ts | 1 - .../core-compat/file-system/file-system.d.ts | 1 - .../core-compat/file-system/file-system.js | 2 - .../core-compat/file-system/file-system.ts | 1 - packages/core-compat/file-system/index.d.ts | 1 - packages/core-compat/file-system/index.js | 2 - packages/core-compat/file-system/index.ts | 1 - packages/core-compat/http/http.d.ts | 1 - packages/core-compat/http/http.js | 2 - packages/core-compat/http/http.ts | 1 - packages/core-compat/http/index.d.ts | 1 - packages/core-compat/http/index.js | 2 - packages/core-compat/http/index.ts | 1 - .../core-compat/image-asset/image-asset.d.ts | 1 - .../core-compat/image-asset/image-asset.js | 2 - .../core-compat/image-asset/image-asset.ts | 1 - packages/core-compat/image-asset/index.d.ts | 1 - packages/core-compat/image-asset/index.js | 2 - packages/core-compat/image-asset/index.ts | 1 - .../image-source/image-source.d.ts | 1 - .../core-compat/image-source/image-source.js | 2 - .../core-compat/image-source/image-source.ts | 1 - packages/core-compat/image-source/index.d.ts | 1 - packages/core-compat/image-source/index.js | 2 - packages/core-compat/image-source/index.ts | 1 - packages/core-compat/inspector_modules.js | 7 - packages/core-compat/package.json | 25 - packages/core-compat/platform/index.d.ts | 1 - packages/core-compat/platform/index.js | 2 - packages/core-compat/platform/index.ts | 1 - packages/core-compat/platform/platform.d.ts | 1 - packages/core-compat/platform/platform.js | 2 - packages/core-compat/platform/platform.ts | 1 - packages/core-compat/profiling/index.d.ts | 1 - packages/core-compat/profiling/index.js | 2 - packages/core-compat/profiling/index.ts | 1 - packages/core-compat/profiling/profiling.d.ts | 1 - packages/core-compat/profiling/profiling.js | 2 - packages/core-compat/profiling/profiling.ts | 1 - packages/core-compat/tns-core-modules.d.ts | 1 - packages/core-compat/trace/index.d.ts | 1 - packages/core-compat/trace/index.js | 2 - packages/core-compat/trace/index.ts | 1 - packages/core-compat/trace/trace.d.ts | 21 - packages/core-compat/trace/trace.js | 23 - packages/core-compat/trace/trace.ts | 22 - packages/core-compat/tsconfig.json | 30 - packages/core-compat/ui/core/index.d.ts | 1 - packages/core-compat/ui/core/index.js | 2 - packages/core-compat/ui/core/index.ts | 1 - packages/core-compat/ui/core/view/index.d.ts | 1 - packages/core-compat/ui/core/view/index.js | 2 - packages/core-compat/ui/core/view/index.ts | 1 - packages/core-compat/ui/core/view/view.d.ts | 1 - packages/core-compat/ui/core/view/view.js | 2 - packages/core-compat/ui/core/view/view.ts | 1 - .../core-compat/ui/frame/activity.android.js | 7 - packages/core-compat/ui/frame/frame.d.ts | 1 - packages/core-compat/ui/frame/frame.js | 2 - packages/core-compat/ui/frame/frame.ts | 1 - packages/core-compat/ui/frame/index.d.ts | 1 - packages/core-compat/ui/frame/index.js | 2 - packages/core-compat/ui/frame/index.ts | 1 - .../absolute-layout/absolute-layout.d.ts | 1 - .../absolute-layout/absolute-layout.js | 2 - .../absolute-layout/absolute-layout.ts | 1 - .../ui/layouts/absolute-layout/index.d.ts | 1 - .../ui/layouts/absolute-layout/index.js | 2 - .../ui/layouts/absolute-layout/index.ts | 1 - .../ui/layouts/dock-layout/dock-layout.d.ts | 1 - .../ui/layouts/dock-layout/dock-layout.js | 2 - .../ui/layouts/dock-layout/dock-layout.ts | 1 - .../ui/layouts/dock-layout/index.d.ts | 1 - .../ui/layouts/dock-layout/index.js | 2 - .../ui/layouts/dock-layout/index.ts | 1 - .../flexbox-layout/flexbox-layout.d.ts | 1 - .../layouts/flexbox-layout/flexbox-layout.js | 2 - .../layouts/flexbox-layout/flexbox-layout.ts | 1 - .../ui/layouts/flexbox-layout/index.d.ts | 1 - .../ui/layouts/flexbox-layout/index.js | 2 - .../ui/layouts/flexbox-layout/index.ts | 1 - .../ui/layouts/grid-layout/grid-layout.d.ts | 1 - .../ui/layouts/grid-layout/grid-layout.js | 2 - .../ui/layouts/grid-layout/grid-layout.ts | 1 - .../ui/layouts/grid-layout/index.d.ts | 1 - .../ui/layouts/grid-layout/index.js | 2 - .../ui/layouts/grid-layout/index.ts | 1 - packages/core-compat/ui/layouts/index.d.ts | 1 - packages/core-compat/ui/layouts/index.js | 2 - packages/core-compat/ui/layouts/index.ts | 1 - .../ui/layouts/stack-layout/index.d.ts | 1 - .../ui/layouts/stack-layout/index.js | 2 - .../ui/layouts/stack-layout/index.ts | 1 - .../ui/layouts/stack-layout/stack-layout.d.ts | 1 - .../ui/layouts/stack-layout/stack-layout.js | 2 - .../ui/layouts/stack-layout/stack-layout.ts | 1 - .../ui/layouts/wrap-layout/index.d.ts | 1 - .../ui/layouts/wrap-layout/index.js | 2 - .../ui/layouts/wrap-layout/index.ts | 1 - .../ui/layouts/wrap-layout/wrap-layout.d.ts | 1 - .../ui/layouts/wrap-layout/wrap-layout.js | 2 - .../ui/layouts/wrap-layout/wrap-layout.ts | 1 - packages/core-compat/ui/page/index.d.ts | 1 - packages/core-compat/ui/page/index.js | 2 - packages/core-compat/ui/page/index.ts | 1 - packages/core-compat/utils/index.d.ts | 1 - packages/core-compat/utils/index.js | 2 - packages/core-compat/utils/index.ts | 1 - packages/core-compat/utils/types.d.ts | 14 - packages/core-compat/utils/types.js | 17 - packages/core-compat/utils/types.ts | 16 - packages/core-compat/utils/utils.d.ts | 1 - packages/core-compat/utils/utils.js | 2 - packages/core-compat/utils/utils.ts | 1 - packages/core-compat/xml/index.d.ts | 1 - packages/core-compat/xml/index.js | 2 - packages/core-compat/xml/index.ts | 1 - packages/core-compat/xml/xml.d.ts | 1 - packages/core-compat/xml/xml.js | 2 - packages/core-compat/xml/xml.ts | 1 - packages/core/{.eslintrc => .eslintrc.json} | 0 packages/core/.gitignore | 1 + packages/core/.npmignore | 1 + packages/core/application/index.android.ts | 5 + packages/core/application/index.ios.ts | 5 + packages/core/image-asset/index.android.ts | 1 + packages/core/image-asset/index.ios.ts | 1 + packages/core/jest.config.js | 4 + packages/core/package.json | 2 +- packages/core/tsconfig.lib.json | 48 +- .../core/ui/action-bar/action-bar-common.ts | 4 + packages/core/ui/action-bar/index.android.ts | 1 + packages/core/ui/action-bar/index.ios.ts | 1 + .../core/ui/activity-indicator/index.ios.ts | 1 + .../core/ui/bottom-navigation/index.ios.ts | 1 + packages/core/ui/button/index.ios.ts | 1 + packages/core/ui/date-picker/index.ios.ts | 1 + packages/core/ui/frame/index.android.ts | 1 + packages/core/ui/frame/index.ios.ts | 1 + packages/core/ui/html-view/index.ios.ts | 1 + packages/core/ui/index.ts | 6 +- packages/core/ui/label/index.ios.ts | 1 + packages/core/ui/list-picker/index.ios.ts | 1 + packages/core/ui/list-view/index.ios.ts | 1 + packages/core/ui/page/index.ios.ts | 2 + packages/core/ui/progress/index.ios.ts | 1 + .../core/ui/proxy-view-container/index.ts | 5 +- packages/core/ui/search-bar/index.ios.ts | 1 + packages/core/ui/segmented-bar/index.ios.ts | 1 + packages/core/ui/slider/index.ios.ts | 1 + packages/core/ui/switch/index.ios.ts | 1 + packages/core/ui/tab-view/index.ios.ts | 1 + packages/core/ui/tabs/index.ios.ts | 2 + packages/core/ui/text-base/index.android.ts | 1 + packages/core/ui/text-base/index.ios.ts | 1 + packages/core/ui/text-field/index.ios.ts | 1 + packages/core/ui/text-view/index.ios.ts | 1 + packages/core/ui/time-picker/index.ios.ts | 1 + packages/core/ui/web-view/index.ios.ts | 1 + .../src/main/res/drawable-hdpi/add_to_fav.png | Bin 0 -> 915 bytes .../baseline_motorcycle_black_18.png | Bin 0 -> 324 bytes .../baseline_motorcycle_black_24.png | Bin 0 -> 389 bytes .../baseline_motorcycle_black_36.png | Bin 0 -> 565 bytes .../baseline_motorcycle_black_48.png | Bin 0 -> 593 bytes .../src/main/res/drawable-mdpi/add_to_fav.png | Bin 0 -> 669 bytes .../baseline_motorcycle_black_18.png | Bin 0 -> 234 bytes .../baseline_motorcycle_black_24.png | Bin 0 -> 232 bytes .../baseline_motorcycle_black_36.png | Bin 0 -> 389 bytes .../baseline_motorcycle_black_48.png | Bin 0 -> 402 bytes .../src/main/res/drawable-nodpi/i18x32.png | Bin 0 -> 3441 bytes .../src/main/res/drawable-nodpi/i32x18.png | Bin 0 -> 3419 bytes .../src/main/res/drawable-nodpi/i32x32.png | Bin 0 -> 3428 bytes .../src/main/res/drawable-nodpi/icon.png | Bin 0 -> 10946 bytes .../src/main/res/drawable-nodpi/testlogo.jpg | Bin 0 -> 3924 bytes .../src/main/res/drawable-nodpi/tile.png | Bin 0 -> 3491 bytes .../src/main/res/drawable-nodpi/up.png | Bin 0 -> 5192 bytes .../src/main/res/drawable-nodpi/upccw.png | Bin 0 -> 5276 bytes .../src/main/res/drawable-nodpi/upcw.png | Bin 0 -> 5274 bytes .../src/main/res/drawable-nodpi/upflip.png | Bin 0 -> 5147 bytes .../main/res/drawable-xhdpi/add_to_fav.png | Bin 0 -> 1134 bytes .../baseline_motorcycle_black_18.png | Bin 0 -> 389 bytes .../baseline_motorcycle_black_24.png | Bin 0 -> 402 bytes .../baseline_motorcycle_black_36.png | Bin 0 -> 593 bytes .../baseline_motorcycle_black_48.png | Bin 0 -> 775 bytes .../main/res/drawable-xxhdpi/add_to_fav.png | Bin 0 -> 1584 bytes .../baseline_motorcycle_black_18.png | Bin 0 -> 565 bytes .../baseline_motorcycle_black_24.png | Bin 0 -> 593 bytes .../baseline_motorcycle_black_36.png | Bin 0 -> 1016 bytes .../baseline_motorcycle_black_48.png | Bin 0 -> 1126 bytes .../main/res/drawable-xxxhdpi/add_to_fav.png | Bin 0 -> 1969 bytes .../baseline_motorcycle_black_18.png | Bin 0 -> 593 bytes .../baseline_motorcycle_black_24.png | Bin 0 -> 775 bytes .../baseline_motorcycle_black_36.png | Bin 0 -> 1126 bytes .../baseline_motorcycle_black_48.png | Bin 0 -> 1538 bytes tools/assets/App_Resources/iOS/add_to_fav.png | Bin 0 -> 669 bytes .../App_Resources/iOS/add_to_fav@2x.png | Bin 0 -> 1134 bytes .../App_Resources/iOS/add_to_fav@3x.png | Bin 0 -> 1584 bytes .../iOS/baseline_motorcycle_black_24@1x.png | Bin 0 -> 232 bytes .../iOS/baseline_motorcycle_black_24@2x.png | Bin 0 -> 402 bytes .../iOS/baseline_motorcycle_black_24@3x.png | Bin 0 -> 593 bytes tools/assets/App_Resources/iOS/i18x32.png | Bin 0 -> 3441 bytes tools/assets/App_Resources/iOS/i18x32@2x.png | Bin 0 -> 3441 bytes tools/assets/App_Resources/iOS/i18x32@3x.png | Bin 0 -> 3441 bytes tools/assets/App_Resources/iOS/i32x18.png | Bin 0 -> 3419 bytes tools/assets/App_Resources/iOS/i32x18@2x.png | Bin 0 -> 3419 bytes tools/assets/App_Resources/iOS/i32x18@3x.png | Bin 0 -> 3419 bytes tools/assets/App_Resources/iOS/i32x32.png | Bin 0 -> 3428 bytes tools/assets/App_Resources/iOS/i32x32@2x.png | Bin 0 -> 3428 bytes tools/assets/App_Resources/iOS/i32x32@3x.png | Bin 0 -> 3428 bytes tools/assets/App_Resources/iOS/testlogo.jpg | Bin 0 -> 3924 bytes tools/assets/App_Resources/iOS/tile.png | Bin 0 -> 3491 bytes tools/assets/App_Resources/iOS/tile@2x.png | Bin 0 -> 3491 bytes tools/assets/App_Resources/iOS/tile@3x.png | Bin 0 -> 3491 bytes tools/assets/App_Resources/iOS/up.png | Bin 0 -> 5192 bytes tools/assets/App_Resources/iOS/up@2x.png | Bin 0 -> 5192 bytes tools/assets/App_Resources/iOS/up@3x.png | Bin 0 -> 5192 bytes tools/assets/App_Resources/iOS/upccw.png | Bin 0 -> 5276 bytes tools/assets/App_Resources/iOS/upccw@2x.png | Bin 0 -> 5276 bytes tools/assets/App_Resources/iOS/upccw@3x.png | Bin 0 -> 5276 bytes tools/assets/App_Resources/iOS/upcw.png | Bin 0 -> 5274 bytes tools/assets/App_Resources/iOS/upcw@2x.png | Bin 0 -> 5274 bytes tools/assets/App_Resources/iOS/upcw@3x.png | Bin 0 -> 5274 bytes tools/assets/App_Resources/iOS/upflip.png | Bin 0 -> 5147 bytes tools/assets/App_Resources/iOS/upflip@2x.png | Bin 0 -> 5147 bytes tools/assets/App_Resources/iOS/upflip@3x.png | Bin 0 -> 5147 bytes tools/workspace-scripts.js | 11 +- workspace.json | 725 ++++++++---------- 266 files changed, 677 insertions(+), 1014 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.json create mode 100644 .vscode/extensions.json create mode 100644 jest.preset.js delete mode 100644 packages/core-compat/.npmignore delete mode 100644 packages/core-compat/README.md delete mode 100644 packages/core-compat/application-settings/application-settings.d.ts delete mode 100644 packages/core-compat/application-settings/application-settings.js delete mode 100644 packages/core-compat/application-settings/application-settings.ts delete mode 100644 packages/core-compat/application-settings/index.d.ts delete mode 100644 packages/core-compat/application-settings/index.js delete mode 100644 packages/core-compat/application-settings/index.ts delete mode 100644 packages/core-compat/application/application.d.ts delete mode 100644 packages/core-compat/application/application.js delete mode 100644 packages/core-compat/application/application.ts delete mode 100644 packages/core-compat/application/index.d.ts delete mode 100644 packages/core-compat/application/index.js delete mode 100644 packages/core-compat/application/index.ts delete mode 100644 packages/core-compat/bundle-entry-points.d.ts delete mode 100644 packages/core-compat/bundle-entry-points.js delete mode 100644 packages/core-compat/bundle-entry-points.ts delete mode 100644 packages/core-compat/color/color.d.ts delete mode 100644 packages/core-compat/color/color.js delete mode 100644 packages/core-compat/color/color.ts delete mode 100644 packages/core-compat/color/index.d.ts delete mode 100644 packages/core-compat/color/index.js delete mode 100644 packages/core-compat/color/index.ts delete mode 100644 packages/core-compat/data/observable/index.d.ts delete mode 100644 packages/core-compat/data/observable/index.js delete mode 100644 packages/core-compat/data/observable/index.ts delete mode 100644 packages/core-compat/data/observable/observable.d.ts delete mode 100644 packages/core-compat/data/observable/observable.js delete mode 100644 packages/core-compat/data/observable/observable.ts delete mode 100644 packages/core-compat/file-system/file-system.d.ts delete mode 100644 packages/core-compat/file-system/file-system.js delete mode 100644 packages/core-compat/file-system/file-system.ts delete mode 100644 packages/core-compat/file-system/index.d.ts delete mode 100644 packages/core-compat/file-system/index.js delete mode 100644 packages/core-compat/file-system/index.ts delete mode 100644 packages/core-compat/http/http.d.ts delete mode 100644 packages/core-compat/http/http.js delete mode 100644 packages/core-compat/http/http.ts delete mode 100644 packages/core-compat/http/index.d.ts delete mode 100644 packages/core-compat/http/index.js delete mode 100644 packages/core-compat/http/index.ts delete mode 100644 packages/core-compat/image-asset/image-asset.d.ts delete mode 100644 packages/core-compat/image-asset/image-asset.js delete mode 100644 packages/core-compat/image-asset/image-asset.ts delete mode 100644 packages/core-compat/image-asset/index.d.ts delete mode 100644 packages/core-compat/image-asset/index.js delete mode 100644 packages/core-compat/image-asset/index.ts delete mode 100644 packages/core-compat/image-source/image-source.d.ts delete mode 100644 packages/core-compat/image-source/image-source.js delete mode 100644 packages/core-compat/image-source/image-source.ts delete mode 100644 packages/core-compat/image-source/index.d.ts delete mode 100644 packages/core-compat/image-source/index.js delete mode 100644 packages/core-compat/image-source/index.ts delete mode 100644 packages/core-compat/inspector_modules.js delete mode 100644 packages/core-compat/package.json delete mode 100644 packages/core-compat/platform/index.d.ts delete mode 100644 packages/core-compat/platform/index.js delete mode 100644 packages/core-compat/platform/index.ts delete mode 100644 packages/core-compat/platform/platform.d.ts delete mode 100644 packages/core-compat/platform/platform.js delete mode 100644 packages/core-compat/platform/platform.ts delete mode 100644 packages/core-compat/profiling/index.d.ts delete mode 100644 packages/core-compat/profiling/index.js delete mode 100644 packages/core-compat/profiling/index.ts delete mode 100644 packages/core-compat/profiling/profiling.d.ts delete mode 100644 packages/core-compat/profiling/profiling.js delete mode 100644 packages/core-compat/profiling/profiling.ts delete mode 100644 packages/core-compat/tns-core-modules.d.ts delete mode 100644 packages/core-compat/trace/index.d.ts delete mode 100644 packages/core-compat/trace/index.js delete mode 100644 packages/core-compat/trace/index.ts delete mode 100644 packages/core-compat/trace/trace.d.ts delete mode 100644 packages/core-compat/trace/trace.js delete mode 100644 packages/core-compat/trace/trace.ts delete mode 100644 packages/core-compat/tsconfig.json delete mode 100644 packages/core-compat/ui/core/index.d.ts delete mode 100644 packages/core-compat/ui/core/index.js delete mode 100644 packages/core-compat/ui/core/index.ts delete mode 100644 packages/core-compat/ui/core/view/index.d.ts delete mode 100644 packages/core-compat/ui/core/view/index.js delete mode 100644 packages/core-compat/ui/core/view/index.ts delete mode 100644 packages/core-compat/ui/core/view/view.d.ts delete mode 100644 packages/core-compat/ui/core/view/view.js delete mode 100644 packages/core-compat/ui/core/view/view.ts delete mode 100644 packages/core-compat/ui/frame/activity.android.js delete mode 100644 packages/core-compat/ui/frame/frame.d.ts delete mode 100644 packages/core-compat/ui/frame/frame.js delete mode 100644 packages/core-compat/ui/frame/frame.ts delete mode 100644 packages/core-compat/ui/frame/index.d.ts delete mode 100644 packages/core-compat/ui/frame/index.js delete mode 100644 packages/core-compat/ui/frame/index.ts delete mode 100644 packages/core-compat/ui/layouts/absolute-layout/absolute-layout.d.ts delete mode 100644 packages/core-compat/ui/layouts/absolute-layout/absolute-layout.js delete mode 100644 packages/core-compat/ui/layouts/absolute-layout/absolute-layout.ts delete mode 100644 packages/core-compat/ui/layouts/absolute-layout/index.d.ts delete mode 100644 packages/core-compat/ui/layouts/absolute-layout/index.js delete mode 100644 packages/core-compat/ui/layouts/absolute-layout/index.ts delete mode 100644 packages/core-compat/ui/layouts/dock-layout/dock-layout.d.ts delete mode 100644 packages/core-compat/ui/layouts/dock-layout/dock-layout.js delete mode 100644 packages/core-compat/ui/layouts/dock-layout/dock-layout.ts delete mode 100644 packages/core-compat/ui/layouts/dock-layout/index.d.ts delete mode 100644 packages/core-compat/ui/layouts/dock-layout/index.js delete mode 100644 packages/core-compat/ui/layouts/dock-layout/index.ts delete mode 100644 packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.d.ts delete mode 100644 packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.js delete mode 100644 packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.ts delete mode 100644 packages/core-compat/ui/layouts/flexbox-layout/index.d.ts delete mode 100644 packages/core-compat/ui/layouts/flexbox-layout/index.js delete mode 100644 packages/core-compat/ui/layouts/flexbox-layout/index.ts delete mode 100644 packages/core-compat/ui/layouts/grid-layout/grid-layout.d.ts delete mode 100644 packages/core-compat/ui/layouts/grid-layout/grid-layout.js delete mode 100644 packages/core-compat/ui/layouts/grid-layout/grid-layout.ts delete mode 100644 packages/core-compat/ui/layouts/grid-layout/index.d.ts delete mode 100644 packages/core-compat/ui/layouts/grid-layout/index.js delete mode 100644 packages/core-compat/ui/layouts/grid-layout/index.ts delete mode 100644 packages/core-compat/ui/layouts/index.d.ts delete mode 100644 packages/core-compat/ui/layouts/index.js delete mode 100644 packages/core-compat/ui/layouts/index.ts delete mode 100644 packages/core-compat/ui/layouts/stack-layout/index.d.ts delete mode 100644 packages/core-compat/ui/layouts/stack-layout/index.js delete mode 100644 packages/core-compat/ui/layouts/stack-layout/index.ts delete mode 100644 packages/core-compat/ui/layouts/stack-layout/stack-layout.d.ts delete mode 100644 packages/core-compat/ui/layouts/stack-layout/stack-layout.js delete mode 100644 packages/core-compat/ui/layouts/stack-layout/stack-layout.ts delete mode 100644 packages/core-compat/ui/layouts/wrap-layout/index.d.ts delete mode 100644 packages/core-compat/ui/layouts/wrap-layout/index.js delete mode 100644 packages/core-compat/ui/layouts/wrap-layout/index.ts delete mode 100644 packages/core-compat/ui/layouts/wrap-layout/wrap-layout.d.ts delete mode 100644 packages/core-compat/ui/layouts/wrap-layout/wrap-layout.js delete mode 100644 packages/core-compat/ui/layouts/wrap-layout/wrap-layout.ts delete mode 100644 packages/core-compat/ui/page/index.d.ts delete mode 100644 packages/core-compat/ui/page/index.js delete mode 100644 packages/core-compat/ui/page/index.ts delete mode 100644 packages/core-compat/utils/index.d.ts delete mode 100644 packages/core-compat/utils/index.js delete mode 100644 packages/core-compat/utils/index.ts delete mode 100644 packages/core-compat/utils/types.d.ts delete mode 100644 packages/core-compat/utils/types.js delete mode 100644 packages/core-compat/utils/types.ts delete mode 100644 packages/core-compat/utils/utils.d.ts delete mode 100644 packages/core-compat/utils/utils.js delete mode 100644 packages/core-compat/utils/utils.ts delete mode 100644 packages/core-compat/xml/index.d.ts delete mode 100644 packages/core-compat/xml/index.js delete mode 100644 packages/core-compat/xml/index.ts delete mode 100644 packages/core-compat/xml/xml.d.ts delete mode 100644 packages/core-compat/xml/xml.js delete mode 100644 packages/core-compat/xml/xml.ts rename packages/core/{.eslintrc => .eslintrc.json} (100%) create mode 100644 packages/core/jest.config.js create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/add_to_fav.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_18.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_24.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_36.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_48.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/add_to_fav.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/baseline_motorcycle_black_18.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/baseline_motorcycle_black_24.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/baseline_motorcycle_black_36.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/baseline_motorcycle_black_48.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/i18x32.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/i32x18.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/i32x32.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/icon.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/testlogo.jpg create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/tile.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/up.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/upccw.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/upcw.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/upflip.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/add_to_fav.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_18.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_24.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_36.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_48.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/add_to_fav.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/baseline_motorcycle_black_18.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/baseline_motorcycle_black_24.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/baseline_motorcycle_black_36.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/baseline_motorcycle_black_48.png create mode 100644 tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/add_to_fav.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/baseline_motorcycle_black_18.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/baseline_motorcycle_black_24.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/baseline_motorcycle_black_36.png create mode 100755 tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/baseline_motorcycle_black_48.png create mode 100644 tools/assets/App_Resources/iOS/add_to_fav.png create mode 100644 tools/assets/App_Resources/iOS/add_to_fav@2x.png create mode 100644 tools/assets/App_Resources/iOS/add_to_fav@3x.png create mode 100755 tools/assets/App_Resources/iOS/baseline_motorcycle_black_24@1x.png create mode 100755 tools/assets/App_Resources/iOS/baseline_motorcycle_black_24@2x.png create mode 100755 tools/assets/App_Resources/iOS/baseline_motorcycle_black_24@3x.png create mode 100644 tools/assets/App_Resources/iOS/i18x32.png create mode 100644 tools/assets/App_Resources/iOS/i18x32@2x.png create mode 100644 tools/assets/App_Resources/iOS/i18x32@3x.png create mode 100644 tools/assets/App_Resources/iOS/i32x18.png create mode 100644 tools/assets/App_Resources/iOS/i32x18@2x.png create mode 100644 tools/assets/App_Resources/iOS/i32x18@3x.png create mode 100644 tools/assets/App_Resources/iOS/i32x32.png create mode 100644 tools/assets/App_Resources/iOS/i32x32@2x.png create mode 100644 tools/assets/App_Resources/iOS/i32x32@3x.png create mode 100644 tools/assets/App_Resources/iOS/testlogo.jpg create mode 100644 tools/assets/App_Resources/iOS/tile.png create mode 100644 tools/assets/App_Resources/iOS/tile@2x.png create mode 100644 tools/assets/App_Resources/iOS/tile@3x.png create mode 100644 tools/assets/App_Resources/iOS/up.png create mode 100644 tools/assets/App_Resources/iOS/up@2x.png create mode 100644 tools/assets/App_Resources/iOS/up@3x.png create mode 100644 tools/assets/App_Resources/iOS/upccw.png create mode 100644 tools/assets/App_Resources/iOS/upccw@2x.png create mode 100644 tools/assets/App_Resources/iOS/upccw@3x.png create mode 100644 tools/assets/App_Resources/iOS/upcw.png create mode 100644 tools/assets/App_Resources/iOS/upcw@2x.png create mode 100644 tools/assets/App_Resources/iOS/upcw@3x.png create mode 100644 tools/assets/App_Resources/iOS/upflip.png create mode 100644 tools/assets/App_Resources/iOS/upflip@2x.png create mode 100644 tools/assets/App_Resources/iOS/upflip@3x.png diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 72845e2f3..000000000 --- a/.eslintrc +++ /dev/null @@ -1,42 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "ignorePatterns": ["**/*"], - "plugins": ["@typescript-eslint", "@nrwl/nx"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier", - "prettier/@typescript-eslint" - ], - "rules": { - "@typescript-eslint/explicit-member-accessibility": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-parameter-properties": "off", - "@nrwl/nx/enforce-module-boundaries": [ - "error", - { - "enforceBuildableLibDependency": true, - "allow": [], - "depConstraints": [ - { "sourceTag": "*", "onlyDependOnLibsWithTags": ["*"] } - ] - } - ] - }, - "overrides": [ - { - "files": ["*.tsx"], - "rules": { - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-any": "off" - } - } - ] -} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..74d9d35a6 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,40 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "project": "./tsconfig.json" + }, + "ignorePatterns": ["**/*"], + "plugins": ["@typescript-eslint", "@nrwl/nx"], + "extends": ["eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "prettier", "prettier/@typescript-eslint"], + "rules": { + "@typescript-eslint/explicit-member-accessibility": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-parameter-properties": "off", + "@nrwl/nx/enforce-module-boundaries": [ + "error", + { + "enforceBuildableLibDependency": true, + "allow": [], + "depConstraints": [ + { + "sourceTag": "*", + "onlyDependOnLibsWithTags": ["*"] + } + ] + } + ], + "@typescript-eslint/explicit-module-boundary-types": "off" + }, + "overrides": [ + { + "files": ["*.tsx"], + "rules": { + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-any": "off" + } + } + ] +} diff --git a/.github/workflows/npm_release.yml b/.github/workflows/npm_release.yml index 76e43ca4d..e21f08f52 100644 --- a/.github/workflows/npm_release.yml +++ b/.github/workflows/npm_release.yml @@ -23,7 +23,7 @@ jobs: run: npm version $NPM_VERSION - name: Build @nativescript/core - run: npx nx run core:build.npm + run: npx nx run core:build - name: Publish @nativescript/core working-directory: dist/packages diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..98c163683 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "nrwl.angular-console", + "ms-vscode.vscode-typescript-tslint-plugin", + "esbenp.prettier-vscode", + "firsttris.vscode-jest-runner" + ] +} diff --git a/apps/toolbox/package.json b/apps/toolbox/package.json index 16167ec77..61a742272 100644 --- a/apps/toolbox/package.json +++ b/apps/toolbox/package.json @@ -2,10 +2,10 @@ "main": "main.js", "description": "NativeScript Application", "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/NativeScript/NativeScript.git" - }, + "repository": { + "type": "git", + "url": "https://github.com/NativeScript/NativeScript.git" + }, "dependencies": { "nativescript-theme-core": "file:../../node_modules/nativescript-theme-core", "@nativescript/core": "file:../../packages/core" diff --git a/apps/ui/package.json b/apps/ui/package.json index 100413761..c1b026215 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -1,11 +1,11 @@ { "main": "main.js", "description": "NativeScript Application", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/NativeScript/NativeScript.git" - }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/NativeScript/NativeScript.git" + }, "dependencies": { "nativescript-theme-core": "file:../../node_modules/nativescript-theme-core", "@nativescript/core": "file:../../packages/core" diff --git a/jest.config.js b/jest.config.js index 30b91f3cb..8c858feaf 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,9 +1,3 @@ module.exports = { - testMatch: ['**/+(*.)+(spec|test).+(ts|js)?(x)'], - transform: { - '^.+\\.(ts|js|html)$': 'ts-jest' - }, - resolver: '@nrwl/jest/plugins/resolver', - moduleFileExtensions: ['ts', 'js', 'html'], - coverageReporters: ['html'] + projects: ['/packages/core'], }; diff --git a/jest.preset.js b/jest.preset.js new file mode 100644 index 000000000..0ab15bec5 --- /dev/null +++ b/jest.preset.js @@ -0,0 +1,11 @@ +const nxPreset = require('@nrwl/jest/preset'); +module.exports = { + ...nxPreset, + testMatch: ['**/+(*.)+(spec|test).+(ts|js)?(x)'], + transform: { + '^.+\\.(ts|js|html)$': 'ts-jest', + }, + resolver: '@nrwl/jest/plugins/resolver', + moduleFileExtensions: ['ts', 'js', 'html'], + coverageReporters: ['html'], +}; diff --git a/migrations.json b/migrations.json index 99cdca8b8..f1929b173 100644 --- a/migrations.json +++ b/migrations.json @@ -1,32 +1,109 @@ { "migrations": [ { - "version": "10.0.0-beta.0", - "description": "Add default branch to nx.json", - "factory": "./src/migrations/update-10-0-0/update-10-0-0", + "version": "10.1.0-beta.0", + "description": "Migrate .eslintrc files to use tsconfig with a wildcard", + "factory": "./src/migrations/update-10-1-0/migrate-eslintrc-tsconfig-wildcard", "package": "@nrwl/workspace", - "name": "add-default-branch-to-nx-json" + "name": "migrate-eslintrc-tsconfig-wildcard" }, { - "version": "10.0.0-beta.0", - "description": "Migrate tsconfigs to solution style tsconfigs", - "factory": "./src/migrations/update-10-0-0/solution-tsconfigs", + "version": "10.3.0-beta.0", + "description": "Add @nrwl/cli as dependency", + "factory": "./src/migrations/update-10-3-0/add-cli-dependency", "package": "@nrwl/workspace", - "name": "solution-tsconfigs" + "name": "add-cli-dependency" }, { - "version": "10.0.1-beta.0", - "description": "Migrate .eslintrc files to reference new tsconfig", - "factory": "./src/migrations/update-10-0-1/migrate-eslintrc", + "version": "10.3.0-beta.0", + "description": "Update typescript to v4", + "factory": "./src/migrations/update-10-3-0/update-typescript", "package": "@nrwl/workspace", - "name": "migrate-eslintrc-tsconfig" + "name": "update-10-3-0" }, { - "version": "10.0.0-beta.2", - "description": "update jest configs to include setup env files", - "factory": "./src/migrations/update-10-0-0/update-jest-configs", + "version": "10.3.0-beta.1", + "description": "Adds .vscode/extensions.json to a workspace", + "factory": "./src/migrations/update-10-3-0/add-vscode-extensions", + "package": "@nrwl/workspace", + "name": "add-vscode-extensions" + }, + { + "version": "10.3.0-beta.0", + "description": "Adds `buildableProjectDepsInPackageJsonType` for web and angular package builders", + "factory": "./src/migrations/update-10-3-0/add-buildable-project-deps-in-package-json-type", + "package": "@nrwl/workspace", + "name": "add-buildable-project-deps-in-package-json-type" + }, + { + "version": "10.1.0-beta.4", + "description": "Update jest to v26", + "factory": "./src/migrations/update-10-1-0/update-10-1-0", "package": "@nrwl/jest", - "name": "update-10.0.0" + "name": "update-10.1.0" + }, + { + "version": "10.2.0", + "description": "Remove deprecated jest builder options", + "factory": "./src/migrations/update-10-2-0/update-10-2-0", + "package": "@nrwl/jest", + "name": "update-10.2.0" + }, + { + "version": "10.3.0-beta.1", + "description": "Adds all jest projects into the root jest config", + "factory": "./src/migrations/update-10-3-0/update-projects-property", + "package": "@nrwl/jest", + "name": "update-projects-property" + }, + { + "version": "10.3.0-beta.1", + "description": "Update ts-jest to v26.4", + "factory": "./src/migrations/update-10-3-0/update-ts-jest", + "package": "@nrwl/jest", + "name": "update-ts-jest" + }, + { + "version": "10.3.0-beta.1", + "description": "Adds a jest extension to the recommended extensions for vscode", + "factory": "./src/migrations/update-10-3-0/add-jest-extension", + "package": "@nrwl/jest", + "name": "add-jest-extension" + }, + { + "version": "10.3.0-beta.1", + "description": "Update @typescript-eslint to v4.3", + "factory": "./src/migrations/update-10-3-0/update-10-3-0", + "package": "@nrwl/linter", + "name": "update-10.3.0" + }, + { + "version": "10.3.0-beta.0", + "description": "Migrate to the new ESLint builder and ESLint config style", + "factory": "./src/migrations/update-10-3-0/update-eslint-builder-and-config", + "package": "@nrwl/linter", + "name": "update-eslint-builder-and-config" + }, + { + "version": "10.3.0-beta.2", + "description": "Add explicit .json file extension to .eslintrc files, not using an extension is deprecated", + "factory": "./src/migrations/update-10-3-0/add-json-ext-to-eslintrc", + "package": "@nrwl/linter", + "name": "add-json-ext-to-eslintrc" + }, + { + "version": "10.3.0-beta.3", + "description": "Update implicitDependencies within nx.json to include root .eslintrc.json", + "factory": "./src/migrations/update-10-3-0/add-root-eslintrc-json-to-workspace-implicit-deps", + "package": "@nrwl/linter", + "name": "add-root-eslintrc-json-to-workspace-implicit-deps" + }, + { + "version": "10.1.0-beta.1", + "description": "Removes rootDir from node libs' tsconfig", + "factory": "./src/migrations/update-10-1-0/remove-root-dir", + "package": "@nrwl/node", + "name": "remove-root-dir" } ] } \ No newline at end of file diff --git a/nx.json b/nx.json index 5d47c3b81..e3adc53f7 100644 --- a/nx.json +++ b/nx.json @@ -1,49 +1,47 @@ { - "npmScope": "nativescript", - "workspaceLayout": { - "appsDir": "apps", - "libsDir": "packages" - }, - "implicitDependencies": { - "workspace.json": "*", - "package.json": { - "dependencies": "*", - "devDependencies": "*" - }, - "tsconfig.json": "*", - "tslint.json": "*", - "nx.json": "*" - }, - "projects": { - "apps-automated": { - "tags": [] - }, - "apps-toolbox": { - "tags": [] - }, - "apps-ui": { - "tags": [] - }, - "core": { - "tags": [] - }, - "core-compat": { - "tags": [] - }, - "types": { - "tags": [] - }, - "types-ios": { - "tags": [] - }, - "types-android": { - "tags": [] - }, - "ui-mobile-base": { - "tags": [] - }, - "webpack": { - "tags": [] - } - } + "npmScope": "nativescript", + "workspaceLayout": { + "appsDir": "apps", + "libsDir": "packages" + }, + "implicitDependencies": { + "workspace.json": "*", + "package.json": { + "dependencies": "*", + "devDependencies": "*" + }, + "tsconfig.json": "*", + "tslint.json": "*", + "nx.json": "*", + ".eslintrc.json": "*" + }, + "projects": { + "apps-automated": { + "tags": [] + }, + "apps-toolbox": { + "tags": [] + }, + "apps-ui": { + "tags": [] + }, + "core": { + "tags": [] + }, + "types": { + "tags": [] + }, + "types-ios": { + "tags": [] + }, + "types-android": { + "tags": [] + }, + "ui-mobile-base": { + "tags": [] + }, + "webpack": { + "tags": [] + } + } } diff --git a/package.json b/package.json index 7b2748a27..d8d7d2b7b 100644 --- a/package.json +++ b/package.json @@ -1,73 +1,74 @@ { - "name": "nativescript", - "version": "7.0.10", - "license": "MIT", - "scripts": { - "setup": "npx rimraf hooks node_modules package-lock.json && npm i && ts-patch install && nx run core:setup", - "start": "nps", - "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s" - }, - "private": true, - "repository": { - "type": "git", - "url": "https://github.com/NativeScript/NativeScript.git" - }, - "dependencies": { - "nativescript-theme-core": "^1.0.4" - }, - "devDependencies": { - "@nativescript/hook": "^2.0.0", - "@nrwl/eslint-plugin-nx": "~10.0.7", - "@nrwl/jest": "~10.0.7", - "@nrwl/node": "~10.0.7", - "@nrwl/workspace": "~10.0.7", - "@nstudio/focus": "~10.0.0", - "@nstudio/nps-i": "~1.1.0", - "@types/chai": "^4.2.11", - "@types/jest": "~26.0.4", - "@types/mocha": "^7.0.2", - "@types/node": "~14.0.22", - "@typescript-eslint/eslint-plugin": "~3.6.0", - "@typescript-eslint/parser": "~3.6.0", - "chai": "^4.2.0", - "conventional-changelog-cli": "^2.0.34", - "copyfiles": "^2.3.0", - "css": "^3.0.0", - "css-tree": "^1.0.0-alpha.39", - "dotenv": "~8.2.0", - "eslint": "~7.4.0", - "eslint-config-prettier": "~6.11.0", - "gonzales": "^1.0.7", - "husky": "^4.2.5", - "jest": "~26.1.0", - "lint-staged": "^10.2.11", - "mocha": "^8.0.1", - "mocha-typescript": "^1.1.17", - "module-alias": "^2.2.2", - "nativescript": "~7.0.6", - "node-sass": "~4.14.1", - "parse-css": "git+https://github.com/tabatkins/parse-css.git", - "parserlib": "^1.1.1", - "prettier": "~2.0.5", - "reduce-css-calc": "~2.1.7", - "shady-css-parser": "^0.1.0", - "terser-webpack-plugin": "~3.0.6", - "ts-jest": "~26.1.1", - "ts-node": "~8.10.2", - "ts-patch": "^1.2.5", - "tslint": "~6.1.2", - "typescript": "~3.9.7", - "webpack": "~4.44.1", - "webpack-cli": "~3.3.12" - }, - "husky": { - "hooks": { - "pre-commit": "npx lint-staged" - } - }, - "lint-staged": { - "**/*": [ - "nx format:write --files" - ] - } + "name": "nativescript", + "version": "7.0.10", + "license": "MIT", + "scripts": { + "setup": "npx rimraf hooks node_modules package-lock.json && npm i && ts-patch install && nx run core:setup", + "start": "nps", + "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s" + }, + "private": true, + "repository": { + "type": "git", + "url": "https://github.com/NativeScript/NativeScript.git" + }, + "dependencies": { + "nativescript-theme-core": "^1.0.4" + }, + "devDependencies": { + "@nativescript/hook": "^2.0.0", + "@nrwl/cli": "~10.3.1", + "@nrwl/eslint-plugin-nx": "~10.3.0", + "@nrwl/jest": "~10.3.0", + "@nrwl/node": "~10.3.0", + "@nrwl/workspace": "~10.3.0", + "@nstudio/focus": "~10.3.0", + "@nstudio/nps-i": "~1.1.0", + "@types/chai": "^4.2.11", + "@types/jest": "~26.0.8", + "@types/mocha": "^7.0.2", + "@types/node": "~14.0.22", + "@typescript-eslint/eslint-plugin": "~4.3.0", + "@typescript-eslint/parser": "~4.3.0", + "chai": "^4.2.0", + "conventional-changelog-cli": "^2.0.34", + "copyfiles": "^2.4.0", + "css": "^3.0.0", + "css-tree": "^1.0.0-alpha.39", + "dotenv": "~8.2.0", + "eslint": "~7.10.0", + "eslint-config-prettier": "~6.11.0", + "gonzales": "^1.0.7", + "husky": "^4.2.5", + "jest": "~26.2.2", + "lint-staged": "^10.2.11", + "mocha": "^8.0.1", + "mocha-typescript": "^1.1.17", + "module-alias": "^2.2.2", + "nativescript": "~7.0.6", + "node-sass": "~4.14.1", + "parse-css": "git+https://github.com/tabatkins/parse-css.git", + "parserlib": "^1.1.1", + "prettier": "~2.0.5", + "reduce-css-calc": "~2.1.7", + "shady-css-parser": "^0.1.0", + "terser-webpack-plugin": "~3.0.6", + "ts-jest": "26.4.0", + "ts-node": "~8.10.2", + "ts-patch": "^1.2.5", + "tslint": "~6.1.2", + "typescript": "~4.0.3", + "webpack": "~4.44.1", + "webpack-cli": "~3.3.12" + }, + "husky": { + "hooks": { + "pre-commit": "npx lint-staged" + } + }, + "lint-staged": { + "**/*": [ + "nx format:write --files" + ] + } } diff --git a/packages/core-compat/.npmignore b/packages/core-compat/.npmignore deleted file mode 100644 index c32fafcdf..000000000 --- a/packages/core-compat/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -*.tgz -**/*.ts -!**/*.d.ts -npm-debug.log \ No newline at end of file diff --git a/packages/core-compat/README.md b/packages/core-compat/README.md deleted file mode 100644 index 71596b20e..000000000 --- a/packages/core-compat/README.md +++ /dev/null @@ -1,3 +0,0 @@ -**NOTE**: Do not use this package directly. - -The `tns-core-modules` package exists only for compatibility with older versions of NativeScript. It's recommended to use `@nativescript/core` now. \ No newline at end of file diff --git a/packages/core-compat/application-settings/application-settings.d.ts b/packages/core-compat/application-settings/application-settings.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/application-settings/application-settings.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/application-settings/application-settings.js b/packages/core-compat/application-settings/application-settings.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/application-settings/application-settings.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/application-settings/application-settings.ts b/packages/core-compat/application-settings/application-settings.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/application-settings/application-settings.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/application-settings/index.d.ts b/packages/core-compat/application-settings/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/application-settings/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/application-settings/index.js b/packages/core-compat/application-settings/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/application-settings/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/application-settings/index.ts b/packages/core-compat/application-settings/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/application-settings/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/application/application.d.ts b/packages/core-compat/application/application.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/application/application.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/application/application.js b/packages/core-compat/application/application.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/application/application.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/application/application.ts b/packages/core-compat/application/application.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/application/application.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/application/index.d.ts b/packages/core-compat/application/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/application/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/application/index.js b/packages/core-compat/application/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/application/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/application/index.ts b/packages/core-compat/application/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/application/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/bundle-entry-points.d.ts b/packages/core-compat/bundle-entry-points.d.ts deleted file mode 100644 index e51f287b0..000000000 --- a/packages/core-compat/bundle-entry-points.d.ts +++ /dev/null @@ -1 +0,0 @@ -import '@nativescript/core/bundle-entry-points'; diff --git a/packages/core-compat/bundle-entry-points.js b/packages/core-compat/bundle-entry-points.js deleted file mode 100644 index 2c24e8de4..000000000 --- a/packages/core-compat/bundle-entry-points.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -require("@nativescript/core/bundle-entry-points"); diff --git a/packages/core-compat/bundle-entry-points.ts b/packages/core-compat/bundle-entry-points.ts deleted file mode 100644 index 849ee1ceb..000000000 --- a/packages/core-compat/bundle-entry-points.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Execute the bundle-entry-points from core. Nothing is exported. -import '@nativescript/core/bundle-entry-points'; diff --git a/packages/core-compat/color/color.d.ts b/packages/core-compat/color/color.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/color/color.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/color/color.js b/packages/core-compat/color/color.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/color/color.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/color/color.ts b/packages/core-compat/color/color.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/color/color.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/color/index.d.ts b/packages/core-compat/color/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/color/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/color/index.js b/packages/core-compat/color/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/color/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/color/index.ts b/packages/core-compat/color/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/color/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/data/observable/index.d.ts b/packages/core-compat/data/observable/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/data/observable/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/data/observable/index.js b/packages/core-compat/data/observable/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/data/observable/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/data/observable/index.ts b/packages/core-compat/data/observable/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/data/observable/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/data/observable/observable.d.ts b/packages/core-compat/data/observable/observable.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/data/observable/observable.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/data/observable/observable.js b/packages/core-compat/data/observable/observable.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/data/observable/observable.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/data/observable/observable.ts b/packages/core-compat/data/observable/observable.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/data/observable/observable.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/file-system/file-system.d.ts b/packages/core-compat/file-system/file-system.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/file-system/file-system.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/file-system/file-system.js b/packages/core-compat/file-system/file-system.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/file-system/file-system.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/file-system/file-system.ts b/packages/core-compat/file-system/file-system.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/file-system/file-system.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/file-system/index.d.ts b/packages/core-compat/file-system/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/file-system/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/file-system/index.js b/packages/core-compat/file-system/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/file-system/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/file-system/index.ts b/packages/core-compat/file-system/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/file-system/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/http/http.d.ts b/packages/core-compat/http/http.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/http/http.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/http/http.js b/packages/core-compat/http/http.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/http/http.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/http/http.ts b/packages/core-compat/http/http.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/http/http.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/http/index.d.ts b/packages/core-compat/http/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/http/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/http/index.js b/packages/core-compat/http/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/http/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/http/index.ts b/packages/core-compat/http/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/http/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/image-asset/image-asset.d.ts b/packages/core-compat/image-asset/image-asset.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/image-asset/image-asset.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/image-asset/image-asset.js b/packages/core-compat/image-asset/image-asset.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/image-asset/image-asset.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/image-asset/image-asset.ts b/packages/core-compat/image-asset/image-asset.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/image-asset/image-asset.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/image-asset/index.d.ts b/packages/core-compat/image-asset/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/image-asset/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/image-asset/index.js b/packages/core-compat/image-asset/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/image-asset/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/image-asset/index.ts b/packages/core-compat/image-asset/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/image-asset/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/image-source/image-source.d.ts b/packages/core-compat/image-source/image-source.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/image-source/image-source.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/image-source/image-source.js b/packages/core-compat/image-source/image-source.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/image-source/image-source.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/image-source/image-source.ts b/packages/core-compat/image-source/image-source.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/image-source/image-source.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/image-source/index.d.ts b/packages/core-compat/image-source/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/image-source/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/image-source/index.js b/packages/core-compat/image-source/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/image-source/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/image-source/index.ts b/packages/core-compat/image-source/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/image-source/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/inspector_modules.js b/packages/core-compat/inspector_modules.js deleted file mode 100644 index 1c334b4de..000000000 --- a/packages/core-compat/inspector_modules.js +++ /dev/null @@ -1,7 +0,0 @@ -// The "inspector_modules" module is not public, but is refered in legacy versons of webpack.config -// So add the re-export manually -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", { value: true }); -__export(require("@nativescript/core/inspector_modules")); diff --git a/packages/core-compat/package.json b/packages/core-compat/package.json deleted file mode 100644 index 1062ef0e6..000000000 --- a/packages/core-compat/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "tns-core-modules", - "main": "index", - "types": "index.d.ts", - "description": "Compatibility with old style tns-core-modules imports for NativeScript.", - "version": "7.0.0-rc.33", - "homepage": "https://nativescript.org", - "repository": { - "type": "git", - "url": "https://github.com/NativeScript/NativeScript" - }, - "license": "Apache-2.0", - "scripts": { - "setup": "npm i" - }, - "devDependencies": { - "@nativescript/core": "rc" - }, - "nativescript": { - "platforms": { - "ios": "5.0.0", - "android": "5.0.0" - } - } -} diff --git a/packages/core-compat/platform/index.d.ts b/packages/core-compat/platform/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/platform/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/platform/index.js b/packages/core-compat/platform/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/platform/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/platform/index.ts b/packages/core-compat/platform/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/platform/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/platform/platform.d.ts b/packages/core-compat/platform/platform.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/platform/platform.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/platform/platform.js b/packages/core-compat/platform/platform.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/platform/platform.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/platform/platform.ts b/packages/core-compat/platform/platform.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/platform/platform.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/profiling/index.d.ts b/packages/core-compat/profiling/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/profiling/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/profiling/index.js b/packages/core-compat/profiling/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/profiling/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/profiling/index.ts b/packages/core-compat/profiling/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/profiling/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/profiling/profiling.d.ts b/packages/core-compat/profiling/profiling.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/profiling/profiling.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/profiling/profiling.js b/packages/core-compat/profiling/profiling.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/profiling/profiling.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/profiling/profiling.ts b/packages/core-compat/profiling/profiling.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/profiling/profiling.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/tns-core-modules.d.ts b/packages/core-compat/tns-core-modules.d.ts deleted file mode 100644 index e2eb1206c..000000000 --- a/packages/core-compat/tns-core-modules.d.ts +++ /dev/null @@ -1 +0,0 @@ -// Not needed. Only added for back-compatibility as some apps refer to this file. diff --git a/packages/core-compat/trace/index.d.ts b/packages/core-compat/trace/index.d.ts deleted file mode 100644 index de705c20a..000000000 --- a/packages/core-compat/trace/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './trace'; diff --git a/packages/core-compat/trace/index.js b/packages/core-compat/trace/index.js deleted file mode 100644 index 716cccb41..000000000 --- a/packages/core-compat/trace/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("./trace"), exports); diff --git a/packages/core-compat/trace/index.ts b/packages/core-compat/trace/index.ts deleted file mode 100644 index de705c20a..000000000 --- a/packages/core-compat/trace/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './trace'; diff --git a/packages/core-compat/trace/trace.d.ts b/packages/core-compat/trace/trace.d.ts deleted file mode 100644 index 69fed71f4..000000000 --- a/packages/core-compat/trace/trace.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Trace } from '@nativescript/core'; -export declare const enable: typeof Trace.enable; -export declare const error: typeof Trace.error; -export declare const getErrorHandler: typeof Trace.getErrorHandler; -export declare const isCategorySet: typeof Trace.isCategorySet; -export declare const isEnabled: typeof Trace.isEnabled; -export declare const notifyEvent: typeof Trace.notifyEvent; -export declare const setCategories: typeof Trace.setCategories; -export declare const setErrorHandler: typeof Trace.setErrorHandler; -export declare const write: typeof Trace.write; -export declare const removeWriter: typeof Trace.removeWriter; -export declare const messageType: typeof Trace.messageType; -export declare const removeEventListener: typeof Trace.removeEventListener; -export declare const addCategories: typeof Trace.addCategories; -export declare const addEventListener: typeof Trace.addEventListener; -export declare const DefaultErrorHandler: typeof Trace.DefaultErrorHandler; -export declare const ConsoleWriter: typeof Trace.ConsoleWriter; -export declare const addWriter: typeof Trace.addWriter; -export declare const categories: typeof Trace.categories; -export declare const clearWriters: typeof Trace.clearWriters; -export declare const disable: typeof Trace.disable; diff --git a/packages/core-compat/trace/trace.js b/packages/core-compat/trace/trace.js deleted file mode 100644 index cbd32e03d..000000000 --- a/packages/core-compat/trace/trace.js +++ /dev/null @@ -1,23 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.disable = exports.clearWriters = exports.categories = exports.addWriter = exports.ConsoleWriter = exports.DefaultErrorHandler = exports.addEventListener = exports.addCategories = exports.removeEventListener = exports.messageType = exports.removeWriter = exports.write = exports.setErrorHandler = exports.setCategories = exports.notifyEvent = exports.isEnabled = exports.isCategorySet = exports.getErrorHandler = exports.error = exports.enable = void 0; -var core_1 = require("@nativescript/core"); -exports.enable = core_1.Trace.enable; -exports.error = core_1.Trace.error; -exports.getErrorHandler = core_1.Trace.getErrorHandler; -exports.isCategorySet = core_1.Trace.isCategorySet; -exports.isEnabled = core_1.Trace.isEnabled; -exports.notifyEvent = core_1.Trace.notifyEvent; -exports.setCategories = core_1.Trace.setCategories; -exports.setErrorHandler = core_1.Trace.setErrorHandler; -exports.write = core_1.Trace.write; -exports.removeWriter = core_1.Trace.removeWriter; -exports.messageType = core_1.Trace.messageType; -exports.removeEventListener = core_1.Trace.removeEventListener; -exports.addCategories = core_1.Trace.addCategories; -exports.addEventListener = core_1.Trace.addEventListener; -exports.DefaultErrorHandler = core_1.Trace.DefaultErrorHandler; -exports.ConsoleWriter = core_1.Trace.ConsoleWriter; -exports.addWriter = core_1.Trace.addWriter; -exports.categories = core_1.Trace.categories; -exports.clearWriters = core_1.Trace.clearWriters; -exports.disable = core_1.Trace.disable; diff --git a/packages/core-compat/trace/trace.ts b/packages/core-compat/trace/trace.ts deleted file mode 100644 index 52afde9ad..000000000 --- a/packages/core-compat/trace/trace.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Trace } from '@nativescript/core'; - -export const enable = Trace.enable; -export const error = Trace.error; -export const getErrorHandler = Trace.getErrorHandler; -export const isCategorySet = Trace.isCategorySet; -export const isEnabled = Trace.isEnabled; -export const notifyEvent = Trace.notifyEvent; -export const setCategories = Trace.setCategories; -export const setErrorHandler = Trace.setErrorHandler; -export const write = Trace.write; -export const removeWriter = Trace.removeWriter; -export const messageType = Trace.messageType; -export const removeEventListener = Trace.removeEventListener; -export const addCategories = Trace.addCategories; -export const addEventListener = Trace.addEventListener; -export const DefaultErrorHandler = Trace.DefaultErrorHandler; -export const ConsoleWriter = Trace.ConsoleWriter; -export const addWriter = Trace.addWriter; -export const categories = Trace.categories; -export const clearWriters = Trace.clearWriters; -export const disable = Trace.disable; diff --git a/packages/core-compat/tsconfig.json b/packages/core-compat/tsconfig.json deleted file mode 100644 index 9aa096cc8..000000000 --- a/packages/core-compat/tsconfig.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "compilerOptions": { - "noEmitOnError": true, - "noEmitHelpers": true, - "target": "es5", - "module": "commonjs", - "declaration": true, - "noImplicitAny": false, - "noImplicitUseStrict": true, - "removeComments": true, - "experimentalDecorators": true, - "diagnostics": true, - "sourceMap": false, - "types" : [ - "node" - ], - "lib": [ - "es6", "dom" - ], - "baseUrl": "." - }, - "include": [ - "**/*.ts" - ], - "exclude": [ - "node_modules", - "dist", - "__tests__" - ] -} diff --git a/packages/core-compat/ui/core/index.d.ts b/packages/core-compat/ui/core/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/core/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/core/index.js b/packages/core-compat/ui/core/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/core/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/core/index.ts b/packages/core-compat/ui/core/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/core/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/core/view/index.d.ts b/packages/core-compat/ui/core/view/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/core/view/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/core/view/index.js b/packages/core-compat/ui/core/view/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/core/view/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/core/view/index.ts b/packages/core-compat/ui/core/view/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/core/view/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/core/view/view.d.ts b/packages/core-compat/ui/core/view/view.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/core/view/view.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/core/view/view.js b/packages/core-compat/ui/core/view/view.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/core/view/view.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/core/view/view.ts b/packages/core-compat/ui/core/view/view.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/core/view/view.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/frame/activity.android.js b/packages/core-compat/ui/frame/activity.android.js deleted file mode 100644 index 3fc99d0f8..000000000 --- a/packages/core-compat/ui/frame/activity.android.js +++ /dev/null @@ -1,7 +0,0 @@ -// The "ui/frame/activity" module is not public, but is refered in legacy versons of webpack.config -// So add the re-export manually -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", { value: true }); -__export(require("@nativescript/core/ui/frame/activity")); diff --git a/packages/core-compat/ui/frame/frame.d.ts b/packages/core-compat/ui/frame/frame.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/frame/frame.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/frame/frame.js b/packages/core-compat/ui/frame/frame.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/frame/frame.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/frame/frame.ts b/packages/core-compat/ui/frame/frame.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/frame/frame.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/frame/index.d.ts b/packages/core-compat/ui/frame/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/frame/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/frame/index.js b/packages/core-compat/ui/frame/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/frame/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/frame/index.ts b/packages/core-compat/ui/frame/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/frame/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.d.ts b/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.js b/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.ts b/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/absolute-layout/absolute-layout.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/absolute-layout/index.d.ts b/packages/core-compat/ui/layouts/absolute-layout/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/absolute-layout/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/absolute-layout/index.js b/packages/core-compat/ui/layouts/absolute-layout/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/absolute-layout/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/absolute-layout/index.ts b/packages/core-compat/ui/layouts/absolute-layout/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/absolute-layout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/dock-layout/dock-layout.d.ts b/packages/core-compat/ui/layouts/dock-layout/dock-layout.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/dock-layout/dock-layout.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/dock-layout/dock-layout.js b/packages/core-compat/ui/layouts/dock-layout/dock-layout.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/dock-layout/dock-layout.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/dock-layout/dock-layout.ts b/packages/core-compat/ui/layouts/dock-layout/dock-layout.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/dock-layout/dock-layout.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/dock-layout/index.d.ts b/packages/core-compat/ui/layouts/dock-layout/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/dock-layout/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/dock-layout/index.js b/packages/core-compat/ui/layouts/dock-layout/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/dock-layout/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/dock-layout/index.ts b/packages/core-compat/ui/layouts/dock-layout/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/dock-layout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.d.ts b/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.js b/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.ts b/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/flexbox-layout/flexbox-layout.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/flexbox-layout/index.d.ts b/packages/core-compat/ui/layouts/flexbox-layout/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/flexbox-layout/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/flexbox-layout/index.js b/packages/core-compat/ui/layouts/flexbox-layout/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/flexbox-layout/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/flexbox-layout/index.ts b/packages/core-compat/ui/layouts/flexbox-layout/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/flexbox-layout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/grid-layout/grid-layout.d.ts b/packages/core-compat/ui/layouts/grid-layout/grid-layout.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/grid-layout/grid-layout.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/grid-layout/grid-layout.js b/packages/core-compat/ui/layouts/grid-layout/grid-layout.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/grid-layout/grid-layout.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/grid-layout/grid-layout.ts b/packages/core-compat/ui/layouts/grid-layout/grid-layout.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/grid-layout/grid-layout.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/grid-layout/index.d.ts b/packages/core-compat/ui/layouts/grid-layout/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/grid-layout/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/grid-layout/index.js b/packages/core-compat/ui/layouts/grid-layout/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/grid-layout/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/grid-layout/index.ts b/packages/core-compat/ui/layouts/grid-layout/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/grid-layout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/index.d.ts b/packages/core-compat/ui/layouts/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/index.js b/packages/core-compat/ui/layouts/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/index.ts b/packages/core-compat/ui/layouts/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/stack-layout/index.d.ts b/packages/core-compat/ui/layouts/stack-layout/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/stack-layout/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/stack-layout/index.js b/packages/core-compat/ui/layouts/stack-layout/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/stack-layout/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/stack-layout/index.ts b/packages/core-compat/ui/layouts/stack-layout/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/stack-layout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/stack-layout/stack-layout.d.ts b/packages/core-compat/ui/layouts/stack-layout/stack-layout.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/stack-layout/stack-layout.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/stack-layout/stack-layout.js b/packages/core-compat/ui/layouts/stack-layout/stack-layout.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/stack-layout/stack-layout.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/stack-layout/stack-layout.ts b/packages/core-compat/ui/layouts/stack-layout/stack-layout.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/stack-layout/stack-layout.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/wrap-layout/index.d.ts b/packages/core-compat/ui/layouts/wrap-layout/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/wrap-layout/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/wrap-layout/index.js b/packages/core-compat/ui/layouts/wrap-layout/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/wrap-layout/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/wrap-layout/index.ts b/packages/core-compat/ui/layouts/wrap-layout/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/wrap-layout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.d.ts b/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.js b/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.ts b/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/layouts/wrap-layout/wrap-layout.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/page/index.d.ts b/packages/core-compat/ui/page/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/page/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/ui/page/index.js b/packages/core-compat/ui/page/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/ui/page/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/ui/page/index.ts b/packages/core-compat/ui/page/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/ui/page/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/utils/index.d.ts b/packages/core-compat/utils/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/utils/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/utils/index.js b/packages/core-compat/utils/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/utils/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/utils/index.ts b/packages/core-compat/utils/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/utils/types.d.ts b/packages/core-compat/utils/types.d.ts deleted file mode 100644 index 373f25969..000000000 --- a/packages/core-compat/utils/types.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export declare const ClassInfo: typeof import('@nativescript/core/utils/types').ClassInfo; -export declare const getClass: typeof import('@nativescript/core/utils/types').getClass; -export declare const getBaseClasses: typeof import('@nativescript/core/utils/types').getBaseClasses; -export declare const getClassInfo: typeof import('@nativescript/core/utils/types').getClassInfo; -export declare const isBoolean: typeof import('@nativescript/core/utils/types').isBoolean; -export declare const isDefined: typeof import('@nativescript/core/utils/types').isDefined; -export declare const isFunction: typeof import('@nativescript/core/utils/types').isFunction; -export declare const isNullOrUndefined: typeof import('@nativescript/core/utils/types').isNullOrUndefined; -export declare const isNumber: typeof import('@nativescript/core/utils/types').isNumber; -export declare const isObject: typeof import('@nativescript/core/utils/types').isObject; -export declare const isString: typeof import('@nativescript/core/utils/types').isString; -export declare const isUndefined: typeof import('@nativescript/core/utils/types').isUndefined; -export declare const toUIString: typeof import('@nativescript/core/utils/types').toUIString; -export declare const verifyCallback: typeof import('@nativescript/core/utils/types').verifyCallback; diff --git a/packages/core-compat/utils/types.js b/packages/core-compat/utils/types.js deleted file mode 100644 index ca93d7ed6..000000000 --- a/packages/core-compat/utils/types.js +++ /dev/null @@ -1,17 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyCallback = exports.toUIString = exports.isUndefined = exports.isString = exports.isObject = exports.isNumber = exports.isNullOrUndefined = exports.isFunction = exports.isDefined = exports.isBoolean = exports.getClassInfo = exports.getBaseClasses = exports.getClass = exports.ClassInfo = void 0; -var core_1 = require("@nativescript/core"); -exports.ClassInfo = core_1.Utils.ClassInfo; -exports.getClass = core_1.Utils.getClass; -exports.getBaseClasses = core_1.Utils.getBaseClasses; -exports.getClassInfo = core_1.Utils.getClassInfo; -exports.isBoolean = core_1.Utils.isBoolean; -exports.isDefined = core_1.Utils.isDefined; -exports.isFunction = core_1.Utils.isFunction; -exports.isNullOrUndefined = core_1.Utils.isNullOrUndefined; -exports.isNumber = core_1.Utils.isNumber; -exports.isObject = core_1.Utils.isObject; -exports.isString = core_1.Utils.isString; -exports.isUndefined = core_1.Utils.isUndefined; -exports.toUIString = core_1.Utils.toUIString; -exports.verifyCallback = core_1.Utils.verifyCallback; diff --git a/packages/core-compat/utils/types.ts b/packages/core-compat/utils/types.ts deleted file mode 100644 index 41e298460..000000000 --- a/packages/core-compat/utils/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Utils } from '@nativescript/core'; - -export const ClassInfo = Utils.ClassInfo; -export const getClass = Utils.getClass; -export const getBaseClasses = Utils.getBaseClasses; -export const getClassInfo = Utils.getClassInfo; -export const isBoolean = Utils.isBoolean; -export const isDefined = Utils.isDefined; -export const isFunction = Utils.isFunction; -export const isNullOrUndefined = Utils.isNullOrUndefined; -export const isNumber = Utils.isNumber; -export const isObject = Utils.isObject; -export const isString = Utils.isString; -export const isUndefined = Utils.isUndefined; -export const toUIString = Utils.toUIString; -export const verifyCallback = Utils.verifyCallback; diff --git a/packages/core-compat/utils/utils.d.ts b/packages/core-compat/utils/utils.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/utils/utils.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/utils/utils.js b/packages/core-compat/utils/utils.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/utils/utils.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/utils/utils.ts b/packages/core-compat/utils/utils.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/utils/utils.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/xml/index.d.ts b/packages/core-compat/xml/index.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/xml/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/xml/index.js b/packages/core-compat/xml/index.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/xml/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/xml/index.ts b/packages/core-compat/xml/index.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/xml/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/xml/xml.d.ts b/packages/core-compat/xml/xml.d.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/xml/xml.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core-compat/xml/xml.js b/packages/core-compat/xml/xml.js deleted file mode 100644 index 4ae4e4d5b..000000000 --- a/packages/core-compat/xml/xml.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("@nativescript/core"), exports); diff --git a/packages/core-compat/xml/xml.ts b/packages/core-compat/xml/xml.ts deleted file mode 100644 index 5dff1da93..000000000 --- a/packages/core-compat/xml/xml.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@nativescript/core'; diff --git a/packages/core/.eslintrc b/packages/core/.eslintrc.json similarity index 100% rename from packages/core/.eslintrc rename to packages/core/.eslintrc.json diff --git a/packages/core/.gitignore b/packages/core/.gitignore index 1ea5a026a..7fe498c27 100644 --- a/packages/core/.gitignore +++ b/packages/core/.gitignore @@ -1,5 +1,6 @@ dist *.js +!jest.config.js *.map !xml/xml.js !js-libs/**/*.* diff --git a/packages/core/.npmignore b/packages/core/.npmignore index 2856450cd..a80034276 100644 --- a/packages/core/.npmignore +++ b/packages/core/.npmignore @@ -3,4 +3,5 @@ dist *.tgz **/*.ts !**/*.d.ts +jest.config.js npm-debug.log \ No newline at end of file diff --git a/packages/core/application/index.android.ts b/packages/core/application/index.android.ts index 7587f17af..aadc3ff5d 100644 --- a/packages/core/application/index.android.ts +++ b/packages/core/application/index.android.ts @@ -504,3 +504,8 @@ declare namespace com { } } } + +// core exports this symbol so apps may import them in general +// technically they are only available for use when running that platform +// helps avoid a webpack nonexistent warning +export const iOSApplication = undefined; diff --git a/packages/core/application/index.ios.ts b/packages/core/application/index.ios.ts index ba05b941a..2ad1bb4b4 100644 --- a/packages/core/application/index.ios.ts +++ b/packages/core/application/index.ios.ts @@ -528,3 +528,8 @@ global.__onLiveSync = function __onLiveSync(context?: ModuleContext) { const rootView = getRootView(); livesync(rootView, context); }; + +// core exports this symbol so apps may import them in general +// technically they are only available for use when running that platform +// helps avoid a webpack nonexistent warning +export const AndroidApplication = undefined; diff --git a/packages/core/image-asset/index.android.ts b/packages/core/image-asset/index.android.ts index de4e9ebe5..35e9e66d2 100644 --- a/packages/core/image-asset/index.android.ts +++ b/packages/core/image-asset/index.android.ts @@ -15,6 +15,7 @@ export class ImageAsset extends ImageAssetBase { this.android = fileName; } + // @ts-ignore get android(): string { return this._android; } diff --git a/packages/core/image-asset/index.ios.ts b/packages/core/image-asset/index.ios.ts index 4a6531f67..32ec30583 100644 --- a/packages/core/image-asset/index.ios.ts +++ b/packages/core/image-asset/index.ios.ts @@ -21,6 +21,7 @@ export class ImageAsset extends ImageAssetBase { } } + // @ts-ignore get ios(): PHAsset { return this._ios; } diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js new file mode 100644 index 000000000..a831fe51b --- /dev/null +++ b/packages/core/jest.config.js @@ -0,0 +1,4 @@ +module.exports = { + preset: '../../jest.preset.js', + displayName: 'core', +}; diff --git a/packages/core/package.json b/packages/core/package.json index 9afe0deb4..cf77e2711 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,7 +31,7 @@ "css-tree": "^1.0.0-alpha.39", "@nativescript/hook": "~2.0.0", "reduce-css-calc": "^2.1.7", - "tslib": "2.0.0" + "tslib": "~2.0.0" }, "nativescript": { "platforms": { diff --git a/packages/core/tsconfig.lib.json b/packages/core/tsconfig.lib.json index 1a082d817..1c189dfd0 100644 --- a/packages/core/tsconfig.lib.json +++ b/packages/core/tsconfig.lib.json @@ -1,25 +1,27 @@ { - "extends": "./tsconfig.json", - "compilerOptions": { - "noEmitOnError": true, - "noEmitHelpers": true, - "declaration": true, - "noImplicitAny": false, - "noImplicitUseStrict": true, - "removeComments": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "diagnostics": true, - "sourceMap": true, - "inlineSourceMap": false, - "baseUrl": ".", - "outDir": "../../dist/out-tsc", - "rootDir": "./", - "types": ["node"], - "plugins": [ - { "transform": "../../../packages/webpack/transformers/ns-transform-native-classes.ts", "type": "raw" } - ] - }, - "exclude": ["**/*.spec.ts", "dist", "__tests__"], - "include": ["**/*.ts", "./references.d.ts"] + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmitOnError": true, + "noEmitHelpers": true, + "declaration": true, + "noImplicitAny": false, + "noImplicitUseStrict": true, + "removeComments": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "diagnostics": true, + "sourceMap": true, + "inlineSourceMap": false, + "baseUrl": ".", + "outDir": "../../dist", + "types": ["node"], + "plugins": [ + { + "transform": "../webpack/transformers/ns-transform-native-classes.ts", + "type": "raw" + } + ] + }, + "exclude": ["**/*.spec.ts", "dist", "__tests__"], + "include": ["**/*.ts", "./references.d.ts"] } diff --git a/packages/core/ui/action-bar/action-bar-common.ts b/packages/core/ui/action-bar/action-bar-common.ts index 2ce8d7c0b..8d0c84a68 100644 --- a/packages/core/ui/action-bar/action-bar-common.ts +++ b/packages/core/ui/action-bar/action-bar-common.ts @@ -102,10 +102,12 @@ export class ActionBarBase extends View implements ActionBarDefinition { this.style.androidContentInsetRight = value; } + // @ts-ignore get ios(): any { return undefined; } + // @ts-ignore get android(): AndroidActionBarSettings { return undefined; } @@ -262,7 +264,9 @@ export class ActionItemBase extends ViewBase implements ActionItemDefinition { private _actionBar: ActionBarDefinition; private _actionView: View; + // @ts-ignore public ios: IOSActionItemSettings; + // @ts-ignore public android: AndroidActionItemSettings; public text: string; diff --git a/packages/core/ui/action-bar/index.android.ts b/packages/core/ui/action-bar/index.android.ts index 531c68ee3..a5e57ccb5 100644 --- a/packages/core/ui/action-bar/index.android.ts +++ b/packages/core/ui/action-bar/index.android.ts @@ -96,6 +96,7 @@ export class ActionItem extends ActionItemBase { this._itemId = generateItemId(); } + // @ts-ignore public get android(): AndroidActionItemSettings { return this._androidPosition; } diff --git a/packages/core/ui/action-bar/index.ios.ts b/packages/core/ui/action-bar/index.ios.ts index bc557be49..66da39270 100644 --- a/packages/core/ui/action-bar/index.ios.ts +++ b/packages/core/ui/action-bar/index.ios.ts @@ -64,6 +64,7 @@ export class ActionItem extends ActionItemBase { systemIcon: undefined, }; + // @ts-ignore public get ios(): IOSActionItemSettings { return this._ios; } diff --git a/packages/core/ui/activity-indicator/index.ios.ts b/packages/core/ui/activity-indicator/index.ios.ts index 6eb82c21e..cc93d4eef 100644 --- a/packages/core/ui/activity-indicator/index.ios.ts +++ b/packages/core/ui/activity-indicator/index.ios.ts @@ -20,6 +20,7 @@ export class ActivityIndicator extends ActivityIndicatorBase { return view; } + // @ts-ignore get ios(): UIActivityIndicatorView { return this.nativeViewProtected; } diff --git a/packages/core/ui/bottom-navigation/index.ios.ts b/packages/core/ui/bottom-navigation/index.ios.ts index 78c80464d..43ddc14bc 100644 --- a/packages/core/ui/bottom-navigation/index.ios.ts +++ b/packages/core/ui/bottom-navigation/index.ios.ts @@ -316,6 +316,7 @@ export class BottomNavigation extends TabNavigationBase { super.onUnloaded(); } + // @ts-ignore get ios(): UITabBarController { return this._ios; } diff --git a/packages/core/ui/button/index.ios.ts b/packages/core/ui/button/index.ios.ts index e48e0b86b..f57842155 100644 --- a/packages/core/ui/button/index.ios.ts +++ b/packages/core/ui/button/index.ios.ts @@ -33,6 +33,7 @@ export class Button extends ButtonBase { super.disposeNativeView(); } + // @ts-ignore get ios() { return this.nativeViewProtected; } diff --git a/packages/core/ui/date-picker/index.ios.ts b/packages/core/ui/date-picker/index.ios.ts index 118124bd0..69267ccd9 100644 --- a/packages/core/ui/date-picker/index.ios.ts +++ b/packages/core/ui/date-picker/index.ios.ts @@ -33,6 +33,7 @@ export class DatePicker extends DatePickerBase { super.disposeNativeView(); } + // @ts-ignore get ios(): UIDatePicker { return this.nativeViewProtected; } diff --git a/packages/core/ui/frame/index.android.ts b/packages/core/ui/frame/index.android.ts index bc635bbb9..097d1a439 100644 --- a/packages/core/ui/frame/index.android.ts +++ b/packages/core/ui/frame/index.android.ts @@ -130,6 +130,7 @@ export class Frame extends FrameBase { return this._containerViewId; } + // @ts-ignore get android(): AndroidFrame { return this._android; } diff --git a/packages/core/ui/frame/index.ios.ts b/packages/core/ui/frame/index.ios.ts index ec78a7b0c..1ccb99603 100644 --- a/packages/core/ui/frame/index.ios.ts +++ b/packages/core/ui/frame/index.ios.ts @@ -46,6 +46,7 @@ export class Frame extends FrameBase { super.disposeNativeView(); } + // @ts-ignore public get ios(): iOSFrame { return this._ios; } diff --git a/packages/core/ui/html-view/index.ios.ts b/packages/core/ui/html-view/index.ios.ts index 7c6d9462f..60be5b9ba 100644 --- a/packages/core/ui/html-view/index.ios.ts +++ b/packages/core/ui/html-view/index.ios.ts @@ -32,6 +32,7 @@ export class HtmlView extends HtmlViewBase { this.nativeViewProtected.textContainerInset = (UIEdgeInsets as any).zero; } + // @ts-ignore get ios(): UITextView { return this.nativeViewProtected; } diff --git a/packages/core/ui/index.ts b/packages/core/ui/index.ts index 4304ae45c..52d8b2900 100644 --- a/packages/core/ui/index.ts +++ b/packages/core/ui/index.ts @@ -1,6 +1,7 @@ export { ActionBar, ActionItem, ActionItems, NavigationButton } from './action-bar'; export { ActivityIndicator } from './activity-indicator'; -export { Animation, AnimationDefinition, KeyframeAnimation, KeyframeAnimationInfo, KeyframeDeclaration, KeyframeInfo } from './animation'; +export { Animation, KeyframeAnimation, KeyframeAnimationInfo, KeyframeDeclaration, KeyframeInfo } from './animation'; +export type { AnimationDefinition } from './animation'; export { BottomNavigation } from './bottom-navigation'; export type { SelectedIndexChangedEventData } from './bottom-navigation'; export { Builder } from './builder'; @@ -45,7 +46,8 @@ export { ListView } from './list-view'; export type { ItemEventData, TemplatedItemsView, ItemsSource } from './list-view'; export { Page, PageBase } from './page'; export type { NavigatedData } from './page'; -export { Placeholder, CreateViewEventData } from './placeholder'; +export { Placeholder } from './placeholder'; +export type { CreateViewEventData } from './placeholder'; export { Progress } from './progress'; export { ProxyViewContainer } from './proxy-view-container'; export { Repeater } from './repeater'; diff --git a/packages/core/ui/label/index.ios.ts b/packages/core/ui/label/index.ios.ts index 8fe2dc68d..6b8b91283 100644 --- a/packages/core/ui/label/index.ios.ts +++ b/packages/core/ui/label/index.ios.ts @@ -27,6 +27,7 @@ export class Label extends TextBase implements LabelDefinition { return view; } + // @ts-ignore get ios(): TNSLabel { return this.nativeTextViewProtected; } diff --git a/packages/core/ui/list-picker/index.ios.ts b/packages/core/ui/list-picker/index.ios.ts index cf255d0c2..2b5260508 100644 --- a/packages/core/ui/list-picker/index.ios.ts +++ b/packages/core/ui/list-picker/index.ios.ts @@ -28,6 +28,7 @@ export class ListPicker extends ListPickerBase { super.disposeNativeView(); } + // @ts-ignore get ios() { return this.nativeViewProtected; } diff --git a/packages/core/ui/list-view/index.ios.ts b/packages/core/ui/list-view/index.ios.ts index 5277f2fca..974f96334 100644 --- a/packages/core/ui/list-view/index.ios.ts +++ b/packages/core/ui/list-view/index.ios.ts @@ -291,6 +291,7 @@ export class ListView extends ListViewBase { super.onUnloaded(); } + // @ts-ignore get ios(): UITableView { return this.nativeViewProtected; } diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index f7ea82a6a..c1ad6b607 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -309,6 +309,7 @@ class UIViewControllerImpl extends UIViewController { } } + // @ts-ignore public get preferredStatusBarStyle(): UIStatusBarStyle { const owner = this._owner.get(); if (owner) { @@ -340,6 +341,7 @@ export class Page extends PageBase { return this.viewController.view; } + // @ts-ignore get ios(): UIViewController { return this._ios; } diff --git a/packages/core/ui/progress/index.ios.ts b/packages/core/ui/progress/index.ios.ts index 32aa736ae..06c9bb8d9 100644 --- a/packages/core/ui/progress/index.ios.ts +++ b/packages/core/ui/progress/index.ios.ts @@ -11,6 +11,7 @@ export class Progress extends ProgressBase { return UIProgressView.new(); } + // @ts-ignore get ios() { return this.nativeViewProtected; } diff --git a/packages/core/ui/proxy-view-container/index.ts b/packages/core/ui/proxy-view-container/index.ts index bb2a715bb..aec10d7ce 100644 --- a/packages/core/ui/proxy-view-container/index.ts +++ b/packages/core/ui/proxy-view-container/index.ts @@ -1,4 +1,3 @@ -import { ProxyViewContainer as ProxyViewContainerDefinition } from '.'; import { View, CSSType } from '../core/view'; import { LayoutBase } from '../layouts/layout-base'; import { Property } from '../core/properties'; @@ -14,7 +13,7 @@ import { Trace } from '../../trace'; // * Child is removed from attached proxy. Handled in _removeViewFromNativeVisualTree. // * Proxy (with children) is removed form the DOM. In _removeViewFromNativeVisualTree recursively when the proxy is removed from its parent. @CSSType('ProxyViewContainer') -export class ProxyViewContainer extends LayoutBase implements ProxyViewContainerDefinition { +export class ProxyViewContainer extends LayoutBase { private proxiedLayoutProperties = new Set(); constructor() { @@ -23,10 +22,12 @@ export class ProxyViewContainer extends LayoutBase implements ProxyViewContainer } // No native view for proxy container. + // @ts-ignore get ios(): any { return null; } + // @ts-ignore get android(): any { return null; } diff --git a/packages/core/ui/search-bar/index.ios.ts b/packages/core/ui/search-bar/index.ios.ts index 2ed62bb3e..9d689efac 100644 --- a/packages/core/ui/search-bar/index.ios.ts +++ b/packages/core/ui/search-bar/index.ios.ts @@ -103,6 +103,7 @@ export class SearchBar extends SearchBarBase { (this.ios).resignFirstResponder(); } + // @ts-ignore get ios(): UISearchBar { return this.nativeViewProtected; } diff --git a/packages/core/ui/segmented-bar/index.ios.ts b/packages/core/ui/segmented-bar/index.ios.ts index dc1307d98..42a9252a0 100644 --- a/packages/core/ui/segmented-bar/index.ios.ts +++ b/packages/core/ui/segmented-bar/index.ios.ts @@ -36,6 +36,7 @@ export class SegmentedBar extends SegmentedBarBase { super.disposeNativeView(); } + // @ts-ignore get ios(): UISegmentedControl { return this.nativeViewProtected; } diff --git a/packages/core/ui/slider/index.ios.ts b/packages/core/ui/slider/index.ios.ts index 4bbd8efc9..a7a53de97 100644 --- a/packages/core/ui/slider/index.ios.ts +++ b/packages/core/ui/slider/index.ios.ts @@ -52,6 +52,7 @@ export class Slider extends SliderBase { super.disposeNativeView(); } + // @ts-ignore get ios(): UISlider { return this.nativeViewProtected; } diff --git a/packages/core/ui/switch/index.ios.ts b/packages/core/ui/switch/index.ios.ts index ec37e99bc..9835be79b 100644 --- a/packages/core/ui/switch/index.ios.ts +++ b/packages/core/ui/switch/index.ios.ts @@ -55,6 +55,7 @@ export class Switch extends SwitchBase { super.disposeNativeView(); } + // @ts-ignore get ios(): UISwitch { return this.nativeViewProtected; } diff --git a/packages/core/ui/tab-view/index.ios.ts b/packages/core/ui/tab-view/index.ios.ts index f17041008..c467aee3f 100644 --- a/packages/core/ui/tab-view/index.ios.ts +++ b/packages/core/ui/tab-view/index.ios.ts @@ -330,6 +330,7 @@ export class TabView extends TabViewBase { super.onUnloaded(); } + // @ts-ignore get ios(): UITabBarController { return this._ios; } diff --git a/packages/core/ui/tabs/index.ios.ts b/packages/core/ui/tabs/index.ios.ts index 9213b803b..c3681f6be 100644 --- a/packages/core/ui/tabs/index.ios.ts +++ b/packages/core/ui/tabs/index.ios.ts @@ -466,6 +466,7 @@ export class Tabs extends TabsBase { // public offscreenTabLimit: number; // public tabsPosition: "top" | "bottom"; public _canSelectItem: boolean; + // @ts-ignore public isLoaded: boolean; public viewController: UIPageViewControllerImpl; public items: TabContentItem[]; @@ -530,6 +531,7 @@ export class Tabs extends TabsBase { super.onUnloaded(); } + // @ts-ignore get ios(): UIPageViewController { return this._ios; } diff --git a/packages/core/ui/text-base/index.android.ts b/packages/core/ui/text-base/index.android.ts index d9fbdacec..3177ef2cf 100644 --- a/packages/core/ui/text-base/index.android.ts +++ b/packages/core/ui/text-base/index.android.ts @@ -164,6 +164,7 @@ function initializeBaselineAdjustedSpan(): void { export class TextBase extends TextBaseCommon { nativeViewProtected: android.widget.TextView; + // @ts-ignore nativeTextViewProtected: android.widget.TextView; private _defaultTransformationMethod: android.text.method.TransformationMethod; private _paintFlags: number; diff --git a/packages/core/ui/text-base/index.ios.ts b/packages/core/ui/text-base/index.ios.ts index d5d0c424f..01f06054d 100644 --- a/packages/core/ui/text-base/index.ios.ts +++ b/packages/core/ui/text-base/index.ios.ts @@ -79,6 +79,7 @@ class UILabelClickHandlerImpl extends NSObject { export class TextBase extends TextBaseCommon { public nativeViewProtected: UITextField | UITextView | UILabel | UIButton; + // @ts-ignore public nativeTextViewProtected: UITextField | UITextView | UILabel | UIButton; private _tappable: boolean = false; private _tapGestureRecognizer: UITapGestureRecognizer; diff --git a/packages/core/ui/text-field/index.ios.ts b/packages/core/ui/text-field/index.ios.ts index f72fdc568..f402ccbcd 100644 --- a/packages/core/ui/text-field/index.ios.ts +++ b/packages/core/ui/text-field/index.ios.ts @@ -145,6 +145,7 @@ export class TextField extends TextFieldBase { super.onUnloaded(); } + // @ts-ignore get ios(): UITextField { return this.nativeViewProtected; } diff --git a/packages/core/ui/text-view/index.ios.ts b/packages/core/ui/text-view/index.ios.ts index 3de66521a..d43d9d666 100644 --- a/packages/core/ui/text-view/index.ios.ts +++ b/packages/core/ui/text-view/index.ios.ts @@ -123,6 +123,7 @@ export class TextView extends TextViewBaseCommon { super.onUnloaded(); } + // @ts-ignore get ios(): UITextView { return this.nativeViewProtected; } diff --git a/packages/core/ui/time-picker/index.ios.ts b/packages/core/ui/time-picker/index.ios.ts index 12c7ddd7f..ab80f2a16 100644 --- a/packages/core/ui/time-picker/index.ios.ts +++ b/packages/core/ui/time-picker/index.ios.ts @@ -51,6 +51,7 @@ export class TimePicker extends TimePickerBase { super.initNativeView(); } + // @ts-ignore get ios(): UIDatePicker { return this.nativeViewProtected; } diff --git a/packages/core/ui/web-view/index.ios.ts b/packages/core/ui/web-view/index.ios.ts index 97f0baeda..8dd35dedf 100644 --- a/packages/core/ui/web-view/index.ios.ts +++ b/packages/core/ui/web-view/index.ios.ts @@ -130,6 +130,7 @@ export class WebView extends WebViewBase { super.onUnloaded(); } + // @ts-ignore get ios(): WKWebView { return this.nativeViewProtected; } diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/add_to_fav.png b/tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/add_to_fav.png new file mode 100644 index 0000000000000000000000000000000000000000..d79e38998f003c25f726f3bff7ed33272177c080 GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8v!3-o%-;NLhQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI9}80Z4_F1o;IsD1`CWIW#a8X(q&5#);%Gv*ddCu~kSJ#bg*T@`x$vS~y3gCc9*p z)~AJd+8V1%`}+o{RO>_%)r16j7M%E#!GkW{s0wpdb&7Jf^F z+l@6=6J+_=-&kFcp5u4nRuA`k`8@uZSrf$Vx;`CTee?%2M^K0W<9;>~rwEHf9GMP+ zF0IO49gjkLI@Kqw+@e3()vu)JL|VvHa7 z|GqChFUmZWPc)@1;c;%}^;+xC|0`%Y|9OXbH5N^iulV(}ozi;yL+NS6*Xy$ryiRGV zX$9~Z2c4T&t#bJ6LEVcF?r^>M`Lt%^jMb_Cy7T{VFz0a3&i_8ebl04wa*YKC`Q|EjGr;jz2r%vxYA+0WXWcf>T zkHr_CPd>Te^;^B&YHPmV4t-^FN^AP0m45`}>lp1mYnU9n)ioU$Qw*N2elF{r5}E*V C-Tln~ literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_18.png b/tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..0e08b122fd2179da5bc4e8f15aea451463a00c7e GIT binary patch literal 324 zcmV-K0lWT*P)G^+Jm`4Yj?D(o1LO5Zo48?t+oO9x*ol{OiE(e8YmYd|5_^RE; zS?h&xP%cS#;i*c1#p1KZ0qP5(J4h23qMR|Wo01mX7oN%kV4bi;vO&l|Ly>x9gs#Fx zlIg-G$s}Pr3TvpLenO~=%0eiUe&B*IM^f2Kp^vO6WuI^iuv^%y1j<`4gjN!U3gL#m zLU^h^pn_Y%Q+vG>!ct!t;<0$!WsN1OIw9Wn+zPpUrGVxJYOAQvWmR2&!0f*AL170000Kn{dM zsgiE)ADr{v^Vn%n?Dqli*|Fn)(UL+d8rvUjbJddZSL10|`KMRUwq6~wWZe(hqVLu% znWo+izr^_cbVZFt`HL1+%-9sMYStb{Jkpn%zPM`2UMIZ~v1vxhvWVA=T#}lOF*M=5 zh-D=oMa+Uz!+KKbrK0m9I!gLtpb4VdbB{&bQ*=xAu*yXc`r=!(5eG%7{G;N3&SoJ{5TM==B zp$j6S>xqY6iHHqN6;nD=>As@d22!eHT8&9<8THOZRi|}j*g)GP)Z1^~Eq9zzZ^B`h j-8Apdgy3SMU=#oVO+Om@%^LtZ00000NkvXXu0mjfcz&ts literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_36.png b/tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..582032b56346e05f22b74a1c6ce6406e097dd384 GIT binary patch literal 565 zcmV-50?Pe~P)>OHL7Ft1ncG{jgY%ld#y2ld#y2b5e~jCN4q6rKTo57|#^nI$-%!CeoeCL>vX! z!dHT#QMVXLCL*90-w29<`a(~9Odu!*Ya$*x5ER4J9Tz#ZH}!@I)FBfk=)m;|zNcZ7 zCnedLrhTDb$%&&yvgN8}OA0pmMy(|!g5o@o&LSM7;j?N#Bs*3qx#AhMixgOul&ADY zdYYy(IuN^#o?)f2nPuW40tb(>K0CF%Ff={j8m;2;2ZXv`DEjmIy!)p z01d3mv5?})CB3y0cC+&`AatJy2wOpZ1V75 zH80q{pOjpb(fXjYleHPxU6o78f}M84RhGCEY?01O?SIO|Pqq4wZdgsyehWvf2$DKZ zCHZ5{XzOFp&DT0BC_uREEY{Y`;o>AgT3zNWkNB^xTqG5`JiOMrKRL}QF7ZoSn~$rU zJofmrZj+Nh)%oo)ag>yJD8e0=!DHmXNdrE)Ol%=FKC&=@7Xf2;>4Ccvtl)dV#C_Tj zL1}2mE>3Zrjf|l({<1TiqnzRhYZ*-qQjvHWhG7H)`PP3fd}osI00000NkvXXu0mjf D3dadX literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_48.png b/tools/assets/App_Resources/Android/src/main/res/drawable-hdpi/baseline_motorcycle_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..0522d79e704d7a0527ac3cf5cace54661add0f11 GIT binary patch literal 593 zcmV-X0SNnZ6Wgd`m9f>vT$__FJ9Cq>J0G9L{7!rB`@A2na2&^R z9LI5-kWk{>pcvtY%59ZYZmXnnTP2m-DydvmNl=U%`K6MpR3f)kx|?q+Rc9)fdBG1d zQ2|Z{-+93WrcxEZ)Zzf?s1Qs#`>BDCCX@7!yVU}ZQF)B>62n&743|pa0 z`jCV2L>h-Av6Ue-rwGNF#w8#B=6XVDS~8v^o{t+rd9tkyuWx`c$ z?<}Gx+FCoZ-1E#wt3vIN&DQpwAo`}AkcG&itmYe&h%pjmZH?nZX@8fZ!KXs0Y@-a2 zZY0PWXvd}n{~NkRGbusP#_k(>s;#xR{15$PsGK00sqH;QbXr^6itL59x63|3ILpo; z8fA4AnU2zCfFB7xjD%6PSL)XmSLz6g+9$|YYS|{wov0zYLX7m>eAoDx0G)+uo z-g`AeX-*lsFrW7*VUl`8$TDtkzzK`6w8A26UBC$| zg7?;u$nby@CgY=89Q^MCYdU9X9$>;jYT%b@OyM%m`A!;NdB6$g(#Y?G@4Vom{^sg9 fj^j9vlMDO-GF)(NEB5pb00000NkvXXu0mjfLC6^o literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/add_to_fav.png b/tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/add_to_fav.png new file mode 100644 index 0000000000000000000000000000000000000000..fafe86a9061a1b314a976dedf154063e5acf24b0 GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^5@CQfaQEB+4jJY|EeJ!r>9<9jdJr z7Q@bzA!aHRtXpMOs1aL~r>t(zvU=XrYM@z+N#5=*3>~bp9zYIffk$L90|U1Z2s2)~ zTlWVj_}bIOF+}5h?!=oyO$I!!i#-@cr*<`YI2MW@tv&qq|9>xSW|v&KOSg+Jrx`Jx zSRBAmDAJvzH`Qy>g$bM!U1I`GeM4E?b}|KMa`&v_TM+)ga_za|z0(@o95XKGtjuk` z-?QzO(d;P_yc=?MJ}!yvRW0=?-tFhUO_$;P`@eO!Kik%QX+CH!&+^xW=d9o}<>DD< z&E`F+F>(vu^ipT)=Lrv=b8ClQV=7M558k;&Ii*5--u3Kx;c`Z1@1I3Wv6TGI+vj*J zkN-(Q&!WeT2kP2;F8>s&+os++{WGVo>ArhGwY!h~Yzopr083fCZsn^>#IJNHzWauvuIE=g0RO9+j^ zUvNjr26BXlK1rw&etIC}fqOy@aLtr0XyrEd zFINS{=g-hyb)r>5UYuDb?1d+jOpj)g`*bm7z7s(=)R_G`B;6V^nCI#gr<~07;}=X& z>5x)5Jxx(_=2qs8B~^!+1Ov^ZFKp+%mN>s$qS(d9Ao}h>MV-5g!xEk69JilybHkFr gZA-qj$3JCj{aN>UUxMc@pwk&VUHx3vIVCg!0NvKn{dM zsgiE)ADr{v^Vn%n?Dqli*|Fn)(UL+d8rvUjbJddZSL10|`KMRUwq6~wWZe(hqVLu% znWo+izr^_cbVZFt`HL1+%-9sMYStb{Jkpn%zPM`2UMIZ~v1vxhvWVA=T#}lOF*M=5 zh-D=oMa+Uz!+KKbrK0m9I!gLtpb4VdbB{&bQ*=xAu*yXc`r=!(5eG%7{G;N3&SoJ{5TM==B zp$j6S>xqY6iHHqN6;nD=>As@d22!eHT8&9<8THOZRi|}j*g)GP)Z1^~Eq9zzZ^B`h j-8Apdgy3SMU=#oVO+Om@%^LtZ00000NkvXXu0mjfcz&ts literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/baseline_motorcycle_black_48.png b/tools/assets/App_Resources/Android/src/main/res/drawable-mdpi/baseline_motorcycle_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..f3434107c87200ec736dde3dcd96ca72452e437f GIT binary patch literal 402 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 Kw8+St;r{_w!aKtN literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/i32x18.png b/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/i32x18.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ba2f305ea974dc3fa02327c5d1e56781080178 GIT binary patch literal 3419 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/i32x32.png b/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/i32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..0f778f86e92176943a6c0658a14d2fe23e464221 GIT binary patch literal 3428 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/icon.png b/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1034356e2641a785ae5182f97d86293c7d1e572a GIT binary patch literal 10946 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 Ef4RP_fdBvi literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/tile.png b/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..7ebde26a0e80acc0de0169d548b3c7a9d60c8cb2 GIT binary patch literal 3491 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/upccw.png b/tools/assets/App_Resources/Android/src/main/res/drawable-nodpi/upccw.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad441c51a7d30ea0fc9079d4dbb1fcd53791407 GIT binary patch literal 5276 zcmZ`*by!sWww@scK}wnt7#e{A1caf7?hp_O2^j?G8IW#KI;6W>3CW=wX^^3%J|q+d z1nIo^ednIz^PGG4^ZfSy?X})_#k>AlVcMEX#DsK&004kkMOj|=_RD&EWbWYIz7g;# zGyp(YX)7nEts*DKq>XU0wzY=?0Lo#BN%(qCp3(L1c|%&q$-zu)hwRFgx-b$2uR1bv zRZaoCpzxAVqUa7o?Ko>7Ls`%ZpcPLj?%iNZ?Ck&|!XHpW0A-?Y2l?yQW4l>bn?8Hj zqsbT7d)_CD-lO<{!WfqO?A?NZf;(U2WwZE(LqBt}`vE#+2x9{!_}84DgnS49m<7CY zye#iy1lV}B*a=~d_HJ&T4jfoMK>=idoc%v_QCytaur-ONoT}IWS!|mM4GK-9z@RIc z5!0Yjv6x@dLa~^2(%#500Rck6lLmkl(oNQjEpr{Zk^23s2l^dMX->Xl?XLD~xw*LX zj@8_Z;Dfw`gsDj%26$_V|3TPI#LLK@`0lXepF7RNp(}k_lA8) z=n`<^o{~ZZ$A!x^j4&(~vctMJVjI7#H^!WUW*@pnqe?4uki%<@XT#N^TnWPc3=@~F zmqM>UGej8Rt6bs^sQI#8SKAZx7d7FJxiBmTOZL+eFs~vrMoEmJ{iQ0MQooQUY@TtV z%DTvm&vFORT&2J2T*Q8jsjA)CPpf2x>5@REM@-*Szfs+|J88n2)%7jl>^xqQ?F@Zr zKG15rg_pi2AMM`Jq7`7}8$j=j-?kM)01Kq80u*gckp$Gvx=ni1HC9knQ17o%d`aOs zME3~JVO8vdi&Dc%g#nW4OmENsxRuzC#00ePj>E{p}29O!0QdZ%Q+Vn1UFun;;t|E7q#Zm@>tEjAk zc$uib1)G{Pa^k*|p)A4e?;se*8V!nA;cg^w48B+q*us}v5vIXiGbayXl8_Ivi3Jzn z*~-0*rM1EqgYCvb?&B!HCbT731A4UCYbgic5$5WaV3h^?1&+#4=Wc709Fo!nDCV4u zQ_}=;@q-Kk-Bx<5h=+rGS4cf@8AvJvAFVKW;F}OV?NVB`J_Y+ww2_>2SFQ@+Fj>6` zEMZX$CH^b?lto9G0Spsi_EaX*4HE)8D03jFzbh>TT|^nM ziz90KJXgUkVU5I%SYLrA6cwPEVEUe@)qM|z7Um`3Ud-moxUtLb}e zt~UwF^Du69;rA7>S+P>F16IVJc*SCeIbOy^4D=7oe8&DZc3&(U*qit%16;I|gVvts zBH>~z(JQ+*l}e|ek-wWWtpm}?){$13D2Oba)s-k6(S_@d=(-mysZtcy6+Zj&u<%hq zM1hv-@_RoPxrB*0m&Dc2_V2mk#aJdEK4Mpk7fw7%)`;Vc{g~X!C(iROc`^=}yf(1@ zS%1LvJ$(VQkVe|WD76Juaac2qK5uQS$yG!$E=x;Vajz(5aA?5z^Sgn{cu2f7$MTpA z4U|ZPCAB)FG=8zu{)% zPS#s05!B1nr_ets%X$jZ$uAWv+n+ivGu8I)O?de!WnkEH1HMtx^rjHYV4~k z_moAC#W-JOt(0A5Qt^={veNq9MoCgyQno>nLGUz-LtcH<>!4#lj3$NvWSZ%m=>X-0 zb~h0=*)I|;;w^G`=}B_53VS7bogBKHi=3;R;~zTFci<)A5#Yh`8i*|99?G??0=u&m zW)5vtOfHYlx_$QsP}|ZA9+7Q>evT#j~)-XsoNZ zYSd^fs4u6}rnrm@4)3Nu8Ic@*oZgVuUc+A-S|@5V@lvJcu;#1voWxpA)N#>Hu7RM6s|sZuQRh~@Xzx9JT$7n-nzl&LERBiUiQn1Ayi4BV3o}Jn4devB z#qQ7T%3Y58PJ{87tzK4H3|rIte)#p-Wa_2~=JI{vn5q>B-s&dcLWatCo$6eNT-=)9 zecR~Sw2pFX9zwmlRa5%c_|MQ2o1ZjCwTE9<=5|Al4)*6UQ$q$8$T_zi9VffJsHJ3I zPN`0*La8xdVjqPz2fwQ9hUEwC9BOsRgh}jTcj;rdip}s<5c4=KTmV| z=o#v{p=Sk8;1@~6ybUH<&6k~oiGXc_V#kH%Xt;JZ9J7VRK`!D=?nW4i#=8w_ zRok78#fx9tKsjUjai3oH#K>!pJx&~2RB-L+d9Z^h(Uqu9E4tdu(1?cXTr7JY`!4YnN?791qiyhfK@nvnYy3yb9^vnP&A zW?t=^vRlDzOY5yyzAbI5?*>SgB~|@}&P2Bfj#ZYPq!ufTC1mSgSKN3%Y1h9&0UH7< zHao`{Nf7vEH*x3vGr1YmXlez>)bnZLbmDB#J`L*X)m(Y*OxH}j6XJ&bqT!&y%Sr3% z`{m0So1U$4@rmZr6I{mo(rBOB(^&y3{$qOyxDNun7ynoB{Fq3#c>5cFPchW-!)v?! z$5&1c%f4;Wsj8`I?#uMRJ})n+2G&h!?;ryudPcCk?ax^3Ekk7AF6t z6|RiFIDq*X;56?A0rW=>Glob8K*u}^5P6*3Bb`9^(otkv!BN&YKCiTt#KtLf27kqP z4~@1OLZcgA)y^sbYGcNZHzwc9UfgukS_2K*OgUUT+JEeYC*kVp*X4e^-Czlvm7gI2 zfV&jG4-k-+K?49_;n?aKx*BSzLti*K@L54;9{P6>#2J(WV?^-Y-J{V=ba2rxZnFpxtx#udHLi5wS3XMeBn(> z&9;Ie!dttmMk5Qk_c~GfVc)`cdjJ4lX-pt9# z1o(Xvc$3D=TBWu6&~7%;G)#QaW4)eT(W_Eksv9{33${Gy8k>SJH7~H`qfjC3?rYZ$J;n60Pl)FX^W{{ZG$|}S#CIW#828~Cw)mvV(*PMgA z4i28;2`r_3f~;|`bRrMa6h50%U4-cuz*^yr5N8H?~Vp5nG@21DT*#?Oi`aI*^uwAx-@W^JG;apH`>Y7qTrrzb2J=4xWajx(!6-e=T)k^^e_+0&yLjSdssS4vS8XRy@A+hy|aWNiw#@Uqn%un zX+`#AgZY&2k9sZbepw16l>al2b#xMK5MUn!p} zXVt_?*PA0QN9Ja?$Zp`<((Yq5zTUHpuJ1)vdmA-lZJ@7}Rp@R}tMhwVxsLHW?xUT| z+b{zu7(KQ}AbKKD0L{zf#^B3G54ht-M4YAr5?tQ%Y130=>1T)hRJ=Qz(fu`;{YHUUP((|<|_#SL9U)RT%>7qZC=Fd0glgA zIpyp1Jpp}i%~e6~UuEa-)h`qZ^{<8yg>8MvNIJ*am9vcbn{PTbb1R>cCM z^}e^oFJyv79@=&K4_PC+5zyAcD;M&J7xbrsChRP+HbM%LGAQTm*yub?I(i{)jZfM> zIpJxz=R_RF&n0zL@(08V9IRA*vFU3D^Q}35&HFs6E+B#Du~;o<8c`V|t6WRnW34hZH{g(J1sIDo z=kdhM3z2~gyd|<6V4&b|m(BNOQa}4&W1H1kI8d2`)*jS_T zyuKwGPDDD{_qRG@sI;fH4|J06Gl{3y4GN}F2(R`DG{nC>hcwwwB4N+UE!{PBFv0fu z)^})d97XA1ObiP1-202XM2N<v*PK$PhO)m(*4O9nKCIQ{&7>~lk%^uH&5K?s?$8Zl z(n*SGpB=47;2TPB)&I!H;?}4SeaSChk`7!9d`6ck)#qeoovL1;pxVYzP-_|D+X(|6 zl-;K!H3XH=l`TwLgccYXy?-sJvQ#=ms*1+oW3>H2+GmAaC1}Q{S7`Yr9(G?>uTgTU z*$LqjhwyQFj_647nzgGhcSfT60KM5!)@B1Iu7Zy}xv!&Yx+it3iIJx>ZUgBQ1{e9a zV~hfFbGkgbo8=t0Ey7uO_A2h7w@XJURuz_rd1$ZsDgm%WHwyS=Z}O{=k;M%42XiyE zt;0FL=ApZ4O4};;pTxyHN0sI6sfb$|4Ci0?;Fss{y4+3HQfUGc7eR=9?mJP|$(J^%n9QdE%9y8klYA1Pey`?s_C)Fc3a z|J51>(@=!L7&M$6EUazK0RV;Y#3UTJwgFA=fj4jS7!b_x_=H8_s}_`4)~lKnsKmyP z9T-sC8qJI=42vMh6l2ey5Pw%xA3&by(*|^N8~vGiv;Fqqb|m@g z_Q3lbfg&z|D;ahjq4*Bd4c zR*yvV$(Ue?>hpaj6X_wXJCUtpi>*<|z*$b0sQRK(O~lZ8-NjJ3FnfYvFYWks^R<9m zA8n*Aj^Z^|zp~Hc+j3jH-hu|4Q778vAn{&mJjPW-`UtV1Xm62XyTmcV=&@(4u!0sM zy$^O2#a?t=?IdzMs-%p2nEI6wszuB@J!~9D8LYHLFk!@;*|Fh&aTzcE_+s+pRe!Vf z4tCnQOq6?Dle)i|kN+b_oR*zvJZJ!Q8K7WiirBwu)^)<0rmmEtl=5($?Au4KlgX|p zbLgdq;DVI!B0<1}rQ;cy-%gr{AxRKl7Fo`1%}$GK@fLz#2~d@N1&tNXnkYt-5=Hml z;wsfokVxxPd0FOl1#&Y` zZUh;>qG!Vjl_D?1>TSatLmvr@T;Zt0vk$sj;orf5tq4+Kt-k^WGC*WPtYW}<*w(Oj zG1O)lBG8{Pybm#Dq2n45X8$e?mMZdrP<*6TA$oC;Z@`EYC2~)L_=JSUUoQK6jFKvV zoe!iN;JVUXMl=-YvqIv5MN9lO;OPpj2aXY;UWfdu#c%LivKHd=&abQdm<(pY0fkI* zVMJ>YznL@@Xu(h+Mo$G&t#ARbodT;f<#+idhAe(zLZZ$tDw7}lFFtAzQdVMD;%WP{ zcTbw8@+b4V^J9F}9CGI(FL^K6HE%LEi)#yU;})Vc4F1xS+4G`(srP|Nuaht>#;3^2 z9?w;Vzk%19*I3t}Ym!^C02K|U zkE9S>O-wY#G!2q9O!p%d`Z3K+39E!E79d!5*BT zFc0Nm5sWL1$&8VR={F;);1-D)VzrEo?CBHCxF|rvqoP7AOUH>MCDBO^|_=(9h6JXncoH2ycXnta~?eH!6ZVLOqdB z30o;Z$tLjuhq0ztWlYPMFQdE3QU@6UJ$vT>_JH)jqlA)##)MutTnC~P%<-5b8NO8b z1fHQorgL7LsRz=`EfOg{oH{Eu*6{95u&nslKV-UPzE#*z(U9Dr-wbUw^wEOpF~OM( za~0Q%SQIDZo~j|fT7+&DCZ#52=@#e)O*7f$)O>IYJoDXG+s6YLXE?CYFY;){dLK7G#tYsCgGgEd}wk8rY zl7sS;M)SSC+;=%5IgB2{*Du#?*D2O(BdaOoxtE&j5Qpw$%JF9LOf1o=n<~w!m8uIW z%W2dforVX7ex_&-iw`|Zt4(dKMbIxUCU9n-qUB58HvWJD7;3={SQClf9&mtChzcs8#|lzX9vB*=tXuQ zmt((E?R(6YFDs(L*Wuq!77Zp+wvG0$3Ol#@MRi(rvbZw$GvxH>aDIPkP}c-8=lVm_!RFw@QnC-5M7u=3 z#HbI^TiF&n-?FUQWx7^YS=cc0K2&}`6siMp_`F_W-baGwwj5bhEd zV130eC8i^G!keQ$5{C1_Y3E5vnt;`JS%P%c80$o}2YL-%5l_)Z||0cINKowmM&nB&L^Bxv6*# zvCSklW?iLj4=oHn3U>|Te(yuQO`=EjjP`(}mDQKIogK-xO0=B#a=Bi2T>vQnGo_RIafmlhso*G*`Z0gXr|ZE=M1R-4>(PlW1N z!ADh4n&7i-Te^Xxp<)ztKCWuB);9h}$B$^k&f1#I!VR-c!rPS#7_1at%2w;1c2fhB zH1*xMn{7tD_3l4A@N8;&bir~Vd-0N>4(plklbfR7pNc?EVh!%k_aSuzwaR6C?e?Eg z)gcuj)FDCM*JlC;=0ArQuAG*OeP$xLA|C9s?o%Ed@SbtobB}Y(=^RxHAWwW#lnu1& zoiEOg!ZDgK+#iV2+d}f3+3v=YJFh!^$TP`@6Gancb?S;wiYetgqFiomj}gYzTCTpQ zwKUSIes&uBo1%LS4PKj<8AOgjbtW4-N4d4p^&lHNfj6J6Oa(USaeBLZU)}(327|~X zSVh(5(`_O7KE>Ap`z|k@PByi8Ry{`Mw+dENZ@)iJi4wZ1nP{cCdyde(v7HmSK!}aT zk8G!BHN-fXd^VoF-7>xIZjaIdMf1uUHMooXay}=|;+!es?%6FY*oiB9jVwDgAP!3xP$lQH=k`l4y;`@W zcY<1$Hk)sJnp##v`-zvumHY%Qg!k~y6qmG9KFN+IWa-?N-g#@c>fF_%)drMqw~x{j zJL9~(i@offL8enqQp)m9y_hCSBgz6DQq|wQnJYogbj-v%INz~c)gIM)IjG-!zqXvQ z>e?9-8*eN+$D)5IIr+Bg_bfjJ-CKtT5A zpaD|TsQ>_UOl!Eli@vIg=xYZ%9uqSMQ*#~SbLb;8pv4NncE}oOOp@~5rX`c=D$4uDfAyq{eLh8h5yO?hvy&6 zKb458J6oIIi}Xhd34RFgf7$+phw%Q<=^wiNJ(Rz!_fwI;hw%P;!V>tH>#ybk0Gt3t z8ELo`*1iEATwDI3s)7Q#fmwJTm~H-HJJv7Ufwe%b0A0A0luh}3U^PXwjUCFd1R5|6 z`ivhjoiD2#DgDqqm7+AqfVg-yN8SuCi$@;a8V?d)GEyB9p?0MHLc0Sr9 zd3Qq%Hi3GJt#V(+q9vaht)0~dkU5!N>4NM?*f;8l0#8fGp{!cT3mpp9A!BQEPU^4n zs-RY%hfyq4MKg*-Ta~5l@4dt&U*X!?<8;`Y>#|3QQ?Dje4RR8+&kW!)X1wknA*Hc3 znxNTmEdvf(GuSc|Aqb3yX1M2LLwoKKXipf5r0D|QeiLP+qLxxw$5k|Y2z18bAP)%J z@rl)E3R+nO&e!pd_jff~e^HTR`4T0u2X)i7r&~2_ysmGPqet8M0MB9(z~({boz(NV zKkx>jp&eS^YR9_=XHkuMc1Swf4+;w?`0Z*y$#vXZQcIz$e7m~qDatPmAC2XG^Cy0w z_krfcbIvzHlY8nwD=s!ho58r&5TNMI;wE_~P#eag^5`n&JiD*+muwz~=g0*@<%iXktR-)9=9xQV7@GZ5gR_z?sk#td8j+P5WtE z!=4BoWoE2vVsXiN)4T4{s|~s&bqBk;;8bQ68j3Qw8mlJ!i%fa2baz8(Klb#~@L*|E zzUK+ME#j#a75MVltw}KV+Pg2Aa@sXTK~2_ToR+sS-C}EjnBV1a#>%sUyFtiwd5Io^ zT4pT0$?~~}#`#d>BqMLyY43+RRkYf1shgs8;HAfL|Erg^HqkThWFS=n+lmwRJp3=| zKzj!XM|P*c)d# zCE4DUt(flFwTh1ZE~zJoW@AU_x#i9?&M~{HC}k_pws0{kOV0=`TnIuu$+4GL z`*L!%`DSQ7#)yi|wD!7;k#@X1uLxPjeju=&a4ERRZg`1m_qUF^P>0<-AP=@xC0sm} zHM^Y0AVsA21kYGqGW<3%m*MzkkQSJ8TsOJ2;n9#~vr)mull!{(d)1bGiNLQ=Ai54x zUn%#o?RotRPTJc`^72>HbiQs#WnbNqA<|S_EKg9e3@%!|ztjpr8qrCncrAa#^XA_Y zmo(2qr(qT>5Ne%TRrcig#@`Q<7d}!~$N&Wt)K5hj(-@QZoR`Z# za3ZdnL7Lp38|0a!af#dZoOby!3t}~BF@9+glZtBM*j1a(po};U&SMx#H}&LO6BR3E=k_DUF3D7_C}enE*qHMvmmOwn{3TqV8vbI{LFdyREK;?iB)I z#?BekGE@CS3Y;Hx>IP#CdrMfGLb}?t2giies#=(R3yFj09}|ostIC;Y6Xq%CH%Cls z6#VAb5V;8l9fhO@yPj&-r{qbJW!6TayN^ClZS}ZzR4DDWTak$E0n4&if#`-jlxJ#c zur;~XEG9bDK2j#Tk6js2HoZSaJJE3lmOhM~)p_*31|3JutVVb$KAZ8YDIgjBR6El^ zihriYRtYjVxdf3RoTuOx@=gbmOx0sug>rFDGnN~hkQx4`>Ad(}3&;XtE3KdpE(@=g z^b(EEBwRqCn*B9_f|k0|-ctgEKtStv*F`;?_!pnxHL(hbyuEI7>Ob_Is0H3|T3lQd zV3u7ss#33E3XyNAx5kN?f3MciTUgT~h~Mp51mf(`Aj?gL2FRb0wB9C-g^;?qctqZP zL79{rMc9`dDPr|b_Lur+`M7*5KmSZ$bMlN7lQ=Y3 z)crXVrdZPi4bq)8!l%D^B;*hkzIL}IQ_gz^O1QIsN0I-&R85kdz+ zKp;lCKp+p#x$oXH#(i&(@$LQXwdP!9u0JbA@1Z(11v3Qz0HD^?P%*grDqfvCWTaPb zFcl;j0H7#$R94p0R95ED^Ki9ugxdlD8Zl{afJTO9%)QtEQ1jRgE{?m0JR0Q&P#RVL z8rmCLd?KXbv4zo8@olDhNp=LR#o^BgU;@!3lo2*WJE2q*+cKsA`m~_78{XcdKXWfO z1F@GQ>F1Z&fRn|55g_1W0{2axPEkNU*@TKxuFz0)A0JOJpiPk?F$^NS=4KdG5(=;k zeeQz$+`|rV@NaSw#~fkt_(%QwHiiuVMFPIwUj_~Qd`RdTc!-?bL)DKFKp53Y+fAf+8NHGDW5IXoB~*P@rEQH;&s%vm zDZ6boFDGLEeQN60$v{@y=8Ta27<`=ltFDyJnDk$}jYH8ZJ-YNfh-o}>aIZBjSs*vy z1u1hXanhsfGNNM=pLHH%xUH3j4DjHM1G|k;w{Y}*&-jL-GJV9*TK(zJ7is=fiC)%m zTr*DGyN@-_1gME4>DLard-(-U-unp!9Cc@1j*#nRBIjI10ygxhDfaq%1QG(xgG1Fr)Md0cTcAd zt@@iCw@9n=xSDMgjwAW++bA8#ZGKRf1x`_;d z!>KOOS;DeCu1}dUMG}BXd$(h{kgaU+lj{+}NV@lzwOcK!#Ty6_EkO0Vb7+z@amMz!8V;r8f4+P>qTkZc2n21Y8xj zVBvxs4C@gVR_uHvFBRzvNqXDJ#|THl<5up~ledNhaEnM2jy zos2OshVcutnS^<*bXQOhg$J!%_a$MaDGw7{Vf6)?Q$6ZXU$y(q6-d`YbJAJ9DniTw ziwrB|R*R%s6teTf4pB27iz*~MtREAli$kBXs+ zw2Is?l)rn*CQBq;#7BfELx0Fefd2C8Su`0O;w>o2@FcRdC%5Nm`%>>U>t1(h zR-%Hqsvf^pF87#v>UzQj0&}`DwwVZ)uGg!3zN$@}O9a@2&6UYt4Zm;T^l>COHr(|~ zy08a&+!?eGGJRqK&TKuELf#zS1!UZpu>{>|l{s9WcHd3u z&GFOlvlki_U;CQLtg7?j=eucrkUmmhL32F+)km}eq-fZ{)?nDcCx1zc?qkhIvx)m3 z#q#6wb+wk0gSnMc$CKRCR{P+|{3&4W$@^kF+9?ugN9j6Af{CT+%|fyQFViQJ5b10E z-}{XFEs|OCImLCd?!VTa*OG-cLRsFgZJ|6R<&tuB71Xew5(WnQpY*-#FHZrbDDW|A)5``jY3oh#_aQcK%6Gef7FH$X%F7o;t$?-Nz_^0`w9J-%Lo@t%|4_#T>NZ*i>liHHjQCTbBS8iD) z=*(3`tJcO5$K7K%V%C3Us`f*TT8*fO>Y3#leC^g+U0lsAb-|_Pdc>X&opuT=g_|cq z=lg?ZohqIA2g}(^8ScXaLq9VOhvkN(vg@*1tAwkgYor~_>&PqkD;n(LYP`NI!ULv{tKOzrWG#|6DqvpkrtI!uUZ!se#aMX2 z`rk#oAnMKQ$XibO!HDrie_7UCj9D}KakyYMnYn3>!6knj)q=6vHhYP<(>COIXS&rO z7PsbpzNq&@eQ)q;9Bg=brKZBc*stglhhL0G)rSi!vp=Jb_V?y6Uk6RB5wl*q`mRpc z*GuU^eDdw`ALU1br~_47oP#Tnb<4L~d9`cODc;onCJL#=-^LdZpa`4@gQ>enNQvK& zw2+BX4^VAWeIhBRD5JSe<4!)yv@dN0GGd*h zeban_My5tyQ)tl>+w(Wnf_3J(jktD-Mfx2RbIYP?QNQmE#uJ~VKR;A^_M!8`&WBbH z95^lK3#0b~zahSvv_|B4*5=UsAWMu_wBV~Crp@b*7^PUT*IRjm@3iyh@vTxXr&$h! zq;IA9^0{;MD-`iK-UCA#_@feUy!BAy;MKTc{Md-R%h%}h7Mb{gw!Vd_Q3v7@gj6Cx%zt@JY~0IH{nTVUG4Y6b=Y^R%av1Q zR#0kV+!|-AluvpNspo`%6y;Gj4Z4zVZO`kpiutb&)!nIMbulbZ|#4mOK4zoau$DH;$S2GogLWQ z-D`Pq<6 z$pw5Ce2S1AO&QtDL821ftxGJ>mm4;??)G?Nwgix>Im!q8%j1L|d4HzN-@JLMf4j+T zcy(@e$9raUp`u~jV{+RLk#0NlV_6_XcG3CkV&LGJ$&T~EF7kv=z~^^u75asHtW3Wk1cboK}eVsq_x{vF4ItW`XKxD$@9}3?E?FYK(6n zs0%CGY#(K(@c>%llg@f)@^Toa7*s)DpH5R}QzO~-7#l90&wkFE>6l4z^}zF-*X`H& zyXs#2z}e3@bZw2vjyD#akg(rWm~cFO1eLX0Faf#2mlZgI~tjKn(91|dFJXYWDRq*u@&-lcDq6Y01#i9tE;oEr!|MK zGu#Cs<15GY7eeOh{>KdB;`j^V=_JQxs-wrD?CN35At59#B+MmG!NI`+@qpRM7^tZI zi+=Sd$K~MZ=_UgL`S|z<`G^U*df05-_PH5+WI>FCzA`}Uu|7A2>Rmzi3kaU{x6!R zquu{Q`{VhW_E%qjr-S?nCZp%*YYR71adftIL0pw4FAkQ3{FUavJpU>5A57DKFeRk_ z$^3`sAIv|M$mn`F+FptDM+$in2c5!93LNh+5KVUSZkzYn^zHJ3jKE2!Xml4kLWf<0%A9f~ zxr;Y-RXZ)#P^u;^~$7;_HrmQkhETj4PJhzNp0voig!po0Z;>K$zJFPv0QFh*WqlXg% zUwx$FbeCl~t;X|@lH!+xD?~ciWAgebLM?dTrk0AAFHP%7pJ&Fc%`9_l>ZB(LR*6Bp zQeJKjvL|M|z%|>uD#TjBq7Ey1b{Y$$1uuW8zBu|SOLCmrR+N6biS|~5|6nprzV5^I z;cUPrSXXiP8ya^Zq-HjmKr($}MW)(Yy1){HX1WNA(VAEQ@HLIUU#_0f8rw@-YB_*vPEYC6i zG@@$*hK@yb*zWeQFGp7Ir?3hS1SHRPmN>FQPGWAkIzlJ=8DvR#gi8A@W!!@bDGPt8 znkYx>m{1f(mqVP={5!6jMxRELHQ_7Qs?)A*VEe(zgYA&5qQJyLm zNJwR5UfM`&LD$<8D7C5WjzQ0-0`QuNPEdW!neYjJg4Nm7U1W3NgPaOitfPI@r|O^1 zF=1>zN*;M-pUXWegGhi~Lvx|ZlaIukA&5m&Ev4vw{U1Hgr8_`xXObOO-Pv)CsZ&mjS#=5O>WTP=ON{l_gakzj2{!7K>DUfdP zRbeAJEJD~Uv_v#iAX{UstM}qZdPZBXF1i{nyItCJ64?lm1bcM#JtSB+RV%rzcMqzo zDcoGOO?a&XJ@pP~OY!bSZ?wcSaX>V6(Q2`aILVl(on@2$%I_mev^Y~&C{KK2;AEDi z*e}Oo&D{ng@UlT`c7y%?&BI}PN{90a z9q@NygW6Kgr%ByK{hu@e;t#MD;2w&{iC&%5B%|&360Nw-gzY?A|VGYGZS|N z{@M#ZZ8?9{;C(U0q^220=gMkXSjpJTrdt+KRGPrUZ)I1y8Rk}iDVV{Wh#FC~nC~Y0 ziQG)h*#loZH#cgPV~2rCEe%diQ%P*x9VZ*- z2X#jK^KvfHEYFL{)Q-&`aGbC31B|=`(WxIZSEMkgva|7o zzW8?DmnGLSF%DnO=*hU_!qB_$*2~HY9BBd#I@`sUx`V@APlD{dlGSLxu=|UU2UKls z&q(%0&1>j_jvi(ab$N?g?olki1IpLgq(lG#eUs$DR5P4mZEkEZCNir@;v~)l^J>Aa zp=pOvu`yFXCHVp?60bqlLIe!-I7m%w4KZsgGJL#s(TJMu&K0haGI7nk#^M$g!#SCM z7C|d67Y~u8I;hB5=XMLhjU&MF@FK$5iS|C89(Ggvmzoyl* xNra@&;1dHnriOr00hW@DaKkn$FIKq)5`acNPLby@L;cSVq^bH)r3`8n{y$j=t&9Kw literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/add_to_fav.png b/tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/add_to_fav.png new file mode 100644 index 0000000000000000000000000000000000000000..ef05e3ea12324a7a3f90b13b045be5755581ef62 GIT binary patch literal 1134 zcmeAS@N?(olHy`uVBq!ia0vp^20*OG!3-oL8M5Ml6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L3g##adp3|2E37{m+a>JN2!#MJ zls3lt@Bpc#k|4ie2E}l`I;RHaQoZ;T6UhvJPtF=)>qslce02@A#26c)dNz*$4mnLb z@6c>1%b@h)S|5Rm++;HyQSJo!U;}+;U!y={m8uAK{+vn$$0${%YF6n~8Fve<5}u+g zH*qoDG}D)JC#wQ&V@&dPcVXyYmGuB}I14-?iy0WWg+Q3`(%rg03=B*ro-U3d9>=GK zW=20Ukl@)Wo5d=+JLl$9uZvn+8#*ciV;nv>#74%3?CJmiUwzxdfE#MJo_XK%OaHXw zrM0lr4P_CfgKY{dkNrCyxhOQUcsTw@l$>ywk!5m#h!2~9kD}1QDfM+Cms@<4Uqu@< zM>?e$KAtW=yVp$DQ^^G`wq{ zZ#3auc&3D=e3PpV?`c(?PZ7&@?GZW|vARoF`UKxa9iE$EVQYO-QX@^-6ZF=v7rka^ z)FuB~#Qo#fL$l_cpU6AgZi?CVmPK3k3g6Q0mt7imkN0hkw`*edW|zuuZM&t}mv+s+ zykg3OFW*G(G1t|eUC&g_+?`>%;GgJzzAJWRyY&}+wA|0Q(ehVKLC4}`yT3m;+Swlm zY++b_^zn8X5u3cMn-+mLYre9WB^w4G)HHr~&Trw2HR2C#4g}0$tn_=7vA^)0>v_e( z+7zh|doCx;u(8YBEVFp=SHQ_aa~a|L088VE3@o=ls>2?u2xbJ-}?Y6ec%zJ&meE0Wto>lcv`L^fOadBFi z$}8CIIyt3Ip*x`{ZX`F}3;pYqc(4$t>c@ zdAyYQu+(mmq-l-kxO2qp({`wTp7mG$+`e5K4(^J&l{aUvp;Tmbv2xGVdQ+2AZysx# k&-j~OD^xG~dhZ|hqr%oUwg!7P0}~a4r>mdKI;Vst0Dq@#+W-In literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_18.png b/tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..2a9bc9caa11032ffa60222e80e63378ddd9437f7 GIT binary patch literal 389 zcmV;00eb$4P)Kn{dM zsgiE)ADr{v^Vn%n?Dqli*|Fn)(UL+d8rvUjbJddZSL10|`KMRUwq6~wWZe(hqVLu% znWo+izr^_cbVZFt`HL1+%-9sMYStb{Jkpn%zPM`2UMIZ~v1vxhvWVA=T#}lOF*M=5 zh-D=oMa+Uz!+KKbrK0m9I!gLtpb4VdbB{&bQ*=xAu*yXc`r=!(5eG%7{G;N3&SoJ{5TM==B zp$j6S>xqY6iHHqN6;nD=>As@d22!eHT8&9<8THOZRi|}j*g)GP)Z1^~Eq9zzZ^B`h j-8Apdgy3SMU=#oVO+Om@%^LtZ00000NkvXXu0mjfcz&ts literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_24.png b/tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..f3434107c87200ec736dde3dcd96ca72452e437f GIT binary patch literal 402 zcmV;D0d4+?P)jP!Gmf;(g+;_mML&mi*+w|`%ocgGEjCxeBB z#lfZ6CG-wDxXUgM?z)SEJMBUuf?cbNJMO}jG`d*i;0m!w7iqX)$agw8xIuLA9UcBN z%fSs}mj7t*g-H%>Atw2XDvgS;PdN_28@%b!Z%nulK(#1sLB+UdgW90V_!K8!pihUxjP5L<2|^DX9uBA&zREk*l%E(lL#_P$gHC+Zwo# zA<8|FpSNnZ6Wgd`m9f>vT$__FJ9Cq>J0G9L{7!rB`@A2na2&^R z9LI5-kWk{>pcvtY%59ZYZmXnnTP2m-DydvmNl=U%`K6MpR3f)kx|?q+Rc9)fdBG1d zQ2|Z{-+93WrcxEZ)Zzf?s1Qs#`>BDCCX@7!yVU}ZQF)B>62n&743|pa0 z`jCV2L>h-Av6Ue-rwGNF#w8#B=6XVDS~8v^o{t+rd9tkyuWx`c$ z?<}Gx+FCoZ-1E#wt3vIN&DQpwAo`}AkcG&itmYe&h%pjmZH?nZX@8fZ!KXs0Y@-a2 zZY0PWXvd}n{~NkRGbusP#_k(>s;#xR{15$PsGK00sqH;QbXr^6itL59x63|3ILpo; z8fA4AnU2zCfFB7xjD%6PSL)XmSLz6g+9$|YYS|{wov0zYLX7m>eAoDx0G)+uo z-g`AeX-*lsFrW7*VUl`8$TDtkzzK`6w8A26UBC$| zg7?;u$nby@CgY=89Q^MCYdU9X9$>;jYT%b@OyM%m`A!;NdB6$g(#Y?G@4Vom{^sg9 fj^j9vlMDO-GF)(NEB5pb00000NkvXXu0mjfLC6^o literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_48.png b/tools/assets/App_Resources/Android/src/main/res/drawable-xhdpi/baseline_motorcycle_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..a3451d3c29e1143243d6f8b1e49bb2eb9be1a8b0 GIT binary patch literal 775 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 D3dadX literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/baseline_motorcycle_black_24.png b/tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/baseline_motorcycle_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..0522d79e704d7a0527ac3cf5cace54661add0f11 GIT binary patch literal 593 zcmV-X0SNnZ6Wgd`m9f>vT$__FJ9Cq>J0G9L{7!rB`@A2na2&^R z9LI5-kWk{>pcvtY%59ZYZmXnnTP2m-DydvmNl=U%`K6MpR3f)kx|?q+Rc9)fdBG1d zQ2|Z{-+93WrcxEZ)Zzf?s1Qs#`>BDCCX@7!yVU}ZQF)B>62n&743|pa0 z`jCV2L>h-Av6Ue-rwGNF#w8#B=6XVDS~8v^o{t+rd9tkyuWx`c$ z?<}Gx+FCoZ-1E#wt3vIN&DQpwAo`}AkcG&itmYe&h%pjmZH?nZX@8fZ!KXs0Y@-a2 zZY0PWXvd}n{~NkRGbusP#_k(>s;#xR{15$PsGK00sqH;QbXr^6itL59x63|3ILpo; z8fA4AnU2zCfFB7xjD%6PSL)XmSLz6g+9$|YYS|{wov0zYLX7m>eAoDx0G)+uo z-g`AeX-*lsFrW7*VUl`8$TDtkzzK`6w8A26UBC$| zg7?;u$nby@CgY=89Q^MCYdU9X9$>;jYT%b@OyM%m`A!;NdB6$g(#Y?G@4Vom{^sg9 fj^j9vlMDO-GF)(NEB5pb00000NkvXXu0mjfLC6^o literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/baseline_motorcycle_black_36.png b/tools/assets/App_Resources/Android/src/main/res/drawable-xxhdpi/baseline_motorcycle_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..1bc61bfd102411333f865c87fedbea02a6d4472d GIT binary patch literal 1016 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 S)$~h#C}2-z*w)(kr~U&Pmn=pA literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/baseline_motorcycle_black_18.png b/tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/baseline_motorcycle_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..0522d79e704d7a0527ac3cf5cace54661add0f11 GIT binary patch literal 593 zcmV-X0SNnZ6Wgd`m9f>vT$__FJ9Cq>J0G9L{7!rB`@A2na2&^R z9LI5-kWk{>pcvtY%59ZYZmXnnTP2m-DydvmNl=U%`K6MpR3f)kx|?q+Rc9)fdBG1d zQ2|Z{-+93WrcxEZ)Zzf?s1Qs#`>BDCCX@7!yVU}ZQF)B>62n&743|pa0 z`jCV2L>h-Av6Ue-rwGNF#w8#B=6XVDS~8v^o{t+rd9tkyuWx`c$ z?<}Gx+FCoZ-1E#wt3vIN&DQpwAo`}AkcG&itmYe&h%pjmZH?nZX@8fZ!KXs0Y@-a2 zZY0PWXvd}n{~NkRGbusP#_k(>s;#xR{15$PsGK00sqH;QbXr^6itL59x63|3ILpo; z8fA4AnU2zCfFB7xjD%6PSL)XmSLz6g+9$|YYS|{wov0zYLX7m>eAoDx0G)+uo z-g`AeX-*lsFrW7*VUl`8$TDtkzzK`6w8A26UBC$| zg7?;u$nby@CgY=89Q^MCYdU9X9$>;jYT%b@OyM%m`A!;NdB6$g(#Y?G@4Vom{^sg9 fj^j9vlMDO-GF)(NEB5pb00000NkvXXu0mjfLC6^o literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/baseline_motorcycle_black_24.png b/tools/assets/App_Resources/Android/src/main/res/drawable-xxxhdpi/baseline_motorcycle_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..a3451d3c29e1143243d6f8b1e49bb2eb9be1a8b0 GIT binary patch literal 775 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/add_to_fav.png b/tools/assets/App_Resources/iOS/add_to_fav.png new file mode 100644 index 0000000000000000000000000000000000000000..fafe86a9061a1b314a976dedf154063e5acf24b0 GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^5@CQfaQEB+4jJY|EeJ!r>9<9jdJr z7Q@bzA!aHRtXpMOs1aL~r>t(zvU=XrYM@z+N#5=*3>~bp9zYIffk$L90|U1Z2s2)~ zTlWVj_}bIOF+}5h?!=oyO$I!!i#-@cr*<`YI2MW@tv&qq|9>xSW|v&KOSg+Jrx`Jx zSRBAmDAJvzH`Qy>g$bM!U1I`GeM4E?b}|KMa`&v_TM+)ga_za|z0(@o95XKGtjuk` z-?QzO(d;P_yc=?MJ}!yvRW0=?-tFhUO_$;P`@eO!Kik%QX+CH!&+^xW=d9o}<>DD< z&E`F+F>(vu^ipT)=Lrv=b8ClQV=7M558k;&Ii*5--u3Kx;c`Z1@1I3Wv6TGI+vj*J zkN-(Q&!WeT2kP2;F8>s&+os++{WGVo>ArhGwY!h~Yzopr083JN2!#MJ zls3lt@Bpc#k|4ie2E}l`I;RHaQoZ;T6UhvJPtF=)>qslce02@A#26c)dNz*$4mnLb z@6c>1%b@h)S|5Rm++;HyQSJo!U;}+;U!y={m8uAK{+vn$$0${%YF6n~8Fve<5}u+g zH*qoDG}D)JC#wQ&V@&dPcVXyYmGuB}I14-?iy0WWg+Q3`(%rg03=B*ro-U3d9>=GK zW=20Ukl@)Wo5d=+JLl$9uZvn+8#*ciV;nv>#74%3?CJmiUwzxdfE#MJo_XK%OaHXw zrM0lr4P_CfgKY{dkNrCyxhOQUcsTw@l$>ywk!5m#h!2~9kD}1QDfM+Cms@<4Uqu@< zM>?e$KAtW=yVp$DQ^^G`wq{ zZ#3auc&3D=e3PpV?`c(?PZ7&@?GZW|vARoF`UKxa9iE$EVQYO-QX@^-6ZF=v7rka^ z)FuB~#Qo#fL$l_cpU6AgZi?CVmPK3k3g6Q0mt7imkN0hkw`*edW|zuuZM&t}mv+s+ zykg3OFW*G(G1t|eUC&g_+?`>%;GgJzzAJWRyY&}+wA|0Q(ehVKLC4}`yT3m;+Swlm zY++b_^zn8X5u3cMn-+mLYre9WB^w4G)HHr~&Trw2HR2C#4g}0$tn_=7vA^)0>v_e( z+7zh|doCx;u(8YBEVFp=SHQ_aa~a|L088VE3@o=ls>2?u2xbJ-}?Y6ec%zJ&meE0Wto>lcv`L^fOadBFi z$}8CIIyt3Ip*x`{ZX`F}3;pYqc(4$t>c@ zdAyYQu+(mmq-l-kxO2qp({`wTp7mG$+`e5K4(^J&l{aUvp;Tmbv2xGVdQ+2AZysx# k&-j~OD^xG~dhZ|hqr%oUwg!7P0}~a4r>mdKI;Vst0Dq@#+W-In literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/add_to_fav@3x.png b/tools/assets/App_Resources/iOS/add_to_fav@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..67ccc7dc33ab38a86e38d2bde1ff23e2fdd846ef GIT binary patch literal 1584 zcmeAS@N?(olHy`uVBq!ia0vp^9zg8M!3-qttqoWWq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4FdyXOn^^_D^S7zQ9y$b z00wOG{mXxVRB=g=UoeAWIA5Jp19Pcfilo0MXN`!cb($4pzPg55QH+gHJ-bH|TZOc7 zR;IpuWr#B`zeBN-oR+D*cW7cxc^<2PjFEeAY(}lNTXi-|n4@cfpNplgvV>GgP_lTT ziE5P@M}kFwL9Q^jrfsxu8B<_7k3y=U&ldYRZ-Le`CV9KNFm$lWf)WpBfk$L90|U1Z z2s2)~TL*L?^CnLh$B>A_YiEQzzj6?075vB|ed9nkub?y+2bYExM^=c-(WbXb-|l_= zZ+|CphlZfXwU%0g-PV)!r8gNDht2iddG$(x#YdC9`>f_fH80$zwZLk@Iw_fh91^Ws z4X+&6?&Dg(#+G&ATqX+-+k!yj6`UD)Y_ql$`J^paDrzv>r0G^e+1z!qFD@M07}4lA z_Z@%2)(obb4SHp7nQ~@1+;!mJ{f*&nl*QiKhPkD09OBor1=v40@m~_?Jy*|)r#l)pzP~8(Ac#|n{my-5bAxq#j~6cZUdO+8 z3Y*O;2Vwh50;8jHEy{z)I0`$OvfO**npeA|TP@N4y{rab!p?ZrHwrn?H9+;nH*W0M(|J@Q+B zZl7bu^-L%^zjKCm?)oWLZ+^XY{E1`q#d9LJW?cF3^iWUMk=0BZ@*A7qzxi0T{>rnf zn{R%1T(_f_@%ACJ-3OzV<)p4TGpV>kvmxVmxlw+xQQ)~b9!5K}-Y#i9S^SLm=iluS zhOTk?&un=<75<)9{ORPh+>6tTt0uGF-I#v#&8O4bj^Ehz^zk&MYX=uj?33Xt%r2C& v-;p){>ERbsigW%x`FFncWw6xt{|rwL0XyrEd zFINS{=g-hyb)r>5UYuDb?1d+jOpj)g`*bm7z7s(=)R_G`B;6V^nCI#gr<~07;}=X& z>5x)5Jxx(_=2qs8B~^!+1Ov^ZFKp+%mN>s$qS(d9Ao}h>MV-5g!xEk69JilybHkFr gZA-qj$3JCj{aN>UUxMc@pwk&VUHx3vIVCg!0NvjP!Gmf;(g+;_mML&mi*+w|`%ocgGEjCxeBB z#lfZ6CG-wDxXUgM?z)SEJMBUuf?cbNJMO}jG`d*i;0m!w7iqX)$agw8xIuLA9UcBN z%fSs}mj7t*g-H%>Atw2XDvgS;PdN_28@%b!Z%nulK(#1sLB+UdgW90V_!K8!pihUxjP5L<2|^DX9uBA&zREk*l%E(lL#_P$gHC+Zwo# zA<8|FpSNnZ6Wgd`m9f>vT$__FJ9Cq>J0G9L{7!rB`@A2na2&^R z9LI5-kWk{>pcvtY%59ZYZmXnnTP2m-DydvmNl=U%`K6MpR3f)kx|?q+Rc9)fdBG1d zQ2|Z{-+93WrcxEZ)Zzf?s1Qs#`>BDCCX@7!yVU}ZQF)B>62n&743|pa0 z`jCV2L>h-Av6Ue-rwGNF#w8#B=6XVDS~8v^o{t+rd9tkyuWx`c$ z?<}Gx+FCoZ-1E#wt3vIN&DQpwAo`}AkcG&itmYe&h%pjmZH?nZX@8fZ!KXs0Y@-a2 zZY0PWXvd}n{~NkRGbusP#_k(>s;#xR{15$PsGK00sqH;QbXr^6itL59x63|3ILpo; z8fA4AnU2zCfFB7xjD%6PSL)XmSLz6g+9$|YYS|{wov0zYLX7m>eAoDx0G)+uo z-g`AeX-*lsFrW7*VUl`8$TDtkzzK`6w8A26UBC$| zg7?;u$nby@CgY=89Q^MCYdU9X9$>;jYT%b@OyM%m`A!;NdB6$g(#Y?G@4Vom{^sg9 fj^j9vlMDO-GF)(NEB5pb00000NkvXXu0mjfLC6^o literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i18x32.png b/tools/assets/App_Resources/iOS/i18x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a232174190aaf1199002f08627f1a138662b9ac4 GIT binary patch literal 3441 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 Kw8+St;r{_w!aKtN literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i18x32@2x.png b/tools/assets/App_Resources/iOS/i18x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a232174190aaf1199002f08627f1a138662b9ac4 GIT binary patch literal 3441 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 Kw8+St;r{_w!aKtN literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i18x32@3x.png b/tools/assets/App_Resources/iOS/i18x32@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a232174190aaf1199002f08627f1a138662b9ac4 GIT binary patch literal 3441 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 Kw8+St;r{_w!aKtN literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i32x18.png b/tools/assets/App_Resources/iOS/i32x18.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ba2f305ea974dc3fa02327c5d1e56781080178 GIT binary patch literal 3419 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i32x18@2x.png b/tools/assets/App_Resources/iOS/i32x18@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ba2f305ea974dc3fa02327c5d1e56781080178 GIT binary patch literal 3419 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i32x18@3x.png b/tools/assets/App_Resources/iOS/i32x18@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ba2f305ea974dc3fa02327c5d1e56781080178 GIT binary patch literal 3419 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i32x32.png b/tools/assets/App_Resources/iOS/i32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..0f778f86e92176943a6c0658a14d2fe23e464221 GIT binary patch literal 3428 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i32x32@2x.png b/tools/assets/App_Resources/iOS/i32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0f778f86e92176943a6c0658a14d2fe23e464221 GIT binary patch literal 3428 zcmZ`*c{r478=tW@BH@Tc#!ML$gOC|xo3Tp;Yjdy(umJ!74qY7$?Q)dhYtBb*au|#(VX96Ao(1|6dv*JuF1iDrO;f;gb5b)UzQJts8 zXim+5N-l0aF&UPKxZ)W0gcfsbvI9`CG~x!({(KDc(MUVSl`wX;4@h$WFFCk{+s9|% zQ||6k(CS`)#?Ibq;1)HopA}G)2>ng8O%_mi~}Z%qfTLfQ$T}@9PR7s{{EHjbvu($7pKxL6)~9(6@bj}f5G=tME# zxlEGj@#4A)?$LgT2uYuOh;T?>?dt`Bh?@TV0EVbGt`0`Ey_m(!_fvku(P-^)jh6YN zSRc%Ia(2sHeoo~2{j{{VLqUT0#yg?wvHS6kx7t(NVlzH}tnZDP?KI>SC5`Ooy;^G~ zr<~6X{DVaxjVbxcair{^{3C;_G^nk5ukk)&@r%RafJemGIj@A;5{eP2cfMx3_nD%2 zntYewYkDJH&gZ3Iycw%5ow-{-`0U;@0;uaj9qWLn;7p`)*GZ7b94V)t(-PTLqT8zS zg=BTsKUq=7n3VGpvz{Pc@}<%f@nt|y|HxX_QxUW=Cw!#OI)(41-r~_At24PT-i2*{ zPgOpC3{{Y!MCNsFw8zU?34#<({dsR9e%P5@L>5ZXIRCU_fVif4dn!d zZ*89E&7Jcb!|k%;43ss(S@6<8fB78GUr;OV} zok0f(DLY{wAqnPt7ioQ6Sd2MZjklP&s|7U3&>s;$D^UY-i`{c!rHN-6}&ysZ288;45g7F;r(iS`72n? zjpG7gTKBdF`S`=drG?DGy=ObhIC>+3XOH_a3vxaUzc4H4$7;oX<%RZ~!#79}PZQ@> z+tWE2Cb0d@@M5S|49A~w-=Ic1f)KQVh`$b(ajYD~RR>1od#^nW&XZAO=V)u^xBVz{ z?GBcmubibEWD+LcF>IG5lOf|P!+6K2*Y`Z{qg(Rr6Sm`HM+hh%Nd-R3n@>7(JFm4) zcOA3s@>CRLd>CKe=|2bYjIH6QVVDA1@lb?DBTu#8o?G+NY!I0St|l(c4t=iu#!WY( zGt-6W$M<-`FJYl~xKKxon1CYLSdC&>4s1%K;mjp&e9VM~(tXurZ7ahmT@;!CorWCa zg6Td#W1Ye%eltyH0xcmbpF&B>O;Snfw&!>*iAd^&IVQ(MDio13$U1jhe^O5gU5`F>e}1{nOF=m~*HBe!^+96Kt8UAe(cMo| z;i;;ynE^F^B)bAM^I58A#9G)IKD>uvBw~ztl21;mru;hEHb0^q{TQ8#PJIy^1&_O= z>DzIpgBm9pXGoUTW6=xOb0Hs-ur>-PPih(r5%IO1e!+88SiG%=rANKzRNAAo`m`<_ z&J<;OQ{t>d25!1o7I)W_$8@VS_ll5FK?$OC?d@i%H8!v#&GGr2?q0h^{9W z^G0-|Ww0^k3KR#mEYO`V5!D^ix^S8F)FFDYI6W&p&+LI&WMFrKX(r$lD{kTGl&RCX; zwI^$!M#+1cS=8_eSo>DZRXD@_r^p^4Ds?G7q z^r$3JmnS~`QR82?Q0ra)sy6ySP1P@hpJTS1KJ$OA*qE9f{}lCgeQkpF_LZ3}Y25px zk-N+4?dgnQF_l)8B9(z)jv&n@*O0Qj>Y3BcF#XC5w)CoRjGwqo{Asp?@ zEKKRlO-E!ode}d(KVW{!M&Ufo=?NM?xvq$V;{+$TM1`tQkEIBZDai)u230%H_Rg5> zWW8ki%Mr04oH@>WcuaN+zmv`(S#6bDPj6+T@~)U!*_2es`Y+U)zImkh=(5(0g0_N{ zf@UHeLC$%`?{mq&S8SAApSP2>)I0g=RIGQ5b&yK=+X)Iv)^^HkoPUOUb!|M~Fm!1f$+d#jUoNA#G`4=Ht=KsD+0z?<<>B@D zP!na6{$h*PNN1eE;Db8`LfP^cmk6hO)_Y5-=!ukyg=#|T#}^+HE!(QA7K-25FR<^; zZeuVM97U|!H+#1VqiPrOZhx$i8Wh;Qx$580aB5q0TXWmyXbtnl5ZT?5Zx2g^JeBHv zuhLL8N2~SAR$AR2QY)jLN1cp{45V+$t>QoRP40Nklm?H+pN~66gVFd_SK*tIZj!Gh z#!c5N#>XtjK0T^!UR+yQEY!OqmAAc%$v*GM@Eu0O>0UwO8K;3 zBzWx+zL2adjlDy@Rtu;bgt}sB3&@qax`2i6cR4&FYi!>wuNPD&)(W|}%KiS>$xd!T zn6;~;%Vw8*_f;g13JiI9B8Pw~3NEF~(Y&r*7;b3tuQ;1u)GYtJa_QDqW`e>_)ljp* z{#BCME@2$8O;Q?2?O)2tt4s2A zKQwss%}tE2_>2xrmDRo`4t;PSW#C8O&zuicqPo7N2EF=jw&FTD>8h+B&_Cl@M_Qvy zQXg%NZMjX`1T-(HFGn^_FEs83H#E&fcXQ4t>xIf~E3SYxb*D`-A8HPy<(ckL_5)3t zP4{bo)!~$-)&XHoBCE}Q^7pRM{2abvK27-BYa<-l9C<=({I$Ekk3Y&EeKDHqPTUvW zsa~%Ra5vn2Pj?)3YF{2ydRTpoSw=tO$(whVnK8OfeP5txX#DGGcQuEDF ze?;x(xjmP)i@WZwGr>)&nR=O7+(eC>OtXVqS3*4Ftnvg53kBYzvV@(HpM(w^$)c?| z9-+f>X$6k<%xb1e01*qoxBE9h$Pf2KXzXeL0g--y!o`es)ieP|H-!~VH+9R@`z0lu zPVOR#x%=AxZLg^Ro4mbR$832KjFs z4Ls=v(b>bx+1(9%7}wU$-P=nU0y#|d_w%z(yr1(wncPT!wRO-S{LllJk&=f0FPfLL z!~dZjdVbP=^z}0x>M$4*>+FXoSZFxA;@wCGrK!jv6i`3X{LAxCp}#QAe__fi{>uEt z^9%E^5~Lx~8Gj(sp%f}IDEPl@f8kN^L!Exn?dMQ_SP!P6!iIwXJz*6#rupj=2SeA_ z)lkQogJ`4bTmUdTV{2N;S^7~moEZGfJCeM|-QA)JSBuPZB{oyA;h8r*g`s5D<7xmP k(=VG-p9aOEBsqJN`KB%lg$WD89sW$ZnwK>w=<5;x0hC8DJpcdz literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/i32x32@3x.png b/tools/assets/App_Resources/iOS/i32x32@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0f778f86e92176943a6c0658a14d2fe23e464221 GIT binary patch literal 3428 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/testlogo.jpg b/tools/assets/App_Resources/iOS/testlogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..102a9b13475b7cb2c39bd5aa1bf6fef6a0ec2373 GIT binary patch literal 3924 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 Ef4RP_fdBvi literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/tile.png b/tools/assets/App_Resources/iOS/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..7ebde26a0e80acc0de0169d548b3c7a9d60c8cb2 GIT binary patch literal 3491 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/up@2x.png b/tools/assets/App_Resources/iOS/up@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..04dca794a7db34141c8da2fe25f2da8f93e86f3e GIT binary patch literal 5192 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/up@3x.png b/tools/assets/App_Resources/iOS/up@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..04dca794a7db34141c8da2fe25f2da8f93e86f3e GIT binary patch literal 5192 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/upccw.png b/tools/assets/App_Resources/iOS/upccw.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad441c51a7d30ea0fc9079d4dbb1fcd53791407 GIT binary patch literal 5276 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 literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/upflip@2x.png b/tools/assets/App_Resources/iOS/upflip@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..af39cee601f3bf9f7a2011e67ef1b6f03f4b9f02 GIT binary patch literal 5147 zcmZ`*XH-+`whc8@5fSOql%hcB5C|=F5a|dCQVdN(4ZT;TC>^O1QIsN0I-&R85kdz+ zKp;lCKp+p#x$oXH#(i&(@$LQXwdP!9u0JbA@1Z(11v3Qz0HD^?P%*grDqfvCWTaPb zFcl;j0H7#$R94p0R95ED^Ki9ugxdlD8Zl{afJTO9%)QtEQ1jRgE{?m0JR0Q&P#RVL z8rmCLd?KXbv4zo8@olDhNp=LR#o^BgU;@!3lo2*WJE2q*+cKsA`m~_78{XcdKXWfO z1F@GQ>F1Z&fRn|55g_1W0{2axPEkNU*@TKxuFz0)A0JOJpiPk?F$^NS=4KdG5(=;k zeeQz$+`|rV@NaSw#~fkt_(%QwHiiuVMFPIwUj_~Qd`RdTc!-?bL)DKFKp53Y+fAf+8NHGDW5IXoB~*P@rEQH;&s%vm zDZ6boFDGLEeQN60$v{@y=8Ta27<`=ltFDyJnDk$}jYH8ZJ-YNfh-o}>aIZBjSs*vy z1u1hXanhsfGNNM=pLHH%xUH3j4DjHM1G|k;w{Y}*&-jL-GJV9*TK(zJ7is=fiC)%m zTr*DGyN@-_1gME4>DLard-(-U-unp!9Cc@1j*#nRBIjI10ygxhDfaq%1QG(xgG1Fr)Md0cTcAd zt@@iCw@9n=xSDMgjwAW++bA8#ZGKRf1x`_;d z!>KOOS;DeCu1}dUMG}BXd$(h{kgaU+lj{+}NV@lzwOcK!#Ty6_EkO0Vb7+z@amMz!8V;r8f4+P>qTkZc2n21Y8xj zVBvxs4C@gVR_uHvFBRzvNqXDJ#|THl<5up~ledNhaEnM2jy zos2OshVcutnS^<*bXQOhg$J!%_a$MaDGw7{Vf6)?Q$6ZXU$y(q6-d`YbJAJ9DniTw ziwrB|R*R%s6teTf4pB27iz*~MtREAli$kBXs+ zw2Is?l)rn*CQBq;#7BfELx0Fefd2C8Su`0O;w>o2@FcRdC%5Nm`%>>U>t1(h zR-%Hqsvf^pF87#v>UzQj0&}`DwwVZ)uGg!3zN$@}O9a@2&6UYt4Zm;T^l>COHr(|~ zy08a&+!?eGGJRqK&TKuELf#zS1!UZpu>{>|l{s9WcHd3u z&GFOlvlki_U;CQLtg7?j=eucrkUmmhL32F+)km}eq-fZ{)?nDcCx1zc?qkhIvx)m3 z#q#6wb+wk0gSnMc$CKRCR{P+|{3&4W$@^kF+9?ugN9j6Af{CT+%|fyQFViQJ5b10E z-}{XFEs|OCImLCd?!VTa*OG-cLRsFgZJ|6R<&tuB71Xew5(WnQpY*-#FHZrbDDW|A)5``jY3oh#_aQcK%6Gef7FH$X%F7o;t$?-Nz_^0`w9J-%Lo@t%|4_#T>NZ*i>liHHjQCTbBS8iD) z=*(3`tJcO5$K7K%V%C3Us`f*TT8*fO>Y3#leC^g+U0lsAb-|_Pdc>X&opuT=g_|cq z=lg?ZohqIA2g}(^8ScXaLq9VOhvkN(vg@*1tAwkgYor~_>&PqkD;n(LYP`NI!ULv{tKOzrWG#|6DqvpkrtI!uUZ!se#aMX2 z`rk#oAnMKQ$XibO!HDrie_7UCj9D}KakyYMnYn3>!6knj)q=6vHhYP<(>COIXS&rO z7PsbpzNq&@eQ)q;9Bg=brKZBc*stglhhL0G)rSi!vp=Jb_V?y6Uk6RB5wl*q`mRpc z*GuU^eDdw`ALU1br~_47oP#Tnb<4L~d9`cODc;onCJL#=-^LdZpa`4@gQ>enNQvK& zw2+BX4^VAWeIhBRD5JSe<4!)yv@dN0GGd*h zeban_My5tyQ)tl>+w(Wnf_3J(jktD-Mfx2RbIYP?QNQmE#uJ~VKR;A^_M!8`&WBbH z95^lK3#0b~zahSvv_|B4*5=UsAWMu_wBV~Crp@b*7^PUT*IRjm@3iyh@vTxXr&$h! zq;IA9^0{;MD-`iK-UCA#_@feUy!BAy;MKTc{Md-R%h%}h7Mb{gw!Vd_Q3v7@gj6Cx%zt@JY~0IH{nTVUG4Y6b=Y^R%av1Q zR#0kV+!|-AluvpNspo`%6y;Gj4Z4zVZO`kpiutb&)!nIMbulbZ|#4mOK4zoau$DH;$S2GogLWQ z-D`Pq<6 z$pw5Ce2S1AO&QtDL821ftxGJ>mm4;??)G?Nwgix>Im!q8%j1L|d4HzN-@JLMf4j+T zcy(@e$9raUp`u~jV{+RLk#0NlV_6_XcG3CkV&LGJ$&T~EF7kv=z~^^u75asHtW3Wk1cboK}eVsq_x{vF4ItW`XKxD$@9}3?E?FYK(6n zs0%CGY#(K(@c>%llg@f)@^Toa7*s)DpH5R}QzO~-7#l90&wkFE>6l4z^}zF-*X`H& zyXs#2z}e3@bZw2vjyD#akg(rWm~cFO1eLX0Faf#2mlZgI~tjKn(91|dFJXYWDRq*u@&-lcDq6Y01#i9tE;oEr!|MK zGu#Cs<15GY7eeOh{>KdB;`j^V=_JQxs-wrD?CN35At59#B+MmG!NI`+@qpRM7^tZI zi+=Sd$K~MZ=_UgL`S|z<`G^U*df05-_PH5+WI>FCzA`}Uu|7A2>Rmzi3kaU{x6!R zquu{Q`{VhW_E%qjr-S?nCZp%*YYR71adftIL0pw4FAkQ3{FUavJpU>5A57DKFeRk_ z$^3`sAIv|M$mn`F+FptDM+$in2c5!93LNh+5KVUSZkzYn^zHJ3jKE2!Xml4kLWf<0%A9f~ zxr;Y-RXZ)#P^u;^~$7;_HrmQkhETj4PJhzNp0voig!po0Z;>K$zJFPv0QFh*WqlXg% zUwx$FbeCl~t;X|@lH!+xD?~ciWAgebLM?dTrk0AAFHP%7pJ&Fc%`9_l>ZB(LR*6Bp zQeJKjvL|M|z%|>uD#TjBq7Ey1b{Y$$1uuW8zBu|SOLCmrR+N6biS|~5|6nprzV5^I z;cUPrSXXiP8ya^Zq-HjmKr($}MW)(Yy1){HX1WNA(VAEQ@HLIUU#_0f8rw@-YB_*vPEYC6i zG@@$*hK@yb*zWeQFGp7Ir?3hS1SHRPmN>FQPGWAkIzlJ=8DvR#gi8A@W!!@bDGPt8 znkYx>m{1f(mqVP={5!6jMxRELHQ_7Qs?)A*VEe(zgYA&5qQJyLm zNJwR5UfM`&LD$<8D7C5WjzQ0-0`QuNPEdW!neYjJg4Nm7U1W3NgPaOitfPI@r|O^1 zF=1>zN*;M-pUXWegGhi~Lvx|ZlaIukA&5m&Ev4vw{U1Hgr8_`xXObOO-Pv)CsZ&mjS#=5O>WTP=ON{l_gakzj2{!7K>DUfdP zRbeAJEJD~Uv_v#iAX{UstM}qZdPZBXF1i{nyItCJ64?lm1bcM#JtSB+RV%rzcMqzo zDcoGOO?a&XJ@pP~OY!bSZ?wcSaX>V6(Q2`aILVl(on@2$%I_mev^Y~&C{KK2;AEDi z*e}Oo&D{ng@UlT`c7y%?&BI}PN{90a z9q@NygW6Kgr%ByK{hu@e;t#MD;2w&{iC&%5B%|&360Nw-gzY?A|VGYGZS|N z{@M#ZZ8?9{;C(U0q^220=gMkXSjpJTrdt+KRGPrUZ)I1y8Rk}iDVV{Wh#FC~nC~Y0 ziQG)h*#loZH#cgPV~2rCEe%diQ%P*x9VZ*- z2X#jK^KvfHEYFL{)Q-&`aGbC31B|=`(WxIZSEMkgva|7o zzW8?DmnGLSF%DnO=*hU_!qB_$*2~HY9BBd#I@`sUx`V@APlD{dlGSLxu=|UU2UKls z&q(%0&1>j_jvi(ab$N?g?olki1IpLgq(lG#eUs$DR5P4mZEkEZCNir@;v~)l^J>Aa zp=pOvu`yFXCHVp?60bqlLIe!-I7m%w4KZsgGJL#s(TJMu&K0haGI7nk#^M$g!#SCM z7C|d67Y~u8I;hB5=XMLhjU&MF@FK$5iS|C89(Ggvmzoyl* xNra@&;1dHnriOr00hW@DaKkn$FIKq)5`acNPLby@L;cSVq^bH)r3`8n{y$j=t&9Kw literal 0 HcmV?d00001 diff --git a/tools/assets/App_Resources/iOS/upflip@3x.png b/tools/assets/App_Resources/iOS/upflip@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..af39cee601f3bf9f7a2011e67ef1b6f03f4b9f02 GIT binary patch literal 5147 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 literal 0 HcmV?d00001 diff --git a/tools/workspace-scripts.js b/tools/workspace-scripts.js index 84cb23ee0..53fb315a2 100644 --- a/tools/workspace-scripts.js +++ b/tools/workspace-scripts.js @@ -87,8 +87,8 @@ module.exports = { // @nativescript/core core: { build: { - script: 'nx run core:build.npm', - description: '@nativescript/core: Build for npm' + script: 'nx run core:build', + description: '@nativescript/core: Build' }, test: { script: 'nx run core:unit', @@ -99,13 +99,6 @@ module.exports = { }, }, }, - // tns-core-modules (old historic compatibility) - 'core-compat': { - build: { - script: 'nx run core-compat:build', - description: 'tns-core-modules: (Compatibility package) Build for npm' - }, - }, // @nativescript/ui-mobile-base 'ui-mobile-base': { build: { diff --git a/workspace.json b/workspace.json index d08978ac0..f31778a13 100644 --- a/workspace.json +++ b/workspace.json @@ -1,418 +1,317 @@ { - "version": 1, - "projects": { - "apps-automated": { - "root": "apps/automated/", - "sourceRoot": "apps/automated/app", - "projectType": "application", - "prefix": "nativescript", - "architect": { - "ios": { - "builder": "@nrwl/workspace:run-commands", - "options": { + "version": 1, + "projects": { + "apps-automated": { + "root": "apps/automated/", + "sourceRoot": "apps/automated/app", + "projectType": "application", + "prefix": "nativescript", + "architect": { + "ios": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["ns debug ios --no-hmr --emulator --env.testing"], + "cwd": "apps/automated", + "parallel": false + } + }, + "android": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["ns debug android --no-hmr --emulator --env.testing"], + "cwd": "apps/automated", + "parallel": false + } + }, + "clean": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["npx rimraf -- hooks node_modules platforms package-lock.json webpack.config.js", "npm i", "npx rimraf -- package-lock.json"], + "cwd": "apps/automated", + "parallel": false + } + } + } + }, + "apps-toolbox": { + "root": "apps/toolbox/", + "sourceRoot": "apps/toolbox/src", + "projectType": "application", + "prefix": "nativescript", + "architect": { + "ios": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["ns debug ios --no-hmr --emulator --env.testing"], + "cwd": "apps/toolbox", + "parallel": false + } + }, + "android": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["ns debug android --no-hmr --emulator --env.testing"], + "cwd": "apps/toolbox", + "parallel": false + } + }, + "clean": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["npx rimraf -- hooks node_modules platforms package-lock.json webpack.config.js", "npm i", "npx rimraf -- package-lock.json"], + "cwd": "apps/toolbox", + "parallel": false + } + } + } + }, + "apps-ui": { + "root": "apps/ui/", + "sourceRoot": "apps/ui/src", + "projectType": "application", + "prefix": "nativescript", + "architect": { + "ios": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["ns debug ios --no-hmr --emulator --env.testing"], + "cwd": "apps/ui", + "parallel": false + } + }, + "android": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["ns debug android --no-hmr --emulator --env.testing"], + "cwd": "apps/ui", + "parallel": false + } + }, + "clean": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["npx rimraf -- hooks node_modules platforms package-lock.json webpack.config.js", "npm i", "npx rimraf -- package-lock.json"], + "cwd": "apps/ui", + "parallel": false + } + } + } + }, + "core": { + "root": "packages/core", + "sourceRoot": "packages/core", + "projectType": "library", + "schematics": {}, + "architect": { + "lint": { + "builder": "@nrwl/linter:eslint", + "options": { + "lintFilePatterns": ["packages/core/**/*.ts", "packages/core/references.d.ts", "packages/core/**/*.spec.ts", "packages/core/**/*.spec.tsx", "packages/core/**/*.spec.js", "packages/core/**/*.spec.jsx", "packages/core/**/*.d.ts"] + } + }, + "test": { + "builder": "@nrwl/jest:jest", + "options": { + "jestConfig": "packages/core/jest.config.js", + "passWithNoTests": true + } + }, + "setup": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["nx run webpack:build"] + } + }, + "build": { + "builder": "@nrwl/workspace:run-commands", + "outputs": ["dist/packages"], + "options": { "commands": [ - "ns debug ios --no-hmr --emulator --env.testing" - ], - "cwd": "apps/automated", - "parallel": false - } - }, - "android": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "ns debug android --no-hmr --emulator --env.testing" - ], - "cwd": "apps/automated", - "parallel": false - } - }, - "clean": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "npx rimraf -- hooks node_modules platforms package-lock.json webpack.config.js", - "npm i", - "npx rimraf -- package-lock.json" - ], - "cwd": "apps/automated", - "parallel": false - } - } - } - }, - "apps-toolbox": { - "root": "apps/toolbox/", - "sourceRoot": "apps/toolbox/src", - "projectType": "application", - "prefix": "nativescript", - "architect": { - "ios": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "ns debug ios --no-hmr --emulator --env.testing" - ], - "cwd": "apps/toolbox", - "parallel": false - } - }, - "android": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "ns debug android --no-hmr --emulator --env.testing" - ], - "cwd": "apps/toolbox", - "parallel": false - } - }, - "clean": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "npx rimraf -- hooks node_modules platforms package-lock.json webpack.config.js", - "npm i", - "npx rimraf -- package-lock.json" - ], - "cwd": "apps/toolbox", - "parallel": false - } - } - } - }, - "apps-ui": { - "root": "apps/ui/", - "sourceRoot": "apps/ui/src", - "projectType": "application", - "prefix": "nativescript", - "architect": { - "ios": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "ns debug ios --no-hmr --emulator --env.testing" - ], - "cwd": "apps/ui", - "parallel": false - } - }, - "android": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "ns debug android --no-hmr --emulator --env.testing" - ], - "cwd": "apps/ui", - "parallel": false - } - }, - "clean": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "npx rimraf -- hooks node_modules platforms package-lock.json webpack.config.js", - "npm i", - "npx rimraf -- package-lock.json" - ], - "cwd": "apps/ui", - "parallel": false - } - } - } - }, - "core": { - "root": "packages/core", - "sourceRoot": "packages/core", - "projectType": "library", - "schematics": {}, - "architect": { - "lint": { - "builder": "@nrwl/linter:lint", - "options": { - "linter": "eslint", - "config": "packages/core/.eslintrc", - "tsConfig": [ - "packages/core/tsconfig.lib.json", - "packages/core/tsconfig.spec.json" - ], - "exclude": [ - "**/node_modules/**", - "!packages/core/**" - ] - } - }, - "test": { - "builder": "@nrwl/jest:jest", - "options": { - "jestConfig": "packages/core/jest.config.js", - "tsConfig": "packages/core/tsconfig.spec.json", - "passWithNoTests": true - } - }, - "setup": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "nx run webpack:build" - ] - } - }, - "build": { - "builder": "@nrwl/node:package", - "outputs": ["dist/packages"], - "options": { - "outputPath": "dist/packages/core", - "tsConfig": "packages/core/tsconfig.lib.json", - "packageJson": "packages/core/package.json", - "main": "packages/core/index.ts", - "assets": [ - "packages/core/*.md" - ] - } - }, - "build.npm": { - "builder": "@nrwl/workspace:run-commands", - "outputs": ["dist/packages"], - "options": { - "commands": [ - "nx run core:build && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/**/*.d.ts\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/js-libs/**/*\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/cli-hooks/**/*.js\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/platforms/**/*\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/fetch/**/*\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/css/**/*\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/css-value/**/*\" dist", + "npx rimraf dist/packages/core", + "./node_modules/.bin/tsc -p packages/core/tsconfig.lib.json", + "./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/**/*.d.ts\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/js-libs/**/*\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/cli-hooks/**/*.js\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/platforms/**/*\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/fetch/**/*\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/css/**/*\" dist && ./node_modules/.bin/copyfiles -e \"packages/core/__tests__/**/*\" \"packages/core/css-value/**/*\" dist", + "cp packages/core/package.json dist/packages/core", "cp LICENSE dist/packages/core", - "cd dist/packages/core && npm pack && mv *.tgz .." + "cd dist/packages/core && npm pack && mv *.tgz .." ], "cwd": ".", - "parallel": false - } - }, - "unit": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "../../../node_modules/.bin/tsc -p tsconfig.json && ../../../node_modules/.bin/mocha --config=.mocharc.yml" - ], - "cwd": "packages/core/__tests__", - "parallel": false - } - }, - "unit.watch": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "../../../node_modules/.bin/tsc -p tsconfig.json && ../../../node_modules/.bin/mocha --watch --config=.mocharc.yml" - ], - "cwd": "packages/core/__tests__", - "parallel": false - } - } - } - }, - "core-compat": { - "root": "packages/core-compat", - "sourceRoot": "packages/core-compat", - "projectType": "library", - "schematics": {}, - "architect": { - "build": { - "builder": "@nrwl/workspace:run-commands", - "outputs": ["dist/packages"], - "options": { - "commands": [ - "npx rimraf -- node_modules package-lock.json", - "npm i", - "../../node_modules/.bin/tsc -p tsconfig.json", - "mv \"$(npm pack | tail -n 1)\" ../../dist/packages/tns-core-modules.tgz" - ], - "cwd": "packages/core-compat", - "parallel": false - } - } - } - }, - "types": { - "root": "packages/types", - "sourceRoot": "packages/types", - "projectType": "library", - "schematics": {}, - "architect": { - "build": { - "builder": "@nrwl/workspace:run-commands", - "outputs": ["dist/packages"], - "options": { - "commands": [ - "mkdir -p ../../dist/packages/types", - "cp -R * ../../dist/packages/types" - ], - "cwd": "packages/types", - "parallel": false - } - } - } - }, - "types-ios": { - "root": "packages/types-ios", - "sourceRoot": "packages/types-ios/src", - "projectType": "library", - "schematics": {}, - "architect": { - "build": { - "builder": "@nrwl/workspace:run-commands", - "outputs": ["dist/packages"], - "options": { - "commands": [ - "mkdir -p ../../dist/packages/types-ios", - "cp -R src/* ../../dist/packages/types-ios", - "cp package.json *.md ../../dist/packages/types-ios" - ], - "cwd": "packages/types-ios", - "parallel": false - } - } - } - }, - "types-android": { - "root": "packages/types-android", - "sourceRoot": "packages/types-android/src", - "projectType": "library", - "schematics": {}, - "architect": { - "build": { - "builder": "@nrwl/workspace:run-commands", - "outputs": ["dist/packages"], - "options": { - "commands": [ - "mkdir -p ../../dist/packages/types-android", - "cp -R src/* ../../dist/packages/types-android", - "cp package.json *.md ../../dist/packages/types-android" - ], - "cwd": "packages/types-android", - "parallel": false - } - } - } - }, - "ui-mobile-base": { - "root": "packages/ui-mobile-base", - "sourceRoot": "packages/ui-mobile-base", - "projectType": "library", - "schematics": {}, - "architect": { - "build": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "./build.sh", - "cp -R dist/package/platforms/* ../../packages/core/platforms" - ], - "cwd": "packages/ui-mobile-base", - "parallel": false - } - } - } - }, - "webpack": { - "root": "packages/webpack", - "sourceRoot": "packages/webpack", - "projectType": "library", - "schematics": {}, - "architect": { - "lint": { - "builder": "@nrwl/linter:lint", - "options": { - "linter": "eslint", - "config": "packages/webpack/.eslintrc", - "tsConfig": [ - "packages/webpack/tsconfig.json" - ], - "exclude": [ - "**/node_modules/**", - "!packages/webpack/**" - ] - } - }, - "test": { - "builder": "@nrwl/workspace:run-commands", - "options": { - "commands": [ - "npm run tsc", - "npm run jasmine" - ], - "cwd": "packages/webpack", - "parallel": false - } - }, - "build": { - "builder": "@nrwl/workspace:run-commands", - "outputs": ["dist/packages"], - "options": { - "commands": [ - "npm run setup", - "mkdir -p ../../dist/packages", - "mv \"$(npm pack | tail -n 1)\" ../../dist/packages/nativescript-webpack.tgz" - ], - "cwd": "packages/webpack", - "parallel": false - } - } - } - } - }, - "cli": { - "defaultCollection": "@nrwl/workspace" - }, - "schematics": { - "@nrwl/workspace": { - "library": { - "linter": "eslint" - } - }, - "@nrwl/cypress": { - "cypress-project": { - "linter": "eslint" - } - }, - "@nrwl/react": { - "application": { - "linter": "eslint" - }, - "library": { - "linter": "eslint" - } - }, - "@nrwl/next": { - "application": { - "linter": "eslint" - } - }, - "@nrwl/web": { - "application": { - "linter": "eslint" - } - }, - "@nrwl/node": { - "application": { - "linter": "eslint" - }, - "library": { - "linter": "eslint" - } - }, - "@nrwl/nx-plugin": { - "plugin": { - "linter": "eslint" - } - }, - "@nrwl/nest": { - "application": { - "linter": "eslint" - } - }, - "@nrwl/express": { - "application": { - "linter": "eslint" - }, - "library": { - "linter": "eslint" - } - } - } -} \ No newline at end of file + "parallel": false + } + }, + "unit": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["../../../node_modules/.bin/tsc -p tsconfig.json && ../../../node_modules/.bin/mocha --config=.mocharc.yml"], + "cwd": "packages/core/__tests__", + "parallel": false + } + }, + "unit.watch": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["../../../node_modules/.bin/tsc -p tsconfig.json && ../../../node_modules/.bin/mocha --watch --config=.mocharc.yml"], + "cwd": "packages/core/__tests__", + "parallel": false + } + } + } + }, + "types": { + "root": "packages/types", + "sourceRoot": "packages/types", + "projectType": "library", + "schematics": {}, + "architect": { + "build": { + "builder": "@nrwl/workspace:run-commands", + "outputs": ["dist/packages"], + "options": { + "commands": ["mkdir -p ../../dist/packages/types", "cp -R * ../../dist/packages/types"], + "cwd": "packages/types", + "parallel": false + } + } + } + }, + "types-ios": { + "root": "packages/types-ios", + "sourceRoot": "packages/types-ios/src", + "projectType": "library", + "schematics": {}, + "architect": { + "build": { + "builder": "@nrwl/workspace:run-commands", + "outputs": ["dist/packages"], + "options": { + "commands": ["mkdir -p ../../dist/packages/types-ios", "cp -R src/* ../../dist/packages/types-ios", "cp package.json *.md ../../dist/packages/types-ios"], + "cwd": "packages/types-ios", + "parallel": false + } + } + } + }, + "types-android": { + "root": "packages/types-android", + "sourceRoot": "packages/types-android/src", + "projectType": "library", + "schematics": {}, + "architect": { + "build": { + "builder": "@nrwl/workspace:run-commands", + "outputs": ["dist/packages"], + "options": { + "commands": ["mkdir -p ../../dist/packages/types-android", "cp -R src/* ../../dist/packages/types-android", "cp package.json *.md ../../dist/packages/types-android"], + "cwd": "packages/types-android", + "parallel": false + } + } + } + }, + "ui-mobile-base": { + "root": "packages/ui-mobile-base", + "sourceRoot": "packages/ui-mobile-base", + "projectType": "library", + "schematics": {}, + "architect": { + "build": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["./build.sh", "cp -R dist/package/platforms/* ../../packages/core/platforms"], + "cwd": "packages/ui-mobile-base", + "parallel": false + } + } + } + }, + "webpack": { + "root": "packages/webpack", + "sourceRoot": "packages/webpack", + "projectType": "library", + "schematics": {}, + "architect": { + "lint": { + "builder": "@nrwl/linter:eslint", + "options": { + "lintFilePatterns": [] + } + }, + "test": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": ["npm run tsc", "npm run jasmine"], + "cwd": "packages/webpack", + "parallel": false + } + }, + "build": { + "builder": "@nrwl/workspace:run-commands", + "outputs": ["dist/packages"], + "options": { + "commands": ["npm run setup", "mkdir -p ../../dist/packages", "mv \"$(npm pack | tail -n 1)\" ../../dist/packages/nativescript-webpack.tgz"], + "cwd": "packages/webpack", + "parallel": false + } + } + } + } + }, + "cli": { + "defaultCollection": "@nrwl/workspace" + }, + "schematics": { + "@nrwl/workspace": { + "library": { + "linter": "eslint" + } + }, + "@nrwl/cypress": { + "cypress-project": { + "linter": "eslint" + } + }, + "@nrwl/react": { + "application": { + "linter": "eslint" + }, + "library": { + "linter": "eslint" + } + }, + "@nrwl/next": { + "application": { + "linter": "eslint" + } + }, + "@nrwl/web": { + "application": { + "linter": "eslint" + } + }, + "@nrwl/node": { + "application": { + "linter": "eslint" + }, + "library": { + "linter": "eslint" + } + }, + "@nrwl/nx-plugin": { + "plugin": { + "linter": "eslint" + } + }, + "@nrwl/nest": { + "application": { + "linter": "eslint" + } + }, + "@nrwl/express": { + "application": { + "linter": "eslint" + }, + "library": { + "linter": "eslint" + } + } + } +} From 86c689ef7ec0d0f4b80f73ea0f1aa8ce8dc06741 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 21 Oct 2020 08:37:54 -0700 Subject: [PATCH 12/15] chore(release): @nativescript/core@7.0.12 --- CHANGELOG.md | 16 ++++++++++++++++ package.json | 2 +- packages/core/package.json | 2 +- packages/webpack/package.json | 4 ++-- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d201a54c..ed19603c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## [7.0.12](https://github.com/NativeScript/NativeScript/compare/7.0.11-core...7.0.12) (2020-10-21) + + +### Bug Fixes + +* **android:** BottomNavigation error on back press (application exit) ([#8970](https://github.com/NativeScript/NativeScript/issues/8970)) ([99bb067](https://github.com/NativeScript/NativeScript/commit/99bb067420871078c40454eec842fad6cbede0f7)) +* **core:** ObservableArray tests and a typo ([#8968](https://github.com/NativeScript/NativeScript/issues/8968)) ([5c1b7f6](https://github.com/NativeScript/NativeScript/commit/5c1b7f6d76c19877da1f47a0696dfbbd89b5fd00)) + + +### Features + +* **core:** TypeScript 4 + cleanup ([#8967](https://github.com/NativeScript/NativeScript/issues/8967)) ([2243660](https://github.com/NativeScript/NativeScript/commit/2243660080ce6877d68a3f32fd64625f86023f77)) +* **webpack:** add svelte support ([#8963](https://github.com/NativeScript/NativeScript/issues/8963)) ([0afea86](https://github.com/NativeScript/NativeScript/commit/0afea8681c62071823804f392ab8d595e61190ff)) + + + ## [7.0.10](https://github.com/NativeScript/NativeScript/compare/7.0.10-core...7.0.10) (2020-10-10) diff --git a/package.json b/package.json index d8d7d2b7b..c6d73f81e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nativescript", - "version": "7.0.10", + "version": "7.0.12", "license": "MIT", "scripts": { "setup": "npx rimraf hooks node_modules package-lock.json && npm i && ts-patch install && nx run core:setup", diff --git a/packages/core/package.json b/packages/core/package.json index cf77e2711..418aa0c59 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,7 @@ "main": "index", "types": "index.d.ts", "description": "NativeScript Core Modules", - "version": "7.0.11", + "version": "7.0.12", "homepage": "https://nativescript.org", "repository": { "type": "git", diff --git a/packages/webpack/package.json b/packages/webpack/package.json index 8d41314a6..4b001858f 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "3.0.7", + "version": "3.0.8", "main": "index", "description": "Webpack plugin for NativeScript", "homepage": "https://nativescript.org", @@ -99,6 +99,6 @@ "nyc": "^15.1.0", "proxyquire": "~2.1.0", "source-map-support": "^0.5.13", - "typescript": "~3.9.0" + "typescript": "~4.0.0" } } From 0eb2246b7dfc3eda731f8cb7ee1bbfcd36551dfa Mon Sep 17 00:00:00 2001 From: Jean-Francois Turcot Date: Sun, 25 Oct 2020 21:05:43 -0400 Subject: [PATCH 13/15] fix(core): ListViewCell.initWithEmptyBackground (#8985) --- packages/core/ui/list-view/index.ios.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/ui/list-view/index.ios.ts b/packages/core/ui/list-view/index.ios.ts index 974f96334..22d2e5a50 100644 --- a/packages/core/ui/list-view/index.ios.ts +++ b/packages/core/ui/list-view/index.ios.ts @@ -30,7 +30,7 @@ class ListViewCell extends UITableViewCell { public static initWithEmptyBackground(): ListViewCell { const cell = ListViewCell.new(); // Clear background by default - this will make cells transparent - cell.backgroundColor = null; + cell.backgroundColor = UIColor.clearColor; return cell; } @@ -38,7 +38,7 @@ class ListViewCell extends UITableViewCell { initWithStyleReuseIdentifier(style: UITableViewCellStyle, reuseIdentifier: string): this { const cell = super.initWithStyleReuseIdentifier(style, reuseIdentifier); // Clear background by default - this will make cells transparent - cell.backgroundColor = null; + cell.backgroundColor = UIColor.clearColor; return cell; } From 0bbdeaf0b51b3b1284e62163d14b608f4c962863 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Sun, 25 Oct 2020 18:28:05 -0700 Subject: [PATCH 14/15] chore: travis node version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c0037f3ef..e4e7b12db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - "node" + - 14 script: - npm run setup - npm start @nativescript.core.test From b113f1916db591d23327e7eead498c722ce76876 Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Tue, 27 Oct 2020 05:13:22 +0200 Subject: [PATCH 15/15] feat(core): Repeater multiple item templates implementation (#8981) --- apps/automated/package.json | 8 +- .../src/ui/repeater/repeater-tests.ts | 125 +++++++++++++++++- apps/automated/src/ui/repeater/repeater.md | 59 ++++++++- apps/ui/src/main-page.ts | 1 + apps/ui/src/repeater/main-page.ts | 17 +++ apps/ui/src/repeater/main-page.xml | 6 + apps/ui/src/repeater/multi-templates-page.ts | 13 ++ apps/ui/src/repeater/multi-templates-page.xml | 18 +++ .../repeater/multi-templates-view-model.ts | 15 +++ packages/core/ui/repeater/index.ts | 96 ++++++++++++-- tools/assets/App_Resources/Android/app.gradle | 2 +- tools/scripts/api-reports/NativeScript.api.md | 4 + 12 files changed, 343 insertions(+), 21 deletions(-) create mode 100644 apps/ui/src/repeater/main-page.ts create mode 100644 apps/ui/src/repeater/main-page.xml create mode 100644 apps/ui/src/repeater/multi-templates-page.ts create mode 100644 apps/ui/src/repeater/multi-templates-page.xml create mode 100644 apps/ui/src/repeater/multi-templates-view-model.ts diff --git a/apps/automated/package.json b/apps/automated/package.json index dac032e77..4ac3b0d15 100644 --- a/apps/automated/package.json +++ b/apps/automated/package.json @@ -2,10 +2,10 @@ "main": "main.js", "description": "NativeScript Application", "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/NativeScript/NativeScript.git" - }, + "repository": { + "type": "git", + "url": "https://github.com/NativeScript/NativeScript.git" + }, "scripts": { "clean": "npx rimraf hooks node_modules platforms package-lock.json && npm i" }, diff --git a/apps/automated/src/ui/repeater/repeater-tests.ts b/apps/automated/src/ui/repeater/repeater-tests.ts index ae6a8a1da..33b47c00e 100644 --- a/apps/automated/src/ui/repeater/repeater-tests.ts +++ b/apps/automated/src/ui/repeater/repeater-tests.ts @@ -1,6 +1,6 @@ import * as TKUnit from '../../tk-unit'; import * as helper from '../../ui-helper'; -import { Application, Label, Page, StackLayout, WrapLayout, LayoutBase, View, GestureTypes, Repeater, ObservableArray } from '@nativescript/core'; +import { Application, Label, Page, StackLayout, WrapLayout, LayoutBase, View, KeyedTemplate, GestureTypes, Repeater, ObservableArray } from '@nativescript/core'; var FEW_ITEMS = [0, 1, 2]; var MANY_ITEMS = []; @@ -8,6 +8,18 @@ for (var i = 0; i < 100; i++) { MANY_ITEMS[i] = i; } +const ITEM_TEMPLATES_STRING = ` + + + + `; + export function test_recycling() { const setters = new Map(); setters.set('itemsLayout', new StackLayout()); @@ -309,6 +321,117 @@ export function test_ItemTemplateFactoryFunction() { helper.buildUIAndRunTest(repeater, testAction); } +// Multiple item templates tests +export function test_ItemTemplateSelector_WhenWrongTemplateKeyIsSpecified_TheDefaultTemplateIsUsed() { + var repeater = new Repeater(); + + function testAction(views: Array) { + repeater.itemTemplate = "