diff --git a/.eslintignore b/.eslintignore index 91baf7cb15..865e65f76d 100755 --- a/.eslintignore +++ b/.eslintignore @@ -16,8 +16,8 @@ test/examples/*.js **/projectTemplates **/pluginTemplates **/nodeModuleOverrides -**/supportFiles -**/coreTemplateFiles +**/templateFiles +**/templateFiles packages/rnv/tests jest.config.*.js **/templates diff --git a/.github/workflows/e2e-harness-android.yml b/.github/workflows/e2e-harness-android.yml index 3bf743db82..e6605bee95 100644 --- a/.github/workflows/e2e-harness-android.yml +++ b/.github/workflows/e2e-harness-android.yml @@ -36,7 +36,7 @@ jobs: cd packages/app-harness && yarn run:android-test & sleep 180 - name: E2E run: | - cd packages/app-harness && yarn e2e:android && kill $(lsof -t -i:8083) + cd packages/app-harness && yarn e2e:android && kill $(lsof -t -i:8093) # Commented because e2e tests would fail due to minion issues # - name: Post message to Slack via Webhook # if: ${{ github.event_name == 'push' && failure() }} diff --git a/.github/workflows/e2e-harness-androidtv.yml b/.github/workflows/e2e-harness-androidtv.yml index 0c42c3320b..6df3d3e6fb 100644 --- a/.github/workflows/e2e-harness-androidtv.yml +++ b/.github/workflows/e2e-harness-androidtv.yml @@ -36,7 +36,7 @@ jobs: cd packages/app-harness && yarn run:androidtv-test & sleep 180 - name: E2E run: | - cd packages/app-harness && yarn e2e:androidtv && kill $(lsof -t -i:8084) + cd packages/app-harness && yarn e2e:androidtv && kill $(lsof -t -i:8094) # Commented because e2e tests would fail due to minion issues # - name: Post message to Slack via Webhook # if: ${{ github.event_name == 'push' && failure() }} diff --git a/.github/workflows/e2e-harness-ios.yml b/.github/workflows/e2e-harness-ios.yml index e3bdd87ad9..7255f351f0 100644 --- a/.github/workflows/e2e-harness-ios.yml +++ b/.github/workflows/e2e-harness-ios.yml @@ -37,7 +37,7 @@ jobs: cd packages/app-harness && yarn run:ios-test & sleep 1200 - name: E2E run: | - cd packages/app-harness && yarn e2e:ios && kill $(lsof -t -i:8082) + cd packages/app-harness && yarn e2e:ios && kill $(lsof -t -i:8092) # Commented because e2e tests would fail due to minion issues # - name: Post message to Slack via Webhook # if: ${{ github.event_name == 'push' && failure() }} diff --git a/.github/workflows/e2e-harness-tvos.yml b/.github/workflows/e2e-harness-tvos.yml index 5d854aff81..3014aad99f 100644 --- a/.github/workflows/e2e-harness-tvos.yml +++ b/.github/workflows/e2e-harness-tvos.yml @@ -37,7 +37,7 @@ jobs: cd packages/app-harness && yarn run:tvos-test & sleep 1200 - name: E2E run: | - cd packages/app-harness && yarn e2e:tvos && kill $(lsof -t -i:8089) + cd packages/app-harness && yarn e2e:tvos && kill $(lsof -t -i:8099) # Commented because e2e tests would fail due to minion issues # - name: Post message to Slack via Webhook # if: ${{ github.event_name == 'push' && failure() }} diff --git a/.github/workflows/e2e-harness-web.yml b/.github/workflows/e2e-harness-web.yml index 04882bb0c2..50bebc0f52 100644 --- a/.github/workflows/e2e-harness-web.yml +++ b/.github/workflows/e2e-harness-web.yml @@ -36,7 +36,7 @@ jobs: cd packages/app-harness && yarn start:web-test & sleep 60 - name: E2E run: | - cd packages/app-harness && yarn e2e:web && kill $(lsof -t -i:8080) + cd packages/app-harness && yarn e2e:web && kill $(lsof -t -i:8090) # Commented because e2e tests would fail due to minion issues # - name: Post message to Slack via Webhook # if: ${{ github.event_name == 'push' && failure() }} diff --git a/.gitignore b/.gitignore index 199bad3c82..caf17fb4b8 100755 --- a/.gitignore +++ b/.gitignore @@ -28,15 +28,23 @@ project.xcworkspace # node.js # node_modules/ +dist +lib + +# NPM +# npm-debug.log -yarn-error.log +# Yarn +# +yarn-error.log +# Lerna +# lerna-debug.log -index/ - # BUCK +# buck-out/ \.buckd/ @@ -51,25 +59,36 @@ buck-out/ # Testing -/packages/**/coverage -/packages/**/dist -/packages/**/lib - -.expo +# coverage +reporting +coverage-ts -# IMPORTANT. in rnv .next should NOT be at the root level but in platformBuilds. if you see it in root level you should delete it -# .next - -# RN Windows Engine -.binlog -packages/**/*.binlog +# Expo +# +.expo -dist -lib +# Next +# +.next -lerna-debug.log -yarn-error.log +# ReNative +# .rnv -coverage-ts -.watchman-cookie-* \ No newline at end of file +renative.private.json +renative.local.json +renative.local.json +renative.build.json +renative.runtime.json +rnv-config.local.json +metro.config.local.js +platformBuilds +platformAssets + +# Other +# +.binlog +*.binlog +.bundle +vendor +.watchman-cookie-* diff --git a/.prettierignore b/.prettierignore index e8112627ba..1fe0bf92c0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -22,4 +22,5 @@ build allure-results pluginTemplates +templateFiles *.d.ts \ No newline at end of file diff --git a/__mocks__/@rnv/core.ts b/__mocks__/@rnv/core.ts index 5fd38ecb17..d321ff2494 100644 --- a/__mocks__/@rnv/core.ts +++ b/__mocks__/@rnv/core.ts @@ -10,30 +10,32 @@ type Context = { const rnvcore: any = jest.createMockFromModule('@rnv/core'); +function mockChalk(v) { + return v; +} + const _chalkCols: any = { - white: (v) => v, - green: (v) => v, - red: (v) => v, - yellow: (v) => v, - default: (v) => v, - gray: (v) => v, - grey: (v) => v, - blue: (v) => v, - cyan: (v) => v, - magenta: (v) => v, - bold: (v) => v, - rgb: (v) => v, + white: mockChalk, + green: mockChalk, + red: mockChalk, + yellow: mockChalk, + default: mockChalk, + gray: mockChalk, + grey: mockChalk, + blue: mockChalk, + cyan: mockChalk, + magenta: mockChalk, + bold: mockChalk, + rgb: mockChalk, }; -function mockChalk() { - return _chalkCols; -} + Object.assign(mockChalk, _chalkCols); -Object.keys(_chalkCols).forEach((key) => { - _chalkCols[key] = mockChalk; -}); -const _chalkMono = { - ..._chalkCols, -}; +// Object.keys(_chalkCols).forEach((key) => { +// _chalkCols[key] = mockChalk; +// }); +// const _chalkMono = { +// ..._chalkCols, +// }; const generateRnvConfigPathObj = () => { return { @@ -61,6 +63,7 @@ const generateRnvConfigFileObj = () => { }; const generateContextDefaults = (ctx?: Context) => { + const _opts = {}; const runtime: any = { currentEngine: { rootPath: '' }, enginesByPlatform: {}, @@ -99,11 +102,13 @@ const generateContextDefaults = (ctx?: Context) => { runtimePropsInjects: [], supportedPlatforms: [], systemPropsInjects: [], - program: {}, + program: { + opts: () => _opts, + }, buildConfig: {}, command: '', subCommand: '', - platform: ctx?.program.platform ?? '', + platform: ctx?.program.opts().platform ?? '', process: {}, //========== _renativePluginCache: {}, @@ -251,7 +256,8 @@ const generateContextDefaults = (ctx?: Context) => { }, }; }; -rnvcore.chalk = () => _chalkMono; +rnvcore.createTask = (task) => task; +rnvcore.chalk = () => _chalkCols; rnvcore.createRnvContext = (ctx?: Context) => { rnvcore.__MOCK_RNV_CONTEXT = generateContextDefaults(ctx); }; diff --git a/buildHooks/src/prePublish.ts b/buildHooks/src/prePublish.ts index 66a4c1679d..99e60395d1 100644 --- a/buildHooks/src/prePublish.ts +++ b/buildHooks/src/prePublish.ts @@ -1,5 +1,13 @@ import path from 'path'; -import { RnvContext, copyFileSync, fixPackageObject, fsExistsSync, readObjectSync, writeFileSync } from '@rnv/core'; +import { + RnvContext, + RnvFileName, + copyFileSync, + fixPackageObject, + fsExistsSync, + readObjectSync, + writeFileSync, +} from '@rnv/core'; import fs from 'fs'; const merge = require('deepmerge'); @@ -29,7 +37,9 @@ const VERSIONED_PACKAGES = [ 'sdk-webos', 'sdk-utils', 'renative', + 'config-templates', 'integration-docker', + 'adapter', ]; type PackageConfig = { @@ -49,7 +59,7 @@ const setPackageVersions = (c: RnvContext, version: string | undefined, versione const pkgFolder = path.join(c.paths.project.dir, 'packages'); _updateJson(c.paths.project.package, v); versionedPackages.forEach(function (pkgName) { - _updateJson(path.join(pkgFolder, pkgName, 'package.json'), v); + _updateJson(path.join(pkgFolder, pkgName, RnvFileName.package), v); }); }; @@ -116,7 +126,7 @@ export const prePublish = async (c: RnvContext) => { }, }); - _updateJson(path.join(pkgDirPath, 'rnv/coreTemplateFiles/renative.templates.json'), { + _updateJson(path.join(pkgDirPath, 'core/renative.templates.json'), { engineTemplates: { '@rnv/engine-rn': v, '@rnv/engine-rn-tvos': v, @@ -142,7 +152,7 @@ export const prePublish = async (c: RnvContext) => { let pkgFile; if (fs.statSync(dirPath).isDirectory()) { - _pkgPath = path.join(dirPath, 'package.json'); + _pkgPath = path.join(dirPath, RnvFileName.package); if (fsExistsSync(_pkgPath)) { pkgFile = readObjectSync(_pkgPath); pkgName = pkgFile?.name; diff --git a/package.json b/package.json index ce460f3a47..739cd6ef88 100644 --- a/package.json +++ b/package.json @@ -56,8 +56,8 @@ "url": "git://github.com/flexn-io/renative.git" }, "scripts": { - "bootstrap": "yarn run link:rnv && npx lerna bootstrap && yarn build", - "bootstrap-clean": "rimraf -I ./node_modules; npx lerna clean --yes && yarn bootstrap", + "bootstrap": "npx lerna@6 bootstrap && yarn build && yarn link:rnv", + "bootstrap-clean": "rimraf -I ./node_modules; npx lerna@6 clean --yes && yarn bootstrap", "build": "lerna run build", "compile": "npx lerna run compile", "deploy:canary": "yarn pre-publish && npx lerna publish from-package --dist-tag canary && git push --tags origin HEAD", @@ -99,7 +99,6 @@ "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "babel-jest": "29.6.3", - "babel-plugin-module-resolver": "^5.0.0", "deepmerge": "3.2.0", "eslint": "8.19.0", "eslint-config-prettier": "8.8.0", @@ -143,12 +142,10 @@ "webpack", "mini-css-extract-plugin", "execa", - "**/@flexn/plugins", "**/@flexn/graybox", "**/appium-*", "**/@wdio/*", "**/@react-native/metro-babel-transformer" ] - }, - "resolutions": {} + } } diff --git a/packages/plugins/LICENSE b/packages/adapter/LICENSE similarity index 100% rename from packages/plugins/LICENSE rename to packages/adapter/LICENSE diff --git a/packages/adapter/README.md b/packages/adapter/README.md new file mode 100644 index 0000000000..3c84e377e4 --- /dev/null +++ b/packages/adapter/README.md @@ -0,0 +1,2 @@ +# @rnv/adapter + diff --git a/packages/adapter/package.json b/packages/adapter/package.json new file mode 100644 index 0000000000..af96a76290 --- /dev/null +++ b/packages/adapter/package.json @@ -0,0 +1,39 @@ +{ + "name": "@rnv/adapter", + "version": "1.0.0-rc.12", + "description": "ReNative Adapters for babel, metro, next and other build configs", + "keywords": [], + "homepage": "https://github.com/flexn-io/renative#readme", + "bugs": { + "url": "https://github.com/flexn-io/renative/issues" + }, + "license": "MIT", + "author": "Pavel Jacko (https://github.com/pavjacko)", + "files": [ + "LICENSE", + "lib", + "types.d.ts" + ], + "main": "lib/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/flexn-io/renative.git" + }, + "scripts": { + "bootstrap": "yarn && yarn build && npm link", + "build": "yarn clean && yarn compile", + "clean": "rimraf -I ./lib && rimraf -I tsconfig.tsbuildinfo", + "compile": "tsc -b tsconfig.json", + "compile:prod": "tsc -b tsconfig.json", + "lint": "eslint . --ext .ts", + "watch": "tsc --watch --preserveWatchOutput" + }, + "dependencies": { + "babel-plugin-module-resolver": "^5.0.0" + }, + "peerDependencies": {}, + "private": false, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/rnv/src/adapter/index.ts b/packages/adapter/src/adapters.ts similarity index 51% rename from packages/rnv/src/adapter/index.ts rename to packages/adapter/src/adapters.ts index c3c4cd41be..c3f96eb06b 100644 --- a/packages/rnv/src/adapter/index.ts +++ b/packages/adapter/src/adapters.ts @@ -1,17 +1,18 @@ import fs from 'fs'; -import { BabelApi, BabelConfig, logInfo } from '@rnv/core'; +import type { BabelApi, BabelConfig, BabelConfigPlugin } from './types'; -export const withDefaultRNVBabel = (cnf: BabelConfig): BabelConfig => ({ +export const withBabelPluginModuleResolver = (cnf?: any): BabelConfigPlugin => [ + require.resolve('babel-plugin-module-resolver'), + { + root: [process.env.RNV_MONO_ROOT || '.'], + ...(cnf || {}), + }, +]; + +const _withDefaultRNVBabel = (cnf: BabelConfig): BabelConfig => ({ retainLines: true, presets: [['@babel/preset-env', {}]], - plugins: [ - [ - require.resolve('babel-plugin-module-resolver'), - { - root: [process.env.RNV_MONO_ROOT || '.'], - }, - ], - ], + plugins: [withBabelPluginModuleResolver()], ...cnf, }); @@ -20,9 +21,9 @@ export const withRNVBabel = (api: BabelApi): BabelConfig => { api.cache(true); if (process.env.RNV_ENGINE_PATH && !fs.existsSync(process.env.RNV_ENGINE_PATH)) { - logInfo(`Path to engine cannot be resolved: ${process.env.RNV_ENGINE_PATH}. Will use default one`); + console.warn(`Path to engine cannot be resolved: ${process.env.RNV_ENGINE_PATH}. Will use default one`); api.cache(false); - return withDefaultRNVBabel(cnf); + return _withDefaultRNVBabel(cnf); } if (process.env.RNV_ENGINE_PATH) { @@ -57,3 +58,25 @@ export const withRNVRNConfig = (cnf: unknown) => { return cnf; }; + +export const withRNVNext = (cnf: unknown) => { + if (process.env.RNV_ENGINE_PATH) { + const engine = require(process.env.RNV_ENGINE_PATH); + if (engine.withRNVNext) { + return engine.withRNVNext(cnf); + } + } + + return cnf; +}; + +export const withRNVWebpack = (cnf: unknown) => { + if (process.env.RNV_ENGINE_PATH) { + const engine = require(process.env.RNV_ENGINE_PATH); + if (engine.withRNVWebpack) { + return engine.withRNVWebpack(cnf); + } + } + + return cnf; +}; diff --git a/packages/adapter/src/index.ts b/packages/adapter/src/index.ts new file mode 100644 index 0000000000..8a1afa21e9 --- /dev/null +++ b/packages/adapter/src/index.ts @@ -0,0 +1,2 @@ +export * from './adapters'; +export * from './types'; diff --git a/packages/adapter/src/types.ts b/packages/adapter/src/types.ts new file mode 100644 index 0000000000..ab4715fd9a --- /dev/null +++ b/packages/adapter/src/types.ts @@ -0,0 +1,25 @@ +export type BabelApi = { + cache: (value: boolean) => void; +}; + +export type BabelConfigPlugin = [ + string, + { + root?: Array; + alias?: Record; + } +]; + +export type BabelConfig = { + retainLines?: boolean; + plugins?: Array; + presets?: Array< + | string + | [ + string, + { + useTransformReactJSXExperimental?: boolean; + } + ] + >; +}; diff --git a/packages/adapter/tsconfig.json b/packages/adapter/tsconfig.json new file mode 100644 index 0000000000..bc57e8fcd2 --- /dev/null +++ b/packages/adapter/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@flexn/typescript-config/tsconfig.lib.node.json", + "compilerOptions": { + "outDir": "./lib", + "rootDir": "./src", + "resolveJsonModule": false, + "lib": ["ES2021.String"] + }, + "include": ["./src/**/*", "./src/**/*.json", "./types.d.ts", "./package.json"], + "exclude": ["node_modules", "./src/**/*.test.ts"] +} diff --git a/packages/adapter/types.d.ts b/packages/adapter/types.d.ts new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/packages/adapter/types.d.ts @@ -0,0 +1 @@ + diff --git a/packages/app-harness/.gitignore b/packages/app-harness/.gitignore index 696d533dda..5a1cde4990 100644 --- a/packages/app-harness/.gitignore +++ b/packages/app-harness/.gitignore @@ -1,62 +1,2 @@ -# -------------------------------- -# Generated by ReNative -# -------------------------------- -.DS_Store -node_modules/ -npm-debug.log -yarn-error.log -.env -.next -.expo - -#------------------------------- -# Visual Studio -#------------------------------- -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -#------------------------------- -# RENATIVE -#------------------------------- - -platformBuilds/ -platformAssets/ -buildHooks/dist -renative.local.json -renative.private.json -renative.build.json -renative.runtime.json -rnv-config.local.json -metro.config.local.js -.rnv - - -vendor/ -appConfigs/base/assets/ios -appConfigs/base/assets/android -appConfigs/base/assets/web -appConfigs/base/assets/androidtv -appConfigs/base/assets/tvos -appConfigs/base/assets/webos -appConfigs/base/assets/tizen -appConfigs/base/assets/tizenwatch -appConfigs/base/assets/tizenwear -appConfigs/base/assets/kaios -appConfigs/base/assets/firetv -appConfigs/base/assets/androidwear -appConfigs/base/assets/xbox -appConfigs/base/assets/linux -appConfigs/base/assets/macos - -public/ - -# Does not work -# !appConfigs/base/assets/runtime - -reporting - -.bundle/ +# Inherit from root \ No newline at end of file diff --git a/packages/app-harness/.watchmanconfig b/packages/app-harness/.watchmanconfig index a7b537e8bb..57f3651ec4 100644 --- a/packages/app-harness/.watchmanconfig +++ b/packages/app-harness/.watchmanconfig @@ -2,7 +2,12 @@ "ignore_dirs": [ "platformBuilds", "buildHooks/dist", - "../rnv", + "../adapter", + "../build-hooks-git", + "../build-hooks-schema", + "../cli", + "../config-templates", + "../core", "../engine-core", "../engine-lightning", "../engine-rn", @@ -14,14 +19,17 @@ "../engine-rn-windows", "../engine-roku", "../integration-docker", - "../integration-ftp", - "../integration-terraform", - "../integration-vercel", + "../integration-starter", + "../rnv", "../sdk-android", "../sdk-apple", "../sdk-kaios", + "../sdk-react-native", + "../sdk-telemetry", "../sdk-tizen", + "../sdk-utils", "../sdk-webos", - "../sdk-webpack" + "../sdk-webpack", + "../template-starter" ] -} \ No newline at end of file +} diff --git a/packages/app-harness/appConfigs/harness/renative.json b/packages/app-harness/appConfigs/harness/renative.json index f65fe3eabd..2a7575386e 100644 --- a/packages/app-harness/appConfigs/harness/renative.json +++ b/packages/app-harness/appConfigs/harness/renative.json @@ -5,16 +5,16 @@ "skipBootstrapCopy": true, "common": { "id": "renative.harness", - "title": "ReNative", + "title": "Harness", "description": "Cross-platform application project based on ReNative", "buildSchemes": { "debug": { "id": "renative.harness.debug", - "title": "ReNative Debug" + "title": "Debug Harness" }, "test": { "id": "renative.harness.test", - "title": "ReNative Test" + "title": "Test Harness" } }, "runtime": { diff --git a/packages/app-harness/babel.config.js b/packages/app-harness/babel.config.js index 8d4e054380..f0dfefd3c5 100644 --- a/packages/app-harness/babel.config.js +++ b/packages/app-harness/babel.config.js @@ -1,3 +1,3 @@ -const { withRNVBabel } = require('rnv'); +const { withRNVBabel } = require('@rnv/adapter'); module.exports = withRNVBabel({}); diff --git a/packages/app-harness/buildHooks/src/setup/apple.ts b/packages/app-harness/buildHooks/src/setup/apple.ts index a324865728..cc6cb36619 100644 --- a/packages/app-harness/buildHooks/src/setup/apple.ts +++ b/packages/app-harness/buildHooks/src/setup/apple.ts @@ -1,5 +1,5 @@ import path from 'path'; -import { executeAsync, logInfo, logError, RnvContext } from '@rnv/core'; +import { executeAsync, logInfo, RnvContext } from '@rnv/core'; export default async (c: RnvContext) => { // TODO: This is a temporary solution. We need to find a better way to handle untyped values @@ -7,7 +7,7 @@ export default async (c: RnvContext) => { const certRelativePath = cfPrivate?.apple?.p12?.path; if (!certRelativePath) { - return logError('No configPrivate found. You sure you decrypted?', true); + return Promise.reject('No configPrivate found. You sure you decrypted?'); } const certPass = cfPrivate?.apple?.p12?.password; const certPath = path.resolve(c.paths.workspace.project.dir, certRelativePath); diff --git a/packages/app-harness/metro.config.js b/packages/app-harness/metro.config.js index 58f9428bfb..7a554ce6a1 100644 --- a/packages/app-harness/metro.config.js +++ b/packages/app-harness/metro.config.js @@ -1,3 +1,7 @@ -const { withRNVMetro } = require('rnv'); +const { withRNVMetro } = require('@rnv/adapter'); -module.exports = withRNVMetro({}); +module.exports = withRNVMetro({ + resolver: { + unstable_enableSymlinks: true, + }, +}); diff --git a/packages/app-harness/next.config.js b/packages/app-harness/next.config.js index e82ad67a8d..92651f1cc7 100644 --- a/packages/app-harness/next.config.js +++ b/packages/app-harness/next.config.js @@ -1,4 +1,4 @@ -const { withRNVNext } = require('@rnv/engine-rn-next'); +const { withRNVNext } = require('@rnv/adapter'); const config = { compress: false, diff --git a/packages/app-harness/package.json b/packages/app-harness/package.json index f1025443aa..9c48705615 100644 --- a/packages/app-harness/package.json +++ b/packages/app-harness/package.json @@ -16,11 +16,11 @@ }, "scripts": { "bootstrap": "cd ../.. && yarn bootstrap", - "build:android-test": "npx rnv build -p android -s test --packageManager yarn --ci -r", - "build:androidtv-test": "npx rnv build -p androidtv -s test --packageManager yarn --ci -r", - "build:ios-test": "npx rnv build -p ios -s test --packageManager yarn --ci -r", - "build:macos-test": "npx rnv build -p macos -s test --packageManager yarn --ci -r", - "build:tvos-test": "npx rnv build -p tvos -s test --packageManager yarn --ci -r", + "build:android-test": "npx rnv build -p android -s test -c harness --packageManager yarn --ci -r", + "build:androidtv-test": "npx rnv build -p androidtv -s test -c harness --packageManager yarn --ci -r", + "build:ios-test": "npx rnv build -p ios -s test -c harness --packageManager yarn --ci -r", + "build:macos-test": "npx rnv build -p macos -s test -c harness --packageManager yarn --ci -r", + "build:tvos-test": "npx rnv build -p tvos -s test -c harness --packageManager yarn --ci -r", "e2e:android": "APPIUM_HOME=./ PLATFORM=android JAVA_HOME=$(/usr/libexec/java_home) wdio wdio.conf.cjs", "e2e:androidtv": "APPIUM_HOME=./ PLATFORM=androidtv JAVA_HOME=$(/usr/libexec/java_home) wdio wdio.conf.cjs", "e2e:ios": "APPIUM_HOME=./ PLATFORM=ios wdio wdio.conf.cjs", @@ -30,11 +30,11 @@ "report": "yarn report:generate && yarn report:open", "report:generate": "npx allure generate --clean reporting/allure-results -o reporting/allure-report", "report:open": "npx allure open reporting/allure-report", - "run:android-test": "npx rnv run -p android -s test --packageManager yarn --ci -r", - "run:androidtv-test": "npx rnv run -p androidtv -s test --packageManager yarn --ci -r", - "run:ios-test": "npx rnv run -p ios -s test --packageManager yarn --ci -r", - "run:tvos-test": "npx rnv run -p tvos -s test --packageManager yarn --ci -r", - "start:web-test": "npx rnv start -p web -s test --packageManager yarn --ci", + "run:android-test": "npx rnv run -p android -s test -c harness --packageManager yarn --ci -r", + "run:androidtv-test": "npx rnv run -p androidtv -s test -c harness --packageManager yarn --ci -r", + "run:ios-test": "npx rnv run -p ios -s test -c harness --packageManager yarn --ci -r", + "run:tvos-test": "npx rnv run -p tvos -s test -c harness --packageManager yarn --ci -r", + "start:web-test": "npx rnv start -p web -s test -c harness --packageManager yarn --ci", "tsc": "tsc --noEmit --composite false", "watch": "tsc --watch --preserveWatchOutput --noEmit" }, @@ -43,7 +43,7 @@ "@react-native-community/push-notification-ios": "1.11.0", "@react-native-firebase/app": "18.6.1", "@rnv/renative": "1.0.0-rc.12", - "next": "14.1.0", + "next": "14.1.4", "raf": "3.4.1", "react": "18.2.0", "react-art": "18.2.0", @@ -55,8 +55,9 @@ "react-native-permissions": "4.1.4", "react-native-photo-editor": "github:AppGyver/react-native-photo-editor#v0.1.2", "react-native-splash-screen": "3.3.0", - "react-native-tvos": "0.73.1-3", + "react-native-tvos": "0.73.6-0", "react-native-web": "0.19.9", + "react-native-safe-area-context": "4.9.0", "react-native-fs": "2.20.0", "rn-fetch-blob": "0.12.0" }, @@ -64,6 +65,8 @@ "@flexn/assets-renative-outline": "0.3.3", "@flexn/graybox": "1.0.0-feat.12", "@rnv/core": "1.0.0-rc.12", + "@rnv/cli": "1.0.0-rc.12", + "@rnv/config-templates": "1.0.0-rc.12", "@rnv/engine-lightning": "1.0.0-rc.12", "@rnv/engine-rn": "1.0.0-rc.12", "@rnv/engine-rn-electron": "1.0.0-rc.12", @@ -77,9 +80,7 @@ "@types/react-native": "0.72.2", "babel-jest": "29.6.3", "babel-loader": "9.1.3", - "detox": "18.20.2", - "jetifier": "2.0.0", - "rnv": "1.0.0-rc.12" + "detox": "18.20.2" }, "private": true, "browserslist": [ diff --git a/packages/app-harness/react-native.config.js b/packages/app-harness/react-native.config.js index ab5f2f06eb..d8dc90f703 100644 --- a/packages/app-harness/react-native.config.js +++ b/packages/app-harness/react-native.config.js @@ -1,5 +1,5 @@ //! NO CONSOLE LOGS HERE. IT WILL BREAK THE APP -const { withRNVRNConfig } = require('rnv'); +const { withRNVRNConfig } = require('@rnv/adapter'); const config = withRNVRNConfig({}); diff --git a/packages/app-harness/renative.json b/packages/app-harness/renative.json index 1604502a3b..e69605d8e3 100644 --- a/packages/app-harness/renative.json +++ b/packages/app-harness/renative.json @@ -5,10 +5,15 @@ "crypto": { "path": "./secrets/privateConfigs.enc" }, + "isMonorepo": true, "integrations": { "@rnv/integration-starter": {} }, + "defaults": { + "portOffset": 10 + }, "plugins": { + "react-native-safe-area-context": "4.9.0", "react-native-splash-screen": { "android": { "templateAndroid": { diff --git a/packages/app-harness/src/app/index.tsx b/packages/app-harness/src/app/index.tsx index 85193e0a18..f68e20d83e 100644 --- a/packages/app-harness/src/app/index.tsx +++ b/packages/app-harness/src/app/index.tsx @@ -9,16 +9,46 @@ import styles from '../styles'; import { addNotificationListeners, removeNotificationListeners } from '../components/Notifications'; import { requestPermissions } from '../components/Permissions'; import { TestCase } from '../components/TestCase'; - import config from '../../package.json'; import { LoggerProvider, useLoggerContext } from '../context'; import { NotificationCallback } from '../components/types'; +import { SafeAreaProvider } from '../components/SafeArea'; import { PhotoEditorButton } from '../components/PhotoEditor'; +// import { observe as observeLogBoxLogs, symbolicateLogNow } from 'react-native/Libraries/LogBox/Data/LogBoxData'; + +// LogBox keeps all logs that you have not viewed yet. +// When a new log comes in, we only want to print out the new ones. +// let lastCount = 0; + +// observeLogBoxLogs((data) => { +// const logs = Array.from(data.logs); +// const symbolicatedLogs = logs.filter((log) => log.symbolicated.stack?.length); +// for (let i = lastCount; i < symbolicatedLogs.length; i++) { +// // use log instead of warn/error to prevent resending error to LogBox +// console.log(formatLog(symbolicatedLogs[i])); +// } +// lastCount = symbolicatedLogs.length; + +// // Trigger symbolication on remaining logs because +// // logs do not symbolicate until you click on LogBox +// logs.filter((log) => log.symbolicated.status === 'NONE').forEach((log) => symbolicateLogNow(log)); +// }); + +// function formatLog(log) { +// const stackLines = (log.symbolicated.stack || []) +// .filter((line) => !line.collapse) +// .map((line) => ` at ${line.methodName} (${line.file}:${line.lineNumber}:${line.column})`) +// .join('\n'); +// return `Error has been symbolicated\nError: ${log.message.content}\n${stackLines}`; +// } + const App = () => ( - - - + + + + + ); const AppContent = () => { @@ -52,7 +82,7 @@ const AppContent = () => { ReNative Harness diff --git a/packages/app-harness/src/components/SafeArea/index.ts b/packages/app-harness/src/components/SafeArea/index.ts new file mode 100644 index 0000000000..8d0816fbaa --- /dev/null +++ b/packages/app-harness/src/components/SafeArea/index.ts @@ -0,0 +1,3 @@ +import { SafeAreaProvider } from 'react-native-safe-area-context'; + +export { SafeAreaProvider }; diff --git a/packages/app-harness/src/components/SafeArea/index.web.tsx b/packages/app-harness/src/components/SafeArea/index.web.tsx new file mode 100644 index 0000000000..232d39bc05 --- /dev/null +++ b/packages/app-harness/src/components/SafeArea/index.web.tsx @@ -0,0 +1,11 @@ +import { FC, ReactNode, createContext } from 'react'; + +const MockContext = createContext({}); + +type MockProviderProps = { + children: ReactNode; +}; + +export const SafeAreaProvider: FC = ({ children }) => { + return {children}; +}; diff --git a/packages/app-harness/test/specs/e2e.cjs b/packages/app-harness/test/specs/e2e.cjs index d1fa07c02b..04d4e695ab 100644 --- a/packages/app-harness/test/specs/e2e.cjs +++ b/packages/app-harness/test/specs/e2e.cjs @@ -5,7 +5,7 @@ describe('Test App Harness', () => { FlexnRunner.launchApp(); }); - it('--> check if element has correct text in Home Page', async () => { - await FlexnRunner.expectToHaveTextById('app-harness-home-screen-intro-text', 'ReNative Harness'); + it('--> check if ReNative logo is displayed in Home Page', async () => { + await FlexnRunner.expectToBeDisplayedById('app-harness-home-screen-renative-image'); }); }); diff --git a/packages/app-harness/wdio.conf.cjs b/packages/app-harness/wdio.conf.cjs index f456188826..cf2b88eb7a 100644 --- a/packages/app-harness/wdio.conf.cjs +++ b/packages/app-harness/wdio.conf.cjs @@ -165,7 +165,7 @@ exports.config = { // with `/`, the base url gets prepended, not including the path portion of your baseUrl. // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url // gets prepended directly. - baseUrl: 'http://localhost:8080', + baseUrl: 'http://localhost:8090', // // Default timeout for all waitFor* commands. waitforTimeout: 10000, diff --git a/packages/app-harness/webpack.config.js b/packages/app-harness/webpack.config.js index a8bbfa9eed..843184970a 100644 --- a/packages/app-harness/webpack.config.js +++ b/packages/app-harness/webpack.config.js @@ -1,6 +1,6 @@ const webpack = require('webpack'); //to access built-in plugins -const { withRNVWebpack } = require('@rnv/engine-rn-web'); +const { withRNVWebpack } = require('@rnv/adapter'); module.exports = withRNVWebpack({ resolve: { diff --git a/packages/build-hooks-schema/src/schema.ts b/packages/build-hooks-schema/src/schema.ts index d12d76f051..5e08940fad 100644 --- a/packages/build-hooks-schema/src/schema.ts +++ b/packages/build-hooks-schema/src/schema.ts @@ -1,35 +1,35 @@ -import { - RootAppSchema, - RootEngineSchema, - RootGlobalSchema, - RootIntegrationSchema, - RootLocalSchema, - RootPluginSchema, - RootPluginsSchema, - RootPrivateSchema, - RootProjectSchema, - RootTemplateSchema, - RootTemplatesSchema, - getContext, - logSuccess, -} from '@rnv/core'; +import { ZodFileSchema, ZodSharedSchema, getContext, logSuccess } from '@rnv/core'; import { zodToJsonSchema } from 'zod-to-json-schema'; import { z } from 'zod'; import path from 'path'; import fs from 'fs'; export const generateSchema = async () => { - _generateSchemaFile({ schema: RootProjectSchema, schemaId: 'rnv.project' }); - _generateSchemaFile({ schema: RootAppSchema, schemaId: 'rnv.app' }); - _generateSchemaFile({ schema: RootLocalSchema, schemaId: 'rnv.local' }); - _generateSchemaFile({ schema: RootEngineSchema, schemaId: 'rnv.engine' }); - _generateSchemaFile({ schema: RootGlobalSchema, schemaId: 'rnv.global' }); - _generateSchemaFile({ schema: RootPluginsSchema, schemaId: 'rnv.plugins' }); - _generateSchemaFile({ schema: RootTemplateSchema, schemaId: 'rnv.template' }); - _generateSchemaFile({ schema: RootPrivateSchema, schemaId: 'rnv.private' }); - _generateSchemaFile({ schema: RootPluginSchema, schemaId: 'rnv.plugin' }); - _generateSchemaFile({ schema: RootTemplatesSchema, schemaId: 'rnv.templates' }); - _generateSchemaFile({ schema: RootIntegrationSchema, schemaId: 'rnv.integration' }); + const { + zodConfigFilePlugin, + zodConfigFilePrivate, + zodConfigFileProject, + zodConfigFileTemplate, + zodConfigFileTemplates, + zodConfigFileWorkspace, + zodConfigFileIntergation, + zodConfigFileApp, + zodConfigFileLocal, + zodConfigFileEngine, + zodConfigFileRoot, + } = ZodFileSchema; + + _generateSchemaFile({ schema: zodConfigFileProject, schemaId: 'rnv.project' }); + _generateSchemaFile({ schema: zodConfigFileApp, schemaId: 'rnv.app' }); + _generateSchemaFile({ schema: zodConfigFileLocal, schemaId: 'rnv.local' }); + _generateSchemaFile({ schema: zodConfigFileEngine, schemaId: 'rnv.engine' }); + _generateSchemaFile({ schema: zodConfigFileWorkspace, schemaId: 'rnv.workspace' }); + _generateSchemaFile({ schema: zodConfigFileTemplate, schemaId: 'rnv.template' }); + _generateSchemaFile({ schema: zodConfigFilePrivate, schemaId: 'rnv.private' }); + _generateSchemaFile({ schema: zodConfigFilePlugin, schemaId: 'rnv.plugin' }); + _generateSchemaFile({ schema: zodConfigFileTemplates, schemaId: 'rnv.templates' }); + _generateSchemaFile({ schema: zodConfigFileIntergation, schemaId: 'rnv.integration' }); + _generateSchemaFile({ schema: zodConfigFileRoot, schemaId: 'rnv.root' }); logSuccess('Sucessfully exported renative.project.json schema'); }; @@ -37,12 +37,17 @@ export const generateSchema = async () => { const _generateSchemaFile = (opts: { schema: z.ZodObject; schemaId: string }) => { const { schema, schemaId } = opts; const ctx = getContext(); - const jsonSchema: any = zodToJsonSchema(schema, schemaId); + const jsonSchema: any = zodToJsonSchema(schema, { + name: schemaId, + definitions: { + ...ZodSharedSchema, + }, + }); jsonSchema['$schema'] = 'http://json-schema.org/draft-04/schema#'; jsonSchema.definitions[schemaId].properties['$schema'] = { type: 'string', - description: 'schema definition', + description: 'schema definition', }; const destFolder = path.join(ctx.paths.project.dir, `packages/core/jsonSchema`); diff --git a/packages/cli/.gitignore b/packages/cli/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/cli/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/cli/package.json b/packages/cli/package.json index 76ba537e30..4b5f062232 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -33,8 +33,10 @@ }, "dependencies": { "chalk": "4.1.0", - "commander": "^6.2.0", - "inquirer": "8.2.0" + "commander": "12.0.0", + "inquirer": "8.2.0", + "@rnv/sdk-telemetry": "1.0.0-rc.12", + "@rnv/engine-core": "1.0.0-rc.12" }, "peerDependencies": { "@rnv/core": "^1.0.0-rc.12" @@ -42,6 +44,5 @@ "private": false, "publishConfig": { "access": "public" - }, - "gitHead": "48ef244c6ec2e206cbfd72fe8770d8dc03387591" + } } diff --git a/packages/cli/src/bin.ts b/packages/cli/src/bin.ts index 96ce30aa65..1fb698d94d 100644 --- a/packages/cli/src/bin.ts +++ b/packages/cli/src/bin.ts @@ -2,4 +2,4 @@ import { run } from './'; -run(); +run({ RNV_HOME_DIR: undefined }); diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index bf7594d019..8625059242 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,13 +1,31 @@ -import program from 'commander'; +import { program } from 'commander'; import fs from 'fs'; import path from 'path'; -import { logComplete, logError, getContext, RnvTaskOptionPresets, generateStringFromTaskOption } from '@rnv/core'; +import { + logError, + getContext, + generateStringFromTaskOption, + RnvTaskCoreOptionPresets, + RnvContextProgram, + RnvApiSpinner, + RnvApiPrompt, + RnvApiLogger, + createRnvApi, + createRnvContext, + logInitialize, + loadWorkspacesConfigSync, + registerEngine, + executeRnvCore, + getConfigProp, + doResolve, + exitRnvCore, +} from '@rnv/core'; +import { Telemetry } from '@rnv/sdk-telemetry'; +import EngineCore from '@rnv/engine-core'; + import Spinner from './ora'; import Prompt from './prompt'; -import Logger from './logger'; - -//IMPORTANT: Using require instead of import here to avoid circular dependency issue rnv => @rnv/cli => rnv -const { executeRnv } = require('rnv'); +import Logger, { logSummary } from './logger'; const terminateProcesses = (): void => { const { runningProcesses } = getContext(); @@ -21,18 +39,19 @@ const terminateProcesses = (): void => { runningProcesses.length = 0; }; -export const run = () => { +export const run = ({ RNV_HOME_DIR }: { RNV_HOME_DIR?: string }) => { const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json')).toString()); let cmdValue = ''; let cmdOption = ''; program.version(packageJson.version, '-v, --version', 'output current version'); - RnvTaskOptionPresets.withAll().forEach((param) => { + RnvTaskCoreOptionPresets.withCore().forEach((param) => { program.option(generateStringFromTaskOption(param), param.description); }); program.allowUnknownOption(true); // integration options are not known ahead of time + program.helpOption(false); // Make both arguments optional un order to allow `$ rnv` top level command program.arguments('[cmd] [option]').action((cmd, option) => { @@ -47,13 +66,22 @@ export const run = () => { process.exit(0); }); + // This looks weird but commander default help is actual function. + // if you pass --help it will override it with undefined + // So we need to check if it's not a function to output help + // if (program.opts().help) { + + //program.outputHelp(); + // Let's use alternative name for this flag + // program.opts().help = true; + // } + // If the first argument is a flag, then the subCommand is missing // this occurs when rnv has to execute unknown commands (ie intergration commands) // commander does not handle this scenario automatically if (cmdOption && (cmdOption.startsWith('--') || cmdOption.startsWith('-'))) { cmdOption = ''; } - executeRnv({ cmd: cmdValue, subCmd: cmdOption, @@ -62,12 +90,54 @@ export const run = () => { spinner: Spinner, prompt: Prompt, logger: Logger, + RNV_HOME_DIR, }) .then(() => { - logComplete(!getContext().runtime.keepSessionActive); + logSummary(); + exitRnvCore(0); }) .catch((e: unknown) => { terminateProcesses(); - logError(e, true); + logError(e); + logSummary(); + exitRnvCore(1); }); }; + +export const executeRnv = async ({ + cmd, + subCmd, + process, + program, + spinner, + prompt, + logger, + RNV_HOME_DIR, +}: { + cmd: string; + subCmd: string; + process: NodeJS.Process; + program: RnvContextProgram; + spinner: RnvApiSpinner; + prompt: RnvApiPrompt; + logger: RnvApiLogger; + RNV_HOME_DIR?: string; +}) => { + // set mono and ci if json is enabled + if (program.opts().json) { + program.opts().mono = true; + program.opts().ci = true; + } + + createRnvApi({ spinner, prompt, analytics: Telemetry, logger, getConfigProp, doResolve }); + createRnvContext({ program, process, cmd, subCmd, RNV_HOME_DIR }); + + logInitialize(); + loadWorkspacesConfigSync(); + + Telemetry.initialize(); + + await registerEngine(EngineCore); + + await executeRnvCore(); +}; diff --git a/packages/cli/src/logger/index.ts b/packages/cli/src/logger/index.ts index 98ad95cca0..4e17405f92 100644 --- a/packages/cli/src/logger/index.ts +++ b/packages/cli/src/logger/index.ts @@ -26,7 +26,6 @@ let chalkBlue: any = _chalk.rgb(colorBlue.r, colorBlue.g, colorBlue.b); // const RNV = 'ReNative'; const PRIVATE_PARAMS = ['-k', '--key']; -let _currentProcess: NodeJS.Process; let _isInfoEnabled = false; let _infoFilter: Array = []; // let _c: RnvContext; @@ -42,13 +41,12 @@ export const logInitialize = () => { // cnf(); const ctx = getContext(); - _currentProcess = ctx.process; - _isInfoEnabled = !!ctx.program.info; - _jsonOnly = !!ctx.program.json; - _infoFilter = ctx.program.info?.split?.(','); + _isInfoEnabled = !!ctx.program.opts().info; + _jsonOnly = !!ctx.program.opts().json; + _infoFilter = ctx.program.opts().info?.split?.(','); // _analytics = analytics; - if (ctx.program.mono) { + if (ctx.program.opts().mono) { currentChalk = _chalkMono; chalkBlue = _chalkMono; } @@ -59,6 +57,7 @@ export const logInitialize = () => { export const logWelcome = () => { const ctx = getContext(); + if (ctx.program?.opts().help) return; const shortLen = 64; // prettier-ignore let str = _defaultColor(` @@ -127,15 +126,15 @@ export function stripAnsi(string: string) { // }; // const _configureLogger = (c: RnvContext, analytics: AnalyticsApi) => { -// // ctx.logMessages = []; +// // ctx.logging.logMessages = []; // // _c = c; // // if (!ctx.timeStart) ctx.timeStart = new Date(); // _currentProcess = c.process; -// _isInfoEnabled = !!c.program.info; -// _jsonOnly = !!c.program.json; -// _infoFilter = c.program.info?.split?.(','); -// // _isMono = c.program.mono; +// _isInfoEnabled = !!c.program.opts().info; +// _jsonOnly = !!c.program.opts().json; +// _infoFilter = c.program.opts().info?.split?.(','); +// // _isMono = c.program.opts().mono; // _analytics = analytics; // // if (_isMono) { // // currentChalk = _chalkMono; @@ -152,7 +151,7 @@ _updateDefaultColors(); export const logAndSave = (msg: string, skipLog?: boolean) => { const ctx = getContext(); - if (ctx.logMessages && !ctx.logMessages.includes(msg)) ctx.logMessages.push(msg); + if (ctx.logging?.logMessages && !ctx.logging?.logMessages.includes(msg)) ctx.logging?.logMessages.push(msg); if (!skipLog) console.log(`${msg}`); }; @@ -187,10 +186,11 @@ export const getCurrentCommand = (excludeDollar = false) => { return `${dollar}${npx}rnv ${output}`; }; -export const logToSummary = (v: string, sanitizePaths?: () => string) => { +export const logToSummary = (v: string) => { const ctx = getContext(); - const _v = sanitizePaths ? _sanitizePaths(v) : v; - ctx.logMessages.push(`\n${_v}`); + if (ctx.program?.opts().help) return; + const _v = _sanitizePaths(v); + ctx.logging.logMessages.push(`\n${_v}`); }; export const logRaw = (...args: Array) => { @@ -204,8 +204,9 @@ export const logRaw = (...args: Array) => { console.log.apply(null, args); }; -export const logSummary = (header = '✔ SUMMARY') => { +export const logSummary = (opts?: { header?: string; headerStyle?: 'success' | 'warning' | 'error' | 'none' }) => { const ctx = getContext(); + if (ctx.program?.opts().help) return; if (_jsonOnly) return; @@ -217,9 +218,9 @@ export const logSummary = (header = '✔ SUMMARY') => { } let logContent = ''; //= printIntoBox(`All good as ${ICN_UNICORN} `); - if (ctx.logMessages && ctx.logMessages.length) { + if (ctx.logging.logMessages && ctx.logging.logMessages.length) { logContent = ''; - ctx.logMessages.forEach((m) => { + ctx.logging.logMessages.forEach((m) => { logContent += `│ ${m}\n`; }); } @@ -232,9 +233,26 @@ export const logSummary = (header = '✔ SUMMARY') => { // if (ctx.process) { // envString = `${ctx.process.platform} | ${ctx.process.arch} | node v${ctx.process.versions?.node}`; // } - + const defaultHeaderStyle = ctx.logging.containsError + ? 'error' + : ctx.logging.containsWarning + ? 'warning' + : 'success'; + const headerStyle = opts?.headerStyle || defaultHeaderStyle; + + const headerPrefix = + headerStyle === 'success' ? '✔ ' : headerStyle === 'warning' ? '⚠ ' : headerStyle === 'error' ? '⨯ ' : ''; + const headerTextPlain = `${headerPrefix}${opts?.header || 'SUMMARY'}`; + const headerChalk = + headerStyle === 'success' + ? currentChalk.green.bold + : headerStyle === 'warning' + ? currentChalk.yellow.bold + : headerStyle === 'error' + ? currentChalk.green.red + : (v: string) => v; let str = printBoxStart( - `${currentChalk.green.bold(header)} ${timeString} | rnv@${ctx.rnvVersion}`, + `${headerChalk(headerTextPlain)} ${timeString} | rnv@${ctx.rnvVersion}`, getCurrentCommand() ); @@ -259,8 +277,8 @@ export const logSummary = (header = '✔ SUMMARY') => { // } str += printIntoBox(`Engine: ${currentChalk.gray(ctx.runtime?.engine?.config?.id || '')}`); } - if (ctx.runtime?.activeTemplate) { - str += printIntoBox(`Template: ${currentChalk.gray(ctx.runtime?.activeTemplate)}`); + if (ctx.runtime?.currentTemplate) { + str += printIntoBox(`Template: ${currentChalk.gray(ctx.runtime?.currentTemplate)}`); } if (ctx.buildConfig?._meta?.currentAppConfigId) { str += printIntoBox(`App Config (-c): ${_highlightColor(ctx.buildConfig._meta?.currentAppConfigId)}`); @@ -276,17 +294,17 @@ export const logSummary = (header = '✔ SUMMARY') => { if (ctx.runtime?.target) { str += printIntoBox(`Target (-t): ${_highlightColor(ctx.runtime?.target)}`); } - if (ctx.program?.reset) { - str += printIntoBox(`Reset Project (-r): ${_highlightColor(!!ctx.program?.reset)}`); + if (ctx.program?.opts()?.reset) { + str += printIntoBox(`Reset Project (-r): ${_highlightColor(!!ctx.program?.opts()?.reset)}`); } - if (ctx.program?.resetHard) { - str += printIntoBox(`Reset Project and Assets (-R): ${_highlightColor(!!ctx.program?.resetHard)}`); + if (ctx.program?.opts()?.resetHard) { + str += printIntoBox(`Reset Project and Assets (-R): ${_highlightColor(!!ctx.program?.opts()?.resetHard)}`); } - if (ctx.runtime?.supportedPlatforms?.length) { - const plats = ctx.runtime.supportedPlatforms.map( - (v) => `${currentChalk.gray(v.platform)}${v.isConnected ? '' : '(ejected)'}` - ); - str += printArrIntoBox(plats, 'Supported Platforms: '); + if (ctx.runtime?.availablePlatforms?.length) { + // const plats = ctx.runtime.availablePlatforms.map((v) => `${currentChalk.gray(v)}`); + // str += printArrIntoBox(plats, 'Supported Platforms: '); + + str += printIntoBox(`Supported Platforms: ${currentChalk.gray(ctx.runtime.availablePlatforms.join(', '))}`); } if (ctx.process) { @@ -370,6 +388,8 @@ const _sanitizePaths = (msg: string) => { const TASK_COUNTER: Record = {}; export const logTask = (task: string, customChalk?: string | RnvApiChalkFn) => { + const ctx = getContext(); + if (ctx.program?.opts().help) return; if (!TASK_COUNTER[task]) TASK_COUNTER[task] = 0; TASK_COUNTER[task] += 1; const taskCount = currentChalk.grey(`[${TASK_COUNTER[task]}]`); @@ -400,6 +420,8 @@ export const logTask = (task: string, customChalk?: string | RnvApiChalkFn) => { }; export const logDefault = (task: string, customChalk?: string | RnvApiChalkFn) => { + const ctx = getContext(); + if (ctx.program?.opts().help) return; const taskCount = getLogCounter(task); if (_jsonOnly) { @@ -431,11 +453,13 @@ const getLogCounter = (task: string, skipAddition = false) => { TASK_COUNTER[task] += 1; } - const taskCount = currentChalk.grey(`[${TASK_COUNTER[task]}]`); + const taskCount = currentChalk.grey(`(${TASK_COUNTER[task]}x)`); return taskCount; }; export const logInitTask = (task: string) => { + const ctx = getContext(); + if (ctx.program?.opts().help) return; const taskCount = getLogCounter(task); if (_jsonOnly) { @@ -460,6 +484,8 @@ type PrintJsonPayload = { }; export const logExitTask = (task: string) => { + const ctx = getContext(); + if (ctx.program?.opts().help) return; if (_jsonOnly) { return _printJson({ type: 'taskExit', @@ -467,13 +493,15 @@ export const logExitTask = (task: string) => { message: stripAnsi(_sanitizePaths(task)), }); } - const taskCount = getLogCounter(task, true); - const msg = `${currentChalk.green('task:')} ${currentChalk.green('✔')} ${task} ${taskCount}`; + // const taskCount = getLogCounter(task, true); + const msg = `${currentChalk.green('task:')} ${currentChalk.green('✔')} ${task}`; console.log(msg); }; export const logHook = (hook = '', msg = '') => { + const ctx = getContext(); + if (ctx.program?.opts().help) return; if (_jsonOnly) { const payload: PrintJsonPayload = { type: 'hook', hook, message: stripAnsi(_sanitizePaths(msg)) }; if (_getCurrentTask()) payload.task = stripAnsi(_getCurrentTask()); @@ -483,6 +511,7 @@ export const logHook = (hook = '', msg = '') => { }; export const logWarning = (msg: string | boolean | unknown) => { + const ctx = getContext(); const msgSn = typeof msg === 'string' ? _sanitizePaths(msg) : String(msg); if (_jsonOnly) { return _printJson({ @@ -492,10 +521,13 @@ export const logWarning = (msg: string | boolean | unknown) => { message: stripAnsi(msgSn), }); } - logAndSave(currentChalk.yellow(`warn:${_getCurrentTask()} ${msgSn}`)); + ctx.logging.containsWarning = true; + logAndSave(currentChalk.yellow(`warn: ${_getCurrentTask()} ${msgSn}`)); }; export const logInfo = (msg: string) => { + const ctx = getContext(); + if (ctx.program?.opts().help) return; if (_jsonOnly) { return _printJson({ type: 'log', @@ -531,12 +563,6 @@ export const logDebug = (...args: Array) => { export const isInfoEnabled = () => _isInfoEnabled; -export const logComplete = (isEnd = false) => { - if (_jsonOnly) return; - // console.log(currentChalk.green.bold(`✔ Done`)); - if (isEnd) logEnd(0); -}; - export const logSuccess = (msg: string) => { if (_jsonOnly) { return _printJson({ @@ -548,7 +574,7 @@ export const logSuccess = (msg: string) => { logAndSave(`${currentChalk.magenta(`info: ✔`)} ${_sanitizePaths(msg)}`); }; -export const logError = (e: Error | string | unknown, isEnd = false, skipAnalytics = false) => { +export const logError = (e: Error | string | unknown, opts?: { skipAnalytics: boolean }) => { let err = ''; if (typeof e === 'string') { err = e; @@ -557,7 +583,7 @@ export const logError = (e: Error | string | unknown, isEnd = false, skipAnalyti } const ctx = getContext(); const api = getApi(); - if (!skipAnalytics) { + if (!opts?.skipAnalytics) { const extra = { command: getCurrentCommand(), version: ctx.rnvVersion, @@ -570,6 +596,9 @@ export const logError = (e: Error | string | unknown, isEnd = false, skipAnalyti }; api.analytics.captureException(err, { extra }); } + if (ctx.logging) { + ctx.logging.containsError = true; + } if (_jsonOnly) { _printJson({ @@ -578,26 +607,10 @@ export const logError = (e: Error | string | unknown, isEnd = false, skipAnalyti task: stripAnsi(_getCurrentTask()), message: stripAnsi(_sanitizePaths(err)), }); - } else if (e && e instanceof Error && e.message) { - logAndSave(currentChalk.red(`error: ⨯ ${_getCurrentTask()} ${e.message}\n${e.stack}`), isEnd); + } else if (e && e instanceof Error) { + logAndSave(currentChalk.red(`error: ⨯ ${_getCurrentTask()} ${e.stack || e}\n`)); } else { - logAndSave(currentChalk.red(`error: ⨯ ${_getCurrentTask()} ${e}`), isEnd); - } - - ctx.runtime.keepSessionActive = false; - if (isEnd) logEnd(1); -}; - -export const logEnd = (code: number) => { - const api = getApi(); - if (!_jsonOnly) { - logSummary(); - } - - if (_currentProcess) { - api.analytics.teardown().then(() => { - _currentProcess.exit(code); - }); + logAndSave(currentChalk.red(`error: ⨯ ${_getCurrentTask()} ${e}`)); } }; @@ -667,7 +680,6 @@ export const printBoxEnd = () => _defaultColor('└───────── const Logger: RnvApiLogger = { logHook, - logEnd, logInfo, logTask, logError, @@ -677,7 +689,6 @@ const Logger: RnvApiLogger = { logWarning, logSuccess, logWelcome, - logComplete, logInitialize, logAndSave, getCurrentCommand, diff --git a/packages/cli/src/prompt.ts b/packages/cli/src/prompt.ts index c0f3ab6465..a4b3bf83b0 100644 --- a/packages/cli/src/prompt.ts +++ b/packages/cli/src/prompt.ts @@ -13,7 +13,7 @@ import { export const inquirerPrompt = async (params: PromptParams): Promise> => { const c = getContext(); - if (c.program?.yes) { + if (c.program?.opts()?.yes) { const key = params.name || params.type; if (params.type === 'confirm') { @@ -28,7 +28,7 @@ export const inquirerPrompt = async (params: PromptParams): Promise { return new inquirer.Separator(text); }; -export const pressAnyKeyToContinue = () => { - const params = { - type: 'input', - name: 'confirm', - message: 'Press any key to continue', - }; - return inquirer.prompt(params as any); -}; - export const generateOptions = ( inputData: any, isMultiChoice = false, @@ -148,6 +139,5 @@ const _generateOptionString = (i: number, _obj: any, mapping: any, defaultVal: s export default { inquirerPrompt, generateOptions, - pressAnyKeyToContinue, inquirerSeparator, }; diff --git a/packages/config-templates/LICENSE b/packages/config-templates/LICENSE new file mode 100644 index 0000000000..9994b5bb3f --- /dev/null +++ b/packages/config-templates/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 - present, Flexn BV + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/config-templates/README.md b/packages/config-templates/README.md new file mode 100644 index 0000000000..21ae14c067 --- /dev/null +++ b/packages/config-templates/README.md @@ -0,0 +1,2 @@ +# @rnv/config-templates + diff --git a/packages/plugins/package.json b/packages/config-templates/package.json similarity index 74% rename from packages/plugins/package.json rename to packages/config-templates/package.json index f59d8af767..ebb26e5edf 100644 --- a/packages/plugins/package.json +++ b/packages/config-templates/package.json @@ -1,7 +1,7 @@ { - "name": "@rnv/plugins", - "version": "1.0.0-rc.11", - "description": "ReNative Plugins", + "name": "@rnv/config-templates", + "version": "1.0.0-rc.12", + "description": "ReNative configuration templates for plugins, platforms, engines and project template endpoints", "keywords": [], "homepage": "https://github.com/flexn-io/renative#readme", "bugs": { @@ -11,7 +11,8 @@ "author": "Pavel Jacko (https://github.com/pavjacko)", "files": [ "LICENSE", - "pluginTemplates" + "pluginTemplates", + "renative.templates.json" ], "repository": { "type": "git", diff --git a/packages/rnv/pluginTemplates/@react-native-community/cli-platform-ios/overrides.json b/packages/config-templates/pluginTemplates/@react-native-community/cli-platform-ios/overrides.json similarity index 100% rename from packages/rnv/pluginTemplates/@react-native-community/cli-platform-ios/overrides.json rename to packages/config-templates/pluginTemplates/@react-native-community/cli-platform-ios/overrides.json diff --git a/packages/rnv/pluginTemplates/@react-native-community/cli-platform-ios/overrides@11.3.7.json b/packages/config-templates/pluginTemplates/@react-native-community/cli-platform-ios/overrides@11.3.7.json similarity index 100% rename from packages/rnv/pluginTemplates/@react-native-community/cli-platform-ios/overrides@11.3.7.json rename to packages/config-templates/pluginTemplates/@react-native-community/cli-platform-ios/overrides@11.3.7.json diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow1.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow1.png new file mode 100644 index 0000000000..de46111c6f Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow1.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow2.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow2.png new file mode 100644 index 0000000000..74a2881a55 Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow2.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow3.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow3.png new file mode 100644 index 0000000000..b53227a1db Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow3.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow4.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow4.png new file mode 100644 index 0000000000..2f029f5121 Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow4.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow5.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow5.png new file mode 100644 index 0000000000..b83a5d7e35 Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/android/app/src/main/res/drawable/arrow5.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/RNVApp/RNPhotoEditor/RNPhotoEditor.h b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/RNVApp/RNPhotoEditor/RNPhotoEditor.h new file mode 100644 index 0000000000..855f3ed793 --- /dev/null +++ b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/RNVApp/RNPhotoEditor/RNPhotoEditor.h @@ -0,0 +1,8 @@ +#import +#import +#import + +@interface RNPhotoEditor : NSObject + +@end + diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/RNVApp/RNPhotoEditor/RNPhotoEditor.m b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/RNVApp/RNPhotoEditor/RNPhotoEditor.m new file mode 100644 index 0000000000..84b47a435f --- /dev/null +++ b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/RNVApp/RNPhotoEditor/RNPhotoEditor.m @@ -0,0 +1,147 @@ + +#import "RNPhotoEditor.h" + +@implementation RNPhotoEditor + +- (dispatch_queue_t)methodQueue +{ + return dispatch_get_main_queue(); +} +RCT_EXPORT_MODULE() + +NSString *_editImagePath = nil; + +RCTResponseSenderBlock _onDoneEditing = nil; +RCTResponseSenderBlock _onCancelEditing = nil; + +- (void)doneEditingWithImage:(UIImage *)image { + if (_onDoneEditing == nil) return; + + // Save image. + NSString *newImagePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject]; + NSString *fileName = [[_editImagePath componentsSeparatedByString:@"/"].lastObject componentsSeparatedByString:@"."].firstObject; + fileName = [fileName stringByAppendingString:@".png"]; + newImagePath = [newImagePath stringByAppendingPathComponent:fileName]; + [UIImagePNGRepresentation(image) writeToFile:newImagePath atomically:YES]; + + _onDoneEditing(@[newImagePath]); +} + +- (void)canceledEditing { + if (_onCancelEditing == nil) return; + + _onCancelEditing(@[]); +} + +RCT_EXPORT_METHOD(Edit:(nonnull NSDictionary *)props onDone:(RCTResponseSenderBlock)onDone onCancel:(RCTResponseSenderBlock)onCancel) { + + dispatch_async(dispatch_get_main_queue(), ^{ + _editImagePath = [props objectForKey: @"path"]; + + _onDoneEditing = onDone; + _onCancelEditing = onCancel; + + PhotoEditorViewController *photoEditor = [[PhotoEditorViewController alloc] initWithNibName:@"PhotoEditorViewController" bundle: [NSBundle bundleForClass:[PhotoEditorViewController class]]]; + + // Process Image for Editing + UIImage *image = [UIImage imageWithContentsOfFile:_editImagePath]; + if (image == nil) { + NSURL *url = [NSURL URLWithString:_editImagePath]; + NSData *data = [NSData dataWithContentsOfURL:url]; + + image = [UIImage imageWithData:data]; + } + + photoEditor.image = image; + + // Process Stickers + NSArray *stickers = [props objectForKey: @"stickers"]; + NSMutableArray *imageStickers = [[NSMutableArray alloc] initWithCapacity:stickers.count]; + + for (NSString *sticker in stickers) { + NSString *stickerFile = [sticker stringByAppendingString:@".png"]; + UIImage *image = [UIImage imageNamed: stickerFile]; + if(image){ + [imageStickers addObject: image]; + } + } + + photoEditor.stickers = imageStickers; + + //Process Controls + NSArray *hiddenControls = [props objectForKey: @"hiddenControls"]; + NSMutableArray *passHiddenControls = [[NSMutableArray alloc] initWithCapacity:hiddenControls.count]; + + for (NSString *hiddenControl in hiddenControls) { + [passHiddenControls addObject: [[NSString alloc] initWithString: hiddenControl]]; + } + + photoEditor.hiddenControls = passHiddenControls; + + //Process Colors + NSArray *colors = [props objectForKey: @"colors"]; + NSMutableArray *passColors = [[NSMutableArray alloc] initWithCapacity:colors.count]; + + for (NSString *color in colors) { + [passColors addObject: [self colorWithHexString: color]]; + } + + photoEditor.colors = passColors; + + if (@available(iOS 13, *)) { + [photoEditor setModalPresentationStyle: UIModalPresentationFullScreen]; + } + + // Invoke Editor + photoEditor.photoEditorDelegate = self; + + id app = [[UIApplication sharedApplication] delegate]; + [((UINavigationController*) app.window.rootViewController) presentViewController:photoEditor animated:YES completion:nil]; + }); +} + + +- (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length { + NSString *substring = [string substringWithRange: NSMakeRange(start, length)]; + NSString *fullHex = length == 2 ? substring : [NSString stringWithFormat: @"%@%@", substring, substring]; + unsigned hexComponent; + [[NSScanner scannerWithString: fullHex] scanHexInt: &hexComponent]; + return hexComponent / 255.0; +} + +- (UIColor *) colorWithHexString: (NSString *) hexString { + NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString]; + CGFloat alpha, red, blue, green; + switch ([colorString length]) { + case 3: // #RGB + alpha = 1.0f; + red = [self colorComponentFrom: colorString start: 0 length: 1]; + green = [self colorComponentFrom: colorString start: 1 length: 1]; + blue = [self colorComponentFrom: colorString start: 2 length: 1]; + break; + case 4: // #ARGB + alpha = [self colorComponentFrom: colorString start: 0 length: 1]; + red = [self colorComponentFrom: colorString start: 1 length: 1]; + green = [self colorComponentFrom: colorString start: 2 length: 1]; + blue = [self colorComponentFrom: colorString start: 3 length: 1]; + break; + case 6: // #RRGGBB + alpha = 1.0f; + red = [self colorComponentFrom: colorString start: 0 length: 2]; + green = [self colorComponentFrom: colorString start: 2 length: 2]; + blue = [self colorComponentFrom: colorString start: 4 length: 2]; + break; + case 8: // #AARRGGBB + alpha = [self colorComponentFrom: colorString start: 0 length: 2]; + red = [self colorComponentFrom: colorString start: 2 length: 2]; + green = [self colorComponentFrom: colorString start: 4 length: 2]; + blue = [self colorComponentFrom: colorString start: 6 length: 2]; + break; + default: + return nil; + } + return [UIColor colorWithRed: red green: green blue: blue alpha: alpha]; +} + + +@end diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow1.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow1.png new file mode 100644 index 0000000000..de46111c6f Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow1.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow2.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow2.png new file mode 100644 index 0000000000..74a2881a55 Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow2.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow3.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow3.png new file mode 100644 index 0000000000..b53227a1db Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow3.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow4.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow4.png new file mode 100644 index 0000000000..2f029f5121 Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow4.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow5.png b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow5.png new file mode 100644 index 0000000000..b83a5d7e35 Binary files /dev/null and b/packages/config-templates/pluginTemplates/react-native-photo-editor/builds/ios/Resources/arrow5.png differ diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/overrides/android/build.gradle b/packages/config-templates/pluginTemplates/react-native-photo-editor/overrides/android/build.gradle new file mode 100644 index 0000000000..39e601e048 --- /dev/null +++ b/packages/config-templates/pluginTemplates/react-native-photo-editor/overrides/android/build.gradle @@ -0,0 +1,46 @@ +// NOTE: adding exif interface +buildscript { + repositories { + maven { url 'https://jitpack.io' } + maven { url "https://maven.google.com" } + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.1.3' + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + buildToolsVersion '28.0.2' + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + } + lintOptions { + abortOnError false + } +} + +repositories { + mavenCentral() + maven { url 'https://jitpack.io' } + maven { url "https://maven.google.com" } +} + +dependencies { + implementation 'com.facebook.react:react-native:+' + implementation 'com.github.prscX:photo-editor-android:master' + implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1@aar' + implementation 'com.nineoldandroids:library:2.4.0' + implementation 'com.android.support:design:27.1.1' + implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'com.android.support:exifinterface:28.0.0' +} diff --git a/packages/config-templates/pluginTemplates/react-native-photo-editor/overrides/android/src/main/java/com/ahmedadeltito/photoeditor/PhotoEditorActivity.java b/packages/config-templates/pluginTemplates/react-native-photo-editor/overrides/android/src/main/java/com/ahmedadeltito/photoeditor/PhotoEditorActivity.java new file mode 100644 index 0000000000..48b0abdbd2 --- /dev/null +++ b/packages/config-templates/pluginTemplates/react-native-photo-editor/overrides/android/src/main/java/com/ahmedadeltito/photoeditor/PhotoEditorActivity.java @@ -0,0 +1,695 @@ +// NOTE: adding exif interface +package com.ahmedadeltito.photoeditor; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Typeface; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.provider.MediaStore; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.net.Uri; +import android.view.WindowManager; + +import com.ahmedadeltito.photoeditor.widget.SlidingUpPanelLayout; +import com.ahmedadeltito.photoeditorsdk.BrushDrawingView; +import com.ahmedadeltito.photoeditorsdk.OnPhotoEditorSDKListener; +import com.ahmedadeltito.photoeditorsdk.PhotoEditorSDK; +import com.ahmedadeltito.photoeditorsdk.ViewType; +import com.viewpagerindicator.PageIndicator; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import ui.photoeditor.R; + +import android.graphics.Matrix; +import androidx.exifinterface.media.ExifInterface; + +public class PhotoEditorActivity extends AppCompatActivity implements View.OnClickListener, OnPhotoEditorSDKListener { + + public static Typeface emojiFont = null; + + private final String TAG = "PhotoEditorActivity"; + private RelativeLayout parentImageRelativeLayout; + private RecyclerView drawingViewColorPickerRecyclerView; + private TextView undoTextView, undoTextTextView, doneDrawingTextView, eraseDrawingTextView; + private SlidingUpPanelLayout mLayout; + private View topShadow; + private RelativeLayout topShadowRelativeLayout; + private View bottomShadow; + private RelativeLayout bottomShadowRelativeLayout; + private ArrayList colorPickerColors; + private int colorCodeTextView = -1; + private PhotoEditorSDK photoEditorSDK; + + private int imageOrientation; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_photo_editor); + + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + + String selectedImagePath = getIntent().getExtras().getString("selectedImagePath"); + + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inSampleSize = 1; + + + Typeface newFont = getFontFromRes(R.raw.eventtusicons); + emojiFont = getFontFromRes(R.raw.emojioneandroid); + + BrushDrawingView brushDrawingView = (BrushDrawingView) findViewById(R.id.drawing_view); + drawingViewColorPickerRecyclerView = (RecyclerView) findViewById(R.id.drawing_view_color_picker_recycler_view); + parentImageRelativeLayout = (RelativeLayout) findViewById(R.id.parent_image_rl); + TextView closeTextView = (TextView) findViewById(R.id.close_tv); + TextView addTextView = (TextView) findViewById(R.id.add_text_tv); + TextView addPencil = (TextView) findViewById(R.id.add_pencil_tv); + RelativeLayout deleteRelativeLayout = (RelativeLayout) findViewById(R.id.delete_rl); + TextView deleteTextView = (TextView) findViewById(R.id.delete_tv); + TextView addImageEmojiTextView = (TextView) findViewById(R.id.add_image_emoji_tv); + TextView saveTextView = (TextView) findViewById(R.id.save_tv); + TextView saveTextTextView = (TextView) findViewById(R.id.save_text_tv); + undoTextView = (TextView) findViewById(R.id.undo_tv); + undoTextTextView = (TextView) findViewById(R.id.undo_text_tv); + doneDrawingTextView = (TextView) findViewById(R.id.done_drawing_tv); + eraseDrawingTextView = (TextView) findViewById(R.id.erase_drawing_tv); + TextView clearAllTextView = (TextView) findViewById(R.id.clear_all_tv); + TextView clearAllTextTextView = (TextView) findViewById(R.id.clear_all_text_tv); + TextView goToNextTextView = (TextView) findViewById(R.id.go_to_next_screen_tv); + ImageView photoEditImageView = (ImageView) findViewById(R.id.photo_edit_iv); + mLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout); + topShadow = findViewById(R.id.top_shadow); + topShadowRelativeLayout = (RelativeLayout) findViewById(R.id.top_parent_rl); + bottomShadow = findViewById(R.id.bottom_shadow); + bottomShadowRelativeLayout = (RelativeLayout) findViewById(R.id.bottom_parent_rl); + + ViewPager pager = (ViewPager) findViewById(R.id.image_emoji_view_pager); + PageIndicator indicator = (PageIndicator) findViewById(R.id.image_emoji_indicator); + + Bitmap rotatedBitmap; + Uri path; + String parsedPath; + String uriString; + Bitmap bitmap = null; + try { + path = Uri.parse(selectedImagePath); + parsedPath = UtilFunctions.getPath(this, path); + uriString = null != parsedPath ? parsedPath : path.toString(); + bitmap = BitmapFactory.decodeFile(uriString, options); + + ExifInterface exif = new ExifInterface(parsedPath); + imageOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); + rotatedBitmap = rotateBitmap(bitmap, imageOrientation, false); + + photoEditImageView.setImageBitmap(rotatedBitmap); + } catch (Exception e) { + Log.e("Error parsing Bitmap", e.getMessage()); + + if (bitmap != null) { + photoEditImageView.setImageBitmap(bitmap); + } + } + + closeTextView.setTypeface(newFont); + addTextView.setTypeface(newFont); + addPencil.setTypeface(newFont); + addImageEmojiTextView.setTypeface(newFont); + saveTextView.setTypeface(newFont); + undoTextView.setTypeface(newFont); + clearAllTextView.setTypeface(newFont); + goToNextTextView.setTypeface(newFont); + deleteTextView.setTypeface(newFont); + + final List fragmentsList = new ArrayList<>(); + + ImageFragment imageFragment = new ImageFragment(); + ArrayList stickers = (ArrayList) getIntent().getExtras().getSerializable("stickers"); + if (stickers != null && stickers.size() > 0) { + Bundle bundle = new Bundle(); + bundle.putSerializable("stickers", stickers); + + imageFragment.setArguments(bundle); + } + + fragmentsList.add(imageFragment); + + EmojiFragment emojiFragment = new EmojiFragment(); + fragmentsList.add(emojiFragment); + + PreviewSlidePagerAdapter adapter = new PreviewSlidePagerAdapter(getSupportFragmentManager(), fragmentsList); + pager.setAdapter(adapter); + pager.setOffscreenPageLimit(5); + indicator.setViewPager(pager); + + photoEditorSDK = new PhotoEditorSDK.PhotoEditorSDKBuilder(PhotoEditorActivity.this) + .parentView(parentImageRelativeLayout) // add parent image view + .childView(photoEditImageView) // add the desired image view + .deleteView(deleteRelativeLayout) // add the deleted view that will appear during the movement of the views + .brushDrawingView(brushDrawingView) // add the brush drawing view that is responsible for drawing on the image view + .buildPhotoEditorSDK(); // build photo editor sdk + photoEditorSDK.setOnPhotoEditorSDKListener(this); + + pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + if (position == 0) + mLayout.setScrollableView(((ImageFragment) fragmentsList.get(position)).imageRecyclerView); + else if (position == 1) + mLayout.setScrollableView(((EmojiFragment) fragmentsList.get(position)).emojiRecyclerView); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + + closeTextView.setOnClickListener(this); + addImageEmojiTextView.setOnClickListener(this); + addTextView.setOnClickListener(this); + addPencil.setOnClickListener(this); + saveTextView.setOnClickListener(this); + saveTextTextView.setOnClickListener(this); + undoTextView.setOnClickListener(this); + undoTextTextView.setOnClickListener(this); + doneDrawingTextView.setOnClickListener(this); + eraseDrawingTextView.setOnClickListener(this); + clearAllTextView.setOnClickListener(this); + clearAllTextTextView.setOnClickListener(this); + goToNextTextView.setOnClickListener(this); + + ArrayList intentColors = (ArrayList) getIntent().getExtras().getSerializable("colorPickerColors"); + + colorPickerColors = new ArrayList<>(); + if (intentColors != null) { + colorPickerColors = intentColors; + } else { + colorPickerColors.add(getResources().getColor(R.color.black)); + colorPickerColors.add(getResources().getColor(R.color.blue_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.brown_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.green_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.orange_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.red_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.red_orange_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.sky_blue_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.violet_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.white)); + colorPickerColors.add(getResources().getColor(R.color.yellow_color_picker)); + colorPickerColors.add(getResources().getColor(R.color.yellow_green_color_picker)); + } + + + new CountDownTimer(500, 100) { + + public void onTick(long millisUntilFinished) { + } + + public void onFinish() { + mLayout.setScrollableView(((ImageFragment) fragmentsList.get(0)).imageRecyclerView); + } + + }.start(); + + ArrayList hiddenControls = (ArrayList) getIntent().getExtras().getSerializable("hiddenControls"); + for (int i = 0;i < hiddenControls.size();i++) { + if (hiddenControls.get(i).toString().equalsIgnoreCase("text")) { + addTextView.setVisibility(View.INVISIBLE); + } + if (hiddenControls.get(i).toString().equalsIgnoreCase("clear")) { + clearAllTextView.setVisibility(View.INVISIBLE); + clearAllTextTextView.setVisibility(View.INVISIBLE); + } + if (hiddenControls.get(i).toString().equalsIgnoreCase("crop")) { + + } + if (hiddenControls.get(i).toString().equalsIgnoreCase("draw")) { + addPencil.setVisibility(View.INVISIBLE); + } + if (hiddenControls.get(i).toString().equalsIgnoreCase("save")) { + saveTextTextView.setVisibility(View.INVISIBLE); + saveTextView.setVisibility(View.INVISIBLE); + } + if (hiddenControls.get(i).toString().equalsIgnoreCase("share")) { + + } + if (hiddenControls.get(i).toString().equalsIgnoreCase("sticker")) { + addImageEmojiTextView.setVisibility(View.INVISIBLE); + } + } + } + + private boolean stringIsNotEmpty(String string) { + if (string != null && !string.equals("null")) { + if (!string.trim().equals("")) { + return true; + } + } + return false; + } + + public void addEmoji(String emojiName) { + photoEditorSDK.addEmoji(emojiName, emojiFont); + if (mLayout != null) + mLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + } + + public void addImage(Bitmap image) { + photoEditorSDK.addImage(image); + if (mLayout != null) + mLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + } + + private void addText(String text, int colorCodeTextView) { + photoEditorSDK.addText(text, colorCodeTextView); + } + + private void clearAllViews() { + photoEditorSDK.clearAllViews(); + } + + private void undoViews() { + photoEditorSDK.viewUndo(); + } + + private void eraseDrawing() { + photoEditorSDK.brushEraser(); + } + + private void openAddTextPopupWindow(String text, int colorCode) { + colorCodeTextView = colorCode; + LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View addTextPopupWindowRootView = inflater.inflate(R.layout.add_text_popup_window, null); + final EditText addTextEditText = (EditText) addTextPopupWindowRootView.findViewById(R.id.add_text_edit_text); + TextView addTextDoneTextView = (TextView) addTextPopupWindowRootView.findViewById(R.id.add_text_done_tv); + RecyclerView addTextColorPickerRecyclerView = (RecyclerView) addTextPopupWindowRootView.findViewById(R.id.add_text_color_picker_recycler_view); + LinearLayoutManager layoutManager = new LinearLayoutManager(PhotoEditorActivity.this, LinearLayoutManager.HORIZONTAL, false); + addTextColorPickerRecyclerView.setLayoutManager(layoutManager); + addTextColorPickerRecyclerView.setHasFixedSize(true); + ColorPickerAdapter colorPickerAdapter = new ColorPickerAdapter(PhotoEditorActivity.this, colorPickerColors); + colorPickerAdapter.setOnColorPickerClickListener(new ColorPickerAdapter.OnColorPickerClickListener() { + @Override + public void onColorPickerClickListener(int colorCode) { + addTextEditText.setTextColor(colorCode); + colorCodeTextView = colorCode; + } + }); + addTextColorPickerRecyclerView.setAdapter(colorPickerAdapter); + if (stringIsNotEmpty(text)) { + addTextEditText.setText(text); + addTextEditText.setTextColor(colorCode == -1 ? getResources().getColor(R.color.white) : colorCode); + } + final PopupWindow pop = new PopupWindow(PhotoEditorActivity.this); + pop.setContentView(addTextPopupWindowRootView); + pop.setWidth(LinearLayout.LayoutParams.MATCH_PARENT); + pop.setHeight(LinearLayout.LayoutParams.MATCH_PARENT); + pop.setFocusable(true); + pop.setBackgroundDrawable(null); + pop.showAtLocation(addTextPopupWindowRootView, Gravity.TOP, 0, 0); + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); + addTextDoneTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + addText(addTextEditText.getText().toString(), colorCodeTextView); + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + pop.dismiss(); + } + }); + } + + private void updateView(int visibility) { + topShadow.setVisibility(visibility); + topShadowRelativeLayout.setVisibility(visibility); + bottomShadow.setVisibility(visibility); + bottomShadowRelativeLayout.setVisibility(visibility); + } + + private void updateBrushDrawingView(boolean brushDrawingMode) { + photoEditorSDK.setBrushDrawingMode(brushDrawingMode); + if (brushDrawingMode) { + updateView(View.GONE); + drawingViewColorPickerRecyclerView.setVisibility(View.VISIBLE); + doneDrawingTextView.setVisibility(View.VISIBLE); + eraseDrawingTextView.setVisibility(View.VISIBLE); + LinearLayoutManager layoutManager = new LinearLayoutManager(PhotoEditorActivity.this, LinearLayoutManager.HORIZONTAL, false); + drawingViewColorPickerRecyclerView.setLayoutManager(layoutManager); + drawingViewColorPickerRecyclerView.setHasFixedSize(true); + ColorPickerAdapter colorPickerAdapter = new ColorPickerAdapter(PhotoEditorActivity.this, colorPickerColors); + colorPickerAdapter.setOnColorPickerClickListener(new ColorPickerAdapter.OnColorPickerClickListener() { + @Override + public void onColorPickerClickListener(int colorCode) { + photoEditorSDK.setBrushColor(colorCode); + } + }); + drawingViewColorPickerRecyclerView.setAdapter(colorPickerAdapter); + } else { + updateView(View.VISIBLE); + drawingViewColorPickerRecyclerView.setVisibility(View.GONE); + doneDrawingTextView.setVisibility(View.GONE); + eraseDrawingTextView.setVisibility(View.GONE); + } + } + + private void returnBackWithSavedImage() { + updateView(View.GONE); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); + layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); + parentImageRelativeLayout.setLayoutParams(layoutParams); + new CountDownTimer(1000, 500) { + public void onTick(long millisUntilFinished) { + + } + + public void onFinish() { + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageName = "IMG_" + timeStamp + ".jpg"; + Intent returnIntent = new Intent(); + returnIntent.putExtra("imagePath", photoEditorSDK.saveImage("PhotoEditorSDK", imageName)); + setResult(Activity.RESULT_OK, returnIntent); + finish(); + } + }.start(); + } + + + private void returnBackWithUpdateImage() { + updateView(View.GONE); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); + layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); + parentImageRelativeLayout.setLayoutParams(layoutParams); + new CountDownTimer(1000, 500) { + public void onTick(long millisUntilFinished) { + + } + + public void onFinish() { + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageName = "IMG_" + timeStamp + ".jpg"; + + String selectedImagePath = getIntent().getExtras().getString("selectedImagePath"); + String parsedPath = UtilFunctions.getPath(PhotoEditorActivity.this, Uri.parse(selectedImagePath)); + String uriString = null != parsedPath ? parsedPath : selectedImagePath; + File file = new File(uriString); + + try { + FileOutputStream out = new FileOutputStream(file); + if (parentImageRelativeLayout != null) { + parentImageRelativeLayout.setDrawingCacheEnabled(true); + + Bitmap bitmap = parentImageRelativeLayout.getDrawingCache(); + Bitmap rotatedBitmap = rotateBitmap(bitmap, imageOrientation, true); + rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out); + } + + out.flush(); + out.close(); + + try { + ExifInterface exifDest = new ExifInterface(file.getAbsolutePath()); + exifDest.setAttribute(ExifInterface.TAG_ORIENTATION, Integer.toString(imageOrientation)); + exifDest.saveAttributes(); + } catch (IOException e) { + e.printStackTrace(); + } + + } catch (Exception var7) { + Log.e("onFinish URI", var7.getMessage()); + var7.printStackTrace(); + } + + Intent returnIntent = new Intent(); + returnIntent.putExtra("imagePath", uriString); + setResult(Activity.RESULT_OK, returnIntent); + + finish(); + } + }.start(); + } + + @Override + public void onClick(View v) { + if (v.getId() == R.id.close_tv) { + onBackPressed(); + } else if (v.getId() == R.id.add_image_emoji_tv) { + mLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); + } else if (v.getId() == R.id.add_text_tv) { + openAddTextPopupWindow("", -1); + } else if (v.getId() == R.id.add_pencil_tv) { + updateBrushDrawingView(true); + } else if (v.getId() == R.id.done_drawing_tv) { + updateBrushDrawingView(false); + } else if (v.getId() == R.id.save_tv || v.getId() == R.id.save_text_tv) { + returnBackWithSavedImage(); + } else if (v.getId() == R.id.clear_all_tv || v.getId() == R.id.clear_all_text_tv) { + clearAllViews(); + } else if (v.getId() == R.id.undo_text_tv || v.getId() == R.id.undo_tv) { + undoViews(); + } else if (v.getId() == R.id.erase_drawing_tv) { + eraseDrawing(); + } else if (v.getId() == R.id.go_to_next_screen_tv) { + returnBackWithUpdateImage(); + } + } + + @Override + public void onEditTextChangeListener(String text, int colorCode) { + openAddTextPopupWindow(text, colorCode); + } + + @Override + public void onAddViewListener(ViewType viewType, int numberOfAddedViews) { + if (numberOfAddedViews > 0) { + undoTextView.setVisibility(View.VISIBLE); + undoTextTextView.setVisibility(View.VISIBLE); + } + switch (viewType) { + case BRUSH_DRAWING: + Log.i("BRUSH_DRAWING", "onAddViewListener"); + break; + case EMOJI: + Log.i("EMOJI", "onAddViewListener"); + break; + case IMAGE: + Log.i("IMAGE", "onAddViewListener"); + break; + case TEXT: + Log.i("TEXT", "onAddViewListener"); + break; + } + } + + @Override + public void onRemoveViewListener(int numberOfAddedViews) { + Log.i(TAG, "onRemoveViewListener"); + if (numberOfAddedViews == 0) { + undoTextView.setVisibility(View.GONE); + undoTextTextView.setVisibility(View.GONE); + } + } + + @Override + public void onStartViewChangeListener(ViewType viewType) { + switch (viewType) { + case BRUSH_DRAWING: + Log.i("BRUSH_DRAWING", "onStartViewChangeListener"); + break; + case EMOJI: + Log.i("EMOJI", "onStartViewChangeListener"); + break; + case IMAGE: + Log.i("IMAGE", "onStartViewChangeListener"); + break; + case TEXT: + Log.i("TEXT", "onStartViewChangeListener"); + break; + } + } + + @Override + public void onStopViewChangeListener(ViewType viewType) { + switch (viewType) { + case BRUSH_DRAWING: + Log.i("BRUSH_DRAWING", "onStopViewChangeListener"); + break; + case EMOJI: + Log.i("EMOJI", "onStopViewChangeListener"); + break; + case IMAGE: + Log.i("IMAGE", "onStopViewChangeListener"); + break; + case TEXT: + Log.i("TEXT", "onStopViewChangeListener"); + break; + } + } + + private class PreviewSlidePagerAdapter extends FragmentStatePagerAdapter { + private List mFragments; + + PreviewSlidePagerAdapter(FragmentManager fm, List fragments) { + super(fm); + mFragments = fragments; + } + + @Override + public Fragment getItem(int position) { + if (mFragments == null) { + return (null); + } + return mFragments.get(position); + } + + @Override + public int getCount() { + return 2; + } + } + + private Typeface getFontFromRes(int resource) + { + Typeface tf = null; + InputStream is = null; + try { + is = getResources().openRawResource(resource); + } + catch(Resources.NotFoundException e) { + Log.e(TAG, "Could not find font in resources!"); + } + + String outPath = getCacheDir() + "/tmp" + System.currentTimeMillis() + ".raw"; + + try + { + byte[] buffer = new byte[is.available()]; + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outPath)); + + int l = 0; + while((l = is.read(buffer)) > 0) + bos.write(buffer, 0, l); + + bos.close(); + + tf = Typeface.createFromFile(outPath); + + // clean up + new File(outPath).delete(); + } + catch (IOException e) + { + Log.e(TAG, "Error reading in font!"); + return null; + } + + Log.d(TAG, "Successfully loaded font."); + + return tf; + } + + private static Bitmap rotateBitmap(Bitmap bitmap, int orientation, boolean reverse) { + Matrix matrix = new Matrix(); + + switch (orientation) { + case ExifInterface.ORIENTATION_NORMAL: + return bitmap; + case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: + matrix.setScale(-1, 1); + + break; + case ExifInterface.ORIENTATION_ROTATE_180: + matrix.setRotate(180); + + break; + case ExifInterface.ORIENTATION_FLIP_VERTICAL: + matrix.setRotate(180); + matrix.postScale(-1, 1); + + break; + case ExifInterface.ORIENTATION_TRANSPOSE: + if (!reverse) { + matrix.setRotate(90); + } else { + matrix.setRotate(-90); + } + + matrix.postScale(-1, 1); + break; + case ExifInterface.ORIENTATION_ROTATE_90: + if (!reverse) { + matrix.setRotate(90); + } else { + matrix.setRotate(-90); + } + + break; + case ExifInterface.ORIENTATION_TRANSVERSE: + if (!reverse) { + matrix.setRotate(-90); + } else { + matrix.setRotate(90); + } + + matrix.postScale(-1, 1); + break; + case ExifInterface.ORIENTATION_ROTATE_270: + if (!reverse) { + matrix.setRotate(-90); + } else { + matrix.setRotate(90); + } + + break; + default: + return bitmap; + } + + try { + Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + bitmap.recycle(); + + return bmRotated; + } catch (OutOfMemoryError e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/packages/plugins/pluginTemplates/renative.plugins.json b/packages/config-templates/renative.templates.json similarity index 85% rename from packages/plugins/pluginTemplates/renative.plugins.json rename to packages/config-templates/renative.templates.json index 9ee3f77911..45ffbd9abb 100644 --- a/packages/plugins/pluginTemplates/renative.plugins.json +++ b/packages/config-templates/renative.templates.json @@ -1,6 +1,134 @@ { - "$schema": "../../../.rnv/schema/rnv.plugins.json", + "$schema": "../../.rnv/schema/rnv.templates.json", + "projectTemplates": { + "@rnv/template-starter": { + "description": "Multiplatform 'hello world' template" + }, + "@flexn/create-template-starter": { + "description": "Advanced multiplatform template using flexn Create SDK" + } + }, + "engineIdMap": { + "engine-lightning": "@rnv/engine-lightning", + "engine-rn": "@rnv/engine-rn", + "engine-rn-electron": "@rnv/engine-rn-electron", + "engine-rn-macos": "@rnv/engine-rn-macos", + "engine-rn-next": "@rnv/engine-rn-next", + "engine-rn-tvos": "@rnv/engine-rn-tvos", + "engine-rn-web": "@rnv/engine-rn-web", + "engine-rn-windows": "@rnv/engine-rn-windows" + }, + "engineTemplates": { + "@rnv/engine-rn": { + "version": "1.0.0-rc.12", + "id": "engine-rn" + }, + "@rnv/engine-rn-tvos": { + "version": "1.0.0-rc.12", + "id": "engine-rn-tvos" + }, + "@rnv/engine-rn-web": { + "version": "1.0.0-rc.12", + "id": "engine-rn-web" + }, + "@rnv/engine-rn-next": { + "version": "1.0.0-rc.12", + "id": "engine-rn-next" + }, + "@rnv/engine-rn-electron": { + "version": "1.0.0-rc.12", + "id": "engine-rn-electron" + }, + "@rnv/engine-lightning": { + "version": "1.0.0-rc.12", + "id": "engine-lightning" + }, + "@rnv/engine-rn-macos": { + "version": "1.0.0-rc.12", + "id": "engine-rn-macos" + }, + "@rnv/engine-rn-windows": { + "version": "1.0.0-rc.12", + "id": "engine-rn-windows" + } + }, + "integrationTemplates": { + "@rnv/integration-vercel": { + "version": "0.2.0-alpha.0" + }, + "@rnv/integration-docker": { + "version": "0.1.0-alpha.0" + } + }, + "platformTemplates": { + "ios": { + "engine": "engine-rn" + }, + "android": { + "engine": "engine-rn" + }, + "androidwear": { + "engine": "engine-rn" + }, + "androidtv": { + "engine": "engine-rn" + }, + "firetv": { + "engine": "engine-rn" + }, + "tvos": { + "engine": "engine-rn-tvos" + }, + "macos": { + "engine": "engine-rn" + }, + "windows": { + "engine": "engine-rn-electron" + }, + "linux": { + "engine": "engine-rn-electron" + }, + "xbox": { + "engine": "engine-rn-windows" + }, + "tizen": { + "engine": "engine-rn-web" + }, + "tizenmobile": { + "engine": "engine-rn-web" + }, + "tizenwatch": { + "engine": "engine-rn-web" + }, + "webos": { + "engine": "engine-rn-web" + }, + "chromecast": { + "engine": "engine-rn-web" + }, + "kaios": { + "engine": "engine-rn-web" + }, + "web": { + "engine": "engine-rn-next" + }, + "webtv": { + "engine": "engine-rn-web" + } + }, "pluginTemplates": { + "react-dev-utils": { + "disableNpm": true, + "nodeModuleOverrides": { + "^12.0.0": { + "fileOverrides": { + "clearConsole.js": { + "input_line_xxx": "output_line_xxxx" + } + } + } + } + }, "@bam.tech/react-native-image-resizer": { "android": { "package": "com.reactnativeimageresizer.ImageResizerPackage" @@ -24,10 +152,7 @@ }, "@flexn/create": { "androidtv": { - "activityImports": [ - "io.flexn.create.TvRemoteHandlerModule", - "android.view.KeyEvent;" - ], + "activityImports": ["io.flexn.create.TvRemoteHandlerModule", "android.view.KeyEvent;"], "activityMethods": [ "override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {", "TvRemoteHandlerModule.getInstance().onKeyEvent(event, \"up\");", @@ -51,10 +176,7 @@ "projectName": "flexn-io-create" }, "firetv": { - "activityImports": [ - "io.flexn.create.TvRemoteHandlerModule", - "android.view.KeyEvent;" - ], + "activityImports": ["io.flexn.create.TvRemoteHandlerModule", "android.view.KeyEvent;"], "activityMethods": [ "override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {", "TvRemoteHandlerModule.getInstance().onKeyEvent(event, \"up\");", @@ -89,11 +211,9 @@ "@flexn/recyclerlistview": { "version": "4.2.7", "webpack": { - "moduleAliases": true, "modulePaths": true, - "nextTranspileModules": [ - "@flexn/recyclerlistview" - ] + "moduleAliases": true, + "nextTranspileModules": ["@flexn/recyclerlistview"] } }, "@flexn/sdk": { @@ -127,20 +247,18 @@ "ios": { "podName": "RNFlashList" }, - "macos": { + "tvos": { "podName": "RNFlashList" }, - "tvos": { + "macos": { "podName": "RNFlashList" }, - "version": "1.4.8", "webpack": { - "moduleAliases": true, "modulePaths": true, - "nextTranspileModules": [ - "@flexn/shopify-flash-list" - ] - } + "moduleAliases": true, + "nextTranspileModules": ["@flexn/shopify-flash-list"] + }, + "version": "1.4.8" }, "@flexn/typescript": { "version": "0.2.4" @@ -148,12 +266,12 @@ "@lightningjs/cli": { "version": "2.11.0" }, - "@lightningjs/core": { - "version": "2.8.0" - }, "@lightningjs/sdk": { "version": "5.2.0" }, + "@lightningjs/core": { + "version": "2.8.0" + }, "@lightningjs/ui": { "version": "1.3.1" }, @@ -362,13 +480,25 @@ "version": "0.5.9" }, "@react-native-community/cli": { - "version": "^11.3.0" + "version": "^6.0.0" }, "@react-native-community/cli-platform-android": { - "version": "^11.3.0" + "version": "^6.0.0" }, "@react-native-community/cli-platform-ios": { - "version": "^11.3.0" + "version": "11.3.7", + "disablePluginTemplateOverrides": false, + "disableNpm": true, + "nodeModuleOverrides": { + "^11.3.7": { + "fileOverrides": { + "build/tools/listIOSDevices.js": { + "rawOutput.filter(device => !device.platform.includes('appletv') && !device.platform.includes('macos')).sort(device => device.simulator ? 1 : -1).map(device => {": "rawOutput.sort(device => device.simulator ? 1 : -1).map(device => { // <= PATCHED BY RENATIVE" + } + }, + "overridesFolderName": "overrides@11.3.7" + } + } }, "@react-native-community/clipboard": { "android": { @@ -464,31 +594,24 @@ }, "@react-native-community/push-notification-ios": { "ios": { - "appDelegateImports": [ - "RNCPushNotificationIOS" - ], + "appDelegateImports": ["RNCPushNotificationIOS"], "appDelegateMethods": { "application": { "didFailToRegisterForRemoteNotificationsWithError": [ "RNCPushNotificationIOS.didFailToRegisterForRemoteNotificationsWithError(error)" ], - "didReceive": [ - "RNCPushNotificationIOS.didReceive(notification)" - ], + "didReceive": null, + "didReceive": ["RNCPushNotificationIOS.didReceive(notification)"], "didReceiveRemoteNotification": [ "RNCPushNotificationIOS.didReceiveRemoteNotification(userInfo, fetchCompletionHandler: completionHandler)" ], - "didRegister": [ - "RNCPushNotificationIOS.didRegister(notificationSettings)" - ], + "didRegister": ["RNCPushNotificationIOS.didRegister(notificationSettings)"], "didRegisterForRemoteNotificationsWithDeviceToken": [ "RNCPushNotificationIOS.didRegisterForRemoteNotifications(withDeviceToken: deviceToken)" ] }, "userNotificationCenter": { - "willPresent": [ - "completionHandler([.alert, .badge, .sound])" - ] + "willPresent": ["completionHandler([.alert, .badge, .sound])"] } }, "path": "{{PLUGIN_ROOT}}", @@ -533,9 +656,7 @@ "projectName": "@react-native-firebase_analytics" }, "ios": { - "appDelegateImports": [ - "Firebase" - ], + "appDelegateImports": ["Firebase"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -550,15 +671,13 @@ "isStatic": true, "podName": "RNFBAnalytics", "xcodeproj": { - "resourceFiles": [ - "RNVApp/GoogleService-Info.plist" - ] + "resourceFiles": ["RNVApp/GoogleService-Info.plist"] } }, "pluginDependencies": { "@react-native-firebase/app": "source:rnv" }, - "version": "18.6.1" + "version": "16.7.0" }, "@react-native-firebase/app": { "android": { @@ -578,15 +697,11 @@ ] }, "app/build.gradle": { - "apply": [ - "plugin: 'com.google.gms.google-services'" - ] + "apply": ["plugin: 'com.google.gms.google-services'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'com.google.gms:google-services:4.3.14'" - ] + "dependencies": ["classpath 'com.google.gms:google-services:4.3.14'"] } }, "package": "io.invertase.firebase.app.ReactNativeFirebaseAppPackage", @@ -594,15 +709,11 @@ }, "androidtv": { "app/build.gradle": { - "apply": [ - "plugin: 'com.google.gms.google-services'" - ] + "apply": ["plugin: 'com.google.gms.google-services'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'com.google.gms:google-services:4.2.0'" - ] + "dependencies": ["classpath 'com.google.gms:google-services:4.2.0'"] } }, "package": "io.invertase.firebase.app.ReactNativeFirebaseAppPackage", @@ -610,40 +721,30 @@ }, "firetv": { "app/build.gradle": { - "apply": [ - "plugin: 'com.google.gms.google-services'" - ] + "apply": ["plugin: 'com.google.gms.google-services'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'com.google.gms:google-services:4.2.0'" - ] + "dependencies": ["classpath 'com.google.gms:google-services:4.2.0'"] } }, "package": "io.invertase.firebase.app.ReactNativeFirebaseAppPackage", "projectName": "@react-native-firebase_app" }, "ios": { - "appDelegateImports": [ - "Firebase" - ], + "appDelegateImports": ["Firebase"], "appDelegateMethods": { "application": { - "didFinishLaunchingWithOptions": [ - "FirebaseApp.configure()" - ] + "didFinishLaunchingWithOptions": ["FirebaseApp.configure()"] } }, "isStatic": true, "podName": "RNFBApp", "xcodeproj": { - "resourceFiles": [ - "RNVApp/GoogleService-Info.plist" - ] + "resourceFiles": ["RNVApp/GoogleService-Info.plist"] } }, - "version": "18.6.1" + "version": "16.7.0" }, "@react-native-firebase/auth": { "android": { @@ -651,9 +752,7 @@ "projectName": "@react-native-firebase_auth" }, "ios": { - "appDelegateImports": [ - "Firebase" - ], + "appDelegateImports": ["Firebase"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -668,22 +767,18 @@ "isStatic": true, "podName": "RNFBAuth", "xcodeproj": { - "resourceFiles": [ - "RNVApp/GoogleService-Info.plist" - ] + "resourceFiles": ["RNVApp/GoogleService-Info.plist"] } }, "pluginDependencies": { "@react-native-firebase/app": "source:rnv" }, - "version": "18.6.1" + "version": "16.7.0" }, "@react-native-firebase/crashlytics": { "android": { "app/build.gradle": { - "apply": [ - "plugin: 'io.fabric'" - ] + "apply": ["plugin: 'io.fabric'"] }, "BuildGradle": { "buildscript": { @@ -692,17 +787,13 @@ } } }, - "implementations": [ - "'com.google.android.material:material:1.2.1'" - ], + "implementations": ["'com.google.android.material:material:1.2.1'"], "package": "io.invertase.firebase.crashlytics.ReactNativeFirebaseCrashlyticsPackage", "projectName": "@react-native-firebase_crashlytics" }, "androidtv": { "app/build.gradle": { - "apply": [ - "plugin: 'io.fabric'" - ] + "apply": ["plugin: 'io.fabric'"] }, "BuildGradle": { "allprojects": { @@ -723,9 +814,7 @@ "projectName": "@react-native-firebase_crashlytics" }, "ios": { - "appDelegateImports": [ - "Firebase" - ], + "appDelegateImports": ["Firebase"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -746,15 +835,13 @@ "shellScript": "\"${PODS_ROOT}/Fabric/run\"" } ], - "resourceFiles": [ - "RNVApp/GoogleService-Info.plist" - ] + "resourceFiles": ["RNVApp/GoogleService-Info.plist"] } }, "pluginDependencies": { "@react-native-firebase/analytics": "source:rnv" }, - "version": "18.6.1" + "version": "16.7.0" }, "@react-native-firebase/messaging": { "android": { @@ -765,9 +852,7 @@ "package": "io.invertase.firebase.messaging.ReactNativeFirebaseMessagingPackage", "projectName": "@react-native-firebase_messaging" }, - "dependsOn": [ - "@react-native-firebase/app" - ], + "dependsOn": ["@react-native-firebase/app"], "firetv": { "package": "io.invertase.firebase.messaging.ReactNativeFirebaseMessagingPackage", "projectName": "@react-native-firebase_messaging" @@ -779,7 +864,7 @@ "pluginDependencies": { "@react-native-firebase/app": "source:rnv" }, - "version": "18.6.1" + "version": "16.7.0" }, "@react-native-firebase/storage": { "android": { @@ -787,9 +872,7 @@ "projectName": "@react-native-firebase_storage" }, "ios": { - "appDelegateImports": [ - "Firebase" - ], + "appDelegateImports": ["Firebase"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -804,15 +887,13 @@ "isStatic": true, "podName": "RNFBStorage", "xcodeproj": { - "resourceFiles": [ - "RNVApp/GoogleService-Info.plist" - ] + "resourceFiles": ["RNVApp/GoogleService-Info.plist"] } }, "pluginDependencies": { "@react-native-firebase/app": "source:rnv" }, - "version": "18.6.1" + "version": "16.7.0" }, "@react-native-masked-view/masked-view": { "android": { @@ -882,7 +963,6 @@ "@react-navigation/bottom-tabs": "5.1.1", "@react-navigation/core": "6.1.0", "@react-navigation/drawer": "6.1.8", - "@react-navigation/elements": "1.3.17", "@react-navigation/material-bottom-tabs": "6.0.9", "@react-navigation/material-top-tabs": "5.3.10", "@react-navigation/native": "6.0.6", @@ -890,15 +970,12 @@ "@react-navigation/routers": "5.1.0", "@react-navigation/stack": "6.0.11", "@react-navigation/web": "1.0.0-alpha.9", + "@react-navigation/elements": "1.3.17", "@reduxjs/toolkit": { "version": "^1.8.1" }, "@rnv/renative": { - "version": "0.37.0-canary.7", - "webpackConfig": { - "moduleAliases": true, - "modulePaths": true - } + "version": "1.0.0-rc.12" }, "@sentry/react": { "version": "6.13.3" @@ -906,9 +983,7 @@ "@sentry/react-native": { "android": { "app/build.gradle": { - "apply": [ - "from: \"{{PLUGIN_ROOT}}/sentry.gradle\"" - ] + "apply": ["from: \"{{PLUGIN_ROOT}}/sentry.gradle\""] }, "implementation": "implementation project(':@sentry_react-native')", "package": "io.sentry.react.RNSentryPackage", @@ -917,9 +992,7 @@ }, "androidtv": { "app/build.gradle": { - "apply": [ - "from: \"{{PLUGIN_ROOT}}/sentry.gradle\"" - ] + "apply": ["from: \"{{PLUGIN_ROOT}}/sentry.gradle\""] }, "implementation": "implementation project(':@sentry_react-native')", "package": "io.sentry.react.RNSentryPackage", @@ -928,9 +1001,7 @@ }, "firetv": { "app/build.gradle": { - "apply": [ - "from: \"{{PLUGIN_ROOT}}/sentry.gradle\"" - ] + "apply": ["from: \"{{PLUGIN_ROOT}}/sentry.gradle\""] }, "implementation": "implementation project(':@sentry_react-native')", "package": "io.sentry.react.RNSentryPackage", @@ -969,17 +1040,17 @@ "ios": { "podName": "RNFlashList" }, - "macos": { + "tvos": { "podName": "RNFlashList" }, - "tvos": { + "macos": { "podName": "RNFlashList" }, - "version": "1.4.1", "webpack": { - "moduleAliases": true, - "modulePaths": true - } + "modulePaths": true, + "moduleAliases": true + }, + "version": "1.4.1" }, "amazon-cognito-identity-js": { "android": { @@ -991,7 +1062,27 @@ "version": "5.2.11" }, "aws-amplify": "4.3.13", - "axios": "0.24.0", + "axios": "1.6.0", + "crashlytics": { + "android": { + "mainActivity": { + "createMethods": [ + "val core = CrashlyticsCore.Builder().listener {}.build()", + "val crashlyticsKit = Crashlytics.Builder().core(core).build()", + "Fabric.with(this, crashlyticsKit)" + ], + "imports": ["com.crashlytics.android.Crashlytics", "com.crashlytics.android.core.CrashlyticsCore"] + }, + "skipImplementation": true + }, + "deprecated": "crashlytics plugin is deprecated use Crashlytics (uppercase) in combination with Firebase", + "ios": { + "appDelegateImports": ["Crashlytics"], + "podName": "Crashlytics", + "version": "3.13.4" + }, + "no-npm": true + }, "Crashlytics": { "android": { "mainActivity": { @@ -1000,10 +1091,7 @@ "val crashlyticsKit = Crashlytics.Builder().core(core).build()", "Fabric.with(this, crashlyticsKit)" ], - "imports": [ - "com.crashlytics.android.Crashlytics", - "com.crashlytics.android.core.CrashlyticsCore" - ] + "imports": ["com.crashlytics.android.Crashlytics", "com.crashlytics.android.core.CrashlyticsCore"] }, "skipImplementation": true }, @@ -1014,10 +1102,7 @@ "val crashlyticsKit = Crashlytics.Builder().core(core).build()", "Fabric.with(this, crashlyticsKit)" ], - "imports": [ - "com.crashlytics.android.Crashlytics", - "com.crashlytics.android.core.CrashlyticsCore" - ] + "imports": ["com.crashlytics.android.Crashlytics", "com.crashlytics.android.core.CrashlyticsCore"] }, "skipImplementation": true }, @@ -1028,10 +1113,7 @@ "val crashlyticsKit = Crashlytics.Builder().core(core).build()", "Fabric.with(this, crashlyticsKit)" ], - "imports": [ - "com.crashlytics.android.Crashlytics", - "com.crashlytics.android.core.CrashlyticsCore" - ] + "imports": ["com.crashlytics.android.Crashlytics", "com.crashlytics.android.core.CrashlyticsCore"] }, "skipImplementation": true }, @@ -1049,31 +1131,6 @@ }, "no-npm": true }, - "crashlytics": { - "android": { - "mainActivity": { - "createMethods": [ - "val core = CrashlyticsCore.Builder().listener {}.build()", - "val crashlyticsKit = Crashlytics.Builder().core(core).build()", - "Fabric.with(this, crashlyticsKit)" - ], - "imports": [ - "com.crashlytics.android.Crashlytics", - "com.crashlytics.android.core.CrashlyticsCore" - ] - }, - "skipImplementation": true - }, - "deprecated": "crashlytics plugin is deprecated use Crashlytics (uppercase) in combination with Firebase", - "ios": { - "appDelegateImports": [ - "Crashlytics" - ], - "podName": "Crashlytics", - "version": "3.13.4" - }, - "no-npm": true - }, "deepmerge": "4.2.2", "detox": { "android": { @@ -1092,22 +1149,16 @@ "implementation": "androidTestImplementation('com.wix:detox:+') { transitive = true }\nandroidTestImplementation 'junit:junit:4.12'", "version": "19.5.3" }, - "Fabric": { + "fabric": { "android": { "app/build.gradle": { - "apply": [ - "plugin: 'io.fabric'" - ] + "apply": ["plugin: 'io.fabric'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'io.fabric.tools:gradle:1.25.4'" - ] + "dependencies": ["classpath 'io.fabric.tools:gradle:1.25.4'"] }, - "repositories": [ - "maven { url 'https://maven.fabric.io/public' }" - ] + "repositories": ["maven { url 'https://maven.fabric.io/public' }"] }, "BuildGradle": { "allprojects": { @@ -1126,26 +1177,18 @@ }, "implementation": "implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {\n transitive = true\n }", "mainActivity": { - "imports": [ - "io.fabric.sdk.android.Fabric" - ] + "imports": ["io.fabric.sdk.android.Fabric"] } }, "androidtv": { "app/build.gradle": { - "apply": [ - "plugin: 'io.fabric'" - ] + "apply": ["plugin: 'io.fabric'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'io.fabric.tools:gradle:1.25.4'" - ] + "dependencies": ["classpath 'io.fabric.tools:gradle:1.25.4'"] }, - "repositories": [ - "maven { url 'https://maven.fabric.io/public' }" - ] + "repositories": ["maven { url 'https://maven.fabric.io/public' }"] }, "BuildGradle": { "allprojects": { @@ -1162,43 +1205,18 @@ } } }, - "implementation": "implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {\n transitive = true\n }", - "mainActivity": { - "imports": [ - "io.fabric.sdk.android.Fabric" - ] - } - }, - "ios": { - "podName": "Fabric", - "version": "1.10.2", - "xcodeproj": { - "buildPhases": [ - { - "shellPath": "/bin/sh", - "shellScript": "\"${PODS_ROOT}/Fabric/run\"" - } - ] - } + "skipImplementation": true }, - "no-npm": true - }, - "fabric": { - "android": { + "deprecated": "fabric plugin is deprecated use Fabric (uppercase) in combination with Firebase", + "firetv": { "app/build.gradle": { - "apply": [ - "plugin: 'io.fabric'" - ] + "apply": ["plugin: 'io.fabric'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'io.fabric.tools:gradle:1.25.4'" - ] + "dependencies": ["classpath 'io.fabric.tools:gradle:1.25.4'"] }, - "repositories": [ - "maven { url 'https://maven.fabric.io/public' }" - ] + "repositories": ["maven { url 'https://maven.fabric.io/public' }"] }, "BuildGradle": { "allprojects": { @@ -1215,28 +1233,41 @@ } } }, - "implementation": "implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {\n transitive = true\n }", - "mainActivity": { - "imports": [ - "io.fabric.sdk.android.Fabric" - ] - } + "skipImplementation": true }, - "androidtv": { + "ios": { + "appDelegateImports": ["Fabric"], + "appDelegateMethods": { + "application": { + "didFinishLaunchingWithOptions": ["Fabric.with([Crashlytics.self])"] + } + }, + "plist": { + "Fabric": { + "APIKey": "", + "Kits": [ + { + "KitInfo": {}, + "KitName": "Crashlytics" + } + ] + } + }, + "podName": "Fabric", + "version": "1.10.2" + }, + "no-npm": true + }, + "Fabric": { + "android": { "app/build.gradle": { - "apply": [ - "plugin: 'io.fabric'" - ] + "apply": ["plugin: 'io.fabric'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'io.fabric.tools:gradle:1.25.4'" - ] + "dependencies": ["classpath 'io.fabric.tools:gradle:1.25.4'"] }, - "repositories": [ - "maven { url 'https://maven.fabric.io/public' }" - ] + "repositories": ["maven { url 'https://maven.fabric.io/public' }"] }, "BuildGradle": { "allprojects": { @@ -1253,24 +1284,20 @@ } } }, - "skipImplementation": true + "implementation": "implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {\n transitive = true\n }", + "mainActivity": { + "imports": ["io.fabric.sdk.android.Fabric"] + } }, - "deprecated": "fabric plugin is deprecated use Fabric (uppercase) in combination with Firebase", - "firetv": { + "androidtv": { "app/build.gradle": { - "apply": [ - "plugin: 'io.fabric'" - ] + "apply": ["plugin: 'io.fabric'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'io.fabric.tools:gradle:1.25.4'" - ] + "dependencies": ["classpath 'io.fabric.tools:gradle:1.25.4'"] }, - "repositories": [ - "maven { url 'https://maven.fabric.io/public' }" - ] + "repositories": ["maven { url 'https://maven.fabric.io/public' }"] }, "BuildGradle": { "allprojects": { @@ -1287,41 +1314,29 @@ } } }, - "skipImplementation": true + "implementation": "implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {\n transitive = true\n }", + "mainActivity": { + "imports": ["io.fabric.sdk.android.Fabric"] + } }, "ios": { - "appDelegateImports": [ - "Fabric" - ], - "appDelegateMethods": { - "application": { - "didFinishLaunchingWithOptions": [ - "Fabric.with([Crashlytics.self])" - ] - } - }, - "plist": { - "Fabric": { - "APIKey": "", - "Kits": [ - { - "KitInfo": {}, - "KitName": "Crashlytics" - } - ] - } - }, "podName": "Fabric", - "version": "1.10.2" + "version": "1.10.2", + "xcodeproj": { + "buildPhases": [ + { + "shellPath": "/bin/sh", + "shellScript": "\"${PODS_ROOT}/Fabric/run\"" + } + ] + } }, "no-npm": true }, "firebase-core": { "deprecated": "firebase-core plugin is deprecated use Firebase/ instead", "ios": { - "appDelegateImports": [ - "Firebase" - ], + "appDelegateImports": ["Firebase"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -1357,20 +1372,14 @@ }, "Firebase/Analytics": { "ios": { - "appDelegateImports": [ - "Firebase" - ], - "podNames": [ - "Firebase/Analytics', '~> 6.3.0" - ] + "appDelegateImports": ["Firebase"], + "podNames": ["Firebase/Analytics', '~> 6.3.0"] }, "no-npm": true }, "Firebase/Core": { "ios": { - "appDelegateImports": [ - "Firebase" - ], + "appDelegateImports": ["Firebase"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -1391,33 +1400,23 @@ ] } }, - "podNames": [ - "Firebase/Core', '~> 6.3.0" - ] + "podNames": ["Firebase/Core', '~> 6.3.0"] }, "no-npm": true }, "Firebase/Messaging": { "ios": { - "appDelegateImports": [ - "Firebase" - ], - "podNames": [ - "Firebase/Messaging', '~> 6.3.0" - ] + "appDelegateImports": ["Firebase"], + "podNames": ["Firebase/Messaging', '~> 6.3.0"] }, "no-npm": true }, "google-maps": { "ios": { - "appDelegateImports": [ - "GoogleMaps" - ], + "appDelegateImports": ["GoogleMaps"], "appDelegateMethods": { "application": { - "didFinishLaunchingWithOptions": [ - "GMSServices.provideAPIKey(\"{{props.API_KEY}}\")" - ] + "didFinishLaunchingWithOptions": ["GMSServices.provideAPIKey(\"{{props.API_KEY}}\")"] } }, "podName": "GoogleMaps", @@ -1434,13 +1433,9 @@ "implementation": "implementation('com.google.android.gms:play-services-tagmanager:18.0.1')" }, "ios": { - "podNames": [ - "GoogleTagManager', '~> 7.4.1" - ], + "podNames": ["GoogleTagManager', '~> 7.4.1"], "xcodeproj": { - "resourceFiles": [ - "RNVApp/container" - ] + "resourceFiles": ["RNVApp/container"] } }, "no-npm": true @@ -1511,16 +1506,14 @@ } }, "next": { - "version": "14.1.0" + "version": "14.1.4" }, "next-seo": "4.28.1", "RCTLinkingIOS": { "ios": { "appDelegateMethods": { "application": { - "open": [ - "RCTLinkingManager.application(app, open: url, options: options)" - ] + "open": ["RCTLinkingManager.application(app, open: url, options: options)"] } } }, @@ -1534,23 +1527,17 @@ "didFailToRegisterForRemoteNotificationsWithError": [ "RCTPushNotificationManager.didFailToRegisterForRemoteNotificationsWithError(error)" ], - "didReceive": [ - "RCTPushNotificationManager.didReceive(notification)" - ], + "didReceive": ["RCTPushNotificationManager.didReceive(notification)"], "didReceiveRemoteNotification": [ "RCTPushNotificationManager.didReceiveRemoteNotification(userInfo, fetchCompletionHandler: completionHandler)" ], - "didRegister": [ - "RCTPushNotificationManager.didRegister(notificationSettings)" - ], + "didRegister": ["RCTPushNotificationManager.didRegister(notificationSettings)"], "didRegisterForRemoteNotificationsWithDeviceToken": [ "RCTPushNotificationManager.didRegisterForRemoteNotifications(withDeviceToken: deviceToken)" ] }, "userNotificationCenter": { - "willPresent": [ - "completionHandler([.alert, .badge, .sound])" - ] + "willPresent": ["completionHandler([.alert, .badge, .sound])"] } } }, @@ -1600,15 +1587,19 @@ } ] }, + "implementation": "implementation ('com.facebook.react:react-native:+') {\n exclude group: 'com.android.support' \n exclude group: 'javax.inject' \n }", "path": "react-native" }, "androidtv": { + "implementation": "implementation ('com.facebook.react:react-native:+') {\n exclude group: 'com.android.support' \n exclude group: 'javax.inject' \n exclude group: 'com.squareup.okhttp3', module: 'okhttp' \n exclude group: 'com.squareup.okio' \n }", "path": "react-native" }, "androidwear": { + "implementation": "implementation ('com.facebook.react:react-native:+') {\n exclude group: 'com.android.support' \n exclude group: 'javax.inject' \n exclude group: 'com.squareup.okhttp3', module: 'okhttp' \n exclude group: 'com.squareup.okio' \n }", "path": "react-native" }, "firetv": { + "implementation": "implementation ('com.facebook.react:react-native:+') {\n exclude group: 'com.android.support' \n exclude group: 'javax.inject' \n exclude group: 'com.squareup.okhttp3', module: 'okhttp' \n exclude group: 'com.squareup.okio' \n }", "path": "react-native" }, "ios": { @@ -1616,16 +1607,12 @@ "CFBundleURLTypes": [ { "CFBundleURLName": "{{props.URL_NAME}}", - "CFBundleURLSchemes": [ - "{{props.URL_SCHEME}}" - ] + "CFBundleURLSchemes": ["{{props.URL_SCHEME}}"] } ] }, "Podfile": { - "sources": [ - "https://github.com/CocoaPods/Specs.git" - ] + "sources": ["https://github.com/CocoaPods/Specs.git"] } }, "macos": { @@ -1633,9 +1620,7 @@ "CFBundleURLTypes": [ { "CFBundleURLName": "{{props.URL_NAME}}", - "CFBundleURLSchemes": [ - "{{props.URL_SCHEME}}" - ] + "CFBundleURLSchemes": ["{{props.URL_SCHEME}}"] } ] } @@ -1675,9 +1660,7 @@ "react-native-animatable": { "version": "1.3.3", "webpack": { - "nextTranspileModules": [ - "react-native-animatable" - ] + "nextTranspileModules": ["react-native-animatable"] } }, "react-native-audio": { @@ -1740,9 +1723,7 @@ { "CFBundleTypeRole": "None", "CFBundleURLName": "auth0", - "CFBundleURLSchemes": [ - "$(PRODUCT_BUNDLE_IDENTIFIER)" - ] + "CFBundleURLSchemes": ["$(PRODUCT_BUNDLE_IDENTIFIER)"] } ] }, @@ -1824,25 +1805,19 @@ "react-native-camera": { "android": { "app/build.gradle": { - "defaultConfig": [ - "missingDimensionStrategy 'react-native-camera', 'general'" - ] + "defaultConfig": ["missingDimensionStrategy 'react-native-camera', 'general'"] }, "package": "org.reactnative.camera.RNCameraPackage" }, "androidtv": { "app/build.gradle": { - "defaultConfig": [ - "missingDimensionStrategy 'react-native-camera', 'general'" - ] + "defaultConfig": ["missingDimensionStrategy 'react-native-camera', 'general'"] }, "package": "org.reactnative.camera.RNCameraPackage" }, "firetv": { "app/build.gradle": { - "defaultConfig": [ - "missingDimensionStrategy 'react-native-camera', 'general'" - ] + "defaultConfig": ["missingDimensionStrategy 'react-native-camera', 'general'"] }, "package": "org.reactnative.camera.RNCameraPackage" }, @@ -1859,35 +1834,20 @@ }, "react-native-carplay": { "ios": { - "templateXcode": { - "AppDelegate_h": { - "appDelegateImports": [ - "CarPlay/CarPlay.h" - ], - "appDelegateExtensions": [ - "UIApplicationDelegate", - "CPApplicationDelegate" - ] - }, - "AppDelegate_mm": { - "appDelegateImports": [ - "RNCarPlay.h" + "appDelegateExtensions": ["CPApplicationDelegate"], + "appDelegateImports": ["CarPlay", "react_native_carplay"], + "appDelegateMethods": { + "application": { + "didConnectCarInterfaceController": [ + "RNCarPlay.connect(with: interfaceController, window: window)" ], - "appDelegateMethods": { - "application": { - "didConnectCarInterfaceController": [ - "[RNCarPlay connectWithInterfaceController:interfaceController window:window];" - ], - "didDisconnectCarInterfaceController": [ - "[RNCarPlay disconnect];" - ] - } - } + "didDisconnectCarInterfaceController": ["RNCarPlay.disconnect()"] } }, + "path": "{{PLUGIN_ROOT}}", "podName": "react-native-carplay" }, - "version": "2.3.0" + "version": "2.0.0" }, "react-native-circular-progress": { "version": "1.3.0", @@ -2111,60 +2071,49 @@ }, "react-native-fbsdk": { "android": { - "templateAndroid": { - "AndroidManifest_xml": { - "children": [ - { - "android:name": ".MainApplication", - "children": [ - { - "android:name": "com.facebook.sdk.ApplicationId", - "android:value": "@string/facebook_app_id", - "tag": "meta-data" - } - ], - "tag": "application" - } - ] - }, - "MainActivity_java": { - "createMethods": [], - "resultMethods": [ - "MainApplication.getCallbackManager().onActivityResult(requestCode, resultCode, data)" - ] - }, - "MainApplication_java": { - "methods": [ - " companion object {\n @JvmStatic \n private val mCallbackManager = CallbackManager.Factory.create() \n fun getCallbackManager(): CallbackManager = mCallbackManager \n}" - ], - "imports": [ - "com.facebook.CallbackManager" - ] - }, - "strings_xml": { - "children": [ - { - "child_value": "{{props.APP_ID}}", - "name": "facebook_app_id", - "tag": "string" - } - ] - }, - "app_build_gradle": { - "implementations": [ - "'com.facebook.android:facebook-android-sdk:[4,5)'" - ] - } + "AndroidManifest": { + "children": [ + { + "android:name": ".MainApplication", + "children": [ + { + "android:name": "com.facebook.sdk.ApplicationId", + "android:value": "@string/facebook_app_id", + "tag": "meta-data" + } + ], + "tag": "application" + } + ] }, - "package": "com.facebook.reactnative.androidsdk.FBSDKPackage" + "implementations": ["'com.facebook.android:facebook-android-sdk:[4,5)'"], + "imports": ["com.facebook.CallbackManager"], + "mainActivity": { + "createMethods": [], + "imports": [], + "resultMethods": [ + "MainApplication.getCallbackManager().onActivityResult(requestCode, resultCode, data)" + ] + }, + "mainApplication": { + "methods": [ + " companion object {\n @JvmStatic \n private val mCallbackManager = CallbackManager.Factory.create() \n fun getCallbackManager(): CallbackManager = mCallbackManager \n}" + ] + }, + "package": "com.facebook.reactnative.androidsdk.FBSDKPackage", + "ResourceStrings": { + "children": [ + { + "child_value": "{{props.APP_ID}}", + "name": "facebook_app_id", + "tag": "string" + } + ] + } }, "androidtv": { - "implementations": [ - "'com.facebook.android:facebook-android-sdk:[4,5)'" - ], - "imports": [ - "com.facebook.CallbackManager" - ], + "implementations": ["'com.facebook.android:facebook-android-sdk:[4,5)'"], + "imports": ["com.facebook.CallbackManager"], "mainActivity": { "createMethods": [], "imports": [], @@ -2180,12 +2129,8 @@ "package": "com.facebook.reactnative.androidsdk.FBSDKPackage" }, "firetv": { - "implementations": [ - "'com.facebook.android:facebook-android-sdk:[4,5)'" - ], - "imports": [ - "com.facebook.CallbackManager" - ], + "implementations": ["'com.facebook.android:facebook-android-sdk:[4,5)'"], + "imports": ["com.facebook.CallbackManager"], "mainActivity": { "createMethods": [], "imports": [], @@ -2201,36 +2146,25 @@ "package": "com.facebook.reactnative.androidsdk.FBSDKPackage" }, "ios": { - "appDelegateImports": [ - "FBSDKCoreKit" - ], + "appDelegateImports": ["FBSDKCoreKit"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ "ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)" ], - "open": [ - "ApplicationDelegate.shared.application(app, open: url, options: options)" - ] + "open": ["ApplicationDelegate.shared.application(app, open: url, options: options)"] } }, "plist": { "CFBundleURLTypes": [ { "CFBundleTypeRole": "Editor", - "CFBundleURLSchemes": [ - "fb{{props.APP_ID}}" - ] + "CFBundleURLSchemes": ["fb{{props.APP_ID}}"] } ], "FacebookAppID": "{{props.APP_ID}}", "FacebookDisplayName": "{{props.APP_NAME}}", - "LSApplicationQueriesSchemes": [ - "fbapi", - "fb-messenger-share-api", - "fbauth2", - "fbshareextension" - ] + "LSApplicationQueriesSchemes": ["fbapi", "fb-messenger-share-api", "fbauth2", "fbshareextension"] }, "podName": "react-native-fbsdk" }, @@ -2384,15 +2318,11 @@ ] }, "app/build.gradle": { - "apply": [ - "plugin: 'com.google.gms.google-services'" - ] + "apply": ["plugin: 'com.google.gms.google-services'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'com.google.gms:google-services:4.2.0'" - ] + "dependencies": ["classpath 'com.google.gms:google-services:4.2.0'"] } }, "implementations": [ @@ -2516,15 +2446,11 @@ ] }, "app/build.gradle": { - "apply": [ - "plugin: 'com.google.gms.google-services'" - ] + "apply": ["plugin: 'com.google.gms.google-services'"] }, "build.gradle": { "buildscript": { - "dependencies": [ - "classpath 'com.google.gms:google-services:4.2.0'" - ] + "dependencies": ["classpath 'com.google.gms:google-services:4.2.0'"] } }, "implementations": [ @@ -2540,9 +2466,7 @@ } }, "ios": { - "appDelegateImports": [ - "Firebase" - ], + "appDelegateImports": ["Firebase"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -2559,9 +2483,7 @@ "CFBundleURLTypes": [ { "CFBundleURLName": "{{props.URL_NAME}}", - "CFBundleURLSchemes": [ - "{{props.URL_SCHEME}}" - ] + "CFBundleURLSchemes": ["{{props.URL_SCHEME}}"] } ] }, @@ -2575,9 +2497,7 @@ }, "podName": "RNFirebase", "xcodeproj": { - "resourceFiles": [ - "RNVApp/GoogleService-Info.plist" - ] + "resourceFiles": ["RNVApp/GoogleService-Info.plist"] } }, "props": { @@ -2624,10 +2544,11 @@ } }, "react-native-gesture-handler": { + "version": "2.14.1", "android": { - "mainActivity": null, "package": "com.swmansion.gesturehandler.RNGestureHandlerPackage", - "path": "{{PLUGIN_ROOT}}/android" + "path": "{{PLUGIN_ROOT}}/android", + "mainActivity": null }, "androidtv": { "package": "com.swmansion.gesturehandler.RNGestureHandlerPackage", @@ -2647,11 +2568,9 @@ "macos": { "podName": "RNGestureHandler" }, - "source": "", "tvos": { "podName": "RNGestureHandler" }, - "version": "2.9.0", "webpack": { "moduleAliases": true, "modulePaths": true @@ -2720,23 +2639,15 @@ "'com.google.guava:guava:28.0-android'" ], "mainActivity": { - "createMethods": [ - "CastContext.getSharedInstance(this)" - ], - "imports": [ - "com.google.android.gms.cast.framework.CastContext" - ] + "createMethods": ["CastContext.getSharedInstance(this)"], + "imports": ["com.google.android.gms.cast.framework.CastContext"] }, "MainApplication": { - "packages": [ - "com.reactnative.googlecast.GoogleCastPackage" - ] + "packages": ["com.reactnative.googlecast.GoogleCastPackage"] } }, "ios": { - "appDelegateImports": [ - "GoogleCast" - ], + "appDelegateImports": ["GoogleCast"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -2756,10 +2667,7 @@ "plist": { "NSBluetoothAlwaysUsageDescription": "${PRODUCT_NAME} uses Bluetooth to discover nearby Cast devices.", "NSBluetoothPeripheralUsageDescription": "${PRODUCT_NAME} uses Bluetooth to discover nearby Cast devices.", - "NSBonjourServices": [ - "_googlecast._tcp", - "_{{props.APPLICATION_ID}}._googlecast._tcp" - ], + "NSBonjourServices": ["_googlecast._tcp", "_{{props.APPLICATION_ID}}._googlecast._tcp"], "NSLocalNetworkUsageDescription": "${PRODUCT_NAME} uses the local network to discover Cast-enabled devices on your WiFi network.", "NSMicrophoneUsageDescription": "${PRODUCT_NAME} uses microphone access to listen for ultrasonic tokens when pairing with nearby Cast devices." }, @@ -2772,9 +2680,7 @@ }, "react-native-home-indicator": { "ios": { - "appDelegateImports": [ - "react_native_home_indicator" - ], + "appDelegateImports": ["react_native_home_indicator"], "appDelegateMethods": { "application": { "didFinishLaunchingWithOptions": [ @@ -2792,9 +2698,7 @@ "react-native-iap": { "android": { "app/build.gradle": { - "defaultConfig": [ - "missingDimensionStrategy 'store', 'play'" - ] + "defaultConfig": ["missingDimensionStrategy 'store', 'play'"] }, "package": "com.dooboolab.RNIap.RNIapPackage" }, @@ -2833,17 +2737,13 @@ }, "ios": { "Podfile": { - "sources": [ - "https://github.com/TimOliver/TOCropViewController.git" - ] + "sources": ["https://github.com/TimOliver/TOCropViewController.git"] }, "podName": "RNImageCropPicker" }, "macos": { "Podfile": { - "sources": [ - "https://github.com/TimOliver/TOCropViewController.git" - ] + "sources": ["https://github.com/TimOliver/TOCropViewController.git"] }, "podName": "RNImageCropPicker" }, @@ -2973,10 +2873,7 @@ "moduleAliases": { "react-native-linear-gradient": "react-native-web-linear-gradient" }, - "modulePaths": [ - "react-native-web-linear-gradient", - "react-native-linear-gradient" - ] + "modulePaths": ["react-native-web-linear-gradient", "react-native-linear-gradient"] } }, "react-native-local-mongodb": { @@ -3136,9 +3033,7 @@ "react-native-orientation-locker": { "android": { "mainActivity": { - "imports": [ - "android.content.res.Configuration" - ], + "imports": ["android.content.res.Configuration"], "methods": [ "override fun onConfigurationChanged(newConfig:Configuration) {", " super.onConfigurationChanged(newConfig)", @@ -3151,14 +3046,10 @@ "package": "org.wonday.orientation.OrientationPackage" }, "ios": { - "appDelegateImports": [ - "react_native_orientation_locker" - ], + "appDelegateImports": ["react_native_orientation_locker"], "appDelegateMethods": { "application": { - "supportedInterfaceOrientationsFor": [ - "Orientation.getOrientation();" - ] + "supportedInterfaceOrientationsFor": ["Orientation.getOrientation();"] } }, "podName": "react-native-orientation-locker" @@ -3214,28 +3105,86 @@ "version": "1.0.2" }, "react-native-permissions": { - "version": "4.1.4" + "android": { + "package": "com.zoontek.rnpermissions.RNPermissionsPackage" + }, + "androidtv": { + "package": "com.zoontek.rnpermissions.RNPermissionsPackage" + }, + "ios": { + "isStatic": true, + "podName": "RNPermissions", + "staticPods": ["::startsWith::Permission-"] + }, + "macos": { + "isStatic": true, + "podName": "RNPermissions", + "staticPods": ["::startsWith::Permission-"] + }, + "tvos": { + "isStatic": true, + "podName": "RNPermissions", + "staticPods": ["::startsWith::Permission-"] + }, + "version": "3.6.1" + }, + "react-native-permissions-pods": { + "ios": { + "podNames": [ + "Permission-BluetoothPeripheral', :path => '{{PLUGIN_ROOT}}/ios/BluetoothPeripheral", + "Permission-Calendars', :path => '{{PLUGIN_ROOT}}/ios/Calendars", + "Permission-Camera', :path => '{{PLUGIN_ROOT}}/ios/Camera", + "Permission-Contacts', :path => '{{PLUGIN_ROOT}}/ios/Contacts", + "Permission-FaceID', :path => '{{PLUGIN_ROOT}}/ios/FaceID", + "Permission-LocationAlways', :path => '{{PLUGIN_ROOT}}/ios/LocationAlways", + "Permission-LocationWhenInUse', :path => '{{PLUGIN_ROOT}}/ios/LocationWhenInUse", + "Permission-MediaLibrary', :path => '{{PLUGIN_ROOT}}/ios/MediaLibrary", + "Permission-Microphone', :path => '{{PLUGIN_ROOT}}/ios/Microphone", + "Permission-Motion', :path => '{{PLUGIN_ROOT}}/ios/Motion", + "Permission-Notifications', :path => '{{PLUGIN_ROOT}}/ios/Notifications", + "Permission-PhotoLibrary', :path => '{{PLUGIN_ROOT}}/ios/PhotoLibrary", + "Permission-Reminders', :path => '{{PLUGIN_ROOT}}/ios/Reminders", + "Permission-SpeechRecognition', :path => '{{PLUGIN_ROOT}}/ios/SpeechRecognition", + "Permission-StoreKit', :path => '{{PLUGIN_ROOT}}/ios/StoreKit" + ] + }, + "macos": { + "podNames": [ + "Permission-BluetoothPeripheral', :path => '{{PLUGIN_ROOT}}/ios/BluetoothPeripheral", + "Permission-Calendars', :path => '{{PLUGIN_ROOT}}/ios/Calendars", + "Permission-Camera', :path => '{{PLUGIN_ROOT}}/ios/Camera", + "Permission-Contacts', :path => '{{PLUGIN_ROOT}}/ios/Contacts", + "Permission-FaceID', :path => '{{PLUGIN_ROOT}}/ios/FaceID", + "Permission-LocationAlways', :path => '{{PLUGIN_ROOT}}/ios/LocationAlways", + "Permission-LocationWhenInUse', :path => '{{PLUGIN_ROOT}}/ios/LocationWhenInUse", + "Permission-MediaLibrary', :path => '{{PLUGIN_ROOT}}/ios/MediaLibrary", + "Permission-Microphone', :path => '{{PLUGIN_ROOT}}/ios/Microphone", + "Permission-Motion', :path => '{{PLUGIN_ROOT}}/ios/Motion", + "Permission-Notifications', :path => '{{PLUGIN_ROOT}}/ios/Notifications", + "Permission-PhotoLibrary', :path => '{{PLUGIN_ROOT}}/ios/PhotoLibrary", + "Permission-Reminders', :path => '{{PLUGIN_ROOT}}/ios/Reminders", + "Permission-SpeechRecognition', :path => '{{PLUGIN_ROOT}}/ios/SpeechRecognition", + "Permission-StoreKit', :path => '{{PLUGIN_ROOT}}/ios/StoreKit" + ] + }, + "no-npm": true, + "packageName": "react-native-permissions" }, "react-native-photo-editor": { "android": { - "templateAndroid": { - "AndroidManifest_xml": { - "tag": "manifest", - "android:name": "", - "children": [ - { - "tag": "application", - "android:name": ".MainApplication", - "children": [ - { - "tag": "activity", - "android:name": "com.ahmedadeltito.photoeditor.PhotoEditorActivity", - "children": [] - } - ] - } - ] - } + "AndroidManifest": { + "children": [ + { + "android:name": ".MainApplication", + "children": [ + { + "android:name": "com.ahmedadeltito.photoeditor.PhotoEditorActivity", + "tag": "activity" + } + ], + "tag": "application" + } + ] }, "package": "ui.photoeditor.RNPhotoEditorPackage" }, @@ -3246,12 +3195,13 @@ "package": "ui.photoeditor.RNPhotoEditorPackage" }, "ios": { - "podName": "iOSPhotoEditor", - "git": "https://github.com/prscX/photo-editor", - "commit": "4924e9ec984d25d03644e58aa148282642171de9", - "buildType": "dynamic" + "path": "{{PLUGIN_ROOT}}/ios", + "podName": "RNPhotoEditor" }, - "version": "1.0.13" + "pluginDependencies": { + "iOSPhotoEditor": "source:rnv" + }, + "version": "1.0.5" }, "react-native-picker": { "android": { @@ -3329,10 +3279,7 @@ "react-native-root-toast": { "version": "3.2.1", "webpack": { - "nextTranspileModules": [ - "react-native-root-siblings", - "static-container" - ] + "nextTranspileModules": ["react-native-root-siblings", "static-container"] } }, "react-native-safe-area-context": { @@ -3487,49 +3434,31 @@ }, "react-native-splash-screen": { "android": { - "templateAndroid": { - "MainActivity_java": { - "createMethods": [ - "SplashScreen.show(this)" - ], - "imports": [ - "org.devio.rn.splashscreen.SplashScreen" - ] - } + "mainActivity": { + "createMethods": ["SplashScreen.show(this)"], + "imports": ["org.devio.rn.splashscreen.SplashScreen"] }, "package": "org.devio.rn.splashscreen.SplashScreenReactPackage" }, "androidtv": { "mainActivity": { - "createMethods": [ - "SplashScreen.show(this)" - ], - "imports": [ - "org.devio.rn.splashscreen.SplashScreen" - ] + "createMethods": ["SplashScreen.show(this)"], + "imports": ["org.devio.rn.splashscreen.SplashScreen"] }, "package": "org.devio.rn.splashscreen.SplashScreenReactPackage" }, "firetv": { "mainActivity": { - "createMethods": [ - "SplashScreen.show(this)" - ], - "imports": [ - "org.devio.rn.splashscreen.SplashScreen" - ] + "createMethods": ["SplashScreen.show(this)"], + "imports": ["org.devio.rn.splashscreen.SplashScreen"] }, "package": "org.devio.rn.splashscreen.SplashScreenReactPackage" }, "ios": { - "appDelegateMmImports": [ - "react_native_splash_screen" - ], - "appDelegateMmMethods": { + "appDelegateImports": ["react_native_splash_screen"], + "appDelegateMethods": { "application": { - "didFinishLaunchingWithOptions": [ - "RNSplashScreen.show()" - ] + "didFinishLaunchingWithOptions": ["RNSplashScreen.show()"] } }, "podName": "react-native-splash-screen" @@ -3629,7 +3558,7 @@ } }, "react-native-tvos": { - "version": "0.66.3-1" + "version": "0.73.6-0" }, "react-native-tvos-controller": { "ios": { @@ -3768,10 +3697,13 @@ "version": "0.2.13" }, "react-native-web": { + "version": "0.19.9", "pluginDependencies": { "react": "source:rnv" }, - "version": "0.18.9" + "webpackConfig": { + "modulePaths": true + } }, "react-native-web-image-loader": { "version": "0.0.5" @@ -3914,9 +3846,7 @@ "webpack": { "moduleAliases": true, "modulePaths": true, - "nextTranspileModules": [ - "recyclerlistview" - ] + "nextTranspileModules": ["recyclerlistview"] } }, "renative": { @@ -3947,9 +3877,7 @@ "rnv-platform-info": { "version": "1.0.8", "webpack": { - "nextTranspileModules": [ - "rnv-platform-info" - ] + "nextTranspileModules": ["rnv-platform-info"] } }, "Sentry": { @@ -3981,9 +3909,7 @@ "afterEvaluate": [ "com.google.gms.googleservices.GoogleServicesPlugin.config.disableVersionCheck = true" ], - "implementations": [ - "'com.google.android.gms:play-services-wallet:16.0.0'" - ], + "implementations": ["'com.google.android.gms:play-services-wallet:16.0.0'"], "package": "com.gettipsi.stripe.StripeReactPackage" }, "ios": { @@ -3993,4 +3919,4 @@ }, "tslib": "2.3.1" } -} \ No newline at end of file +} diff --git a/packages/core/.gitignore b/packages/core/.gitignore deleted file mode 100644 index b1df6575cc..0000000000 --- a/packages/core/.gitignore +++ /dev/null @@ -1,52 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -lib/ -!pluginTemplates/**/dist diff --git a/packages/core/.npmignore b/packages/core/.npmignore deleted file mode 100644 index 59f1496369..0000000000 --- a/packages/core/.npmignore +++ /dev/null @@ -1,58 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ - -**/__tests__/ - -*.map \ No newline at end of file diff --git a/packages/core/jsonSchema/rnv.app.json b/packages/core/jsonSchema/rnv.app.json index 9a90fd33c5..3e6ff3ab26 100644 --- a/packages/core/jsonSchema/rnv.app.json +++ b/packages/core/jsonSchema/rnv.app.json @@ -1,3558 +1,3326 @@ { "$ref": "#/definitions/rnv.app", "definitions": { - "rnv.app": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { "type": "object", "properties": { - "id": { - "type": "string", - "description": "ID of the app in `./appConfigs/[APP_ID]/renative.json`. MUST match APP_ID name of the folder" - }, - "custom": { - "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" - }, - "hidden": { + "enabled": { "type": "boolean", - "description": "If set to true in `./appConfigs/[APP_ID]/renative.json` the APP_ID will be hidden from list of appConfigs `-c`" + "description": "Defines whether build scheme shows up in options to run" }, - "extendsTemplate": { + "description": { "type": "string", - "description": "You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`" + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" }, - "extend": { - "type": "string", - "description": "extend another appConfig by id" + "version": { + "type": "string" }, - "skipBootstrapCopy": { + "disabled": { "type": "boolean" }, - "common": { - "type": "object", - "properties": { - "includedPermissions": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" - }, - "excludedPermissions": { - "type": "array", - "items": { + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { "type": "string" }, - "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" - }, - "id": { - "type": "string", - "description": "Bundle ID of application. ie: com.example.myapp" - }, - "idSuffix": { + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { "type": "string" }, - "version": { - "type": "string", - "description": "Semver style version of your app" - }, - "versionCode": { - "type": "string", - "description": "Manual verride of generated version code" - }, - "versionFormat": { - "type": "string", - "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n\nIf you do not define versionFormat, no formatting will apply to version.\n\n\"versionFormat\" : \"0.0.0\"\n\nIN: 1.2.3-rc.4+build.56 OUT: 1.2.3\n\nIN: 1.2.3 OUT: 1.2.3\n\n\n\n\"versionFormat\" : \"0.0.0.0.0\"\n\nIN: 1.2.3-rc.4+build.56 OUT: 1.2.3.4.56\n\nIN: 1.2.3 OUT: 1.2.3\n\n\"versionFormat\" : \"0.0.0.x.x.x.x\"\n\nIN: 1.2.3-rc.4+build.56 OUT: 1.2.3.rc.4.build.56\n\nIN: 1.2.3 OUT: 1.2.3\n\n" - }, - "versionCodeFormat": { - "type": "string", - "description": "Allows you to fine-tune auto generated version codes.\n\nVersion code is autogenerated from app version defined in package.json or renative.json.\n\nNOTE: If you define versionCode manually this formatting will not apply.\n\nEXAMPLE 1:\n\ndefault value: 00.00.00\n\nIN: 1.2.3-rc.4+build.56 OUT: 102030456\n\nIN: 1.2.3 OUT: 10203\n\nEXAMPLE 2:\n\n\"versionCodeFormat\" : \"00.00.00.00.00\"\n\nIN: 1.2.3-rc.4+build.56 OUT: 102030456\n\nIN: 1.2.3 OUT: 102030000\n\nEXAMPLE 3:\n\n\"versionCodeFormat\" : \"00.00.00.0000\"\n\nIN: 1.0.23-rc.15 OUT: 100230015\n\nIN: 1.0.23 OUT: 100230000\n\n" - }, - "versionCodeOffset": { - "type": "number" + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "title": { - "type": "string", - "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "description": { - "type": "string", - "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "author": { - "type": "string", - "description": "Author name" + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "license": { - "type": "string", - "description": "Injects license information into app" + "name": { + "type": "string" }, - "includedFonts": { - "type": "array", - "items": { - "type": "string" + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" }, - "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" - }, - "backgroundColor": { - "type": "string", - "minLength": 4, - "maxLength": 9, - "pattern": "^#", - "description": "Defines root view backgroundColor for all platforms in HEX format" - }, - "splashScreen": { - "type": "boolean", - "description": "Enable or disable splash screen" - }, - "fontSources": { - "type": "array", - "items": { - "type": "string" + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" }, - "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" - }, - "assetSources": { - "type": "array", - "items": { - "type": "string" + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" }, - "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" - }, - "includedPlugins": { - "type": "array", - "items": { - "type": "string" + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" }, - "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" - }, - "excludedPlugins": { - "type": "array", - "items": { - "type": "string" + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" }, - "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" - }, - "runtime": { - "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/custom" + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "type": "object", + "properties": { + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] }, - "buildSchemes": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "type": "string", - "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "enabled": { - "type": "boolean", - "description": "Defines whether build scheme shows up in options to run" - }, - "extendPlatform": { - "type": "string", - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } ] - }, - "assetFolderPlatform": { - "type": "string", - "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" - }, - "engine": { - "type": "string", - "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" - }, - "entryFile": { - "type": "string", - "default": "index", - "description": "Alternative name of the entry file without `.js` extension" - }, - "bundleAssets": { - "type": "boolean", - "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" - }, - "enableSourceMaps": { - "type": "boolean", - "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" - }, - "bundleIsDev": { - "type": "boolean", - "description": "If set to `true` debug build will be generated" - }, - "getJsBundleFile": { - "type": "string" } - }, - "additionalProperties": false + } + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" } } }, "additionalProperties": false, - "description": "Common config props used as default props for all available buildSchemes" + "description": "Allows you to configure webpack bahaviour per each individual plugin" }, - "platforms": { + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { "type": "object", "properties": { - "android": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { "type": "object", "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "enableAndroidX": { - "type": [ - "boolean", - "string" - ], - "default": true, - "description": "Enables new android X architecture" - }, - "enableJetifier": { - "type": [ - "boolean", - "string" - ], - "default": true, - "description": "Enables Jetifier" - }, - "signingConfig": { - "type": "string", - "default": "Debug", - "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" - }, - "minSdkVersion": { - "type": "number", - "default": 28, - "description": "Minimum Android SDK version device has to have in order for app to run" - }, - "multipleAPKs": { - "type": "boolean", - "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" - }, - "aab": { - "type": "boolean", - "description": "If set to true, android project will generate app.aab instead of apk" - }, - "extraGradleParams": { - "type": "string", - "description": "Allows passing extra params to gradle command" - }, - "minifyEnabled": { - "type": "boolean", - "description": "Sets minifyEnabled buildType property in app/build.gradle" - }, - "targetSdkVersion": { - "type": "number", - "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" - }, - "compileSdkVersion": { - "type": "number", - "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" - }, - "kotlinVersion": { - "type": "string", - "default": "1.7.10", - "description": "Allows you define custom kotlin version" - }, - "ndkVersion": { - "type": "string", - "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" - }, - "supportLibVersion": { - "type": "string", - "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" - }, - "googleServicesVersion": { - "type": "string", - "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" - }, - "gradleBuildToolsVersion": { - "type": "string", - "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" - }, - "gradleWrapperVersion": { - "type": "string", - "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" - }, - "excludedFeatures": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Override features definitions in AndroidManifest.xml by exclusion" - }, - "includedFeatures": { - "type": "array", - "items": { - "type": "string" + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] }, - "description": "Override features definitions in AndroidManifest.xml by inclusion" - }, - "buildToolsVersion": { - "type": "string", - "default": "34.0.0", - "description": "Override android build tools version" - }, - "disableSigning": { - "type": "boolean" - }, - "storeFile": { - "type": "string", - "description": "Name of the store file in android project" - }, - "keyAlias": { - "type": "string", - "description": "Key alias of the store file in android project" - }, - "newArchEnabled": { - "type": "boolean", - "description": "Enables new arch for android. Default: false" - }, - "reactNativeEngine": { - "type": "string", - "enum": [ - "jsc", - "v8-android", - "v8-android-nointl", - "v8-android-jit", - "v8-android-jit-nointl", - "hermes" - ], - "default": "hermes", - "description": "Allows you to define specific native render engine to be used" + "description": "Overrides values in `gradle.properties` file of generated android based project" }, - "templateAndroid": { + "build_gradle": { "type": "object", "properties": { - "gradle_properties": { + "allprojects": { "type": "object", - "additionalProperties": { - "type": [ - "string", - "boolean", - "number" - ] + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } }, - "description": "Overrides values in `gradle.properties` file of generated android based project" + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } }, - "build_gradle": { + "buildscript": { "type": "object", "properties": { - "allprojects": { + "repositories": { "type": "object", - "properties": { - "repositories": { - "type": "object", - "additionalProperties": { - "type": "boolean" - }, - "description": "Customize repositories section of build.gradle" - } - }, - "required": [ - "repositories" - ], - "additionalProperties": false - }, - "plugins": { - "type": "array", - "items": { - "type": "string" + "additionalProperties": { + "type": "boolean" } }, - "buildscript": { - "type": "object", - "properties": { - "repositories": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "dependencies": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - } - }, - "required": [ - "repositories", - "dependencies" - ], - "additionalProperties": false - }, - "dexOptions": { + "dependencies": { "type": "object", "additionalProperties": { "type": "boolean" } - }, - "injectAfterAll": { - "type": "array", - "items": { - "type": "string" - } } }, "required": [ - "allprojects", - "plugins", - "buildscript", - "dexOptions", - "injectAfterAll" + "repositories", + "dependencies" ], - "additionalProperties": false, - "description": "Overrides values in `build.gradle` file of generated android based project" + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } }, - "app_build_gradle": { + "buildTypes": { "type": "object", "properties": { - "apply": { - "type": "array", - "items": { - "type": "string" - } - }, - "defaultConfig": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildTypes": { - "type": "object", - "properties": { - "debug": { - "type": "array", - "items": { - "type": "string" - } - }, - "release": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "afterEvaluate": { + "debug": { "type": "array", "items": { "type": "string" } }, - "implementations": { + "release": { "type": "array", "items": { "type": "string" } - }, - "implementation": { - "type": "string" - } - }, - "required": [ - "apply", - "defaultConfig" - ], - "additionalProperties": false, - "description": "Overrides values in `app/build.gradle` file of generated android based project" - }, - "AndroidManifest_xml": { - "type": "object", - "properties": { - "tag": { - "type": "string" - }, - "android:name": { - "type": "string" - }, - "android:required": { - "type": "boolean" - }, - "package": { - "type": "string" - }, - "children": { - "type": "array", - "items": { - "type": "object", - "properties": { - "tag": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/tag" - }, - "android:name": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/android:name" - }, - "android:required": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/android:required" - }, - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/children/items" - } - } - }, - "required": [ - "tag", - "android:name", - "children" - ], - "additionalProperties": false - } } }, - "required": [ - "tag", - "android:name", - "children" - ], - "additionalProperties": false, - "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " - }, - "strings_xml": { - "type": "object", - "properties": {}, "additionalProperties": false }, - "MainActivity_kt": { - "type": "object", - "properties": { - "onCreate": { - "type": "string", - "default": "super.onCreate(savedInstanceState)", - "description": "Overrides super.onCreate method handler of MainActivity.java" - }, - "imports": { - "type": "array", - "items": { - "type": "string" - } - }, - "methods": { - "type": "array", - "items": { - "type": "string" - } - }, - "createMethods": { - "type": "array", - "items": { - "type": "string" - } - }, - "resultMethods": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } }, - "MainApplication_kt": { - "type": "object", - "properties": { - "imports": { - "type": "array", - "items": { - "type": "string" - } - }, - "methods": { - "type": "array", - "items": { + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { "type": "string" - } - }, - "createMethods": { - "type": "array", - "items": { + }, + "name": { "type": "string" - } - }, - "packages": { - "type": "array", - "items": { + }, + "child_value": { "type": "string" } }, - "packageParams": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false, - "description": "Allows you to configure behaviour of MainActivity" - }, - "settings_gradle": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "gradle_wrapper_properties": { - "type": "object", - "properties": {}, - "additionalProperties": false + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" }, - "SplashActivity_java": { - "type": "object", - "properties": {}, - "additionalProperties": false + "imports": { + "type": "array", + "items": { + "type": "string" + } }, - "styles_xml": { - "type": "object", - "properties": {}, - "additionalProperties": false + "methods": { + "type": "array", + "items": { + "type": "string" + } }, - "colors_xml": { - "type": "object", - "properties": {}, - "additionalProperties": false + "createMethods": { + "type": "array", + "items": { + "type": "string" + } }, - "proguard_rules_pro": { - "type": "object", - "properties": {}, - "additionalProperties": false + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } } }, "additionalProperties": false }, - "buildSchemes": { + "MainApplication_kt": { "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "enableAndroidX": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/enableAndroidX" - }, - "enableJetifier": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/enableJetifier" - }, - "signingConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/signingConfig" - }, - "minSdkVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/minSdkVersion" - }, - "multipleAPKs": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/multipleAPKs" - }, - "aab": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/aab" - }, - "extraGradleParams": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/extraGradleParams" - }, - "minifyEnabled": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/minifyEnabled" - }, - "targetSdkVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/targetSdkVersion" - }, - "compileSdkVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/compileSdkVersion" - }, - "kotlinVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/kotlinVersion" - }, - "ndkVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/ndkVersion" - }, - "supportLibVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/supportLibVersion" - }, - "googleServicesVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/googleServicesVersion" - }, - "gradleBuildToolsVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/gradleBuildToolsVersion" - }, - "gradleWrapperVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/gradleWrapperVersion" - }, - "excludedFeatures": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/excludedFeatures" - }, - "includedFeatures": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/includedFeatures" - }, - "buildToolsVersion": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/buildToolsVersion" - }, - "disableSigning": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/disableSigning" - }, - "storeFile": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/storeFile" - }, - "keyAlias": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/keyAlias" - }, - "newArchEnabled": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/newArchEnabled" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateAndroid": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid" + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" } }, - "additionalProperties": false - } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" - }, - "androidtv": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android" - }, - "androidwear": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android" - }, - "firetv": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android" - }, - "ios": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "ignoreWarnings": { - "type": "boolean", - "description": "Injects `inhibit_all_warnings` into Podfile" - }, - "ignoreLogs": { - "type": "boolean", - "description": "Passes `-quiet` to xcodebuild command" - }, - "deploymentTarget": { - "type": "string", - "description": "Deployment target for xcodepoj" - }, - "orientationSupport": { - "type": "object", - "properties": { - "phone": { + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { "type": "array", "items": { "type": "string" } }, - "tab": { + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { "type": "array", "items": { "type": "string" } } }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, "additionalProperties": false }, - "teamID": { - "type": "string", - "description": "Apple teamID" - }, - "excludedArchs": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" - }, - "urlScheme": { - "type": "string", - "description": "URL Scheme for the app used for deeplinking" - }, - "teamIdentifier": { - "type": "string", - "description": "Apple developer team ID" - }, - "scheme": { - "type": "string" - }, - "schemeTarget": { - "type": "string" - }, - "appleId": { - "type": "string" - }, - "provisioningStyle": { - "type": "string" - }, - "newArchEnabled": { - "type": "boolean", - "description": "Enables new archs for iOS. Default: false" - }, - "codeSignIdentity": { - "type": "string", - "description": "Special property which tells Xcode how to build your project" - }, - "commandLineArguments": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Allows you to pass launch arguments to active scheme" - }, - "provisionProfileSpecifier": { - "type": "string" - }, - "provisionProfileSpecifiers": { + "gradle_wrapper_properties": { "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "allowProvisioningUpdates": { - "type": "boolean" + "properties": {}, + "additionalProperties": false }, - "provisioningProfiles": { + "SplashActivity_java": { "type": "object", - "additionalProperties": { - "type": "string" - } + "properties": {}, + "additionalProperties": false }, - "codeSignIdentities": { + "styles_xml": { "type": "object", - "additionalProperties": { - "type": "string" - } + "properties": {}, + "additionalProperties": false }, - "systemCapabilities": { + "colors_xml": { "type": "object", - "additionalProperties": { - "type": "boolean" - } + "properties": {}, + "additionalProperties": false }, - "entitlements": { + "proguard_rules_pro": { "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "runScheme": { - "type": "string" - }, - "sdk": { - "type": "string" - }, - "testFlightId": { - "type": "string" - }, - "firebaseId": { - "type": "string" - }, - "exportOptions": { + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { "type": "object", "properties": { - "method": { - "type": "string" - }, - "teamID": { - "type": "string" - }, - "uploadBitcode": { - "type": "boolean" - }, - "compileBitcode": { - "type": "boolean" + "injectLines": { + "type": "array", + "items": { + "type": "string" + } }, - "uploadSymbols": { - "type": "boolean" + "post_install": { + "type": "array", + "items": { + "type": "string" + } }, - "signingStyle": { - "type": "string" + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" }, - "signingCertificate": { - "type": "string" + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } }, - "provisioningProfiles": { - "type": "object", - "additionalProperties": { + "staticPods": { + "type": "array", + "items": { "type": "string" } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" } }, - "additionalProperties": false - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/reactNativeEngine" + "additionalProperties": false, + "description": "Allows to manipulate Podfile" }, - "templateXcode": { + "project_pbxproj": { "type": "object", "properties": { - "Podfile": { - "type": "object", - "properties": { - "injectLines": { - "type": "array", - "items": { - "type": "string" - } - }, - "post_install": { - "type": "array", - "items": { - "type": "string" - } - }, - "sources": { - "type": "array", - "items": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { "type": "string" }, - "description": "Array of URLs that will be injected on top of the Podfile as sources" - }, - "podDependencies": { - "type": "array", - "items": { - "type": "string" - } - }, - "staticPods": { - "type": "array", - "items": { - "type": "string" - } - }, - "header": { - "type": "array", - "items": { + "shellScript": { "type": "string" }, - "description": "Array of strings that will be injected on top of the Podfile" - } - }, - "additionalProperties": false, - "description": "Allows to manipulate Podfile" - }, - "project_pbxproj": { - "type": "object", - "properties": { - "sourceFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "resourceFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "headerFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildPhases": { - "type": "array", - "items": { - "type": "object", - "properties": { - "shellPath": { - "type": "string" - }, - "shellScript": { - "type": "string" - }, - "inputPaths": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "shellPath", - "shellScript", - "inputPaths" - ], - "additionalProperties": false - } - }, - "frameworks": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "AppDelegate_mm": { - "type": "object", - "properties": { - "appDelegateMethods": { - "type": "object", - "properties": { - "application": { - "type": "object", - "properties": { - "didFinishLaunchingWithOptions": { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "order": { - "type": "number" - }, - "value": { - "type": "string" - }, - "weight": { - "type": "number" - } - }, - "required": [ - "order", - "value", - "weight" - ], - "additionalProperties": false - } - ] - } - }, - "applicationDidBecomeActive": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "open": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "supportedInterfaceOrientationsFor": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceiveRemoteNotification": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didFailToRegisterForRemoteNotificationsWithError": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceive": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didRegister": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didRegisterForRemoteNotificationsWithDeviceToken": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "continue": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didConnectCarInterfaceController": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didDisconnectCarInterfaceController": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - } - }, - "additionalProperties": false - }, - "userNotificationCenter": { - "type": "object", - "properties": { - "willPresent": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceiveNotificationResponse": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - } - }, - "additionalProperties": false + "inputPaths": { + "type": "array", + "items": { + "type": "string" } - }, - "additionalProperties": false - }, - "appDelegateImports": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "AppDelegate_h": { - "type": "object", - "properties": { - "appDelegateImports": { - "type": "array", - "items": { - "type": "string" } }, - "appDelegateExtensions": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } }, - "Info_plist": { + "buildSettings": { "type": "object", - "properties": {}, - "additionalProperties": false + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false }, - "buildSchemes": { + "AppDelegate_mm": { "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "ignoreWarnings": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/ignoreWarnings" - }, - "ignoreLogs": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/ignoreLogs" - }, - "deploymentTarget": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/deploymentTarget" - }, - "orientationSupport": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/orientationSupport" - }, - "teamID": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/teamID" - }, - "excludedArchs": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/excludedArchs" - }, - "urlScheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/urlScheme" - }, - "teamIdentifier": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/teamIdentifier" - }, - "scheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/scheme" - }, - "schemeTarget": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/schemeTarget" - }, - "appleId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/appleId" - }, - "provisioningStyle": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisioningStyle" - }, - "newArchEnabled": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/newArchEnabled" - }, - "codeSignIdentity": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/codeSignIdentity" - }, - "commandLineArguments": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/commandLineArguments" - }, - "provisionProfileSpecifier": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisionProfileSpecifier" - }, - "provisionProfileSpecifiers": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisionProfileSpecifiers" - }, - "allowProvisioningUpdates": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/allowProvisioningUpdates" - }, - "provisioningProfiles": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisioningProfiles" - }, - "codeSignIdentities": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/codeSignIdentities" - }, - "systemCapabilities": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/systemCapabilities" - }, - "entitlements": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/entitlements" - }, - "runScheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/runScheme" - }, - "sdk": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/sdk" - }, - "testFlightId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/testFlightId" - }, - "firebaseId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/firebaseId" - }, - "exportOptions": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/exportOptions" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/reactNativeEngine" + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } }, - "templateXcode": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode" - } + "additionalProperties": false }, - "additionalProperties": false - } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" - }, - "tvos": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios" - }, - "tizen": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "package": { - "type": "string" - }, - "certificateProfile": { - "type": "string" - }, - "appName": { - "type": "string" - }, - "timestampBuildFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "devServerHost": { - "type": "string" - }, - "environment": { - "type": "string" + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false }, - "webpackConfig": { + "AppDelegate_h": { "type": "object", "properties": { - "publicUrl": { - "type": "string" + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } }, - "customScripts": { + "appDelegateExtensions": { "type": "array", "items": { "type": "string" - }, - "description": "Allows you to inject custom script into html header" + } } }, "additionalProperties": false }, - "buildSchemes": { + "Info_plist": { "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "package": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/package" - }, - "certificateProfile": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/certificateProfile" - }, - "appName": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/appName" - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/environment" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/webpackConfig" - } - }, - "additionalProperties": false - } + "properties": {}, + "additionalProperties": false } }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" + "additionalProperties": false }, - "tizenmobile": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen" + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" }, - "tizenwatch": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen" + "commit": { + "type": "string", + "description": "Alternative git commit reference string" }, - "webos": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/environment" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/webpackConfig" - }, - "iconColor": { - "type": "string" - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/environment" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/webpackConfig" - }, - "iconColor": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/webos/properties/iconColor" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" + "version": { + "type": "string", + "description": "Version of pod" }, - "web": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/webpackConfig" - }, - "pagesDir": { - "type": "string", - "description": "Custom pages directory used by nextjs. Use relative paths" - }, - "outputDir": { - "type": "string", - "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" - }, - "exportDir": { - "type": "string", - "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" - }, - "nextTranspileModules": { - "type": "array", - "items": { - "type": "string" - } - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/environment" - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/webpackConfig" - }, - "pagesDir": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/web/properties/pagesDir" - }, - "outputDir": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/web/properties/outputDir" - }, - "exportDir": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/web/properties/exportDir" - }, - "nextTranspileModules": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/web/properties/nextTranspileModules" - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/tizen/properties/environment" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" + "podNames": { + "type": "array", + "items": { + "type": "string" + } }, - "webtv": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/web" + "podName": { + "type": "string" }, - "chromecast": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/web" + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } }, - "kaios": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/web" + "isStatic": { + "type": "boolean" }, - "macos": { + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "ignoreWarnings": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/ignoreWarnings" - }, - "ignoreLogs": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/ignoreLogs" - }, - "deploymentTarget": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/deploymentTarget" - }, - "orientationSupport": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/orientationSupport" - }, - "teamID": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/teamID" - }, - "excludedArchs": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/excludedArchs" - }, - "urlScheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/urlScheme" - }, - "teamIdentifier": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/teamIdentifier" - }, - "scheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/scheme" - }, - "schemeTarget": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/schemeTarget" - }, - "appleId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/appleId" - }, - "provisioningStyle": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisioningStyle" - }, - "newArchEnabled": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/newArchEnabled" - }, - "codeSignIdentity": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/codeSignIdentity" - }, - "commandLineArguments": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/commandLineArguments" - }, - "provisionProfileSpecifier": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisionProfileSpecifier" - }, - "provisionProfileSpecifiers": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisionProfileSpecifiers" - }, - "allowProvisioningUpdates": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/allowProvisioningUpdates" - }, - "provisioningProfiles": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisioningProfiles" - }, - "codeSignIdentities": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/codeSignIdentities" - }, - "systemCapabilities": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/systemCapabilities" - }, - "entitlements": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/entitlements" - }, - "runScheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/runScheme" - }, - "sdk": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/sdk" - }, - "testFlightId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/testFlightId" - }, - "firebaseId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/firebaseId" - }, - "exportOptions": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/exportOptions" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateXcode": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode" - }, - "electronConfig": { - "description": "Allows you to configure electron app as per https://www.electron.build/" - }, - "BrowserWindow": { - "type": "object", - "properties": { - "width": { - "type": "number" + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" }, - "height": { - "type": "number" + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" }, - "webPreferences": { - "type": "object", - "properties": { - "devTools": { - "type": "boolean" - } - }, - "additionalProperties": false, - "description": "Extra web preferences of electron app" - } + "description": "Override features definitions in AndroidManifest.xml by inclusion" }, - "additionalProperties": false, - "description": "Allows you to configure electron wrapper app window" + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } }, - "buildSchemes": { - "type": "object", - "additionalProperties": { + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { "type": "object", "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" + "phone": { + "type": "array", + "items": { + "type": "string" + } }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "ignoreWarnings": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/ignoreWarnings" - }, - "ignoreLogs": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/ignoreLogs" - }, - "deploymentTarget": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/deploymentTarget" - }, - "orientationSupport": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/orientationSupport" + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" }, "teamID": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/teamID" - }, - "excludedArchs": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/excludedArchs" - }, - "urlScheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/urlScheme" - }, - "teamIdentifier": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/teamIdentifier" - }, - "scheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/scheme" - }, - "schemeTarget": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/schemeTarget" - }, - "appleId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/appleId" - }, - "provisioningStyle": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisioningStyle" - }, - "newArchEnabled": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/newArchEnabled" + "type": "string" }, - "codeSignIdentity": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/codeSignIdentity" + "uploadBitcode": { + "type": "boolean" }, - "commandLineArguments": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/commandLineArguments" + "compileBitcode": { + "type": "boolean" }, - "provisionProfileSpecifier": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisionProfileSpecifier" + "uploadSymbols": { + "type": "boolean" }, - "provisionProfileSpecifiers": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisionProfileSpecifiers" + "signingStyle": { + "type": "string" }, - "allowProvisioningUpdates": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/allowProvisioningUpdates" + "signingCertificate": { + "type": "string" }, "provisioningProfiles": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/provisioningProfiles" - }, - "codeSignIdentities": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/codeSignIdentities" - }, - "systemCapabilities": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/systemCapabilities" - }, - "entitlements": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/entitlements" - }, - "runScheme": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/runScheme" - }, - "sdk": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/sdk" - }, - "testFlightId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/testFlightId" - }, - "firebaseId": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/firebaseId" - }, - "exportOptions": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/exportOptions" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateXcode": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode" - }, - "electronConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/macos/properties/electronConfig" - }, - "BrowserWindow": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/macos/properties/BrowserWindow" + "type": "object", + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" - }, - "linux": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/web" - }, - "windows": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "electronConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/macos/properties/electronConfig" - }, - "BrowserWindow": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/macos/properties/BrowserWindow" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateVSProject": { - "type": "object", - "properties": { - "language": { - "type": "string", - "description": "Specify generated project language: cpp for C++ or cs for C#" - }, - "arch": { - "type": "string", - "description": "Specification of targeted architecture" - }, - "experimentalNuGetDependency": { - "type": "boolean" - }, - "useWinUI3": { - "type": "boolean" - }, - "nuGetTestVersion": { - "type": "string" - }, - "reactNativeEngine": { - "type": "string" - }, - "nuGetTestFeed": { - "type": "string" - }, - "overwrite": { - "type": "boolean", - "description": "Whether to attempt to override the existing builds files when running a build once more" - }, - "release": { - "type": "boolean", - "description": "Enables full packaging of the app for release" - }, - "root": { - "type": "string", - "description": "Project root folder location (not the app itself, which is in platformBuilds)" - }, - "singleproc": { - "type": "boolean", - "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" - }, - "emulator": { - "type": "boolean" - }, - "device": { - "type": "boolean" - }, - "target": { - "type": "string" - }, - "remoteDebugging": { - "type": "boolean" - }, - "logging": { - "type": "boolean", - "description": "Logging all the build proccesses to console" - }, - "packager": { - "type": "boolean" - }, - "bundle": { - "type": "boolean" - }, - "launch": { - "type": "boolean", - "description": "Launches the application once the build process is finished" - }, - "autolink": { - "type": "boolean", - "description": "Launches the application once the build process is finished" - }, - "build": { - "type": "boolean", - "description": "Builds the application before launching it" - }, - "sln": { - "type": "string", - "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" - }, - "proj": { - "type": "string", - "description": "Root project directory for your React Native Windows project (not Visual Studio project)" - }, - "appPath": { - "type": "string", - "description": "Full path to windows plaform build directory" - }, - "msbuildprops": { - "type": "string", - "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" - }, - "buildLogDirectory": { - "type": "string", - "description": "Full path to directory where builds logs should be stored, default - project path" - }, - "info": { - "type": "boolean", - "description": "Print information about the build machine to console" - }, - "directDebugging": { - "type": "boolean" - }, - "telemetry": { - "type": "boolean", - "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" - }, - "devPort": { + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } }, - "additionalMetroOptions": { - "type": "object", - "additionalProperties": {} - }, - "packageExtension": { + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { "type": "string" } }, - "additionalProperties": false - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { "type": "object", "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.app/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.app/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.app/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.app/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.app/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.app/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.app/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.app/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.app/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.app/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.app/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.app/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.app/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.app/properties/common/properties/custom" + "width": { + "type": "number" }, - "extendPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" + "height": { + "type": "number" }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.app/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "electronConfig": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/macos/properties/electronConfig" - }, - "BrowserWindow": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/macos/properties/BrowserWindow" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateVSProject": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/windows/properties/templateVSProject" + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" } }, - "additionalProperties": false + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" - }, - "xbox": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/windows" + }, + "additionalProperties": false + } } }, - "additionalProperties": false, - "description": "Object containing platform configurations" + "required": [ + "buildSchemes" + ], + "additionalProperties": false }, - "plugins": { + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { "type": "object", - "additionalProperties": { - "anyOf": [ - { - "anyOf": [ - { + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { "type": "object", "properties": { - "disabled": { - "type": "boolean", - "default": false, - "description": "Marks plugin disabled" - }, - "props": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Custom props passed to plugin" - }, - "version": { - "type": "string", - "description": "Version of plugin. Typically package version" - }, - "deprecated": { + "language": { "type": "string", - "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + "description": "Specify generated project language: cpp for C++ or cs for C#" }, - "source": { + "arch": { "type": "string", - "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + "description": "Specification of targeted architecture" }, - "disableNpm": { - "type": "boolean", - "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + "experimentalNuGetDependency": { + "type": "boolean" }, - "skipMerge": { - "type": "boolean", - "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + "useWinUI3": { + "type": "boolean" }, - "npm": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + "nuGetTestVersion": { + "type": "string" }, - "pluginDependencies": { - "type": "object", - "additionalProperties": { - "type": [ - "string", - "null" - ] - }, - "description": "List of other Renative plugins this plugin depends on" + "reactNativeEngine": { + "type": "string" }, - "webpackConfig": { - "type": "object", - "properties": { - "modulePaths": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "moduleAliases": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "object", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "projectPath": { - "type": "string" - } - }, - "required": [ - "projectPath" - ], - "additionalProperties": false - } - ] - } - } - ] - }, - "nextTranspileModules": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false, - "description": "Allows you to configure webpack bahaviour per each individual plugin" + "nuGetTestFeed": { + "type": "string" }, - "disablePluginTemplateOverrides": { + "overwrite": { "type": "boolean", - "description": "Disables plugin overrides for selected plugin" + "description": "Whether to attempt to override the existing builds files when running a build once more" }, - "fontSources": { - "type": "array", - "items": { - "type": "string" - } + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" }, - "android": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "default": false, - "description": "Marks plugin platform disabled" - }, - "forceLinking": { - "type": "boolean", - "default": false, - "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" - }, - "path": { - "type": "string", - "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." - }, - "projectName": { - "type": "string" - }, - "skipLinking": { - "type": "boolean" - }, - "skipImplementation": { - "type": "boolean" - }, - "implementation": { - "type": "string" - }, - "package": { - "type": "string" - }, - "templateAndroid": { - "type": "object", - "properties": { - "gradle_properties": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/gradle_properties" - }, - "build_gradle": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/build_gradle" - }, - "app_build_gradle": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/app_build_gradle" - }, - "AndroidManifest_xml": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml" - }, - "strings_xml": { - "type": "object", - "properties": { - "children": { - "type": "array", - "items": { - "type": "object", - "properties": { - "tag": { - "type": "string" - }, - "name": { - "type": "string" - }, - "child_value": { - "type": "string" - } - }, - "required": [ - "tag", - "name", - "child_value" - ], - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "MainActivity_kt": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/MainActivity_kt" - }, - "MainApplication_kt": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/android/properties/templateAndroid/properties/MainApplication_kt" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" }, - "androidtv": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android" + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" }, - "androidwear": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android" + "emulator": { + "type": "boolean" }, - "firetv": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android" + "device": { + "type": "boolean" }, - "ios": { - "type": "object", - "properties": { - "disabled": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/disabled" - }, - "forceLinking": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/forceLinking" - }, - "path": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/path" - }, - "git": { - "type": "string", - "description": "Alternative git url for pod instead of version" - }, - "commit": { - "type": "string", - "description": "Alternative git commit reference string" - }, - "version": { - "type": "string", - "description": "Version of pod" - }, - "podNames": { - "type": "array", - "items": { - "type": "string" - } - }, - "podName": { - "type": "string" - }, - "staticFrameworks": { - "type": "array", - "items": { - "type": "string" - } - }, - "templateXcode": { - "type": "object", - "properties": { - "Podfile": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/Podfile" - }, - "project_pbxproj": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/project_pbxproj" - }, - "AppDelegate_mm": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm" - }, - "AppDelegate_h": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_h" - }, - "Info_plist": { - "$ref": "#/definitions/rnv.app/properties/platforms/properties/ios/properties/templateXcode/properties/Info_plist" - } - }, - "additionalProperties": false - }, - "isStatic": { - "type": "boolean" - }, - "buildType": { - "type": "string", - "enum": [ - "dynamic", - "static" - ], - "description": "Build type of the pod" - } - }, - "additionalProperties": false + "target": { + "type": "string" }, - "tvos": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/ios" + "remoteDebugging": { + "type": "boolean" }, - "tizen": { - "type": "object", - "properties": { - "disabled": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/disabled" - }, - "forceLinking": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/forceLinking" - }, - "path": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/path" - } - }, - "additionalProperties": false + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" }, - "tizenmobile": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" }, - "tizenwatch": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" }, - "webos": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" }, - "web": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" }, - "webtv": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" }, - "chromecast": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" }, - "kaios": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "directDebugging": { + "type": "boolean" }, - "macos": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" }, - "linux": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "devPort": { + "type": "string" }, - "windows": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} }, - "xbox": { - "$ref": "#/definitions/rnv.app/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" + "packageExtension": { + "type": "string" } }, "additionalProperties": false - }, - { - "type": "string" } - ] - }, - { - "type": "null" + }, + "additionalProperties": false } - ] + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } }, - "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, + "rnv.app": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "ID of the app in `./appConfigs/[APP_ID]/renative.json`. MUST match APP_ID name of the folder" + }, + "custom": { + "$ref": "#/definitions/zodExt" + }, + "hidden": { + "type": "boolean", + "description": "If set to true in `./appConfigs/[APP_ID]/renative.json` the APP_ID will be hidden from list of appConfigs `-c`" + }, + "extendsTemplate": { + "type": "string", + "description": "You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`" + }, + "extend": { + "type": "string", + "description": "extend another appConfig by id" + }, + "common": { + "$ref": "#/definitions/zodCommonSchema" + }, + "platforms": { + "$ref": "#/definitions/zodPlatformsSchema" + }, + "plugins": { + "$ref": "#/definitions/zodPluginsSchema" }, "$schema": { "type": "string", diff --git a/packages/core/jsonSchema/rnv.engine.json b/packages/core/jsonSchema/rnv.engine.json index 17c4f394b6..eb9c9a71c2 100644 --- a/packages/core/jsonSchema/rnv.engine.json +++ b/packages/core/jsonSchema/rnv.engine.json @@ -1,24 +1,3313 @@ { "$ref": "#/definitions/rnv.engine", "definitions": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { + "type": "string", + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "type": "object", + "properties": { + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } + ] + } + } + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] + }, + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } + }, + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "isStatic": { + "type": "boolean" + }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" + }, + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, "rnv.engine": { "type": "object", "properties": { "custom": { - "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + "$ref": "#/definitions/zodExt" }, "id": { "type": "string", "description": "ID of engine" }, + "packageName": { + "type": "string" + }, "engineExtension": { "type": "string", "description": "Engine extension ised by rnv during compilation" }, - "extends": { - "type": "string", - "description": "ID of engine to extend. Not being used yet" - }, "overview": { "type": "string", "description": "Overview description of engine" @@ -68,23 +3357,23 @@ }, "propertyNames": { "enum": [ + "web", "ios", "android", "androidtv", - "androidwear", "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", "tvos", - "webos", "macos", - "windows", "linux", - "tizenwatch", - "kaios", + "windows", + "tizen", + "webos", "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", "xbox" ] } @@ -94,11 +3383,6 @@ "description": "schema definition" } }, - "required": [ - "id", - "engineExtension", - "overview" - ], "additionalProperties": false } }, diff --git a/packages/core/jsonSchema/rnv.global.json b/packages/core/jsonSchema/rnv.global.json deleted file mode 100644 index f4a1c08030..0000000000 --- a/packages/core/jsonSchema/rnv.global.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "$ref": "#/definitions/rnv.global", - "definitions": { - "rnv.global": { - "type": "object", - "properties": { - "defaultTargets": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" - ] - }, - "description": "Define targets to be used when -t is not set on any project run" - }, - "sdks": { - "type": "object", - "properties": { - "ANDROID_SDK": { - "type": "string" - }, - "ANDROID_NDK": { - "type": "string" - }, - "TIZEN_SDK": { - "type": "string" - }, - "WEBOS_SDK": { - "type": "string" - }, - "KAIOS_SDK": { - "type": "string" - } - }, - "additionalProperties": false, - "description": "Define your sdk configurations" - }, - "projectTemplates": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": {}, - "additionalProperties": false - } - }, - "disableTelemetry": { - "type": "boolean", - "description": "Opt-out from renative telemetry program. More info at https://renative.org/telemetry" - }, - "appConfigsPath": { - "type": "string", - "description": "Enables you to define custom global appConfigs location that every project will automatically use" - }, - "$schema": { - "type": "string", - "description": "schema definition" - } - }, - "additionalProperties": false - } - }, - "$schema": "http://json-schema.org/draft-04/schema#" -} \ No newline at end of file diff --git a/packages/core/jsonSchema/rnv.integration.json b/packages/core/jsonSchema/rnv.integration.json index 5eff0ae095..aca07e1013 100644 --- a/packages/core/jsonSchema/rnv.integration.json +++ b/packages/core/jsonSchema/rnv.integration.json @@ -1,9 +1,3302 @@ { "$ref": "#/definitions/rnv.integration", "definitions": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { + "type": "string", + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "type": "object", + "properties": { + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } + ] + } + } + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] + }, + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } + }, + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "isStatic": { + "type": "boolean" + }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" + }, + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, "rnv.integration": { "type": "object", "properties": { + "packageName": { + "type": "string" + }, "$schema": { "type": "string", "description": "schema definition" diff --git a/packages/core/jsonSchema/rnv.local.json b/packages/core/jsonSchema/rnv.local.json index 6e8b2b7b25..d458106409 100644 --- a/packages/core/jsonSchema/rnv.local.json +++ b/packages/core/jsonSchema/rnv.local.json @@ -1,40 +1,3305 @@ { "$ref": "#/definitions/rnv.local", "definitions": { - "rnv.local": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { "type": "object", "properties": { - "workspaceAppConfigsDir": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { "type": "string", - "description": "Defines app configs dir outside of current project" + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" }, - "defaultTargets": { + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { "type": "object", "additionalProperties": { "type": "string" }, - "propertyNames": { - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" ] }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "type": "object", + "properties": { + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } + ] + } + } + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] + }, + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } + }, + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "isStatic": { + "type": "boolean" + }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" + }, + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, + "rnv.local": { + "type": "object", + "properties": { + "workspaceAppConfigsDir": { + "type": "string", + "description": "Defines app configs dir outside of current project" + }, + "defaultTargets": { + "$ref": "#/definitions/zodDefaultTargets", "description": "Define targets to be used when -t is not set on any project run" }, "_meta": { diff --git a/packages/core/jsonSchema/rnv.plugin.json b/packages/core/jsonSchema/rnv.plugin.json index 238afa2793..f60dad44fa 100644 --- a/packages/core/jsonSchema/rnv.plugin.json +++ b/packages/core/jsonSchema/rnv.plugin.json @@ -1,9 +1,500 @@ { "$ref": "#/definitions/rnv.plugin", "definitions": { - "rnv.plugin": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { + "type": "string", + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { "type": "object", "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, "disabled": { "type": "boolean", "default": false, @@ -135,21 +626,6 @@ "type": "string", "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." }, - "projectName": { - "type": "string" - }, - "skipLinking": { - "type": "boolean" - }, - "skipImplementation": { - "type": "boolean" - }, - "implementation": { - "type": "string" - }, - "package": { - "type": "string" - }, "templateAndroid": { "type": "object", "properties": { @@ -224,13 +700,6 @@ } } }, - "required": [ - "allprojects", - "plugins", - "buildscript", - "dexOptions", - "injectAfterAll" - ], "additionalProperties": false, "description": "Overrides values in `build.gradle` file of generated android based project" }, @@ -283,64 +752,11 @@ "type": "string" } }, - "required": [ - "apply", - "defaultConfig" - ], "additionalProperties": false, "description": "Overrides values in `app/build.gradle` file of generated android based project" }, "AndroidManifest_xml": { - "type": "object", - "properties": { - "tag": { - "type": "string" - }, - "android:name": { - "type": "string" - }, - "android:required": { - "type": "boolean" - }, - "package": { - "type": "string" - }, - "children": { - "type": "array", - "items": { - "type": "object", - "properties": { - "tag": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/tag" - }, - "android:name": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/android:name" - }, - "android:required": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/android:required" - }, - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/children/items" - } - } - }, - "required": [ - "tag", - "android:name", - "children" - ], - "additionalProperties": false - } - } - }, - "required": [ - "tag", - "android:name", - "children" - ], - "additionalProperties": false, + "$ref": "#/definitions/zodAndroidManifest", "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " }, "strings_xml": { @@ -362,14 +778,15 @@ } }, "required": [ - "tag", - "name", - "child_value" + "tag" ], "additionalProperties": false } } }, + "required": [ + "children" + ], "additionalProperties": false }, "MainActivity_kt": { @@ -443,60 +860,78 @@ }, "additionalProperties": false, "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false } }, "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" } }, "additionalProperties": false }, "androidtv": { - "$ref": "#/definitions/rnv.plugin/properties/android" + "$ref": "#/definitions/zodPluginSchema/properties/android" }, "androidwear": { - "$ref": "#/definitions/rnv.plugin/properties/android" + "$ref": "#/definitions/zodPluginSchema/properties/android" }, "firetv": { - "$ref": "#/definitions/rnv.plugin/properties/android" + "$ref": "#/definitions/zodPluginSchema/properties/android" }, "ios": { "type": "object", "properties": { "disabled": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/disabled" + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" }, "forceLinking": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/forceLinking" + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" }, "path": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/path" - }, - "git": { - "type": "string", - "description": "Alternative git url for pod instead of version" - }, - "commit": { - "type": "string", - "description": "Alternative git commit reference string" - }, - "version": { - "type": "string", - "description": "Version of pod" - }, - "podNames": { - "type": "array", - "items": { - "type": "string" - } - }, - "podName": { - "type": "string" - }, - "staticFrameworks": { - "type": "array", - "items": { - "type": "string" - } + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" }, "templateXcode": { "type": "object", @@ -620,97 +1055,73 @@ "didFinishLaunchingWithOptions": { "type": "array", "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "order": { - "type": "number" - }, - "value": { - "type": "string" - }, - "weight": { - "type": "number" - } - }, - "required": [ - "order", - "value", - "weight" - ], - "additionalProperties": false - } - ] + "$ref": "#/definitions/zodAppDelegateMethod" } }, "applicationDidBecomeActive": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "open": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "supportedInterfaceOrientationsFor": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "didReceiveRemoteNotification": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "didFailToRegisterForRemoteNotificationsWithError": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "didReceive": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "didRegister": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "didRegisterForRemoteNotificationsWithDeviceToken": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "continue": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "didConnectCarInterfaceController": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "didDisconnectCarInterfaceController": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } } }, @@ -722,13 +1133,13 @@ "willPresent": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } }, "didReceiveNotificationResponse": { "type": "array", "items": { - "$ref": "#/definitions/rnv.plugin/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" + "$ref": "#/definitions/zodAppDelegateMethod" } } }, @@ -772,6 +1183,33 @@ }, "additionalProperties": false }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, "isStatic": { "type": "boolean" }, @@ -784,61 +1222,2185 @@ "description": "Build type of the pod" } }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], "additionalProperties": false }, "tvos": { - "$ref": "#/definitions/rnv.plugin/properties/ios" + "$ref": "#/definitions/zodPluginSchema/properties/ios" }, "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { "type": "object", "properties": { - "disabled": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/disabled" - }, - "forceLinking": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/forceLinking" - }, - "path": { - "$ref": "#/definitions/rnv.plugin/properties/android/properties/path" - } - }, - "additionalProperties": false + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" + }, + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, + "rnv.plugin": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled", + "description": "Marks plugin disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props", + "description": "Custom props passed to plugin" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm", + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies", + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig", + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + }, + "android": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "tizenmobile": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "tizenwatch": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "webos": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "web": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "webtv": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "chromecast": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "kaios": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "macos": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "linux": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "windows": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "xbox": { - "$ref": "#/definitions/rnv.plugin/properties/tizen" + "$ref": "#/definitions/zodPluginPlatformBaseFragment" }, "custom": { - "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + "$ref": "#/definitions/zodExt" }, "$schema": { "type": "string", diff --git a/packages/core/jsonSchema/rnv.plugins.json b/packages/core/jsonSchema/rnv.plugins.json deleted file mode 100644 index e547809b9e..0000000000 --- a/packages/core/jsonSchema/rnv.plugins.json +++ /dev/null @@ -1,869 +0,0 @@ -{ - "$ref": "#/definitions/rnv.plugins", - "definitions": { - "rnv.plugins": { - "type": "object", - "properties": { - "custom": { - "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" - }, - "pluginTemplates": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "default": false, - "description": "Marks plugin disabled" - }, - "props": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Custom props passed to plugin" - }, - "version": { - "type": "string", - "description": "Version of plugin. Typically package version" - }, - "deprecated": { - "type": "string", - "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" - }, - "source": { - "type": "string", - "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" - }, - "disableNpm": { - "type": "boolean", - "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" - }, - "skipMerge": { - "type": "boolean", - "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" - }, - "npm": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Object of npm dependencies of this plugin. These will be injected into package.json" - }, - "pluginDependencies": { - "type": "object", - "additionalProperties": { - "type": [ - "string", - "null" - ] - }, - "description": "List of other Renative plugins this plugin depends on" - }, - "webpackConfig": { - "type": "object", - "properties": { - "modulePaths": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "moduleAliases": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "object", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "projectPath": { - "type": "string" - } - }, - "required": [ - "projectPath" - ], - "additionalProperties": false - } - ] - } - } - ] - }, - "nextTranspileModules": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false, - "description": "Allows you to configure webpack bahaviour per each individual plugin" - }, - "disablePluginTemplateOverrides": { - "type": "boolean", - "description": "Disables plugin overrides for selected plugin" - }, - "fontSources": { - "type": "array", - "items": { - "type": "string" - } - }, - "android": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "default": false, - "description": "Marks plugin platform disabled" - }, - "forceLinking": { - "type": "boolean", - "default": false, - "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" - }, - "path": { - "type": "string", - "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." - }, - "projectName": { - "type": "string" - }, - "skipLinking": { - "type": "boolean" - }, - "skipImplementation": { - "type": "boolean" - }, - "implementation": { - "type": "string" - }, - "package": { - "type": "string" - }, - "templateAndroid": { - "type": "object", - "properties": { - "gradle_properties": { - "type": "object", - "additionalProperties": { - "type": [ - "string", - "boolean", - "number" - ] - }, - "description": "Overrides values in `gradle.properties` file of generated android based project" - }, - "build_gradle": { - "type": "object", - "properties": { - "allprojects": { - "type": "object", - "properties": { - "repositories": { - "type": "object", - "additionalProperties": { - "type": "boolean" - }, - "description": "Customize repositories section of build.gradle" - } - }, - "required": [ - "repositories" - ], - "additionalProperties": false - }, - "plugins": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildscript": { - "type": "object", - "properties": { - "repositories": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "dependencies": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - } - }, - "required": [ - "repositories", - "dependencies" - ], - "additionalProperties": false - }, - "dexOptions": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "injectAfterAll": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "allprojects", - "plugins", - "buildscript", - "dexOptions", - "injectAfterAll" - ], - "additionalProperties": false, - "description": "Overrides values in `build.gradle` file of generated android based project" - }, - "app_build_gradle": { - "type": "object", - "properties": { - "apply": { - "type": "array", - "items": { - "type": "string" - } - }, - "defaultConfig": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildTypes": { - "type": "object", - "properties": { - "debug": { - "type": "array", - "items": { - "type": "string" - } - }, - "release": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "afterEvaluate": { - "type": "array", - "items": { - "type": "string" - } - }, - "implementations": { - "type": "array", - "items": { - "type": "string" - } - }, - "implementation": { - "type": "string" - } - }, - "required": [ - "apply", - "defaultConfig" - ], - "additionalProperties": false, - "description": "Overrides values in `app/build.gradle` file of generated android based project" - }, - "AndroidManifest_xml": { - "type": "object", - "properties": { - "tag": { - "type": "string" - }, - "android:name": { - "type": "string" - }, - "android:required": { - "type": "boolean" - }, - "package": { - "type": "string" - }, - "children": { - "type": "array", - "items": { - "type": "object", - "properties": { - "tag": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/tag" - }, - "android:name": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/android:name" - }, - "android:required": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/android:required" - }, - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/children/items" - } - } - }, - "required": [ - "tag", - "android:name", - "children" - ], - "additionalProperties": false - } - } - }, - "required": [ - "tag", - "android:name", - "children" - ], - "additionalProperties": false, - "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " - }, - "strings_xml": { - "type": "object", - "properties": { - "children": { - "type": "array", - "items": { - "type": "object", - "properties": { - "tag": { - "type": "string" - }, - "name": { - "type": "string" - }, - "child_value": { - "type": "string" - } - }, - "required": [ - "tag", - "name", - "child_value" - ], - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "MainActivity_kt": { - "type": "object", - "properties": { - "onCreate": { - "type": "string", - "default": "super.onCreate(savedInstanceState)", - "description": "Overrides super.onCreate method handler of MainActivity.java" - }, - "imports": { - "type": "array", - "items": { - "type": "string" - } - }, - "methods": { - "type": "array", - "items": { - "type": "string" - } - }, - "createMethods": { - "type": "array", - "items": { - "type": "string" - } - }, - "resultMethods": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "MainApplication_kt": { - "type": "object", - "properties": { - "imports": { - "type": "array", - "items": { - "type": "string" - } - }, - "methods": { - "type": "array", - "items": { - "type": "string" - } - }, - "createMethods": { - "type": "array", - "items": { - "type": "string" - } - }, - "packages": { - "type": "array", - "items": { - "type": "string" - } - }, - "packageParams": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false, - "description": "Allows you to configure behaviour of MainActivity" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "androidtv": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android" - }, - "androidwear": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android" - }, - "firetv": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android" - }, - "ios": { - "type": "object", - "properties": { - "disabled": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/disabled" - }, - "forceLinking": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/forceLinking" - }, - "path": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/path" - }, - "git": { - "type": "string", - "description": "Alternative git url for pod instead of version" - }, - "commit": { - "type": "string", - "description": "Alternative git commit reference string" - }, - "version": { - "type": "string", - "description": "Version of pod" - }, - "podNames": { - "type": "array", - "items": { - "type": "string" - } - }, - "podName": { - "type": "string" - }, - "staticFrameworks": { - "type": "array", - "items": { - "type": "string" - } - }, - "templateXcode": { - "type": "object", - "properties": { - "Podfile": { - "type": "object", - "properties": { - "injectLines": { - "type": "array", - "items": { - "type": "string" - } - }, - "post_install": { - "type": "array", - "items": { - "type": "string" - } - }, - "sources": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of URLs that will be injected on top of the Podfile as sources" - }, - "podDependencies": { - "type": "array", - "items": { - "type": "string" - } - }, - "staticPods": { - "type": "array", - "items": { - "type": "string" - } - }, - "header": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of strings that will be injected on top of the Podfile" - } - }, - "additionalProperties": false, - "description": "Allows to manipulate Podfile" - }, - "project_pbxproj": { - "type": "object", - "properties": { - "sourceFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "resourceFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "headerFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildPhases": { - "type": "array", - "items": { - "type": "object", - "properties": { - "shellPath": { - "type": "string" - }, - "shellScript": { - "type": "string" - }, - "inputPaths": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "shellPath", - "shellScript", - "inputPaths" - ], - "additionalProperties": false - } - }, - "frameworks": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "AppDelegate_mm": { - "type": "object", - "properties": { - "appDelegateMethods": { - "type": "object", - "properties": { - "application": { - "type": "object", - "properties": { - "didFinishLaunchingWithOptions": { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "order": { - "type": "number" - }, - "value": { - "type": "string" - }, - "weight": { - "type": "number" - } - }, - "required": [ - "order", - "value", - "weight" - ], - "additionalProperties": false - } - ] - } - }, - "applicationDidBecomeActive": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "open": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "supportedInterfaceOrientationsFor": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceiveRemoteNotification": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didFailToRegisterForRemoteNotificationsWithError": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceive": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didRegister": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didRegisterForRemoteNotificationsWithDeviceToken": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "continue": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didConnectCarInterfaceController": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didDisconnectCarInterfaceController": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - } - }, - "additionalProperties": false - }, - "userNotificationCenter": { - "type": "object", - "properties": { - "willPresent": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceiveNotificationResponse": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "appDelegateImports": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "AppDelegate_h": { - "type": "object", - "properties": { - "appDelegateImports": { - "type": "array", - "items": { - "type": "string" - } - }, - "appDelegateExtensions": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "Info_plist": { - "type": "object", - "properties": {}, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "isStatic": { - "type": "boolean" - }, - "buildType": { - "type": "string", - "enum": [ - "dynamic", - "static" - ], - "description": "Build type of the pod" - } - }, - "additionalProperties": false - }, - "tvos": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/ios" - }, - "tizen": { - "type": "object", - "properties": { - "disabled": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/disabled" - }, - "forceLinking": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/forceLinking" - }, - "path": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/android/properties/path" - } - }, - "additionalProperties": false - }, - "tizenmobile": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "tizenwatch": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "webos": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "web": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "webtv": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "chromecast": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "kaios": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "macos": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "linux": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "windows": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - }, - "xbox": { - "$ref": "#/definitions/rnv.plugins/properties/pluginTemplates/additionalProperties/properties/tizen" - } - }, - "additionalProperties": false - }, - "description": "Define all plugins available to be merged with project plugins" - }, - "disableRnvDefaultOverrides": { - "type": "boolean", - "description": "Disables default rnv scope plugin overrides and merges. Useful if you want to test entirely clean plugin template list" - }, - "$schema": { - "type": "string", - "description": "schema definition" - } - }, - "required": [ - "pluginTemplates" - ], - "additionalProperties": false - } - }, - "$schema": "http://json-schema.org/draft-04/schema#" -} \ No newline at end of file diff --git a/packages/core/jsonSchema/rnv.private.json b/packages/core/jsonSchema/rnv.private.json index a5551972c5..f629a00d8f 100644 --- a/packages/core/jsonSchema/rnv.private.json +++ b/packages/core/jsonSchema/rnv.private.json @@ -1,6 +1,3296 @@ { "$ref": "#/definitions/rnv.private", "definitions": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { + "type": "string", + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "type": "object", + "properties": { + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } + ] + } + } + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] + }, + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } + }, + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "isStatic": { + "type": "boolean" + }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" + }, + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, "rnv.private": { "type": "object", "properties": { @@ -43,11 +3333,7 @@ "firetv": { "$ref": "#/definitions/rnv.private/properties/platforms/properties/android" }, - "ios": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, + "ios": {}, "tvos": { "$ref": "#/definitions/rnv.private/properties/platforms/properties/ios" }, diff --git a/packages/core/jsonSchema/rnv.project.json b/packages/core/jsonSchema/rnv.project.json index 8865bd7552..e3a42d9ad7 100644 --- a/packages/core/jsonSchema/rnv.project.json +++ b/packages/core/jsonSchema/rnv.project.json @@ -1,4029 +1,3684 @@ { "$ref": "#/definitions/rnv.project", "definitions": { - "rnv.project": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { "type": "object", "properties": { - "workspaceID": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { "type": "string", - "description": "Workspace ID your project belongs to. This will mach same folder name in the root of your user directory. ie `~/` on macOS" + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" }, - "projectVersion": { + "version": { "type": "string" }, - "projectName": { - "type": "string", - "description": "Name of the project which will be used in workspace as folder name. this will also be used as part of the KEY in crypto env var generator" + "disabled": { + "type": "boolean" }, - "isMonorepo": { - "type": "boolean", - "description": "Mark if your project is part of monorepo" + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" }, - "useTemplate": { + "renative_json": { "type": "object", "properties": { - "name": { + "$schema": { "type": "string" }, - "version": { + "extendsTemplate": { "type": "string" - }, - "excludedPaths": { - "type": "array", - "items": { - "type": "string" - } } }, - "required": [ - "name", - "version" - ], "additionalProperties": false }, - "isTemplate": { - "type": "boolean" - }, - "defaults": { + "package_json": { "type": "object", "properties": { - "ports": { - "type": "object", - "additionalProperties": { - "type": "number" - }, - "propertyNames": { - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" - ] - }, - "description": "Allows you to assign custom port per each supported platform specific to this project. this is useful if you foten switch between multiple projects and do not want to experience constant port conflicts" + "dependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "supportedPlatforms": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" - ] - }, - "description": "Array list of all supported platforms in current project" + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "portOffset": { - "type": "number", - "description": "Offset each port default value by increment" + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "defaultCommandSchemes": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "run", - "export", - "build" - ] - }, - "description": "List of default schemes for each rnv command. This is useful if you want to avoid specifying `-s ...` every time your run rnv command. bu default rnv uses `-s debug`. NOTE: you can only use schemes you defined in `buildSchemes`" + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "targets": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" - ] - }, - "description": "Override of default targets specific to this project" + "name": { + "type": "string" + }, + "version": { + "type": "string" } }, - "additionalProperties": false, - "description": "Default system config for this project" + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } }, - "pipes": { + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { "type": "array", "items": { "type": "string" }, - "description": "To avoid rnv building `buildHooks/src` every time you can specify which specific pipes should trigger recompile of buildHooks" + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" }, - "templates": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "version": { - "type": "string" - } - }, - "required": [ - "version" - ], - "additionalProperties": false + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" }, - "description": "Stores installed templates info in your project.\n\nNOTE: This prop will be updated by rnv if you run `rnv template install`" + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" }, - "currentTemplate": { + "id": { "type": "string", - "description": "Currently active template used in this project. this allows you to re-bootstrap whole project by running `rnv template apply`" + "description": "Bundle ID of application. ie: com.example.myapp" }, - "crypto": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "Relative path to encrypted file in your renative project. Example: \"./secrets/mySecrets.enc\"" - }, - "isOptional": { - "type": "boolean", - "description": "Mark if crypto object should not checked every run" - } + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" }, - "required": [ - "path" - ], - "additionalProperties": false, - "description": "This prop enables automatic encrypt and decrypt of sensitive information in your project. \nRNV will generate new env variable with can be used to encrypt and decrypt. this env var is generated by combining (and sanitizing) 2 properties from your renative.json: \nworkspaceID + projectName.\nThese 2 properties are also used to generate path on your local machine where encrypted files will be decrypted into." + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" }, - "paths": { - "type": "object", - "properties": { - "appConfigsDir": { - "type": "string", - "description": "Custom path to appConfigs. defaults to `./appConfigs`" - }, - "platformTemplatesDirs": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" - ] - }, - "description": "Custom location of ejected platform templates. this is populated after you run `rnv platform eject`" - }, - "appConfigsDirs": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of custom location app configs directories`" - }, - "platformAssetsDir": { - "type": "string", - "description": "Custom path to platformAssets folder. defaults to `./platformAssets`" - }, - "platformBuildsDir": { - "type": "string", - "description": "Custom path to platformBuilds folder. defaults to `./platformBuilds`" - }, - "pluginTemplates": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "npm": { - "type": "string" - }, - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "description": "\n Allows you to define custom plugin template scopes. default scope for all plugins is `rnv`.\n this custom scope can then be used by plugin via `\"source:myCustomScope\"` value\n \n those will allow you to use direct pointer to preconfigured plugin:\n \n ```\n \"plugin-name\": \"source:myCustomScope\"\n ```\n \n NOTE: by default every plugin you define with scope will also merge any\n files defined in overrides automatically to your project.\n To skip file overrides coming from source plugin you need to detach it from the scope:\n \n ```\n {\n \"plugins\": {\n \"plugin-name\": {\n \"source\": \"\"\n }\n }\n }\n ```\n " - } + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" }, - "additionalProperties": false, - "description": "Define custom paths for RNV to look into" + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" }, - "permissions": { + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { "type": "object", - "properties": { - "android": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "security": { - "type": "string" - } - }, - "required": [ - "key", - "security" - ], - "additionalProperties": false + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" }, - "description": "Android SDK specific permissions" - }, - "ios": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "desc": { - "type": "string" - } - }, - "required": [ - "desc" - ], - "additionalProperties": false + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" }, - "description": "iOS SDK specific permissions" - } - }, - "additionalProperties": false, - "description": "Permission definititions which can be used by app configs via `includedPermissions` and `excludedPermissions` to customize permissions for each app" + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" }, - "engines": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { "type": "object", "additionalProperties": { - "type": "string", - "const": "source:rnv" + "type": "string" }, - "description": "List of engines available in this project" - }, - "custom": { - "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + "description": "Custom props passed to plugin" }, - "enableHookRebuild": { - "type": "boolean", - "description": "If set to true in `./renative.json` build hooks will be compiled at each rnv command run. If set to `false` (default) rebuild will be triggered only if `dist` folder is missing, `-r` has been passed or you run `rnv hooks run` directly making your rnv commands faster" + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" }, - "monoRoot": { + "deprecated": { "type": "string", - "description": "Define custom path to monorepo root where starting point is project directory" + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" }, - "extendsTemplate": { + "source": { "type": "string", - "description": "You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`" + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" }, - "tasks": { + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { "type": "object", "properties": { - "install": { - "type": "object", - "properties": { - "script": { - "type": "string" + "modulePaths": { + "anyOf": [ + { + "type": "boolean" }, - "platform": { + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { "type": "object", "additionalProperties": { - "type": "object", - "properties": { - "ignore": { - "type": "boolean" + "anyOf": [ + { + "type": "string" }, - "ignoreTasks": { - "type": "array", - "items": { - "type": "string" - } + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false } - }, - "additionalProperties": false - }, - "propertyNames": { - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" ] } } - }, - "required": [ - "script" - ], - "additionalProperties": false + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } } }, "additionalProperties": false, - "description": "Allows to override specific task within renative toolchain. (currently only `install` supported). this is useful if you want to change specific behaviour of built-in task. ie install task triggers yarn/npm install by default. but that might not be desirable installation trigger" - }, - "integrations": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "description": "Object containing integration configurations where key represents package name" + "description": "Allows you to configure webpack bahaviour per each individual plugin" }, - "env": { - "type": "object", - "additionalProperties": {}, - "description": "Object containing injected env variables" + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" }, - "runtime": { - "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + "fontSources": { + "type": "array", + "items": { + "type": "string" + } }, - "templateConfig": { + "android": { "type": "object", "properties": { "disabled": { - "type": "boolean" + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" }, - "includedPaths": { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] }, - { - "type": "object", - "properties": { - "paths": { - "type": "array", - "items": { - "type": "string" + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" } }, - "engines": { - "type": "array", - "items": { - "type": "string" + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" } }, - "required": [ - "paths" - ], - "additionalProperties": false - } - ] - }, - "description": "Defines list of all file/dir paths you want to include in template" - }, - "renative_json": { - "type": "object", - "properties": { - "$schema": { - "type": "string" + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" }, - "extendsTemplate": { - "type": "string" - } - }, - "additionalProperties": true - }, - "package_json": { - "type": "object", - "properties": { - "dependencies": { + "app_build_gradle": { "type": "object", - "additionalProperties": { - "type": "string" - } + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" }, - "devDependencies": { - "$ref": "#/definitions/rnv.project/properties/templateConfig/properties/package_json/properties/dependencies" + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " }, - "peerDependencies": { - "$ref": "#/definitions/rnv.project/properties/templateConfig/properties/package_json/properties/dependencies" + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false }, - "optionalDependencies": { - "$ref": "#/definitions/rnv.project/properties/templateConfig/properties/package_json/properties/dependencies" + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false }, - "name": { - "type": "string" + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" }, - "version": { - "type": "string" - } - }, - "additionalProperties": true - } - }, - "additionalProperties": false, - "description": "Used in `renative.template.json` allows you to define template behaviour." - }, - "skipAutoUpdate": { - "type": "boolean", - "description": "Enables the equivalent to passing --skipDependencyCheck parameter on every rnv run so you don't have to use it" - }, - "isNew": { - "type": "boolean", - "description": "Marker indicating that this project has just been bootstrapped. this prop is managed by rnv" - }, - "common": { - "type": "object", - "properties": { - "includedPermissions": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" - }, - "excludedPermissions": { - "type": "array", - "items": { - "type": "string" + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } }, - "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" - }, - "id": { - "type": "string", - "description": "Bundle ID of application. ie: com.example.myapp" + "additionalProperties": false }, - "idSuffix": { + "projectName": { "type": "string" }, - "version": { - "type": "string", - "description": "Semver style version of your app" + "skipLinking": { + "type": "boolean" }, - "versionCode": { - "type": "string", - "description": "Manual verride of generated version code" + "skipImplementation": { + "type": "boolean" }, - "versionFormat": { - "type": "string", - "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n\nIf you do not define versionFormat, no formatting will apply to version.\n\n\"versionFormat\" : \"0.0.0\"\n\nIN: 1.2.3-rc.4+build.56 OUT: 1.2.3\n\nIN: 1.2.3 OUT: 1.2.3\n\n\n\n\"versionFormat\" : \"0.0.0.0.0\"\n\nIN: 1.2.3-rc.4+build.56 OUT: 1.2.3.4.56\n\nIN: 1.2.3 OUT: 1.2.3\n\n\"versionFormat\" : \"0.0.0.x.x.x.x\"\n\nIN: 1.2.3-rc.4+build.56 OUT: 1.2.3.rc.4.build.56\n\nIN: 1.2.3 OUT: 1.2.3\n\n" + "implementation": { + "type": "string" }, - "versionCodeFormat": { - "type": "string", - "description": "Allows you to fine-tune auto generated version codes.\n\nVersion code is autogenerated from app version defined in package.json or renative.json.\n\nNOTE: If you define versionCode manually this formatting will not apply.\n\nEXAMPLE 1:\n\ndefault value: 00.00.00\n\nIN: 1.2.3-rc.4+build.56 OUT: 102030456\n\nIN: 1.2.3 OUT: 10203\n\nEXAMPLE 2:\n\n\"versionCodeFormat\" : \"00.00.00.00.00\"\n\nIN: 1.2.3-rc.4+build.56 OUT: 102030456\n\nIN: 1.2.3 OUT: 102030000\n\nEXAMPLE 3:\n\n\"versionCodeFormat\" : \"00.00.00.0000\"\n\nIN: 1.0.23-rc.15 OUT: 100230015\n\nIN: 1.0.23 OUT: 100230000\n\n" + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" }, - "versionCodeOffset": { - "type": "number" + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" }, - "title": { - "type": "string", - "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" }, - "description": { - "type": "string", - "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false }, - "author": { + "git": { "type": "string", - "description": "Author name" + "description": "Alternative git url for pod instead of version" }, - "license": { + "commit": { "type": "string", - "description": "Injects license information into app" - }, - "includedFonts": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + "description": "Alternative git commit reference string" }, - "backgroundColor": { + "version": { "type": "string", - "minLength": 4, - "maxLength": 9, - "pattern": "^#", - "description": "Defines root view backgroundColor for all platforms in HEX format" - }, - "splashScreen": { - "type": "boolean", - "description": "Enable or disable splash screen" + "description": "Version of pod" }, - "fontSources": { + "podNames": { "type": "array", "items": { "type": "string" - }, - "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + } }, - "assetSources": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + "podName": { + "type": "string" }, - "includedPlugins": { + "staticFrameworks": { "type": "array", "items": { "type": "string" - }, - "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + } }, - "excludedPlugins": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/custom" + "isStatic": { + "type": "boolean" }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { "buildSchemes": { "type": "object", "additionalProperties": { "type": "object", "properties": { "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" }, "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" }, "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" }, "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" }, "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" }, "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" }, "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" }, "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" }, "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" }, "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" }, "description": { - "type": "string", - "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" }, "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" }, "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" }, "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" }, "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" }, "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" }, "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" }, "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" }, "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" }, "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" }, "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" }, "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "enabled": { - "type": "boolean", - "description": "Defines whether build scheme shows up in options to run" + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" }, "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/defaults/properties/supportedPlatforms/items" + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" }, "assetFolderPlatform": { - "type": "string", - "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" }, "engine": { - "type": "string", - "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" }, "entryFile": { - "type": "string", - "default": "index", - "description": "Alternative name of the entry file without `.js` extension" + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" }, "bundleAssets": { - "type": "boolean", - "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" }, "enableSourceMaps": { - "type": "boolean", - "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" }, "bundleIsDev": { - "type": "boolean", - "description": "If set to `true` debug build will be generated" + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" }, "getJsBundleFile": { - "type": "string" + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" } }, "additionalProperties": false } } }, - "additionalProperties": false, - "description": "Common config props used as default props for all available buildSchemes" + "required": [ + "buildSchemes" + ], + "additionalProperties": false }, - "platforms": { + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { "type": "object", "properties": { - "android": { + "buildSchemes": { "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "enableAndroidX": { - "type": [ - "boolean", - "string" - ], - "default": true, - "description": "Enables new android X architecture" - }, - "enableJetifier": { - "type": [ - "boolean", - "string" - ], - "default": true, - "description": "Enables Jetifier" - }, - "signingConfig": { - "type": "string", - "default": "Debug", - "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" - }, - "minSdkVersion": { - "type": "number", - "default": 28, - "description": "Minimum Android SDK version device has to have in order for app to run" - }, - "multipleAPKs": { - "type": "boolean", - "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" - }, - "aab": { - "type": "boolean", - "description": "If set to true, android project will generate app.aab instead of apk" - }, - "extraGradleParams": { - "type": "string", - "description": "Allows passing extra params to gradle command" - }, - "minifyEnabled": { - "type": "boolean", - "description": "Sets minifyEnabled buildType property in app/build.gradle" - }, - "targetSdkVersion": { - "type": "number", - "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" - }, - "compileSdkVersion": { - "type": "number", - "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" - }, - "kotlinVersion": { - "type": "string", - "default": "1.7.10", - "description": "Allows you define custom kotlin version" - }, - "ndkVersion": { - "type": "string", - "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" - }, - "supportLibVersion": { - "type": "string", - "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" - }, - "googleServicesVersion": { - "type": "string", - "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" - }, - "gradleBuildToolsVersion": { - "type": "string", - "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" - }, - "gradleWrapperVersion": { - "type": "string", - "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" - }, - "excludedFeatures": { - "type": "array", - "items": { - "type": "string" + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" }, - "description": "Override features definitions in AndroidManifest.xml by exclusion" - }, - "includedFeatures": { - "type": "array", - "items": { - "type": "string" + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" }, - "description": "Override features definitions in AndroidManifest.xml by inclusion" - }, - "buildToolsVersion": { - "type": "string", - "default": "34.0.0", - "description": "Override android build tools version" - }, - "disableSigning": { - "type": "boolean" - }, - "storeFile": { - "type": "string", - "description": "Name of the store file in android project" - }, - "keyAlias": { - "type": "string", - "description": "Key alias of the store file in android project" - }, - "newArchEnabled": { - "type": "boolean", - "description": "Enables new arch for android. Default: false" - }, - "reactNativeEngine": { - "type": "string", - "enum": [ - "jsc", - "v8-android", - "v8-android-nointl", - "v8-android-jit", - "v8-android-jit-nointl", - "hermes" - ], - "default": "hermes", - "description": "Allows you to define specific native render engine to be used" - }, - "templateAndroid": { - "type": "object", - "properties": { - "gradle_properties": { - "type": "object", - "additionalProperties": { - "type": [ - "string", - "boolean", - "number" - ] - }, - "description": "Overrides values in `gradle.properties` file of generated android based project" - }, - "build_gradle": { - "type": "object", - "properties": { - "allprojects": { - "type": "object", - "properties": { - "repositories": { - "type": "object", - "additionalProperties": { - "type": "boolean" - }, - "description": "Customize repositories section of build.gradle" - } - }, - "required": [ - "repositories" - ], - "additionalProperties": false - }, - "plugins": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildscript": { - "type": "object", - "properties": { - "repositories": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "dependencies": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - } - }, - "required": [ - "repositories", - "dependencies" - ], - "additionalProperties": false - }, - "dexOptions": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "injectAfterAll": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "allprojects", - "plugins", - "buildscript", - "dexOptions", - "injectAfterAll" - ], - "additionalProperties": false, - "description": "Overrides values in `build.gradle` file of generated android based project" - }, - "app_build_gradle": { - "type": "object", - "properties": { - "apply": { - "type": "array", - "items": { - "type": "string" - } - }, - "defaultConfig": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildTypes": { - "type": "object", - "properties": { - "debug": { - "type": "array", - "items": { - "type": "string" - } - }, - "release": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "afterEvaluate": { - "type": "array", - "items": { - "type": "string" - } - }, - "implementations": { - "type": "array", - "items": { - "type": "string" - } - }, - "implementation": { + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { "type": "string" } }, - "required": [ - "apply", - "defaultConfig" - ], - "additionalProperties": false, - "description": "Overrides values in `app/build.gradle` file of generated android based project" - }, - "AndroidManifest_xml": { - "type": "object", - "properties": { - "tag": { - "type": "string" - }, - "android:name": { - "type": "string" - }, - "android:required": { - "type": "boolean" - }, - "package": { + "tab": { + "type": "array", + "items": { "type": "string" - }, - "children": { - "type": "array", - "items": { - "type": "object", - "properties": { - "tag": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/tag" - }, - "android:name": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/android:name" - }, - "android:required": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/android:required" - }, - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml/properties/children/items" - } - } - }, - "required": [ - "tag", - "android:name", - "children" - ], - "additionalProperties": false - } - } - }, - "required": [ - "tag", - "android:name", - "children" - ], - "additionalProperties": false, - "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " - }, - "strings_xml": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "MainActivity_kt": { - "type": "object", - "properties": { - "onCreate": { - "type": "string", - "default": "super.onCreate(savedInstanceState)", - "description": "Overrides super.onCreate method handler of MainActivity.java" - }, - "imports": { - "type": "array", - "items": { - "type": "string" - } - }, - "methods": { - "type": "array", - "items": { - "type": "string" - } - }, - "createMethods": { - "type": "array", - "items": { - "type": "string" - } - }, - "resultMethods": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "MainApplication_kt": { - "type": "object", - "properties": { - "imports": { - "type": "array", - "items": { - "type": "string" - } - }, - "methods": { - "type": "array", - "items": { - "type": "string" - } - }, - "createMethods": { - "type": "array", - "items": { - "type": "string" - } - }, - "packages": { - "type": "array", - "items": { - "type": "string" - } - }, - "packageParams": { - "type": "array", - "items": { - "type": "string" - } } - }, - "additionalProperties": false, - "description": "Allows you to configure behaviour of MainActivity" - }, - "settings_gradle": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "gradle_wrapper_properties": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "SplashActivity_java": { - "type": "object", - "properties": {}, - "additionalProperties": false + } }, - "styles_xml": { - "type": "object", - "properties": {}, - "additionalProperties": false + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" }, - "colors_xml": { - "type": "object", - "properties": {}, - "additionalProperties": false + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" }, - "proguard_rules_pro": { - "type": "object", - "properties": {}, - "additionalProperties": false + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" } }, - "additionalProperties": false - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "enableAndroidX": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/enableAndroidX" - }, - "enableJetifier": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/enableJetifier" - }, - "signingConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/signingConfig" - }, - "minSdkVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/minSdkVersion" - }, - "multipleAPKs": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/multipleAPKs" - }, - "aab": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/aab" - }, - "extraGradleParams": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/extraGradleParams" - }, - "minifyEnabled": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/minifyEnabled" - }, - "targetSdkVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/targetSdkVersion" - }, - "compileSdkVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/compileSdkVersion" - }, - "kotlinVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/kotlinVersion" - }, - "ndkVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/ndkVersion" - }, - "supportLibVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/supportLibVersion" - }, - "googleServicesVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/googleServicesVersion" - }, - "gradleBuildToolsVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/gradleBuildToolsVersion" - }, - "gradleWrapperVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/gradleWrapperVersion" - }, - "excludedFeatures": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/excludedFeatures" - }, - "includedFeatures": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/includedFeatures" + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" }, - "buildToolsVersion": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/buildToolsVersion" + "teamID": { + "type": "string" }, - "disableSigning": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/disableSigning" + "uploadBitcode": { + "type": "boolean" }, - "storeFile": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/storeFile" + "compileBitcode": { + "type": "boolean" }, - "keyAlias": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/keyAlias" + "uploadSymbols": { + "type": "boolean" }, - "newArchEnabled": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/newArchEnabled" + "signingStyle": { + "type": "string" }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/reactNativeEngine" + "signingCertificate": { + "type": "string" }, - "templateAndroid": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid" + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" - }, - "androidtv": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android" - }, - "androidwear": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android" - }, - "firetv": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android" - }, - "ios": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "ignoreWarnings": { - "type": "boolean", - "description": "Injects `inhibit_all_warnings` into Podfile" - }, - "ignoreLogs": { - "type": "boolean", - "description": "Passes `-quiet` to xcodebuild command" - }, - "deploymentTarget": { - "type": "string", - "description": "Deployment target for xcodepoj" - }, - "orientationSupport": { - "type": "object", - "properties": { - "phone": { - "type": "array", - "items": { - "type": "string" - } - }, - "tab": { - "type": "array", - "items": { - "type": "string" - } - } + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" }, - "additionalProperties": false - }, - "teamID": { - "type": "string", - "description": "Apple teamID" - }, - "excludedArchs": { - "type": "array", - "items": { + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { "type": "string" }, - "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" - }, - "urlScheme": { - "type": "string", - "description": "URL Scheme for the app used for deeplinking" - }, - "teamIdentifier": { - "type": "string", - "description": "Apple developer team ID" - }, - "scheme": { - "type": "string" - }, - "schemeTarget": { - "type": "string" - }, - "appleId": { - "type": "string" - }, - "provisioningStyle": { - "type": "string" - }, - "newArchEnabled": { - "type": "boolean", - "description": "Enables new archs for iOS. Default: false" - }, - "codeSignIdentity": { - "type": "string", - "description": "Special property which tells Xcode how to build your project" - }, - "commandLineArguments": { - "type": "array", - "items": { + "certificateProfile": { "type": "string" }, - "description": "Allows you to pass launch arguments to active scheme" - }, - "provisionProfileSpecifier": { - "type": "string" - }, - "provisionProfileSpecifiers": { - "type": "object", - "additionalProperties": { + "appName": { "type": "string" - } - }, - "allowProvisioningUpdates": { - "type": "boolean" - }, - "provisioningProfiles": { - "type": "object", - "additionalProperties": { + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { "type": "string" - } - }, - "codeSignIdentities": { - "type": "object", - "additionalProperties": { + }, + "environment": { "type": "string" - } - }, - "systemCapabilities": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "entitlements": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "runScheme": { - "type": "string" - }, - "sdk": { - "type": "string" - }, - "testFlightId": { - "type": "string" - }, - "firebaseId": { - "type": "string" - }, - "exportOptions": { - "type": "object", - "properties": { - "method": { - "type": "string" - }, - "teamID": { - "type": "string" - }, - "uploadBitcode": { - "type": "boolean" - }, - "compileBitcode": { - "type": "boolean" - }, - "uploadSymbols": { - "type": "boolean" - }, - "signingStyle": { - "type": "string" - }, - "signingCertificate": { - "type": "string" - }, - "provisioningProfiles": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateXcode": { - "type": "object", - "properties": { - "Podfile": { - "type": "object", - "properties": { - "injectLines": { - "type": "array", - "items": { - "type": "string" - } - }, - "post_install": { - "type": "array", - "items": { - "type": "string" - } - }, - "sources": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of URLs that will be injected on top of the Podfile as sources" - }, - "podDependencies": { - "type": "array", - "items": { - "type": "string" - } - }, - "staticPods": { - "type": "array", - "items": { - "type": "string" - } - }, - "header": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of strings that will be injected on top of the Podfile" - } - }, - "additionalProperties": false, - "description": "Allows to manipulate Podfile" - }, - "project_pbxproj": { - "type": "object", - "properties": { - "sourceFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "resourceFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "headerFiles": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildPhases": { - "type": "array", - "items": { - "type": "object", - "properties": { - "shellPath": { - "type": "string" - }, - "shellScript": { - "type": "string" - }, - "inputPaths": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "shellPath", - "shellScript", - "inputPaths" - ], - "additionalProperties": false - } - }, - "frameworks": { - "type": "array", - "items": { - "type": "string" - } - }, - "buildSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "AppDelegate_mm": { - "type": "object", - "properties": { - "appDelegateMethods": { - "type": "object", - "properties": { - "application": { - "type": "object", - "properties": { - "didFinishLaunchingWithOptions": { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "order": { - "type": "number" - }, - "value": { - "type": "string" - }, - "weight": { - "type": "number" - } - }, - "required": [ - "order", - "value", - "weight" - ], - "additionalProperties": false - } - ] - } - }, - "applicationDidBecomeActive": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "open": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "supportedInterfaceOrientationsFor": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceiveRemoteNotification": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didFailToRegisterForRemoteNotificationsWithError": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceive": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didRegister": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didRegisterForRemoteNotificationsWithDeviceToken": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "continue": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didConnectCarInterfaceController": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didDisconnectCarInterfaceController": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - } - }, - "additionalProperties": false - }, - "userNotificationCenter": { - "type": "object", - "properties": { - "willPresent": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - }, - "didReceiveNotificationResponse": { - "type": "array", - "items": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm/properties/appDelegateMethods/properties/application/properties/didFinishLaunchingWithOptions/items" - } - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "appDelegateImports": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "AppDelegate_h": { - "type": "object", - "properties": { - "appDelegateImports": { - "type": "array", - "items": { - "type": "string" - } - }, - "appDelegateExtensions": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "Info_plist": { - "type": "object", - "properties": {}, - "additionalProperties": false - } }, - "additionalProperties": false - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { + "webpackConfig": { "type": "object", "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "ignoreWarnings": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/ignoreWarnings" - }, - "ignoreLogs": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/ignoreLogs" - }, - "deploymentTarget": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/deploymentTarget" - }, - "orientationSupport": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/orientationSupport" - }, - "teamID": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/teamID" - }, - "excludedArchs": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/excludedArchs" - }, - "urlScheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/urlScheme" - }, - "teamIdentifier": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/teamIdentifier" - }, - "scheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/scheme" - }, - "schemeTarget": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/schemeTarget" - }, - "appleId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/appleId" - }, - "provisioningStyle": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisioningStyle" - }, - "newArchEnabled": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/newArchEnabled" - }, - "codeSignIdentity": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/codeSignIdentity" - }, - "commandLineArguments": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/commandLineArguments" - }, - "provisionProfileSpecifier": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisionProfileSpecifier" - }, - "provisionProfileSpecifiers": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisionProfileSpecifiers" - }, - "allowProvisioningUpdates": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/allowProvisioningUpdates" - }, - "provisioningProfiles": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisioningProfiles" - }, - "codeSignIdentities": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/codeSignIdentities" - }, - "systemCapabilities": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/systemCapabilities" - }, - "entitlements": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/entitlements" - }, - "runScheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/runScheme" - }, - "sdk": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/sdk" - }, - "testFlightId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/testFlightId" - }, - "firebaseId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/firebaseId" - }, - "exportOptions": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/exportOptions" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/reactNativeEngine" + "publicUrl": { + "type": "string" }, - "templateXcode": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode" + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" } }, "additionalProperties": false } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" - }, - "tvos": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios" - }, - "tizen": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "package": { - "type": "string" }, - "certificateProfile": { - "type": "string" - }, - "appName": { - "type": "string" - }, - "timestampBuildFiles": { - "type": "array", - "items": { + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" } }, - "devServerHost": { - "type": "string" - }, - "environment": { - "type": "string" - }, - "webpackConfig": { - "type": "object", - "properties": { - "publicUrl": { + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { "type": "string" - }, - "customScripts": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Allows you to inject custom script into html header" } }, - "additionalProperties": false - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "package": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/package" - }, - "certificateProfile": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/certificateProfile" - }, - "appName": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/appName" - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/environment" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/webpackConfig" - } - }, - "additionalProperties": false + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" - }, - "tizenmobile": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen" - }, - "tizenwatch": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen" - }, - "webos": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/environment" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/webpackConfig" - }, - "iconColor": { - "type": "string" - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { "type": "object", "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" + "width": { + "type": "number" }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" + "height": { + "type": "number" }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" + "arch": { + "type": "string", + "description": "Specification of targeted architecture" }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" + "experimentalNuGetDependency": { + "type": "boolean" }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" + "useWinUI3": { + "type": "boolean" }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" + "nuGetTestVersion": { + "type": "string" }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" + "reactNativeEngine": { + "type": "string" }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" + "nuGetTestFeed": { + "type": "string" }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" + "emulator": { + "type": "boolean" }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" + "device": { + "type": "boolean" }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" + "target": { + "type": "string" }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" + "remoteDebugging": { + "type": "boolean" }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" + "packager": { + "type": "boolean" }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" + "bundle": { + "type": "boolean" }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + "build": { + "type": "boolean", + "description": "Builds the application before launching it" }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/timestampBuildFiles" + "directDebugging": { + "type": "boolean" }, - "devServerHost": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/devServerHost" + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" }, - "environment": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/environment" + "devPort": { + "type": "string" }, - "webpackConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/webpackConfig" + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} }, - "iconColor": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/webos/properties/iconColor" + "packageExtension": { + "type": "string" } }, "additionalProperties": false } - } - }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" - }, - "web": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/webpackConfig" - }, - "pagesDir": { - "type": "string", - "description": "Custom pages directory used by nextjs. Use relative paths" - }, - "outputDir": { - "type": "string", - "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" - }, - "exportDir": { - "type": "string", - "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" - }, - "nextTranspileModules": { - "type": "array", - "items": { - "type": "string" - } - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/environment" - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "webpackConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/webpackConfig" - }, - "pagesDir": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/web/properties/pagesDir" - }, - "outputDir": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/web/properties/outputDir" - }, - "exportDir": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/web/properties/exportDir" - }, - "nextTranspileModules": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/web/properties/nextTranspileModules" - }, - "timestampBuildFiles": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/timestampBuildFiles" - }, - "devServerHost": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/devServerHost" - }, - "environment": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/tizen/properties/environment" - } - }, - "additionalProperties": false - } - } + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, + "rnv.project": { + "type": "object", + "properties": { + "workspaceID": { + "type": "string", + "description": "Workspace ID your project belongs to. This will mach same folder name in the root of your user directory. ie `~/` on macOS" + }, + "projectVersion": { + "type": "string", + "description": "Version of project" + }, + "projectName": { + "type": "string", + "description": "Name of the project which will be used in workspace as folder name. this will also be used as part of the KEY in crypto env var generator" + }, + "isTemplate": { + "type": "boolean", + "description": "Marks project as template. This disables certain user checks like version mismatch etc" + }, + "defaults": { + "type": "object", + "properties": { + "ports": { + "type": "object", + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" + "description": "Allows you to assign custom port per each supported platform specific to this project. this is useful if you foten switch between multiple projects and do not want to experience constant port conflicts" }, - "webtv": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/web" + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" }, - "chromecast": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/web" + "portOffset": { + "type": "number", + "description": "Offset each port default value by increment" }, - "kaios": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/web" + "defaultCommandSchemes": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "run", + "export", + "build" + ] + }, + "description": "List of default schemes for each rnv command. This is useful if you want to avoid specifying `-s ...` every time your run rnv command. bu default rnv uses `-s debug`. NOTE: you can only use schemes you defined in `buildSchemes`" }, - "macos": { + "targets": { "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "ignoreWarnings": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/ignoreWarnings" - }, - "ignoreLogs": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/ignoreLogs" - }, - "deploymentTarget": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/deploymentTarget" - }, - "orientationSupport": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/orientationSupport" - }, - "teamID": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/teamID" - }, - "excludedArchs": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/excludedArchs" - }, - "urlScheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/urlScheme" - }, - "teamIdentifier": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/teamIdentifier" - }, - "scheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/scheme" - }, - "schemeTarget": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/schemeTarget" - }, - "appleId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/appleId" - }, - "provisioningStyle": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisioningStyle" - }, - "newArchEnabled": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/newArchEnabled" - }, - "codeSignIdentity": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/codeSignIdentity" - }, - "commandLineArguments": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/commandLineArguments" - }, - "provisionProfileSpecifier": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisionProfileSpecifier" - }, - "provisionProfileSpecifiers": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisionProfileSpecifiers" - }, - "allowProvisioningUpdates": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/allowProvisioningUpdates" - }, - "provisioningProfiles": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisioningProfiles" - }, - "codeSignIdentities": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/codeSignIdentities" - }, - "systemCapabilities": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/systemCapabilities" - }, - "entitlements": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/entitlements" - }, - "runScheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/runScheme" - }, - "sdk": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/sdk" - }, - "testFlightId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/testFlightId" - }, - "firebaseId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/firebaseId" - }, - "exportOptions": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/exportOptions" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateXcode": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode" - }, - "electronConfig": { - "description": "Allows you to configure electron app as per https://www.electron.build/" - }, - "BrowserWindow": { - "type": "object", - "properties": { - "width": { - "type": "number" - }, - "height": { - "type": "number" - }, - "webPreferences": { - "type": "object", - "properties": { - "devTools": { - "type": "boolean" - } - }, - "additionalProperties": false, - "description": "Extra web preferences of electron app" - } - }, - "additionalProperties": false, - "description": "Allows you to configure electron wrapper app window" - }, - "buildSchemes": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "ignoreWarnings": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/ignoreWarnings" - }, - "ignoreLogs": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/ignoreLogs" - }, - "deploymentTarget": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/deploymentTarget" - }, - "orientationSupport": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/orientationSupport" - }, - "teamID": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/teamID" - }, - "excludedArchs": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/excludedArchs" - }, - "urlScheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/urlScheme" - }, - "teamIdentifier": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/teamIdentifier" - }, - "scheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/scheme" - }, - "schemeTarget": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/schemeTarget" - }, - "appleId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/appleId" - }, - "provisioningStyle": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisioningStyle" - }, - "newArchEnabled": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/newArchEnabled" - }, - "codeSignIdentity": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/codeSignIdentity" - }, - "commandLineArguments": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/commandLineArguments" - }, - "provisionProfileSpecifier": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisionProfileSpecifier" - }, - "provisionProfileSpecifiers": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisionProfileSpecifiers" - }, - "allowProvisioningUpdates": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/allowProvisioningUpdates" - }, - "provisioningProfiles": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/provisioningProfiles" - }, - "codeSignIdentities": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/codeSignIdentities" - }, - "systemCapabilities": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/systemCapabilities" - }, - "entitlements": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/entitlements" - }, - "runScheme": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/runScheme" - }, - "sdk": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/sdk" - }, - "testFlightId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/testFlightId" - }, - "firebaseId": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/firebaseId" - }, - "exportOptions": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/exportOptions" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateXcode": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode" - }, - "electronConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/macos/properties/electronConfig" - }, - "BrowserWindow": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/macos/properties/BrowserWindow" - } - }, - "additionalProperties": false - } - } + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" + "description": "Override of default targets specific to this project" + } + }, + "additionalProperties": false, + "description": "Default system config for this project" + }, + "pipes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "To avoid rnv building `buildHooks/src` every time you can specify which specific pipes should trigger recompile of buildHooks" + }, + "crypto": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "Relative path to encrypted file in your renative project. Example: \"./secrets/mySecrets.enc\"" }, - "linux": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/web" + "isOptional": { + "type": "boolean", + "description": "Mark if crypto object should not checked every run" + } + }, + "required": [ + "path" + ], + "additionalProperties": false, + "description": "This prop enables automatic encrypt and decrypt of sensitive information in your project. \nRNV will generate new env variable with can be used to encrypt and decrypt. this env var is generated by combining (and sanitizing) 2 properties from your renative.json: \nworkspaceID + projectName.\nThese 2 properties are also used to generate path on your local machine where encrypted files will be decrypted into." + }, + "paths": { + "type": "object", + "properties": { + "appConfigsDir": { + "type": "string", + "description": "Custom path to appConfigs. defaults to `./appConfigs`" }, - "windows": { + "platformTemplatesDirs": { "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "electronConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/macos/properties/electronConfig" - }, - "BrowserWindow": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/macos/properties/BrowserWindow" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateVSProject": { - "type": "object", - "properties": { - "language": { - "type": "string", - "description": "Specify generated project language: cpp for C++ or cs for C#" - }, - "arch": { - "type": "string", - "description": "Specification of targeted architecture" - }, - "experimentalNuGetDependency": { - "type": "boolean" - }, - "useWinUI3": { - "type": "boolean" - }, - "nuGetTestVersion": { - "type": "string" - }, - "reactNativeEngine": { - "type": "string" - }, - "nuGetTestFeed": { - "type": "string" - }, - "overwrite": { - "type": "boolean", - "description": "Whether to attempt to override the existing builds files when running a build once more" - }, - "release": { - "type": "boolean", - "description": "Enables full packaging of the app for release" - }, - "root": { - "type": "string", - "description": "Project root folder location (not the app itself, which is in platformBuilds)" - }, - "singleproc": { - "type": "boolean", - "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" - }, - "emulator": { - "type": "boolean" - }, - "device": { - "type": "boolean" - }, - "target": { - "type": "string" - }, - "remoteDebugging": { - "type": "boolean" - }, - "logging": { - "type": "boolean", - "description": "Logging all the build proccesses to console" - }, - "packager": { - "type": "boolean" - }, - "bundle": { - "type": "boolean" - }, - "launch": { - "type": "boolean", - "description": "Launches the application once the build process is finished" - }, - "autolink": { - "type": "boolean", - "description": "Launches the application once the build process is finished" - }, - "build": { - "type": "boolean", - "description": "Builds the application before launching it" - }, - "sln": { - "type": "string", - "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" - }, - "proj": { - "type": "string", - "description": "Root project directory for your React Native Windows project (not Visual Studio project)" - }, - "appPath": { - "type": "string", - "description": "Full path to windows plaform build directory" - }, - "msbuildprops": { - "type": "string", - "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" - }, - "buildLogDirectory": { - "type": "string", - "description": "Full path to directory where builds logs should be stored, default - project path" - }, - "info": { - "type": "boolean", - "description": "Print information about the build machine to console" - }, - "directDebugging": { - "type": "boolean" - }, - "telemetry": { - "type": "boolean", - "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" - }, - "devPort": { - "type": "string" - }, - "additionalMetroOptions": { - "type": "object", - "additionalProperties": {} - }, - "packageExtension": { - "type": "string" - } + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Custom location of ejected platform templates. this is populated after you run `rnv platform eject`" + }, + "appConfigsDirs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of custom location app configs directories`" + }, + "platformAssetsDir": { + "type": "string", + "description": "Custom path to platformAssets folder. defaults to `./platformAssets`" + }, + "platformBuildsDir": { + "type": "string", + "description": "Custom path to platformBuilds folder. defaults to `./platformBuilds`" + }, + "pluginTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "npm": { + "type": "string" }, - "additionalProperties": false + "path": { + "type": "string" + } }, - "buildSchemes": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "includedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPermissions" - }, - "excludedPermissions": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPermissions" - }, - "id": { - "$ref": "#/definitions/rnv.project/properties/common/properties/id" - }, - "idSuffix": { - "$ref": "#/definitions/rnv.project/properties/common/properties/idSuffix" - }, - "version": { - "$ref": "#/definitions/rnv.project/properties/common/properties/version" - }, - "versionCode": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCode" - }, - "versionFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionFormat" - }, - "versionCodeFormat": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeFormat" - }, - "versionCodeOffset": { - "$ref": "#/definitions/rnv.project/properties/common/properties/versionCodeOffset" - }, - "title": { - "$ref": "#/definitions/rnv.project/properties/common/properties/title" - }, - "description": { - "$ref": "#/definitions/rnv.project/properties/common/properties/description" - }, - "author": { - "$ref": "#/definitions/rnv.project/properties/common/properties/author" - }, - "license": { - "$ref": "#/definitions/rnv.project/properties/common/properties/license" - }, - "includedFonts": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedFonts" - }, - "backgroundColor": { - "$ref": "#/definitions/rnv.project/properties/common/properties/backgroundColor" - }, - "splashScreen": { - "$ref": "#/definitions/rnv.project/properties/common/properties/splashScreen" - }, - "fontSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/fontSources" - }, - "assetSources": { - "$ref": "#/definitions/rnv.project/properties/common/properties/assetSources" - }, - "includedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/includedPlugins" - }, - "excludedPlugins": { - "$ref": "#/definitions/rnv.project/properties/common/properties/excludedPlugins" - }, - "runtime": { - "$ref": "#/definitions/rnv.project/properties/common/properties/runtime" - }, - "custom": { - "$ref": "#/definitions/rnv.project/properties/common/properties/custom" - }, - "extendPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/extendPlatform" - }, - "assetFolderPlatform": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" - }, - "engine": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/engine" - }, - "entryFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/entryFile" - }, - "bundleAssets": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleAssets" - }, - "enableSourceMaps": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" - }, - "bundleIsDev": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/bundleIsDev" - }, - "getJsBundleFile": { - "$ref": "#/definitions/rnv.project/properties/common/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" - }, - "electronConfig": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/macos/properties/electronConfig" - }, - "BrowserWindow": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/macos/properties/BrowserWindow" - }, - "reactNativeEngine": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/reactNativeEngine" - }, - "templateVSProject": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/windows/properties/templateVSProject" - } - }, - "additionalProperties": false + "required": [ + "npm", + "path" + ], + "additionalProperties": false + }, + "description": "\n Allows you to define custom plugin template scopes. default scope for all plugins is `rnv`." + } + }, + "additionalProperties": false, + "description": "Define custom paths for RNV to look into" + }, + "permissions": { + "type": "object", + "properties": { + "android": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "security": { + "type": "string" } - } + }, + "required": [ + "key", + "security" + ], + "additionalProperties": false }, - "additionalProperties": false, - "description": "Allows to customize platforms configurations based on chosen build scheme `-s`" + "description": "Android SDK specific permissions" }, - "xbox": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/windows" + "ios": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "desc": { + "type": "string" + } + }, + "required": [ + "desc" + ], + "additionalProperties": false + }, + "description": "iOS SDK specific permissions" } }, + "required": [ + "android", + "ios" + ], "additionalProperties": false, - "description": "Object containing platform configurations" + "description": "Permission definititions which can be used by app configs via `includedPermissions` and `excludedPermissions` to customize permissions for each app" }, - "plugins": { + "engines": { "type": "object", "additionalProperties": { - "anyOf": [ - { - "anyOf": [ - { + "type": "string", + "const": "source:rnv" + }, + "description": "List of engines available in this project" + }, + "enableHookRebuild": { + "type": "boolean", + "description": "If set to true in `./renative.json` build hooks will be compiled at each rnv command run. If set to `false` (default) rebuild will be triggered only if `dist` folder is missing, `-r` has been passed or you run `rnv hooks run` directly making your rnv commands faster" + }, + "extendsTemplate": { + "type": "string", + "description": "You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`" + }, + "tasks": { + "type": "object", + "properties": { + "install": { + "type": "object", + "properties": { + "script": { + "type": "string" + }, + "platform": { + "type": "object", + "additionalProperties": { "type": "object", "properties": { - "disabled": { - "type": "boolean", - "default": false, - "description": "Marks plugin disabled" - }, - "props": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Custom props passed to plugin" - }, - "version": { - "type": "string", - "description": "Version of plugin. Typically package version" - }, - "deprecated": { - "type": "string", - "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" - }, - "source": { - "type": "string", - "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" - }, - "disableNpm": { - "type": "boolean", - "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" - }, - "skipMerge": { - "type": "boolean", - "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" - }, - "npm": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Object of npm dependencies of this plugin. These will be injected into package.json" - }, - "pluginDependencies": { - "type": "object", - "additionalProperties": { - "type": [ - "string", - "null" - ] - }, - "description": "List of other Renative plugins this plugin depends on" - }, - "webpackConfig": { - "type": "object", - "properties": { - "modulePaths": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "moduleAliases": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "object", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "projectPath": { - "type": "string" - } - }, - "required": [ - "projectPath" - ], - "additionalProperties": false - } - ] - } - } - ] - }, - "nextTranspileModules": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false, - "description": "Allows you to configure webpack bahaviour per each individual plugin" - }, - "disablePluginTemplateOverrides": { - "type": "boolean", - "description": "Disables plugin overrides for selected plugin" + "ignore": { + "type": "boolean" }, - "fontSources": { + "ignoreTasks": { "type": "array", "items": { "type": "string" } - }, - "android": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "default": false, - "description": "Marks plugin platform disabled" - }, - "forceLinking": { - "type": "boolean", - "default": false, - "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" - }, - "path": { - "type": "string", - "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." - }, - "projectName": { - "type": "string" - }, - "skipLinking": { - "type": "boolean" - }, - "skipImplementation": { - "type": "boolean" - }, - "implementation": { - "type": "string" - }, - "package": { - "type": "string" - }, - "templateAndroid": { - "type": "object", - "properties": { - "gradle_properties": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/gradle_properties" - }, - "build_gradle": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/build_gradle" - }, - "app_build_gradle": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/app_build_gradle" - }, - "AndroidManifest_xml": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/AndroidManifest_xml" - }, - "strings_xml": { - "type": "object", - "properties": { - "children": { - "type": "array", - "items": { - "type": "object", - "properties": { - "tag": { - "type": "string" - }, - "name": { - "type": "string" - }, - "child_value": { - "type": "string" - } - }, - "required": [ - "tag", - "name", - "child_value" - ], - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "MainActivity_kt": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/MainActivity_kt" - }, - "MainApplication_kt": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/android/properties/templateAndroid/properties/MainApplication_kt" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "androidtv": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android" - }, - "androidwear": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android" - }, - "firetv": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android" - }, - "ios": { - "type": "object", - "properties": { - "disabled": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/disabled" - }, - "forceLinking": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/forceLinking" - }, - "path": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/path" - }, - "git": { - "type": "string", - "description": "Alternative git url for pod instead of version" - }, - "commit": { - "type": "string", - "description": "Alternative git commit reference string" - }, - "version": { - "type": "string", - "description": "Version of pod" - }, - "podNames": { - "type": "array", - "items": { - "type": "string" - } - }, - "podName": { - "type": "string" - }, - "staticFrameworks": { - "type": "array", - "items": { - "type": "string" - } - }, - "templateXcode": { - "type": "object", - "properties": { - "Podfile": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/Podfile" - }, - "project_pbxproj": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/project_pbxproj" - }, - "AppDelegate_mm": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_mm" - }, - "AppDelegate_h": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/AppDelegate_h" - }, - "Info_plist": { - "$ref": "#/definitions/rnv.project/properties/platforms/properties/ios/properties/templateXcode/properties/Info_plist" - } - }, - "additionalProperties": false - }, - "isStatic": { - "type": "boolean" - }, - "buildType": { - "type": "string", - "enum": [ - "dynamic", - "static" - ], - "description": "Build type of the pod" - } - }, - "additionalProperties": false - }, - "tvos": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/ios" - }, - "tizen": { - "type": "object", - "properties": { - "disabled": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/disabled" - }, - "forceLinking": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/forceLinking" - }, - "path": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/android/properties/path" - } - }, - "additionalProperties": false - }, - "tizenmobile": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "tizenwatch": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "webos": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "web": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "webtv": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "chromecast": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "kaios": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "macos": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "linux": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "windows": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" - }, - "xbox": { - "$ref": "#/definitions/rnv.project/properties/plugins/additionalProperties/anyOf/0/anyOf/0/properties/tizen" } }, + "required": [ + "ignore", + "ignoreTasks" + ], "additionalProperties": false }, - { - "type": "string" + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] } - ] + } }, - { - "type": "null" - } - ] + "required": [ + "script", + "platform" + ], + "additionalProperties": false + } + }, + "required": [ + "install" + ], + "additionalProperties": false, + "description": "Allows to override specific task within renative toolchain. (currently only `install` supported). this is useful if you want to change specific behaviour of built-in task. ie install task triggers yarn/npm install by default. but that might not be desirable installation trigger" + }, + "integrations": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": {}, + "additionalProperties": false }, - "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + "description": "Object containing integration configurations where key represents package name" + }, + "env": { + "type": "object", + "additionalProperties": {}, + "description": "Object containing injected env variables" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime", + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "isMonorepo": { + "type": "boolean", + "description": "Mark if your project is part of monorepo" + }, + "monoRoot": { + "type": "string", + "description": "Define custom path to monorepo root where starting point is project directory" + }, + "custom": { + "$ref": "#/definitions/zodExt", + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "skipAutoUpdate": { + "type": "boolean", + "description": "Enables the equivalent to passing --skipDependencyCheck parameter on every rnv run so you don't have to use it" + }, + "common": { + "$ref": "#/definitions/zodCommonSchema" + }, + "platforms": { + "$ref": "#/definitions/zodPlatformsSchema" + }, + "plugins": { + "$ref": "#/definitions/zodPluginsSchema" + }, + "templateConfig": { + "$ref": "#/definitions/zodTemplateConfigFragment", + "description": "Used in `renative.template.json` allows you to define template behaviour." }, "$schema": { "type": "string", "description": "schema definition" } }, - "required": [ - "workspaceID", - "projectVersion", - "projectName", - "templates", - "currentTemplate" - ], "additionalProperties": false } }, diff --git a/packages/core/jsonSchema/rnv.root.json b/packages/core/jsonSchema/rnv.root.json new file mode 100644 index 0000000000..954ddd0eae --- /dev/null +++ b/packages/core/jsonSchema/rnv.root.json @@ -0,0 +1,4403 @@ +{ + "$ref": "#/definitions/rnv.root", + "definitions": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { + "type": "string", + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "type": "object", + "properties": { + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } + ] + } + } + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] + }, + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } + }, + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "isStatic": { + "type": "boolean" + }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" + }, + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, + "rnv.root": { + "type": "object", + "properties": { + "app": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "ID of the app in `./appConfigs/[APP_ID]/renative.json`. MUST match APP_ID name of the folder" + }, + "custom": { + "$ref": "#/definitions/zodExt" + }, + "hidden": { + "type": "boolean", + "description": "If set to true in `./appConfigs/[APP_ID]/renative.json` the APP_ID will be hidden from list of appConfigs `-c`" + }, + "extendsTemplate": { + "type": "string", + "description": "You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`" + }, + "extend": { + "type": "string", + "description": "extend another appConfig by id" + } + }, + "additionalProperties": false + }, + "project": { + "type": "object", + "properties": { + "workspaceID": { + "type": "string", + "description": "Workspace ID your project belongs to. This will mach same folder name in the root of your user directory. ie `~/` on macOS" + }, + "projectVersion": { + "type": "string", + "description": "Version of project" + }, + "projectName": { + "type": "string", + "description": "Name of the project which will be used in workspace as folder name. this will also be used as part of the KEY in crypto env var generator" + }, + "isTemplate": { + "type": "boolean", + "description": "Marks project as template. This disables certain user checks like version mismatch etc" + }, + "defaults": { + "type": "object", + "properties": { + "ports": { + "type": "object", + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Allows you to assign custom port per each supported platform specific to this project. this is useful if you foten switch between multiple projects and do not want to experience constant port conflicts" + }, + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "portOffset": { + "type": "number", + "description": "Offset each port default value by increment" + }, + "defaultCommandSchemes": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "run", + "export", + "build" + ] + }, + "description": "List of default schemes for each rnv command. This is useful if you want to avoid specifying `-s ...` every time your run rnv command. bu default rnv uses `-s debug`. NOTE: you can only use schemes you defined in `buildSchemes`" + }, + "targets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Override of default targets specific to this project" + } + }, + "additionalProperties": false, + "description": "Default system config for this project" + }, + "pipes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "To avoid rnv building `buildHooks/src` every time you can specify which specific pipes should trigger recompile of buildHooks" + }, + "crypto": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "Relative path to encrypted file in your renative project. Example: \"./secrets/mySecrets.enc\"" + }, + "isOptional": { + "type": "boolean", + "description": "Mark if crypto object should not checked every run" + } + }, + "required": [ + "path" + ], + "additionalProperties": false, + "description": "This prop enables automatic encrypt and decrypt of sensitive information in your project. \nRNV will generate new env variable with can be used to encrypt and decrypt. this env var is generated by combining (and sanitizing) 2 properties from your renative.json: \nworkspaceID + projectName.\nThese 2 properties are also used to generate path on your local machine where encrypted files will be decrypted into." + }, + "paths": { + "type": "object", + "properties": { + "appConfigsDir": { + "type": "string", + "description": "Custom path to appConfigs. defaults to `./appConfigs`" + }, + "platformTemplatesDirs": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Custom location of ejected platform templates. this is populated after you run `rnv platform eject`" + }, + "appConfigsDirs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of custom location app configs directories`" + }, + "platformAssetsDir": { + "type": "string", + "description": "Custom path to platformAssets folder. defaults to `./platformAssets`" + }, + "platformBuildsDir": { + "type": "string", + "description": "Custom path to platformBuilds folder. defaults to `./platformBuilds`" + }, + "pluginTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "npm": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "npm", + "path" + ], + "additionalProperties": false + }, + "description": "\n Allows you to define custom plugin template scopes. default scope for all plugins is `rnv`." + } + }, + "additionalProperties": false, + "description": "Define custom paths for RNV to look into" + }, + "permissions": { + "type": "object", + "properties": { + "android": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "security": { + "type": "string" + } + }, + "required": [ + "key", + "security" + ], + "additionalProperties": false + }, + "description": "Android SDK specific permissions" + }, + "ios": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "desc": { + "type": "string" + } + }, + "required": [ + "desc" + ], + "additionalProperties": false + }, + "description": "iOS SDK specific permissions" + } + }, + "required": [ + "android", + "ios" + ], + "additionalProperties": false, + "description": "Permission definititions which can be used by app configs via `includedPermissions` and `excludedPermissions` to customize permissions for each app" + }, + "engines": { + "type": "object", + "additionalProperties": { + "type": "string", + "const": "source:rnv" + }, + "description": "List of engines available in this project" + }, + "enableHookRebuild": { + "type": "boolean", + "description": "If set to true in `./renative.json` build hooks will be compiled at each rnv command run. If set to `false` (default) rebuild will be triggered only if `dist` folder is missing, `-r` has been passed or you run `rnv hooks run` directly making your rnv commands faster" + }, + "extendsTemplate": { + "type": "string", + "description": "You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`" + }, + "tasks": { + "type": "object", + "properties": { + "install": { + "type": "object", + "properties": { + "script": { + "type": "string" + }, + "platform": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "ignore": { + "type": "boolean" + }, + "ignoreTasks": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "ignore", + "ignoreTasks" + ], + "additionalProperties": false + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + } + } + }, + "required": [ + "script", + "platform" + ], + "additionalProperties": false + } + }, + "required": [ + "install" + ], + "additionalProperties": false, + "description": "Allows to override specific task within renative toolchain. (currently only `install` supported). this is useful if you want to change specific behaviour of built-in task. ie install task triggers yarn/npm install by default. but that might not be desirable installation trigger" + }, + "integrations": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "description": "Object containing integration configurations where key represents package name" + }, + "env": { + "type": "object", + "additionalProperties": {}, + "description": "Object containing injected env variables" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime", + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "isMonorepo": { + "type": "boolean", + "description": "Mark if your project is part of monorepo" + }, + "monoRoot": { + "type": "string", + "description": "Define custom path to monorepo root where starting point is project directory" + }, + "custom": { + "$ref": "#/definitions/zodExt", + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "skipAutoUpdate": { + "type": "boolean", + "description": "Enables the equivalent to passing --skipDependencyCheck parameter on every rnv run so you don't have to use it" + }, + "common": { + "$ref": "#/definitions/zodCommonSchema" + }, + "platforms": { + "$ref": "#/definitions/zodPlatformsSchema" + }, + "plugins": { + "$ref": "#/definitions/zodPluginsSchema" + }, + "templateConfig": { + "$ref": "#/definitions/zodTemplateConfigFragment", + "description": "Used in `renative.template.json` allows you to define template behaviour." + } + }, + "additionalProperties": false + }, + "local": { + "type": "object", + "properties": { + "workspaceAppConfigsDir": { + "type": "string", + "description": "Defines app configs dir outside of current project" + }, + "defaultTargets": { + "$ref": "#/definitions/zodDefaultTargets", + "description": "Define targets to be used when -t is not set on any project run" + }, + "_meta": { + "type": "object", + "properties": { + "currentAppConfigId": { + "type": "string" + }, + "requiresJetify": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "overrides": { + "type": "object", + "properties": { + "overrides": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + "integration": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + } + }, + "additionalProperties": false + }, + "engine": { + "type": "object", + "properties": { + "custom": { + "$ref": "#/definitions/zodExt" + }, + "id": { + "type": "string", + "description": "ID of engine" + }, + "packageName": { + "type": "string" + }, + "engineExtension": { + "type": "string", + "description": "Engine extension ised by rnv during compilation" + }, + "overview": { + "type": "string", + "description": "Overview description of engine" + }, + "plugins": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "List of required plugins for this engine to work properly" + }, + "npm": { + "type": "object", + "properties": { + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "devDependencies": { + "$ref": "#/definitions/rnv.root/properties/engine/properties/npm/properties/dependencies" + }, + "peerDependencies": { + "$ref": "#/definitions/rnv.root/properties/engine/properties/npm/properties/dependencies" + }, + "optionalDependencies": { + "$ref": "#/definitions/rnv.root/properties/engine/properties/npm/properties/dependencies" + } + }, + "additionalProperties": false, + "description": "Npm dependencies required for this plugin to work" + }, + "platforms": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "engine": { + "type": "string" + }, + "npm": { + "$ref": "#/definitions/rnv.root/properties/engine/properties/npm" + } + }, + "additionalProperties": false + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + } + } + }, + "additionalProperties": false + }, + "plugin": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled", + "description": "Marks plugin disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props", + "description": "Custom props passed to plugin" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm", + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies", + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig", + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + }, + "android": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "private": { + "type": "object", + "properties": { + "private": { + "type": "object", + "additionalProperties": {}, + "description": "Special object which contains private info. this object should be used only in `renative.private.json` files and never commited to your repository. Private files usually reside in your workspace and are subject to crypto encryption if enabled. RNV will warn you if it finds private key in your regular `renative.json` file" + }, + "platforms": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "storePassword": { + "type": "string", + "description": "> WARNING. this prop is sensitive and should not be stored in standard `renative.json` configs. use `renative.private.json` files instead!\n\nstorePassword for keystore file" + }, + "keyPassword": { + "type": "string", + "description": "> WARNING. this prop is sensitive and should not be stored in standard `renative.json` configs. use `renative.private.json` files instead!\n\nkeyPassword for keystore file" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/android" + }, + "firetv": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/android" + }, + "ios": {}, + "tvos": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "tizenmobile": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "tizenwatch": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "webos": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "web": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "webtv": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "chromecast": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "kaios": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "macos": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "linux": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "windows": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + }, + "xbox": { + "$ref": "#/definitions/rnv.root/properties/private/properties/platforms/properties/ios" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "template": { + "type": "object", + "properties": { + "templateConfig": { + "$ref": "#/definitions/zodTemplateConfigFragment", + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "bootstrapConfig": { + "type": "object", + "properties": { + "bootstrapQuestions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "object", + "additionalProperties": {} + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "title", + "value" + ], + "additionalProperties": false + } + }, + "configProp": { + "type": "object", + "properties": { + "prop": { + "type": "string" + }, + "key": { + "type": "string" + } + }, + "required": [ + "prop", + "key" + ], + "additionalProperties": false + }, + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "onConfirm": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "prop": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "action", + "path" + ], + "additionalProperties": false + } + } + }, + "required": [ + "type", + "title" + ], + "additionalProperties": false + }, + "description": "Defines list of custom bootstrap questions" + }, + "rnvNewPatchDependencies": { + "$ref": "#/definitions/zodNpmDep", + "description": "This ensures that the correct version of the npm packages will be used to run the project for the first time after creation" + }, + "configModifiers": { + "type": "object", + "properties": { + "engines": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms" + }, + "nullifyIfFalse": { + "type": "boolean" + } + }, + "required": [ + "name", + "supportedPlatforms" + ], + "additionalProperties": false + } + } + }, + "required": [ + "engines" + ], + "additionalProperties": false + }, + "defaultSelectedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "configTemplates": { + "type": "object", + "properties": { + "projectTemplates": { + "$ref": "#/definitions/zodProjectTemplates" + }, + "engineIdMap": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "engineTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + } + }, + "required": [ + "version", + "id", + "key" + ], + "additionalProperties": false + } + }, + "integrationTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "version": { + "type": "string" + } + }, + "required": [ + "version" + ], + "additionalProperties": false + } + }, + "platformTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "engine": { + "type": "string" + } + }, + "required": [ + "engine" + ], + "additionalProperties": false + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + } + }, + "pluginTemplates": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/zodPluginSchema" + }, + "description": "Define all plugins available to be merged with project plugins" + }, + "disableRnvDefaultOverrides": { + "type": "boolean", + "description": "Disables default rnv scope plugin overrides and merges. Useful if you want to test entirely clean plugin template list" + } + }, + "additionalProperties": false + }, + "workspace": { + "type": "object", + "properties": { + "defaultTargets": { + "$ref": "#/definitions/zodDefaultTargets", + "description": "Define targets to be used when -t is not set on any project run" + }, + "sdks": { + "type": "object", + "properties": { + "ANDROID_SDK": { + "type": "string" + }, + "ANDROID_NDK": { + "type": "string" + }, + "TIZEN_SDK": { + "type": "string" + }, + "WEBOS_SDK": { + "type": "string" + }, + "KAIOS_SDK": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Define your sdk configurations" + }, + "projectTemplates": { + "$ref": "#/definitions/zodProjectTemplates" + }, + "disableTelemetry": { + "type": "boolean", + "description": "Opt-out from renative telemetry program. More info at https://renative.org/telemetry" + }, + "appConfigsPath": { + "type": "string", + "description": "Enables you to define custom global appConfigs location that every project will automatically use" + } + }, + "additionalProperties": false + }, + "workspaces": { + "type": "object", + "properties": { + "workspaces": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "remote": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "url", + "type" + ], + "additionalProperties": false + } + }, + "required": [ + "path" + ], + "additionalProperties": false + } + } + }, + "required": [ + "workspaces" + ], + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "schema definition" + } + }, + "required": [ + "app", + "project", + "local", + "overrides", + "integration", + "engine", + "plugin", + "private", + "template", + "configTemplates", + "workspace", + "workspaces" + ], + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-04/schema#" +} \ No newline at end of file diff --git a/packages/core/jsonSchema/rnv.template.json b/packages/core/jsonSchema/rnv.template.json index 3d75802603..aa4c57d01a 100644 --- a/packages/core/jsonSchema/rnv.template.json +++ b/packages/core/jsonSchema/rnv.template.json @@ -1,206 +1,3301 @@ { "$ref": "#/definitions/rnv.template", "definitions": { - "rnv.template": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { + "type": "string", + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { "type": "object", "properties": { - "defaults": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { "type": "object", "properties": { - "ports": { - "type": "object", - "additionalProperties": { - "type": "number" - }, - "propertyNames": { - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" - ] - }, - "description": "Allows you to assign custom port per each supported platform specific to this project. this is useful if you foten switch between multiple projects and do not want to experience constant port conflicts" - }, - "supportedPlatforms": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" - ] - }, - "description": "Array list of all supported platforms in current project" + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "portOffset": { - "type": "number", - "description": "Offset each port default value by increment" + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" }, - "defaultCommandSchemes": { - "type": "object", - "additionalProperties": { - "type": "string" + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" }, - "propertyNames": { - "enum": [ - "run", - "export", - "build" - ] + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" }, - "description": "List of default schemes for each rnv command. This is useful if you want to avoid specifying `-s ...` every time your run rnv command. bu default rnv uses `-s debug`. NOTE: you can only use schemes you defined in `buildSchemes`" - }, - "targets": { - "type": "object", - "additionalProperties": { - "type": "string" + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" }, - "propertyNames": { - "enum": [ - "ios", - "android", - "androidtv", - "androidwear", - "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", - "tvos", - "webos", - "macos", - "windows", - "linux", - "tizenwatch", - "kaios", - "chromecast", - "xbox" - ] - }, - "description": "Override of default targets specific to this project" - } + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { + "type": "object", + "additionalProperties": { + "type": "string" }, - "additionalProperties": false, - "description": "Default system config for this project" + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" }, - "engines": { + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { "type": "object", "additionalProperties": { - "type": "string", - "const": "source:rnv" + "type": "string" }, - "description": "List of engines available in this project" + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" }, - "templateConfig": { + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { "type": "object", "properties": { - "disabled": { - "type": "boolean" + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } + ] + } + } + ] }, - "includedPaths": { + "nextTranspileModules": { "type": "array", "items": { - "anyOf": [ - { - "type": "string" + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] + }, + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } + }, + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "isStatic": { + "type": "boolean" + }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" }, - { + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { "type": "object", "properties": { - "paths": { - "type": "array", - "items": { - "type": "string" - } + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" }, - "engines": { - "type": "array", - "items": { - "type": "string" - } + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" } }, - "required": [ - "paths" - ], "additionalProperties": false } - ] - }, - "description": "Defines list of all file/dir paths you want to include in template" - }, - "renative_json": { - "type": "object", - "properties": { - "$schema": { - "type": "string" }, - "extendsTemplate": { - "type": "string" - } - }, - "additionalProperties": true + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" }, - "package_json": { - "type": "object", - "properties": { - "dependencies": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "devDependencies": { - "$ref": "#/definitions/rnv.template/properties/templateConfig/properties/package_json/properties/dependencies" - }, - "peerDependencies": { - "$ref": "#/definitions/rnv.template/properties/templateConfig/properties/package_json/properties/dependencies" - }, - "optionalDependencies": { - "$ref": "#/definitions/rnv.template/properties/templateConfig/properties/package_json/properties/dependencies" - }, - "name": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "additionalProperties": true + "value": { + "type": "string" + }, + "weight": { + "type": "number" } }, - "additionalProperties": false, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, + "rnv.template": { + "type": "object", + "properties": { + "templateConfig": { + "$ref": "#/definitions/zodTemplateConfigFragment", "description": "Used in `renative.template.json` allows you to define template behaviour." }, "bootstrapConfig": { @@ -298,7 +3393,7 @@ "description": "Defines list of custom bootstrap questions" }, "rnvNewPatchDependencies": { - "$ref": "#/definitions/rnv.template/properties/templateConfig/properties/package_json/properties/dependencies", + "$ref": "#/definitions/zodNpmDep", "description": "This ensures that the correct version of the npm packages will be used to run the project for the first time after creation" }, "configModifiers": { @@ -313,10 +3408,7 @@ "type": "string" }, "supportedPlatforms": { - "type": "array", - "items": { - "type": "string" - } + "$ref": "#/definitions/zodSupportedPlatforms" }, "nullifyIfFalse": { "type": "boolean" @@ -334,6 +3426,10 @@ "engines" ], "additionalProperties": false + }, + "defaultSelectedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" } }, "additionalProperties": false diff --git a/packages/core/jsonSchema/rnv.templates.json b/packages/core/jsonSchema/rnv.templates.json index 63d0baa950..13a9ede652 100644 --- a/packages/core/jsonSchema/rnv.templates.json +++ b/packages/core/jsonSchema/rnv.templates.json @@ -1,22 +1,3306 @@ { "$ref": "#/definitions/rnv.templates", "definitions": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { + "type": "string", + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "type": "object", + "properties": { + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } + ] + } + } + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] + }, + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } + }, + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "isStatic": { + "type": "boolean" + }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" + }, + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, "rnv.templates": { "type": "object", "properties": { "projectTemplates": { + "$ref": "#/definitions/zodProjectTemplates" + }, + "engineIdMap": { "type": "object", "additionalProperties": { - "type": "object", - "properties": { - "description": { - "type": "string" - } - }, - "required": [ - "description" - ], - "additionalProperties": false + "type": "string" } }, "engineTemplates": { @@ -36,7 +3320,8 @@ }, "required": [ "version", - "id" + "id", + "key" ], "additionalProperties": false } @@ -72,38 +3357,43 @@ }, "propertyNames": { "enum": [ + "web", "ios", "android", "androidtv", - "androidwear", "firetv", - "web", - "webtv", - "tizen", - "tizenmobile", "tvos", - "webos", "macos", - "windows", "linux", - "tizenwatch", - "kaios", + "windows", + "tizen", + "webos", "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", "xbox" ] } }, + "pluginTemplates": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/zodPluginSchema" + }, + "description": "Define all plugins available to be merged with project plugins" + }, + "disableRnvDefaultOverrides": { + "type": "boolean", + "description": "Disables default rnv scope plugin overrides and merges. Useful if you want to test entirely clean plugin template list" + }, "$schema": { "type": "string", "description": "schema definition" } }, - "required": [ - "projectTemplates", - "engineTemplates", - "integrationTemplates", - "platformTemplates" - ], "additionalProperties": false } }, diff --git a/packages/core/jsonSchema/rnv.workspace.json b/packages/core/jsonSchema/rnv.workspace.json new file mode 100644 index 0000000000..d009131c1b --- /dev/null +++ b/packages/core/jsonSchema/rnv.workspace.json @@ -0,0 +1,3343 @@ +{ + "$ref": "#/definitions/rnv.workspace", + "definitions": { + "zodRuntime": { + "description": "This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code" + }, + "zodPlatformsKeys": { + "type": "string", + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "zodSupportedPlatforms": { + "type": "array", + "items": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "description": "Array list of all supported platforms in current project" + }, + "zodExt": { + "description": "Object used to extend your renative with custom props. This allows renative json schema to be validated" + }, + "zodDefaultTargets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "web", + "ios", + "android", + "androidtv", + "firetv", + "tvos", + "macos", + "linux", + "windows", + "tizen", + "webos", + "chromecast", + "kaios", + "webtv", + "androidwear", + "tizenwatch", + "tizenmobile", + "xbox" + ] + }, + "description": "Define targets to be used when -t is not set on any project run" + }, + "zodBuildSchemeFragment": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Defines whether build scheme shows up in options to run" + }, + "description": { + "type": "string", + "description": "Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`" + } + }, + "additionalProperties": false + }, + "zodNpmDep": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "zodTemplateConfigFragment": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "disabled": { + "type": "boolean" + }, + "includedPaths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "engines": { + "type": "array", + "items": { + "type": "string" + } + }, + "platforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + } + ] + }, + "description": "Defines list of all file/dir paths you want to include in template" + }, + "renative_json": { + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "extendsTemplate": { + "type": "string" + } + }, + "additionalProperties": false + }, + "package_json": { + "type": "object", + "properties": { + "dependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "devDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "peerDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "optionalDependencies": { + "$ref": "#/definitions/zodNpmDep" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "description": "Used in `renative.template.json` allows you to define template behaviour." + }, + "zodProjectTemplates": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "packageName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "localPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "zodCommonSchemaFragment": { + "type": "object", + "properties": { + "includedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + }, + "excludedPermissions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + }, + "id": { + "type": "string", + "description": "Bundle ID of application. ie: com.example.myapp" + }, + "idSuffix": { + "type": "string" + }, + "version": { + "type": "string", + "description": "Semver style version of your app" + }, + "versionCode": { + "type": "string", + "description": "Manual verride of generated version code" + }, + "versionFormat": { + "type": "string", + "description": "Allows you to fine-tune app version defined in package.json or renative.json.\n If you do not define versionFormat, no formatting will apply to version.\n " + }, + "versionCodeFormat": { + "type": "string", + "description": "Allows you to fine-tune auto generated version codes.\n Version code is autogenerated from app version defined in package.json or renative.json.\n " + }, + "versionCodeOffset": { + "type": "number" + }, + "title": { + "type": "string", + "description": "Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website" + }, + "description": { + "type": "string", + "description": "General description of your app. This prop will be injected to actual projects where description field is applicable" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "license": { + "type": "string", + "description": "Injects license information into app" + }, + "includedFonts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all" + }, + "backgroundColor": { + "type": "string", + "minLength": 4, + "maxLength": 9, + "pattern": "^#", + "description": "Defines root view backgroundColor for all platforms in HEX format" + }, + "splashScreen": { + "type": "boolean", + "description": "Enable or disable splash screen" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`" + }, + "assetSources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`" + }, + "includedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + }, + "excludedPlugins": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + }, + "runtime": { + "$ref": "#/definitions/zodRuntime" + }, + "custom": { + "$ref": "#/definitions/zodExt" + } + }, + "additionalProperties": false + }, + "zodCommonSchema": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "enabled": { + "$ref": "#/definitions/zodBuildSchemeFragment/properties/enabled" + }, + "extendPlatform": { + "$ref": "#/definitions/zodPlatformsKeys" + }, + "assetFolderPlatform": { + "type": "string", + "description": "Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets" + }, + "engine": { + "type": "string", + "description": "ID of engine to be used for this platform. Note: engine must be registered in `engines` field" + }, + "entryFile": { + "type": "string", + "default": "index", + "description": "Alternative name of the entry file without `.js` extension" + }, + "bundleAssets": { + "type": "boolean", + "description": "If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds" + }, + "enableSourceMaps": { + "type": "boolean", + "description": "If set to `true` dedicated source map file will be generated alongside of compiled js bundle" + }, + "bundleIsDev": { + "type": "boolean", + "description": "If set to `true` debug build will be generated" + }, + "getJsBundleFile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "description": "Common config props used as default props for all available buildSchemes" + }, + "zodPluginSchema": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodSupportedPlatforms", + "description": "Array list of all supported platforms in current project" + }, + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin disabled" + }, + "props": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Custom props passed to plugin" + }, + "version": { + "type": "string", + "description": "Version of plugin. Typically package version" + }, + "deprecated": { + "type": "string", + "description": "Marks your plugin deprecated with warning showing in the console during rnv commands" + }, + "source": { + "type": "string", + "description": "Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}" + }, + "disableNpm": { + "type": "boolean", + "description": "Will skip including plugin in package.json and installing it via npm/yarn etc" + }, + "skipMerge": { + "type": "boolean", + "description": "Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully" + }, + "npm": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Object of npm dependencies of this plugin. These will be injected into package.json" + }, + "pluginDependencies": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "List of other Renative plugins this plugin depends on" + }, + "webpackConfig": { + "type": "object", + "properties": { + "modulePaths": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "moduleAliases": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "projectPath": { + "type": "string" + } + }, + "required": [ + "projectPath" + ], + "additionalProperties": false + } + ] + } + } + ] + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure webpack bahaviour per each individual plugin" + }, + "disablePluginTemplateOverrides": { + "type": "boolean", + "description": "Disables plugin overrides for selected plugin" + }, + "fontSources": { + "type": "array", + "items": { + "type": "string" + } + }, + "android": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": false, + "description": "Marks plugin platform disabled" + }, + "forceLinking": { + "type": "boolean", + "default": false, + "description": "Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true" + }, + "path": { + "type": "string", + "description": "Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used." + }, + "templateAndroid": { + "type": "object", + "properties": { + "gradle_properties": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "boolean", + "number" + ] + }, + "description": "Overrides values in `gradle.properties` file of generated android based project" + }, + "build_gradle": { + "type": "object", + "properties": { + "allprojects": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + }, + "description": "Customize repositories section of build.gradle" + } + }, + "required": [ + "repositories" + ], + "additionalProperties": false + }, + "plugins": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildscript": { + "type": "object", + "properties": { + "repositories": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "repositories", + "dependencies" + ], + "additionalProperties": false + }, + "dexOptions": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "injectAfterAll": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Overrides values in `build.gradle` file of generated android based project" + }, + "app_build_gradle": { + "type": "object", + "properties": { + "apply": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultConfig": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildTypes": { + "type": "object", + "properties": { + "debug": { + "type": "array", + "items": { + "type": "string" + } + }, + "release": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "afterEvaluate": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementations": { + "type": "array", + "items": { + "type": "string" + } + }, + "implementation": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Overrides values in `app/build.gradle` file of generated android based project" + }, + "AndroidManifest_xml": { + "$ref": "#/definitions/zodAndroidManifest", + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "strings_xml": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "child_value": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + } + } + }, + "required": [ + "children" + ], + "additionalProperties": false + }, + "MainActivity_kt": { + "type": "object", + "properties": { + "onCreate": { + "type": "string", + "default": "super.onCreate(savedInstanceState)", + "description": "Overrides super.onCreate method handler of MainActivity.java" + }, + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "resultMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "MainApplication_kt": { + "type": "object", + "properties": { + "imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "createMethods": { + "type": "array", + "items": { + "type": "string" + } + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "packageParams": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "description": "Allows you to configure behaviour of MainActivity" + }, + "settings_gradle": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "gradle_wrapper_properties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SplashActivity_java": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "styles_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "colors_xml": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "proguard_rules_pro": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "projectName": { + "type": "string" + }, + "skipLinking": { + "type": "boolean" + }, + "skipImplementation": { + "type": "boolean" + }, + "implementation": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPluginSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + }, + "templateXcode": { + "type": "object", + "properties": { + "Podfile": { + "type": "object", + "properties": { + "injectLines": { + "type": "array", + "items": { + "type": "string" + } + }, + "post_install": { + "type": "array", + "items": { + "type": "string" + } + }, + "sources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of URLs that will be injected on top of the Podfile as sources" + }, + "podDependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "staticPods": { + "type": "array", + "items": { + "type": "string" + } + }, + "header": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of strings that will be injected on top of the Podfile" + } + }, + "additionalProperties": false, + "description": "Allows to manipulate Podfile" + }, + "project_pbxproj": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "resourceFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "headerFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildPhases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "shellPath": { + "type": "string" + }, + "shellScript": { + "type": "string" + }, + "inputPaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "shellPath", + "shellScript", + "inputPaths" + ], + "additionalProperties": false + } + }, + "frameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "buildSettings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_mm": { + "type": "object", + "properties": { + "appDelegateMethods": { + "type": "object", + "properties": { + "application": { + "type": "object", + "properties": { + "didFinishLaunchingWithOptions": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "applicationDidBecomeActive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "open": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "supportedInterfaceOrientationsFor": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveRemoteNotification": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didFailToRegisterForRemoteNotificationsWithError": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceive": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegister": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didRegisterForRemoteNotificationsWithDeviceToken": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "continue": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didConnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didDisconnectCarInterfaceController": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + }, + "userNotificationCenter": { + "type": "object", + "properties": { + "willPresent": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + }, + "didReceiveNotificationResponse": { + "type": "array", + "items": { + "$ref": "#/definitions/zodAppDelegateMethod" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "AppDelegate_h": { + "type": "object", + "properties": { + "appDelegateImports": { + "type": "array", + "items": { + "type": "string" + } + }, + "appDelegateExtensions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "Info_plist": { + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "git": { + "type": "string", + "description": "Alternative git url for pod instead of version" + }, + "commit": { + "type": "string", + "description": "Alternative git commit reference string" + }, + "version": { + "type": "string", + "description": "Version of pod" + }, + "podNames": { + "type": "array", + "items": { + "type": "string" + } + }, + "podName": { + "type": "string" + }, + "staticFrameworks": { + "type": "array", + "items": { + "type": "string" + } + }, + "isStatic": { + "type": "boolean" + }, + "buildType": { + "type": "string", + "enum": [ + "dynamic", + "static" + ], + "description": "Build type of the pod" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPluginSchema/properties/ios" + }, + "tizen": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenmobile": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "web": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "webtv": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "chromecast": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "kaios": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "macos": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "linux": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "windows": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + }, + "xbox": { + "$ref": "#/definitions/zodPluginPlatformBaseFragment" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false + }, + "zodPluginsSchema": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/zodPluginSchema" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": "Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config" + }, + "zodPluginBaseFragment": { + "type": "object", + "properties": { + "supportedPlatforms": { + "$ref": "#/definitions/zodPluginSchema/properties/supportedPlatforms" + }, + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/disabled" + }, + "props": { + "$ref": "#/definitions/zodPluginSchema/properties/props" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/version" + }, + "deprecated": { + "$ref": "#/definitions/zodPluginSchema/properties/deprecated" + }, + "source": { + "$ref": "#/definitions/zodPluginSchema/properties/source" + }, + "disableNpm": { + "$ref": "#/definitions/zodPluginSchema/properties/disableNpm" + }, + "skipMerge": { + "$ref": "#/definitions/zodPluginSchema/properties/skipMerge" + }, + "npm": { + "$ref": "#/definitions/zodPluginSchema/properties/npm" + }, + "pluginDependencies": { + "$ref": "#/definitions/zodPluginSchema/properties/pluginDependencies" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPluginSchema/properties/webpackConfig" + }, + "disablePluginTemplateOverrides": { + "$ref": "#/definitions/zodPluginSchema/properties/disablePluginTemplateOverrides" + }, + "fontSources": { + "$ref": "#/definitions/zodPluginSchema/properties/fontSources" + } + }, + "additionalProperties": false + }, + "zodPluginPlatformAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + }, + "projectName": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/projectName" + }, + "skipLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipLinking" + }, + "skipImplementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/skipImplementation" + }, + "implementation": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/implementation" + }, + "package": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/package" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodPluginPlatformiOSFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "git": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/git" + }, + "commit": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/commit" + }, + "version": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/version" + }, + "podNames": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podNames" + }, + "podName": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/podName" + }, + "staticFrameworks": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/staticFrameworks" + }, + "isStatic": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/isStatic" + }, + "buildType": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/buildType" + } + }, + "required": [ + "git", + "commit", + "version", + "podNames", + "podName", + "staticFrameworks", + "isStatic", + "buildType" + ], + "additionalProperties": false + }, + "zodPluginPlatformBaseFragment": { + "type": "object", + "properties": { + "disabled": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/disabled" + }, + "forceLinking": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/forceLinking" + }, + "path": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/path" + } + }, + "additionalProperties": false + }, + "zodPlatformsSchema": { + "type": "object", + "properties": { + "android": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "enableAndroidX": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables new android X architecture" + }, + "enableJetifier": { + "type": [ + "boolean", + "string" + ], + "default": true, + "description": "Enables Jetifier" + }, + "signingConfig": { + "type": "string", + "default": "Debug", + "description": "Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`" + }, + "minSdkVersion": { + "type": "number", + "default": 28, + "description": "Minimum Android SDK version device has to have in order for app to run" + }, + "multipleAPKs": { + "type": "boolean", + "description": "If set to `true`, apk will be split into multiple ones for each architecture: \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"" + }, + "aab": { + "type": "boolean", + "description": "If set to true, android project will generate app.aab instead of apk" + }, + "extraGradleParams": { + "type": "string", + "description": "Allows passing extra params to gradle command" + }, + "minifyEnabled": { + "type": "boolean", + "description": "Sets minifyEnabled buildType property in app/build.gradle" + }, + "targetSdkVersion": { + "type": "number", + "description": "Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle" + }, + "compileSdkVersion": { + "type": "number", + "description": "Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle" + }, + "kotlinVersion": { + "type": "string", + "default": "1.7.10", + "description": "Allows you define custom kotlin version" + }, + "ndkVersion": { + "type": "string", + "description": "Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle" + }, + "supportLibVersion": { + "type": "string", + "description": "Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle" + }, + "googleServicesVersion": { + "type": "string", + "description": "Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle" + }, + "gradleBuildToolsVersion": { + "type": "string", + "description": "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" + }, + "gradleWrapperVersion": { + "type": "string", + "description": "Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`" + }, + "excludedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by exclusion" + }, + "includedFeatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Override features definitions in AndroidManifest.xml by inclusion" + }, + "buildToolsVersion": { + "type": "string", + "default": "34.0.0", + "description": "Override android build tools version" + }, + "disableSigning": { + "type": "boolean" + }, + "storeFile": { + "type": "string", + "description": "Name of the store file in android project" + }, + "keyAlias": { + "type": "string", + "description": "Key alias of the store file in android project" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new arch for android. Default: false" + }, + "flipperEnabled": { + "type": "boolean", + "description": "Enables flipper for ios. Default: true" + }, + "reactNativeEngine": { + "type": "string", + "enum": [ + "jsc", + "v8-android", + "v8-android-nointl", + "v8-android-jit", + "v8-android-jit-nointl", + "hermes" + ], + "default": "hermes", + "description": "Allows you to define specific native render engine to be used" + }, + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "androidtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "androidwear": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "firetv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android" + }, + "ios": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "type": "boolean", + "description": "Injects `inhibit_all_warnings` into Podfile" + }, + "ignoreLogs": { + "type": "boolean", + "description": "Passes `-quiet` to xcodebuild command" + }, + "deploymentTarget": { + "type": "string", + "description": "Deployment target for xcodepoj" + }, + "orientationSupport": { + "type": "object", + "properties": { + "phone": { + "type": "array", + "items": { + "type": "string" + } + }, + "tab": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "teamID": { + "type": "string", + "description": "Apple teamID" + }, + "excludedArchs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=\"\"`" + }, + "urlScheme": { + "type": "string", + "description": "URL Scheme for the app used for deeplinking" + }, + "teamIdentifier": { + "type": "string", + "description": "Apple developer team ID" + }, + "scheme": { + "type": "string" + }, + "schemeTarget": { + "type": "string" + }, + "appleId": { + "type": "string" + }, + "provisioningStyle": { + "type": "string" + }, + "newArchEnabled": { + "type": "boolean", + "description": "Enables new archs for iOS. Default: false" + }, + "codeSignIdentity": { + "type": "string", + "description": "Special property which tells Xcode how to build your project" + }, + "commandLineArguments": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to pass launch arguments to active scheme" + }, + "provisionProfileSpecifier": { + "type": "string" + }, + "provisionProfileSpecifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "allowProvisioningUpdates": { + "type": "boolean" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "codeSignIdentities": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "systemCapabilities": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "runScheme": { + "type": "string" + }, + "sdk": { + "type": "string" + }, + "testFlightId": { + "type": "string" + }, + "firebaseId": { + "type": "string" + }, + "exportOptions": { + "type": "object", + "properties": { + "method": { + "type": "string" + }, + "teamID": { + "type": "string" + }, + "uploadBitcode": { + "type": "boolean" + }, + "compileBitcode": { + "type": "boolean" + }, + "uploadSymbols": { + "type": "boolean" + }, + "signingStyle": { + "type": "string" + }, + "signingCertificate": { + "type": "string" + }, + "provisioningProfiles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tvos": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios" + }, + "tizen": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "package": { + "type": "string" + }, + "certificateProfile": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "timestampBuildFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "devServerHost": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "webpackConfig": { + "type": "object", + "properties": { + "publicUrl": { + "type": "string" + }, + "customScripts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allows you to inject custom script into html header" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "tizenmobile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "tizenwatch": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen" + }, + "webos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "iconColor": { + "type": "string" + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "webpackConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/webpackConfig" + }, + "pagesDir": { + "type": "string", + "description": "Custom pages directory used by nextjs. Use relative paths" + }, + "outputDir": { + "type": "string", + "description": "Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths" + }, + "exportDir": { + "type": "string", + "description": "Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths" + }, + "nextTranspileModules": { + "type": "array", + "items": { + "type": "string" + } + }, + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "webtv": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "chromecast": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "kaios": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "macos": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + }, + "electronConfig": { + "description": "Allows you to configure electron app as per https://www.electron.build/" + }, + "BrowserWindow": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + }, + "webPreferences": { + "type": "object", + "properties": { + "devTools": { + "type": "boolean" + } + }, + "required": [ + "devTools" + ], + "additionalProperties": false, + "description": "Extra web preferences of electron app" + } + }, + "additionalProperties": false, + "description": "Allows you to configure electron wrapper app window" + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "linux": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web" + }, + "windows": { + "type": "object", + "properties": { + "buildSchemes": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "includedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPermissions" + }, + "excludedPermissions": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPermissions" + }, + "id": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/id" + }, + "idSuffix": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/idSuffix" + }, + "version": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/version" + }, + "versionCode": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCode" + }, + "versionFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionFormat" + }, + "versionCodeFormat": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeFormat" + }, + "versionCodeOffset": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/versionCodeOffset" + }, + "title": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/title" + }, + "description": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/description" + }, + "author": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/author" + }, + "license": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/license" + }, + "includedFonts": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedFonts" + }, + "backgroundColor": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/backgroundColor" + }, + "splashScreen": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/splashScreen" + }, + "fontSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/fontSources" + }, + "assetSources": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/assetSources" + }, + "includedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/includedPlugins" + }, + "excludedPlugins": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/excludedPlugins" + }, + "runtime": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/runtime" + }, + "custom": { + "$ref": "#/definitions/zodCommonSchemaFragment/properties/custom" + }, + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + }, + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + }, + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + }, + "templateVSProject": { + "type": "object", + "properties": { + "language": { + "type": "string", + "description": "Specify generated project language: cpp for C++ or cs for C#" + }, + "arch": { + "type": "string", + "description": "Specification of targeted architecture" + }, + "experimentalNuGetDependency": { + "type": "boolean" + }, + "useWinUI3": { + "type": "boolean" + }, + "nuGetTestVersion": { + "type": "string" + }, + "reactNativeEngine": { + "type": "string" + }, + "nuGetTestFeed": { + "type": "string" + }, + "overwrite": { + "type": "boolean", + "description": "Whether to attempt to override the existing builds files when running a build once more" + }, + "release": { + "type": "boolean", + "description": "Enables full packaging of the app for release" + }, + "root": { + "type": "string", + "description": "Project root folder location (not the app itself, which is in platformBuilds)" + }, + "singleproc": { + "type": "boolean", + "description": "Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)" + }, + "emulator": { + "type": "boolean" + }, + "device": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "remoteDebugging": { + "type": "boolean" + }, + "logging": { + "type": "boolean", + "description": "Logging all the build proccesses to console" + }, + "packager": { + "type": "boolean" + }, + "bundle": { + "type": "boolean" + }, + "launch": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "autolink": { + "type": "boolean", + "description": "Launches the application once the build process is finished" + }, + "build": { + "type": "boolean", + "description": "Builds the application before launching it" + }, + "sln": { + "type": "string", + "description": "Location of Visual Studio solution .sln file (wraps multiple projects)" + }, + "proj": { + "type": "string", + "description": "Root project directory for your React Native Windows project (not Visual Studio project)" + }, + "appPath": { + "type": "string", + "description": "Full path to windows plaform build directory" + }, + "msbuildprops": { + "type": "string", + "description": "Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2" + }, + "buildLogDirectory": { + "type": "string", + "description": "Full path to directory where builds logs should be stored, default - project path" + }, + "info": { + "type": "boolean", + "description": "Print information about the build machine to console" + }, + "directDebugging": { + "type": "boolean" + }, + "telemetry": { + "type": "boolean", + "description": "Send analytics data of @react-native-windows/cli usage to Microsoft" + }, + "devPort": { + "type": "string" + }, + "additionalMetroOptions": { + "type": "object", + "additionalProperties": {} + }, + "packageExtension": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": [ + "buildSchemes" + ], + "additionalProperties": false + }, + "xbox": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows" + } + }, + "required": [ + "android", + "androidtv", + "androidwear", + "firetv", + "ios", + "tvos", + "tizen", + "tizenmobile", + "tizenwatch", + "webos", + "web", + "webtv", + "chromecast", + "kaios", + "macos", + "linux", + "windows", + "xbox" + ], + "additionalProperties": false, + "description": "Object containing platform configurations" + }, + "zodPlatformAndroidFragment": { + "type": "object", + "properties": { + "enableAndroidX": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableAndroidX" + }, + "enableJetifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/enableJetifier" + }, + "signingConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/signingConfig" + }, + "minSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minSdkVersion" + }, + "multipleAPKs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/multipleAPKs" + }, + "aab": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/aab" + }, + "extraGradleParams": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/extraGradleParams" + }, + "minifyEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/minifyEnabled" + }, + "targetSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/targetSdkVersion" + }, + "compileSdkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/compileSdkVersion" + }, + "kotlinVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/kotlinVersion" + }, + "ndkVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/ndkVersion" + }, + "supportLibVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/supportLibVersion" + }, + "googleServicesVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/googleServicesVersion" + }, + "gradleBuildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleBuildToolsVersion" + }, + "gradleWrapperVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/gradleWrapperVersion" + }, + "excludedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/excludedFeatures" + }, + "includedFeatures": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/includedFeatures" + }, + "buildToolsVersion": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/buildToolsVersion" + }, + "disableSigning": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/disableSigning" + }, + "storeFile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/storeFile" + }, + "keyAlias": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/keyAlias" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "flipperEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/flipperEnabled" + } + }, + "additionalProperties": false + }, + "zodPlatformiOSFragment": { + "type": "object", + "properties": { + "ignoreWarnings": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreWarnings" + }, + "ignoreLogs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/ignoreLogs" + }, + "deploymentTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/deploymentTarget" + }, + "orientationSupport": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/orientationSupport" + }, + "teamID": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamID" + }, + "excludedArchs": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/excludedArchs" + }, + "urlScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/urlScheme" + }, + "teamIdentifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/teamIdentifier" + }, + "scheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/scheme" + }, + "schemeTarget": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/schemeTarget" + }, + "appleId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/appleId" + }, + "provisioningStyle": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningStyle" + }, + "newArchEnabled": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/newArchEnabled" + }, + "codeSignIdentity": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentity" + }, + "commandLineArguments": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/commandLineArguments" + }, + "provisionProfileSpecifier": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifier" + }, + "provisionProfileSpecifiers": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisionProfileSpecifiers" + }, + "allowProvisioningUpdates": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/allowProvisioningUpdates" + }, + "provisioningProfiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/provisioningProfiles" + }, + "codeSignIdentities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/codeSignIdentities" + }, + "systemCapabilities": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/systemCapabilities" + }, + "entitlements": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/entitlements" + }, + "runScheme": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/runScheme" + }, + "sdk": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/sdk" + }, + "testFlightId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/testFlightId" + }, + "firebaseId": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/firebaseId" + }, + "exportOptions": { + "$ref": "#/definitions/zodPlatformsSchema/properties/ios/properties/buildSchemes/additionalProperties/properties/exportOptions" + } + }, + "additionalProperties": false + }, + "zodPlatformBaseFragment": { + "type": "object", + "properties": { + "extendPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/extendPlatform" + }, + "assetFolderPlatform": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/assetFolderPlatform" + }, + "engine": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/engine" + }, + "entryFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/entryFile" + }, + "bundleAssets": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleAssets" + }, + "enableSourceMaps": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/enableSourceMaps" + }, + "bundleIsDev": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/bundleIsDev" + }, + "getJsBundleFile": { + "$ref": "#/definitions/zodCommonSchema/properties/buildSchemes/additionalProperties/properties/getJsBundleFile" + } + }, + "additionalProperties": false + }, + "zodPlatformLightningFragment": { + "type": "object", + "properties": { + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "zodPlatformNextJsFragment": { + "type": "object", + "properties": { + "pagesDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/pagesDir" + }, + "outputDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/outputDir" + }, + "exportDir": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/exportDir" + }, + "nextTranspileModules": { + "$ref": "#/definitions/zodPlatformsSchema/properties/web/properties/buildSchemes/additionalProperties/properties/nextTranspileModules" + } + }, + "additionalProperties": false + }, + "zodPlatformWebFragment": { + "type": "object", + "properties": { + "timestampBuildFiles": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/timestampBuildFiles" + }, + "devServerHost": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/devServerHost" + }, + "environment": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/environment" + } + }, + "additionalProperties": false + }, + "zodPlatformTizenFragment": { + "type": "object", + "properties": { + "package": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/package" + }, + "certificateProfile": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/certificateProfile" + }, + "appName": { + "$ref": "#/definitions/zodPlatformsSchema/properties/tizen/properties/buildSchemes/additionalProperties/properties/appName" + } + }, + "additionalProperties": false + }, + "zodPlatformReactNativeFragment": { + "type": "object", + "properties": { + "reactNativeEngine": { + "$ref": "#/definitions/zodPlatformsSchema/properties/android/properties/buildSchemes/additionalProperties/properties/reactNativeEngine" + } + }, + "additionalProperties": false + }, + "zodPlatformWindowsFragment": { + "type": "object", + "properties": { + "templateVSProject": { + "$ref": "#/definitions/zodPlatformsSchema/properties/windows/properties/buildSchemes/additionalProperties/properties/templateVSProject" + } + }, + "additionalProperties": false + }, + "zodManifestChildBase": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "android:name": { + "type": "string" + }, + "android:required": { + "type": "boolean" + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false + }, + "zodManifestChildWithChildren": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name", + "children" + ], + "additionalProperties": false + }, + "zodAndroidManifest": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/definitions/zodManifestChildBase/properties/tag" + }, + "android:name": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:name" + }, + "android:required": { + "$ref": "#/definitions/zodManifestChildBase/properties/android:required" + }, + "package": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/zodManifestChildWithChildren" + } + } + }, + "required": [ + "tag", + "android:name" + ], + "additionalProperties": false, + "description": "Allows you to directly manipulate `AndroidManifest.xml` via json override mechanism\nInjects / Overrides values in AndroidManifest.xml file of generated android based project\n> IMPORTANT: always ensure that your object contains `tag` and `android:name` to target correct tag to merge into\n " + }, + "zodTemplateAndroidFragment": { + "type": "object", + "properties": { + "templateAndroid": { + "$ref": "#/definitions/zodPluginSchema/properties/android/properties/templateAndroid" + } + }, + "additionalProperties": false, + "description": "Allows more advanced modifications to Android based project template" + }, + "zodAppDelegateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "value": { + "type": "string" + }, + "weight": { + "type": "number" + } + }, + "required": [ + "order", + "value", + "weight" + ], + "additionalProperties": false + } + ] + }, + "zodTemplateXcodeFragment": { + "type": "object", + "properties": { + "templateXcode": { + "$ref": "#/definitions/zodPluginSchema/properties/ios/properties/templateXcode" + } + }, + "additionalProperties": false + }, + "zodPlatformElectronFragment": { + "type": "object", + "properties": { + "electronConfig": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/electronConfig" + }, + "BrowserWindow": { + "$ref": "#/definitions/zodPlatformsSchema/properties/macos/properties/buildSchemes/additionalProperties/properties/BrowserWindow" + } + }, + "additionalProperties": false + }, + "zodPlatformWebOSFragment": { + "type": "object", + "properties": { + "iconColor": { + "$ref": "#/definitions/zodPlatformsSchema/properties/webos/properties/buildSchemes/additionalProperties/properties/iconColor" + } + }, + "additionalProperties": false + }, + "rnv.workspace": { + "type": "object", + "properties": { + "defaultTargets": { + "$ref": "#/definitions/zodDefaultTargets", + "description": "Define targets to be used when -t is not set on any project run" + }, + "sdks": { + "type": "object", + "properties": { + "ANDROID_SDK": { + "type": "string" + }, + "ANDROID_NDK": { + "type": "string" + }, + "TIZEN_SDK": { + "type": "string" + }, + "WEBOS_SDK": { + "type": "string" + }, + "KAIOS_SDK": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Define your sdk configurations" + }, + "projectTemplates": { + "$ref": "#/definitions/zodProjectTemplates" + }, + "disableTelemetry": { + "type": "boolean", + "description": "Opt-out from renative telemetry program. More info at https://renative.org/telemetry" + }, + "appConfigsPath": { + "type": "string", + "description": "Enables you to define custom global appConfigs location that every project will automatically use" + }, + "$schema": { + "type": "string", + "description": "schema definition" + } + }, + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-04/schema#" +} \ No newline at end of file diff --git a/packages/core/package.json b/packages/core/package.json index f7e826b9bf..3130d6251d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -13,6 +13,7 @@ "files": [ "LICENSE", "jsonSchema", + "templateFiles", "lib" ], "main": "lib/index.js", @@ -29,7 +30,6 @@ "watch": "tsc --watch --preserveWatchOutput" }, "dependencies": { - "@flexn/plugins": "1.0.9", "ajv": "7.0.0-beta.0", "deepmerge": "3.2.0", "esbuild": "^0.12.1", @@ -44,7 +44,11 @@ "source-map-support": "0.5.13", "svg2js": "0.0.4-alpha1", "tslib": "2.5.2", - "zod": "3.22.4" + "zod": "3.22.4", + "type-fest": "4.14.0" + }, + "peerDependencies": { + "@rnv/config-templates": "^1.0.0-rc.12" }, "private": false, "publishConfig": { diff --git a/packages/core/src/api/defaults.ts b/packages/core/src/api/defaults.ts index 27f68ba94b..0ed0bdac46 100644 --- a/packages/core/src/api/defaults.ts +++ b/packages/core/src/api/defaults.ts @@ -35,9 +35,7 @@ export const generateApiDefaults = (): RnvApi => ({ logAndSave: defaultLog, chalk: defaultLog, logAppInfo: defaultLog, - logComplete: defaultLog, logDebug: defaultLog, - logEnd: defaultLog, logError: defaultLog, logExitTask: defaultLog, logHook: defaultLog, @@ -82,9 +80,6 @@ export const generateApiDefaults = (): RnvApi => ({ inquirerPrompt: async () => { //NOOP }, - pressAnyKeyToContinue: async () => { - //NOOP - }, inquirerSeparator() { //NOOP }, diff --git a/packages/core/src/api/index.ts b/packages/core/src/api/index.ts index 14b5b31286..c3b2c75001 100644 --- a/packages/core/src/api/index.ts +++ b/packages/core/src/api/index.ts @@ -47,7 +47,3 @@ export const inquirerSeparator: RnvApiPrompt['inquirerSeparator'] = (text?: stri export const generateOptions: RnvApiPrompt['generateOptions'] = (inputData, isMultiChoice, mapping, renderMethod) => { return getApi().prompt.generateOptions(inputData, isMultiChoice, mapping, renderMethod); }; - -export const pressAnyKeyToContinue: RnvApiPrompt['pressAnyKeyToContinue'] = () => { - return getApi().prompt.pressAnyKeyToContinue(); -}; diff --git a/packages/core/src/api/types.ts b/packages/core/src/api/types.ts index b88b8d963c..ec313f4483 100644 --- a/packages/core/src/api/types.ts +++ b/packages/core/src/api/types.ts @@ -36,7 +36,6 @@ export type RnvApiPrompt = { mapping?: any, renderMethod?: PromptRenderFn ) => PromptOptions; - pressAnyKeyToContinue: () => Promise; inquirerSeparator: (text?: string) => any; }; @@ -69,7 +68,7 @@ export type RnvApiLogger = { getCurrentCommand: (excludeDollar: boolean) => void; logToSummary: (v: string, sanitizePaths?: () => string) => void; logRaw: (...args: Array) => void; - logSummary: (header: string) => void; + logSummary: (opts?: { header: string }) => void; logTask: (task: string, customChalk?: any) => void; logInitTask: (task: string, customChalk?: string | ((s: string) => string)) => void; logExitTask: (task: string, customChalk?: (s: string) => string) => void; @@ -79,10 +78,8 @@ export type RnvApiLogger = { logDefault: (task: string, customChalk?: any) => void; logDebug: (...args: Array) => void; isInfoEnabled: () => boolean; - logComplete: (isEnd?: boolean) => void; logSuccess: (msg: string) => void; - logError: (e: Error | string | unknown, isEnd?: boolean, skipAnalytics?: boolean) => void; - logEnd: (code: number) => void; + logError: (e: Error | string | unknown, opts?: { skipAnalytics: boolean }) => void; logInitialize: () => void; logAppInfo: (c: RnvContext) => void; printIntoBox: (str: string) => string; @@ -116,4 +113,7 @@ export type PromptParams = { export type PromptRenderFn = (i: number, obj: any, mapping: any, defaultVal: string) => string; -export type GetConfigPropFn = (key: T, defaultVal?: ConfigProp[T]) => ConfigProp[T]; +export type GetConfigPropFn = ( + key: T, + defaultVal?: ConfigProp[T] +) => ConfigProp[T] | undefined; diff --git a/packages/core/src/buildHooks/index.ts b/packages/core/src/buildHooks/index.ts index 5c96b4cdbe..361c0a7f7c 100644 --- a/packages/core/src/buildHooks/index.ts +++ b/packages/core/src/buildHooks/index.ts @@ -2,14 +2,14 @@ import path from 'path'; import { build } from 'esbuild'; import { logDebug, logError, logHook, logInfo } from '../logger'; import { fsExistsSync, copyFolderContentsRecursiveSync } from '../system/fs'; -import { doResolve } from '../system/resolve'; import { inquirerPrompt } from '../api'; import { getConfigProp } from '../context/contextProps'; import { getContext } from '../context/provider'; +import { RnvFolderName } from '../enums/folderName'; export const executePipe = async (key: string) => { const c = getContext(); - logDebug('executePipe', c?.program?.json ? key : `('${key}')`); + logDebug('executePipe', c?.program?.opts()?.json ? key : `('${key}')`); await buildHooks(); @@ -31,10 +31,10 @@ export const buildHooks = async () => { const enableHookRebuild = getConfigProp('enableHookRebuild'); let shouldBuildHook = - c.program.reset || - c.program.resetHard || - c.program.resetAssets || - c.program.hooks || + c.program.opts().reset || + c.program.opts().resetHard || + c.program.opts().resetAssets || + c.program.opts().hooks || !fsExistsSync(c.paths.buildHooks.dist.dir) || enableHookRebuild === true || c.runtime.forceBuildHookRebuild; @@ -42,7 +42,7 @@ export const buildHooks = async () => { if ( (!fsExistsSync(c.paths.buildHooks.src.index) && !fsExistsSync(c.paths.buildHooks.src.indexTs) && - c.program.ci) || + c.program.opts().ci) || c.runtime.skipBuildHooks ) { logInfo('No build hooks found and in --ci mode. SKIPPING'); @@ -52,13 +52,13 @@ export const buildHooks = async () => { const hasNoIndex = !fsExistsSync(c.paths.buildHooks.src.index) && !fsExistsSync(c.paths.buildHooks.src.indexTs); if (hasNoIndex) { - if (c.program.ci) { + if (c.program.opts().ci) { c.runtime.skipBuildHooks = true; return; } let confirmed; - if (c.program.yes) { + if (c.program.opts().yes) { confirmed = true; } else { const { confirm } = await inquirerPrompt({ @@ -70,14 +70,13 @@ export const buildHooks = async () => { } if (confirmed) { - const templatePath = c.buildConfig.currentTemplate ? doResolve(c.buildConfig.currentTemplate) : null; - let buildHooksSource; + const templatePath = c.paths.template.dir; + let buildHooksSource = path.join(templatePath, RnvFolderName.buildHooks, 'src'); // if there is a template and has buildhooks folder, use that instead of the default - if (templatePath && fsExistsSync(`${templatePath}/buildHooks/src`)) { - buildHooksSource = path.join(templatePath, 'buildHooks/src'); + if (fsExistsSync(buildHooksSource)) { shouldBuildHook = true; } else { - buildHooksSource = path.join(c.paths.rnv.dir, 'coreTemplateFiles/buildHooks/src'); + buildHooksSource = path.join(c.paths.rnvCore.templateFilesDir, 'buildHooksSrc'); } copyFolderContentsRecursiveSync(buildHooksSource, c.paths.buildHooks.src.dir); @@ -98,7 +97,7 @@ export const buildHooks = async () => { entryPoints: [indexPath], bundle: true, platform: 'node', - logLimit: c.program.json ? 0 : 10, + logLimit: c.program.opts().json ? 0 : 10, external: [ '@rnv/core', // exclude rnv core from build ...Object.keys(c.files.project.package.dependencies || {}), diff --git a/packages/core/src/configs/appConfigs.ts b/packages/core/src/configs/appConfigs.ts index 1456cfc136..b926190b87 100644 --- a/packages/core/src/configs/appConfigs.ts +++ b/packages/core/src/configs/appConfigs.ts @@ -2,9 +2,9 @@ import path from 'path'; import { fsExistsSync, fsReaddirSync, fsLstatSync, readObjectSync } from '../system/fs'; import { logDefault, logWarning } from '../logger'; -import { ConfigFileApp } from '../schema/configFiles/types'; -import { ConfigName } from '../enums/configName'; +import { RnvFileName } from '../enums/fileName'; import { getContext } from '../context/provider'; +import { ConfigFileApp } from '../schema/types'; const IGNORE_FOLDERS = ['.git']; @@ -22,7 +22,7 @@ export const listAppConfigsFoldersSync = (ignoreHiddenConfigs: boolean, appConfi const appConfigDir = path.join(dirPath, dir); if (!IGNORE_FOLDERS.includes(dir) && fsLstatSync(appConfigDir).isDirectory()) { if (ignoreHiddenConfigs) { - const appConfig = path.join(appConfigDir, ConfigName.renative); + const appConfig = path.join(appConfigDir, RnvFileName.renative); if (fsExistsSync(appConfig)) { try { const config = readObjectSync(appConfig); diff --git a/packages/core/src/configs/buildConfig.ts b/packages/core/src/configs/buildConfig.ts index 9ca3e52e3d..6c70f3fbce 100644 --- a/packages/core/src/configs/buildConfig.ts +++ b/packages/core/src/configs/buildConfig.ts @@ -12,8 +12,8 @@ import { import { chalk, logDefault, logWarning, logDebug } from '../logger'; import { getContext } from '../context/provider'; import type { RnvContext, RnvContextBuildConfig } from '../context/types'; -import { FileUtilsPropConfig } from '../system/types'; -import { PlatformKey } from '../schema/types'; +import type { FileUtilsPropConfig } from '../system/types'; +import type { RnvPlatformKey } from '../types'; const _arrayMergeOverride = (_destinationArray: Array, sourceArray: Array) => sourceArray; @@ -51,9 +51,9 @@ export const generateBuildConfig = () => { const c = getContext(); const mergeOrder = [ - c.paths.defaultWorkspace.config, - c.paths.rnv.projectTemplates.config, - c.paths.rnv.pluginTemplates.config, + // TODO: do we need to merge .rnv/renative.json with .customWorkspace/reantive.json ? + // c.paths.dotRnv.config, + c.paths.rnvConfigTemplates.config, c.paths.workspace.config, c.paths.workspace.configPrivate, c.paths.workspace.configLocal, @@ -81,19 +81,20 @@ export const generateBuildConfig = () => { return exists; }); - const pluginTemplates: Record = {}; - if (c.files.rnv.pluginTemplates.configs) { - Object.keys(c.files.rnv.pluginTemplates.configs).forEach((v) => { - const plgs = c.files.rnv.pluginTemplates.configs[v]; - pluginTemplates[v] = plgs; + const scopedPluginTemplates: Record = {}; + if (c.files.scopedConfigTemplates) { + Object.keys(c.files.scopedConfigTemplates).forEach((v) => { + const plgs = c.files.scopedConfigTemplates[v].pluginTemplates; + scopedPluginTemplates[v] = plgs; }); } const extraPlugins = getEnginesPluginDelta(); const mergeFiles = [ - c.files.defaultWorkspace.config, - c.files.rnv.projectTemplates.config, + // TODO: do we need to merge .rnv/renative.json with .customWorkspace/reantive.json ? + // c.files.dotRnv.config, + c.files.rnvConfigTemplates.config, { plugins: extraPlugins }, // { pluginTemplates }, c.files.workspace.config, @@ -140,7 +141,8 @@ export const generateBuildConfig = () => { arrayMerge: _arrayMergeOverride, }); out = merge({}, out); - out.pluginTemplates = pluginTemplates; + // out.pluginTemplates = pluginTemplates; + out.scopedPluginTemplates = scopedPluginTemplates; c.buildConfig = sanitizeDynamicRefs(c, out); const propConfig: FileUtilsPropConfig = { @@ -152,16 +154,18 @@ export const generateBuildConfig = () => { c.buildConfig = sanitizeDynamicProps(c.buildConfig, propConfig); //Merge extendPlatform - const platforms = c.buildConfig.platforms || {}; - (Object.keys(platforms) as PlatformKey[]).forEach((k) => { - const plat = platforms[k]; - if (plat?.extendPlatform) { - const extPlat = platforms[plat?.extendPlatform]; - if (extPlat) { - platforms[k] = merge(extPlat, plat); + if (c.buildConfig.platforms) { + const platforms = c.buildConfig.platforms || {}; + (Object.keys(platforms) as RnvPlatformKey[]).forEach((k) => { + const plat = platforms[k]; + if (plat?.extendPlatform) { + const extPlat = platforms[plat?.extendPlatform]; + if (extPlat) { + platforms[k] = merge(extPlat, plat); + } } - } - }); + }); + } logDebug('BUILD_CONFIG', Object.keys(c.buildConfig)); @@ -191,7 +195,7 @@ export const generateBuildConfig = () => { }; const _checkBuildSchemeIfEngine = (c: RnvContext) => { - const { scheme } = c.program; + const { scheme } = c.program.opts(); if (!c.platform || !scheme) return; const platform = c.buildConfig?.platforms?.[c.platform]; diff --git a/packages/core/src/configs/configProject.ts b/packages/core/src/configs/configProject.ts index 028f9ecf2c..1b6aef78f4 100644 --- a/packages/core/src/configs/configProject.ts +++ b/packages/core/src/configs/configProject.ts @@ -1,10 +1,9 @@ import { getRealPath, writeFileSync } from '../system/fs'; import { chalk, logDefault, logWarning } from '../logger'; -import { RnvPlatform } from '../types'; -import { PlatformKey } from '../schema/types'; -import { NpmPackageFile } from './types'; -import { ConfigFileProject } from '../schema/configFiles/types'; +import type { RnvPlatform, RnvPlatformKey } from '../types'; +import type { NpmPackageFile } from './types'; import { getContext } from '../context/provider'; +import type { ConfigFileProject } from '../schema/types'; const SYNCED_DEPS = [ 'rnv', @@ -20,8 +19,6 @@ const SYNCED_DEPS = [ '@rnv/template-starter', ]; -const SYNCED_TEMPLATES = ['@rnv/template-starter']; - export const upgradeProjectDependencies = (version: string) => { logDefault('upgradeProjectDependencies'); @@ -55,11 +52,9 @@ export const upgradeDependencies = ( _fixDeps(packageFile?.devDependencies, version); _fixDeps(packageFile?.dependencies, version); _fixDeps(packageFile?.peerDependencies, version); - SYNCED_TEMPLATES.forEach((templ) => { - if (configFile?.templates?.[templ]?.version) { - configFile.templates[templ].version = version; - } - }); + if (configFile?.templateConfig) { + configFile.templateConfig.version = version; + } if (packageFile) { writeFileSync(packagesPath, packageFile); @@ -83,7 +78,7 @@ const _fixDeps = (deps: Record | undefined, version: string) => }); }; -export const updateProjectPlatforms = (platforms: Array) => { +export const updateProjectPlatforms = (platforms: Array) => { const c = getContext(); const { diff --git a/packages/core/src/configs/engines.ts b/packages/core/src/configs/engines.ts index add9577dc7..dc7d6bb8b6 100644 --- a/packages/core/src/configs/engines.ts +++ b/packages/core/src/configs/engines.ts @@ -39,10 +39,10 @@ export const getEngineTemplateByPlatform = (platform: RnvPlatform): RnvEngineTem const mergedEngineConfigs = _getMergedEngineConfigs(c); if (!platform) return null; const engineId = - c.program.engine || + c.program.opts().engine || getConfigProp('engine') || //Adding this as default engines moved from platforms into platformTemplates - c.files.rnv.projectTemplates.config?.platformTemplates?.[platform]?.engine; + c.files.rnvConfigTemplates.config?.platformTemplates?.[platform]?.engine; let selectedEngineConfig: RnvEngineTemplate | null = null; Object.values(mergedEngineConfigs).forEach((engineConfig) => { diff --git a/packages/core/src/configs/index.ts b/packages/core/src/configs/index.ts index 02a845017a..b3d0b474c0 100644 --- a/packages/core/src/configs/index.ts +++ b/packages/core/src/configs/index.ts @@ -1,18 +1,19 @@ import path from 'path'; import { mergeObjects, fsExistsSync, fsReaddirSync, getRealPath, readObjectSync, loadFile } from '../system/fs'; -import { logWarning, logDebug, logDefault } from '../logger'; +import { logWarning, logDebug, logDefault, chalk } from '../logger'; import { doResolve } from '../system/resolve'; -import { RnvContextFileObj, RnvContextPathObj, RnvContext, RnvContextFileKey } from '../context/types'; +import type { RnvContextFileObj, RnvContextPathObj, RnvContextFileKey } from '../context/types'; import { generateRnvConfigPathObj } from '../context/defaults'; import { generateContextPaths } from '../context'; import { generateBuildConfig } from './buildConfig'; import { generateLocalConfig } from './configLocal'; import { getWorkspaceDirPath } from './workspaces'; import { generatePlatformTemplatePaths } from './configProject'; -import { ConfigFileTemplates } from '../schema/configFiles/types'; -import { ConfigName } from '../enums/configName'; +import { RnvFileName } from '../enums/fileName'; import { getContext } from '../context/provider'; +import { RnvFolderName } from '../enums/folderName'; +import type { ConfigFileTemplates } from '../schema/types'; export const loadFileExtended = (fileObj: Record, pathObj: RnvContextPathObj, key: RnvContextFileKey) => { const c = getContext(); @@ -23,7 +24,7 @@ export const loadFileExtended = (fileObj: Record, pathObj: RnvConte const extendsTemplate = fileObj[key]?.extendsTemplate; if (key === 'config' && extendsTemplate) { // extendsTemplate only applies to standard 'config' - let currTemplate = c.files.project[key]?.currentTemplate || fileObj[key].currentTemplate; + let currTemplate = c.files.project[key]?.templateConfig?.name || fileObj[key].templateConfig?.name; if (!currTemplate) { if (extendsTemplate.startsWith('@')) { currTemplate = extendsTemplate.split('/').slice(0, 2).join('/'); @@ -60,7 +61,6 @@ export const loadFileExtended = (fileObj: Record, pathObj: RnvConte }; const _loadConfigFiles = ( - c: RnvContext, fileObj: RnvContextFileObj, pathObj: RnvContextPathObj, parseAppConfigs?: boolean @@ -111,9 +111,9 @@ const _loadConfigFiles = ( const pathObj1: RnvContextPathObj = { ...generateRnvConfigPathObj(), - config: path.join(path1, ConfigName.renative), - configLocal: path.join(path1, ConfigName.renativeLocal), - configPrivate: path.join(path1, ConfigName.renativePrivate), + config: path.join(path1, RnvFileName.renative), + configLocal: path.join(path1, RnvFileName.renativeLocal), + configPrivate: path.join(path1, RnvFileName.renativePrivate), }; pathObj.dirs.push(path1); pathObj.fontsDirs.push(path.join(path1, 'fonts')); @@ -135,9 +135,9 @@ const _loadConfigFiles = ( const path2 = path.join(pathObj.appConfigsDir, extendAppId); const pathObj2: RnvContextPathObj = { ...generateRnvConfigPathObj(), - config: path.join(path2, ConfigName.renative), - configLocal: path.join(path2, ConfigName.renativeLocal), - configPrivate: path.join(path2, ConfigName.renativePrivate), + config: path.join(path2, RnvFileName.renative), + configLocal: path.join(path2, RnvFileName.renativeLocal), + configPrivate: path.join(path2, RnvFileName.renativePrivate), }; const fileObj2: RnvContextFileObj = { configs: [], @@ -167,9 +167,9 @@ const _loadConfigFiles = ( pathObj.dirs.push(path3); pathObj.fontsDirs.push(path.join(path3, 'fonts')); pathObj.pluginDirs.push(path.join(path3, 'plugins')); - pathObj.configs.push(path.join(path3, ConfigName.renative)); - pathObj.configsLocal.push(path.join(path3, ConfigName.renativeLocal)); - pathObj.configsPrivate.push(path.join(path3, ConfigName.renativePrivate)); + pathObj.configs.push(path.join(path3, RnvFileName.renative)); + pathObj.configsLocal.push(path.join(path3, RnvFileName.renativeLocal)); + pathObj.configsPrivate.push(path.join(path3, RnvFileName.renativePrivate)); // FILE3: appConfigs/ loadFileExtended(fileObj, pathObj, 'config'); loadFileExtended(fileObj, pathObj, 'configPrivate'); @@ -183,6 +183,57 @@ const _loadConfigFiles = ( // return result; }; +const generateLookupPaths = (pkgName: string) => { + const pathLookups: string[] = [ + path.join(__dirname, '../..', RnvFolderName.nodeModules, pkgName), + path.resolve(__dirname, '../../..', RnvFolderName.nodeModules, pkgName), + path.resolve(__dirname, '../../../..', RnvFolderName.nodeModules, pkgName), + ]; + return pathLookups; +}; + +export const loadDefaultConfigTemplates = async () => { + const ctx = getContext(); + //This comes from project dependency + const pkgName = '@rnv/config-templates'; + + let configTemplatesPath = doResolve('@rnv/config-templates'); + + if (!fsExistsSync(configTemplatesPath)) { + const pathLookups = generateLookupPaths(pkgName); + configTemplatesPath = pathLookups.find((v) => fsExistsSync(v)); + + if (!configTemplatesPath) { + return Promise.reject( + `RNV Cannot find package: ${chalk().bold(pkgName)}. Looked in: ${chalk().gray(pathLookups.join(', '))}` + ); + } + } + + if (!configTemplatesPath) return Promise.reject(`@rnv/config-templates missing`); + + ctx.paths.rnvConfigTemplates.pluginTemplatesDir = path.join(configTemplatesPath, 'pluginTemplates'); + ctx.paths.rnvConfigTemplates.config = path.join(configTemplatesPath, 'renative.templates.json'); + + const rnvConfigTemplates = readObjectSync(ctx.paths.rnvConfigTemplates.config); + + if (rnvConfigTemplates) { + ctx.files.rnvConfigTemplates.config = rnvConfigTemplates; + ctx.files.scopedConfigTemplates = { + rnv: rnvConfigTemplates, + }; + } + + ctx.paths.scopedConfigTemplates = { + configs: { + rnv: ctx.paths.rnvConfigTemplates.config, + }, + pluginTemplatesDirs: { + rnv: ctx.paths.rnvConfigTemplates.pluginTemplatesDir, + }, + }; +}; + export const parseRenativeConfigs = async () => { logDefault('parseRenativeConfigs'); const c = getContext(); @@ -191,7 +242,7 @@ export const parseRenativeConfigs = async () => { loadFile(c.files.project, c.paths.project, 'package'); // LOAD ./RENATIVE.*.JSON - _loadConfigFiles(c, c.files.project, c.paths.project); + _loadConfigFiles(c.files.project, c.paths.project); if (c.runtime.appId) { c.paths.project.builds.config = path.join(c.paths.project.builds.dir, `${c.runtime.appId}_${c.platform}.json`); @@ -206,16 +257,17 @@ export const parseRenativeConfigs = async () => { const wsDir = getRealPath(await getWorkspaceDirPath(c)); if (wsDir) { generateContextPaths(c.paths.workspace, wsDir); - _loadConfigFiles(c, c.files.workspace, c.paths.workspace); + _loadConfigFiles(c.files.workspace, c.paths.workspace); } - // LOAD DEFAULT WORKSPACE - generateContextPaths(c.paths.defaultWorkspace, c.paths.GLOBAL_RNV_DIR); - _loadConfigFiles(c, c.files.defaultWorkspace, c.paths.defaultWorkspace); + // LOAD DEFAULT WORKSPACE //not needed anymore. loaded at the initial stage + // generateContextPaths(c.paths.defaultWorkspace, c.paths.GLOBAL_RNV_DIR); + // _loadConfigFiles(c, c.files.defaultWorkspace, c.paths.defaultWorkspace); - // LOAD PROJECT TEMPLATES - c.files.rnv.projectTemplates.config = - readObjectSync(c.paths.rnv.projectTemplates.config) || undefined; + // LOAD CONFIG TEMPLATES + //NOTE: loaded in loadDefaultConfigTemplates + // c.files.rnvConfigTemplates.config = + // readObjectSync(c.paths.rnvConfigTemplates.config) || undefined; // // LOAD PLUGIN TEMPLATES // await loadPluginTemplates(c); @@ -233,7 +285,7 @@ export const parseRenativeConfigs = async () => { c.paths.workspace.project, path.join(c.paths.workspace.dir, c.files.project.config.projectName) ); - _loadConfigFiles(c, c.files.workspace.project, c.paths.workspace.project); + _loadConfigFiles(c.files.workspace.project, c.paths.workspace.project); c.paths.workspace.project.appConfigBase.dir = path.join(c.paths.workspace.project.dir, 'appConfigs', 'base'); @@ -247,7 +299,7 @@ export const parseRenativeConfigs = async () => { // ); if (c.runtime.appConfigDir) { generateContextPaths(c.paths.appConfig, c.runtime.appConfigDir); - _loadConfigFiles(c, c.files.appConfig, c.paths.appConfig, true); + _loadConfigFiles(c.files.appConfig, c.paths.appConfig, true); } } @@ -260,7 +312,7 @@ export const parseRenativeConfigs = async () => { path.join(c.paths.workspace.project.appConfigsDir, c.runtime.appId) ); - _loadConfigFiles(c, c.files.workspace.appConfig, c.paths.workspace.appConfig, true); + _loadConfigFiles(c.files.workspace.appConfig, c.paths.workspace.appConfig, true); loadFile(c.files.project.assets, c.paths.project.assets, 'config'); @@ -270,7 +322,7 @@ export const parseRenativeConfigs = async () => { const wsPathReal = getRealPath(wsPath); if (wsPathReal) { generateContextPaths(c.paths.workspace, wsPathReal); - _loadConfigFiles(c, c.files.workspace, c.paths.workspace); + _loadConfigFiles(c.files.workspace, c.paths.workspace); } } diff --git a/packages/core/src/configs/templates.ts b/packages/core/src/configs/templates.ts deleted file mode 100644 index b7f2100bc0..0000000000 --- a/packages/core/src/configs/templates.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { generateOptions } from '../api'; -import { getContext } from '../context/provider'; -import { chalk, logInfo, logDefault, logWarning } from '../logger'; -import { doResolve } from '../system/resolve'; -import { writeRenativeConfigFile } from './utils'; - -export const checkIfTemplateConfigured = async () => { - logDefault('checkIfTemplateConfigured'); - const c = getContext(); - if (c.program.skipDependencyCheck || c.files.project.config?.isTemplate) return true; - if (!c.buildConfig.templates) { - logWarning( - `Your ${chalk().bold(c.paths.project.config)} does not contain ${chalk().bold( - 'templates' - )} object. ReNative will skip template generation` - ); - return false; - } - Object.keys(c.buildConfig.templates).forEach((k) => { - const obj = c.buildConfig.templates?.[k] || { version: 'unknown template version' }; - if (!doResolve(k, false, { basedir: '../' }) && !doResolve(k, false)) { - logInfo( - `Your ${chalk().bold(`${k}@${obj.version}`)} template is missing in renative.json. CONFIGURING...DONE` - ); - c._requiresNpmInstall = true; - c.runtime.requiresBootstrap = true; - } - if (c.files.project.package.devDependencies) { - if (c.files.project.package.devDependencies[k] !== obj.version) { - logInfo(`Updating template ${chalk().bold(`${k}`)} => ${chalk().green(obj.version)}. ...DONE`); - } - - c.files.project.package.devDependencies[k] = obj.version; - } - }); - - writeRenativeConfigFile(c.paths.project.package, c.files.project.package); - - return true; -}; - -export const getTemplateOptions = (isGlobalScope?: boolean) => { - const c = getContext(); - let defaultProjectTemplates; - if (isGlobalScope) { - defaultProjectTemplates = c.files.rnv.projectTemplates.config?.projectTemplates; - } else { - defaultProjectTemplates = c.buildConfig.projectTemplates || {}; - } - - return generateOptions(defaultProjectTemplates, false, null, (i, obj, mapping, defaultVal) => { - const exists = c.buildConfig.templates?.[defaultVal]; - const installed = exists ? chalk().yellow(' (installed)') : ''; - return ` [${chalk().grey(i + 1)}]> ${chalk().bold(defaultVal)}${installed} \n`; - }); -}; diff --git a/packages/core/src/configs/types.ts b/packages/core/src/configs/types.ts index 69b24ab01c..a074fc8d27 100644 --- a/packages/core/src/configs/types.ts +++ b/packages/core/src/configs/types.ts @@ -14,4 +14,9 @@ export type NpmPackageFile = { export type NpmPackageFileKey = keyof NpmPackageFile; -export type NpmDepKey = 'dependencies' | 'devDependencies' | 'peerDependencies'; +export type NpmDepKey = + | 'dependencies' + | 'devDependencies' + | 'peerDependencies' + | 'optionalDependencies' + | 'resolutions'; diff --git a/packages/core/src/configs/workspaces.ts b/packages/core/src/configs/workspaces.ts index 5a7df95712..ec64f16d26 100644 --- a/packages/core/src/configs/workspaces.ts +++ b/packages/core/src/configs/workspaces.ts @@ -1,16 +1,14 @@ import { fsExistsSync, writeFileSync, readObjectSync, mkdirSync } from '../system/fs'; - import { getContext } from '../context/provider'; - import path from 'path'; import { chalk, logDefault, logDebug, logInfo, logWarning } from '../logger'; -import { RnvContext } from '../context/types'; +import type { RnvContext } from '../context/types'; import { generateOptions, inquirerPrompt } from '../api'; -import { ConfigFileWorkspace, ConfigFileWorkspaces } from '../schema/configFiles/types'; +import type { ConfigFileWorkspace, ConfigFileWorkspaces } from '../schema/types'; export const createWorkspace = async (workspaceID: string, workspacePath: string) => { const c = getContext(); - const cnf = c.files.rnv.configWorkspaces; + const cnf = c.files.dotRnv.configWorkspaces; if (!cnf) return; @@ -19,37 +17,40 @@ export const createWorkspace = async (workspaceID: string, workspacePath: string }; const workspaceConfig = { - sdks: c.files.defaultWorkspace?.config?.sdks, - defaultTargets: c.files.defaultWorkspace?.config?.defaultTargets, + // sdks: c.files.defaultWorkspace?.config?.sdks, + // defaultTargets: c.files.defaultWorkspace?.config?.defaultTargets, + // TODO: use empty default? + sdks: {}, + defaultTargets: {}, }; mkdirSync(workspacePath); writeFileSync(path.join(workspacePath, 'renative.json'), workspaceConfig); - writeFileSync(c.paths.rnv.configWorkspaces, cnf); + writeFileSync(c.paths.dotRnv.configWorkspaces, cnf); return true; }; export const getWorkspaceDirPath = async (c: RnvContext) => { logDefault('getWorkspaceDirPath'); - const wss = c.files.rnv.configWorkspaces; + const wss = c.files.dotRnv.configWorkspaces; const ws = c.runtime.selectedWorkspace || c.buildConfig?.workspaceID; let dirPath; if (wss?.workspaces && ws) { dirPath = wss.workspaces[ws]?.path; if (!dirPath) { - const wsDir = path.join(c.paths.home.dir, `.${ws}`); + const wsDir = path.join(c.paths.user.homeDir, `.${ws}`); if (fsExistsSync(wsDir)) { wss.workspaces[ws] = { path: wsDir, }; - writeFileSync(c.paths.rnv.configWorkspaces, wss); + writeFileSync(c.paths.dotRnv.configWorkspaces, wss); logInfo( - `Found workspace id ${ws} and compatible directory ${wsDir}. Your ${c.paths.rnv.configWorkspaces} has been updated.` + `Found workspace id ${ws} and compatible directory ${wsDir}. Your ${c.paths.dotRnv.configWorkspaces} has been updated.` ); - } else if (!c.runtime.isWSConfirmed || c.program.ci === true) { + } else if (!c.runtime.isWSConfirmed || c.program.opts().ci === true) { let confirm = true; - if (c.program.ci !== true) { + if (c.program.opts().ci !== true) { const { conf } = await inquirerPrompt({ name: 'conf', type: 'confirm', @@ -71,7 +72,7 @@ export const getWorkspaceDirPath = async (c: RnvContext) => { } if (!dirPath) { - return c.paths.GLOBAL_RNV_DIR; + return c.paths.dotRnv.dir; } return dirPath; }; @@ -82,52 +83,54 @@ export const getWorkspaceConnectionString = (obj?: ConfigFileWorkspaces['workspa return connectMsg; }; -export const getWorkspaceOptions = (c: RnvContext) => - generateOptions(c.files.rnv.configWorkspaces?.workspaces, false, null, (i, obj, mapping, defaultVal) => { +export const getWorkspaceOptions = () => { + const c = getContext(); + return generateOptions(c.files.dotRnv.configWorkspaces?.workspaces, false, null, (i, obj, mapping, defaultVal) => { logDebug('getWorkspaceOptions'); return ` [${chalk().grey(i + 1)}]> ${chalk().bold(defaultVal)} ${getWorkspaceConnectionString(obj)}\n`; }); +}; export const loadWorkspacesConfigSync = () => { const c = getContext(); // CHECK WORKSPACES - if (fsExistsSync(c.paths.rnv.configWorkspaces)) { - logDebug(`${c.paths.rnv.configWorkspaces} file exists!`); + if (fsExistsSync(c.paths.dotRnv.configWorkspaces)) { + logDebug(`${c.paths.dotRnv.configWorkspaces} file exists!`); - const cnf = readObjectSync(c.paths.rnv.configWorkspaces); + const cnf = readObjectSync(c.paths.dotRnv.configWorkspaces); if (!cnf) return; - c.files.rnv.configWorkspaces = cnf; + c.files.dotRnv.configWorkspaces = cnf; if (!cnf.workspaces) { cnf.workspaces = {}; } if (Object.keys(cnf.workspaces).length === 0) { - logWarning(`No workspace found in ${c.paths.rnv.configWorkspaces}. Creating default rnv one for you`); + logWarning(`No workspace found in ${c.paths.dotRnv.configWorkspaces}. Creating default rnv one for you`); cnf.workspaces = { rnv: { path: c.paths.workspace.dir, }, }; - writeFileSync(c.paths.rnv.configWorkspaces, cnf); + writeFileSync(c.paths.dotRnv.configWorkspaces, cnf); } } else { - logWarning(`Cannot find ${c.paths.rnv.configWorkspaces}. creating one..`); - c.files.rnv.configWorkspaces = { + logWarning(`Cannot find ${c.paths.dotRnv.configWorkspaces}. creating one..`); + c.files.dotRnv.configWorkspaces = { workspaces: { rnv: { path: c.paths.workspace.dir, }, }, }; - writeFileSync(c.paths.rnv.configWorkspaces, c.files.rnv.configWorkspaces); + writeFileSync(c.paths.dotRnv.configWorkspaces, c.files.dotRnv.configWorkspaces); } - const defWsPath = c.paths.GLOBAL_RNV_CONFIG; + const defWsPath = c.paths.dotRnv.config; if (defWsPath && fsExistsSync(defWsPath)) { - c.files.defaultWorkspace.config = readObjectSync(defWsPath) || {}; + c.files.dotRnv.config = readObjectSync(defWsPath) || {}; } }; diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts deleted file mode 100644 index 3b9d43cfb0..0000000000 --- a/packages/core/src/constants.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { PlatformName } from './enums/platformName'; - -// DEPRECATED -export const SUPPORTED_PLATFORMS = [ - PlatformName.ios, - PlatformName.android, - PlatformName.androidtv, - PlatformName.androidwear, - PlatformName.firetv, - PlatformName.web, - PlatformName.webtv, - PlatformName.tizen, - PlatformName.tizenmobile, - PlatformName.tvos, - PlatformName.webos, - PlatformName.macos, - PlatformName.windows, - PlatformName.linux, - PlatformName.tizenwatch, - PlatformName.kaios, - PlatformName.chromecast, - PlatformName.xbox, -] as const; diff --git a/packages/core/src/context/__tests__/index.test.ts b/packages/core/src/context/__tests__/index.test.ts index b60b18375d..809f0be7b1 100644 --- a/packages/core/src/context/__tests__/index.test.ts +++ b/packages/core/src/context/__tests__/index.test.ts @@ -6,18 +6,20 @@ jest.mock('process'); jest.mock('../../logger'); describe('Context tests', () => { - beforeAll(() => { + it('test getContext returns object with keys', async () => { + // GIVEN createRnvContext({ - program: {}, + program: { + opts: () => ({}), + } as any, //Not important for this test process: process, cmd: 'command', subCmd: 'subcommand', RNV_HOME_DIR: '', }); - }); - - it('test getContext returns object with keys', async () => { + // WHEN const cKeys = Object.keys(getContext()).sort(); + // THEN const expectKeys = [ '_renativePluginCache', 'assetConfig', @@ -27,12 +29,14 @@ describe('Context tests', () => { 'cli', 'command', 'configPropsInjects', + 'engineConfigs', 'files', 'injectableConfigProps', 'isBuildHooksReady', 'isDefault', 'isSystemWin', - 'logMessages', + 'logging', + 'mutations', 'paths', 'payload', 'platform', diff --git a/packages/core/src/context/contextProps.ts b/packages/core/src/context/contextProps.ts index c35bd1ca42..3c60dd99e3 100644 --- a/packages/core/src/context/contextProps.ts +++ b/packages/core/src/context/contextProps.ts @@ -1,10 +1,17 @@ -import { GetConfigPropFn } from '../api/types'; -import { RnvContext } from './types'; +import type { GetConfigPropFn } from '../api/types'; +import type { RnvContext } from './types'; import { chalk, logError, logWarning } from '../logger'; -import { ConfigFileBuildConfig } from '../schema'; -import { ConfigProp, ConfigPropKey } from '../schema/types'; -import { BuildConfigPropKey, BuildSchemePropKey, CommonPropKey, PlatPropKey } from '../types'; -import { TimestampPathsConfig } from '../system/types'; +import type { + BuildConfigKey, + CommonBuildSchemeKey, + CommonPropKey, + ConfigFileBuildConfig, + ConfigProp, + ConfigPropKey, + PlatformBuildSchemeKey, + RnvCommonBuildSchemeSchema, +} from '../schema/types'; +import type { TimestampPathsConfig } from '../system/types'; import path from 'path'; import { fsExistsSync } from '../system/fs'; import { getContext } from './provider'; @@ -27,10 +34,7 @@ const _getValueOrMergedObject = (resultScheme: object, resultPlatforms: object, return resultCommon; }; -export const getConfigProp: GetConfigPropFn = ( - key: T, - defaultVal?: ConfigProp[T] -): ConfigProp[T] => { +export const getConfigProp: GetConfigPropFn = (key: T, defaultVal?: ConfigProp[T]) => { const c = getContext(); if (!c.buildConfig) { logError('getConfigProp: c.buildConfig is undefined!'); @@ -44,7 +48,7 @@ export const _getConfigProp = ( key: T, defaultVal?: ConfigProp[T], sourceObj?: Partial -): ConfigProp[T] => { +): ConfigProp[T] | undefined => { const { platform } = c; if (!sourceObj || !platform) return undefined; @@ -56,22 +60,24 @@ export const _getConfigProp = ( let scheme; if (platformObj && ps) { scheme = platformObj.buildSchemes?.[ps] || {}; - resultPlatforms = getFlavouredProp(platformObj, key as PlatPropKey); + resultPlatforms = getFlavouredProp(platformObj, key as any); } else { scheme = {}; } - const resultScheme = key && scheme[key as BuildSchemePropKey]; const resultCommonRoot = getFlavouredProp(sourceObj.common || {}, key as CommonPropKey); - const resultCommonScheme = - c.runtime.scheme && - getFlavouredProp(sourceObj.common?.buildSchemes?.[c.runtime.scheme] || {}, key as BuildSchemePropKey); + + const bs: RnvCommonBuildSchemeSchema = + (!!c.runtime.scheme && sourceObj.common?.buildSchemes?.[c.runtime.scheme]) || {}; + + const resultCommonScheme = c.runtime.scheme && getFlavouredProp(bs, key as CommonBuildSchemeKey); const resultCommon = resultCommonScheme || resultCommonRoot; + const resultScheme = key && scheme[key as PlatformBuildSchemeKey]; let result = _getValueOrMergedObject(resultScheme, resultPlatforms, resultCommon); if (result === undefined) { - result = getFlavouredProp(sourceObj, key as BuildConfigPropKey); + result = getFlavouredProp(sourceObj, key as BuildConfigKey); } if (result === undefined) result = defaultVal; // default the value only if it's not specified in any of the files. i.e. undefined diff --git a/packages/core/src/context/defaults.ts b/packages/core/src/context/defaults.ts index 22af30dfe9..003b91c7d3 100644 --- a/packages/core/src/context/defaults.ts +++ b/packages/core/src/context/defaults.ts @@ -1,8 +1,7 @@ +// import path from 'path'; import type { RnvContext, RnvContextPathObj } from './types'; -import { homedir } from 'os'; - -export const USER_HOME_DIR = homedir(); +// export const USER_HOME_DIR = homedir(); export const generateRnvConfigPathObj = (): RnvContextPathObj => { return { @@ -30,6 +29,7 @@ export const generateRnvConfigFileObj = () => { }; const runtime: RnvContext['runtime'] = { + integrationsByIndex: [], plugins: {}, pluginVersions: {}, enginesByPlatform: {}, @@ -50,9 +50,7 @@ const runtime: RnvContext['runtime'] = { skipBuildHooks: false, skipActiveServerCheck: false, versionCheckCompleted: false, - requiresForcedTemplateApply: false, forceBuildHookRebuild: false, - keepSessionActive: false, requiresBootstrap: false, port: 3000, runtimeExtraProps: {}, @@ -61,7 +59,15 @@ const runtime: RnvContext['runtime'] = { export const generateContextDefaults = (): RnvContext => ({ isDefault: true, isSystemWin: false, - logMessages: [], + engineConfigs: [], + mutations: { + pendingMutations: [], + }, + logging: { + logMessages: [], + containsError: false, + containsWarning: false, + }, timeEnd: new Date(), timeStart: new Date(), payload: {}, @@ -79,9 +85,21 @@ export const generateContextDefaults = (): RnvContext => ({ option: () => { //NOOP }, + opts: () => { + return {}; + }, parse: () => { //NOOP }, + outputHelp: () => { + //NOOP + }, + allowUnknownOption() { + //NOOP + }, + showHelpAfterError() { + //NOOP + }, }, buildConfig: {}, command: '', @@ -96,28 +114,31 @@ export const generateContextDefaults = (): RnvContext => ({ injectableConfigProps: {}, runtime, paths: { - CURRENT_DIR: '', IS_LINKED: false, IS_NPX_MODE: false, - RNV_HOME_DIR: '', - RNV_NODE_MODULES_DIR: '', appConfigBase: '', - GLOBAL_RNV_CONFIG: '', + user: { + currentDir: '', + homeDir: '', + }, rnv: { - configWorkspaces: '', dir: '', package: '', - pluginTemplates: { - dirs: {}, - }, - projectTemplates: { - config: '', - dir: '', - }, - engines: { - dir: '', - }, - projectTemplate: { dir: '' }, + }, + scopedConfigTemplates: { + configs: {}, + pluginTemplatesDirs: {}, + }, + rnvCore: { + dir: '', + templateFilesDir: '', + package: '', + }, + rnvConfigTemplates: { + config: '', + dir: '', + package: '', + pluginTemplatesDir: '', }, workspace: { ...generateRnvConfigPathObj(), @@ -133,24 +154,10 @@ export const generateContextDefaults = (): RnvContext => ({ ...generateRnvConfigPathObj(), }, }, - defaultWorkspace: { - ...generateRnvConfigPathObj(), - project: { - appConfigBase: { - dir: '', - }, - builds: { - dir: '', - }, - assets: { - dir: '', - }, - }, - appConfig: { - configs: [], - configsPrivate: [], - configsLocal: [], - }, + dotRnv: { + dir: '', + config: '', + configWorkspaces: '', }, project: { ...generateRnvConfigPathObj(), @@ -180,7 +187,6 @@ export const generateContextDefaults = (): RnvContext => ({ appConfig: { ...generateRnvConfigPathObj(), }, - GLOBAL_RNV_DIR: '', buildHooks: { dist: { dir: '', @@ -194,9 +200,7 @@ export const generateContextDefaults = (): RnvContext => ({ tsconfig: '', dir: '', }, - home: { - dir: '', - }, + template: { configTemplate: '', appConfigBase: { @@ -215,12 +219,22 @@ export const generateContextDefaults = (): RnvContext => ({ }, files: { rnv: { - pluginTemplates: { - configs: {}, + package: {}, + }, + dotRnv: { + configWorkspaces: { + workspaces: {}, }, - projectTemplates: {}, + config: {}, + }, + rnvCore: { + package: {}, + }, + rnvConfigTemplates: { + config: {}, package: {}, }, + scopedConfigTemplates: {}, workspace: { ...generateRnvConfigFileObj(), project: { @@ -230,17 +244,6 @@ export const generateContextDefaults = (): RnvContext => ({ ...generateRnvConfigFileObj(), }, }, - defaultWorkspace: { - ...generateRnvConfigFileObj(), - project: { - ...generateRnvConfigFileObj(), - }, - appConfig: { - configs: [], - configsPrivate: [], - configsLocal: [], - }, - }, project: { ...generateRnvConfigFileObj(), builds: {}, diff --git a/packages/core/src/context/index.ts b/packages/core/src/context/index.ts index 7383ba4c22..bf71b89962 100644 --- a/packages/core/src/context/index.ts +++ b/packages/core/src/context/index.ts @@ -1,16 +1,17 @@ import { fsExistsSync, fsReadFileSync } from '../system/fs'; import { CreateContextOptions, RnvContext, RnvContextPathObj } from './types'; -import { USER_HOME_DIR, generateContextDefaults } from './defaults'; +import { generateContextDefaults } from './defaults'; import path from 'path'; import { mkdirSync } from 'fs'; import { isSystemWin } from '../system/is'; -import { ConfigName } from '../enums/configName'; +import { RnvFileName } from '../enums/fileName'; +import { homedir } from 'os'; export const generateContextPaths = (pathObj: RnvContextPathObj, dir: string, configName?: string) => { pathObj.dir = dir; - pathObj.config = path.join(dir, configName || ConfigName.renative); - pathObj.configLocal = path.join(dir, ConfigName.renativeLocal); - pathObj.configPrivate = path.join(dir, ConfigName.renativePrivate); + pathObj.config = path.join(dir, configName || RnvFileName.renative); + pathObj.configLocal = path.join(dir, RnvFileName.renativeLocal); + pathObj.configPrivate = path.join(dir, RnvFileName.renativePrivate); pathObj.appConfigsDir = path.join(dir, '..'); }; @@ -27,74 +28,107 @@ const populateLinkingInfo = (ctx: RnvContext) => { ctx.paths.IS_NPX_MODE = isNpxMode; }; -export const createRnvContext = (ctx?: CreateContextOptions) => { - if (!ctx && !global.RNV_CONTEXT) { - // Initial empty context to be initialized - global.RNV_CONTEXT = generateContextDefaults(); - return; +export const createRnvContext = (ctxOpts?: CreateContextOptions) => { + // console.trace('CREATE_RNV_CONTEXT', !!ctxOpts, !!global.RNV_CONTEXT, global.RNV_CONTEXT?.isDefault); + + const isJestMode = process.env.JEST_WORKER_ID !== undefined; + let haltExecution = false; + if (!!ctxOpts && !!global.RNV_CONTEXT) { + // Handle direct initialize of context + if (!global.RNV_CONTEXT?.isDefault) { + if (!isJestMode) { + haltExecution = true; + } + } else { + // if isDefault=true, we can safely reinitialize + // as it means we are not fully initialized yet + } + } else if (!ctxOpts) { + // Handle new imports of @rnv/core + if (!global.RNV_CONTEXT) { + if (!isJestMode) { + // Initial empty context to be initialized + global.RNV_CONTEXT = generateContextDefaults(); + return; + } else { + // We are in jest test mode. (multiple imports will occur due to mocking of imports in tests) + // We do not initialize context but do not throw error + return; + } + } + // Full Context already initialized. Another @rnv/core instance has been just imported + haltExecution = true; } - if (!global.RNV_CONTEXT?.isDefault) { - // Full Context already initialized. Another RNV is trying to initialize - - if (global.RNV_CONTEXT.paths.rnv.dir !== ctx?.RNV_HOME_DIR) { - // If locations of RNV do not match throw warning as this might produce problems! - console.log(` -======= -WARNING: it seems your project is executed with 2 different versions of RNV: -INITIAL (Will be used) located at: ${global.RNV_CONTEXT.paths.rnv.dir}. -NEW: (Will NOT be used) located at: v${ctx?.RNV_HOME_DIR}. --- -This usually happens if: -A) you have multiple versions of rnv dependencies located in your repository -B) you are running project with global rnv (without npx). --- -This might result in unexpected issues! -Make sure all your rnv dependencies are of same version and you are executing with npx prefix -======= + if (haltExecution) { + const msg = + 'This usually happens if you have multiple versions of @rnv/core dependencies located in your project or you are running project with global rnv (without npx).'; + const err = new Error(` + +FATAL: Multiple instances of @rnv/core detected: + +1 (${global.RNV_CONTEXT.timeStart.toISOString()}) + ${global.RNV_CONTEXT.paths?.rnvCore?.dir || 'UNKNOWN (can happen if running older versions of RNV)'} +2 (${new Date().toISOString()}) + ${path.join(__dirname, '../..')} + +${msg} `); - } - return; + + throw err; } + const c: RnvContext = generateContextDefaults(); - c.program = ctx?.program || c.program; - c.process = ctx?.process || c.process; - c.command = ctx?.cmd || c.command; - c.subCommand = ctx?.subCmd || c.subCommand; + c.program = ctxOpts?.program || c.program; + c.process = ctxOpts?.process || c.process; + c.command = ctxOpts?.cmd || c.command; + c.subCommand = ctxOpts?.subCmd || c.subCommand; c.isSystemWin = isSystemWin; - c.paths.rnv.dir = ctx?.RNV_HOME_DIR || c.paths.rnv.dir; - - c.paths.CURRENT_DIR = path.resolve('.'); - c.paths.RNV_NODE_MODULES_DIR = path.join(c.paths.rnv.dir, 'node_modules'); - - c.paths.rnv.engines.dir = path.join(c.paths.rnv.dir, 'engineTemplates'); - c.paths.rnv.pluginTemplates.overrideDir = path.join(c.paths.rnv.dir, 'pluginTemplates'); + global.RNV_CONTEXT = c; - c.paths.rnv.pluginTemplates.config = path.join(c.paths.rnv.pluginTemplates.overrideDir, ConfigName.renativePlugins); - c.paths.rnv.projectTemplates.dir = path.join(c.paths.rnv.dir, 'coreTemplateFiles'); - c.paths.rnv.projectTemplates.config = path.join(c.paths.rnv.projectTemplates.dir, ConfigName.renativeTemplates); - c.paths.rnv.package = path.join(c.paths.rnv.dir, 'package.json'); + populateContextPaths(c, ctxOpts?.RNV_HOME_DIR); - c.paths.rnv.projectTemplate.dir = path.join(c.paths.rnv.dir, 'coreTemplateFiles'); - c.files.rnv.package = JSON.parse(fsReadFileSync(c.paths.rnv.package).toString()); + c.isDefault = false; +}; - c.platform = c.program.platform; - c.paths.home.dir = USER_HOME_DIR; - c.paths.GLOBAL_RNV_DIR = path.join(c.paths.home.dir, '.rnv'); - c.paths.GLOBAL_RNV_CONFIG = path.join(c.paths.GLOBAL_RNV_DIR, ConfigName.renative); - c.paths.rnv.configWorkspaces = path.join(c.paths.GLOBAL_RNV_DIR, ConfigName.renativeWorkspaces); +export const populateContextPaths = (c: RnvContext, RNV_HOME_DIR: string | undefined) => { + // user ------------------ + c.paths.user.homeDir = homedir(); + c.paths.user.currentDir = path.resolve('.'); + + // @rnv/core ------------------ + c.paths.rnvCore.dir = path.join(__dirname, '../..'); + c.paths.rnvCore.templateFilesDir = path.join(c.paths.rnvCore.dir, 'templateFiles'); + c.paths.rnvCore.package = path.join(c.paths.rnvCore.dir, RnvFileName.package); + //TODO: move out. this is only for paths + c.files.rnvCore.package = JSON.parse(fsReadFileSync(c.paths.rnvCore.package).toString()); + + // rnv ------------------ + if (RNV_HOME_DIR) { + c.paths.rnv.dir = RNV_HOME_DIR; + c.paths.rnv.package = path.join(c.paths.rnv.dir, RnvFileName.package); + //TODO: move out. this is only for paths + c.files.rnv.package = JSON.parse(fsReadFileSync(c.paths.rnv.package).toString()); + } - if (!fsExistsSync(c.paths.GLOBAL_RNV_DIR)) { - mkdirSync(c.paths.GLOBAL_RNV_DIR); + // dotRnv ------------------ + c.paths.dotRnv.dir = path.join(c.paths.user.homeDir, '.rnv'); + if (!fsExistsSync(c.paths.dotRnv.dir)) { + mkdirSync(c.paths.dotRnv.dir); } + c.paths.dotRnv.config = path.join(c.paths.dotRnv.dir, RnvFileName.renative); + c.paths.dotRnv.configWorkspaces = path.join(c.paths.dotRnv.dir, RnvFileName.renativeWorkspaces); - generateContextPaths(c.paths.project, c.paths.CURRENT_DIR, c.program.configName); + // workspace ------------------ + generateContextPaths(c.paths.workspace, c.paths.dotRnv.dir); - // TODO: generate solution root + // solution ------------------ + // TODO: generate solution root paths - populateLinkingInfo(c); + // project ------------------ + generateContextPaths(c.paths.project, c.paths.user.currentDir, c.program.opts().configName); c.paths.buildHooks.dir = path.join(c.paths.project.dir, 'buildHooks'); c.paths.buildHooks.src.dir = path.join(c.paths.buildHooks.dir, 'src'); c.paths.buildHooks.dist.dir = path.join(c.paths.buildHooks.dir, 'dist'); @@ -102,11 +136,11 @@ Make sure all your rnv dependencies are of same version and you are executing wi c.paths.buildHooks.src.indexTs = path.join(c.paths.buildHooks.src.dir, 'index.ts'); c.paths.buildHooks.dist.index = path.join(c.paths.buildHooks.dist.dir, 'index.js'); c.paths.buildHooks.tsconfig = path.join(c.paths.buildHooks.dir, 'tsconfig.json'); - // c.paths.buildHooks.tsconfig = path.join(__dirname, '../../supportFiles/tsconfig.hooks.json'); + // c.paths.buildHooks.tsconfig = path.join(__dirname, '../../templateFiles/tsconfig.hooks.json'); c.paths.project.nodeModulesDir = path.join(c.paths.project.dir, 'node_modules'); c.paths.project.srcDir = path.join(c.paths.project.dir, 'src'); c.paths.project.appConfigsDir = path.join(c.paths.project.dir, 'appConfigs'); - c.paths.project.package = path.join(c.paths.project.dir, 'package.json'); + c.paths.project.package = path.join(c.paths.project.dir, RnvFileName.package); c.paths.project.dotRnvDir = path.join(c.paths.project.dir, '.rnv'); // c.paths.project.npmLinkPolyfill = path.join( // c.paths.project.dir, @@ -118,12 +152,20 @@ Make sure all your rnv dependencies are of same version and you are executing wi c.paths.project.appConfigBase.fontsDirs = [c.paths.project.appConfigBase.fontsDir]; c.paths.project.assets.dir = path.join(c.paths.project.dir, 'platformAssets'); c.paths.project.assets.runtimeDir = path.join(c.paths.project.assets.dir, 'runtime'); - c.paths.project.assets.config = path.join(c.paths.project.assets.dir, ConfigName.renativeRuntime); + c.paths.project.assets.config = path.join(c.paths.project.assets.dir, RnvFileName.renativeRuntime); c.paths.project.builds.dir = path.join(c.paths.project.dir, 'platformBuilds'); - generateContextPaths(c.paths.workspace, c.paths.GLOBAL_RNV_DIR); + // @rnv/config-templates ------------------ + // NOTE: this is generated after @rnv/config-templates is loaded dynamically + // c.paths.rnvConfigTemplates.pluginTemplatesDir = '????'; + // c.paths.rnvConfigTemplates.config = path.join( + // c.paths.rnvConfigTemplates.pluginTemplatesDir, + // RnvFileName.renativeTemplates + // ); - global.RNV_CONTEXT = c; + // runtime + c.platform = c.program.opts().platform; + populateLinkingInfo(c); }; createRnvContext(); diff --git a/packages/core/src/context/provider.ts b/packages/core/src/context/provider.ts index f9dfe12752..a3c1a811e7 100644 --- a/packages/core/src/context/provider.ts +++ b/packages/core/src/context/provider.ts @@ -1,6 +1,7 @@ +import type { ProgramOptionsKey } from '../tasks/constants'; import type { RnvContext } from './types'; // We separate this context access from the rest to avoid circular reference issues -export const getContext = (): RnvContext => { - return global.RNV_CONTEXT; +export const getContext = (): RnvContext => { + return global.RNV_CONTEXT as RnvContext; }; diff --git a/packages/core/src/context/runtime.ts b/packages/core/src/context/runtime.ts index 68d154a996..6c7f77bec6 100644 --- a/packages/core/src/context/runtime.ts +++ b/packages/core/src/context/runtime.ts @@ -1,8 +1,7 @@ import path from 'path'; -import { getEngineRunnerByPlatform } from '../engines'; import { isSystemWin } from '../system/is'; -import { fsExistsSync, fsReadFileSync, getRealPath } from '../system/fs'; -import { RnvContext, RnvContextPlatform } from './types'; +import { fsExistsSync, fsReadFileSync } from '../system/fs'; +import { RnvContext } from './types'; import { generateRuntimePropInjects } from '../system/injectors'; import { getConfigProp } from './contextProps'; import { logDebug, logDefault } from '../logger'; @@ -31,17 +30,17 @@ export const configureRuntimeDefaults = async () => { const defaultHost = isSystemWin ? '127.0.0.1' : '0.0.0.0'; - const portString = c.program.port || port || c.runtime.currentPlatform?.defaultPort; // PLATFORMS[c.platform]?.defaultPort; + const portString = c.program.opts().port || port || c.runtime.currentPlatform?.defaultPort; // PLATFORMS[c.platform]?.defaultPort; const portOffset = c.buildConfig?.defaults?.portOffset || 0; c.runtime.port = Number(portString) + portOffset; - if (c.program.target !== true) { - c.runtime.target = c.program.target || defaultTarget; - } else c.runtime.isTargetTrue = c.program.target; - c.runtime.scheme = c.program.scheme || 'debug'; - c.runtime.localhost = c.program.hostIp || defaultHost; + if (c.program.opts().target !== true) { + c.runtime.target = c.program.opts().target || defaultTarget; + } else c.runtime.isTargetTrue = c.program.opts().target; + c.runtime.scheme = c.program.opts().scheme || 'debug'; + c.runtime.localhost = c.program.opts().hostIp || defaultHost; c.runtime.timestamp = c.runtime.timestamp || Date.now(); c.configPropsInjects = c.configPropsInjects || []; c.systemPropsInjects = c.systemPropsInjects || []; @@ -50,35 +49,36 @@ export const configureRuntimeDefaults = async () => { generateRuntimePropInjects(); if (c.buildConfig) { c.runtime.bundleAssets = getConfigProp('bundleAssets') || false; - const { hosted } = c.program; + const { hosted } = c.program.opts(); c.runtime.hosted = hosted && c.runtime.currentPlatform?.isWebHosted; if (c.buildConfig.defaults?.supportedPlatforms) { - c.runtime.supportedPlatforms = []; - c.buildConfig.defaults.supportedPlatforms.forEach((platform) => { - //TODO: migrate to singular platform engine - const engine = getEngineRunnerByPlatform(platform); - if (engine) { - const dir = engine.originalTemplatePlatformsDir; + // c.runtime.supportedPlatforms = []; + c.runtime.availablePlatforms = c.buildConfig.defaults?.supportedPlatforms || []; + // c.buildConfig.defaults.supportedPlatforms.forEach((platform) => { + // //TODO: migrate to singular platform engine + // const engine = getEngineRunnerByPlatform(platform); + // if (engine) { + // const dir = engine.originalTemplatePlatformsDir; - let isConnected = false; - let isValid = false; - const pDir = c.paths.project.platformTemplatesDirs?.[platform]; - if (pDir) { - isValid = true; - isConnected = pDir?.includes?.(getRealPath(dir) || 'UNDEFINED'); - } - const port = c.buildConfig.defaults?.ports?.[platform] || c.runtime.currentPlatform?.defaultPort; - const cp: RnvContextPlatform = { - engine, - platform, - isConnected, - port, - isValid, - }; - c.runtime.supportedPlatforms.push(cp); - } - }); + // let isConnected = false; + // let isValid = false; + // const pDir = c.paths.project.platformTemplatesDirs?.[platform]; + // if (pDir) { + // isValid = true; + // isConnected = pDir?.includes?.(getRealPath(dir) || 'UNDEFINED'); + // } + // const port = c.buildConfig.defaults?.ports?.[platform] || c.runtime.currentPlatform?.defaultPort; + // const cp: RnvContextPlatform = { + // engine, + // platform, + // isConnected, + // port, + // isValid, + // }; + // c.runtime.supportedPlatforms.push(cp); + // } + // }); } } return true; diff --git a/packages/core/src/context/types.ts b/packages/core/src/context/types.ts index c3e85b938c..955ead9c4e 100644 --- a/packages/core/src/context/types.ts +++ b/packages/core/src/context/types.ts @@ -1,24 +1,28 @@ -import type { ConfigProp, ConfigPropKey, PlatformKey } from '../schema/types'; -import type { RnvEngine, RnvEnginePlatform } from '../engines/types'; -import type { OverridesOptions } from '../system/types'; -import type { RnvPlatform } from '../types'; -import { +import type { ConfigFileApp, + ConfigFileBuildConfig, + ConfigFileEngine, ConfigFileLocal, ConfigFilePlugin, - ConfigFilePlugins, ConfigFilePrivate, ConfigFileProject, ConfigFileRuntime, ConfigFileTemplates, ConfigFileWorkspace, ConfigFileWorkspaces, -} from '../schema/configFiles/types'; -import { NpmPackageFile } from '../configs/types'; -import { ConfigFileBuildConfig } from '../schema/configFiles/buildConfig'; -import type { ParamKeys } from '../tasks/constants'; -import { ExecaChildProcess } from 'execa'; -import { RnvPlugin } from '../plugins/types'; + ConfigProp, + ConfigPropKey, +} from '../schema/types'; +import type { RnvEngine, RnvEnginePlatform } from '../engines/types'; +import type { OverridesOptions } from '../system/types'; +import type { RnvPlatform, RnvPlatformKey } from '../types'; +import type { NpmPackageFile } from '../configs/types'; +import { type ParamKeys, type ProgramOptionsKey } from '../tasks/constants'; +import { type ExecaChildProcess } from 'execa'; +import { type RnvPlugin } from '../plugins/types'; +import type { RnvIntegration } from '../integrations/types'; +import type { DependencyMutation } from '../projects/types'; +import { CamelCasedProperties } from 'type-fest'; export type CreateContextOptions = { program: RnvContextProgram; @@ -28,15 +32,20 @@ export type CreateContextOptions = { RNV_HOME_DIR?: string; }; -export type RnvContextProgram = ParamKeys & { +export type RnvContextProgram = { args?: string[]; rawArgs?: string[]; + opts: () => CamelCasedProperties>; option?: (cmd: string, desc: string) => void; parse?: (arg: string[]) => void; + allowUnknownOption: (p: boolean) => void; + showHelpAfterError: () => void; + outputHelp: () => void; + isHelpInvoked?: boolean; }; -export type RnvContext = { - program: RnvContextProgram; +export type RnvContext = { + program: RnvContextProgram; /** * Extra payload object used by 3rd party (ie @rnv/sdk-apple) to decorate context with extra typed information */ @@ -53,6 +62,10 @@ export type RnvContext = { * complete object containing ALL renative.*.json files collected and merged during execution */ buildConfig: RnvContextBuildConfig; + mutations: { + pendingMutations: Array; + }; + engineConfigs: ConfigFileEngine[]; assetConfig: object; platform: RnvPlatform; process: NodeJS.Process; @@ -74,7 +87,11 @@ export type RnvContext = { runtime: RnvContextRuntime; paths: RnvContextPaths; files: RnvContextFiles; - logMessages: Array; + logging: { + logMessages: Array; + containsError: boolean; + containsWarning: boolean; + }; timeStart: Date; timeEnd: Date; isDefault: boolean; @@ -89,23 +106,22 @@ export type RnvContextBuildConfig = Partial & { }; export type RnvContextRuntime = { + integrationsByIndex: Array; enginesByPlatform: Record; enginesByIndex: Array; enginesById: Record; missingEnginePlugins: Record; supportedPlatforms: Array; runtimeExtraProps: Record; - availablePlatforms: Array; + availablePlatforms: Array; platform: RnvPlatform; isTargetTrue: boolean; bundleAssets: boolean; - keepSessionActive: boolean; hasAllEnginesRegistered: boolean; requiresBootstrap: boolean; forceBuildHookRebuild: boolean; disableReset: boolean; skipActiveServerCheck: boolean; - requiresForcedTemplateApply: boolean; isWSConfirmed: boolean; _skipNativeDepResolutions: boolean; versionCheckCompleted: boolean; @@ -118,11 +134,9 @@ export type RnvContextRuntime = { currentPlatform?: RnvEnginePlatform; currentEngine?: RnvEngine; skipPackageUpdate?: boolean; - selectedTemplate?: string; _platformBuildsSuffix?: string; platformBuildsProjectPath?: string; targetUDID?: string; - forceBundleAssets?: boolean; webpackTarget?: string; shouldOpenBrowser?: boolean; appId?: string; @@ -131,7 +145,6 @@ export type RnvContextRuntime = { localhost?: string; scheme?: string; appDir?: string; - activeTemplate?: string; timestamp?: number; appConfigDir?: string; currentTemplate?: string; @@ -145,25 +158,29 @@ export type RnvContextRuntime = { export type RuntimePropKey = keyof RnvContextRuntime; export type RnvContextFiles = { - rnv: { - pluginTemplates: { - config?: ConfigFilePlugins; - configs: Record; - }; - projectTemplates: { - config?: ConfigFileTemplates; - }; + dotRnv: { configWorkspaces?: ConfigFileWorkspaces; + config: ConfigFileWorkspace; + }; + rnv: { package: NpmPackageFile; }; - workspace: RnvContextFileObj & { - project: RnvContextFileObj; - appConfig: RnvContextFileObj; + rnvCore: { + package: NpmPackageFile; }; - defaultWorkspace: RnvContextFileObj & { + rnvConfigTemplates: { + package?: NpmPackageFile; + config?: ConfigFileTemplates; + }; + scopedConfigTemplates: Record; + workspace: RnvContextFileObj & { project: RnvContextFileObj; appConfig: RnvContextFileObj; }; + // defaultWorkspace: RnvContextFileObj & { + // project: RnvContextFileObj; + // appConfig: RnvContextFileObj; + // }; project: RnvContextFileObj & { builds: Record; assets: { @@ -185,31 +202,34 @@ export type RnvContextFileObj = { }; export type RnvContextPaths = { - GLOBAL_RNV_CONFIG: string; - GLOBAL_RNV_DIR: string; - RNV_HOME_DIR: string; IS_LINKED: boolean; IS_NPX_MODE: boolean; - CURRENT_DIR: string; - RNV_NODE_MODULES_DIR: string; //======= - rnv: { + user: { + homeDir: string; + currentDir: string; + }; + dotRnv: { + dir: string; + config: string; configWorkspaces: string; - pluginTemplates: { - overrideDir?: string; - config?: string; - dirs: Record; - }; - projectTemplates: { - config: string; - dir: string; - }; - engines: { - dir: string; - }; - projectTemplate: { - dir: string; - }; + }; + rnvConfigTemplates: { + dir: string; + package: string; + config: string; + pluginTemplatesDir: string; + }; + scopedConfigTemplates: { + pluginTemplatesDirs: Record; + configs: Record; + }; + rnvCore: { + dir: string; + package: string; + templateFilesDir: string; + }; + rnv: { dir: string; package: string; }; @@ -223,24 +243,24 @@ export type RnvContextPaths = { }; appConfig: RnvContextPathObj; }; - defaultWorkspace: RnvContextPathObj & { - project: { - appConfigBase: { - dir: string; - }; - builds: { - dir: string; - }; - assets: { - dir: string; - }; - }; - appConfig: { - configs: Array; - configsPrivate: Array; - configsLocal: Array; - }; - }; + // defaultWorkspace: RnvContextPathObj & { + // project: { + // appConfigBase: { + // dir: string; + // }; + // builds: { + // dir: string; + // }; + // assets: { + // dir: string; + // }; + // }; + // appConfig: { + // configs: Array; + // configsPrivate: Array; + // configsLocal: Array; + // }; + // }; project: RnvContextPathObj & { appConfigBase: { dir: string; @@ -282,9 +302,6 @@ export type RnvContextPaths = { }; tsconfig: string; }; - home: { - dir: string; - }; template: { appConfigBase: { dir: string; @@ -300,7 +317,7 @@ export type RnvContextPaths = { config: string; dir: string; }; - appConfigBase: string; + appConfigBase: string; //REMOVE? }; export type RnvContextPathObj = { @@ -322,7 +339,7 @@ export type RnvContextPathObj = { }; export type RnvContextPlatform = { - platform: PlatformKey; + platform: RnvPlatformKey; isConnected: boolean; engine?: RnvEngine; port?: number; @@ -330,3 +347,7 @@ export type RnvContextPlatform = { }; export type RnvContextFileKey = 'config' | 'configLocal' | 'configPrivate'; + +export type GetReturnType = Type extends (...args: never[]) => infer Return ? Return : never; + +export type GetContextType = () => GetReturnType; diff --git a/packages/core/src/engines/creator.ts b/packages/core/src/engines/creator.ts new file mode 100644 index 0000000000..bd154494d7 --- /dev/null +++ b/packages/core/src/engines/creator.ts @@ -0,0 +1,28 @@ +import { generateEngineExtensions } from '.'; +import { getContext } from '../context/provider'; +import { generateRnvTaskMap } from '../tasks/taskHelpers'; +import { RnvPlatformKey } from '../types'; +import type { CreateRnvEngineOpts, RnvEngine, RnvEnginePlatforms } from './types'; + +export const createRnvEngine = (opts: CreateRnvEngineOpts) => { + const platforms: RnvEnginePlatforms = opts?.platforms; + Object.keys(platforms).forEach((k) => { + const p = k as RnvPlatformKey; + const plat = platforms[p]; + if (plat) { + plat.extensions = generateEngineExtensions(plat.extensions, opts.config); + } + }); + + const engine: RnvEngine = { + ...opts, + platforms, + serverDirName: opts.serverDirName || '', + projectDirName: opts.projectDirName || '', + runtimeExtraProps: opts.runtimeExtraProps || {}, + tasks: generateRnvTaskMap(opts.tasks, opts.config), + getContext: () => getContext(), + }; + + return engine; +}; diff --git a/packages/core/src/engines/dependencyResolver.ts b/packages/core/src/engines/dependencyResolver.ts new file mode 100644 index 0000000000..88207124f8 --- /dev/null +++ b/packages/core/src/engines/dependencyResolver.ts @@ -0,0 +1,76 @@ +import merge from 'deepmerge'; +import { getContext } from '../context/provider'; +import { logDefault } from '../logger'; +import { getEngineRunnerByPlatform } from '.'; +import { NpmDepKey, NpmPackageFile } from '../configs/types'; +import { createDependencyMutation } from '../projects/mutations'; + +export const resolveEngineDependencies = async () => { + logDefault('resolveEngineDependencies'); + const c = getContext(); + const { platform } = c; + const engine = getEngineRunnerByPlatform(platform); + const npmDepsBase = engine?.config?.npm || {}; + const npmDepsExt = platform ? engine?.config?.platforms?.[platform]?.npm || {} : {}; + + const npmDeps = merge>(npmDepsBase, npmDepsExt); + + if (npmDeps) { + Object.keys(npmDeps).forEach((t) => { + const depType = t as NpmDepKey; + const deps = npmDeps[depType]; + if (deps) { + Object.keys(deps).forEach((k) => { + const ver = c.files.project.package?.[depType]?.[k]; + if (!ver) { + createDependencyMutation({ + name: k, + updated: { + version: deps[k], + }, + type: depType, + msg: 'Missing dependency', + source: 'engine.npm (renative.engine.json)', + targetPath: c.paths.project.package, + }); + } else if (ver !== deps[k]) { + createDependencyMutation({ + name: k, + original: { + version: ver, + }, + updated: { + version: deps[k], + }, + type: depType, + msg: 'Outdated dependency', + source: 'engine.npm (renative.engine.json)', + targetPath: c.paths.project.package, + }); + } + }); + } + }); + } + + // add other deps that are not npm +}; + +// if (installed.some((i) => i === true)) { +// const { isMonorepo } = c.buildConfig; +// if (isMonorepo) { +// logInfo( +// `Found extra npm dependencies required by ${chalk().bold( +// engine.config.id +// )} engine. project marked as monorepo. SKIPPING` +// ); +// } else { +// // do npm i only if something new is added +// logInfo( +// `Found extra npm dependencies required by ${chalk().bold(engine.config.id)} engine. ADDING...DONE` +// ); +// if (handleExtraDepsCallback) { +// await handleExtraDepsCallback(); +// } +// } +// } diff --git a/packages/core/src/engines/index.ts b/packages/core/src/engines/index.ts index ee40e7649b..dc9a33e44d 100644 --- a/packages/core/src/engines/index.ts +++ b/packages/core/src/engines/index.ts @@ -4,25 +4,27 @@ import { installPackageDependencies } from '../projects/npm'; import { logDebug, logDefault, chalk, logInfo, logWarning, logError } from '../logger'; import { doResolve } from '../system/resolve'; import { configurePlugins } from '../plugins'; -import { RnvContext } from '../context/types'; -import { RnvTask, RnvTaskMap } from '../tasks/types'; -import { RenativeConfigVersion, RnvPlatform } from '../types'; -import { RnvEngine, RnvEngineInstallConfig, RnvEngineTemplate } from './types'; +import type { RnvContext } from '../context/types'; +import type { RnvTask } from '../tasks/types'; +import type { RenativeConfigVersion, RnvPlatform } from '../types'; +import type { RnvEngine, RnvEngineInstallConfig, RnvEngineTemplate } from './types'; import { inquirerPrompt } from '../api'; import { getContext } from '../context/provider'; import { writeRenativeConfigFile } from '../configs/utils'; import { checkAndCreateProjectPackage } from '../projects/package'; import { getEngineTemplateByPlatform } from '../configs/engines'; -import { ConfigFileEngine } from '../schema/configFiles/types'; import { getConfigProp } from '../context/contextProps'; - -const ENGINE_CORE = 'engine-core'; +import { registerRnvTasks } from '../tasks/taskRegistry'; +import { createDependencyMutation } from '../projects/mutations'; +import type { ConfigFileEngine } from '../schema/types'; export const registerEngine = async (engine: RnvEngine, platform?: RnvPlatform, engConfig?: RnvEngineTemplate) => { const c = getContext(); logDefault(`registerEngine:${engine.config.id}`); - c.runtime.enginesById[engine.config.id] = engine; + if (engine.config.id) { + c.runtime.enginesById[engine.config.id] = engine; + } c.runtime.enginesByIndex.push(engine); if (engConfig?.packageName) { @@ -34,6 +36,7 @@ export const registerEngine = async (engine: RnvEngine, platform?: RnvPlatform, ); } _registerEnginePlatform(c, platform, engine); + registerRnvTasks(engine.tasks); }; const _registerEnginePlatform = (c: RnvContext, platform?: RnvPlatform, engine?: RnvEngine) => { @@ -67,7 +70,11 @@ export const registerEngineExtension = (ext: string | null, eExt?: string | null export const generateEngineExtensions = (exts: Array, config: ConfigFileEngine) => { const { id, engineExtension } = config; - let extArr = [...registerEngineExtension(id)]; + let extArr: string[] = []; + if (id) { + extArr = [...registerEngineExtension(id)]; + } + exts.forEach((ext) => { extArr = extArr.concat(registerEngineExtension(ext, engineExtension)); }); @@ -75,14 +82,6 @@ export const generateEngineExtensions = (exts: Array, config: ConfigFile return extArr; }; -export const generateEngineTasks = (taskArr: Array) => { - const tasks: RnvTaskMap = {}; - taskArr.forEach((taskInstance) => { - tasks[taskInstance.task] = taskInstance; - }); - return tasks; -}; - export const configureEngines = async (c: RnvContext) => { logDefault('configureEngines'); @@ -90,7 +89,12 @@ export const configureEngines = async (c: RnvContext) => { const devDependencies = c.files.project.package.devDependencies || {}; c.files.project.package.devDependencies = devDependencies; let needsPackageUpdate = false; - if (engines && !c.runtime.skipPackageUpdate && !c.program.skipDependencyCheck && !c.program.skipRnvCheck) { + if ( + engines && + !c.runtime.skipPackageUpdate && + !c.program.opts().skipDependencyCheck && + !c.program.opts().skipRnvCheck + ) { Object.keys(engines).forEach((k) => { const engVer = c.buildConfig.engineTemplates?.[k]?.version; if (engVer) { @@ -125,11 +129,11 @@ export const registerMissingPlatformEngines = async (taskInstance?: RnvTask) => if ( !taskInstance || (!taskInstance.isGlobalScope && taskInstance?.platforms?.length === 0) || - c.program.platform === 'all' + c.program.opts().platform === 'all' ) { const registerEngineList: Array> = []; c.buildConfig.defaults?.supportedPlatforms?.forEach((platform) => { - registerEngineList.push(_registerPlatformEngine(c, platform)); + registerEngineList.push(registerPlatformEngine(platform)); }); if (registerEngineList.length) { @@ -150,7 +154,7 @@ export const registerAllPlatformEngines = async () => { } const registerEngineList: Array> = []; c.buildConfig.defaults.supportedPlatforms.forEach((platform) => { - registerEngineList.push(_registerPlatformEngine(c, platform)); + registerEngineList.push(registerPlatformEngine(platform)); }); if (registerEngineList.length) { @@ -164,7 +168,7 @@ export const loadEnginePluginDeps = async (engineConfigs: Array v.key); const addedPluginsKeys = Object.keys(addedPlugins); @@ -221,95 +226,121 @@ export const loadEnginePackageDeps = async (engineConfigs: Array { const engineConfig = readObjectSync(ecf.configPath); - c.buildConfig.defaults?.supportedPlatforms?.forEach((platform) => { - const npm = engineConfig?.platforms?.[platform]?.npm || {}; - if (npm) { - if (npm.devDependencies) { - const deps = c.files.project.package.devDependencies || {}; - Object.keys(npm.devDependencies).forEach((k) => { - if (!deps[k]) { - const isMonorepo = getConfigProp('isMonorepo'); - if (isMonorepo) { - logInfo( - `Engine ${ecf.key} requires npm devDependency ${k} for platform ${platform}. project marked as monorepo. SKIPPING` - ); - } else { - logInfo( - `Engine ${ecf.key} requires npm devDependency ${k} for platform ${platform}. ADDING...DONE` - ); - if (npm.devDependencies?.[k]) { - deps[k] = npm.devDependencies[k]; - addedDeps.push(k); + if (engineConfig) { + engConfigs.push(engineConfig); + c.buildConfig.defaults?.supportedPlatforms?.forEach((platform) => { + const npm = engineConfig?.platforms?.[platform]?.npm || {}; + if (npm) { + if (npm.devDependencies) { + const deps = c.files.project.package.devDependencies || {}; + Object.keys(npm.devDependencies).forEach((k) => { + if (!deps[k]) { + const isMonorepo = getConfigProp('isMonorepo'); + if (isMonorepo) { + logInfo( + `Engine ${ecf.key} requires npm devDependency ${k} for platform ${platform}. project marked as monorepo. SKIPPING` + ); + } else { + // logInfo( + // `Engine ${ecf.key} requires npm devDependency ${k} for platform ${platform}. ADDING...DONE` + // ); + createDependencyMutation({ + name: k, + updated: { + version: npm.devDependencies?.[k] || 'N/A', + }, + type: 'devDependencies', + msg: `Missing dependency for platform ${platform}`, + source: `engine.npm (${ecf.key})`, + targetPath: c.paths.project.package, + }); + // if (npm.devDependencies?.[k]) { + // deps[k] = npm.devDependencies[k]; + // addedDeps.push(k); + // } } } - } - }); - c.files.project.package.devDependencies = deps; - } - if (npm.dependencies) { - const deps = c.files.project.package.dependencies || {}; - Object.keys(npm.dependencies).forEach((k) => { - if (!deps[k]) { - if (c.files.project.config?.isTemplate) { - if (!c.files.project.package.devDependencies?.[k]) { - logWarning( - `Engine ${ecf.key} requires npm dependency ${k} for platform ${platform}. which in template project should be placed in devDependencies` - ); + }); + c.files.project.package.devDependencies = deps; + } + if (npm.dependencies) { + const deps = c.files.project.package.dependencies || {}; + Object.keys(npm.dependencies).forEach((k) => { + if (!deps[k]) { + if (c.buildConfig?.isTemplate) { + if (!c.files.project.package.devDependencies?.[k]) { + logWarning( + `Engine ${ecf.key} requires npm dependency ${k} for platform ${platform}. which in template project should be placed in devDependencies` + ); + } + } else { + // logInfo( + // `Engine ${ecf.key} requires npm dependency ${k} for platform ${platform}. ADDING...DONE` + // ); + createDependencyMutation({ + name: k, + updated: { + version: npm.dependencies?.[k] || 'N/A', + }, + type: 'dependencies', + msg: `Missing dependency for platform ${platform}`, + source: `engine.npm (${ecf.key})`, + targetPath: c.paths.project.package, + }); + // if (npm.dependencies?.[k]) { + // deps[k] = npm.dependencies[k]; + // addedDeps.push(k); + // } } - } else { + } + }); + c.files.project.package.dependencies = deps; + } + if (npm.optionalDependencies) { + const deps = c.files.project.package.optionalDependencies || {}; + Object.keys(npm.optionalDependencies).forEach((k) => { + if (!deps[k]) { logInfo( - `Engine ${ecf.key} requires npm dependency ${k} for platform ${platform}. ADDING...DONE` + `Engine ${ecf.key} requires npm optionalDependency ${k} for platform ${platform}. ADDING...DONE` ); - if (npm.dependencies?.[k]) { - deps[k] = npm.dependencies[k]; - addedDeps.push(k); - } + createDependencyMutation({ + name: k, + updated: { + version: npm.optionalDependencies?.[k] || 'N/A', + }, + type: 'optionalDependencies', + msg: `Missing optionalDependency for platform ${platform}`, + source: `engine.npm (${ecf.key})`, + targetPath: c.paths.project.package, + }); + // if (npm.optionalDependencies?.[k]) { + // deps[k] = npm.optionalDependencies[k]; + // addedDeps.push(k); + // } } - } - }); - c.files.project.package.dependencies = deps; - } - if (npm.optionalDependencies) { - const deps = c.files.project.package.optionalDependencies || {}; - Object.keys(npm.optionalDependencies).forEach((k) => { - if (!deps[k]) { - logInfo( - `Engine ${ecf.key} requires npm optionalDependency ${k} for platform ${platform}. ADDING...DONE` - ); - if (npm.optionalDependencies?.[k]) { - deps[k] = npm.optionalDependencies[k]; - addedDeps.push(k); - } - } - }); - c.files.project.package.optionalDependencies = deps; - } + }); + c.files.project.package.optionalDependencies = deps; + } - if (addedDeps.length > 0) { - writeFileSync(c.paths.project.package, c.files.project.package); + // if (addedDeps.length > 0) { + // writeFileSync(c.paths.project.package, c.files.project.package); + // } + // } - // - } - }); + }); + } }); - return addedDeps.length; -}; + c.engineConfigs = engConfigs; + return true; -const ENGINE_ID_MAP: Record = { - 'engine-lightning': '@rnv/engine-lightning', - 'engine-rn': '@rnv/engine-rn', - 'engine-rn-electron': '@rnv/engine-rn-electron', - 'engine-rn-macos': '@rnv/engine-rn-macos', - 'engine-rn-next': '@rnv/engine-rn-next', - 'engine-rn-tvos': '@rnv/engine-rn-tvos', - 'engine-rn-web': '@rnv/engine-rn-web', - 'engine-rn-windows': '@rnv/engine-rn-windows', + // return addedDeps.length; }; const _getFilteredEngines = (c: RnvContext) => { @@ -318,23 +349,27 @@ const _getFilteredEngines = (c: RnvContext) => { logError('Engine configs missing in your renative.json. FIXING...DONE'); return {}; } - const rnvPlatforms = c.files.rnv.projectTemplates?.config?.platformTemplates; + const rnvPlatforms = c.files.rnvConfigTemplates.config?.platformTemplates; const supportedPlatforms = c.files.project.config?.defaults?.supportedPlatforms || []; const filteredEngines: Record = {}; - supportedPlatforms.forEach((v) => { - const platforms = c.files.project.config?.platforms || {}; - const engineKey = platforms[v]?.engine || rnvPlatforms?.[v]?.engine; + const ENGINE_ID_MAP = c.files.rnvConfigTemplates.config?.engineIdMap || {}; - if (engineKey) { - const engKey = ENGINE_ID_MAP[engineKey] || engineKey; - if (engines[engKey]) { - filteredEngines[engKey] = engines[engKey]; + supportedPlatforms.forEach((v) => { + if (c.files.project.config) { + const platforms = c.files.project.config?.platforms || {}; + const engineKey = platforms[v]?.engine || rnvPlatforms?.[v]?.engine; + + if (engineKey) { + const engKey = ENGINE_ID_MAP[engineKey] || engineKey; + if (engines[engKey]) { + filteredEngines[engKey] = engines[engKey]; + } else { + logWarning(`Platform ${v} requires engine ${engKey} which is not available in engines list`); + } } else { - logWarning(`Platform ${v} requires engine ${engKey} which is not available in engines list`); + logWarning(`Platform ${v} has no engine configured`); } - } else { - logWarning(`Platform ${v} has no engine configured`); } }); return filteredEngines; @@ -364,8 +399,8 @@ const getScopedVersion = ( return null; }; -export const loadEngines = async (failOnMissingDeps?: boolean): Promise => { - logDefault('loadEngines'); +export const installEngines = async (failOnMissingDeps?: boolean): Promise => { + logDefault('installEngines'); const c = getContext(); if (!fsExistsSync(c.paths.project.config)) return true; @@ -375,6 +410,7 @@ export const loadEngines = async (failOnMissingDeps?: boolean): Promise const readyEngines: Array = []; const engineConfigs: Array = []; // if (filteredEngines) { + Object.keys(filteredEngines).forEach((k) => { const engineRootPath = doResolve(k); const configPath = engineRootPath ? path.join(engineRootPath, 'renative.engine.json') : null; @@ -389,7 +425,7 @@ export const loadEngines = async (failOnMissingDeps?: boolean): Promise } } else { readyEngines.push(k); - logInfo(`Load engine: ${k} ${chalk().gray(`(${engineRootPath})`)}`); + logDefault(`Found engine: ${k} ${chalk().gray(`(${engineRootPath})`)}`); engineConfigs.push({ key: k, engineRootPath, @@ -407,7 +443,7 @@ ${enginesToInstall.map((v) => `> ${v.key}@${v.version} path: ${v.engineRootPath} ${enginesToInstall.map((v) => `> ${v.key}@${v.version}`).join('\n')} ADDING TO PACKAGE.JSON...DONE`); - await checkAndCreateProjectPackage(); + await checkAndCreateProjectPackage(); //TODO: consider to move this to better location const pkg = c.files.project.package; const devDeps = pkg.devDependencies || {}; pkg.devDependencies = devDeps; @@ -419,12 +455,14 @@ ${enginesToInstall.map((v) => `> ${v.key}@${v.version}`).join('\n')} writeFileSync(c.paths.project.package, c.files.project.package); await installPackageDependencies(); - return loadEngines(true); + return installEngines(true); } const plugDepsCount = await loadEnginePluginDeps(engineConfigs); - const pkgDepsCount = await loadEnginePackageDeps(engineConfigs); + // const pkgDepsCount = await loadEnginePackageDeps(engineConfigs); + await loadEnginePackageDeps(engineConfigs); - if (plugDepsCount + pkgDepsCount > 0) { + if (plugDepsCount > 0) { + // if (plugDepsCount + pkgDepsCount > 0) { c.runtime._skipPluginScopeWarnings = true; await configurePlugins(); // TODO: This is too early as scoped plugin have not been installed c.runtime._skipPluginScopeWarnings = false; @@ -432,28 +470,12 @@ ${enginesToInstall.map((v) => `> ${v.key}@${v.version}`).join('\n')} } // All engines ready to be registered - _registerPlatformEngine(c, c.platform); - // } else if (c.files.project.config_original) { - // logError('Engine configs missing in your renative.json. FIXING...DONE'); - // c.files.project.config_original.engines = { - // '@rnv/engine-rn': 'source:rnv', - // '@rnv/engine-rn-web': 'source:rnv', - // '@rnv/engine-rn-next': 'source:rnv', - // '@rnv/engine-rn-electron': 'source:rnv', - // '@rnv/engine-lightning': 'source:rnv', - // '@rnv/engine-rn-macos': 'source:rnv', - // }; - // // TODO: use parseRenativeConfigs instead - // c.buildConfig.engines = c.files.project.config_original.engines; - - // writeFileSync(c.paths.project.config, c.files.project.config_original); - // return loadEngines(c); - // } + registerPlatformEngine(c.platform); return true; }; const _resolvePkgPath = (c: RnvContext, packageName: string) => { - if (c.paths.IS_LINKED && !c.program.unlinked) { + if (c.paths.IS_LINKED && !c.program.opts().unlinked && c.paths.rnv.dir !== '') { // In the instances of running linked rnv instead of installed one load local packages try { let pkgPathLocal = require.resolve(packageName, { paths: [path.join(c.paths.rnv.dir, '..')] }); @@ -481,9 +503,9 @@ const _resolvePkgPath = (c: RnvContext, packageName: string) => { return pkgPath; }; -const _registerPlatformEngine = async (c: RnvContext, platform: RnvPlatform | boolean): Promise => { +export const registerPlatformEngine = async (platform: RnvPlatform | boolean): Promise => { // Only register active platform engine to be faster - + const c = getContext(); if (platform === true || !platform) return; const selectedEngineTemplate = getEngineTemplateByPlatform(platform); @@ -518,58 +540,10 @@ export const getEngineRunnerByPlatform = (platform: RnvPlatform, ignoreMissingEr return selectedEngine; }; -export const getEngineTask = (task: string, tasks?: RnvTaskMap, customTasks?: RnvTaskMap): RnvTask | undefined => { - const customTask = customTasks?.[task]; - if (customTask) return customTask; - let tsk; - const taskCleaned = task.split(' ')[0]; - if (tasks) { - tsk = tasks[task]; - if (!tsk) { - tsk = tasks[taskCleaned]; - } - } - - return tsk; -}; - -export const hasEngineTask = (task: string, tasks: RnvTaskMap, isProjectScope?: boolean) => - isProjectScope ? !!getEngineTask(task, tasks) : getEngineTask(task, tasks)?.isGlobalScope; - -export const getEngineSubTasks = (task: string, tasks: RnvTaskMap, exactMatch?: boolean) => - Object.values(tasks).filter((v) => - exactMatch ? v.task.split(' ')[0] === task : v.task.split(' ')[0].startsWith(task) - ); - -export const getEngineRunner = (task: string, customTasks?: RnvTaskMap, failOnMissingEngine = true) => { - const c = getContext(); - - if (customTasks?.[task]) { - return c.runtime.enginesById[ENGINE_CORE]; - } - - const { configExists } = c.paths.project; - - let engine = typeof c.platform === 'string' && c.runtime.enginesByPlatform[c.platform]; - if (!engine) { - engine = c.runtime.enginesById['engine-core']; - } - if (!engine) { - if (hasEngineTask(task, c.runtime.enginesById[ENGINE_CORE].tasks, configExists)) { - return c.runtime.enginesById[ENGINE_CORE]; - } - if (failOnMissingEngine) { - throw new Error(`Cound not find active engine for platform ${c.platform}. Available engines: - ${c.runtime.enginesByIndex.map((v) => v.config.id).join(', ')}`); - } - return undefined; - } - if (hasEngineTask(task, engine.tasks, configExists)) return engine; - if (hasEngineTask(task, c.runtime.enginesById[ENGINE_CORE].tasks, configExists)) { - return c.runtime.enginesById[ENGINE_CORE]; - } - if (failOnMissingEngine) throw new Error(`Cound not find suitable executor for task ${chalk().bold(task)}`); - return undefined; +export const getEngineRunnerByOwnerID = (task: RnvTask) => { + const ctx = getContext(); + const engine = ctx.runtime.enginesByIndex.find((v) => v.config.packageName === task.ownerID); + return engine; }; export const getRegisteredEngines = () => getContext().runtime.enginesByIndex; diff --git a/packages/core/src/engines/types.ts b/packages/core/src/engines/types.ts index 57debba1d0..e671afa3b7 100644 --- a/packages/core/src/engines/types.ts +++ b/packages/core/src/engines/types.ts @@ -1,18 +1,35 @@ -import { ConfigFileEngine } from '../schema/configFiles/types'; -import type { PlatformKey } from '../schema/types'; -import type { RnvTaskMap } from '../tasks/types'; +import type { RnvContext } from '../context/types'; +import type { ConfigFileEngine } from '../schema/types'; +import type { RnvTask, RnvTaskMap } from '../tasks/types'; +import type { RnvPlatformKey } from '../types'; -export type RnvEngine = { +export type RnvEnginePlatforms = Partial>; + +export type CreateRnvEngineOpts = { + originalTemplatePlatformsDir?: string; + platforms: RnvEnginePlatforms; + config: ConfigFileEngine; + tasks: ReadonlyArray>; + rootPath?: string; + originalTemplatePlatformProjectDir?: string; + projectDirName?: string; + runtimeExtraProps?: Record; + outputDirName?: string; + serverDirName?: string; +}; + +export type RnvEngine = { originalTemplatePlatformsDir?: string; - platforms: Partial>; + platforms: RnvEnginePlatforms; config: ConfigFileEngine; - tasks: RnvTaskMap; + tasks: RnvTaskMap; rootPath?: string; originalTemplatePlatformProjectDir?: string; projectDirName: string; runtimeExtraProps: Record; outputDirName?: string; serverDirName: string; + getContext: () => RnvContext; }; export type RnvEnginePlatform = { @@ -34,3 +51,17 @@ export type RnvEngineInstallConfig = { engineRootPath?: string; configPath?: string; }; + +// export type GetContextType = () => RnvContext< +// any, +// Extract['options'], string> +// >; + +// export type GetContextType = () => RnvContext< +// any, +// Extract['options']>[number]['key'], string> +// >; + +// Readonly < Required < Eng['tasks'][string] > ['options'] > [number]['key']; + +// type Booo = Readonly['options']>[number]['key']; diff --git a/packages/core/src/enums/configName.ts b/packages/core/src/enums/fileName.ts similarity index 86% rename from packages/core/src/enums/configName.ts rename to packages/core/src/enums/fileName.ts index fb6394c3b0..e9d4360368 100644 --- a/packages/core/src/enums/configName.ts +++ b/packages/core/src/enums/fileName.ts @@ -1,4 +1,4 @@ -export const ConfigName = { +export const RnvFileName = { renative: 'renative.json', renativeLocal: 'renative.local.json', renativePrivate: 'renative.private.json', @@ -6,9 +6,9 @@ export const ConfigName = { renativeBuild: 'renative.build.json', renativeRuntime: 'renative.runtime.json', renativeWorkspaces: 'renative.workspaces.json', - renativePlugins: 'renative.plugins.json', renativeTemplates: 'renative.templates.json', renativePlatforms: 'renative.platforms.json', renativeEngine: 'renative.engine.json', + package: 'package.json', // renativeProject: 'renative.project.json', -}; +} as const; diff --git a/packages/core/src/enums/folderName.ts b/packages/core/src/enums/folderName.ts new file mode 100644 index 0000000000..b0ada7c5e3 --- /dev/null +++ b/packages/core/src/enums/folderName.ts @@ -0,0 +1,22 @@ +export const RnvFolderName = { + // non compiled static iles used by rnv modules + templateFiles: 'templateFiles', + // special folder for overriding source during copy of includedPaths. + // it mimics the same structure as the root folder of template + templateOverrides: 'templateOverrides', + // Standard node_modules folder + nodeModules: 'node_modules', + // RNV generates all actual projects (xcode, android, webpack...) in this folder + platformBuilds: 'platformBuilds', + // RNV generates all assets (images, fonts...) in this folder from selected appConfig + platformAssets: 'platformAssets', + // Special RNV foled where local (excluded from git) files are stored and generated + dotRnv: '.rnv', + // Special folder for storing npm package snapshots before replacing with symlink + // Allows reversing back to snapshot if needed (rnv link / rnv unlink) + npmCache: 'npm_cache', + // Convention folder for storing secrets per projects managed by rnv crypto + secrets: 'secrets', + // Special folder for storing all build hooks in your project + buildHooks: 'buildHooks', +} as const; diff --git a/packages/core/src/enums/platformName.ts b/packages/core/src/enums/platformName.ts index 7fa67b1444..97f6f5ffb3 100644 --- a/packages/core/src/enums/platformName.ts +++ b/packages/core/src/enums/platformName.ts @@ -1,58 +1,80 @@ -export const PlatformName = { +export const RnvPlatformName = { + web: 'web', + ios: 'ios', android: 'android', androidtv: 'androidtv', - androidwear: 'androidwear', - chromecast: 'chromecast', firetv: 'firetv', - ios: 'ios', - kaios: 'kaios', + tvos: 'tvos', macos: 'macos', + linux: 'linux', + windows: 'windows', tizen: 'tizen', + webos: 'webos', + chromecast: 'chromecast', + kaios: 'kaios', + webtv: 'webtv', + androidwear: 'androidwear', tizenwatch: 'tizenwatch', tizenmobile: 'tizenmobile', - tvos: 'tvos', - web: 'web', - webtv: 'webtv', - webos: 'webos', - windows: 'windows', - linux: 'linux', xbox: 'xbox', - androidauto: 'androidauto', - alexa: 'alexa', - appleauto: 'appleauto', - astian: 'astian', - blackberry: 'blackberry', - chromeos: 'chromeos', - fireos: 'fireos', - hbbtv: 'hbbtv', - meego: 'meego', - netcast: 'netcast', - occulus: 'occulus', - orsay: 'orsay', - ps4: 'ps4', - roku: 'roku', - sailfish: 'sailfish', - tivo: 'tivo', - ubuntu: 'ubuntu', - ubuntutouch: 'ubuntutouch', - unity: 'unity', - vewd: 'vewd', - vidaa: 'vidaa', - vieraconnect: 'vieraconnect', - vizio: 'vizio', - watchos: 'watchos', - webian: 'webian', - wii: 'wii', - wp10: 'wp10', - wp8: 'wp8', - xbox360: 'xbox360', - kodi: 'kodi', - boxee: 'boxee', - horizontv: 'horizontv', - mediaroom: 'mediaroom', - yahoosmarttv: 'yahoosmarttv', - slingbox: 'slingbox', - hololens: 'hololens', - webvr: 'webvr', - saphi: 'saphi', + // androidauto: 'androidauto', + // alexa: 'alexa', + // appleauto: 'appleauto', + // astian: 'astian', + // blackberry: 'blackberry', + // chromeos: 'chromeos', + // fireos: 'fireos', + // hbbtv: 'hbbtv', + // meego: 'meego', + // netcast: 'netcast', + // occulus: 'occulus', + // orsay: 'orsay', + // ps4: 'ps4', + // roku: 'roku', + // sailfish: 'sailfish', + // tivo: 'tivo', + // ubuntu: 'ubuntu', + // ubuntutouch: 'ubuntutouch', + // unity: 'unity', + // vewd: 'vewd', + // vidaa: 'vidaa', + // vieraconnect: 'vieraconnect', + // vizio: 'vizio', + // watchos: 'watchos', + // webian: 'webian', + // wii: 'wii', + // wp10: 'wp10', + // wp8: 'wp8', + // xbox360: 'xbox360', + // kodi: 'kodi', + // boxee: 'boxee', + // horizontv: 'horizontv', + // mediaroom: 'mediaroom', + // yahoosmarttv: 'yahoosmarttv', + // slingbox: 'slingbox', + // hololens: 'hololens', + // webvr: 'webvr', + // saphi: 'saphi', } as const; + +// IMPORTANT: this must match RnvPlatformName size and key order +export const RnvPlatforms = [ + RnvPlatformName.web, + RnvPlatformName.ios, + RnvPlatformName.android, + RnvPlatformName.androidtv, + RnvPlatformName.firetv, + RnvPlatformName.tvos, + RnvPlatformName.macos, + RnvPlatformName.linux, + RnvPlatformName.windows, + RnvPlatformName.tizen, + RnvPlatformName.webos, + RnvPlatformName.chromecast, + RnvPlatformName.kaios, + RnvPlatformName.webtv, + RnvPlatformName.androidwear, + RnvPlatformName.tizenwatch, + RnvPlatformName.tizenmobile, + RnvPlatformName.xbox, +] as const; diff --git a/packages/core/src/enums/taskName.ts b/packages/core/src/enums/taskName.ts index 303f826663..15bb39d860 100644 --- a/packages/core/src/enums/taskName.ts +++ b/packages/core/src/enums/taskName.ts @@ -15,7 +15,6 @@ export const RnvTaskName = { clean: 'clean', link: 'link', unlink: 'unlink', - install: 'install', publish: 'publish', status: 'status', switch: 'switch', @@ -33,7 +32,8 @@ export const RnvTaskName = { platformConnect: 'platform connect', platformEject: 'platform eject', platformList: 'platform list', - platformSetup: 'platform setup', + projectPlatforms: 'project platforms', + sdkConfigure: 'sdk configure', projectConfigure: 'project configure', projectUpgrade: 'project upgrade', pluginAdd: 'plugin add', diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 28af28c7c9..2bbdbdcfb9 100755 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -14,21 +14,39 @@ export * from './configs/configLocal'; export * from './configs/engines'; export * from './configs/configProject'; export * from './configs/platformAssets'; -export * from './configs/templates'; export * from './context/contextProps'; export * from './configs/utils'; -export * from './projects'; +export * from './projects/appConfig'; +export * from './projects/assets'; +export * from './projects/fonts'; +export * from './projects/version'; export * from './projects/npm'; export * from './projects/package'; -export * from './projects/dependencyManager'; +export * from './projects/mutations'; +export * from './projects/fonts'; +export * from './projects/utils'; -export * from './tasks'; +export * from './tasks/taskFinder'; +export * from './tasks/taskExecutors'; +export * from './tasks/taskHelpers'; +export * from './tasks/taskRegistry'; export * from './tasks/constants'; +export * from './tasks/creators'; -export * from './schema'; export * from './schema/defaults'; export * from './schema/schemaManager'; +export * from './schema/validators'; +export * from './schema'; + +export * from './engines'; +export * from './engines/creator'; +export * from './engines/dependencyResolver'; + +export * from './sdks/creator'; + +export * from './integrations/creator'; +export * from './integrations'; export * from './system/exec'; export * from './system/fs'; @@ -41,30 +59,31 @@ export * from './logger/defaults'; export * from './api'; export * from './api/provider'; -export * from './constants'; export * from './env'; export * from './formatter'; export * from './templates'; -export * from './integrations'; export * from './runner'; -export * from './engines'; export * from './platforms'; export * from './plugins'; export * from './buildHooks'; export * from './migrator'; export * from './enums/taskName'; -export * from './enums/configName'; +export * from './enums/fileName'; +export * from './enums/folderName'; +export * from './enums/platformName'; //TYPES +export * from './types'; export * from './engines/types'; +export * from './sdks/types'; export * from './context/types'; export * from './plugins/types'; export * from './projects/types'; export * from './schema/types'; export * from './tasks/types'; export * from './system/types'; +export * from './configs/types'; +export * from './env/types'; export * from './api/types'; -export * from './types'; -export * from './schema/types'; export * from './integrations/types'; diff --git a/packages/core/src/integrations/creator.ts b/packages/core/src/integrations/creator.ts new file mode 100644 index 0000000000..cf41c1af69 --- /dev/null +++ b/packages/core/src/integrations/creator.ts @@ -0,0 +1,13 @@ +import { getContext } from '../context/provider'; +import { generateRnvTaskMap } from '../tasks/taskHelpers'; +import type { RnvIntegration, CreateRnvIntegrationOpts } from './types'; + +export const createRnvIntegration = (opts: CreateRnvIntegrationOpts) => { + const intg: RnvIntegration = { + ...opts, + tasks: generateRnvTaskMap(opts.tasks, opts.config), + getContext: () => getContext(), + }; + + return intg; +}; diff --git a/packages/core/src/integrations/index.ts b/packages/core/src/integrations/index.ts index 7e5dd70a15..c6449d4a73 100644 --- a/packages/core/src/integrations/index.ts +++ b/packages/core/src/integrations/index.ts @@ -1,9 +1,9 @@ import path from 'path'; import { fsExistsSync } from '../system/fs'; import { logDefault, logWarning } from '../logger'; -import { registerCustomTask } from '../tasks'; import { RnvIntegration } from './types'; import { getContext } from '../context/provider'; +import { registerRnvTasks } from '../tasks/taskRegistry'; export const loadIntegrations = async () => { logDefault('loadIntegrations'); @@ -21,9 +21,11 @@ export const loadIntegrations = async () => { try { const instance: RnvIntegration = require(intPath)?.default; if (instance) { - instance.getTasks().forEach((task) => { - registerCustomTask(task); - }); + c.runtime.integrationsByIndex.push(instance); + registerRnvTasks(instance.tasks); + // instance.getTasks().forEach((task) => { + // registerCustomTask(task); + // }); } } catch (err) { logWarning( @@ -33,7 +35,3 @@ export const loadIntegrations = async () => { }); } }; - -export const registerIntegration = () => { - //Do nothing -}; diff --git a/packages/core/src/integrations/types.ts b/packages/core/src/integrations/types.ts index 068d3d33fc..6568115d19 100644 --- a/packages/core/src/integrations/types.ts +++ b/packages/core/src/integrations/types.ts @@ -1,7 +1,14 @@ -import { ConfigFileIntegration } from '../schema/configFiles/types'; -import { RnvTask } from '../tasks/types'; +import type { ConfigFileIntegration } from '../schema/types'; +import type { RnvContext } from '../context/types'; +import type { RnvTaskMap, RnvTask } from '../tasks/types'; -export type RnvIntegration = { +export type CreateRnvIntegrationOpts = { config: ConfigFileIntegration; - getTasks: () => Array; + tasks: ReadonlyArray>; +}; + +export type RnvIntegration = { + config: ConfigFileIntegration; + tasks: RnvTaskMap; + getContext: () => RnvContext; }; diff --git a/packages/core/src/logger/index.ts b/packages/core/src/logger/index.ts index bf4b32238a..b447f2e9ab 100644 --- a/packages/core/src/logger/index.ts +++ b/packages/core/src/logger/index.ts @@ -39,14 +39,9 @@ export const logDebug: RnvApiLogger['logDebug'] = (...args) => { export const isInfoEnabled: RnvApiLogger['isInfoEnabled'] = () => getApi().logger.isInfoEnabled(); -export const logComplete: RnvApiLogger['logComplete'] = (isEnd) => getApi().logger.logComplete(isEnd); - export const logSuccess: RnvApiLogger['logSuccess'] = (msg) => getApi().logger.logSuccess(msg); -export const logError: RnvApiLogger['logError'] = (e, isEnd, skipAnalytics) => - getApi().logger.logError(e, isEnd, skipAnalytics); - -export const logEnd: RnvApiLogger['logEnd'] = (code) => getApi().logger.logEnd(code); +export const logError: RnvApiLogger['logError'] = (e, skipAnalytics) => getApi().logger.logError(e, skipAnalytics); export const logInitialize: RnvApiLogger['logInitialize'] = () => { getApi().logger.logInitialize(); diff --git a/packages/core/src/platforms/__tests__/index.test.ts b/packages/core/src/platforms/__tests__/index.test.ts index 429b9f90f4..e51652c33c 100644 --- a/packages/core/src/platforms/__tests__/index.test.ts +++ b/packages/core/src/platforms/__tests__/index.test.ts @@ -11,12 +11,12 @@ jest.mock('../../system/fs'); jest.mock('../../system/resolve'); jest.mock('../../context/contextProps'); -beforeAll(() => { - // Before all placeholder +beforeEach(() => { + // NOTE: do not call createRnvContext() in core library itself }); afterEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); describe('createPlatformBuild', () => { diff --git a/packages/core/src/platforms/index.ts b/packages/core/src/platforms/index.ts index dbd5fb15ae..1548a64bdf 100644 --- a/packages/core/src/platforms/index.ts +++ b/packages/core/src/platforms/index.ts @@ -2,23 +2,10 @@ import path from 'path'; import { chalk, logDefault, logError, logWarning, logDebug } from '../logger'; import { cleanFolder, copyFolderContentsRecursiveSync } from '../system/fs'; import { getTimestampPathsConfig, getAppFolder } from '../context/contextProps'; -import { SUPPORTED_PLATFORMS } from '../constants'; -import { generateOptions, inquirerPrompt } from '../api'; -import type { RnvPlatform, RnvPlatformWithAll } from '../types'; -import { updateProjectPlatforms } from '../configs/configProject'; +import type { RnvPlatform } from '../types'; import { doResolve } from '../system/resolve'; import { getContext } from '../context/provider'; -export const logErrorPlatform = () => { - const c = getContext(); - - logError( - `Platform: ${chalk().bold(c.platform)} doesn't support command: ${chalk().bold(c.command)}`, - true // kill it if we're not supporting this - ); - return false; -}; - export const generatePlatformChoices = () => { const c = getContext(); @@ -32,21 +19,21 @@ export const generatePlatformChoices = () => { return options; }; -export const cleanPlatformBuild = async (platform: RnvPlatform) => { +export const cleanPlatformBuild = async (platform: RnvPlatform, cleanAllPlatforms?: boolean) => { logDebug('cleanPlatformBuild'); const c = getContext(); const cleanTasks = []; - if ((platform as RnvPlatformWithAll) === 'all' && c.buildConfig.platforms) { + if (cleanAllPlatforms && c.buildConfig.platforms) { Object.keys(c.buildConfig.platforms).forEach((k) => { - if (isPlatformSupportedSync(k as RnvPlatform)) { + if (_isPlatformSupportedSync(k as RnvPlatform)) { const pPath = path.join(c.paths.project.builds.dir, `${c.runtime.appId}_${k}`); cleanTasks.push(cleanFolder(pPath)); } }); - } else if (isPlatformSupportedSync(platform)) { + } else if (_isPlatformSupportedSync(platform)) { const pPath = getAppFolder(); cleanTasks.push(cleanFolder(pPath)); } @@ -59,7 +46,7 @@ export const createPlatformBuild = (platform: RnvPlatform) => logDefault('createPlatformBuild'); const c = getContext(); - if (!platform || !isPlatformSupportedSync(platform, undefined, reject)) return; + if (!platform || !_isPlatformSupportedSync(platform, undefined, reject)) return; const ptDir = c.paths.project.platformTemplatesDirs[platform]; if (!ptDir) { @@ -92,58 +79,7 @@ export const createPlatformBuild = (platform: RnvPlatform) => resolve(); }); -export const isPlatformSupported = async (isGlobalScope = false) => { - const c = getContext(); - - if (c.platform && c.program.platform !== true && isGlobalScope) { - return c.platform; - } - - let platformsAsObj; - if (isGlobalScope) { - platformsAsObj = SUPPORTED_PLATFORMS; - } else { - platformsAsObj = c.buildConfig ? c.buildConfig.platforms : c.supportedPlatforms; - } - - if (!platformsAsObj) platformsAsObj = c.runtime.availablePlatforms; - const opts = generateOptions(platformsAsObj); - - if (!c.platform || c.program.platform === true || !c.runtime.availablePlatforms?.includes?.(c.platform)) { - const { platform } = await inquirerPrompt({ - name: 'platform', - type: 'list', - message: 'Pick one of available platforms', - choices: opts.keysAsArray, - logMessage: 'You need to specify platform', - }); - - c.platform = platform; - } - - const configuredPlatforms = c.files.project.config?.defaults?.supportedPlatforms; - - if (c.platform && Array.isArray(configuredPlatforms) && !configuredPlatforms.includes(c.platform)) { - const { confirm } = await inquirerPrompt({ - type: 'confirm', - message: `Platform ${c.platform} is not supported by your project. Would you like to enable it?`, - }); - - if (confirm) { - const newPlatforms = [...configuredPlatforms, c.platform]; - updateProjectPlatforms(newPlatforms); - c.buildConfig.defaults = c.buildConfig.defaults || {}; - c.buildConfig.defaults.supportedPlatforms = newPlatforms; - // await configureEntryPoints(c); - } else { - throw new Error('User canceled'); - } - } - - return c.platform; -}; - -export const isPlatformSupportedSync = (platform: RnvPlatform, resolve?: () => void, reject?: (e: string) => void) => { +const _isPlatformSupportedSync = (platform: RnvPlatform, resolve?: () => void, reject?: (e: string) => void) => { if (!platform) { if (reject) { reject( diff --git a/packages/core/src/plugins/__tests__/index.test.ts b/packages/core/src/plugins/__tests__/index.test.ts index d3d6981215..9c730e5a91 100644 --- a/packages/core/src/plugins/__tests__/index.test.ts +++ b/packages/core/src/plugins/__tests__/index.test.ts @@ -6,7 +6,7 @@ jest.mock('../../logger'); jest.mock('../../context/provider'); beforeEach(() => { - //TBC + // NOTE: do not call createRnvContext() in core library itself }); afterEach(() => { diff --git a/packages/core/src/plugins/index.ts b/packages/core/src/plugins/index.ts index 46d957c1c3..6f4f21ab66 100644 --- a/packages/core/src/plugins/index.ts +++ b/packages/core/src/plugins/index.ts @@ -1,8 +1,6 @@ -import merge from 'deepmerge'; import path from 'path'; import { getAppConfigBuildsFolder, getAppFolder } from '../context/contextProps'; import { parseRenativeConfigs } from '../configs'; -import { configureFonts } from '../projects'; import { copyFolderContentsRecursiveSync, fsExistsSync, @@ -15,20 +13,28 @@ import { } from '../system/fs'; import { chalk, logDebug, logError, logInfo, logSuccess, logDefault, logWarning } from '../logger'; import { doResolve } from '../system/resolve'; -import { RnvContext } from '../context/types'; -import { PluginCallback, RnvPlugin, RnvPluginScope } from './types'; -import { RenativeConfigPaths, RenativeConfigPlugin, RenativeConfigPluginPlatform } from '../schema/types'; +import type { RnvContext } from '../context/types'; +import type { PluginCallback, RnvPlugin, RnvPluginScope } from './types'; import { inquirerPrompt } from '../api'; import { writeRenativeConfigFile } from '../configs/utils'; import { installPackageDependencies } from '../projects/npm'; -import { OverridesOptions, ResolveOptions } from '../system/types'; -import { ConfigFileOverrides, ConfigFilePlugin, ConfigFilePlugins } from '../schema/configFiles/types'; -import { NpmPackageFile } from '../configs/types'; +import type { OverridesOptions, ResolveOptions } from '../system/types'; import { getContext } from '../context/provider'; import { getConfigProp } from '../context/contextProps'; -import { ConfigName } from '../enums/configName'; - -const _getPluginScope = (plugin: RenativeConfigPlugin | string): RnvPluginScope => { +import { RnvFileName } from '../enums/fileName'; +import type { AsyncCallback } from '../projects/types'; +import { createDependencyMutation } from '../projects/mutations'; +import { updatePackage } from '../projects/package'; +import type { + ConfigFileOverrides, + ConfigFilePlugin, + ConfigFileTemplates, + ConfigProjectPaths, + RnvPluginPlatformSchema, + RnvPluginSchema, +} from '../schema/types'; + +const _getPluginScope = (plugin: RnvPluginSchema | string): RnvPluginScope => { if (typeof plugin === 'string') { if (plugin.startsWith('source:')) { return { scope: plugin.split(':').pop() || 'rnv' }; @@ -59,7 +65,7 @@ export const getMergedPlugin = (c: RnvContext, key: string) => { const _getMergedPlugin = ( c: RnvContext, - plugin: RenativeConfigPlugin | string | undefined, + plugin: RnvPluginSchema | string | undefined, pluginKey: string, parentScope?: string, scopes?: Array, @@ -84,14 +90,14 @@ const _getMergedPlugin = ( if ( scope !== '' && !!scope && - !c.buildConfig.pluginTemplates?.[scope]?.pluginTemplates && + !c.buildConfig.scopedPluginTemplates?.[scope] && !c.runtime._skipPluginScopeWarnings ) { logWarning(`Plugin ${pluginKey} is not recognized plugin in ${scope} scope`); } else if (scope && scopes) { let skipScope = false; if (parentScope) { - const skipRnvOverrides = c.buildConfig.pluginTemplates?.[parentScope]?.disableRnvDefaultOverrides; + const skipRnvOverrides = c.buildConfig.disableRnvDefaultOverrides; if (skipRnvOverrides && scope === 'rnv') { // Merges down to RNV defaults will be skipped @@ -104,13 +110,13 @@ const _getMergedPlugin = ( const parentPlugin = _getMergedPlugin( c, - c.buildConfig.pluginTemplates?.[scope]?.pluginTemplates?.[pluginKey], + c.buildConfig.scopedPluginTemplates?.[scope]?.[pluginKey], pluginKey, scope, scopes, true ); - let currentPlugin: RenativeConfigPlugin; + let currentPlugin: RnvPluginSchema; if (typeof plugin === 'string' || plugin instanceof String) { currentPlugin = {}; } else { @@ -169,29 +175,30 @@ export const configurePlugins = async () => { const c = getContext(); - if (c.program.skipDependencyCheck) return true; + if (c.program.opts().skipDependencyCheck) return true; if (!c.files.project.package.dependencies) { c.files.project.package.dependencies = {}; } - let hasPackageChanged = false; + // let hasPackageChanged = false; if (!c.buildConfig?.plugins) { return; } - const isTemplate = c.files.project.config?.isTemplate; - const newDeps: Record = {}; - const newDevDeps: Record = {}; + // const isTemplate = c.buildConfig?.isTemplate; + // const newDeps: Record = {}; + // const newDevDeps: Record = {}; const { dependencies, devDependencies } = c.files.project.package; - const ovMsg = isTemplate ? 'This is template. NO ACTION' : 'package.json will be overriden'; + // const ovMsg = isTemplate ? 'This is template. NO ACTION' : 'package.json will be overriden'; + Object.keys(c.buildConfig.plugins).forEach((k) => { const plugin = getMergedPlugin(c, k); if (!plugin) { if (c.buildConfig?.plugins?.[k] === null) { - // Skip Warning as this is intentional "plugin":null + // Skip Warning as this is intentional "plugin":null override } else { logWarning( `Plugin with name ${chalk().bold( @@ -201,79 +208,152 @@ export const configurePlugins = async () => { )}` ); } - } else if (dependencies && dependencies[k]) { - if (plugin.disabled !== true && plugin.disableNpm !== true) { + } else if ( + plugin && + plugin.disabled !== true && + plugin.disableNpm !== true && + c.platform && + (plugin.supportedPlatforms ? plugin.supportedPlatforms.includes(c.platform) : true) + ) { + if (dependencies && dependencies[k]) { if (!plugin.version) { if (!c.runtime._skipPluginScopeWarnings) { logInfo(`Plugin ${k} not ready yet (waiting for scope ${plugin.scope}). SKIPPING...`); } } else if (dependencies[k] !== plugin.version) { - logWarning( - `Version mismatch of dependency ${chalk().bold(k)} between: -${chalk().bold(c.paths.project.package)}: v(${chalk().red(dependencies[k])}) and -${chalk().bold(c.paths.project.builds.config)}: v(${chalk().green(plugin.version)}). -${ovMsg}` - ); - - hasPackageChanged = true; - _applyPackageDependency(newDeps, k, plugin.version); + // logWarning( + // `Version mismatch of dependency ${chalk().bold(k)} between: + // ${chalk().bold(c.paths.project.package)}: v(${chalk().red(dependencies[k])}) and + // ${chalk().bold(c.paths.project.builds.config)}: v(${chalk().green(plugin.version)}). + // ${ovMsg}` + // ); + + createDependencyMutation({ + name: k, + original: { + version: dependencies[k], + }, + updated: { + version: plugin.version, + }, + type: 'dependencies', + msg: 'Version mismatch', + source: 'plugin (renative.json)', + targetPath: c.paths.project.package, + }); + + // hasPackageChanged = true; + // _applyPackageDependency(newDeps, k, plugin.version); } - } - } else if (devDependencies && devDependencies[k]) { - if (plugin.disabled !== true && plugin.disableNpm !== true) { + } else if (devDependencies && devDependencies[k]) { if (!plugin.version) { if (!c.runtime._skipPluginScopeWarnings) { logInfo(`Plugin ${k} not ready yet (waiting for scope ${plugin.scope}). SKIPPING...`); } } else if (devDependencies[k] !== plugin.version) { - logWarning( - `Version mismatch of devDependency ${chalk().bold(k)} between package.json: v(${chalk().red( - devDependencies[k] - )}) and plugins.json: v(${chalk().red(plugin.version)}). ${ovMsg}` - ); - hasPackageChanged = true; - _applyPackageDependency(newDevDeps, k, plugin.version); + // logWarning( + // `Version mismatch of devDependency ${chalk().bold(k)} between package.json: v(${chalk().red( + // devDependencies[k] + // )}) and plugins.json: v(${chalk().red(plugin.version)}). ${ovMsg}` + // ); + + createDependencyMutation({ + name: k, + original: { + version: devDependencies[k], + }, + updated: { + version: plugin.version, + }, + type: 'devDependencies', + msg: 'Version mismatch', + source: 'plugin (renative.json)', + targetPath: c.paths.project.package, + }); + + // hasPackageChanged = true; + // _applyPackageDependency(newDevDeps, k, plugin.version); } - } - } else if (plugin.disabled !== true && plugin.disableNpm !== true) { - // Dependency does not exists - if (plugin.version) { - logInfo( - `Missing dependency ${chalk().bold(k)} v(${chalk().red(plugin.version)}) in package.json. ${ovMsg}` - ); - - hasPackageChanged = true; + } else { + // Dependency does not exists if (plugin.version) { - _applyPackageDependency(newDeps, k, plugin.version); + // logInfo( + // `Missing dependency ${chalk().bold(k)} v(${chalk().red( + // plugin.version + // )}) in package.json. ${ovMsg}` + // ); + + createDependencyMutation({ + name: k, + updated: { + version: plugin.version, + }, + // TODO: should be controlled by plugin if this devDependency + type: 'dependencies', + msg: 'Missing dependency', + source: 'plugin (renative.json)', + targetPath: c.paths.project.package, + }); + + // hasPackageChanged = true; + // if (plugin.version) { + // _applyPackageDependency(newDeps, k, plugin.version); + // } } } } if (plugin && plugin.npm) { Object.keys(plugin.npm).forEach((npmKey) => { + // const npmKey = _npmKey as NpmDepKey; const npmDep = plugin.npm?.[npmKey]; // IMPORTANT: Do not override top level override with plugin.npm ones const topLevelPlugin = getMergedPlugin(c, npmKey); if (topLevelPlugin && topLevelPlugin?.version !== npmDep) { - logInfo(`RNV Detected plugin dependency conflict. ${chalk().cyan('RESOLVING...')} + logWarning(`RNV Detected plugin dependency conflict. - ${npmKey}@${chalk().green(topLevelPlugin?.version)} ${chalk().cyan('<=')} - ${k} .npm sub dependencies: |- ${npmKey}@${chalk().red(npmDep)}`); } else if (!dependencies[npmKey]) { - logInfo(`Plugin ${chalk().bold(k)} requires npm dependency ${chalk().bold(npmKey)}. ${ovMsg}`); + // logInfo(`Plugin ${chalk().bold(k)} requires npm dependency ${chalk().bold(npmKey)}. ${ovMsg}`); if (npmDep) { - _applyPackageDependency(newDeps, npmKey, npmDep); - hasPackageChanged = true; + createDependencyMutation({ + name: npmKey, + updated: { + version: npmDep, + }, + // TODO: should be controlled by plugin if this devDependency + type: 'dependencies', + msg: 'Missing dependency', + source: 'plugin.npm (renative.json)', + targetPath: c.paths.project.package, + }); + // _applyPackageDependency(newDeps, npmKey, npmDep); + // hasPackageChanged = true; } } else if (dependencies[npmKey] !== npmDep) { - logWarning( - `Plugin ${chalk().bold(k)} npm dependency ${chalk().bold(npmKey)} mismatch (${chalk().red( - dependencies[npmKey] - )}) => (${chalk().green(npmDep)}) .${ovMsg}` - ); + // logWarning( + // `Plugin ${chalk().bold(k)} npm dependency ${chalk().bold(npmKey)} mismatch (${chalk().red( + // dependencies[npmKey] + // )}) => (${chalk().green(npmDep)}) .${ovMsg}` + // ); if (npmDep) { - _applyPackageDependency(newDeps, npmKey, npmDep); - hasPackageChanged = true; + createDependencyMutation({ + name: npmKey, + original: { + version: dependencies[npmKey], + }, + updated: { + version: npmDep, + }, + // TODO: should be controlled by plugin if this devDependency + type: 'dependencies', + msg: 'Version mismatch', + source: 'plugin.npm (renative.json)', + targetPath: c.paths.project.package, + }); + // _applyPackageDependency(newDeps, npmKey, npmDep); + // hasPackageChanged = true; } } }); @@ -281,23 +361,19 @@ ${ovMsg}` }); // When in template we want warnings but NOT file overrides - if (isTemplate) return true; + // if (isTemplate) return true; + + // console.log('SJSSJSLKJSSL', mutations); // c.runtime.skipPackageUpdate only reflects rnv version mismatch. should not prevent updating other deps - if (hasPackageChanged /*! c.runtime.skipPackageUpdate */ && !c.program.skipDependencyCheck) { - _updatePackage(c, { dependencies: newDeps, devDependencies: newDevDeps }); - } + // + // if (hasPackageChanged /*! c.runtime.skipPackageUpdate */ && !c.program.opts().skipDependencyCheck) { + // _updatePackage(c, { dependencies: newDeps, devDependencies: newDevDeps }); + // } return true; }; -const _updatePackage = (c: RnvContext, override: Partial) => { - const newPackage: NpmPackageFile = merge(c.files.project.package, override); - writeRenativeConfigFile(c.paths.project.package, newPackage); - c.files.project.package = newPackage; - c._requiresNpmInstall = true; -}; - export const resolvePluginDependants = async () => { const c = getContext(); @@ -318,7 +394,7 @@ export const resolvePluginDependants = async () => { const _resolvePluginDependencies = async ( c: RnvContext, key: string, - keyScope: RenativeConfigPlugin | string, + keyScope: RnvPluginSchema | string, parentKey?: string ) => { // IMPORTANT: Do not cache this valuse as they need to be refreshed every @@ -327,13 +403,13 @@ const _resolvePluginDependencies = async ( return true; } - const { pluginTemplates } = c.buildConfig; + const { scopedPluginTemplates } = c.buildConfig; const plugin = getMergedPlugin(c, key); const { scope } = _getPluginScope(keyScope); if (!plugin) { - const depPlugin = pluginTemplates?.[scope]?.pluginTemplates?.[key]; + const depPlugin = scopedPluginTemplates?.[scope]?.[key]; if (depPlugin) { // console.log('INSTALL PLUGIN???', key, depPlugin.source); const { confirm } = await inquirerPrompt({ @@ -387,7 +463,7 @@ export const parsePlugins = ( const excludedPlugins = getConfigProp('excludedPlugins') || []; - const handleActivePlugin = (plugin: RnvPlugin, pluginPlat: RenativeConfigPluginPlatform, key: string) => { + const handleActivePlugin = (plugin: RnvPlugin, pluginPlat: RnvPluginPlatformSchema, key: string) => { // log deprecated if present if (plugin.deprecated) { logWarning(plugin.deprecated); @@ -414,7 +490,7 @@ export const parsePlugins = ( (includedPlugins.includes('*') || includedPlugins.includes(key)) && !excludedPlugins.includes(key) ) { - const pluginPlat = plugin[platform] || {}; + const pluginPlat: RnvPluginPlatformSchema = plugin[platform] || {}; // NOTE: we do not want to disable plugin just because object is missing. instead we will let people to do it explicitly // { @@ -424,15 +500,22 @@ export const parsePlugins = ( //TODO: consider supportedPlatforms for plugins const isPluginPlatDisabled = pluginPlat.disabled === true; const isPluginDisabled = plugin.disabled === true; + const isPluginPlatSupported = plugin.supportedPlatforms + ? plugin.supportedPlatforms.includes(platform) + : true; if (ignorePlatformObjectCheck || includeDisabledOrExcludedPlugins) { if (isPluginDisabled) { - logInfo(`Plugin ${key} is marked disabled. skipping.`); + logDefault(`Plugin ${key} is marked disabled. skipping.`); } else if (isPluginPlatDisabled) { - logInfo(`Plugin ${key} is marked disabled for platform ${platform} skipping.`); + logDefault(`Plugin ${key} is marked disabled for platform ${platform}. skipping.`); + } else if (!isPluginPlatSupported) { + logDefault( + `Plugin ${key}'s supportedPlatforms does not include ${platform}. skipping.` + ); } handleActivePlugin(plugin, pluginPlat, key); - } else if (!isPluginPlatDisabled && !isPluginDisabled) { + } else if (!isPluginPlatDisabled && !isPluginDisabled && isPluginPlatSupported) { handleActivePlugin(plugin, pluginPlat, key); } } else if (includeDisabledOrExcludedPlugins) { @@ -467,51 +550,10 @@ export const loadPluginTemplates = async () => { const c = getContext(); - //This comes from project dependency - let flexnPluginsPath = doResolve('@flexn/plugins'); - - if (!fsExistsSync(flexnPluginsPath)) { - //This comes from rnv built-in dependency (installed via npm) - flexnPluginsPath = path.resolve(__dirname, '../../node_modules/@flexn/plugins'); - if (!fsExistsSync(flexnPluginsPath)) { - //This comes from rnv built-in dependency (installed via yarn might install it one level up) - flexnPluginsPath = path.resolve(__dirname, '../../../@flexn/plugins'); - if (!fsExistsSync(flexnPluginsPath)) { - // This comes from rnv built-in dependency (installed via yarn might install it 2 level up but scoped to @rnv) - flexnPluginsPath = path.resolve(__dirname, '../../../../@flexn/plugins'); - if (!fsExistsSync(flexnPluginsPath)) { - return Promise.reject(`RNV Cannot find package: ${chalk().bold(flexnPluginsPath)}`); - } - } - } - } - - if (!flexnPluginsPath) return Promise.reject(`flexnPluginsPath missing`); - - const flexnPluginTemplatesPath = path.join(flexnPluginsPath, 'pluginTemplates'); - - const flexnPluginTemplates = readObjectSync( - path.join(flexnPluginTemplatesPath, 'renative.plugins.json') - ); - const rnvPluginTemplates = readObjectSync(c.paths.rnv.pluginTemplates.config); - - const cnf = merge(flexnPluginTemplates || {}, rnvPluginTemplates || {}); - - if (cnf) { - c.files.rnv.pluginTemplates.config = cnf; - c.files.rnv.pluginTemplates.configs = { - rnv: cnf, - }; - } - - //Override default rnv path with flexn one and add it rnv as overrider - c.paths.rnv.pluginTemplates.dirs = { - rnv: flexnPluginTemplatesPath, - }; - const customPluginTemplates = c.files.project.config?.paths?.pluginTemplates; if (customPluginTemplates) { const missingDeps = _parsePluginTemplateDependencies(c, customPluginTemplates); + if (missingDeps.length) { const dependencies = c.files.project.package.dependencies || {}; c.files.project.package.dependencies = dependencies; @@ -528,7 +570,7 @@ export const loadPluginTemplates = async () => { // CHECK IF paths.pluginTemplates SCOPES are INSTALLED // This must be installed to avoid scoped plugins errors if (hasPackageChanged) { - _updatePackage(c, { dependencies }); + updatePackage({ dependencies }); logInfo('Found missing dependency scopes. INSTALLING...'); await installPackageDependencies(); await loadPluginTemplates(); @@ -545,7 +587,7 @@ export const loadPluginTemplates = async () => { const _parsePluginTemplateDependencies = ( c: RnvContext, - customPluginTemplates: RenativeConfigPaths['pluginTemplates'], + customPluginTemplates: ConfigProjectPaths['pluginTemplates'], scope = 'root' ) => { logDefault('_parsePluginTemplateDependencies', `scope:${scope}`); @@ -560,25 +602,33 @@ const _parsePluginTemplateDependencies = ( if (npmDep) { let ptPath; + let ptConfig; + let ptRootPath; if (npmDep.startsWith('file:')) { ptPath = path.join(c.paths.project.dir, npmDep.replace('file:', ''), val.path || ''); } else { - // ptPath = path.join(c.paths.project.nodeModulesDir, val.npm, val.path || ''); - ptPath = `${doResolve(val.npm)}/${val.path}`; + ptRootPath = doResolve(val.npm); + } + if (ptRootPath) { + ptPath = path.join(ptRootPath, val.path); + c.paths.scopedConfigTemplates.pluginTemplatesDirs[k] = ptPath; + ptConfig = path.join(ptRootPath, RnvFileName.renativeTemplates); + if (!fsExistsSync(ptConfig)) { + // DEPRECATED Legacy Support + ptConfig = path.join(ptRootPath, val.path, 'renative.plugins.json'); + } } - const ptConfig = path.join(ptPath, ConfigName.renativePlugins); - c.paths.rnv.pluginTemplates.dirs[k] = ptPath; if (fsExistsSync(ptConfig)) { - const ptConfigs = c.files.rnv.pluginTemplates.configs; - const ptConfigFile = readObjectSync(ptConfig); + const ptConfigs = c.files.scopedConfigTemplates; + const ptConfigFile = readObjectSync(ptConfig); if (ptConfigFile) { ptConfigs[k] = ptConfigFile; } // _parsePluginTemplateDependencies( // c, - // c.files.rnv.pluginTemplates.configs[k].pluginTemplateDependencies, + // c.files.scopedPluginTemplates[k].pluginTemplateDependencies, // k // ); } else { @@ -738,15 +788,6 @@ export const overrideFileContents = (dest: string, override: Record { - logDefault('installPackageDependenciesAndPlugins'); - - await installPackageDependencies(); - await overrideTemplatePlugins(); - await configureFonts(); - await checkForPluginDependencies(); -}; - const _getPluginConfiguration = (c: RnvContext, pluginName: string) => { let renativePlugin: ConfigFilePlugin | undefined; let renativePluginPath; @@ -762,7 +803,7 @@ const _getPluginConfiguration = (c: RnvContext, pluginName: string) => { return renativePlugin; }; -export const checkForPluginDependencies = async () => { +export const checkForPluginDependencies = async (postInjectHandler?: AsyncCallback) => { const c = getContext(); const toAdd: Record = {}; @@ -797,7 +838,7 @@ export const checkForPluginDependencies = async () => { if (Object.keys(toAdd).length) { // ask the user let install = false; - if (!c.program.ci) { + if (!c.program.opts().ci) { const answer = await inquirerPrompt({ type: 'confirm', message: `Install ${Object.keys(toAdd).join(', ')}?`, @@ -820,7 +861,9 @@ export const checkForPluginDependencies = async () => { // Need to reload merged files await parseRenativeConfigs(); await configurePlugins(); - await installPackageDependenciesAndPlugins(); + if (postInjectHandler) { + await postInjectHandler(); + } } } }; @@ -832,7 +875,7 @@ export const overrideTemplatePlugins = async () => { const c = getContext(); - const rnvPluginsDirs = c.paths.rnv.pluginTemplates.dirs; + const rnvPluginsDirs = c.paths.scopedConfigTemplates.pluginTemplatesDirs; const appPluginDirs = c.paths.appConfig.pluginDirs; parsePlugins((plugin, pluginPlat, key) => { @@ -841,12 +884,7 @@ export const overrideTemplatePlugins = async () => { plugin._scopes.forEach((pluginScope) => { const pluginOverridePath = rnvPluginsDirs[pluginScope]; if (pluginOverridePath) { - const rnvOverridePath = path.join(c.paths.rnv.pluginTemplates.overrideDir!, key); - if (fsExistsSync(rnvOverridePath)) { - _overridePlugin(c, c.paths.rnv.pluginTemplates.overrideDir!, key); - } else { - _overridePlugin(c, pluginOverridePath, key); - } + _overridePlugin(c, pluginOverridePath, key); } }); } @@ -879,11 +917,6 @@ export const copyTemplatePluginsSync = (c: RnvContext) => { }); }); } - // FOLDER MERGES FROM PROJECT CONFIG PLUGIN - // if (c.paths.rnv.pluginTemplates.dir) { - // const sourcePathRnvPlugin = getAppConfigBuildsFolder(c, platform, path.join(c.paths.rnv.pluginTemplates.dir, key)); - // copyFolderContentsRecursiveSync(sourcePathRnvPlugin, destPath, true, undefined, false, objectInject); - // } // FOLDER MERGES FROM PROJECT CONFIG PLUGIN const sourcePath3 = getAppConfigBuildsFolder(path.join(c.paths.project.appConfigBase.dir, `plugins/${key}`)); @@ -904,14 +937,11 @@ export const copyTemplatePluginsSync = (c: RnvContext) => { copyFolderContentsRecursiveSync(sourcePath2sec, destPath, true, undefined, false, objectInject); // FOLDER MERGES FROM SCOPED PLUGIN TEMPLATES - Object.keys(c.paths.rnv.pluginTemplates.dirs).forEach((pathKey) => { - // TODO: required for external rnv scoped templates to take effect. need to test full implications - // if (pathKey !== 'rnv') { - const pluginTemplatePath = c.paths.rnv.pluginTemplates.dirs[pathKey]; - + // NOTE: default 'rnv' scope (@rnv/config-templates) is included in pluginTemplatesDirs + Object.keys(c.paths.scopedConfigTemplates.pluginTemplatesDirs).forEach((pathKey) => { + const pluginTemplatePath = c.paths.scopedConfigTemplates.pluginTemplatesDirs[pathKey]; const sourcePath4sec = getAppConfigBuildsFolder(path.join(pluginTemplatePath, key)); copyFolderContentsRecursiveSync(sourcePath4sec, destPath, true, undefined, false, objectInject); - // } }); }); }; diff --git a/packages/core/src/plugins/types.ts b/packages/core/src/plugins/types.ts index 64f9f855ad..a485fed63d 100644 --- a/packages/core/src/plugins/types.ts +++ b/packages/core/src/plugins/types.ts @@ -1,7 +1,6 @@ -import { ConfigFilePlugin } from '../schema/configFiles/types'; -import { RenativeConfigPlugin, RenativeConfigPluginPlatform } from '../schema/types'; +import type { ConfigFilePlugin, RnvPluginPlatformSchema, RnvPluginSchema } from '../schema/types'; -export type PluginCallback = (plugin: RnvPlugin, pluginPlat: RenativeConfigPluginPlatform, key: string) => void; +export type PluginCallback = (plugin: RnvPlugin, pluginPlat: RnvPluginPlatformSchema, key: string) => void; export type PluginListResponse = { asString: string; @@ -23,7 +22,7 @@ export type RnvPluginScope = { scope: string; }; -export type RnvPlugin = RenativeConfigPlugin & { +export type RnvPlugin = RnvPluginSchema & { packageName?: string; scope?: string; _scopes?: Array; diff --git a/packages/core/src/projects/__tests__/index.test.ts b/packages/core/src/projects/__tests__/assets.test.ts similarity index 92% rename from packages/core/src/projects/__tests__/index.test.ts rename to packages/core/src/projects/__tests__/assets.test.ts index efae1674a3..ef97df62e8 100644 --- a/packages/core/src/projects/__tests__/index.test.ts +++ b/packages/core/src/projects/__tests__/assets.test.ts @@ -1,4 +1,4 @@ -import { copyAssetsFolder } from '..'; +import { copyAssetsFolder } from '../assets'; import { logWarning } from '../../logger'; import path from 'path'; import { isPlatformActive } from '../../platforms'; @@ -13,8 +13,12 @@ jest.mock('../../context/provider'); jest.mock('../../context/contextProps'); jest.mock('../../platforms/index'); +beforeEach(() => { + // NOTE: do not call createRnvContext() in core library itself +}); + afterEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); describe('copyAssetsFolder', () => { diff --git a/packages/core/src/projects/appConfig.ts b/packages/core/src/projects/appConfig.ts new file mode 100644 index 0000000000..2ba7475ab8 --- /dev/null +++ b/packages/core/src/projects/appConfig.ts @@ -0,0 +1,65 @@ +import path from 'path'; +import { getAppConfigBuildsFolder, getAppFolder, getTimestampPathsConfig } from '../context/contextProps'; +import { isPlatformActive } from '../platforms'; +import { copyTemplatePluginsSync } from '../plugins'; +import { copyFolderContentsRecursiveSync, fsExistsSync } from '../system/fs'; +import { logDefault, logWarning } from '../logger'; +import { generateConfigPropInjects } from '../system/injectors'; +import { getContext } from '../context/provider'; + +export const copyBuildsFolder = () => + new Promise((resolve) => { + logDefault('copyBuildsFolder'); + const c = getContext(); + + if (!isPlatformActive(resolve)) return; + + const destPath = path.join(getAppFolder()); + const tsPathsConfig = getTimestampPathsConfig(); + + generateConfigPropInjects(); + const allInjects = [...c.configPropsInjects, ...c.systemPropsInjects, ...c.runtimePropsInjects]; + + // FOLDER MERGERS PROJECT CONFIG + const sourcePath1 = getAppConfigBuildsFolder(c.paths.project.appConfigBase.dir); + copyFolderContentsRecursiveSync(sourcePath1, destPath, true, undefined, false, allInjects, tsPathsConfig); + + // FOLDER MERGERS PROJECT CONFIG (PRIVATE) + const sourcePath1sec = getAppConfigBuildsFolder(c.paths.workspace.project.appConfigBase.dir); + copyFolderContentsRecursiveSync(sourcePath1sec, destPath, true, undefined, false, allInjects, tsPathsConfig); + + // DEPRECATED SHARED + if (c.runtime.currentPlatform?.isWebHosted) { + const sourcePathShared = path.join(c.paths.project.appConfigBase.dir, 'builds/_shared'); + if (fsExistsSync(sourcePathShared)) { + logWarning('Folder builds/_shared is DEPRECATED. use builds/ instead '); + } + copyFolderContentsRecursiveSync(sourcePathShared, getAppFolder(), true, undefined, false, allInjects); + } + + // FOLDER MERGERS FROM APP CONFIG + EXTEND + if (c.paths.appConfig.dirs) { + c.paths.appConfig.dirs.forEach((v) => { + const sourceV = getAppConfigBuildsFolder(v); + copyFolderContentsRecursiveSync(sourceV, destPath, true, undefined, false, allInjects, tsPathsConfig); + }); + } else { + copyFolderContentsRecursiveSync( + getAppConfigBuildsFolder(c.paths.appConfig.dir), + destPath, + true, + undefined, + false, + allInjects, + tsPathsConfig + ); + } + + // FOLDER MERGERS FROM APP CONFIG (PRIVATE) + const sourcePath0sec = getAppConfigBuildsFolder(c.paths.workspace.appConfig.dir); + copyFolderContentsRecursiveSync(sourcePath0sec, destPath, true, undefined, false, allInjects, tsPathsConfig); + + copyTemplatePluginsSync(c); + + resolve(); + }); diff --git a/packages/core/src/projects/assets.ts b/packages/core/src/projects/assets.ts new file mode 100644 index 0000000000..795290e686 --- /dev/null +++ b/packages/core/src/projects/assets.ts @@ -0,0 +1,202 @@ +import path from 'path'; +import { getPlatformProjectDir, getTimestampPathsConfig } from '../context/contextProps'; +import { isPlatformActive } from '../platforms'; +import { cleanFolder, copyFolderContentsRecursiveSync, fsExistsSync, mkdirSync } from '../system/fs'; +import { chalk, logDefault, logWarning, logDebug, logInfo } from '../logger'; +import { RnvPlatform } from '../types'; +import { getConfigProp } from '../context/contextProps'; +import { getContext } from '../context/provider'; +import { resolveRelativePackage } from './utils'; +import { RnvContext } from '../context/types'; + +export const copyRuntimeAssets = async () => { + logDefault('copyRuntimeAssets'); + const c = getContext(); + const destPath = path.join(c.paths.project.assets.dir, 'runtime'); + + // FOLDER MERGERS FROM APP CONFIG + EXTEND + if (c.paths.appConfig.dirs) { + c.paths.appConfig.dirs.forEach((v) => { + const sourcePath = path.join(v, 'assets/runtime'); + copyFolderContentsRecursiveSync(sourcePath, destPath); + }); + } else if (c.paths.appConfig.dir) { + const sourcePath = path.join(c.paths.appConfig.dir, 'assets/runtime'); + copyFolderContentsRecursiveSync(sourcePath, destPath); + } + + if (!c.buildConfig?.common) { + logDebug('BUILD_CONFIG', c.buildConfig); + logWarning( + `Your ${chalk().bold( + c.paths.appConfig.config + )} is misconfigured. (Maybe you have older version?). Missing ${chalk().bold( + '{ common: {} }' + )} object at root` + ); + + return true; + } + + return true; +}; + +// const _requiresAssetOverride = async (c: RnvConfig) => { +// const requiredAssets = c.runtime.engine?.platforms?.[c.platform]?.requiredAssets || []; + +// const assetsToCopy = []; +// const assetsDir = path.join(c.paths.project.appConfigBase.dir, 'assets', c.platform); + +// requiredAssets.forEach((v) => { +// const sourcePath = path.join(c.runtime.engine.originalTemplateAssetsDir, c.platform, v); + +// const destPath = path.join(assetsDir, v); + +// if (fsExistsSync(sourcePath)) { +// if (!fsExistsSync(destPath)) { +// assetsToCopy.push({ +// sourcePath, +// destPath, +// value: v, +// }); +// } +// } +// }); + +// const actionOverride = 'Override exisitng folder'; +// const actionMerge = 'Merge with existing folder'; +// const actionSkip = 'Skip. Warning: this might fail your build'; + +// if (assetsToCopy.length > 0) { +// if (!fsExistsSync(assetsDir)) { +// logInfo( +// `Required assets: ${chalk().bold( +// JSON.stringify(assetsToCopy.map((v) => v.value)) +// )} will be copied to ${chalk().bold('appConfigs/assets')} folder` +// ); +// return true; +// } + +// const { chosenAction } = await inquirerPrompt({ +// message: 'What to do next?', +// type: 'list', +// name: 'chosenAction', +// choices: [actionOverride, actionMerge, actionSkip], +// warningMessage: `Your appConfig/base/assets/${c.platform} exists but engine ${ +// c.runtime.engine.config.id +// } requires some additional assets: +// ${chalk().red(requiredAssets.join(','))}`, +// }); + +// if (chosenAction === actionOverride) { +// await removeDirs([assetsDir]); +// } + +// if (chosenAction === actionOverride || chosenAction === actionMerge) { +// return true; +// } +// } + +// return false; +// }; + +export const copyAssetsFolder = async (subPath?: string, customFn?: (c: RnvContext, platform: RnvPlatform) => void) => { + logDefault('copyAssetsFolder'); + + const c = getContext(); + const { platform } = c; + + if (!isPlatformActive()) return; + + const assetFolderPlatform = getConfigProp('assetFolderPlatform') || platform; + + if (assetFolderPlatform !== platform) { + logInfo( + `Found custom assetFolderPlatform: ${chalk().green( + assetFolderPlatform + )}. Will use it instead of deafult ${platform}` + ); + } + + const tsPathsConfig = getTimestampPathsConfig(); + + const assetSources = getConfigProp('assetSources') || []; + + const validAssetSources: Array = []; + + if (assetFolderPlatform) { + assetSources.forEach((v) => { + const assetsPath = path.join(resolveRelativePackage(c, v), assetFolderPlatform); + + if (fsExistsSync(assetsPath)) { + validAssetSources.push(assetsPath); + } else { + logWarning( + `AssetSources is specified as ${chalk().red(v)}. But path ${chalk().red(assetsPath)} was not found.` + ); + } + }); + } + + const destPath = path.join(getPlatformProjectDir()!, subPath || ''); + + // FOLDER MERGERS FROM EXTERNAL SOURCES + if (validAssetSources.length > 0) { + logInfo( + `Found custom assetSources at ${chalk().gray( + validAssetSources.join('/n') + )}. Will be used to generate assets.` + ); + validAssetSources.forEach((sourcePath) => { + copyFolderContentsRecursiveSync(sourcePath, destPath, true, undefined, false, undefined, tsPathsConfig, c); + }); + return; + } + + // FOLDER MERGERS FROM APP CONFIG + EXTEND + if (c.paths.appConfig.dirs) { + const hasAssetFolder = c.paths.appConfig.dirs.filter((v) => + fsExistsSync(path.join(v, `assets/${assetFolderPlatform}`)) + ).length; + // const requireOverride = await _requiresAssetOverride(c); + if (!hasAssetFolder) { + logWarning(`Your app is missing assets at ${chalk().red(c.paths.appConfig.dirs.join(','))}.`); + // await generateDefaultAssets( + // c, + // platform, + // path.join(c.paths.appConfig.dirs[0], `assets/${assetFolderPlatform}`) + // // requireOverride + // ); + } + } else { + const sourcePath = path.join(c.paths.appConfig.dir, `assets/${assetFolderPlatform}`); + if (!fsExistsSync(sourcePath)) { + logWarning(`Your app is missing assets at ${chalk().red(sourcePath)}.`); + // await generateDefaultAssets(c, platform, sourcePath); + } + } + + if (customFn) { + return customFn(c, platform); + } + + // FOLDER MERGERS FROM APP CONFIG + EXTEND + if (c.paths.appConfig.dirs) { + c.paths.appConfig.dirs.forEach((v) => { + const sourcePath = path.join(v, `assets/${assetFolderPlatform}`); + copyFolderContentsRecursiveSync(sourcePath, destPath, true, undefined, false, undefined, tsPathsConfig, c); + }); + } else { + const sourcePath = path.join(c.paths.appConfig.dir, `assets/${assetFolderPlatform}`); + copyFolderContentsRecursiveSync(sourcePath, destPath, true, undefined, false, undefined, tsPathsConfig, c); + } +}; + +export const cleanPlaformAssets = async () => { + const c = getContext(); + logDefault('cleanPlaformAssets'); + + await cleanFolder(c.paths.project.assets.dir); + mkdirSync(c.paths.project.assets.runtimeDir); + return true; +}; diff --git a/packages/core/src/projects/dependencyManager.ts b/packages/core/src/projects/dependencyManager.ts deleted file mode 100644 index 454d0254ce..0000000000 --- a/packages/core/src/projects/dependencyManager.ts +++ /dev/null @@ -1,178 +0,0 @@ -import semver from 'semver'; -import merge from 'deepmerge'; - -import { executeAsync } from '../system/exec'; -import { installPackageDependencies } from './npm'; -import { chalk, logInfo, logDebug, logDefault } from '../logger'; -import { getEngineRunnerByPlatform } from '../engines'; -import { overrideTemplatePlugins } from '../plugins'; -import { configureFonts } from '.'; -import { RnvContext } from '../context/types'; -import { inquirerPrompt } from '../api'; -import { writeRenativeConfigFile } from '../configs/utils'; -import { fsExistsSync } from '../system/fs'; -import { NpmDepKey, NpmPackageFile } from '../configs/types'; -import { getContext } from '../context/provider'; - -export const checkIfProjectAndNodeModulesExists = async () => { - logDefault('checkIfProjectAndNodeModulesExists'); - - const c = getContext(); - - if (c.paths.project.configExists && !fsExistsSync(c.paths.project.nodeModulesDir)) { - c._requiresNpmInstall = false; - logInfo('node_modules folder is missing. INSTALLING...'); - await installPackageDependencies(); - } -}; - -const injectProjectDependency = async ( - c: RnvContext, - dependency: string, - version: string, - type: NpmDepKey, - skipInstall = false -) => { - logDefault('injectProjectDependency'); - - const currentPackage = c.files.project.package; - if (currentPackage) { - const existingPath = c.paths.project.package; - const dep = currentPackage[type] || {}; - currentPackage[type] = dep; - dep[dependency] = version; - writeRenativeConfigFile(existingPath, currentPackage); - if (!skipInstall) { - await installPackageDependencies(); - await overrideTemplatePlugins(); - await configureFonts(); - } - return true; - } - return false; -}; - -export const checkRequiredPackage = async ( - c: RnvContext, - pkg: string, - version = '', - type: NpmDepKey, - skipAsking = false, - skipInstall = false, - skipVersionCheck = false -) => { - logDebug('checkRequiredPackage'); - if (!pkg) return false; - const projectConfig = c.files.project; - - if (!projectConfig.package?.[type]?.[pkg]) { - // package does not exist, adding it - let confirm = skipAsking; - if (!confirm) { - const resp = await inquirerPrompt({ - type: 'confirm', - message: `You do not have ${pkg} installed. Do you want to add it now?`, - }); - // eslint-disable-next-line prefer-destructuring - confirm = resp.confirm; - } - - if (confirm) { - let latestVersion = 'latest'; - if (version === '' && !skipVersionCheck) { - try { - latestVersion = await executeAsync(`npm show ${pkg} version`); - // eslint-disable-next-line no-empty - } catch (e) {} - } - return injectProjectDependency(c, pkg, version || latestVersion, type, skipInstall); - } - } else if (version === '') { - // package exists, checking version only if version is not - const currentVersion = projectConfig.package[type]?.[pkg]; - let latestVersion; - try { - latestVersion = await executeAsync(`npm show ${pkg} version`); - // eslint-disable-next-line no-empty - } catch (e) {} - if (latestVersion) { - let updateAvailable = false; - - try { - // semver might fail if you have a path instead of a version (like when you are developing) - if (currentVersion) { - updateAvailable = semver.lt(currentVersion, latestVersion); - } - } catch (e) { - //NOOP - } - - if (updateAvailable) { - let confirm = skipAsking; - if (!confirm) { - const resp = await inquirerPrompt({ - type: 'confirm', - message: `Seems like ${pkg}@${currentVersion} is installed while there is a newer version, ${pkg}@${latestVersion}. Do you want to upgrade?`, - }); - // eslint-disable-next-line prefer-destructuring - confirm = resp.confirm; - } - - if (confirm) { - return injectProjectDependency(c, pkg, latestVersion, type, skipInstall); - } - } - } - } - - return false; -}; - -export const injectPlatformDependencies = async () => { - logDefault('injectPlatformDependencies'); - const c = getContext(); - const { platform } = c; - const engine = getEngineRunnerByPlatform(platform); - const npmDepsBase = engine?.config?.npm || {}; - const npmDepsExt = platform ? engine?.config?.platforms?.[platform]?.npm || {} : {}; - - const npmDeps = merge>(npmDepsBase, npmDepsExt); - - if (engine && npmDeps) { - const promises = (Object.keys(npmDeps) as NpmDepKey[]).reduce>>((acc, type) => { - // iterate over dependencies, devDepencencies or optionalDependencies - const deps = npmDeps[type]; - if (deps) { - Object.keys(deps).forEach((dep) => { - // iterate over deps - acc.push(checkRequiredPackage(c, dep, deps[dep], type, true, true)); - }); - } - - return acc; - }, []); - - const installed = await Promise.all(promises); - - if (installed.some((i) => i === true)) { - const { isMonorepo } = c.buildConfig; - if (isMonorepo) { - logInfo( - `Found extra npm dependencies required by ${chalk().bold( - engine.config.id - )} engine. project marked as monorepo. SKIPPING` - ); - } else { - // do npm i only if something new is added - logInfo( - `Found extra npm dependencies required by ${chalk().bold(engine.config.id)} engine. ADDING...DONE` - ); - await installPackageDependencies(); - await overrideTemplatePlugins(); - await configureFonts(); - } - } - } - - // add other deps that are not npm -}; diff --git a/packages/core/src/projects/fonts.ts b/packages/core/src/projects/fonts.ts new file mode 100644 index 0000000000..713d5feeeb --- /dev/null +++ b/packages/core/src/projects/fonts.ts @@ -0,0 +1,57 @@ +import { getConfigProp } from '../context/contextProps'; +import { getContext } from '../context/provider'; +import { logDefault } from '../logger'; +import { fsExistsSync, fsReaddirSync } from '../system/fs'; +import { ParseFontsCallback } from './types'; +import { RnvContext } from '../context/types'; +import { parsePlugins } from '../plugins'; +import { resolveRelativePackage } from './utils'; + +export const parseFonts = (callback: ParseFontsCallback) => { + logDefault('parseFonts'); + + const c = getContext(); + + if (c.buildConfig) { + // FONTS - PROJECT CONFIG + if (fsExistsSync(c.paths.project.appConfigBase.fontsDir)) { + fsReaddirSync(c.paths.project.appConfigBase.fontsDir).forEach((font) => { + if (callback) { + callback(font, c.paths.project.appConfigBase.fontsDir); + } + }); + } + // FONTS - APP CONFIG + if (c.paths.appConfig.fontsDirs) { + c.paths.appConfig.fontsDirs.forEach((v) => { + if (fsExistsSync(v)) { + fsReaddirSync(v).forEach((font) => { + if (callback) callback(font, v); + }); + } + }); + } else if (fsExistsSync(c.paths.appConfig.fontsDir)) { + fsReaddirSync(c.paths.appConfig.fontsDir).forEach((font) => { + if (callback) callback(font, c.paths.appConfig.fontsDir); + }); + } + _parseFontSources(c, getConfigProp('fontSources') || [], callback); + // PLUGIN FONTS + parsePlugins((plugin) => { + if (plugin.config?.fontSources) { + _parseFontSources(c, plugin.config?.fontSources, callback); + } + }, true); + } +}; + +const _parseFontSources = (c: RnvContext, fontSourcesArr: Array, callback: ParseFontsCallback) => { + const fontSources = fontSourcesArr.map((v) => resolveRelativePackage(c, v)); + fontSources.forEach((fontSourceDir) => { + if (fsExistsSync(fontSourceDir)) { + fsReaddirSync(fontSourceDir).forEach((font) => { + if (callback) callback(font, fontSourceDir); + }); + } + }); +}; diff --git a/packages/core/src/projects/index.ts b/packages/core/src/projects/index.ts deleted file mode 100644 index d7f21824b6..0000000000 --- a/packages/core/src/projects/index.ts +++ /dev/null @@ -1,655 +0,0 @@ -import path from 'path'; -import { - getAppConfigBuildsFolder, - getAppFolder, - getPlatformProjectDir, - getTimestampPathsConfig, -} from '../context/contextProps'; -import { isPlatformActive } from '../platforms'; -import { copyTemplatePluginsSync, parsePlugins } from '../plugins'; -import { - cleanFolder, - copyFolderContentsRecursiveSync, - copyFileSync, - mkdirSync, - readObjectSync, - writeFileSync, - fsWriteFileSync, - fsExistsSync, - fsReaddirSync, - fsReadFileSync, - resolvePackage, -} from '../system/fs'; -import { installPackageDependencies, isYarnInstalled } from './npm'; -import { executeAsync } from '../system/exec'; -import { chalk, logDefault, logWarning, logDebug, logInfo, getCurrentCommand } from '../logger'; -import { configureTemplateFiles, configureEntryPoint } from '../templates'; -import { parseRenativeConfigs } from '../configs'; -import { RnvContext } from '../context/types'; -import { RnvPlatform } from '../types'; -import { ParseFontsCallback } from './types'; -import { inquirerPrompt } from '../api'; -import { upgradeProjectDependencies } from '../configs/configProject'; -import { generateConfigPropInjects } from '../system/injectors'; -import { ConfigFileApp, ConfigFileEngine, ConfigFileProject, ConfigFileTemplate } from '../schema/configFiles/types'; -import { getConfigProp } from '../context/contextProps'; -import { ConfigName } from '../enums/configName'; -import { getContext } from '../context/provider'; - -export const checkAndBootstrapIfRequired = async () => { - logDefault('checkAndBootstrapIfRequired'); - const c = getContext(); - - const template: string = c.program?.template; - if (!c.paths.project.configExists && template) { - await executeAsync(`${isYarnInstalled() ? 'yarn' : 'npm'} add ${template}`, { - cwd: c.paths.project.dir, - }); - - const templateArr = template.split('@').filter((v) => v !== ''); - const templateDir = template.startsWith('@') ? `@${templateArr[0]}` : templateArr[0]; - const templatePath = path.join(c.paths.project.dir, 'node_modules', templateDir); - - c.paths.template.dir = templatePath; - c.paths.template.configTemplate = path.join(templatePath, ConfigName.renativeTemplate); - - const templateObj = readObjectSync(c.paths.template.configTemplate); - const appConfigPath = path.join(c.paths.project.appConfigsDir, c.program.appConfigID, 'renative.json'); - //TODO: Investigate whether we really need to support this: supportedPlatforms inside appconfig - const appConfigObj = readObjectSync(appConfigPath); - const supportedPlatforms = appConfigObj?.defaults?.supportedPlatforms || []; - //========= - const engineTemplates = c.files.rnv.projectTemplates?.config?.engineTemplates; - const rnvPlatforms = c.files.rnv.projectTemplates?.config?.platformTemplates || {}; - const activeEngineKeys: Array = []; - - if (engineTemplates) { - supportedPlatforms.forEach((supPlat) => { - Object.keys(engineTemplates).forEach((eKey) => { - if (engineTemplates[eKey].id === rnvPlatforms[supPlat]?.engine) { - activeEngineKeys.push(eKey); - } - }); - }); - } - - if (!templateObj) { - return; - } - - const config = { - ...templateObj, - }; - - // Clean unused engines - if (config.engines) { - Object.keys(config.engines).forEach((k) => { - if (!activeEngineKeys.includes(k)) { - delete config.engines?.[k]; - } - }); - } - - if (config.templateConfig?.package_json) { - const pkgJson = config.templateConfig.package_json; - if (!pkgJson.devDependencies) pkgJson.devDependencies = {}; - if (!pkgJson.dependencies) pkgJson.dependencies = {}; - c.files.project.package = pkgJson; - - const installPromises: Array> = []; - Object.keys(pkgJson.devDependencies).forEach((devDepKey) => { - if (activeEngineKeys.includes(devDepKey)) { - installPromises.push( - executeAsync(`npx yarn add ${devDepKey}@${pkgJson.devDependencies?.[devDepKey]}`, { - cwd: c.paths.project.dir, - }) - ); - } - }); - - if (installPromises.length) { - await Promise.all(installPromises); - - logInfo('Installed engines DONE'); - - activeEngineKeys.forEach((aek) => { - const engineConfigPath = path.join( - c.paths.project.dir, - 'node_modules', - aek, - 'renative.engine.json' - ); - const eConfig = readObjectSync(engineConfigPath); - if (eConfig?.platforms) { - supportedPlatforms.forEach((supPlat) => { - const engPlatNpm = eConfig.platforms?.[supPlat]?.npm; - if (engPlatNpm) { - const engPlatDeps = engPlatNpm.dependencies; - const deps = pkgJson.dependencies || {}; - pkgJson.dependencies = deps; - if (engPlatDeps) { - Object.keys(engPlatDeps).forEach((engPlatDepKey) => { - if (!deps[engPlatDepKey]) { - logInfo(`Installing active engine dependency ${engPlatDepKey}`); - deps[engPlatDepKey] = engPlatDeps[engPlatDepKey]; - } - }); - } - - const engPlatDevDeps = engPlatNpm.devDependencies; - if (engPlatDevDeps) { - Object.keys(engPlatDevDeps).forEach((engPlatDevDepKey) => { - pkgJson.devDependencies = pkgJson.devDependencies || {}; - if (!pkgJson.devDependencies[engPlatDevDepKey]) { - logInfo(`Installing active engine dependency ${engPlatDevDepKey}`); - pkgJson.devDependencies[engPlatDevDepKey] = - engPlatDevDeps[engPlatDevDepKey]; - } - }); - } - - const engPlatOptDeps = engPlatNpm.optionalDependencies; - if (engPlatOptDeps) { - Object.keys(engPlatOptDeps).forEach((engPlatOptDepKey) => { - pkgJson.optionalDependencies = pkgJson.optionalDependencies || {}; - if (!pkgJson.optionalDependencies[engPlatOptDepKey]) { - logInfo(`Installing active engine dependency ${engPlatOptDepKey}`); - pkgJson.optionalDependencies[engPlatOptDepKey] = - engPlatOptDeps[engPlatOptDepKey]; - } - }); - } - } - }); - } - }); - } - - writeFileSync(c.paths.project.package, pkgJson); - } - - delete config.templateConfig; - writeFileSync(c.paths.project.config, config); - - const appConfigsPath = path.join(templatePath, 'appConfigs'); - if (fsExistsSync(appConfigsPath)) { - copyFolderContentsRecursiveSync(appConfigsPath, path.join(c.paths.project.appConfigsDir)); - } - - await installPackageDependencies(); - - if (c.program.npxMode) { - return; - } - - await parseRenativeConfigs(); - - await configureTemplateFiles(); - await configureEntryPoint(c.platform); - // await applyTemplate(c); - - // copyFolderContentsRecursiveSync(templatePath, c.paths.project.dir); - } - return true; -}; - -export const checkAndCreateGitignore = async () => { - const c = getContext(); - - logDefault('checkAndCreateGitignore'); - const ignrPath = path.join(c.paths.project.dir, '.gitignore'); - if (!fsExistsSync(ignrPath)) { - logInfo('Your .gitignore is missing. CREATING...DONE'); - - copyFileSync(path.join(c.paths.rnv.dir, 'coreTemplateFiles/.gitignore.tpl'), ignrPath); - } - return true; -}; - -export const configureFonts = async () => { - const c = getContext(); - - // FONTS - let fontsObj = 'export default ['; - - const duplicateFontCheck: Array = []; - parseFonts((font, dir) => { - if (font.includes('.ttf') || font.includes('.otf') || font.includes('.woff')) { - const keOriginal = font.split('.')[0]; - const keyNormalised = keOriginal.replace(/__/g, ' '); - const includedFonts = getConfigProp('includedFonts'); - if (includedFonts) { - if ( - includedFonts.includes('*') || - includedFonts.includes(keOriginal) || - includedFonts.includes(keyNormalised) - ) { - if (font && !duplicateFontCheck.includes(font)) { - duplicateFontCheck.push(font); - const fontSource = path.join(dir, font).replace(/\\/g, '\\\\'); - if (fsExistsSync(fontSource)) { - // const fontFolder = path.join(appFolder, 'app/src/main/assets/fonts'); - // mkdirSync(fontFolder); - // const fontDest = path.join(fontFolder, font); - // copyFileSync(fontSource, fontDest); - fontsObj += `{ - fontFamily: '${keyNormalised}', - file: require('${fontSource}'), - },`; - } else { - logWarning(`Font ${chalk().bold(fontSource)} doesn't exist! Skipping.`); - } - } - } - } - } - }); - - fontsObj += '];'; - if (!fsExistsSync(c.paths.project.assets.runtimeDir)) { - mkdirSync(c.paths.project.assets.runtimeDir); - } - const fontJsPath = path.join(c.paths.project.assets.dir, 'runtime', 'fonts.web.js'); - if (fsExistsSync(fontJsPath)) { - const existingFileContents = fsReadFileSync(fontJsPath).toString(); - - if (existingFileContents !== fontsObj) { - logDebug('newFontsJsFile'); - fsWriteFileSync(fontJsPath, fontsObj); - } - } else { - logDebug('newFontsJsFile'); - fsWriteFileSync(fontJsPath, fontsObj); - } - - const coreTemplateFiles = path.resolve(c.paths.rnv.dir, 'coreTemplateFiles'); - copyFileSync( - path.resolve(coreTemplateFiles, 'fontManager.js'), - path.resolve(c.paths.project.assets.dir, 'runtime', 'fontManager.js') - ); - copyFileSync( - path.resolve(coreTemplateFiles, 'fontManager.js'), - path.resolve(c.paths.project.assets.dir, 'runtime', 'fontManager.server.web.js') - ); - copyFileSync( - path.resolve(coreTemplateFiles, 'fontManager.web.js'), - path.resolve(c.paths.project.assets.dir, 'runtime', 'fontManager.web.js') - ); - - return true; -}; - -export const copyRuntimeAssets = async () => { - logDefault('copyRuntimeAssets'); - const c = getContext(); - const destPath = path.join(c.paths.project.assets.dir, 'runtime'); - - // FOLDER MERGERS FROM APP CONFIG + EXTEND - if (c.paths.appConfig.dirs) { - c.paths.appConfig.dirs.forEach((v) => { - const sourcePath = path.join(v, 'assets/runtime'); - copyFolderContentsRecursiveSync(sourcePath, destPath); - }); - } else if (c.paths.appConfig.dir) { - const sourcePath = path.join(c.paths.appConfig.dir, 'assets/runtime'); - copyFolderContentsRecursiveSync(sourcePath, destPath); - } - - if (!c.buildConfig?.common) { - logDebug('BUILD_CONFIG', c.buildConfig); - logWarning( - `Your ${chalk().bold( - c.paths.appConfig.config - )} is misconfigured. (Maybe you have older version?). Missing ${chalk().bold( - '{ common: {} }' - )} object at root` - ); - - return true; - } - - return true; -}; - -export const parseFonts = (callback: ParseFontsCallback) => { - logDefault('parseFonts'); - - const c = getContext(); - - if (c.buildConfig) { - // FONTS - PROJECT CONFIG - if (fsExistsSync(c.paths.project.appConfigBase.fontsDir)) { - fsReaddirSync(c.paths.project.appConfigBase.fontsDir).forEach((font) => { - if (callback) { - callback(font, c.paths.project.appConfigBase.fontsDir); - } - }); - } - // FONTS - APP CONFIG - if (c.paths.appConfig.fontsDirs) { - c.paths.appConfig.fontsDirs.forEach((v) => { - if (fsExistsSync(v)) { - fsReaddirSync(v).forEach((font) => { - if (callback) callback(font, v); - }); - } - }); - } else if (fsExistsSync(c.paths.appConfig.fontsDir)) { - fsReaddirSync(c.paths.appConfig.fontsDir).forEach((font) => { - if (callback) callback(font, c.paths.appConfig.fontsDir); - }); - } - _parseFontSources(c, getConfigProp('fontSources') || [], callback); - // PLUGIN FONTS - parsePlugins((plugin) => { - if (plugin.config?.fontSources) { - _parseFontSources(c, plugin.config?.fontSources, callback); - } - }, true); - } -}; - -const _parseFontSources = (c: RnvContext, fontSourcesArr: Array, callback: ParseFontsCallback) => { - const fontSources = fontSourcesArr.map((v) => _resolvePackage(c, v)); - fontSources.forEach((fontSourceDir) => { - if (fsExistsSync(fontSourceDir)) { - fsReaddirSync(fontSourceDir).forEach((font) => { - if (callback) callback(font, fontSourceDir); - }); - } - }); -}; - -const _resolvePackage = (c: RnvContext, v: string) => { - if (v?.startsWith?.('./')) { - return path.join(c.paths.project.dir, v); - } - return resolvePackage(v); -}; - -// const _requiresAssetOverride = async (c: RnvConfig) => { -// const requiredAssets = c.runtime.engine?.platforms?.[c.platform]?.requiredAssets || []; - -// const assetsToCopy = []; -// const assetsDir = path.join(c.paths.project.appConfigBase.dir, 'assets', c.platform); - -// requiredAssets.forEach((v) => { -// const sourcePath = path.join(c.runtime.engine.originalTemplateAssetsDir, c.platform, v); - -// const destPath = path.join(assetsDir, v); - -// if (fsExistsSync(sourcePath)) { -// if (!fsExistsSync(destPath)) { -// assetsToCopy.push({ -// sourcePath, -// destPath, -// value: v, -// }); -// } -// } -// }); - -// const actionOverride = 'Override exisitng folder'; -// const actionMerge = 'Merge with existing folder'; -// const actionSkip = 'Skip. Warning: this might fail your build'; - -// if (assetsToCopy.length > 0) { -// if (!fsExistsSync(assetsDir)) { -// logInfo( -// `Required assets: ${chalk().bold( -// JSON.stringify(assetsToCopy.map((v) => v.value)) -// )} will be copied to ${chalk().bold('appConfigs/assets')} folder` -// ); -// return true; -// } - -// const { chosenAction } = await inquirerPrompt({ -// message: 'What to do next?', -// type: 'list', -// name: 'chosenAction', -// choices: [actionOverride, actionMerge, actionSkip], -// warningMessage: `Your appConfig/base/assets/${c.platform} exists but engine ${ -// c.runtime.engine.config.id -// } requires some additional assets: -// ${chalk().red(requiredAssets.join(','))}`, -// }); - -// if (chosenAction === actionOverride) { -// await removeDirs([assetsDir]); -// } - -// if (chosenAction === actionOverride || chosenAction === actionMerge) { -// return true; -// } -// } - -// return false; -// }; - -export const copyAssetsFolder = async (subPath?: string, customFn?: (c: RnvContext, platform: RnvPlatform) => void) => { - logDefault('copyAssetsFolder'); - - const c = getContext(); - const { platform } = c; - - if (!isPlatformActive()) return; - - const assetFolderPlatform = getConfigProp('assetFolderPlatform') || platform; - - if (assetFolderPlatform !== platform) { - logInfo( - `Found custom assetFolderPlatform: ${chalk().green( - assetFolderPlatform - )}. Will use it instead of deafult ${platform}` - ); - } - - const tsPathsConfig = getTimestampPathsConfig(); - - const assetSources = getConfigProp('assetSources') || []; - - const validAssetSources: Array = []; - - if (assetFolderPlatform) { - assetSources.forEach((v) => { - const assetsPath = path.join(_resolvePackage(c, v), assetFolderPlatform); - - if (fsExistsSync(assetsPath)) { - validAssetSources.push(assetsPath); - } else { - logWarning( - `AssetSources is specified as ${chalk().red(v)}. But path ${chalk().red(assetsPath)} was not found.` - ); - } - }); - } - - const destPath = path.join(getPlatformProjectDir()!, subPath || ''); - - // FOLDER MERGERS FROM EXTERNAL SOURCES - if (validAssetSources.length > 0) { - logInfo( - `Found custom assetSources at ${chalk().gray( - validAssetSources.join('/n') - )}. Will be used to generate assets.` - ); - validAssetSources.forEach((sourcePath) => { - copyFolderContentsRecursiveSync(sourcePath, destPath, true, undefined, false, undefined, tsPathsConfig, c); - }); - return; - } - - // FOLDER MERGERS FROM APP CONFIG + EXTEND - if (c.paths.appConfig.dirs) { - const hasAssetFolder = c.paths.appConfig.dirs.filter((v) => - fsExistsSync(path.join(v, `assets/${assetFolderPlatform}`)) - ).length; - // const requireOverride = await _requiresAssetOverride(c); - if (!hasAssetFolder) { - logWarning(`Your app is missing assets at ${chalk().red(c.paths.appConfig.dirs.join(','))}.`); - // await generateDefaultAssets( - // c, - // platform, - // path.join(c.paths.appConfig.dirs[0], `assets/${assetFolderPlatform}`) - // // requireOverride - // ); - } - } else { - const sourcePath = path.join(c.paths.appConfig.dir, `assets/${assetFolderPlatform}`); - if (!fsExistsSync(sourcePath)) { - logWarning(`Your app is missing assets at ${chalk().red(sourcePath)}.`); - // await generateDefaultAssets(c, platform, sourcePath); - } - } - - if (customFn) { - return customFn(c, platform); - } - - // FOLDER MERGERS FROM APP CONFIG + EXTEND - if (c.paths.appConfig.dirs) { - c.paths.appConfig.dirs.forEach((v) => { - const sourcePath = path.join(v, `assets/${assetFolderPlatform}`); - copyFolderContentsRecursiveSync(sourcePath, destPath, true, undefined, false, undefined, tsPathsConfig, c); - }); - } else { - const sourcePath = path.join(c.paths.appConfig.dir, `assets/${assetFolderPlatform}`); - copyFolderContentsRecursiveSync(sourcePath, destPath, true, undefined, false, undefined, tsPathsConfig, c); - } -}; - -//NOTE: Default assets have been removed from engines -// const generateDefaultAssets = async (c: RnvConfig, platform, sourcePath, forceTrue) => { -// logDefault('generateDefaultAssets'); -// let confirmAssets = true; -// if (c.program.ci !== true && c.program.yes !== true && !forceTrue) { -// const { confirm } = await inquirerPrompt({ -// type: 'confirm', -// message: `It seems you don't have assets configured in ${chalk().bold( -// sourcePath -// )} do you want generate default ones?`, -// }); -// confirmAssets = confirm; -// } - -// if (confirmAssets) { -// const engine = getEngineRunnerByPlatform(c, c.platform); -// if (fsExistsSync(path.join(engine.originalTemplateAssetsDir, platform))) { -// copyFolderContentsRecursiveSync(path.join(engine.originalTemplateAssetsDir, platform), sourcePath); -// } else { -// logWarning('Currently used engine does not have default assets, creating an empty folder'); -// mkdirSync(sourcePath); -// } -// } -// }; - -export const copyBuildsFolder = () => - new Promise((resolve) => { - logDefault('copyBuildsFolder'); - const c = getContext(); - - if (!isPlatformActive(resolve)) return; - - const destPath = path.join(getAppFolder()); - const tsPathsConfig = getTimestampPathsConfig(); - - generateConfigPropInjects(); - const allInjects = [...c.configPropsInjects, ...c.systemPropsInjects, ...c.runtimePropsInjects]; - - // FOLDER MERGERS PROJECT CONFIG - const sourcePath1 = getAppConfigBuildsFolder(c.paths.project.appConfigBase.dir); - copyFolderContentsRecursiveSync(sourcePath1, destPath, true, undefined, false, allInjects, tsPathsConfig); - - // FOLDER MERGERS PROJECT CONFIG (PRIVATE) - const sourcePath1sec = getAppConfigBuildsFolder(c.paths.workspace.project.appConfigBase.dir); - copyFolderContentsRecursiveSync(sourcePath1sec, destPath, true, undefined, false, allInjects, tsPathsConfig); - - // DEPRECATED SHARED - if (c.runtime.currentPlatform?.isWebHosted) { - const sourcePathShared = path.join(c.paths.project.appConfigBase.dir, 'builds/_shared'); - if (fsExistsSync(sourcePathShared)) { - logWarning('Folder builds/_shared is DEPRECATED. use builds/ instead '); - } - copyFolderContentsRecursiveSync(sourcePathShared, getAppFolder(), true, undefined, false, allInjects); - } - - // FOLDER MERGERS FROM APP CONFIG + EXTEND - if (c.paths.appConfig.dirs) { - c.paths.appConfig.dirs.forEach((v) => { - const sourceV = getAppConfigBuildsFolder(v); - copyFolderContentsRecursiveSync(sourceV, destPath, true, undefined, false, allInjects, tsPathsConfig); - }); - } else { - copyFolderContentsRecursiveSync( - getAppConfigBuildsFolder(c.paths.appConfig.dir), - destPath, - true, - undefined, - false, - allInjects, - tsPathsConfig - ); - } - - // FOLDER MERGERS FROM APP CONFIG (PRIVATE) - const sourcePath0sec = getAppConfigBuildsFolder(c.paths.workspace.appConfig.dir); - copyFolderContentsRecursiveSync(sourcePath0sec, destPath, true, undefined, false, allInjects, tsPathsConfig); - - copyTemplatePluginsSync(c); - - resolve(); - }); - -export const versionCheck = async (c: RnvContext) => { - logDefault('versionCheck'); - - if (c.runtime.versionCheckCompleted || c.files.project?.config?.skipAutoUpdate || c.program.skipDependencyCheck) { - return true; - } - c.runtime.rnvVersionRunner = c.files.rnv?.package?.version || 'unknown'; - c.runtime.rnvVersionProject = - c.files.project?.package?.devDependencies?.rnv || c.files.project?.package?.dependencies?.rnv || 'unknown'; - logDefault( - `versionCheck:rnvRunner:${c.runtime.rnvVersionRunner},rnvProject:${c.runtime.rnvVersionProject}`, - chalk().grey - ); - if (c.runtime.rnvVersionRunner && c.runtime.rnvVersionProject) { - if (c.runtime.rnvVersionRunner !== c.runtime.rnvVersionProject && !c.program.skipRnvCheck) { - const recCmd = chalk().bold(`$ npx ${getCurrentCommand(true)}`); - const actionNoUpdate = 'Continue and skip updating package.json'; - const actionWithUpdate = 'Continue and update package.json'; - const actionUpgrade = `Upgrade project to ${c.runtime.rnvVersionRunner}`; - - const { chosenAction } = await inquirerPrompt({ - message: 'What to do next?', - type: 'list', - name: 'chosenAction', - choices: [actionNoUpdate, actionWithUpdate, actionUpgrade], - warningMessage: `You are running $rnv v${chalk().red( - c.runtime.rnvVersionRunner - )} against project built with rnv v${chalk().red( - c.runtime.rnvVersionProject - )}. This might result in unexpected behaviour! -It is recommended that you run your rnv command with npx prefix: ${recCmd} . or manually update your devDependencies.rnv version in your package.json.`, - }); - - c.runtime.versionCheckCompleted = true; - - c.runtime.skipPackageUpdate = chosenAction === actionNoUpdate; - - if (chosenAction === actionUpgrade) { - upgradeProjectDependencies(c.runtime.rnvVersionRunner); - } - } - } - return true; -}; - -export const cleanPlaformAssets = async () => { - const c = getContext(); - logDefault('cleanPlaformAssets'); - - await cleanFolder(c.paths.project.assets.dir); - mkdirSync(c.paths.project.assets.runtimeDir); - return true; -}; diff --git a/packages/core/src/projects/mutations.ts b/packages/core/src/projects/mutations.ts new file mode 100644 index 0000000000..2038788334 --- /dev/null +++ b/packages/core/src/projects/mutations.ts @@ -0,0 +1,69 @@ +import { chalk, logRaw, logWarning } from '../logger'; +import { getContext } from '../context/provider'; +import { DependencyMutation } from './types'; +import { inquirerPrompt } from '../api'; +import { NpmPackageFile } from '../configs/types'; +import { updatePackage } from './package'; + +export const createDependencyMutation = (opts: DependencyMutation) => { + const ctx = getContext(); + ctx.mutations.pendingMutations.push(opts); + ctx._requiresNpmInstall = true; + return opts; +}; + +export const handleMutations = async () => { + const ctx = getContext(); + const mutations = ctx.mutations.pendingMutations; + if (!mutations.length) return true; + const isTemplate = ctx.buildConfig?.isTemplate; + logWarning( + `Updates to package.json are required:${isTemplate ? ' (only info. skipping due to template mode)' : ''}` + ); + let msg = ''; + mutations.forEach((m) => { + msg += `- ${chalk().bold(m.name)} (${chalk().red(m.original?.version || 'N/A')}) => (${chalk().green( + m.updated.version + )}) ${chalk().gray(`${m.msg} | ${m.source}`)}\n`; + }); + logRaw(msg); + if (isTemplate) return false; + //Check with user + const choices = [ + 'Update package and install (recommended)', + 'Update package and skip install', + 'Continue without update or install', + ]; + const { confirm } = await inquirerPrompt({ + name: 'confirm', + type: 'list', + default: choices[0], + choices, + message: 'What to do?', + }); + + ctx.mutations.pendingMutations = []; + + if (confirm === choices[2]) { + // We skip the update and tell up stream to skip install + return false; + } + + const updateObj: Partial = {}; + mutations.forEach((m) => { + updateObj[m.type] = updateObj[m.type] || {}; + const dep = updateObj[m.type]; + if (dep) { + dep[m.name] = m.updated.version; + } + }); + + updatePackage(updateObj); + + if (confirm === choices[1]) { + // We update package but tell up stream to skip install + return false; + } + + return true; +}; diff --git a/packages/core/src/projects/npm.ts b/packages/core/src/projects/npm.ts index 2eeed8524d..8f18d10fed 100644 --- a/packages/core/src/projects/npm.ts +++ b/packages/core/src/projects/npm.ts @@ -1,11 +1,24 @@ import path from 'path'; import { executeAsync, commandExistsSync } from '../system/exec'; -import { fsExistsSync, invalidatePodsChecksum, removeDirs, writeFileSync } from '../system/fs'; +import { fsExistsSync, removeDirs, writeFileSync } from '../system/fs'; import { logDefault, logWarning, logError, logInfo, logDebug, logSuccess } from '../logger'; import { doResolve } from '../system/resolve'; import { RnvContext } from '../context/types'; import { inquirerPrompt } from '../api'; import { getContext } from '../context/provider'; +import { handleMutations } from './mutations'; + +export const checkIfProjectAndNodeModulesExists = async () => { + logDefault('checkIfProjectAndNodeModulesExists'); + + const c = getContext(); + + if (c.paths.project.configExists && !fsExistsSync(c.paths.project.nodeModulesDir)) { + c._requiresNpmInstall = false; + logInfo('node_modules folder is missing. INSTALLING...'); + await installPackageDependencies(); + } +}; export const checkNpxIsInstalled = async () => { logDefault('checkNpxIsInstalled'); @@ -108,6 +121,12 @@ export const isYarnInstalled = () => commandExistsSync('yarn') || doResolve('yar export const installPackageDependencies = async (failOnError = false) => { const c = getContext(); + const result = await handleMutations(); + + if (!result) { + c._requiresNpmInstall = false; + return; + } c.runtime.forceBuildHookRebuild = true; const customScript = _getInstallScript(c); @@ -142,15 +161,17 @@ export const installPackageDependencies = async (failOnError = false) => { "You have a yarn.lock file but you don't have yarn installed. Install it or delete yarn.lock" ); command = yarnLockExists ? 'yarn' : 'npm install'; - } else if (c.program.packageManager) { + } else if (c.program.opts().packageManager) { // no lock file check cli option - if (['yarn', 'npm'].includes(c.program.packageManager)) { - command = c.program.packageManager === 'yarn' ? 'yarn' : 'npm install'; + if (['yarn', 'npm'].includes(c.program.opts().packageManager)) { + command = c.program.opts().packageManager === 'yarn' ? 'yarn' : 'npm install'; if (command === 'yarn' && !isYarnInstalled()) throw new Error("You specified yarn as packageManager but it's not installed"); } else { throw new Error( - `Unsupported package manager ${c.program.packageManager}. Only yarn and npm are supported at the moment.` + `Unsupported package manager ${ + c.program.opts().packageManager + }. Only yarn and npm are supported at the moment.` ); } } else { @@ -169,7 +190,9 @@ export const installPackageDependencies = async (failOnError = false) => { try { await executeAsync(command); - await invalidatePodsChecksum(); + // This it too much of brute force. + // We should find a way to detect if node_modules was actually updated with relevant pod deps + // await invalidatePodsChecksum(); } catch (e) { if (failOnError) { logError(e); @@ -179,6 +202,7 @@ export const installPackageDependencies = async (failOnError = false) => { `${e}\n Seems like your node_modules is corrupted by other libs. ReNative will try to fix it for you` ); try { + // TODO: evalauate if this is still needed await cleanNodeModules(); await installPackageDependencies(true); } catch (npmErr) { @@ -212,19 +236,6 @@ export const installPackageDependencies = async (failOnError = false) => { } }; -export const jetifyIfRequired = async () => { - const c = getContext(); - logDefault('jetifyIfRequired'); - if (c.files.project.configLocal?._meta?.requiresJetify) { - if (doResolve('jetifier')) { - await executeAsync('npx jetify'); - c.files.project.configLocal._meta.requiresJetify = false; - writeFileSync(c.paths.project.configLocal, c.files.project.configLocal); - } - } - return true; -}; - export const cleanNodeModules = () => new Promise((resolve, reject) => { logDefault('cleanNodeModules'); @@ -251,12 +262,4 @@ export const cleanNodeModules = () => removeDirs(dirs) .then(() => resolve()) .catch((e) => reject(e)); - // removeDirs([ - // path.join(c.paths.project.nodeModulesDir, 'react-native-safe-area-view/.git'), - // path.join(c.paths.project.nodeModulesDir, '@react-navigation/native/node_modules/react-native-safe-area-view/.git'), - // path.join(c.paths.project.nodeModulesDir, 'react-navigation/node_modules/react-native-safe-area-view/.git'), - // path.join(c.paths.rnv.nodeModulesDir, 'react-native-safe-area-view/.git'), - // path.join(c.paths.rnv.nodeModulesDir, '@react-navigation/native/node_modules/react-native-safe-area-view/.git'), - // path.join(c.paths.rnv.nodeModulesDir, 'react-navigation/node_modules/react-native-safe-area-view/.git') - // ]).then(() => resolve()).catch(e => reject(e)); }); diff --git a/packages/core/src/projects/package.ts b/packages/core/src/projects/package.ts index c94ab17462..46c745b309 100644 --- a/packages/core/src/projects/package.ts +++ b/packages/core/src/projects/package.ts @@ -1,9 +1,20 @@ import path from 'path'; +import merge from 'deepmerge'; import { fsExistsSync, fsWriteFileSync, loadFile, readObjectSync } from '../system/fs'; import { logDefault, logWarning, logInfo } from '../logger'; -import { ConfigFileTemplate } from '../schema/configFiles/types'; -import { ConfigName } from '../enums/configName'; +import { RnvFileName } from '../enums/fileName'; import { getContext } from '../context/provider'; +import { type NpmPackageFile } from '../configs/types'; +import { writeRenativeConfigFile } from '../configs/utils'; +import type { ConfigFileTemplate } from '../schema/types'; + +export const updatePackage = (override: Partial) => { + const c = getContext(); + const newPackage: NpmPackageFile = merge(c.files.project.package, override); + writeRenativeConfigFile(c.paths.project.package, newPackage); + c.files.project.package = newPackage; + c._requiresNpmInstall = true; +}; const packageJsonIsValid = () => { const c = getContext(); @@ -25,18 +36,18 @@ export const checkAndCreateProjectPackage = async () => { const packageName = c.files.project.config?.projectName || c.paths.project.dir.split('/').pop(); const packageVersion = c.files.project.config?.projectVersion || '0.1.0'; - const templateName = c.files.project.config?.currentTemplate; + const templateName = c.files.project.config?.templateConfig?.name; if (!templateName) { logWarning('You are missing currentTemplate in your renative.json'); } - const rnvVersion = c.files.rnv.package.version; + const rnvVersion = c.files.rnvCore.package.version; if (templateName) { c.paths.template.configTemplate = path.join( c.paths.project.dir, 'node_modules', templateName, - ConfigName.renativeTemplate + RnvFileName.renativeTemplate ); } @@ -54,8 +65,7 @@ export const checkAndCreateProjectPackage = async () => { } if (templateName) { - pkgJson.devDependencies[templateName] = - c.files.project.config?.templates[templateName]?.version || 'latest'; + pkgJson.devDependencies[templateName] = c.files.project.config?.templateConfig?.version || 'latest'; } const pkgJsonStringClean = JSON.stringify(pkgJson, null, 2); fsWriteFileSync(c.paths.project.package, pkgJsonStringClean); diff --git a/packages/core/src/projects/types.ts b/packages/core/src/projects/types.ts index 2cd2fda11a..17c6e218be 100644 --- a/packages/core/src/projects/types.ts +++ b/packages/core/src/projects/types.ts @@ -1 +1,19 @@ +import { NpmDepKey } from '../configs/types'; + export type ParseFontsCallback = (font: string, dir: string) => void; + +export type AsyncCallback = () => Promise; + +export type DependencyMutation = { + name: string; + original?: { + version: string; + }; + updated: { + version: string; + }; + type: NpmDepKey; + msg: string; + source: string; + targetPath?: string; +}; diff --git a/packages/core/src/projects/utils.ts b/packages/core/src/projects/utils.ts new file mode 100644 index 0000000000..d0bd375262 --- /dev/null +++ b/packages/core/src/projects/utils.ts @@ -0,0 +1,10 @@ +import path from 'path'; +import { RnvContext } from '../context/types'; +import { resolvePackage } from '../system/fs'; + +export const resolveRelativePackage = (c: RnvContext, v: string) => { + if (v?.startsWith?.('./')) { + return path.join(c.paths.project.dir, v); + } + return resolvePackage(v); +}; diff --git a/packages/core/src/projects/version.ts b/packages/core/src/projects/version.ts new file mode 100644 index 0000000000..3bfe936d01 --- /dev/null +++ b/packages/core/src/projects/version.ts @@ -0,0 +1,55 @@ +import { chalk, logDefault, getCurrentCommand } from '../logger'; +import { RnvContext } from '../context/types'; +import { inquirerPrompt } from '../api'; +import { upgradeProjectDependencies } from '../configs/configProject'; + +export const versionCheck = async (c: RnvContext) => { + logDefault('versionCheck'); + + if ( + c.runtime.versionCheckCompleted || + c.files.project?.config?.skipAutoUpdate || + c.program.opts().skipDependencyCheck + ) { + return true; + } + c.runtime.rnvVersionRunner = c.files.rnvCore?.package?.version || 'unknown'; + c.runtime.rnvVersionProject = + c.files.project?.package?.devDependencies?.['@rnv/core'] || + c.files.project?.package?.dependencies?.['@rnv/core'] || + 'unknown'; + logDefault( + `versionCheck:rnvRunner:${c.runtime.rnvVersionRunner},rnvProject:${c.runtime.rnvVersionProject}`, + chalk().grey + ); + if (c.runtime.rnvVersionRunner && c.runtime.rnvVersionProject) { + if (c.runtime.rnvVersionRunner !== c.runtime.rnvVersionProject && !c.program.opts().skipRnvCheck) { + const recCmd = chalk().bold(`$ npx ${getCurrentCommand(true)}`); + const actionNoUpdate = 'Continue and skip updating package.json'; + const actionWithUpdate = 'Continue and update package.json'; + const actionUpgrade = `Upgrade project to ${c.runtime.rnvVersionRunner}`; + + const { chosenAction } = await inquirerPrompt({ + message: 'What to do next?', + type: 'list', + name: 'chosenAction', + choices: [actionNoUpdate, actionWithUpdate, actionUpgrade], + warningMessage: `You are running $rnv v${chalk().red( + c.runtime.rnvVersionRunner + )} against project built with rnv v${chalk().red( + c.runtime.rnvVersionProject + )}. This might result in unexpected behaviour! +It is recommended that you run your rnv command with npx prefix: ${recCmd} . or manually update your devDependencies.rnv version in your package.json.`, + }); + + c.runtime.versionCheckCompleted = true; + + c.runtime.skipPackageUpdate = chosenAction === actionNoUpdate; + + if (chosenAction === actionUpgrade) { + upgradeProjectDependencies(c.runtime.rnvVersionRunner); + } + } + } + return true; +}; diff --git a/packages/core/src/runner.ts b/packages/core/src/runner.ts index 04b17bc5f2..079db9fcc1 100644 --- a/packages/core/src/runner.ts +++ b/packages/core/src/runner.ts @@ -1,52 +1,91 @@ import { getContext } from './context/provider'; -import { loadEngines, registerMissingPlatformEngines } from './engines'; +import { installEngines, registerMissingPlatformEngines } from './engines'; import { loadIntegrations } from './integrations'; import { checkAndMigrateProject } from './migrator'; -import { checkAndBootstrapIfRequired } from './projects'; import { configureRuntimeDefaults } from './context/runtime'; -import { findSuitableGlobalTask, findSuitableTask, initializeTask } from './tasks'; +import { findSuitableTask } from './tasks/taskFinder'; import { updateRenativeConfigs } from './plugins'; +import { loadDefaultConfigTemplates } from './configs'; +import { getApi } from './api/provider'; +import { RnvTask } from './tasks/types'; +import { runInteractiveWizard, runInteractiveWizardForSubTasks } from './tasks/wizard'; +import { initializeTask } from './tasks/taskExecutors'; +import { getTaskNameFromCommand, selectPlatformIfRequired } from './tasks/taskHelpers'; +import { logInfo } from './logger'; + +export const exitRnvCore = async (code: number) => { + const ctx = getContext(); + const api = getApi(); + + if (ctx.process) { + api.analytics.teardown().then(() => { + ctx.process.exit(code); + }); + } +}; + +const _installAndRegisterAllEngines = async () => { + const result = await installEngines(); + // If false make sure we reload configs as it means it's freshly installed + if (!result) { + await updateRenativeConfigs(); + } + await registerMissingPlatformEngines(); +}; export const executeRnvCore = async () => { const c = getContext(); + await loadDefaultConfigTemplates(); await configureRuntimeDefaults(); await checkAndMigrateProject(); await updateRenativeConfigs(); - await checkAndBootstrapIfRequired(); + // await checkAndBootstrapIfRequired(); // TODO: rename to something more meaningful or DEPRECATE entirely - if (c.program.npxMode) { + if (c.program.opts().npxMode) { return; } + // for "rnv" we simply load all engines upfront + const { configExists } = c.paths.project; + if (!c.command && configExists) { + await _installAndRegisterAllEngines(); + await loadIntegrations(); + return runInteractiveWizard(); + } + + let initTask: RnvTask | undefined; + // Special Case for engine-core tasks // they don't require other engines to be loaded if isGlobalScope = true // ie rnv link - const initTask = await findSuitableGlobalTask(); - if (initTask?.task && initTask.isGlobalScope) { - return initializeTask(initTask?.task); + initTask = await findSuitableTask(); + if (initTask) { + return initializeTask(initTask); } + // Next we load all integrations and see if there is a task that matches await loadIntegrations(); - const result = await loadEngines(); - // If false make sure we reload configs as it means it's freshly installed - if (!result) { - await updateRenativeConfigs(); - } + initTask = await findSuitableTask(); + if (initTask) { + if (initTask.platforms) { + // If integration task requires platform selection + // we do it here so correct engine is registered properly + await selectPlatformIfRequired(initTask, true); + } - // for root rnv we simply load all engines upfront - const { configExists } = c.paths.project; - if (!c.command && configExists) { - await registerMissingPlatformEngines(); + return initializeTask(initTask); } - // Some tasks might require all engines to be present (ie rnv platform list) - const taskInstance = await findSuitableTask(); - - if (c.command && !taskInstance?.ignoreEngines) { - await registerMissingPlatformEngines(taskInstance); + // Still no task found. time to load all engines to see if anything matches + await _installAndRegisterAllEngines(); + initTask = await findSuitableTask(); + if (initTask) { + return initializeTask(initTask); } - if (taskInstance?.task) await initializeTask(taskInstance?.task); + // Still no task found. time to check sub tasks options via wizard + logInfo(`Did not find exact match for ${getTaskNameFromCommand()}. Running interactive wizard for sub-tasks`); + return runInteractiveWizardForSubTasks(); }; diff --git a/packages/core/src/schema/common/index.ts b/packages/core/src/schema/common/index.ts index 0eb9cf8c22..4d4c0c6ca9 100644 --- a/packages/core/src/schema/common/index.ts +++ b/packages/core/src/schema/common/index.ts @@ -1,178 +1,91 @@ -import { z } from 'zod'; -import { BuildSchemeFragment, BundleId, Ext, HexColor, Runtime } from '../shared'; -import { PlatformBaseFragment } from '../platforms/fragments/base'; +import { AnyZodObject, z } from 'zod'; +import { zodBuildSchemeFragment, zodExt, zodRuntime } from '../shared'; +import { zodPlatformBaseFragment } from '../platforms/fragments/base'; -// DEPRECATED? -export const SplashScreen = z.boolean().describe('Enable or disable splash screen'); - -const IncludedPermissions = z - .array(z.string()) - .describe( - "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" - ); - -//DEPRECATED?? -const ExcludedPermissions = z - .array(z.string()) - .describe( - "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" - ); - -const IncludedPlugins = z - .array(z.string()) - .describe( - "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" - ); - -const ExcludedPlugins = z - .array(z.string()) - .describe( - "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" - ); - -const Title = z - .string() - .describe( - 'Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website' - ); - -const Description = z - .string() - .describe( - 'General description of your app. This prop will be injected to actual projects where description field is applicable' - ); - -const Author = z.string().describe('Author name'); - -const IncludedFonts = z - .array(z.string()) - .describe( - 'Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all' - ); - -const BackgroundColor = HexColor.describe('Defines root view backgroundColor for all platforms in HEX format'); - -const FontSources = z - .array(z.string()) - .describe( - 'Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`' - ); - -const AssetSources = z - .array(z.string()) - .describe( - 'Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`' - ); - -export const License = z.string().describe('Injects license information into app'); - -const Version = z.string().describe('Semver style version of your app'); - -const VersionCode = z.string().describe('Manual verride of generated version code'); - -const VersionFormat = z.string().describe(`Allows you to fine-tune app version defined in package.json or renative.json. - -If you do not define versionFormat, no formatting will apply to version. - -"versionFormat" : "0.0.0" - -IN: 1.2.3-rc.4+build.56 OUT: 1.2.3 - -IN: 1.2.3 OUT: 1.2.3 - - - -"versionFormat" : "0.0.0.0.0" - -IN: 1.2.3-rc.4+build.56 OUT: 1.2.3.4.56 - -IN: 1.2.3 OUT: 1.2.3 - -"versionFormat" : "0.0.0.x.x.x.x" - -IN: 1.2.3-rc.4+build.56 OUT: 1.2.3.rc.4.build.56 - -IN: 1.2.3 OUT: 1.2.3 - -`); - -const VersionCodeFormat = z.string().describe(`Allows you to fine-tune auto generated version codes. - -Version code is autogenerated from app version defined in package.json or renative.json. - -NOTE: If you define versionCode manually this formatting will not apply. - -EXAMPLE 1: - -default value: 00.00.00 - -IN: 1.2.3-rc.4+build.56 OUT: 102030456 - -IN: 1.2.3 OUT: 10203 - -EXAMPLE 2: - -"versionCodeFormat" : "00.00.00.00.00" - -IN: 1.2.3-rc.4+build.56 OUT: 102030456 - -IN: 1.2.3 OUT: 102030000 - -EXAMPLE 3: - -"versionCodeFormat" : "00.00.00.0000" - -IN: 1.0.23-rc.15 OUT: 100230015 - -IN: 1.0.23 OUT: 100230000 - -`); - -//LEVEl 1 - -export const CommonSchemaFragment = { - includedPermissions: z.optional(IncludedPermissions), - excludedPermissions: z.optional(ExcludedPermissions), - id: z.optional(BundleId), - idSuffix: z.string().optional(), - version: z.optional(Version), - versionCode: z.optional(VersionCode), - versionFormat: z.optional(VersionFormat), - versionCodeFormat: z.optional(VersionCodeFormat), - versionCodeOffset: z.number().optional(), - title: z.optional(Title), - description: z.optional(Description), - author: z.optional(Author), - license: z.optional(License), - includedFonts: z.optional(IncludedFonts), - backgroundColor: z.optional(BackgroundColor), - splashScreen: z.optional(SplashScreen), - fontSources: z.optional(FontSources), - assetSources: z.optional(AssetSources), - includedPlugins: z.optional(IncludedPlugins), - excludedPlugins: z.optional(ExcludedPlugins), - runtime: z.optional(Runtime), - custom: z.optional(Ext), -}; - -// const CommonBuildSchemes = z.record(z.string(), BuildSchemeBase.merge(PlatformBaseFragment)); - -// export type _CommonBuildSchemesSchemaType = z.infer; - -export const CommonSchema = z +export const zodCommonSchemaFragment = z .object({ - ...CommonSchemaFragment, - buildSchemes: z.optional( - z.record( - z.string(), - z.object({ - ...CommonSchemaFragment, - ...BuildSchemeFragment, - ...PlatformBaseFragment, - }) - ) - ), + includedPermissions: z + .array(z.string()) + .describe( + "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + ), + excludedPermissions: z + .array(z.string()) + .describe( + "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + ), + id: z.string().describe('Bundle ID of application. ie: com.example.myapp'), + idSuffix: z.string().optional(), + version: z.string().describe('Semver style version of your app'), + versionCode: z.string().describe('Manual verride of generated version code'), + versionFormat: z.string() + .describe(`Allows you to fine-tune app version defined in package.json or renative.json. + If you do not define versionFormat, no formatting will apply to version. + `), + versionCodeFormat: z.string().describe(`Allows you to fine-tune auto generated version codes. + Version code is autogenerated from app version defined in package.json or renative.json. + `), + versionCodeOffset: z.number().optional(), + title: z + .string() + .describe( + 'Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website' + ), + description: z + .string() + .describe( + 'General description of your app. This prop will be injected to actual projects where description field is applicable' + ), + author: z.string().describe('Author name'), + license: z.string().describe('Injects license information into app'), + includedFonts: z + .array(z.string()) + .describe( + 'Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all' + ), + backgroundColor: z + .string() + .min(4) + .max(9) + .regex(/^#/) + .describe('Defines root view backgroundColor for all platforms in HEX format'), + splashScreen: z.boolean().describe('Enable or disable splash screen'), + fontSources: z + .array(z.string()) + .describe( + 'Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`' + ), + assetSources: z + .array(z.string()) + .describe( + 'Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`' + ), + includedPlugins: z + .array(z.string()) + .describe( + "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + ), + excludedPlugins: z + .array(z.string()) + .describe( + "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + ), + runtime: z.optional(zodRuntime), + custom: z.optional(zodExt), }) + .partial(); + +export const zodCommonSchema: AnyZodObject = zodCommonSchemaFragment + .merge( + z + .object({ + buildSchemes: z.optional( + z.record( + z.string(), + zodCommonSchemaFragment.merge(zodBuildSchemeFragment.merge(zodPlatformBaseFragment)) + ) + ), + }) + .partial() + ) .describe('Common config props used as default props for all available buildSchemes'); - -export type _CommonSchemaType = z.infer; diff --git a/packages/core/src/schema/configFiles/app.ts b/packages/core/src/schema/configFiles/app.ts index 7c30c5b909..9f4b66d2bb 100644 --- a/packages/core/src/schema/configFiles/app.ts +++ b/packages/core/src/schema/configFiles/app.ts @@ -1,47 +1,31 @@ import { AnyZodObject, z } from 'zod'; -import { CommonSchema } from '../common'; -import { Ext, ExtendTemplate } from '../shared'; -import { PlatformsSchema } from '../platforms'; -import { PluginsSchema } from '../plugins'; - -export const Extend = z.string().describe('extend another appConfig by id'); - -const Id = z - .string() - .describe('ID of the app in `./appConfigs/[APP_ID]/renative.json`. MUST match APP_ID name of the folder'); - -const Hidden = z - .boolean() - .describe( - 'If set to true in `./appConfigs/[APP_ID]/renative.json` the APP_ID will be hidden from list of appConfigs `-c`' - ); - -//LEVEl 0 (ROOT) - -const RootAppBaseFragment = { - id: z.optional(Id), - custom: z.optional(Ext), - hidden: z.optional(Hidden), - extendsTemplate: z.optional(ExtendTemplate), - extend: z.optional(Extend), - skipBootstrapCopy: z.boolean().optional(), -}; - -const RootAppBaseSchema = z.object(RootAppBaseFragment); -const RootAppCommonSchema = z.object({ common: z.optional(CommonSchema) }); -const RootAppPlatformsSchema = z.object({ platforms: z.optional(PlatformsSchema) }); -const RootAppPluginsSchema = z.object({ plugins: z.optional(PluginsSchema) }); +import { zodExt } from '../shared'; +import { zodRootProjectCommonSchema, zodRootProjectPlatformsSchema, zodRootProjectPluginsSchema } from './project'; + +export const zodRootAppBaseFragment = z + .object({ + id: z + .string() + .describe('ID of the app in `./appConfigs/[APP_ID]/renative.json`. MUST match APP_ID name of the folder'), + custom: z.optional(zodExt), + hidden: z + .boolean() + .describe( + 'If set to true in `./appConfigs/[APP_ID]/renative.json` the APP_ID will be hidden from list of appConfigs `-c`' + ), + extendsTemplate: z + .string() + .describe( + 'You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`' + ), // TODO: rename to "extendsConfig" + extend: z.string().describe('extend another appConfig by id'), // TODO: rename to "extendsAppConfigID" + }) + .partial(); // NOTE: Need to explictly type this to generic zod object to avoid TS error: // The inferred type of this node exceeds the maximum length the compiler will serialize... // This is ok we only use this full schema for runtime validations. actual types -export const RootAppSchema: AnyZodObject = RootAppBaseSchema.merge(RootAppCommonSchema) - .merge(RootAppPlatformsSchema) - .merge(RootAppPluginsSchema); - -export type _RootAppBaseSchemalType = z.infer; - -export type _RootAppSchemaType = z.infer & - z.infer & - z.infer & - z.infer; +export const zodConfigFileApp: AnyZodObject = zodRootAppBaseFragment + .merge(zodRootProjectCommonSchema) + .merge(zodRootProjectPlatformsSchema) + .merge(zodRootProjectPluginsSchema); diff --git a/packages/core/src/schema/configFiles/buildConfig.ts b/packages/core/src/schema/configFiles/buildConfig.ts deleted file mode 100644 index e0e529c1b1..0000000000 --- a/packages/core/src/schema/configFiles/buildConfig.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { _CommonSchemaType } from '../common'; -import { _PlatformsSchemaType } from '../platforms'; -import { _PluginType } from '../plugins'; -import { _RootAppBaseSchemalType } from './app'; -import { _RootLocalSchemaType } from './local'; -import { _RootPluginsSchemaType } from './plugins'; -import { _RootProjectBaseSchemaType } from './project'; -import { _RootTemplatesSchemaType } from './templates'; -import { _RootWorkspaceSchemaType } from './workspace'; - -// NOTE: Why am I bothered with all this nonsense instead of just exporting root schema types? -// because infering full schema (complex zod types & unions) impacts TS server performance -// here I'm giving TS hand by offloading some of the heavy computations to predefined types and removing unions -// When all reantive json get merged into one file this happens conceptually anyway - -type RootPluginsMerged = { - pluginTemplates: Record; -}; - -type Common = { - common: _CommonSchemaType; -}; - -type PluginsMap = { - plugins: Record; -}; - -type PlatformsMap = { - platforms: _PlatformsSchemaType; -}; - -type _ConfigRootMerged = - //Templates - _RootTemplatesSchemaType & - //Global - _RootWorkspaceSchemaType & - //Plugins (multiple roots merged under scope object) - RootPluginsMerged & - //Project + App - Required<_RootProjectBaseSchemaType> & - _RootLocalSchemaType & - _RootAppBaseSchemalType & - Common & - PluginsMap & - PlatformsMap; - -export type ConfigFileBuildConfig = _ConfigRootMerged; diff --git a/packages/core/src/schema/configFiles/engine.ts b/packages/core/src/schema/configFiles/engine.ts index f3aec6c445..da245fe57a 100644 --- a/packages/core/src/schema/configFiles/engine.ts +++ b/packages/core/src/schema/configFiles/engine.ts @@ -1,45 +1,32 @@ import { z } from 'zod'; -import { Ext, PlatformsKeys } from '../shared'; +import { zodExt, zodPlatformsKeys } from '../shared'; -const NpmDep = z.record(z.string(), z.string()); +const zodNpmDep = z.record(z.string(), z.string()); -const Npm = z +const zodEngineNpm = z .object({ - dependencies: z.optional(NpmDep), - devDependencies: z.optional(NpmDep), - peerDependencies: z.optional(NpmDep), - optionalDependencies: z.optional(NpmDep), + dependencies: z.optional(zodNpmDep), + devDependencies: z.optional(zodNpmDep), + peerDependencies: z.optional(zodNpmDep), + optionalDependencies: z.optional(zodNpmDep), }) .describe('Npm dependencies required for this plugin to work'); -const EnginePlatform = z.object({ +const zodEnginePlatform = z.object({ engine: z.optional(z.string()), - npm: z.optional(Npm), + npm: z.optional(zodEngineNpm), }); -//LEVEl 0 (ROOT) - -const Id = z.string().describe('ID of engine'); - -const EngineExtension = z.string().describe('Engine extension ised by rnv during compilation'); - -const Plugins = z.record(z.string(), z.string()).describe('List of required plugins for this engine to work properly'); - -const Overview = z.string().describe('Overview description of engine'); - -const Platforms = z.record(PlatformsKeys, EnginePlatform); - -const Extends = z.string().describe('ID of engine to extend. Not being used yet'); - -export const RootEngineSchema = z.object({ - custom: z.optional(Ext), - id: Id, - engineExtension: EngineExtension, - extends: z.optional(Extends), - overview: Overview, - plugins: z.optional(Plugins), - npm: z.optional(Npm), - platforms: z.optional(Platforms), -}); - -export type _ConfigRootEngineType = z.infer; +export const zodConfigFileEngine = z + .object({ + custom: z.optional(zodExt), + id: z.string().describe('ID of engine'), + packageName: z.string(), + engineExtension: z.string().describe('Engine extension ised by rnv during compilation'), + // extends: z.string().describe('ID of engine to extend. Not being used yet'), + overview: z.string().describe('Overview description of engine'), + plugins: z.record(z.string(), z.string()).describe('List of required plugins for this engine to work properly'), + npm: zodEngineNpm, + platforms: z.record(zodPlatformsKeys, zodEnginePlatform), + }) + .partial(); diff --git a/packages/core/src/schema/configFiles/integration.ts b/packages/core/src/schema/configFiles/integration.ts index 82fdedc8f7..379a0a8a90 100644 --- a/packages/core/src/schema/configFiles/integration.ts +++ b/packages/core/src/schema/configFiles/integration.ts @@ -1,5 +1,8 @@ import { z } from 'zod'; -export const RootIntegrationSchema = z.object({}); - -export type _RootIntegrationSchemaType = z.infer; +export const zodConfigFileIntergation = z + .object({ + packageName: z.string(), + }) + .partial(); +// diff --git a/packages/core/src/schema/configFiles/local.ts b/packages/core/src/schema/configFiles/local.ts index 22dfc4c4ca..e720d128d3 100644 --- a/packages/core/src/schema/configFiles/local.ts +++ b/packages/core/src/schema/configFiles/local.ts @@ -1,20 +1,16 @@ import { z } from 'zod'; -import { DefaultTargets } from '../shared'; +import { zodDefaultTargets } from '../shared'; -const WorkspaceAppConfigsDir = z.string().describe('Defines app configs dir outside of current project'); - -const Meta = z.object({ - currentAppConfigId: z.optional(z.string()), - requiresJetify: z.optional(z.boolean()), -}); - -//LEVEl 0 (ROOT) - -export const RootLocalSchema = z.object({ - workspaceAppConfigsDir: z.optional(WorkspaceAppConfigsDir), - defaultTargets: z.optional(DefaultTargets), - _meta: z.optional(Meta), - // extend: z.optional(z.string()), -}); - -export type _RootLocalSchemaType = z.infer; +export const zodConfigFileLocal = z + .object({ + workspaceAppConfigsDir: z.string().describe('Defines app configs dir outside of current project'), + defaultTargets: zodDefaultTargets, + _meta: z + .object({ + currentAppConfigId: z.optional(z.string()), + requiresJetify: z.optional(z.boolean()), + }) + .partial(), + // extend: z.optional(z.string()), + }) + .partial(); diff --git a/packages/core/src/schema/configFiles/overrides.ts b/packages/core/src/schema/configFiles/overrides.ts index 387f08c8fb..8050243d54 100644 --- a/packages/core/src/schema/configFiles/overrides.ts +++ b/packages/core/src/schema/configFiles/overrides.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -export const RootOverridesSchema = z.object({ - overrides: z.record(z.string(), z.record(z.string(), z.string())), -}); - -export type _RootOverridesSchemaType = z.infer; +export const zodConfigFileOverrides = z + .object({ + overrides: z.record(z.string(), z.record(z.string(), z.string())), + }) + .partial(); diff --git a/packages/core/src/schema/configFiles/plugin.ts b/packages/core/src/schema/configFiles/plugin.ts index 7cfcdc96c6..5a1cb2df8d 100644 --- a/packages/core/src/schema/configFiles/plugin.ts +++ b/packages/core/src/schema/configFiles/plugin.ts @@ -1,9 +1,9 @@ -import { z } from 'zod'; -import { Ext } from '../shared'; -import { PluginSchema } from '../plugins'; +import { AnyZodObject, z } from 'zod'; +import { zodExt } from '../shared'; +import { zodPluginSchema } from '../plugins'; -export const RootPluginSchema = PluginSchema.extend({ - custom: z.optional(Ext), +export const zodPluginFragment = z.object({ + custom: z.optional(zodExt), }); -export type _RootPluginSchemaType = z.infer; +export const zodConfigFilePlugin: AnyZodObject = zodPluginSchema.merge(zodPluginFragment).partial(); diff --git a/packages/core/src/schema/configFiles/plugins.ts b/packages/core/src/schema/configFiles/plugins.ts deleted file mode 100644 index feb7710961..0000000000 --- a/packages/core/src/schema/configFiles/plugins.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { z } from 'zod'; -import { Ext } from '../shared'; -import { PluginSchema } from '../plugins'; - -export const PluginTemplates = z - .record(z.string(), PluginSchema) - .describe('Define all plugins available to be merged with project plugins'); - -export const DisableRnvDefaultOverrides = z - .boolean() - .describe( - 'Disables default rnv scope plugin overrides and merges. Useful if you want to test entirely clean plugin template list' - ); - -//LEVEl 0 (ROOT) - -export const RootPluginsSchema = z.object({ - custom: z.optional(Ext), - pluginTemplates: PluginTemplates, - disableRnvDefaultOverrides: z.optional(DisableRnvDefaultOverrides), -}); - -export type _RootPluginsSchemaType = z.infer; diff --git a/packages/core/src/schema/configFiles/private.ts b/packages/core/src/schema/configFiles/private.ts index e4ea91364e..a5eaa0fdbf 100644 --- a/packages/core/src/schema/configFiles/private.ts +++ b/packages/core/src/schema/configFiles/private.ts @@ -3,48 +3,45 @@ import { z } from 'zod'; const SENSITIVE = '> WARNING. this prop is sensitive and should not be stored in standard `renative.json` configs. use `renative.private.json` files instead!\n\n'; -const PlatformAndroid = z +export const zodPrivatePlatformAndroid = z .object({ - storePassword: z.string().describe(`${SENSITIVE}storePassword for keystore file`).optional(), - keyPassword: z.string().describe(`${SENSITIVE}keyPassword for keystore file`).optional(), - storeFile: z.string().describe('Name of the store file in android project').optional(), //TODO: Duplicate from config - keyAlias: z.string().describe('Key alias of the store file in android project').optional(), + storePassword: z.string().describe(`${SENSITIVE}storePassword for keystore file`), + keyPassword: z.string().describe(`${SENSITIVE}keyPassword for keystore file`), + storeFile: z.string().describe('Name of the store file in android project'), //TODO: Duplicate from config + keyAlias: z.string().describe('Key alias of the store file in android project'), }) - .optional(); + .partial(); -const PlatformGeneric = z.object({}).optional(); +const zodPrivatePlatformGeneric = z.any({}); -export const RootPrivateSchema = z.object({ - private: z - .record(z.any()) - .describe( - 'Special object which contains private info. this object should be used only in `renative.private.json` files and never commited to your repository. Private files usually reside in your workspace and are subject to crypto encryption if enabled. RNV will warn you if it finds private key in your regular `renative.json` file' - ) - .optional(), - platforms: z - .object({ - android: PlatformAndroid, - androidtv: PlatformAndroid, - androidwear: PlatformAndroid, - firetv: PlatformAndroid, - ios: PlatformGeneric, - tvos: PlatformGeneric, - tizen: PlatformGeneric, - tizenmobile: PlatformGeneric, - tizenwatch: PlatformGeneric, - webos: PlatformGeneric, - web: PlatformGeneric, - webtv: PlatformGeneric, - chromecast: PlatformGeneric, - kaios: PlatformGeneric, - macos: PlatformGeneric, - linux: PlatformGeneric, - windows: PlatformGeneric, - xbox: PlatformGeneric, - }) - .optional(), -}); - -export type _RootPrivateSchemaType = z.infer; - -export type _MergedPlatformPrivateObjectType = z.infer; +export const zodConfigFilePrivate = z + .object({ + private: z + .record(z.any()) + .describe( + 'Special object which contains private info. this object should be used only in `renative.private.json` files and never commited to your repository. Private files usually reside in your workspace and are subject to crypto encryption if enabled. RNV will warn you if it finds private key in your regular `renative.json` file' + ), + platforms: z + .object({ + android: zodPrivatePlatformAndroid, + androidtv: zodPrivatePlatformAndroid, + androidwear: zodPrivatePlatformAndroid, + firetv: zodPrivatePlatformAndroid, + ios: zodPrivatePlatformGeneric, + tvos: zodPrivatePlatformGeneric, + tizen: zodPrivatePlatformGeneric, + tizenmobile: zodPrivatePlatformGeneric, + tizenwatch: zodPrivatePlatformGeneric, + webos: zodPrivatePlatformGeneric, + web: zodPrivatePlatformGeneric, + webtv: zodPrivatePlatformGeneric, + chromecast: zodPrivatePlatformGeneric, + kaios: zodPrivatePlatformGeneric, + macos: zodPrivatePlatformGeneric, + linux: zodPrivatePlatformGeneric, + windows: zodPrivatePlatformGeneric, + xbox: zodPrivatePlatformGeneric, + }) + .partial(), + }) + .partial(); diff --git a/packages/core/src/schema/configFiles/project.ts b/packages/core/src/schema/configFiles/project.ts index f2c93023a2..0e0bc9c6e2 100644 --- a/packages/core/src/schema/configFiles/project.ts +++ b/packages/core/src/schema/configFiles/project.ts @@ -1,269 +1,170 @@ import { AnyZodObject, z } from 'zod'; -import { CommonSchema } from '../common'; -import { Ext, ExtendTemplate, PlatformsKeys, Runtime, TemplateConfig } from '../shared'; -import { PlatformsSchema } from '../platforms'; -import { PluginsSchema } from '../plugins'; +import { zodCommonSchema } from '../common'; +import { zodExt, zodPlatformsKeys, zodRuntime, zodSupportedPlatforms, zodTemplateConfigFragment } from '../shared'; +import { zodPlatformsSchema } from '../platforms'; +import { zodPluginsSchema } from '../plugins'; -const DefaultCommandSchemes = z - .record(z.enum(['run', 'export', 'build']), z.string()) - .describe( - 'List of default schemes for each rnv command. This is useful if you want to avoid specifying `-s ...` every time your run rnv command. bu default rnv uses `-s debug`. NOTE: you can only use schemes you defined in `buildSchemes`' - ); - -const Targets = z.record(PlatformsKeys, z.string()).describe('Override of default targets specific to this project'); - -const Ports = z - .record(PlatformsKeys, z.number()) //TODO maxValue(65535) - .describe( - 'Allows you to assign custom port per each supported platform specific to this project. this is useful if you foten switch between multiple projects and do not want to experience constant port conflicts' - ); - -const SupportedPlatforms = z.array(PlatformsKeys).describe('Array list of all supported platforms in current project'); - -const PortOffset = z.number().describe('Offset each port default value by increment'); - -const MonoRoot = z.string().describe('Define custom path to monorepo root where starting point is project directory'); - -const Env = z.record(z.string(), z.any()).describe('Object containing injected env variables'); - -export const DefaultsSchema = z +export const zodRootProjectBaseFragment = z .object({ - ports: z.optional(Ports), - supportedPlatforms: z.optional(SupportedPlatforms), - portOffset: z.optional(PortOffset), - defaultCommandSchemes: z.optional(DefaultCommandSchemes), - targets: z.optional(Targets), - }) - .describe('Default system config for this project'); - -const Pipes = z - .array(z.string()) - .describe( - 'To avoid rnv building `buildHooks/src` every time you can specify which specific pipes should trigger recompile of buildHooks' - ); - -const WorkspaceID = z - .string() //TODO: no spaces - .describe( - 'Workspace ID your project belongs to. This will mach same folder name in the root of your user directory. ie `~/` on macOS' - ); - -const Tasks = z - .object({ - install: z.optional( - z.object({ - script: z.string(), - platform: z.optional( - z.record( - PlatformsKeys, + workspaceID: z + .string() //TODO: no spaces + .describe( + 'Workspace ID your project belongs to. This will mach same folder name in the root of your user directory. ie `~/` on macOS' + ), + projectVersion: z.string().describe('Version of project'), // TODO: if undefined it should infer from package.json + projectName: z + .string() + .describe( + 'Name of the project which will be used in workspace as folder name. this will also be used as part of the KEY in crypto env var generator' + ), + isTemplate: z + .boolean() + .describe('Marks project as template. This disables certain user checks like version mismatch etc'), + defaults: z + .object({ + ports: z + .record(zodPlatformsKeys, z.number()) //TODO maxValue(65535) + .describe( + 'Allows you to assign custom port per each supported platform specific to this project. this is useful if you foten switch between multiple projects and do not want to experience constant port conflicts' + ), + supportedPlatforms: zodSupportedPlatforms, + portOffset: z.number().describe('Offset each port default value by increment'), + defaultCommandSchemes: z + .record(z.enum(['run', 'export', 'build']), z.string()) + .describe( + 'List of default schemes for each rnv command. This is useful if you want to avoid specifying `-s ...` every time your run rnv command. bu default rnv uses `-s debug`. NOTE: you can only use schemes you defined in `buildSchemes`' + ), + targets: z + .record(zodPlatformsKeys, z.string()) + .describe('Override of default targets specific to this project'), + }) + .partial() + .describe('Default system config for this project'), + pipes: z + .array(z.string()) + .describe( + 'To avoid rnv building `buildHooks/src` every time you can specify which specific pipes should trigger recompile of buildHooks' + ), + crypto: z + .object({ + path: z + .string() + .describe( + 'Relative path to encrypted file in your renative project. Example: "./secrets/mySecrets.enc"' + ), + isOptional: z.boolean().describe('Mark if crypto object should not checked every run').optional(), + }) + .describe( + 'This prop enables automatic encrypt and decrypt of sensitive information in your project. \nRNV will generate new env variable with can be used to encrypt and decrypt. this env var is generated by combining (and sanitizing) 2 properties from your renative.json: \nworkspaceID + projectName.\nThese 2 properties are also used to generate path on your local machine where encrypted files will be decrypted into.' + ), + paths: z + .object({ + appConfigsDir: z.string().describe('Custom path to appConfigs. defaults to `./appConfigs`'), + platformTemplatesDirs: z + .record(zodPlatformsKeys, z.string()) + .describe( + 'Custom location of ejected platform templates. this is populated after you run `rnv platform eject`' + ), + appConfigsDirs: z.array(z.string()).describe('Array of custom location app configs directories`'), + platformAssetsDir: z + .string() + .describe('Custom path to platformAssets folder. defaults to `./platformAssets`'), + platformBuildsDir: z + .string() + .describe('Custom path to platformBuilds folder. defaults to `./platformBuilds`'), + pluginTemplates: z.record( + z.string(), + z.object({ + npm: z.string(), + path: z.string(), + }) + ).describe(` + Allows you to define custom plugin template scopes. default scope for all plugins is \`rnv\`.`), + }) + .partial() + .describe('Define custom paths for RNV to look into'), + permissions: z + .object({ + android: z + .record( + z.string(), + z.object({ + key: z.string(), //TODO: type this + security: z.string(), //TODO: type this + }) + ) + .describe('Android SDK specific permissions'), + ios: z + .record( + z.string(), //TODO: type this z.object({ - ignore: z.optional(z.boolean()), - ignoreTasks: z.optional(z.array(z.string())), + desc: z.string(), }) ) - ), + .describe('iOS SDK specific permissions'), }) - ), - }) - .describe( - 'Allows to override specific task within renative toolchain. (currently only `install` supported). this is useful if you want to change specific behaviour of built-in task. ie install task triggers yarn/npm install by default. but that might not be desirable installation trigger' - ); - -const Integrations = z - .record(z.string(), z.object({})) - .describe('Object containing integration configurations where key represents package name'); - -// const Engine = z.union([ -// z.literal('source:rnv'), -// z.object({ -// version: z.optional(z.string()), -// }), -// ]); - -const Engine = z.literal('source:rnv'); - -const IsMonoRepo = z.boolean().describe('Mark if your project is part of monorepo'); - -const Template = z.object({ - version: z.string(), -}); - -const Templates = z - .record(z.string(), Template) - .describe( - 'Stores installed templates info in your project.\n\nNOTE: This prop will be updated by rnv if you run `rnv template install`' - ); - -const CurrentTemplate = z - .string() - .describe( - 'Currently active template used in this project. this allows you to re-bootstrap whole project by running `rnv template apply`' - ); - -const Crypto = z - .object({ - path: z + .describe( + 'Permission definititions which can be used by app configs via `includedPermissions` and `excludedPermissions` to customize permissions for each app' + ), + engines: z.record(z.string(), z.literal('source:rnv')).describe('List of engines available in this project'), // TODO: rename to mods (mods with type engine in the future) ? + enableHookRebuild: z + .boolean() + .describe( + 'If set to true in `./renative.json` build hooks will be compiled at each rnv command run. If set to `false` (default) rebuild will be triggered only if `dist` folder is missing, `-r` has been passed or you run `rnv hooks run` directly making your rnv commands faster' + ), + extendsTemplate: z .string() - .describe('Relative path to encrypted file in your renative project. Example: "./secrets/mySecrets.enc"'), - isOptional: z.boolean().optional().describe('Mark if crypto object should not checked every run'), - }) - .describe( - 'This prop enables automatic encrypt and decrypt of sensitive information in your project. \nRNV will generate new env variable with can be used to encrypt and decrypt. this env var is generated by combining (and sanitizing) 2 properties from your renative.json: \nworkspaceID + projectName.\nThese 2 properties are also used to generate path on your local machine where encrypted files will be decrypted into.' - ); - -const Permissions = z - .object({ - android: z.optional( - z - .record( - z.string(), - z.object({ - key: z.string(), //TODO: type this - security: z.string(), //TODO: type this - }) - ) - .describe('Android SDK specific permissions') - ), - ios: z.optional( - z - .record( - z.string(), //TODO: type this - z.object({ - desc: z.string(), - }) - ) - .describe('iOS SDK specific permissions') - ), - }) - .describe( - 'Permission definititions which can be used by app configs via `includedPermissions` and `excludedPermissions` to customize permissions for each app' - ); - -export const EnginesSchema = z.record(z.string(), Engine).describe('List of engines available in this project'); - -const EnableHookRebuild = z - .boolean() - .describe( - 'If set to true in `./renative.json` build hooks will be compiled at each rnv command run. If set to `false` (default) rebuild will be triggered only if `dist` folder is missing, `-r` has been passed or you run `rnv hooks run` directly making your rnv commands faster' - ); - -const ProjectName = z - .string() - .describe( - 'Name of the project which will be used in workspace as folder name. this will also be used as part of the KEY in crypto env var generator' - ); - -const Paths = z - .object({ - appConfigsDir: z.optional(z.string().describe('Custom path to appConfigs. defaults to `./appConfigs`')), - platformTemplatesDirs: z.optional( - z - .record(PlatformsKeys, z.string()) - .describe( - 'Custom location of ejected platform templates. this is populated after you run `rnv platform eject`' - ) - ), - appConfigsDirs: z.optional(z.array(z.string()).describe('Array of custom location app configs directories`')), - platformAssetsDir: z.optional( - z.string().describe('Custom path to platformAssets folder. defaults to `./platformAssets`') - ), - platformBuildsDir: z.optional( - z.string().describe('Custom path to platformBuilds folder. defaults to `./platformBuilds`') - ), - pluginTemplates: z.optional( - z.record( - z.string(), - z.object({ - npm: z.optional(z.string()), - path: z.string(), - }) - ).describe(` - Allows you to define custom plugin template scopes. default scope for all plugins is \`rnv\`. - this custom scope can then be used by plugin via \`"source:myCustomScope"\` value - - those will allow you to use direct pointer to preconfigured plugin: - - \`\`\` - "plugin-name": "source:myCustomScope" - \`\`\` - - NOTE: by default every plugin you define with scope will also merge any - files defined in overrides automatically to your project. - To skip file overrides coming from source plugin you need to detach it from the scope: - - \`\`\` - { - "plugins": { - "plugin-name": { - "source": "" - } - } - } - \`\`\` - `) - ), + .describe( + 'You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`' + ), // TODO: rename to "extendsConfig" + tasks: z + .object({ + install: z.object({ + script: z.string(), + platform: z.record( + zodPlatformsKeys, + z.object({ + ignore: z.boolean(), + ignoreTasks: z.array(z.string()), + }) + ), + }), + }) + .describe( + 'Allows to override specific task within renative toolchain. (currently only `install` supported). this is useful if you want to change specific behaviour of built-in task. ie install task triggers yarn/npm install by default. but that might not be desirable installation trigger' + ), + integrations: z + .record(z.string(), z.object({})) + .describe('Object containing integration configurations where key represents package name'), // TODO: rename to mods + env: z.record(z.string(), z.any()).describe('Object containing injected env variables'), + runtime: zodRuntime, + // DEPRECATED -------------- + isMonorepo: z.boolean().describe('Mark if your project is part of monorepo'), // TODO: remove and use auto detection + monoRoot: z.string().describe('Define custom path to monorepo root where starting point is project directory'), // TODO: remove and use auto detection + custom: zodExt, // TODO: find better way to handle + skipAutoUpdate: z + .boolean() + + .describe( + "Enables the equivalent to passing --skipDependencyCheck parameter on every rnv run so you don't have to use it" + ), + // REMOVED + // useTemplate: z.optional(UseTemplate), + // isNew: z + // templates: Templates, + // currentTemplate: CurrentTemplate, }) - .describe('Define custom paths for RNV to look into'); - -const UseTemplate = z.object({ - name: z.string(), - version: z.string(), - excludedPaths: z.optional(z.array(z.string())), -}); - -//LEVEl 0 (ROOT) - -const RootProjectBaseFragment = { - workspaceID: WorkspaceID, - projectVersion: z.string(), - projectName: ProjectName, - isMonorepo: z.optional(IsMonoRepo), - useTemplate: z.optional(UseTemplate), - isTemplate: z.boolean().optional(), - defaults: z.optional(DefaultsSchema), - pipes: z.optional(Pipes), - templates: Templates, - currentTemplate: CurrentTemplate, - crypto: z.optional(Crypto), - paths: z.optional(Paths), - permissions: z.optional(Permissions), - engines: z.optional(EnginesSchema), - custom: z.optional(Ext), - enableHookRebuild: z.optional(EnableHookRebuild), - monoRoot: z.optional(MonoRoot), - extendsTemplate: z.optional(ExtendTemplate), - tasks: z.optional(Tasks), - integrations: z.optional(Integrations), - env: z.optional(Env), - runtime: z.optional(Runtime), - templateConfig: TemplateConfig.optional(), - skipAutoUpdate: z - .boolean() - .optional() - .describe( - "Enables the equivalent to passing --skipDependencyCheck parameter on every rnv run so you don't have to use it" - ), - isNew: z - .boolean() - .optional() - .describe('Marker indicating that this project has just been bootstrapped. this prop is managed by rnv'), -}; - -const RootProjectBaseSchema = z.object(RootProjectBaseFragment); -const RootProjectCommonSchema = z.object({ common: z.optional(CommonSchema) }); -const RootProjectPlatformsSchema = z.object({ platforms: z.optional(PlatformsSchema) }); -const RootProjectPluginsSchema = z.object({ plugins: z.optional(PluginsSchema) }); + .partial(); // NOTE: Need to explictly type this to generic zod object to avoid TS error: // The inferred type of this node exceeds the maximum length the compiler will serialize... // This is ok we only use this full schema for runtime validations. actual types -export const RootProjectSchema: AnyZodObject = RootProjectBaseSchema.merge(RootProjectCommonSchema) - .merge(RootProjectPlatformsSchema) - .merge(RootProjectPluginsSchema); - -export type _RootProjectBaseSchemaType = z.infer; - -export type _RootProjectSchemaType = z.infer & - z.infer & - z.infer & - z.infer; +export const zodRootProjectCommonSchema: AnyZodObject = z.object({ common: z.optional(zodCommonSchema) }); +export const zodRootProjectPlatformsSchema: AnyZodObject = z.object({ platforms: z.optional(zodPlatformsSchema) }); +export const zodRootProjectPluginsSchema: AnyZodObject = z.object({ plugins: z.optional(zodPluginsSchema) }); +export const zodConfigFileProject: AnyZodObject = zodRootProjectBaseFragment + .merge(zodRootProjectCommonSchema) + .merge(zodRootProjectPlatformsSchema) + .merge(zodRootProjectPluginsSchema) + .extend({ templateConfig: zodTemplateConfigFragment }) + .partial(); diff --git a/packages/core/src/schema/configFiles/root.ts b/packages/core/src/schema/configFiles/root.ts new file mode 100644 index 0000000000..8eaa5fb0df --- /dev/null +++ b/packages/core/src/schema/configFiles/root.ts @@ -0,0 +1,28 @@ +import { AnyZodObject, z } from 'zod'; +import { zodRootAppBaseFragment } from './app'; +import { zodConfigFileProject } from './project'; +import { zodConfigFileLocal } from './local'; +import { zodConfigFileTemplate } from './template'; +import { zodConfigFileWorkspace } from './workspace'; +import { zodConfigFileWorkspaces } from './workspaces'; +import { zodConfigFileTemplates } from './templates'; +import { zodConfigFileOverrides } from './overrides'; +import { zodConfigFileIntergation } from './integration'; +import { zodConfigFileEngine } from './engine'; +import { zodConfigFilePlugin } from './plugin'; +import { zodConfigFilePrivate } from './private'; + +export const zodConfigFileRoot: AnyZodObject = z.object({ + app: zodRootAppBaseFragment, + project: zodConfigFileProject, + local: zodConfigFileLocal, + overrides: zodConfigFileOverrides, + integration: zodConfigFileIntergation, + engine: zodConfigFileEngine, + plugin: zodConfigFilePlugin, + private: zodConfigFilePrivate, + template: zodConfigFileTemplate, + configTemplates: zodConfigFileTemplates, + workspace: zodConfigFileWorkspace, + workspaces: zodConfigFileWorkspaces, +}); diff --git a/packages/core/src/schema/configFiles/runtime.ts b/packages/core/src/schema/configFiles/runtime.ts index a25f70e0f6..81616914a5 100644 --- a/packages/core/src/schema/configFiles/runtime.ts +++ b/packages/core/src/schema/configFiles/runtime.ts @@ -1,7 +1,5 @@ import { z } from 'zod'; -export const RootRuntimeSchema = z.object({ +export const zodConfigFileRuntime = z.object({ // extend: z.optional(z.string()), }); - -export type _RootRuntimeSchemaType = z.infer; diff --git a/packages/core/src/schema/configFiles/template.ts b/packages/core/src/schema/configFiles/template.ts index 7efd9fb6c2..b54d454871 100644 --- a/packages/core/src/schema/configFiles/template.ts +++ b/packages/core/src/schema/configFiles/template.ts @@ -1,8 +1,7 @@ -import { z } from 'zod'; -import { DefaultsSchema, EnginesSchema } from './project'; -import { NpmDep, TemplateConfig } from '../shared'; +import { AnyZodObject, z } from 'zod'; +import { zodNpmDep, zodSupportedPlatforms, zodTemplateConfigFragment } from '../shared'; -const BootstrapQuestionsSchema = z +const zodBootstrapQuestionsSchema = z .array( z.object({ options: z @@ -34,11 +33,11 @@ const BootstrapQuestionsSchema = z ) .describe('Defines list of custom bootstrap questions'); -const BootstrapConfig = z +export const zodConfigTemplateBootstrapConfig = z .object({ - bootstrapQuestions: BootstrapQuestionsSchema, + bootstrapQuestions: zodBootstrapQuestionsSchema, rnvNewPatchDependencies: z - .optional(NpmDep) + .optional(zodNpmDep) .describe( 'This ensures that the correct version of the npm packages will be used to run the project for the first time after creation' ), @@ -46,20 +45,23 @@ const BootstrapConfig = z engines: z.array( z.object({ name: z.string(), - supportedPlatforms: z.array(z.string()), + supportedPlatforms: zodSupportedPlatforms, nullifyIfFalse: z.boolean().optional(), }) ), }), + defaultSelectedPlatforms: zodSupportedPlatforms, }) .partial(); -export const RootTemplateSchema = z.object({ - defaults: z.optional(DefaultsSchema), - engines: z.optional(EnginesSchema), - templateConfig: TemplateConfig.optional(), - bootstrapConfig: BootstrapConfig.optional(), -}); +export const zodConfigFileTemplate: AnyZodObject = z + .object({ + // defaults: z.optional(DefaultsSchema), + // engines: z.optional(EnginesSchema), + templateConfig: zodTemplateConfigFragment, + bootstrapConfig: zodConfigTemplateBootstrapConfig, + }) + .partial(); // { // title: 'Which service to use?', @@ -83,5 +85,3 @@ export const RootTemplateSchema = z.object({ // }, // ], // }, - -export type _RootTemplateSchemaType = z.infer; diff --git a/packages/core/src/schema/configFiles/templates.ts b/packages/core/src/schema/configFiles/templates.ts index 9c72025df0..bed543c2af 100644 --- a/packages/core/src/schema/configFiles/templates.ts +++ b/packages/core/src/schema/configFiles/templates.ts @@ -1,33 +1,38 @@ import { z } from 'zod'; -import { PlatformsKeys } from '../shared'; +import { zodPlatformsKeys, zodProjectTemplates } from '../shared'; +import { zodPluginSchema } from '../plugins'; -export const RootTemplatesSchema = z.object({ - projectTemplates: z.record( - z.string(), - z.object({ - description: z.string(), - }) - ), - engineTemplates: z.record( - z.string(), - z.object({ - version: z.string(), - id: z.string(), - key: z.string().optional(), - }) - ), - integrationTemplates: z.record( - z.string(), - z.object({ - version: z.string(), - }) - ), - platformTemplates: z.record( - PlatformsKeys, - z.object({ - engine: z.string(), - }) - ), -}); - -export type _RootTemplatesSchemaType = z.infer; +export const zodConfigFileTemplates = z + .object({ + projectTemplates: zodProjectTemplates, + engineIdMap: z.record(z.string(), z.string()), + engineTemplates: z.record( + z.string(), + z.object({ + version: z.string(), + id: z.string(), + key: z.string(), + }) + ), + integrationTemplates: z.record( + z.string(), + z.object({ + version: z.string(), + }) + ), + platformTemplates: z.record( + zodPlatformsKeys, + z.object({ + engine: z.string(), + }) + ), + pluginTemplates: z + .record(z.string(), zodPluginSchema) + .describe('Define all plugins available to be merged with project plugins'), + disableRnvDefaultOverrides: z + .boolean() + .describe( + 'Disables default rnv scope plugin overrides and merges. Useful if you want to test entirely clean plugin template list' + ), + }) + .partial(); diff --git a/packages/core/src/schema/configFiles/types.ts b/packages/core/src/schema/configFiles/types.ts deleted file mode 100644 index 480869c4c2..0000000000 --- a/packages/core/src/schema/configFiles/types.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { _RootAppSchemaType } from './app'; -import { _ConfigRootEngineType } from './engine'; -import { _RootWorkspaceSchemaType } from './workspace'; -import { _RootIntegrationSchemaType } from './integration'; -import { _RootLocalSchemaType } from './local'; -import { _RootPluginSchemaType } from './plugin'; -import { _RootPluginsSchemaType } from './plugins'; -import { _RootPrivateSchemaType } from './private'; -import { _RootProjectSchemaType } from './project'; -import { _RootTemplateSchemaType } from './template'; -import { _RootTemplatesSchemaType } from './templates'; -import { _RootWorkspacesSchemaType } from './workspaces'; -import { _RootRuntimeSchemaType } from './runtime'; -import { _RootOverridesSchemaType } from './overrides'; - -// renative.json -export type ConfigFileProject = _RootProjectSchemaType; - -// appConfigs/**/renative.json -export type ConfigFileApp = _RootAppSchemaType; - -// renative.engine.json -export type ConfigFileEngine = _ConfigRootEngineType; - -// renative.plugin.json -export type ConfigFilePlugin = _RootPluginSchemaType; - -// renative.plugins.json -export type ConfigFilePlugins = _RootPluginsSchemaType; - -// renative.local.json -export type ConfigFileLocal = _RootLocalSchemaType; - -// renative.private.json -export type ConfigFilePrivate = _RootPrivateSchemaType; - -// renative.template.json -export type ConfigFileTemplate = _RootTemplateSchemaType; - -// renative.templates.json -export type ConfigFileTemplates = _RootTemplatesSchemaType; - -// renative.workspace.json -export type ConfigFileWorkspace = _RootWorkspaceSchemaType; - -// renative.workspaces.json -export type ConfigFileWorkspaces = _RootWorkspacesSchemaType; - -// renative.integration.json -export type ConfigFileIntegration = _RootIntegrationSchemaType; - -// renative.runtime.json -export type ConfigFileRuntime = _RootRuntimeSchemaType; - -//overrides.json -export type ConfigFileOverrides = _RootOverridesSchemaType; diff --git a/packages/core/src/schema/configFiles/workspace.ts b/packages/core/src/schema/configFiles/workspace.ts index ee2aceb350..a420f6c274 100644 --- a/packages/core/src/schema/configFiles/workspace.ts +++ b/packages/core/src/schema/configFiles/workspace.ts @@ -1,35 +1,33 @@ import { z } from 'zod'; -import { DefaultTargets } from '../shared'; +import { zodDefaultTargets, zodProjectTemplates } from '../shared'; -const SDKsSchema = z - .object({ - ANDROID_SDK: z.string().optional(), - ANDROID_NDK: z.string().optional(), - TIZEN_SDK: z.string().optional(), - WEBOS_SDK: z.string().optional(), - KAIOS_SDK: z.string().optional(), - }) - .describe('Define your sdk configurations'); // ANDROID_SDK: '~/Library/Android/sdk', // ANDROID_NDK: '~/Library/Android/sdk/ndk-bundle', // TIZEN_SDK: '~/tizen-studio', // WEBOS_SDK: '/opt/webOS_TV_SDK', // KAIOS_SDK: '~/Applications/KaiosSimulators', -//LEVEl 0 (ROOT) - -export const RootWorkspaceSchema = z.object({ - defaultTargets: z.optional(DefaultTargets), - sdks: z.optional(SDKsSchema), - projectTemplates: z.record(z.string(), z.object({})).optional(), - disableTelemetry: z - .boolean() - .optional() - .describe('Opt-out from renative telemetry program. More info at https://renative.org/telemetry'), - appConfigsPath: z - .string() - .optional() - .describe('Enables you to define custom global appConfigs location that every project will automatically use'), -}); - -export type _RootWorkspaceSchemaType = z.infer; +export const zodConfigFileWorkspace = z + .object({ + defaultTargets: zodDefaultTargets, + sdks: z + .object({ + ANDROID_SDK: z.string(), + ANDROID_NDK: z.string(), + TIZEN_SDK: z.string(), + WEBOS_SDK: z.string(), + KAIOS_SDK: z.string(), + }) + .partial() + .describe('Define your sdk configurations'), + projectTemplates: zodProjectTemplates, + disableTelemetry: z + .boolean() + .describe('Opt-out from renative telemetry program. More info at https://renative.org/telemetry'), + appConfigsPath: z + .string() + .describe( + 'Enables you to define custom global appConfigs location that every project will automatically use' + ), + }) + .partial(); diff --git a/packages/core/src/schema/configFiles/workspaces.ts b/packages/core/src/schema/configFiles/workspaces.ts index fbf9a172bf..a1046b63c3 100644 --- a/packages/core/src/schema/configFiles/workspaces.ts +++ b/packages/core/src/schema/configFiles/workspaces.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -export const RootWorkspacesSchema = z.object({ +export const zodConfigFileWorkspaces = z.object({ workspaces: z.record( z.string(), z.object({ @@ -14,5 +14,3 @@ export const RootWorkspacesSchema = z.object({ }) ), }); - -export type _RootWorkspacesSchemaType = z.infer; diff --git a/packages/core/src/schema/index.ts b/packages/core/src/schema/index.ts index dbba19390d..10bbffbbb4 100644 --- a/packages/core/src/schema/index.ts +++ b/packages/core/src/schema/index.ts @@ -1,15 +1,76 @@ -export { RootAppSchema } from './configFiles/app'; -export { RootProjectSchema } from './configFiles/project'; -export { RootEngineSchema } from './configFiles/engine'; -export { RootWorkspaceSchema as RootGlobalSchema } from './configFiles/workspace'; -export { RootLocalSchema } from './configFiles/local'; -export { RootPluginSchema } from './configFiles/plugin'; -export { RootPluginsSchema } from './configFiles/plugins'; -export { RootPrivateSchema } from './configFiles/private'; -export { RootTemplateSchema } from './configFiles/template'; -export { RootTemplatesSchema } from './configFiles/templates'; -export { RootIntegrationSchema } from './configFiles/integration'; +import * as _shared from './shared'; +import * as _common from './common'; +import * as _plugins from './plugins'; +import * as _base from './plugins/fragments/base'; +import * as _pAndroid from './plugins/fragments/platformAndroid'; +import * as _pIos from './plugins/fragments/platformIos'; +import * as _pBase from './plugins/fragments/platformBase'; +import * as _platforms from './platforms'; +import * as _platformsFragmentsAndroid from './platforms/fragments/android'; +import * as _platformsFragmentsIos from './platforms/fragments/ios'; +import * as _platformsFragmentsBase from './platforms/fragments/base'; +import * as _platformsFragmentsLightning from './platforms/fragments/lightning'; +import * as _platformsFragmentsNextJs from './platforms/fragments/nextjs'; +import * as _platformsFragmentsWeb from './platforms/fragments/web'; +import * as _platformsFragmentsTizen from './platforms/fragments/tizen'; +import * as _platformsFragmentsReactNative from './platforms/fragments/reactNative'; +import * as _platformsFragmentsWindows from './platforms/fragments/windows'; +import * as _platformsFragmentsTemplateAndroid from './platforms/fragments/templateAndroid'; +import * as _platformsFragmentsTemplateXcode from './platforms/fragments/templateXcode'; +import * as _platformsFragmentsElectron from './platforms/fragments/electron'; +import * as _platformsFragmentsWebos from './platforms/fragments/webos'; +import * as _app from './configFiles/app'; +import * as _engine from './configFiles/engine'; +import * as _integration from './configFiles/integration'; +import * as _local from './configFiles/local'; +import * as _overrides from './configFiles/overrides'; +import * as _plugin from './configFiles/plugin'; +import * as _private from './configFiles/private'; +import * as _project from './configFiles/project'; +import * as _root from './configFiles/root'; +import * as _runtime from './configFiles/runtime'; +import * as _template from './configFiles/template'; +import * as _templates from './configFiles/templates'; +import * as _workspace from './configFiles/workspace'; +import * as _workspaces from './configFiles/workspaces'; -export { ConfigFileBuildConfig } from './configFiles/buildConfig'; +export const ZodFileSchema = { + ..._app, + ..._engine, + ..._integration, + ..._local, + ..._overrides, + ..._plugin, + ..._private, + ..._project, + ..._root, + ..._runtime, + ..._template, + ..._templates, + ..._workspace, + ..._workspaces, +}; -export * from './validators'; +export const ZodSharedSchema = { + ..._shared, + ..._common, + ..._plugins, + ..._base, + ..._pAndroid, + ..._pIos, + ..._pBase, + ..._platforms, + ..._platformsFragmentsAndroid, + ..._platformsFragmentsIos, + ..._platformsFragmentsBase, + ..._platformsFragmentsLightning, + ..._platformsFragmentsNextJs, + ..._platformsFragmentsWeb, + ..._platformsFragmentsTizen, + ..._platformsFragmentsReactNative, + ..._platformsFragmentsWindows, + ..._platformsFragmentsTemplateAndroid, + ..._platformsFragmentsTemplateXcode, + ..._platformsFragmentsElectron, + ..._platformsFragmentsWebos, +}; diff --git a/packages/core/src/schema/platforms/android.ts b/packages/core/src/schema/platforms/android.ts deleted file mode 100644 index 4e76c66e04..0000000000 --- a/packages/core/src/schema/platforms/android.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { z } from 'zod'; -import { CommonSchemaFragment } from '../common'; -import { PlatformBaseFragment } from './fragments/base'; -import { PlatformAndroidFragment } from './fragments/android'; -import { TemplateAndroidFragment } from './fragments/templateAndroid'; -import { PlatformReactNativeFragment } from './fragments/reactNative'; - -export const PlatformAndroidSchema = z.object({ - ...CommonSchemaFragment, - ...PlatformBaseFragment, - ...PlatformAndroidFragment, - ...PlatformReactNativeFragment, - ...TemplateAndroidFragment, -}); diff --git a/packages/core/src/schema/platforms/fragments/android.ts b/packages/core/src/schema/platforms/fragments/android.ts index 44c73f0e8a..df53e81f2a 100644 --- a/packages/core/src/schema/platforms/fragments/android.ts +++ b/packages/core/src/schema/platforms/fragments/android.ts @@ -1,90 +1,74 @@ import { z } from 'zod'; import { DEFAULTS } from '../../defaults'; -const EnableAndroidX = z.union([z.boolean(), z.string()]).default(true).describe('Enables new android X architecture'); -const EnableJetifier = z.union([z.boolean(), z.string()]).default(true).describe('Enables Jetifier'); - -export const PlatformAndroidFragment = { - enableAndroidX: z.optional(EnableAndroidX), - enableJetifier: z.optional(EnableJetifier), - signingConfig: z.optional( - z +export const zodPlatformAndroidFragment = z + .object({ + enableAndroidX: z.union([z.boolean(), z.string()]).default(true).describe('Enables new android X architecture'), + enableJetifier: z.union([z.boolean(), z.string()]).default(true).describe('Enables Jetifier'), + signingConfig: z .string() .default('Debug') - .describe('Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`') - ), - minSdkVersion: z.optional( - z.number().default(28).describe('Minimum Android SDK version device has to have in order for app to run') - ), - multipleAPKs: z.optional( - z + .describe('Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`'), + minSdkVersion: z + .number() + .default(28) + .describe('Minimum Android SDK version device has to have in order for app to run'), + multipleAPKs: z .boolean() .describe( 'If set to `true`, apk will be split into multiple ones for each architecture: "armeabi-v7a", "x86", "arm64-v8a", "x86_64"' - ) - ), - aab: z.optional(z.boolean().describe('If set to true, android project will generate app.aab instead of apk')), - extraGradleParams: z.optional(z.string().describe('Allows passing extra params to gradle command')), //assembleAndroidTest -DtestBuildType=debug - minifyEnabled: z.optional(z.boolean().describe('Sets minifyEnabled buildType property in app/build.gradle')), - targetSdkVersion: z.optional( - z + ), + aab: z.boolean().describe('If set to true, android project will generate app.aab instead of apk'), + extraGradleParams: z.string().describe('Allows passing extra params to gradle command'), //assembleAndroidTest -DtestBuildType=debug + minifyEnabled: z.boolean().describe('Sets minifyEnabled buildType property in app/build.gradle'), + targetSdkVersion: z .number() .describe( 'Allows you define custom targetSdkVersion equivalent to: `targetSdkVersion = [VERSION]` in build.gradle' - ) - ), - compileSdkVersion: z.optional( - z + ), + compileSdkVersion: z .number() .describe( 'Allows you define custom compileSdkVersion equivalent to: `compileSdkVersion = [VERSION]` in build.gradle' - ) - ), - kotlinVersion: z.optional(z.string().default('1.7.10').describe('Allows you define custom kotlin version')), - ndkVersion: z.optional( - z + ), + kotlinVersion: z.string().default('1.7.10').describe('Allows you define custom kotlin version'), + ndkVersion: z .string() - .describe('Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle') - ), - supportLibVersion: z.optional( - z + .describe('Allows you define custom ndkVersion equivalent to: `ndkVersion = [VERSION]` in build.gradle'), + supportLibVersion: z .string() .describe( 'Allows you define custom supportLibVersion equivalent to: `supportLibVersion = [VERSION]` in build.gradle' - ) - ), - googleServicesVersion: z.optional( - z + ), + googleServicesVersion: z .string() .describe( 'Allows you define custom googleServicesVersion equivalent to: `googleServicesVersion = [VERSION]` in build.gradle' - ) - ), - gradleBuildToolsVersion: z.optional( - z + ), + gradleBuildToolsVersion: z .string() .describe( "Allows you define custom gradle build tools version equivalent to: `classpath 'com.android.tools.build:gradle:[VERSION]'`" - ) - ), - gradleWrapperVersion: z.optional( - z + ), + gradleWrapperVersion: z .string() .describe( 'Allows you define custom gradle wrapper version equivalent to: `distributionUrl=https\\://services.gradle.org/distributions/gradle-[VERSION]-all.zip`' - ) - ), - excludedFeatures: z.optional( - z.array(z.string()).describe('Override features definitions in AndroidManifest.xml by exclusion') - ), - includedFeatures: z.optional( - z.array(z.string()).describe('Override features definitions in AndroidManifest.xml by inclusion') - ), - buildToolsVersion: z.optional( - z.string().default(DEFAULTS.buildToolsVersion).describe('Override android build tools version') - ), - disableSigning: z.boolean().optional(), - storeFile: z.string().describe('Name of the store file in android project').optional(), - keyAlias: z.string().describe('Key alias of the store file in android project').optional(), - newArchEnabled: z.boolean().optional().describe('Enables new arch for android. Default: false'), -}; + ), + excludedFeatures: z + .array(z.string()) + .describe('Override features definitions in AndroidManifest.xml by exclusion'), + includedFeatures: z + .array(z.string()) + .describe('Override features definitions in AndroidManifest.xml by inclusion'), + buildToolsVersion: z + .string() + .default(DEFAULTS.buildToolsVersion) + .describe('Override android build tools version'), + disableSigning: z.boolean(), + storeFile: z.string().describe('Name of the store file in android project'), + keyAlias: z.string().describe('Key alias of the store file in android project'), + newArchEnabled: z.boolean().describe('Enables new arch for android. Default: false'), + flipperEnabled: z.boolean().describe('Enables flipper for ios. Default: true'), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/base.ts b/packages/core/src/schema/platforms/fragments/base.ts index fe404b6973..3b2eb69996 100644 --- a/packages/core/src/schema/platforms/fragments/base.ts +++ b/packages/core/src/schema/platforms/fragments/base.ts @@ -1,41 +1,28 @@ import { z } from 'zod'; -import { PlatformsKeys } from '../../shared'; +import { zodPlatformsKeys } from '../../shared'; -export const PlatformEngine = z - .string() - .describe('ID of engine to be used for this platform. Note: engine must be registered in `engines` field'); - -export const PlatformEntryFile = z - .string() - .default('index') - .describe('Alternative name of the entry file without `.js` extension'); - -export const BundleAssets = z - .boolean() - .describe( - 'If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds' - ); - -export const EnableSourceMaps = z - .boolean() - .describe('If set to `true` dedicated source map file will be generated alongside of compiled js bundle'); - -export const BundleIsDev = z.boolean().describe('If set to `true` debug build will be generated'); - -export const AssetFolderPlatform = z - .string() - .describe( - 'Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets' - ); - -export const PlatformBaseFragment = { - extendPlatform: z.optional(PlatformsKeys), - assetFolderPlatform: z.optional(AssetFolderPlatform), - engine: z.optional(PlatformEngine), - //ReactNative specific? - entryFile: z.optional(PlatformEntryFile), - bundleAssets: z.optional(BundleAssets), - enableSourceMaps: z.optional(EnableSourceMaps), - bundleIsDev: z.optional(BundleIsDev), - getJsBundleFile: z.string().optional(), -}; +export const zodPlatformBaseFragment = z + .object({ + extendPlatform: zodPlatformsKeys, + assetFolderPlatform: z + .string() + .describe( + 'Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets' + ), + engine: z + .string() + .describe('ID of engine to be used for this platform. Note: engine must be registered in `engines` field'), + //ReactNative specific? + entryFile: z.string().default('index').describe('Alternative name of the entry file without `.js` extension'), + bundleAssets: z + .boolean() + .describe( + 'If set to `true` compiled js bundle file will generated. this is needed if you want to make production like builds' + ), + enableSourceMaps: z + .boolean() + .describe('If set to `true` dedicated source map file will be generated alongside of compiled js bundle'), + bundleIsDev: z.boolean().describe('If set to `true` debug build will be generated'), + getJsBundleFile: z.string(), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/electron.ts b/packages/core/src/schema/platforms/fragments/electron.ts index 405cfc64a4..c3216ab8b6 100644 --- a/packages/core/src/schema/platforms/fragments/electron.ts +++ b/packages/core/src/schema/platforms/fragments/electron.ts @@ -1,78 +1,77 @@ import { z } from 'zod'; -export const PlatformElectronFragment = { - electronConfig: z - .any() - .optional() - .describe('Allows you to configure electron app as per https://www.electron.build/'), - BrowserWindow: z - .object({ - width: z.number().optional(), - height: z.number().optional(), - webPreferences: z - .object({ - devTools: z.boolean().optional(), - }) - .optional() - .describe('Extra web preferences of electron app'), - }) - .optional() - .describe('Allows you to configure electron wrapper app window'), - // electronTemplate: z.optional(z.object({})), - // electronConfig: { - // additionalProperties: true, - // type: 'object', - // description: 'Allows you to configure electron app as per https://www.electron.build/', - // examples: [ - // { - // mac: { - // target: ['dmg', 'mas', 'mas-dev'], - // hardenedRuntime: true, - // }, - // dmg: { - // sign: false, - // }, - // mas: { - // type: 'distribution', - // hardenedRuntime: false, - // }, - // mainInjection: 'console.log("Hello from main.js!");', - // mainHeadInjection: 'console.log("Hello from main.js!");', - // }, - // ], - // }, - // BrowserWindow: { - // type: 'object', - // additionalProperties: false, - // description: 'Allows you to configure electron wrapper app window', - // examples: [ - // { - // width: 1310, - // height: 800, - // webPreferences: { - // devTools: true, - // }, - // }, - // ], - // properties: { - // width: { - // type: 'integer', - // description: 'Default width of electron app', - // }, - // height: { - // type: 'integer', - // description: 'Default height of electron app', - // }, - // webPreferences: { - // additionalProperties: true, - // type: 'object', - // description: 'Extra web preferences of electron app', - // examples: [ - // { - // devTools: true, - // }, - // ], - // }, - // }, - // }, -}; +export const zodPlatformElectronFragment = z + .object({ + electronConfig: z.any().describe('Allows you to configure electron app as per https://www.electron.build/'), + BrowserWindow: z + .object({ + width: z.number(), + height: z.number(), + webPreferences: z + .object({ + devTools: z.boolean(), + }) + + .describe('Extra web preferences of electron app'), + }) + .partial() + .describe('Allows you to configure electron wrapper app window'), + // electronTemplate: z.optional(z.object({})), + // electronConfig: { + // additionalProperties: true, + // type: 'object', + // description: 'Allows you to configure electron app as per https://www.electron.build/', + // examples: [ + // { + // mac: { + // target: ['dmg', 'mas', 'mas-dev'], + // hardenedRuntime: true, + // }, + // dmg: { + // sign: false, + // }, + // mas: { + // type: 'distribution', + // hardenedRuntime: false, + // }, + // mainInjection: 'console.log("Hello from main.js!");', + // mainHeadInjection: 'console.log("Hello from main.js!");', + // }, + // ], + // }, + // BrowserWindow: { + // type: 'object', + // additionalProperties: false, + // description: 'Allows you to configure electron wrapper app window', + // examples: [ + // { + // width: 1310, + // height: 800, + // webPreferences: { + // devTools: true, + // }, + // }, + // ], + // properties: { + // width: { + // type: 'integer', + // description: 'Default width of electron app', + // }, + // height: { + // type: 'integer', + // description: 'Default height of electron app', + // }, + // webPreferences: { + // additionalProperties: true, + // type: 'object', + // description: 'Extra web preferences of electron app', + // examples: [ + // { + // devTools: true, + // }, + // ], + // }, + // }, + // }, + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/ios.ts b/packages/core/src/schema/platforms/fragments/ios.ts index 683d4358ef..e2e57c4738 100644 --- a/packages/core/src/schema/platforms/fragments/ios.ts +++ b/packages/core/src/schema/platforms/fragments/ios.ts @@ -1,112 +1,96 @@ import { z } from 'zod'; -const IgnoreWarnings = z.boolean().describe('Injects `inhibit_all_warnings` into Podfile'); - -const IgnoreLogs = z.boolean().describe('Passes `-quiet` to xcodebuild command'); - -const DeploymentTarget = z.string().describe('Deployment target for xcodepoj'); - -const OrientationSupport = z.object({ - phone: z.optional(z.array(z.string())), - // phone: [ - // 'UIInterfaceOrientationPortrait', - // 'UIInterfaceOrientationPortraitUpsideDown', - // 'UIInterfaceOrientationLandscapeLeft', - // 'UIInterfaceOrientationLandscapeRight', - // ], - tab: z.optional(z.array(z.string())), - // tab: [ - // 'UIInterfaceOrientationPortrait', - // 'UIInterfaceOrientationPortraitUpsideDown', - // 'UIInterfaceOrientationLandscapeLeft', - // 'UIInterfaceOrientationLandscapeRight', - // ], -}); - -const ExcludedArchs = z - .array(z.string()) - .describe('Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=""`'); //['arm64'] - -const URLScheme = z.string().describe('URL Scheme for the app used for deeplinking'); - -const TeamID = z.string().describe('Apple teamID'); - -const SystemCapabilities = z.record(z.string(), z.boolean()); -const provisioningProfiles = z.record(z.string()); - -export const PlatformiOSFragment = { - ignoreWarnings: z.optional(IgnoreWarnings), - ignoreLogs: z.optional(IgnoreLogs), - deploymentTarget: z.optional(DeploymentTarget), - orientationSupport: z.optional(OrientationSupport), - teamID: z.optional(TeamID), - excludedArchs: z.optional(ExcludedArchs), - urlScheme: z.optional(URLScheme), - teamIdentifier: z.optional(z.string().describe('Apple developer team ID')), - scheme: z.string().optional(), - schemeTarget: z.string().optional(), - appleId: z.string().optional(), - provisioningStyle: z.string().optional(), - newArchEnabled: z.boolean().optional().describe('Enables new archs for iOS. Default: false'), - codeSignIdentity: z.string().describe('Special property which tells Xcode how to build your project').optional(), - commandLineArguments: z - .array(z.string()) - .describe('Allows you to pass launch arguments to active scheme') - .optional(), - provisionProfileSpecifier: z.string().optional(), - provisionProfileSpecifiers: z.record(z.string(), z.string()).optional(), - allowProvisioningUpdates: z.boolean().optional(), - provisioningProfiles: z.optional(provisioningProfiles), - codeSignIdentities: z.optional(z.record(z.string(), z.string())), - systemCapabilities: z.optional(SystemCapabilities), - entitlements: z.record(z.string()).optional(), - runScheme: z.string().optional(), - sdk: z.string().optional(), - testFlightId: z.string().optional(), - firebaseId: z.string().optional(), - exportOptions: z - .object({ - method: z.string().optional(), - teamID: z.string().optional(), - uploadBitcode: z.boolean().optional(), - compileBitcode: z.boolean().optional(), - uploadSymbols: z.boolean().optional(), - signingStyle: z.string().optional(), - signingCertificate: z.string().optional(), - provisioningProfiles: z.record(z.string()).optional(), - }) - .optional(), - // systemCapabilities: { - // additionalProperties: true, - // type: 'object', - // examples: [ - // { - // 'com.apple.SafariKeychain': false, - // 'com.apple.Wallet': false, - // 'com.apple.HealthKit': false, - // 'com.apple.ApplicationGroups.iOS': false, - // 'com.apple.iCloud': true, - // 'com.apple.DataProtection': false, - // 'com.apple.HomeKit': false, - // 'com.apple.ClassKit': false, - // 'com.apple.VPNLite': false, - // 'com.apple.AutoFillCredentialProvider': false, - // 'com.apple.AccessWiFi': false, - // 'com.apple.InAppPurchase': false, - // 'com.apple.HotspotConfiguration': false, - // 'com.apple.Multipath': false, - // 'com.apple.GameCenter.iOS': false, - // 'com.apple.BackgroundModes': false, - // 'com.apple.InterAppAudio': false, - // 'com.apple.WAC': false, - // 'com.apple.Push': true, - // 'com.apple.NearFieldCommunicationTagReading': false, - // 'com.apple.ApplePay': false, - // 'com.apple.Keychain': false, - // 'com.apple.Maps.iOS': false, - // 'com.apple.Siri': false, - // 'com.apple.NetworkExtensions.iOS': false, - // }, - // ], - // }, -}; +export const zodPlatformiOSFragment = z + .object({ + ignoreWarnings: z.boolean().describe('Injects `inhibit_all_warnings` into Podfile'), + ignoreLogs: z.boolean().describe('Passes `-quiet` to xcodebuild command'), + deploymentTarget: z.string().describe('Deployment target for xcodepoj'), + orientationSupport: z + .object({ + phone: z.array(z.string()), + // phone: [ + // 'UIInterfaceOrientationPortrait', + // 'UIInterfaceOrientationPortraitUpsideDown', + // 'UIInterfaceOrientationLandscapeLeft', + // 'UIInterfaceOrientationLandscapeRight', + // ], + tab: z.array(z.string()), + // tab: [ + // 'UIInterfaceOrientationPortrait', + // 'UIInterfaceOrientationPortraitUpsideDown', + // 'UIInterfaceOrientationLandscapeLeft', + // 'UIInterfaceOrientationLandscapeRight', + // ], + }) + .partial(), + teamID: z.string().describe('Apple teamID'), + excludedArchs: z + .array(z.string()) + .describe('Defines excluded architectures. This transforms to xcodeproj: `EXCLUDED_ARCHS=""`'), + urlScheme: z.string().describe('URL Scheme for the app used for deeplinking'), + teamIdentifier: z.string().describe('Apple developer team ID'), + scheme: z.string(), + schemeTarget: z.string(), + appleId: z.string(), + provisioningStyle: z.string(), + newArchEnabled: z.boolean().describe('Enables new archs for iOS. Default: false'), + codeSignIdentity: z.string().describe('Special property which tells Xcode how to build your project'), + commandLineArguments: z.array(z.string()).describe('Allows you to pass launch arguments to active scheme'), + provisionProfileSpecifier: z.string(), + provisionProfileSpecifiers: z.record(z.string(), z.string()), + allowProvisioningUpdates: z.boolean(), + provisioningProfiles: z.record(z.string()), + codeSignIdentities: z.record(z.string(), z.string()), + systemCapabilities: z.record(z.string(), z.boolean()), + entitlements: z.record(z.string()), + runScheme: z.string(), + sdk: z.string(), + testFlightId: z.string(), + firebaseId: z.string(), + exportOptions: z + .object({ + method: z.string(), + teamID: z.string(), + uploadBitcode: z.boolean(), + compileBitcode: z.boolean(), + uploadSymbols: z.boolean(), + signingStyle: z.string(), + signingCertificate: z.string(), + provisioningProfiles: z.record(z.string()), + }) + .partial(), + // systemCapabilities: { + // additionalProperties: true, + // type: 'object', + // examples: [ + // { + // 'com.apple.SafariKeychain': false, + // 'com.apple.Wallet': false, + // 'com.apple.HealthKit': false, + // 'com.apple.ApplicationGroups.iOS': false, + // 'com.apple.iCloud': true, + // 'com.apple.DataProtection': false, + // 'com.apple.HomeKit': false, + // 'com.apple.ClassKit': false, + // 'com.apple.VPNLite': false, + // 'com.apple.AutoFillCredentialProvider': false, + // 'com.apple.AccessWiFi': false, + // 'com.apple.InAppPurchase': false, + // 'com.apple.HotspotConfiguration': false, + // 'com.apple.Multipath': false, + // 'com.apple.GameCenter.iOS': false, + // 'com.apple.BackgroundModes': false, + // 'com.apple.InterAppAudio': false, + // 'com.apple.WAC': false, + // 'com.apple.Push': true, + // 'com.apple.NearFieldCommunicationTagReading': false, + // 'com.apple.ApplePay': false, + // 'com.apple.Keychain': false, + // 'com.apple.Maps.iOS': false, + // 'com.apple.Siri': false, + // 'com.apple.NetworkExtensions.iOS': false, + // }, + // ], + // }, + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/lightning.ts b/packages/core/src/schema/platforms/fragments/lightning.ts index 889c2cb6fb..1af04c98d6 100644 --- a/packages/core/src/schema/platforms/fragments/lightning.ts +++ b/packages/core/src/schema/platforms/fragments/lightning.ts @@ -1,5 +1,7 @@ import { z } from 'zod'; -export const PlatformLightningFragment = { - target: z.string().optional(), -}; +export const zodPlatformLightningFragment = z + .object({ + target: z.string(), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/nextjs.ts b/packages/core/src/schema/platforms/fragments/nextjs.ts index 85e0856b4a..5b934906c9 100644 --- a/packages/core/src/schema/platforms/fragments/nextjs.ts +++ b/packages/core/src/schema/platforms/fragments/nextjs.ts @@ -1,18 +1,18 @@ import { z } from 'zod'; -export const PlatformNextJsFragment = { - pagesDir: z.string().describe('Custom pages directory used by nextjs. Use relative paths').optional(), - outputDir: z - .string() - .describe( - 'Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths' - ) - .optional(), - exportDir: z - .string() - .describe( - 'Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths' - ) - .optional(), - nextTranspileModules: z.optional(z.array(z.string())), -}; +export const zodPlatformNextJsFragment = z + .object({ + pagesDir: z.string().describe('Custom pages directory used by nextjs. Use relative paths'), + outputDir: z + .string() + .describe( + 'Custom output directory used by nextjs equivalent to `npx next build` with custom outputDir. Use relative paths' + ), + exportDir: z + .string() + .describe( + 'Custom export directory used by nextjs equivalent to `npx next export --outdir `. Use relative paths' + ), + nextTranspileModules: z.array(z.string()), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/reactNative.ts b/packages/core/src/schema/platforms/fragments/reactNative.ts index acde4cc960..7d5cd0df6e 100644 --- a/packages/core/src/schema/platforms/fragments/reactNative.ts +++ b/packages/core/src/schema/platforms/fragments/reactNative.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -export const PlatformReactNativeFragment = { - reactNativeEngine: z.optional( - z +export const zodPlatformReactNativeFragment = z + .object({ + reactNativeEngine: z .enum(['jsc', 'v8-android', 'v8-android-nointl', 'v8-android-jit', 'v8-android-jit-nointl', 'hermes']) .default('hermes') - .describe('Allows you to define specific native render engine to be used') - ), -}; + .describe('Allows you to define specific native render engine to be used'), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/templateAndroid.ts b/packages/core/src/schema/platforms/fragments/templateAndroid.ts index c08e070a24..d588a649f2 100644 --- a/packages/core/src/schema/platforms/fragments/templateAndroid.ts +++ b/packages/core/src/schema/platforms/fragments/templateAndroid.ts @@ -1,17 +1,121 @@ import { z } from 'zod'; -import { TemplateAndroidBaseFragment } from './templateAndroidBase'; - -export const TemplateAndroidFragment = { - templateAndroid: z.optional( - z.object({ - ...TemplateAndroidBaseFragment, - settings_gradle: z.optional(z.object({})), - gradle_wrapper_properties: z.optional(z.object({})), - SplashActivity_java: z.optional(z.object({})), - styles_xml: z.optional(z.object({})), - colors_xml: z.optional(z.object({})), - strings_xml: z.optional(z.object({})), - proguard_rules_pro: z.optional(z.object({})), - }) - ), -}; +import type { ConfigAndroidManifestChildType } from '../../types'; + +export const zodManifestChildBase = z.object({ + tag: z.string(), + 'android:name': z.string(), + 'android:required': z.boolean().optional(), + // 'android:name': '.MainApplication', + // 'android:allowBackup': true, + // 'android:largeHeap': true, + // 'android:usesCleartextTraffic': true, + // 'tools:targetApi': 28, +}); + +// type ManifestFeature = { +// tag: string; +// 'android:name': string; +// 'android:required': boolean; +// children?: Array; +// }; + +export const zodManifestChildWithChildren: z.ZodType = zodManifestChildBase.extend({ + children: z.lazy(() => zodManifestChildWithChildren.array()), +}); + +export const zodAndroidManifest = zodManifestChildBase.extend({ + package: z.string().optional(), + children: z.array(zodManifestChildWithChildren).optional(), +}).describe(`Allows you to directly manipulate \`AndroidManifest.xml\` via json override mechanism +Injects / Overrides values in AndroidManifest.xml file of generated android based project +> IMPORTANT: always ensure that your object contains \`tag\` and \`android:name\` to target correct tag to merge into + `); + +export const zodTemplateAndroidFragment = z + .object({ + templateAndroid: z + .object({ + gradle_properties: z + .record(z.string(), z.union([z.string(), z.boolean(), z.number()])) + .describe('Overrides values in `gradle.properties` file of generated android based project'), + build_gradle: z + .object({ + allprojects: z.object({ + repositories: z + .record(z.string(), z.boolean()) + .describe('Customize repositories section of build.gradle'), + }), + plugins: z.array(z.string()), + buildscript: z.object({ + repositories: z.record(z.string(), z.boolean()), + dependencies: z.record(z.string(), z.boolean()), + }), + dexOptions: z.record(z.string(), z.boolean()), + injectAfterAll: z.array(z.string()), + }) + .partial() + .describe('Overrides values in `build.gradle` file of generated android based project'), + app_build_gradle: z + .object({ + apply: z.array(z.string()), + defaultConfig: z.array(z.string()), + buildTypes: z.object({ + debug: z.optional(z.array(z.string())), + release: z.optional(z.array(z.string())), + }), + + afterEvaluate: z.array(z.string()), + implementations: z.array(z.string()), + implementation: z.string(), + }) + .partial() + .describe('Overrides values in `app/build.gradle` file of generated android based project'), + AndroidManifest_xml: zodAndroidManifest, + strings_xml: z.object({ + children: z.array( + z.object({ + tag: z.string(), + name: z.string().optional(), + child_value: z.string().optional(), + }) + ), + }), + MainActivity_kt: z + .object({ + onCreate: z + .string({}) + + .default('super.onCreate(savedInstanceState)') + .describe('Overrides super.onCreate method handler of MainActivity.java'), + imports: z.array(z.string()), + methods: z.array(z.string()), + createMethods: z.array(z.string()), + resultMethods: z.array(z.string()), + }) + .partial(), + MainApplication_kt: z + .object({ + imports: z.array(z.string()), + methods: z.array(z.string()), + createMethods: z.array(z.string()), + packages: z.array(z.string()), + packageParams: z.array(z.string()), + // onCreate: z + // .string({}) + // .default('super.onCreate(savedInstanceState)') + // .describe('Overrides super.onCreate method handler of MainActivity.java'), + }) + .partial() + .describe('Allows you to configure behaviour of MainActivity'), + + settings_gradle: z.object({}), + gradle_wrapper_properties: z.object({}), + SplashActivity_java: z.object({}), + styles_xml: z.object({}), + colors_xml: z.object({}), + proguard_rules_pro: z.object({}), + }) + .partial(), + }) + .partial() + .describe('Allows more advanced modifications to Android based project template'); diff --git a/packages/core/src/schema/platforms/fragments/templateAndroidBase.ts b/packages/core/src/schema/platforms/fragments/templateAndroidBase.ts deleted file mode 100644 index 9484a4e0e9..0000000000 --- a/packages/core/src/schema/platforms/fragments/templateAndroidBase.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { z } from 'zod'; - -const GradleProperties = z - .record(z.string(), z.union([z.string(), z.boolean(), z.number()])) - .describe('Overrides values in `gradle.properties` file of generated android based project'); - -const BuildGradle = z - .object({ - allprojects: z.object({ - repositories: z.record(z.string(), z.boolean()).describe('Customize repositories section of build.gradle'), - }), - plugins: z.array(z.string()), - buildscript: z.object({ - repositories: z.record(z.string(), z.boolean()), - dependencies: z.record(z.string(), z.boolean()), - }), - dexOptions: z.record(z.string(), z.boolean()), - injectAfterAll: z.array(z.string()), - }) - .describe('Overrides values in `build.gradle` file of generated android based project'); - -const AppBuildGradle = z - .object({ - apply: z.array(z.string()), - defaultConfig: z.array(z.string()), - buildTypes: z.optional( - z.object({ - debug: z.optional(z.array(z.string())), - release: z.optional(z.array(z.string())), - }) - ), - afterEvaluate: z.optional(z.array(z.string())), - implementations: z.optional(z.array(z.string())), - implementation: z.optional(z.string()), - }) - .describe('Overrides values in `app/build.gradle` file of generated android based project'); - -const ManifestChildBase = z.object({ - tag: z.string(), - 'android:name': z.string(), - 'android:required': z.optional(z.boolean()), - // 'android:name': '.MainApplication', - // 'android:allowBackup': true, - // 'android:largeHeap': true, - // 'android:usesCleartextTraffic': true, - // 'tools:targetApi': 28, -}); - -// type ManifestFeature = { -// tag: string; -// 'android:name': string; -// 'android:required': boolean; -// children?: Array; -// }; - -export type _ManifestChildType = z.infer & { - children?: _ManifestChildType[]; -}; - -const ManifestChildWithChildren: z.ZodType<_ManifestChildType> = ManifestChildBase.extend({ - children: z.lazy(() => ManifestChildWithChildren.array()), -}); - -const AndroidManifest = ManifestChildBase.extend({ - package: z.string().optional(), - children: z.array(ManifestChildWithChildren), -}).describe(`Allows you to directly manipulate \`AndroidManifest.xml\` via json override mechanism -Injects / Overrides values in AndroidManifest.xml file of generated android based project -> IMPORTANT: always ensure that your object contains \`tag\` and \`android:name\` to target correct tag to merge into - `); - -// const Gradle = z.object({ - -// }); - -export const TemplateAndroidBaseFragment = { - gradle_properties: z.optional(GradleProperties), - build_gradle: z.optional(BuildGradle), - app_build_gradle: z.optional(AppBuildGradle), - AndroidManifest_xml: z.optional(AndroidManifest), - strings_xml: z.optional( - z.object({ - children: z.optional( - z.array( - z.object({ - tag: z.string(), - name: z.string(), - child_value: z.string(), - }) - ) - ), - }) - ), - MainActivity_kt: z.optional( - z.object({ - onCreate: z - .string({}) - .optional() - .default('super.onCreate(savedInstanceState)') - .describe('Overrides super.onCreate method handler of MainActivity.java'), - imports: z.array(z.string()).optional(), - methods: z.array(z.string()).optional(), - createMethods: z.array(z.string()).optional(), - resultMethods: z.array(z.string()).optional(), - }) - ), - MainApplication_kt: z.optional( - z - .object({ - imports: z.array(z.string()).optional(), - methods: z.array(z.string()).optional(), - createMethods: z.array(z.string()).optional(), - packages: z.array(z.string()).optional(), - packageParams: z.array(z.string()).optional(), - - // onCreate: z - // .string({}) - // .optional() - // .default('super.onCreate(savedInstanceState)') - // .describe('Overrides super.onCreate method handler of MainActivity.java'), - }) - .describe('Allows you to configure behaviour of MainActivity') - ), -}; -// .describe('Allows more advanced modifications to Android based project template'); - -export type _ManifestChildWithChildrenType = z.infer; - -export type _AndroidManifestType = z.infer; diff --git a/packages/core/src/schema/platforms/fragments/templateXcode.ts b/packages/core/src/schema/platforms/fragments/templateXcode.ts index d7894d2e86..1b9b73c303 100644 --- a/packages/core/src/schema/platforms/fragments/templateXcode.ts +++ b/packages/core/src/schema/platforms/fragments/templateXcode.ts @@ -1,10 +1,99 @@ import { z } from 'zod'; -import { TemplateXcodeBaseFragment } from './templateXcodeBase'; - -export const TemplateXcodeFragment = { - templateXcode: z.optional( - z.object({ - ...TemplateXcodeBaseFragment, - }) - ), -}; + +const zodPodfile = z + .object({ + injectLines: z.array(z.string()), + post_install: z.array(z.string()), + sources: z + .optional(z.array(z.string())) + .describe('Array of URLs that will be injected on top of the Podfile as sources'), + podDependencies: z.array(z.string()), + staticPods: z.array(z.string()), + header: z + .optional(z.array(z.string())) + .describe('Array of strings that will be injected on top of the Podfile'), + }) + .partial() + .describe('Allows to manipulate Podfile'); + +// type RnvPodfile = z.infer; + +const zodXcodeProj = z + .object({ + sourceFiles: z.array(z.string()), + resourceFiles: z.array(z.string()), + headerFiles: z.array(z.string()), + buildPhases: z.array( + z.object({ + shellPath: z.string(), + shellScript: z.string(), + inputPaths: z.array(z.string()), + }) + ), + frameworks: z.array(z.string()), + buildSettings: z.record(z.string(), z.string()), + }) + .partial(); +// type RnvXcodeProj = z.infer; + +export const zodAppDelegateMethod = z.union([ + z.string(), + z.object({ + order: z.number(), + value: z.string(), + weight: z.number(), + }), +]); + +const zodAppDelegateMm = z + .object({ + appDelegateMethods: z.object({ + application: z + .object({ + didFinishLaunchingWithOptions: z.array(zodAppDelegateMethod).optional(), + applicationDidBecomeActive: z.array(zodAppDelegateMethod).optional(), + open: z.array(zodAppDelegateMethod).optional(), + supportedInterfaceOrientationsFor: z.array(zodAppDelegateMethod).optional(), + didReceiveRemoteNotification: z.array(zodAppDelegateMethod).optional(), + didFailToRegisterForRemoteNotificationsWithError: z.array(zodAppDelegateMethod).optional(), + didReceive: z.array(zodAppDelegateMethod).optional(), + didRegister: z.array(zodAppDelegateMethod).optional(), + didRegisterForRemoteNotificationsWithDeviceToken: z.array(zodAppDelegateMethod).optional(), + continue: z.array(zodAppDelegateMethod).optional(), + didConnectCarInterfaceController: z.array(zodAppDelegateMethod).optional(), + didDisconnectCarInterfaceController: z.array(zodAppDelegateMethod).optional(), + }) + .optional(), + userNotificationCenter: z + .object({ + willPresent: z.array(zodAppDelegateMethod).optional(), + didReceiveNotificationResponse: z.array(zodAppDelegateMethod).optional(), + }) + .optional(), + }), + + appDelegateImports: z.array(z.string()), + }) + .partial(); +const zodAppDelegateH = z + .object({ + appDelegateImports: z.array(z.string()), + appDelegateExtensions: z.array(z.string()), + }) + .partial(); + +const zodInfoPlist = z.object({}); + +export const zodTemplateXcodeFragment = z + .object({ + templateXcode: z + .object({ + Podfile: zodPodfile, + project_pbxproj: zodXcodeProj, + AppDelegate_mm: zodAppDelegateMm, + AppDelegate_h: zodAppDelegateH, + Info_plist: zodInfoPlist, + }) + .partial(), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/templateXcodeBase.ts b/packages/core/src/schema/platforms/fragments/templateXcodeBase.ts deleted file mode 100644 index 728a738ca7..0000000000 --- a/packages/core/src/schema/platforms/fragments/templateXcodeBase.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { z } from 'zod'; - -const Podfile = z - .object({ - injectLines: z.optional(z.array(z.string())), - post_install: z.optional(z.array(z.string())), - sources: z - .optional(z.array(z.string())) - .describe('Array of URLs that will be injected on top of the Podfile as sources'), - podDependencies: z.optional(z.array(z.string())), - staticPods: z.optional(z.array(z.string())), - header: z - .optional(z.array(z.string())) - .describe('Array of strings that will be injected on top of the Podfile'), - }) - .describe('Allows to manipulate Podfile'); - -const XcodeProj = z.object({ - sourceFiles: z.optional(z.array(z.string())), - resourceFiles: z.optional(z.array(z.string())), - headerFiles: z.optional(z.array(z.string())), - buildPhases: z.optional( - z.array( - z.object({ - shellPath: z.string(), - shellScript: z.string(), - inputPaths: z.array(z.string()), - }) - ) - ), - frameworks: z.optional(z.array(z.string())), - buildSettings: z.optional(z.record(z.string(), z.string())), -}); - -const AppDelegateMethod = z.union([ - z.string(), - z.object({ - order: z.number(), - value: z.string(), - weight: z.number(), - }), -]); - -const AppDelegateMm = z.object({ - appDelegateMethods: z.optional( - z.object({ - application: z - .object({ - didFinishLaunchingWithOptions: z.array(AppDelegateMethod).optional(), - applicationDidBecomeActive: z.array(AppDelegateMethod).optional(), - open: z.array(AppDelegateMethod).optional(), - supportedInterfaceOrientationsFor: z.array(AppDelegateMethod).optional(), - didReceiveRemoteNotification: z.array(AppDelegateMethod).optional(), - didFailToRegisterForRemoteNotificationsWithError: z.array(AppDelegateMethod).optional(), - didReceive: z.array(AppDelegateMethod).optional(), - didRegister: z.array(AppDelegateMethod).optional(), - didRegisterForRemoteNotificationsWithDeviceToken: z.array(AppDelegateMethod).optional(), - continue: z.array(AppDelegateMethod).optional(), - didConnectCarInterfaceController: z.array(AppDelegateMethod).optional(), - didDisconnectCarInterfaceController: z.array(AppDelegateMethod).optional(), - }) - .optional(), - userNotificationCenter: z - .object({ - willPresent: z.array(AppDelegateMethod).optional(), - didReceiveNotificationResponse: z.array(AppDelegateMethod).optional(), - }) - .optional(), - }) - ), - appDelegateImports: z.optional(z.array(z.string())), -}); -const AppDelegateH = z.object({ - appDelegateImports: z.optional(z.array(z.string())), - appDelegateExtensions: z.optional(z.array(z.string())), -}); - -const InfoPlist = z.object({}); - -export const TemplateXcodeBaseFragment = { - Podfile: z.optional(Podfile), - project_pbxproj: z.optional(XcodeProj), - AppDelegate_mm: z.optional(AppDelegateMm), - AppDelegate_h: z.optional(AppDelegateH), - Info_plist: z.optional(InfoPlist), -}; -// .describe('Allows more advanced modifications to Xcode based project template'); - -export type _AppDelegateMethodType = z.infer; diff --git a/packages/core/src/schema/platforms/fragments/tizen.ts b/packages/core/src/schema/platforms/fragments/tizen.ts index 2e66601b0a..08776a8b89 100644 --- a/packages/core/src/schema/platforms/fragments/tizen.ts +++ b/packages/core/src/schema/platforms/fragments/tizen.ts @@ -1,11 +1,9 @@ import { z } from 'zod'; -const AppName = z.string(); - -const CertificateProfile = z.string(); - -export const PlatformTizenFragment = { - package: z.optional(z.string()), - certificateProfile: z.optional(CertificateProfile), - appName: z.optional(AppName), -}; +export const zodPlatformTizenFragment = z + .object({ + package: z.string(), + certificateProfile: z.string(), + appName: z.string(), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/web.ts b/packages/core/src/schema/platforms/fragments/web.ts index f53068adb8..b52a831d07 100644 --- a/packages/core/src/schema/platforms/fragments/web.ts +++ b/packages/core/src/schema/platforms/fragments/web.ts @@ -1,7 +1,9 @@ import { z } from 'zod'; -export const PlatformWebFragment = { - timestampBuildFiles: z.array(z.string()).optional(), - devServerHost: z.string().optional(), - environment: z.string().optional(), -}; +export const zodPlatformWebFragment = z + .object({ + timestampBuildFiles: z.array(z.string()), + devServerHost: z.string(), + environment: z.string(), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/webos.ts b/packages/core/src/schema/platforms/fragments/webos.ts index 3ba0183911..027122406a 100644 --- a/packages/core/src/schema/platforms/fragments/webos.ts +++ b/packages/core/src/schema/platforms/fragments/webos.ts @@ -1,5 +1,7 @@ import { z } from 'zod'; -export const PlatformWebOSFragment = { - iconColor: z.string().optional(), -}; +export const zodPlatformWebOSFragment = z + .object({ + iconColor: z.string(), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/webpack.ts b/packages/core/src/schema/platforms/fragments/webpack.ts index 1bc5ab1d34..b1dcd91aa7 100644 --- a/packages/core/src/schema/platforms/fragments/webpack.ts +++ b/packages/core/src/schema/platforms/fragments/webpack.ts @@ -1,48 +1,53 @@ import { z } from 'zod'; -const WebpackConfig = z.object({ - publicUrl: z.string().optional(), - customScripts: z.array(z.string()).optional().describe('Allows you to inject custom script into html header'), -}); +export const zodPlatformWebpackFragment = z + .object({ + webpackConfig: z + .object({ + publicUrl: z.string(), + customScripts: z + .array(z.string()) -export const PlatformWebpackFragment = { - webpackConfig: z.optional(WebpackConfig), + .describe('Allows you to inject custom script into html header'), + }) + .partial(), - // webpackConfig: { - // additionalProperties: true, - // type: 'object', - // properties: { - // publicUrl: { - // type: 'string', - // }, - // metaTags: { - // additionalProperties: true, - // type: 'object', - // }, - // customScripts: { - // type: 'array', - // }, - // extend: { - // additionalProperties: true, - // type: 'object', - // description: 'Allows you to directly extend/override webpack config of your current platform', - // examples: [ - // { - // devtool: 'source-map', - // }, - // { - // module: { - // rules: [ - // { - // test: /\.js$/, - // use: ['source-map-loader'], - // enforce: 'pre', - // }, - // ], - // }, - // }, - // ], - // }, - // }, - // }, -}; + // webpackConfig: { + // additionalProperties: true, + // type: 'object', + // properties: { + // publicUrl: { + // type: 'string', + // }, + // metaTags: { + // additionalProperties: true, + // type: 'object', + // }, + // customScripts: { + // type: 'array', + // }, + // extend: { + // additionalProperties: true, + // type: 'object', + // description: 'Allows you to directly extend/override webpack config of your current platform', + // examples: [ + // { + // devtool: 'source-map', + // }, + // { + // module: { + // rules: [ + // { + // test: /\.js$/, + // use: ['source-map-loader'], + // enforce: 'pre', + // }, + // ], + // }, + // }, + // ], + // }, + // }, + // }, + }) + .partial(); diff --git a/packages/core/src/schema/platforms/fragments/windows.ts b/packages/core/src/schema/platforms/fragments/windows.ts index d79a605460..22a2d71c31 100644 --- a/packages/core/src/schema/platforms/fragments/windows.ts +++ b/packages/core/src/schema/platforms/fragments/windows.ts @@ -1,67 +1,60 @@ import { z } from 'zod'; -export const PlatformWindowsFragment = { - templateVSProject: z.optional( - z.object({ - language: z.string().describe('Specify generated project language: cpp for C++ or cs for C#').optional(), - arch: z.string().describe('Specification of targeted architecture').optional(), - experimentalNuGetDependency: z.boolean().optional(), - useWinUI3: z.boolean().optional(), - nuGetTestVersion: z.string().optional(), - reactNativeEngine: z.string().optional(), - nuGetTestFeed: z.string().optional(), - overwrite: z - .boolean() - .describe('Whether to attempt to override the existing builds files when running a build once more') - .optional(), - release: z.boolean().describe('Enables full packaging of the app for release').optional(), - root: z - .string() - .describe('Project root folder location (not the app itself, which is in platformBuilds)') - .optional(), - - singleproc: z - .boolean() - .describe( - 'Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)' - ) - .optional(), - emulator: z.boolean().optional(), - device: z.boolean().optional(), - target: z.string().optional(), - remoteDebugging: z.boolean().optional(), - logging: z.boolean().describe('Logging all the build proccesses to console').optional(), - packager: z.boolean().optional(), - bundle: z.boolean().optional(), - launch: z.boolean().describe('Launches the application once the build process is finished').optional(), - autolink: z.boolean().describe('Launches the application once the build process is finished').optional(), - build: z.boolean().describe('Builds the application before launching it').optional(), - sln: z - .string() - .describe('Location of Visual Studio solution .sln file (wraps multiple projects)') - .optional(), - proj: z - .string() - .describe('Root project directory for your React Native Windows project (not Visual Studio project)') - .optional(), - appPath: z.string().describe('Full path to windows plaform build directory').optional(), - msbuildprops: z - .string() - .describe('Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2') - .optional(), - buildLogDirectory: z - .string() - .describe('Full path to directory where builds logs should be stored, default - project path') - .optional(), - info: z.boolean().describe('Print information about the build machine to console').optional(), - directDebugging: z.boolean().optional(), - telemetry: z - .boolean() - .describe('Send analytics data of @react-native-windows/cli usage to Microsoft') - .optional(), - devPort: z.string().optional(), - additionalMetroOptions: z.record(z.any()).optional(), - packageExtension: z.string().optional(), - }) - ), -}; +export const zodPlatformWindowsFragment = z + .object({ + templateVSProject: z + .object({ + language: z.string().describe('Specify generated project language: cpp for C++ or cs for C#'), + arch: z.string().describe('Specification of targeted architecture'), + experimentalNuGetDependency: z.boolean(), + useWinUI3: z.boolean(), + nuGetTestVersion: z.string(), + reactNativeEngine: z.string(), + nuGetTestFeed: z.string(), + overwrite: z + .boolean() + .describe( + 'Whether to attempt to override the existing builds files when running a build once more' + ), + release: z.boolean().describe('Enables full packaging of the app for release'), + root: z + .string() + .describe('Project root folder location (not the app itself, which is in platformBuilds)'), + singleproc: z + .boolean() + .describe( + 'Opt out of multi-proc builds (only available in 0.64 and newer versions of react-native-windows)' + ), + emulator: z.boolean(), + device: z.boolean(), + target: z.string(), + remoteDebugging: z.boolean(), + logging: z.boolean().describe('Logging all the build proccesses to console'), + packager: z.boolean(), + bundle: z.boolean(), + launch: z.boolean().describe('Launches the application once the build process is finished'), + autolink: z.boolean().describe('Launches the application once the build process is finished'), + build: z.boolean().describe('Builds the application before launching it'), + sln: z.string().describe('Location of Visual Studio solution .sln file (wraps multiple projects)'), + proj: z + .string() + .describe( + 'Root project directory for your React Native Windows project (not Visual Studio project)' + ), + appPath: z.string().describe('Full path to windows plaform build directory'), + msbuildprops: z + .string() + .describe('Comma separated props to pass to msbuild, eg: prop1=value1,prop2=value2'), + buildLogDirectory: z + .string() + .describe('Full path to directory where builds logs should be stored, default - project path'), + info: z.boolean().describe('Print information about the build machine to console'), + directDebugging: z.boolean(), + telemetry: z.boolean().describe('Send analytics data of @react-native-windows/cli usage to Microsoft'), + devPort: z.string(), + additionalMetroOptions: z.record(z.any()), + packageExtension: z.string(), + }) + .partial(), + }) + .partial(); diff --git a/packages/core/src/schema/platforms/index.ts b/packages/core/src/schema/platforms/index.ts index 3f150cdda7..4fb7eb943f 100644 --- a/packages/core/src/schema/platforms/index.ts +++ b/packages/core/src/schema/platforms/index.ts @@ -1,78 +1,55 @@ -import { z } from 'zod'; -import { PlatformAndroidSchema } from './android'; -import { PlatformiOSSchema } from './ios'; -import { PlatformElectronFragment } from './fragments/electron'; -import { PlatformWindowsSchema } from './windows'; -import { PlatformWebpackFragment } from './fragments/webpack'; -import { PlatformNextJsFragment } from './fragments/nextjs'; -import { PlatformLightningFragment } from './fragments/lightning'; -import { PlatformReactNativeFragment } from './fragments/reactNative'; -import { PlatformBaseFragment } from './fragments/base'; -import { PlatformMacosSchema } from './macos'; -import { PlatformWebSchema } from './web'; -import { PlatformTizenSchema } from './tizen'; -import { PlatformWebosSchema } from './webos'; -import { CommonSchemaFragment } from '../common'; -import { PlatformWebOSFragment } from './fragments/webos'; -import { PlatformWindowsFragment } from './fragments/windows'; -import { PlatformTizenFragment } from './fragments/tizen'; -import { PlatformWebFragment } from './fragments/web'; -import { PlatformAndroidFragment } from './fragments/android'; -import { PlatformiOSFragment } from './fragments/ios'; -import { TemplateAndroidFragment } from './fragments/templateAndroid'; -import { TemplateXcodeFragment } from './fragments/templateXcode'; +import { AnyZodObject, z } from 'zod'; +import { zodPlatformElectronFragment } from './fragments/electron'; +import { zodPlatformWebpackFragment } from './fragments/webpack'; +import { zodPlatformNextJsFragment } from './fragments/nextjs'; +import { zodPlatformReactNativeFragment } from './fragments/reactNative'; +import { zodPlatformBaseFragment } from './fragments/base'; +import { zodCommonSchemaFragment } from '../common'; +import { zodPlatformWebOSFragment } from './fragments/webos'; +import { zodPlatformWindowsFragment } from './fragments/windows'; +import { zodPlatformTizenFragment } from './fragments/tizen'; +import { zodPlatformWebFragment } from './fragments/web'; +import { zodPlatformAndroidFragment } from './fragments/android'; +import { zodPlatformiOSFragment } from './fragments/ios'; +import { zodTemplateAndroidFragment } from './fragments/templateAndroid'; +import { zodTemplateXcodeFragment } from './fragments/templateXcode'; -const MergedPlatformPlainObject = z.object({ - //BASE - ...CommonSchemaFragment, - ...PlatformBaseFragment, - //PLATFORMS - ...PlatformiOSFragment, - ...PlatformAndroidFragment, - ...PlatformWebFragment, - ...PlatformTizenFragment, - ...PlatformWindowsFragment, - ...PlatformWebOSFragment, - //ENGINES - ...PlatformLightningFragment, - ...PlatformReactNativeFragment, - ...PlatformWebpackFragment, - ...PlatformElectronFragment, - ...PlatformNextJsFragment, - ...TemplateAndroidFragment, - ...TemplateXcodeFragment, - ...PlatformLightningFragment, -}); +const createPlatformSchema = (obj: AnyZodObject): AnyZodObject => { + const zodPlatformSchema = zodCommonSchemaFragment.merge(zodPlatformBaseFragment).merge(obj); + return z.object({ buildSchemes: z.record(z.string(), zodPlatformSchema) }); +}; -export type _MergedPlatformObjectType = z.infer; +const androidSchema = createPlatformSchema( + zodPlatformAndroidFragment.merge(zodPlatformReactNativeFragment.merge(zodTemplateAndroidFragment)) +); -const desc = 'Allows to customize platforms configurations based on chosen build scheme `-s`'; +const iosSchema = createPlatformSchema( + zodPlatformiOSFragment.merge(zodPlatformReactNativeFragment.merge(zodTemplateXcodeFragment)) +); -const androidSchema = z - .optional(PlatformAndroidSchema.extend({ buildSchemes: z.record(z.string(), PlatformAndroidSchema).optional() })) - .describe(desc); -// const androidSchema = generatePlatform(PlatformAndroid); -const iosSchema = z - .optional(PlatformiOSSchema.extend({ buildSchemes: z.record(z.string(), PlatformiOSSchema).optional() })) - .describe(desc); -const macosSchema = z - .optional(PlatformMacosSchema.extend({ buildSchemes: z.record(z.string(), PlatformMacosSchema).optional() })) - .describe(desc); -const windowsSchema = z - .optional(PlatformWindowsSchema.extend({ buildSchemes: z.record(z.string(), PlatformWindowsSchema).optional() })) - .describe(desc); -const tizenSchema = z - .optional(PlatformTizenSchema.extend({ buildSchemes: z.record(z.string(), PlatformTizenSchema).optional() })) - .describe(desc); -const webSchema = z - .optional(PlatformWebSchema.extend({ buildSchemes: z.record(z.string(), PlatformWebSchema).optional() })) - .describe(desc); +const tizenSchema = createPlatformSchema( + zodPlatformTizenFragment.merge(zodPlatformWebFragment.merge(zodPlatformWebpackFragment)) +); -const webosSchema = z - .optional(PlatformWebosSchema.extend({ buildSchemes: z.record(z.string(), PlatformWebosSchema).optional() })) - .describe(desc); +const webosSchema = createPlatformSchema( + zodPlatformWebOSFragment.merge(zodPlatformWebFragment.merge(zodPlatformWebpackFragment)) +); -export const PlatformsSchema = z +const webSchema = createPlatformSchema( + zodPlatformWebpackFragment.merge(zodPlatformNextJsFragment.merge(zodPlatformWebFragment)) +); + +const macosSchema = createPlatformSchema( + zodPlatformiOSFragment.merge( + zodPlatformReactNativeFragment.merge(zodTemplateXcodeFragment.merge(zodPlatformElectronFragment)) + ) +); + +const windowsSchema = createPlatformSchema( + zodPlatformElectronFragment.merge(zodPlatformReactNativeFragment.merge(zodPlatformWindowsFragment)) +); + +export const zodPlatformsSchema: AnyZodObject = z .object({ android: androidSchema, androidtv: androidSchema, @@ -94,5 +71,3 @@ export const PlatformsSchema = z xbox: windowsSchema, }) .describe('Object containing platform configurations'); - -export type _PlatformsSchemaType = z.infer; diff --git a/packages/core/src/schema/platforms/ios.ts b/packages/core/src/schema/platforms/ios.ts deleted file mode 100644 index 2bd7b242a8..0000000000 --- a/packages/core/src/schema/platforms/ios.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { z } from 'zod'; -import { PlatformBaseFragment } from './fragments/base'; -import { PlatformiOSFragment } from './fragments/ios'; -import { CommonSchemaFragment } from '../common'; -import { TemplateXcodeFragment } from './fragments/templateXcode'; -import { PlatformReactNativeFragment } from './fragments/reactNative'; - -export const PlatformiOSSchema = z.object({ - ...CommonSchemaFragment, - ...PlatformBaseFragment, - ...PlatformiOSFragment, - ...PlatformReactNativeFragment, - ...TemplateXcodeFragment, -}); diff --git a/packages/core/src/schema/platforms/macos.ts b/packages/core/src/schema/platforms/macos.ts deleted file mode 100644 index 965cd28718..0000000000 --- a/packages/core/src/schema/platforms/macos.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from 'zod'; -import { PlatformBaseFragment } from './fragments/base'; -import { CommonSchemaFragment } from '../common'; -import { PlatformiOSFragment } from './fragments/ios'; -import { PlatformElectronFragment } from './fragments/electron'; -import { TemplateXcodeFragment } from './fragments/templateXcode'; -import { PlatformReactNativeFragment } from './fragments/reactNative'; - -export const PlatformMacosSchema = z.object({ - ...CommonSchemaFragment, - ...PlatformBaseFragment, - ...PlatformiOSFragment, - ...PlatformReactNativeFragment, - ...TemplateXcodeFragment, - ...PlatformElectronFragment, -}); diff --git a/packages/core/src/schema/platforms/tizen.ts b/packages/core/src/schema/platforms/tizen.ts deleted file mode 100644 index f556d91fca..0000000000 --- a/packages/core/src/schema/platforms/tizen.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { z } from 'zod'; -import { PlatformBaseFragment } from './fragments/base'; -import { PlatformTizenFragment } from './fragments/tizen'; -import { CommonSchemaFragment } from '../common'; -import { PlatformWebpackFragment } from './fragments/webpack'; -import { PlatformWebFragment } from './fragments/web'; - -export const PlatformTizenSchema = z.object({ - ...CommonSchemaFragment, - ...PlatformBaseFragment, - ...PlatformTizenFragment, - ...PlatformWebFragment, - ...PlatformWebpackFragment, -}); diff --git a/packages/core/src/schema/platforms/web.ts b/packages/core/src/schema/platforms/web.ts deleted file mode 100644 index a6b8859046..0000000000 --- a/packages/core/src/schema/platforms/web.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { z } from 'zod'; -import { PlatformBaseFragment } from './fragments/base'; -import { PlatformWebpackFragment } from './fragments/webpack'; -import { CommonSchemaFragment } from '../common'; -import { PlatformWebFragment } from './fragments/web'; -import { PlatformNextJsFragment } from './fragments/nextjs'; - -export const PlatformWebSchema = z.object({ - ...CommonSchemaFragment, - ...PlatformBaseFragment, - ...PlatformWebpackFragment, - ...PlatformNextJsFragment, - ...PlatformWebFragment, -}); diff --git a/packages/core/src/schema/platforms/webos.ts b/packages/core/src/schema/platforms/webos.ts deleted file mode 100644 index 3d0bb93674..0000000000 --- a/packages/core/src/schema/platforms/webos.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { z } from 'zod'; -import { PlatformBaseFragment } from './fragments/base'; -import { CommonSchemaFragment } from '../common'; -import { PlatformWebpackFragment } from './fragments/webpack'; -import { PlatformWebFragment } from './fragments/web'; -import { PlatformWebOSFragment } from './fragments/webos'; - -export const PlatformWebosSchema = z.object({ - ...CommonSchemaFragment, - ...PlatformBaseFragment, - ...PlatformWebFragment, - ...PlatformWebpackFragment, - ...PlatformWebOSFragment, -}); diff --git a/packages/core/src/schema/platforms/windows.ts b/packages/core/src/schema/platforms/windows.ts deleted file mode 100644 index 31248a5722..0000000000 --- a/packages/core/src/schema/platforms/windows.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { z } from 'zod'; -import { PlatformBaseFragment } from './fragments/base'; -import { CommonSchemaFragment } from '../common'; -import { PlatformElectronFragment } from './fragments/electron'; -import { PlatformWindowsFragment } from './fragments/windows'; -import { PlatformReactNativeFragment } from './fragments/reactNative'; - -export const PlatformWindowsSchema = z.object({ - ...CommonSchemaFragment, - ...PlatformBaseFragment, - ...PlatformElectronFragment, - ...PlatformReactNativeFragment, - ...PlatformWindowsFragment, -}); diff --git a/packages/core/src/schema/plugins/fragments/base.ts b/packages/core/src/schema/plugins/fragments/base.ts index 513963ab4b..dd8d677dc6 100644 --- a/packages/core/src/schema/plugins/fragments/base.ts +++ b/packages/core/src/schema/plugins/fragments/base.ts @@ -1,69 +1,55 @@ import { z } from 'zod'; +import { zodSupportedPlatforms } from '../../shared'; -const Disabled = z.boolean().default(false).describe('Marks plugin disabled'); - -const Props = z.record(z.string(), z.string()).describe('Custom props passed to plugin'); -const Version = z.string().describe('Version of plugin. Typically package version'); -const Source = z - .string() - .describe( - 'Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}' - ); -const NoNpm = z.boolean().describe('Will skip including plugin in package.json and installing it via npm/yarn etc'); -const SkipMerge = z - .boolean() - .describe( - 'Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully' - ); -const Npm = z - .record(z.string(), z.string()) - .describe('Object of npm dependencies of this plugin. These will be injected into package.json'); -const PluginDependencies = z - .record(z.string(), z.string().nullable()) - .describe('List of other Renative plugins this plugin depends on'); - -const Webpack = z +export const zodPluginBaseFragment = z .object({ - modulePaths: z.union([z.boolean(), z.array(z.string())]).optional(), - moduleAliases: z - .union([ - z.boolean(), - z.record( - z.string(), - z.union([ - z.string(), - z.object({ - projectPath: z.string(), - }), + supportedPlatforms: zodSupportedPlatforms.optional(), + disabled: z.boolean().default(false).describe('Marks plugin disabled'), + props: z.record(z.string(), z.string()).describe('Custom props passed to plugin'), + version: z.string().describe('Version of plugin. Typically package version'), + deprecated: z + .string() + .describe('Marks your plugin deprecated with warning showing in the console during rnv commands'), + source: z + .string() + .describe( + 'Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}' + ), + disableNpm: z + .boolean() + .describe('Will skip including plugin in package.json and installing it via npm/yarn etc'), + skipMerge: z + .boolean() + .describe( + 'Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully' + ), + npm: z + .record(z.string(), z.string()) + .describe('Object of npm dependencies of this plugin. These will be injected into package.json'), //=> npmDependencies + pluginDependencies: z + .record(z.string(), z.string().nullable()) + .describe('List of other Renative plugins this plugin depends on'), + webpackConfig: z + .object({ + modulePaths: z.union([z.boolean(), z.array(z.string())]).optional(), + moduleAliases: z + .union([ + z.boolean(), + z.record( + z.string(), + z.union([ + z.string(), + z.object({ + projectPath: z.string(), + }), + ]) + ), ]) - ), - ]) - .optional(), - nextTranspileModules: z.optional(z.array(z.string())), + .optional(), + nextTranspileModules: z.optional(z.array(z.string())), + }) + .describe('Allows you to configure webpack bahaviour per each individual plugin'), //Should this be at root plugin??? + disablePluginTemplateOverrides: z.boolean().describe('Disables plugin overrides for selected plugin'), + fontSources: z.array(z.string()).optional(), }) - .describe('Allows you to configure webpack bahaviour per each individual plugin'); - -const Deprecated = z - .string() - .describe('Marks your plugin deprecated with warning showing in the console during rnv commands'); - -const DisablePluginTemplateOverrides = z.boolean().describe('Disables plugin overrides for selected plugin'); - -export const PluginBaseFragment = { - disabled: z.optional(Disabled), - props: z.optional(Props), - version: z.optional(Version), - deprecated: z.optional(Deprecated), - source: z.optional(Source), - disableNpm: z.optional(NoNpm), - skipMerge: z.optional(SkipMerge), - npm: z.optional(Npm), //=> npmDependencies - pluginDependencies: z.optional(PluginDependencies), - webpackConfig: z.optional(Webpack), //Should this be at root plugin??? - disablePluginTemplateOverrides: z.optional(DisablePluginTemplateOverrides), - fontSources: z.array(z.string()).optional(), - // 'no-npm': z.optional(NoNpm),//DEPRECATED => disableNpm - // plugins: z.optional(PluginDependencies), //DEPRECATED => pluginDependencies - // webpack: z.optional(Webpack), //Should this be at root plugin??? // DEPRECATED - // 'engine-rn-next': z.optional(Webpack), //Should this be at root plugin??? // DEPRECATED -}; + .partial(); diff --git a/packages/core/src/schema/plugins/fragments/platformAndroid.ts b/packages/core/src/schema/plugins/fragments/platformAndroid.ts index e2d50fd540..dbe7c2a467 100644 --- a/packages/core/src/schema/plugins/fragments/platformAndroid.ts +++ b/packages/core/src/schema/plugins/fragments/platformAndroid.ts @@ -1,11 +1,10 @@ import { z } from 'zod'; -import { TemplateAndroidBaseFragment } from '../../platforms/fragments/templateAndroidBase'; +import { zodTemplateAndroidFragment } from '../../platforms/fragments/templateAndroid'; -export const PluginPlatformAndroidFragment = { +export const zodPluginPlatformAndroidFragment = zodTemplateAndroidFragment.extend({ projectName: z.optional(z.string()), skipLinking: z.optional(z.boolean()), skipImplementation: z.optional(z.boolean()), implementation: z.optional(z.string()), package: z.optional(z.string()), - templateAndroid: z.optional(z.object(TemplateAndroidBaseFragment)), -}; +}); diff --git a/packages/core/src/schema/plugins/fragments/platformBase.ts b/packages/core/src/schema/plugins/fragments/platformBase.ts index efde50d2e8..dd51b316f5 100644 --- a/packages/core/src/schema/plugins/fragments/platformBase.ts +++ b/packages/core/src/schema/plugins/fragments/platformBase.ts @@ -1,21 +1,18 @@ import { z } from 'zod'; -// DEPRECATED? -const Disabled = z.boolean().default(false).describe('Marks plugin platform disabled'); -const ForceLinking = z - .boolean() - .default(false) - .describe( - 'Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true' - ); -const Path = z - .string() - .describe( - 'Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used.' - ); - -export const PluginPlatformBaseFragment = { - disabled: z.optional(Disabled), - forceLinking: z.optional(ForceLinking), - path: z.optional(Path), -}; +export const zodPluginPlatformBaseFragment = z + .object({ + disabled: z.boolean().default(false).describe('Marks plugin platform disabled'), + forceLinking: z + .boolean() + .default(false) + .describe( + 'Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true' + ), + path: z + .string() + .describe( + 'Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used.' + ), + }) + .partial(); diff --git a/packages/core/src/schema/plugins/fragments/platformIos.ts b/packages/core/src/schema/plugins/fragments/platformIos.ts index bbdaeb4c83..950ce646f1 100644 --- a/packages/core/src/schema/plugins/fragments/platformIos.ts +++ b/packages/core/src/schema/plugins/fragments/platformIos.ts @@ -1,22 +1,13 @@ import { z } from 'zod'; -import { TemplateXcodeBaseFragment } from '../../platforms/fragments/templateXcodeBase'; - -const Git = z.string().describe('Alternative git url for pod instead of version'); - -const Commit = z.string().describe('Alternative git commit reference string'); - -const Version = z.string().describe('Version of pod'); - -const BuildType = z.enum(['dynamic', 'static']).describe('Build type of the pod'); - -export const PluginPlatformiOSFragment = { - git: z.optional(Git), - commit: z.optional(Commit), - version: z.optional(Version), - podNames: z.optional(z.array(z.string())), - podName: z.optional(z.string()), - staticFrameworks: z.optional(z.array(z.string())), - templateXcode: z.optional(z.object(TemplateXcodeBaseFragment)), - isStatic: z.boolean().optional(), - buildType: z.optional(BuildType), -}; +import { zodTemplateXcodeFragment } from '../../platforms/fragments/templateXcode'; + +export const zodPluginPlatformiOSFragment = zodTemplateXcodeFragment.extend({ + git: z.string().describe('Alternative git url for pod instead of version'), + commit: z.string().describe('Alternative git commit reference string'), + version: z.string().describe('Version of pod'), + podNames: z.array(z.string()), + podName: z.string(), + staticFrameworks: z.array(z.string()), + isStatic: z.boolean(), + buildType: z.enum(['dynamic', 'static']).describe('Build type of the pod'), +}); diff --git a/packages/core/src/schema/plugins/index.ts b/packages/core/src/schema/plugins/index.ts index 649d021794..6cbc8c302f 100644 --- a/packages/core/src/schema/plugins/index.ts +++ b/packages/core/src/schema/plugins/index.ts @@ -1,63 +1,38 @@ -import { z } from 'zod'; -import { PluginPlatformAndroidFragment } from './fragments/platformAndroid'; -import { PluginPlatformiOSFragment } from './fragments/platformIos'; -import { PluginPlatformBaseFragment } from './fragments/platformBase'; -import { PluginBaseFragment } from './fragments/base'; - -const androidSchema = z - .object({ - ...PluginPlatformBaseFragment, - ...PluginPlatformAndroidFragment, - }) - .optional(); - -const iosSchema = z - .object({ - ...PluginPlatformBaseFragment, - ...PluginPlatformiOSFragment, - }) - .optional(); - -const genericSchema = z - .object({ - ...PluginPlatformBaseFragment, +import { AnyZodObject, z } from 'zod'; +import { zodPluginPlatformAndroidFragment } from './fragments/platformAndroid'; +import { zodPluginPlatformiOSFragment } from './fragments/platformIos'; +import { zodPluginPlatformBaseFragment } from './fragments/platformBase'; +import { zodPluginBaseFragment } from './fragments/base'; + +const zodAndroidSchema = zodPluginPlatformBaseFragment.merge(zodPluginPlatformAndroidFragment); + +const zodIOSSchema = zodPluginPlatformBaseFragment.merge(zodPluginPlatformiOSFragment); + +export const zodPluginSchema: AnyZodObject = zodPluginBaseFragment.merge( + z.object({ + android: zodAndroidSchema, + androidtv: zodAndroidSchema, + androidwear: zodAndroidSchema, + firetv: zodAndroidSchema, + ios: zodIOSSchema, + tvos: zodIOSSchema, + tizen: zodPluginPlatformBaseFragment, + tizenmobile: zodPluginPlatformBaseFragment, + tizenwatch: zodPluginPlatformBaseFragment, + webos: zodPluginPlatformBaseFragment, + web: zodPluginPlatformBaseFragment, + webtv: zodPluginPlatformBaseFragment, + chromecast: zodPluginPlatformBaseFragment, + kaios: zodPluginPlatformBaseFragment, + macos: zodPluginPlatformBaseFragment, + linux: zodPluginPlatformBaseFragment, + windows: zodPluginPlatformBaseFragment, + xbox: zodPluginPlatformBaseFragment, }) - .optional(); - -export const PluginSchema = z.object({ - ...PluginBaseFragment, - android: androidSchema, - androidtv: androidSchema, - androidwear: androidSchema, - firetv: androidSchema, - ios: iosSchema, - tvos: iosSchema, - tizen: genericSchema, - tizenmobile: genericSchema, - tizenwatch: genericSchema, - webos: genericSchema, - web: genericSchema, - webtv: genericSchema, - chromecast: genericSchema, - kaios: genericSchema, - macos: genericSchema, - linux: genericSchema, - windows: genericSchema, - xbox: genericSchema, -}); - -const PluginPlatformMergedSchema = z.object({ - ...PluginPlatformBaseFragment, - ...PluginPlatformiOSFragment, - ...PluginPlatformAndroidFragment, -}); - -export type _PluginPlatformMergedSchemaType = z.infer; - -export type _PluginType = z.infer; +); -export const PluginsSchema = z - .record(z.string(), z.union([PluginSchema, z.string()]).nullable()) +export const zodPluginsSchema = z + .record(z.string(), z.union([zodPluginSchema, z.string()]).nullable()) .describe( 'Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config' ); diff --git a/packages/core/src/schema/shared/index.ts b/packages/core/src/schema/shared/index.ts index a6b97ef388..3ff6555ef3 100644 --- a/packages/core/src/schema/shared/index.ts +++ b/packages/core/src/schema/shared/index.ts @@ -1,37 +1,29 @@ import { z } from 'zod'; -import { SUPPORTED_PLATFORMS } from '../../constants'; +import { RnvPlatforms } from '../../enums/platformName'; -export const Runtime = z +export const zodRuntime = z .any() .describe( 'This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code' ); -export const PlatformsKeys = z.enum(SUPPORTED_PLATFORMS); +export const zodPlatformsKeys = z.enum(RnvPlatforms); -export type _PlatformsKeysType = z.infer; +export const zodSupportedPlatforms = z + .array(zodPlatformsKeys) + .describe('Array list of all supported platforms in current project'); -export const HexColor = z.string().min(4).max(9).regex(/^#/); - -export const Ext = z +export const zodExt = z .any() .describe( 'Object used to extend your renative with custom props. This allows renative json schema to be validated' ); -export const ExtendTemplate = z - .string() - .describe( - 'You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`' - ); - -export const DefaultTargets = z - .record(PlatformsKeys, z.string()) +export const zodDefaultTargets = z + .record(zodPlatformsKeys, z.string()) .describe('Define targets to be used when -t is not set on any project run'); -export const BundleId = z.string().describe('Bundle ID of application. ie: com.example.myapp'); - -export const BuildSchemeFragment = { +export const zodBuildSchemeFragment = z.object({ enabled: z.optional(z.boolean().describe('Defines whether build scheme shows up in options to run')), description: z.optional( z @@ -40,12 +32,14 @@ export const BuildSchemeFragment = { 'Custom description of the buildScheme will be displayed directly in cli if you run rnv with an empty paramener `-s`' ) ), -}; +}); -export const NpmDep = z.record(z.string(), z.string()); +export const zodNpmDep = z.record(z.string(), z.string()); -export const TemplateConfig = z +export const zodTemplateConfigFragment = z .object({ + name: z.string().optional(), + version: z.string().optional(), disabled: z.boolean().optional(), includedPaths: z .array( @@ -54,6 +48,7 @@ export const TemplateConfig = z z.object({ paths: z.array(z.string()), engines: z.array(z.string()).optional(), + platforms: zodSupportedPlatforms.optional(), }), ]) ) @@ -65,19 +60,26 @@ export const TemplateConfig = z $schema: z.string().optional(), extendsTemplate: z.string().optional(), }) - .passthrough() + .optional(), package_json: z.optional( - z - .object({ - dependencies: z.optional(NpmDep), - devDependencies: z.optional(NpmDep), - peerDependencies: z.optional(NpmDep), - optionalDependencies: z.optional(NpmDep), - name: z.string().optional(), - version: z.string().optional(), - }) - .passthrough() + z.object({ + dependencies: z.optional(zodNpmDep), + devDependencies: z.optional(zodNpmDep), + peerDependencies: z.optional(zodNpmDep), + optionalDependencies: z.optional(zodNpmDep), + name: z.string().optional(), + version: z.string().optional(), + }) ), }) .describe('Used in `renative.template.json` allows you to define template behaviour.'); + +export const zodProjectTemplates = z.record( + z.string(), + z.object({ + packageName: z.string().optional(), + description: z.string().optional(), + localPath: z.string().optional(), + }) +); diff --git a/packages/core/src/schema/types.ts b/packages/core/src/schema/types.ts index e4028f68bc..427fc56fbd 100644 --- a/packages/core/src/schema/types.ts +++ b/packages/core/src/schema/types.ts @@ -1,54 +1,224 @@ -import type { _PluginPlatformMergedSchemaType } from './plugins'; -import type { _AppDelegateMethodType } from './platforms/fragments/templateXcodeBase'; -import type { _PlatformsKeysType } from './shared'; -import type { _MergedPlatformObjectType } from './platforms'; -import type { _RootAppBaseSchemalType } from './configFiles/app'; - -import type { _RootProjectBaseSchemaType } from './configFiles/project'; -import type { _AndroidManifestType, _ManifestChildWithChildrenType } from './platforms/fragments/templateAndroidBase'; -import type { _MergedPlatformPrivateObjectType } from './configFiles/private'; -import type { ConfigFileBuildConfig } from './configFiles/buildConfig'; - -//=============================== -// NORMALIZED (MERGED+NORMALIZED) -//=============================== - -export type ConfigProp = _RootProjectBaseSchemaType & - _RootAppBaseSchemalType & - _MergedPlatformPrivateObjectType & - _MergedPlatformObjectType; - +import { z } from 'zod'; +import { zodBuildSchemeFragment, zodTemplateConfigFragment } from './shared'; +import { zodCommonSchemaFragment } from './common'; +import { zodPlatformAndroidFragment } from './platforms/fragments/android'; +import { zodPlatformBaseFragment } from './platforms/fragments/base'; +import { zodPlatformElectronFragment } from './platforms/fragments/electron'; +import { zodPlatformiOSFragment } from './platforms/fragments/ios'; +import { zodPlatformLightningFragment } from './platforms/fragments/lightning'; +import { zodPlatformNextJsFragment } from './platforms/fragments/nextjs'; +import { zodPlatformReactNativeFragment } from './platforms/fragments/reactNative'; +import { + zodAndroidManifest, + zodManifestChildBase, + zodManifestChildWithChildren, + zodTemplateAndroidFragment, +} from './platforms/fragments/templateAndroid'; +import { zodAppDelegateMethod, zodTemplateXcodeFragment } from './platforms/fragments/templateXcode'; +import { zodPlatformTizenFragment } from './platforms/fragments/tizen'; +import { zodPlatformWebFragment } from './platforms/fragments/web'; +import { zodPlatformWebOSFragment } from './platforms/fragments/webos'; +import { zodPlatformWebpackFragment } from './platforms/fragments/webpack'; +import { zodPlatformWindowsFragment } from './platforms/fragments/windows'; +import { zodRootAppBaseFragment } from './configFiles/app'; +import { zodConfigFileEngine } from './configFiles/engine'; +import { zodConfigFileIntergation } from './configFiles/integration'; +import { zodConfigFileLocal } from './configFiles/local'; +import { zodConfigFileOverrides } from './configFiles/overrides'; +import { zodPluginBaseFragment } from './plugins/fragments/base'; +import { zodPluginPlatformAndroidFragment } from './plugins/fragments/platformAndroid'; +import { zodPluginPlatformBaseFragment } from './plugins/fragments/platformBase'; +import { zodPluginPlatformiOSFragment } from './plugins/fragments/platformIos'; +import { zodPluginFragment } from './configFiles/plugin'; +import { zodPrivatePlatformAndroid, zodConfigFilePrivate } from './configFiles/private'; +import { zodConfigFileRuntime } from './configFiles/runtime'; +import { zodConfigTemplateBootstrapConfig } from './configFiles/template'; +import { zodRootProjectBaseFragment } from './configFiles/project'; +import { zodConfigFileTemplates } from './configFiles/templates'; +import { zodConfigFileWorkspace } from './configFiles/workspace'; +import { zodConfigFileWorkspaces } from './configFiles/workspaces'; +import type { RnvPlatformKey } from '../types'; + +// Shared ----------------------- +// +export type RnvBuildSchemeFragment = z.infer; +export type RnvTemplateConfigFragment = z.infer; + +// Common ----------------------- +// +export type RnvCommonSchemaFragment = z.infer; +export type CommonPropKey = keyof RnvCommonSchemaFragment; // We Request keys excluding buildScheme (not RnvCommonSchema) + +export type RnvCommonBuildSchemeSchema = Partial< + RnvCommonSchemaFragment & RnvBuildSchemeFragment & RnvPlatformBaseFragment +>; +export type CommonBuildSchemeKey = keyof RnvCommonBuildSchemeSchema; + +export type RnvCommonSchema = Partial & { + buildSchemes?: Record; +}; + +// Platform ----------------------- +// +export type RnvPlatformAndroidFragment = z.infer; +export type RnvPlatformBaseFragment = z.infer; +export type RnvPlatformElectronFragment = z.infer; +export type RnvPlatformiOSFragment = z.infer; +export type RnvPlatformLightningFragment = z.infer; +export type RnvPlatformNextJsFragment = z.infer; +export type RnvPlatformReactNativeFragment = z.infer; +export type AndroidManifestNode = z.infer; +export type ConfigAndroidManifestChildType = z.infer & { + children?: ConfigAndroidManifestChildType[]; +}; +export type AndroidManifest = z.infer; +export type RnvTemplateAndroidFragment = z.infer; +export type RnvTemplateXcodeFragment = z.infer; +export type ConfigAppDelegateMethod = z.infer; +export type RnvPlatformTizenFragment = z.infer; +export type RnvPlatformWebFragment = z.infer; +export type RnvPlatformWebOSFragment = z.infer; +export type RnvPlatformWebpackFragment = z.infer; +export type RnvPlatformWindowsFragment = z.infer; + +export type RnvPlatformSchemaFragment = RnvCommonSchemaFragment & + RnvPlatformBaseFragment & + RnvPlatformiOSFragment & + RnvPlatformAndroidFragment & + RnvPlatformWebFragment & + RnvPlatformTizenFragment & + RnvPlatformWindowsFragment & + RnvPlatformWebOSFragment & + RnvPlatformLightningFragment & + RnvPlatformReactNativeFragment & + RnvPlatformWebpackFragment & + RnvPlatformElectronFragment & + RnvPlatformNextJsFragment & + RnvTemplateAndroidFragment & + RnvTemplateXcodeFragment; +export type PlatPropKey = keyof RnvPlatformSchemaFragment; // We Request keys excluding buildScheme (not RnvPlatformSchema) + +// export type RnvPlatformsSchema = z.infer; +export type RnvPlatformBuildSchemeSchema = RnvCommonSchemaFragment & RnvBuildSchemeFragment & RnvPlatformSchemaFragment; +export type PlatformBuildSchemeKey = keyof RnvPlatformBuildSchemeSchema; + +export type RnvPlatformSchema = RnvPlatformSchemaFragment & { + buildSchemes?: Record; +}; +export type RnvPlatformsSchema = Partial>; + +// App ----------------------- +// +export type RnvRootAppBaseFragment = z.infer; + +export type RnvRootAppSchema = RnvRootAppBaseFragment & { + common?: RnvCommonSchema; + platforms?: RnvPlatformsSchema; + plugins?: RnvPluginsSchema; +}; +// appConfigs/**/renative.json +export type ConfigFileApp = RnvRootAppSchema; + +// BuildConfig ----------------------- +// +type RootPluginsMerged = { + scopedPluginTemplates: Record; +}; +export type ConfigProp = Required & + Required & + Required & + Required; export type ConfigPropKey = keyof ConfigProp; - -//=============================== -// SUB-TYPES -//=============================== - -export type RenativeConfigPlugin = Exclude; - -export type RenativeConfigPaths = ConfigFileBuildConfig['paths']; - -export type RenativeConfigPluginPlatform = _PluginPlatformMergedSchemaType; - -export type RenativeWebpackConfig = RenativeConfigPlugin['webpackConfig']; - -export type PlatformKey = _PlatformsKeysType; - -export type RenativeConfigRnvTaskName = keyof Required['tasks']>; - -export type RenativeConfigAppDelegateMethod = _AppDelegateMethodType; - -export type AndroidManifestNode = _ManifestChildWithChildrenType; - -export type AndroidManifest = _AndroidManifestType; - -// export type ManifestNode = _ManifestChildType; - -// export const test = (test: _ConfigRootMerged) => { -// console.log(test); - -// const plugin = test.plugins['ss']; -// if (typeof plugin !== 'string') { -// console.log(plugin); -// } -// }; +export type BuildConfigKey = keyof ConfigFileBuildConfig; +// renative.build.json +export type ConfigFileBuildConfig = ConfigFileTemplates & + ConfigFileWorkspace & + RootPluginsMerged & + ConfigFileProject & + ConfigFileLocal & + RnvRootAppBaseFragment; + +// Engine ----------------------- +// +// renative.engine.json +export type ConfigFileEngine = z.infer; + +// Integration ----------------------- +// +// renative.integration.json +export type ConfigFileIntegration = z.infer; + +// Local ----------------------- +// +// renative.local.json +export type ConfigFileLocal = z.infer; + +// Overrides ----------------------- +// +//overrides.json +export type ConfigFileOverrides = z.infer; + +// Plugin ----------------------- +// +export type RnvPluginBaseFragment = z.infer; +export type RnvPluginPlatformAndroidFragment = Partial>; +export type RnvPluginPlatformBaseFragment = Partial>; +export type RnvPluginPlatformiOSFragment = Partial>; +export type RnvPluginPlatformSchema = RnvPluginPlatformBaseFragment & + RnvPluginPlatformAndroidFragment & + RnvPluginPlatformiOSFragment; +export type RnvPluginPlatformsSchema = Record; +export type RnvPluginSchema = RnvPluginBaseFragment & Partial; +export type RnvPluginsSchema = Record; +// renative.plugin.json +export type ConfigFilePlugin = RnvPluginSchema & z.infer; + +// Private ----------------------- +// +export type ConfigPrivatePlatformAndroid = z.infer; +// renative.private.json +export type ConfigFilePrivate = z.infer; + +// Project ----------------------- +// +export type RnvRootProjectBaseFragment = z.infer & { + templateConfig?: RnvTemplateConfigFragment; +}; +export type ConfigProjectPaths = Required['paths']; +// renative.json +export type ConfigFileProject = RnvRootProjectBaseFragment & { + common?: RnvCommonSchema; + platforms?: RnvPlatformsSchema; + plugins?: RnvPluginsSchema; +}; + +// Runtime ----------------------- +// +// renative.runtime.json +export type ConfigFileRuntime = z.infer; + +// Template ----------------------- +// +type ConfigTemplateBootstrapConfig = z.infer; +// renative.template.json +export type ConfigFileTemplate = { + // defaults: RnvDefault, + // engines: z.optional(EnginesSchema), + templateConfig?: RnvTemplateConfigFragment; + bootstrapConfig?: ConfigTemplateBootstrapConfig; +}; + +// Templates ----------------------- +// +// renative.templates.json +export type ConfigFileTemplates = z.infer; + +// Workspace ----------------------- +// +// renative.workspace.json +export type ConfigFileWorkspace = z.infer; + +// Workspaces ----------------------- +// +// renative.workspaces.json +export type ConfigFileWorkspaces = z.infer; diff --git a/packages/core/src/schema/validators.ts b/packages/core/src/schema/validators.ts index 905570753b..e406f4d076 100644 --- a/packages/core/src/schema/validators.ts +++ b/packages/core/src/schema/validators.ts @@ -1,5 +1,5 @@ -import { RootProjectSchema } from './configFiles/project'; +import { zodConfigFileProject } from './configFiles/project'; export const validateRenativeProjectSchema = (inputJson: unknown) => { - return RootProjectSchema.safeParse(inputJson); + return zodConfigFileProject.safeParse(inputJson); }; diff --git a/packages/core/src/sdks/creator.ts b/packages/core/src/sdks/creator.ts new file mode 100644 index 0000000000..6226c84502 --- /dev/null +++ b/packages/core/src/sdks/creator.ts @@ -0,0 +1,8 @@ +import { getContext } from '../context/provider'; +import type { CreateRnvSdkOpts, RnvSdk } from './types'; + +export const createRnvSDK = (opts: CreateRnvSdkOpts) => { + const sdk: RnvSdk = { ...opts, getContext: () => getContext() }; + + return sdk; +}; diff --git a/packages/core/src/sdks/types.ts b/packages/core/src/sdks/types.ts new file mode 100644 index 0000000000..a102bb36eb --- /dev/null +++ b/packages/core/src/sdks/types.ts @@ -0,0 +1,11 @@ +import type { RnvContext } from '../context/types'; +import type { RnvTask } from '../tasks/types'; + +export type CreateRnvSdkOpts = { + tasks: ReadonlyArray>; +}; + +export type RnvSdk = { + tasks: ReadonlyArray>; + getContext: () => RnvContext; +}; diff --git a/packages/core/src/system/__tests__/exec.test.ts b/packages/core/src/system/__tests__/exec.test.ts index 38efc4c2eb..bd2b916eba 100644 --- a/packages/core/src/system/__tests__/exec.test.ts +++ b/packages/core/src/system/__tests__/exec.test.ts @@ -1,43 +1,70 @@ -import { createRnvApi } from '../../api'; -import { createRnvContext } from '../../context'; +import { generateApiDefaults } from '../../api/defaults'; +import { getApi } from '../../api/provider'; +import { generateContextDefaults } from '../../context/defaults'; +import { getContext } from '../../context/provider'; import { executeAsync, commandExistsSync, commandExists } from '../../system/exec'; jest.mock('../../logger'); +jest.mock('../../context/provider'); +jest.mock('../../api/provider'); -describe('Testing exec functions', () => { - beforeAll(() => { - createRnvContext(); - createRnvApi(); - }); +beforeEach(() => { + // NOTE: do not call createRnvContext() in core library itself + jest.mocked(getApi).mockReturnValue(generateApiDefaults()); +}); +afterEach(() => { + jest.resetAllMocks(); +}); + +describe('Testing exec functions', () => { it('should execute command', async () => { + // GIVEN + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); + // jest.mocked(spinner) expect.assertions(1); + // WHEN // THEN await expect(executeAsync('node -v').then((data) => typeof data)).resolves.toBe('string'); }); it('should execute array command', async () => { + // GIVEN + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); expect.assertions(1); + // WHEN // THEN await expect(executeAsync(['node', '-v']).then((data) => typeof data)).resolves.toBe('string'); }); it('should execute command with privateParams', async () => { + // GIVEN + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); expect.assertions(1); + // WHEN // THEN await expect( executeAsync('node -v 1234', { privateParams: ['1234'] }).then((data) => typeof data) ).resolves.toBe('string'); }); it('should execute with error', async () => { + // GIVEN + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); expect.assertions(1); + // WHEN // THEN await expect(executeAsync('shouldTrow')).rejects.toBeDefined(); }); it('should recognize command sync', () => { + // GIVEN + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); + // WHEN // THEN expect(commandExistsSync('node')).toBe(true); }); it('should recognize command async', async () => { + // GIVEN + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); expect.assertions(1); + // WHEN // THEN await expect(commandExists('node')).resolves.toBe('node'); }); }); diff --git a/packages/core/src/system/__tests__/fs.test.ts b/packages/core/src/system/__tests__/fs.test.ts index a74b63a0e4..b056405c5d 100644 --- a/packages/core/src/system/__tests__/fs.test.ts +++ b/packages/core/src/system/__tests__/fs.test.ts @@ -5,12 +5,12 @@ import { generateContextDefaults } from '../../context/defaults'; jest.mock('../../logger'); jest.mock('../../context/provider'); -beforeAll(() => { - // Before all placeholder +beforeEach(() => { + // NOTE: do not call createRnvContext() in core library itself }); afterEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); describe('sanitizeDynamicProps', () => { diff --git a/packages/core/src/system/exec.ts b/packages/core/src/system/exec.ts index bc8a04d6e2..272ec4acea 100755 --- a/packages/core/src/system/exec.ts +++ b/packages/core/src/system/exec.ts @@ -87,8 +87,8 @@ const _execute = (c: RnvContext, command: string | Array, opts: ExecOpti localDir: path.resolve('./node_modules/.bin'), preferLocal: true, all: true, - maxErrorLength: c.program?.maxErrorLength, - mono: c.program?.mono || c.program?.json, + maxErrorLength: c.program?.opts().maxErrorLength, + mono: c.program?.opts().mono || c.program?.opts().json, }; const blue2 = chalk().rgb(50, 50, 255).bold; @@ -96,7 +96,7 @@ const _execute = (c: RnvContext, command: string | Array, opts: ExecOpti const mergedOpts = { ...defaultOpts, ...opts }; const printableEnv = - opts.env && (c.program.info || c.program.printExec) + opts.env && (c.program.opts().info || c.program.opts().printExec) ? Object.keys(opts.env) .map((k) => `${k}=${opts?.env?.[k]}`) .join(' ') @@ -121,7 +121,7 @@ const _execute = (c: RnvContext, command: string | Array, opts: ExecOpti logMessage = replaceOverridesInString(commandAsString, privateParams, privateMask); } - if (c.program.printExec) { + if (c.program.opts().printExec) { let logMsg = printableEnv ? `${chalk().grey(printableEnv)} ${logMessage}` : logMessage; if (opts.cwd) { logMsg = `cd ${opts.cwd} ${chalk().cyan('&&')} ${logMsg}`; @@ -177,7 +177,7 @@ const _execute = (c: RnvContext, command: string | Array, opts: ExecOpti } }; - if (c.program?.info && child?.stdout?.pipe) { + if (c.program?.opts().info && child?.stdout?.pipe) { child.stdout.pipe(process.stdout); } else if (spinner && child?.stdout?.on) { child.stdout.on('data', printLastLine); @@ -584,7 +584,7 @@ export const waitForExecCLI = async ( let attempts = 0; const maxAttempts = 30; const CHECK_INTEVAL = 2000; - const { maxErrorLength } = c.program; + const { maxErrorLength } = c.program.opts(); const spinner = getApi().spinner('Waiting for emulator to boot...').start(''); return new Promise((resolve, reject) => { diff --git a/packages/core/src/system/fs.ts b/packages/core/src/system/fs.ts index c548c5f966..bd5207c509 100755 --- a/packages/core/src/system/fs.ts +++ b/packages/core/src/system/fs.ts @@ -221,14 +221,14 @@ export const copyFileWithInjectSync = ( } }; -export const invalidatePodsChecksum = () => { - const c = getContext(); - const appFolder = path.join(c.paths.project.builds.dir, `${c.runtime.appId}_${c.platform}`); - const podChecksumPath = path.join(appFolder, 'Podfile.checksum'); - if (fs.existsSync(podChecksumPath)) { - fs.unlinkSync(podChecksumPath); - } -}; +// export const invalidatePodsChecksum = () => { +// const c = getContext(); +// const appFolder = path.join(c.paths.project.builds.dir, `${c.runtime.appId}_${c.platform}`); +// const podChecksumPath = path.join(appFolder, 'Podfile.checksum'); +// if (fs.existsSync(podChecksumPath)) { +// fs.unlinkSync(podChecksumPath); +// } +// }; export const copyFolderRecursiveSync = ( source: string, @@ -550,13 +550,15 @@ export const getRealPath = (p: string | undefined, key = 'undefined', original?: return path.join(c.paths.project.dir, p); } const output = p + // TODO: deprecate this path .replace(/\$RNV_HOME/g, c.paths.rnv.dir) - .replace(/~/g, c.paths.home.dir) - .replace(/\$USER_HOME/g, c.paths.home.dir) + .replace(/~/g, c.paths.user.homeDir) + .replace(/\$USER_HOME/g, c.paths.user.homeDir) .replace(/\$PROJECT_HOME/g, c.paths.project.dir) .replace(/\$WORKSPACE_HOME/g, c.paths.workspace.dir) + // TODO: deprecate this path .replace(/RNV_HOME/g, c.paths.rnv.dir) - .replace(/USER_HOME/g, c.paths.home.dir) + .replace(/USER_HOME/g, c.paths.user.homeDir) .replace(/PROJECT_HOME/g, c.paths.project.dir); return output; }; @@ -775,8 +777,7 @@ export const loadFile = >( return fileObj[key]; } catch (e) { - logError(`loadFile: ${pathObj[key]} :: ${e}`, true); // crash if there's an error in the config file - return false; + throw new Error(`loadFile: ${pathObj[key]} :: ${e}`); // crash if there's an error in the config file } }; diff --git a/packages/core/src/system/resolve.ts b/packages/core/src/system/resolve.ts index d831bbb530..b2e4180152 100644 --- a/packages/core/src/system/resolve.ts +++ b/packages/core/src/system/resolve.ts @@ -26,6 +26,7 @@ export const doResolve: DoResolveFn = (aPath, mandatory = true, options = {}) => return _withPathFix(_doResolveFSPath(aPath, options), options?.forceForwardPaths); } const pth = _doResolveExternalPackage(aPath, options); + if (pth) { return _withPathFix(pth, options?.forceForwardPaths); } @@ -122,7 +123,6 @@ const _doResolveFSPath = (aPath: string, options: ResolveOptions) => { */ const _doResolveExternalPackage = (aPath: string, options: ResolveOptions) => { const [packageBase, packageSuffix] = _getPackagePathParts(aPath); - try { const resolvedPath = resolve .sync(packageBase, { @@ -136,6 +136,15 @@ const _doResolveExternalPackage = (aPath: string, options: ResolveOptions) => { .replace(/(\\|\/)package.json$/, ''); return options.keepSuffix ?? false ? `${resolvedPath}/${packageSuffix}` : resolvedPath; } catch (e) { + try { + //Last resort we try to resolve it as standard require.resolve + const fallback = require.resolve(aPath); + if (fallback) { + return fallback.replace(/(\\|\/)package.json$/, '').replace(/(\\|\/)index.js$/, ''); + } + } catch (e) { + return null; + } return null; } }; diff --git a/packages/core/src/tasks/__tests__/index.test.ts b/packages/core/src/tasks/__tests__/index.test.ts deleted file mode 100644 index 497a19115c..0000000000 --- a/packages/core/src/tasks/__tests__/index.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { getAllSuitableTasks } from '..'; -import { createRnvContext } from '@rnv/core'; -import { getRegisteredEngines } from '../../engines'; -import { RnvEngine } from '../../engines/types'; -import { DEFAULT_TASK_DESCRIPTIONS } from '../constants'; - -jest.mock('../../engines'); -jest.mock('chalk'); -jest.mock('../../logger'); -jest.mock('../../api'); -jest.mock('../constants', () => ({ DEFAULT_TASK_DESCRIPTIONS: {} })); - -beforeEach(() => { - createRnvContext(); -}); - -afterEach(() => { - jest.resetAllMocks(); -}); - -const ENGINE_MOCK_PROPS = { - platforms: {}, - config: { - id: '', - engineExtension: '', - overview: '', - }, - projectDirName: '', - runtimeExtraProps: {}, - serverDirName: '', -}; - -const rnvEngineMock1: RnvEngine = { - ...ENGINE_MOCK_PROPS, - tasks: { - ['mock-task']: { - description: 'mock task 1', - task: 'mock-task', - options: [], - platforms: [], - }, - }, -}; - -const rnvEngineMock2: RnvEngine = { - ...ENGINE_MOCK_PROPS, - tasks: { - //NOTE: order of task here is IMPORTANT - ['mock-task-2']: { - description: 'mock task 2', - task: 'mock-task-2', - options: [], - platforms: [], - }, - ['mock-task']: { - description: 'mock task 1', - task: 'mock-task', - options: [], - platforms: [], - }, - }, -}; - -describe('Get suitable tasks', () => { - it('should return all tasks for given 1 engine', () => { - // GIVEN - // const c = getContext(); - jest.mocked(getRegisteredEngines).mockReturnValue([rnvEngineMock1]); - // WHEN - const result = getAllSuitableTasks(); - // THEN - expect(Object.keys(result)).toEqual(['mock-task']); - expect(result['mock-task'].description).toEqual('mock task 1'); - }); - - it('should return common description for tasks from 2 different engines but same name', () => { - // GIVEN - // const c = getContext(); - jest.mocked(getRegisteredEngines).mockReturnValue([rnvEngineMock1, rnvEngineMock2]); - DEFAULT_TASK_DESCRIPTIONS['mock-task'] = 'mock task common'; - - // WHEN - const result = getAllSuitableTasks(); - // THEN - expect(Object.keys(result)).toEqual(['mock-task', 'mock-task-2']); - expect(result['mock-task'].description).toEqual('mock task common'); - }); - - it('should return first task description for tasks from 2 different engines but same name if common desc not available', () => { - // GIVEN - // const c = getContext(); - jest.mocked(getRegisteredEngines).mockReturnValue([rnvEngineMock2, rnvEngineMock1]); - delete DEFAULT_TASK_DESCRIPTIONS['mock-task']; - // WHEN - const result = getAllSuitableTasks(); - // THEN - expect(Object.keys(result)).toEqual(['mock-task-2', 'mock-task']); - expect(result['mock-task'].description).toEqual('mock task 1'); - }); -}); diff --git a/packages/core/src/tasks/__tests__/taskFinder.test.ts b/packages/core/src/tasks/__tests__/taskFinder.test.ts new file mode 100644 index 0000000000..1b4e4cecf6 --- /dev/null +++ b/packages/core/src/tasks/__tests__/taskFinder.test.ts @@ -0,0 +1,83 @@ +import { findSuitableTask } from '../taskFinder'; +import { getContext } from '../../context/provider'; +import { generateContextDefaults } from '../../context/defaults'; +import { getTaskNameFromCommand } from '../taskHelpers'; +import { getRegisteredTasks } from '../taskRegistry'; +import { RnvTaskMap } from '../types'; +import { inquirerPrompt } from '../../api'; + +jest.mock('../taskHelpers'); +jest.mock('../taskRegistry'); +jest.mock('chalk'); +jest.mock('../../logger'); +jest.mock('../../context/provider'); +jest.mock('../../api'); + +beforeEach(() => { + // NOTE: do not call createRnvContext() in core library itself +}); + +afterEach(() => { + jest.resetAllMocks(); +}); + +const MOCK_TASKS: RnvTaskMap = { + ['en1::mock-task']: { + description: 'mock task 1 with ios', + task: 'mock-task', + platforms: ['ios'], + options: [], + }, + ['en1::mock-task-2']: { + description: 'mock task 2', + task: 'mock-task-2', + options: [], + }, + ['en2::mock-task']: { + description: 'mock task 1 with android', + task: 'mock-task', + platforms: ['android'], + options: [], + }, +}; + +describe('Get suitable tasks', () => { + it('should return matching task for matching command', async () => { + // GIVEN + jest.mocked(getTaskNameFromCommand).mockReturnValue('mock-task-2'); + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); + jest.mocked(getRegisteredTasks).mockReturnValue({ ...MOCK_TASKS }); + // WHEN + const result = await findSuitableTask(); + // THEN + expect(result?.description).toEqual('mock task 2'); + }); + + it('should return matching task filtered by command and platform out of 2 conflicting ones', async () => { + // GIVEN + jest.mocked(getTaskNameFromCommand).mockReturnValue('mock-task'); + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); + const ctx = getContext(); + ctx.platform = 'ios'; + jest.mocked(getRegisteredTasks).mockReturnValue({ ...MOCK_TASKS }); + // WHEN + const result = await findSuitableTask(); + // THEN + expect(result?.description).toEqual('mock task 1 with ios'); + }); + + it('should trigger inquirer if result is more than 1 task available', async () => { + // GIVEN + jest.mocked(getTaskNameFromCommand).mockReturnValue('mock-task'); + jest.mocked(getContext).mockReturnValue(generateContextDefaults()); + jest.mocked(inquirerPrompt).mockResolvedValue({ result: MOCK_TASKS['en1::mock-task'] }); + const ctx = getContext(); + ctx.platform = null; + jest.mocked(getRegisteredTasks).mockReturnValue({ ...MOCK_TASKS }); + // WHEN + const result = await findSuitableTask(); + // THEN + expect(inquirerPrompt).toHaveBeenCalledTimes(1); + expect(result).toEqual(MOCK_TASKS['en1::mock-task']); + }); +}); diff --git a/packages/core/src/tasks/constants.ts b/packages/core/src/tasks/constants.ts index 8eaf5166fc..c20fae2156 100644 --- a/packages/core/src/tasks/constants.ts +++ b/packages/core/src/tasks/constants.ts @@ -10,137 +10,184 @@ export const DEFAULT_TASK_DESCRIPTIONS: Record = { [RnvTaskName.export]: 'Export the app into deployable binary', }; -export const RnvTaskOptions: Record = { +const _RnvTaskOptions = { + // CORE -------------------------------- + help: { + key: 'help', + shortcut: 'h', + description: 'Displays help info for particular command', + }, info: { + key: 'info', shortcut: 'i', isValueType: true, description: 'Show full debug Info', }, printExec: { + key: 'print-exec', description: 'Print exec commands in full', }, - updatePods: { - shortcut: 'u', - description: 'Force update dependencies (iOS only)', - }, platform: { + key: 'platform', shortcut: 'p', isValueType: true, description: 'select specific Platform', }, - appConfigID: { - shortcut: 'c', + skipTasks: { + key: 'skip-tasks', isValueType: true, - description: 'select specific app Config id', + isRequired: true, + description: 'List tasks which you want to skip during rnv execution', + examples: ['--skipTasks "configure,export"', '--skipTasks deploy'], }, - target: { - shortcut: 't', - isValueType: true, - description: 'select specific Target device/simulator', + only: { + key: 'only', + shortcut: 'o', + description: 'run Only top command (Skip dependencies)', }, - projectName: { - isValueType: true, - description: 'select the name of the new project', + ci: { + key: 'ci', + description: 'CI/CD flag so it wont ask questions', }, - projectTemplate: { - isValueType: true, - description: 'select the template of new project', + mono: { + key: 'mono', + description: 'Monochrome console output without chalk', }, - templateVersion: { + maxErrorLength: { + key: 'max-error-length', isValueType: true, - description: 'select the template version', + isRequired: true, + description: 'Specify how many characters each error should display. Default 200', }, - title: { - isValueType: true, - description: 'select the title of the app', + json: { + key: 'json', + description: 'Outputs the result as json', }, - id: { - isValueType: true, - description: 'select the id of the app', + yes: { + key: 'yes', + description: 'Default all prompts to yes', }, - appVersion: { - isValueType: true, - description: 'select the version of the app', + telemetryDebug: { + key: 'telemetry-debug', + description: 'If you have telemetry enabled, will print out exactly what is being collected into the console', }, - workspace: { + // OTHERS 1st -------------------------------- + // Still present in core + packageManager: { + key: 'package-manager', isValueType: true, - description: 'select the workspace for the new project', + isRequired: true, + options: ['yarn', 'npm'], + description: 'Set specific package manager to use', + examples: ['--packageManager yarn', '--packageManager npm'], }, - template: { - shortcut: 'T', + npxMode: { + key: 'npx-mode', + description: 'Ensures you can use local npx rnv version after the command is done', + }, + unlinked: { + key: 'unlinked', + description: 'Force engines to be loaded from node_modules rather than locally', + }, + configName: { + key: 'config-name', isValueType: true, isRequired: true, - description: 'select specific template', + description: 'Use custom name for ./renative.json. (applies only at root level)', }, - device: { - shortcut: 'd', + skipDependencyCheck: { + key: 'skip-dependency-check', + description: 'Skips auto update of npm dependencies if mismatch found', + }, + appConfigID: { + key: 'app-config-id', + shortcut: 'c', isValueType: true, - description: 'select connected Device', + description: 'select specific app Config id', + }, + skipRnvCheck: { + key: 'skip-rnv-check', + description: 'Skips auto update of rnv dependencies if mismatch found', }, scheme: { + key: 'scheme', shortcut: 's', isValueType: true, description: 'select build Scheme', }, - filter: { - shortcut: 'f', + engine: { + key: 'engine', + shortcut: 'e', isValueType: true, isRequired: true, - description: 'Filter value', + description: 'engine to be used ie "engine-rn"', }, - list: { - shortcut: 'l', - description: 'return List of items related to command', - }, - only: { - shortcut: 'o', - description: 'run Only top command (Skip dependencies)', + exeMethod: { + key: 'exe-method', + shortcut: 'x', + isValueType: true, + description: 'eXecutable method in buildHooks', }, reset: { + key: 'reset', shortcut: 'r', description: 'also perform reset of platform build', }, resetHard: { + key: 'reset-hard', shortcut: 'R', description: 'also perform reset of platform platform and platform assets', }, resetAssets: { + key: 'reset-assets', shortcut: 'a', description: 'also perform reset of platform assets', }, - key: { - shortcut: 'k', + hooks: { + key: 'hooks', + description: 'Force rebuild hooks', + }, + // OTHERS 2nd -------------------------------- + // Still present in core but ONLY in runtime defaults + hostIp: { + key: 'host-ip', isValueType: true, isRequired: true, - description: 'Pass the key/password', + description: 'Custom IP override', }, - blueprint: { - shortcut: 'b', + target: { + key: 'target', + shortcut: 't', isValueType: true, - description: 'Blueprint for targets', - }, - help: { - shortcut: 'h', - description: 'Displays help info for particular command', + description: 'select specific Target device/simulator', }, host: { + key: 'host', shortcut: 'H', isValueType: true, isRequired: true, description: 'custom Host ip', }, - exeMethod: { - shortcut: 'x', - isValueType: true, - description: 'eXecutable method in buildHooks', - }, port: { + key: 'port', shortcut: 'P', isValueType: true, isRequired: true, description: 'custom Port', }, + hosted: { + key: 'hosted', + description: 'Run in a hosted environment (skip budleAssets)', + }, + // SDK-WEBPACK -------------------------------- + debugIp: { + key: 'debug-ip', + isValueType: true, + isRequired: true, + description: '(optional) overwrite the ip to which the remote debugger will connect', + }, debug: { + key: 'debug', shortcut: 'D', isValueType: true, description: 'enable or disable remote debugger.', @@ -151,168 +198,62 @@ export const RnvTaskOptions: Record = { '--debug //run remote debug with default preference (chii)', ], }, - global: { - shortcut: 'G', - description: 'Flag for setting a config value for all RNV projects', - }, - engine: { - shortcut: 'e', - isValueType: true, - isRequired: true, - description: 'engine to be used (next)', - }, - debugIp: { - isValueType: true, - isRequired: true, - description: '(optional) overwrite the ip to which the remote debugger will connect', - }, - ci: { - description: 'CI/CD flag so it wont ask questions', - }, - mono: { - description: 'Monochrome console output without chalk', - }, - skipNotifications: { - description: 'Skip sending any integrated notifications', - }, - keychain: { - isValueType: true, - isRequired: true, - description: 'Name of the keychain', - }, - provisioningStyle: { - isValueType: true, - isRequired: true, - description: 'Set provisioningStyle (Automatic | Manual)', - }, - codeSignIdentity: { - isValueType: true, - isRequired: true, - description: 'Set codeSignIdentity (ie iPhone Distribution)', - }, - provisionProfileSpecifier: { - isValueType: true, - isRequired: true, - description: 'Name of provisionProfile', - }, - hosted: { - description: 'Run in a hosted environment (skip budleAssets)', - }, - hooks: { - description: 'Force rebuild hooks', - }, - maxErrorLength: { - isValueType: true, - isRequired: true, - description: 'Specify how many characters each error should display. Default 200', - }, + // SDK-APPLE + SDK-ANDROID -------------------------------- skipTargetCheck: { + key: 'skip-target-check', description: 'Skip Android target check, just display the raw adb devices to choose from', }, - analyzer: { - description: 'Enable real-time bundle analyzer', - }, - xcodebuildArgs: { - isValueType: true, - isRequired: true, - description: 'pass down custom xcodebuild arguments', - }, - xcodebuildArchiveArgs: { - isValueType: true, - isRequired: true, - description: 'pass down custom xcodebuild arguments', - }, - xcodebuildExportArgs: { - isValueType: true, - isRequired: true, - description: 'pass down custom xcodebuild arguments', - }, - skipDependencyCheck: { - description: 'Skips auto update of npm dependencies if mismatch found', - }, - skipRnvCheck: { - description: 'Skips auto update of rnv dependencies if mismatch found', - }, - configName: { - isValueType: true, - isRequired: true, - description: 'Use custom name for ./renative.json. (applies only at root level)', - }, - sourceAppConfigID: { - isValueType: true, - isRequired: true, - description: 'name of source appConfig folder to copy from', - }, - hostIp: { - isValueType: true, - isRequired: true, - description: 'Custom IP override', - }, - unlinked: { - description: 'Force engines to be loaded from node_modules rather than locally', - }, - yes: { - description: 'Default all prompts to yes', - }, - gitEnabled: { - description: 'Enable git in your newly created project', - isValueType: true, - }, - npxMode: { - description: 'Ensures you can use local npx rnv version after the command is done', - }, - json: { - description: 'Outputs the result as json', - }, - packageManager: { - isValueType: true, - isRequired: true, - options: ['yarn', 'npm'], - description: 'Set specific package manager to use', - examples: ['--packageManager yarn', '--packageManager npm'], - }, - skipTasks: { + filter: { + key: 'filter', + shortcut: 'f', isValueType: true, isRequired: true, - description: 'List tasks which you want to skip during rnv execution', - examples: ['--skipTasks "configure,export"', '--skipTasks deploy'], + description: 'Filter value', }, - answer: { + device: { + key: 'device', + shortcut: 'd', isValueType: true, - isVariadic: true, - description: 'Pass in answers to prompts', - examples: ['--answer question=response question2=response2', '--answer question=\'{"some": "json"}\''], + description: 'select connected Device', }, + // SDK-ANDROID -------------------------------- resetAdb: { + key: 'reset-adb', description: 'Forces to reset android adb', }, - telemetryDebug: { - description: 'If you have telemetry enabled, will print out exactly what is being collected into the console', - }, }; -type ParamKeysType = typeof RnvTaskOptions; +export type ProgramOptionsKey = keyof typeof _RnvTaskOptions; -type ProgramOptionsKey = keyof ParamKeysType; +export const RnvTaskOptions = _RnvTaskOptions as Record; //TODO: make this properly typed. Pass integration type to getContext? type ParamType = any; //boolean | string | undefined -export type ParamKeys = Partial>; +export type ParamKeys = Partial< + Record +>; (Object.keys(RnvTaskOptions) as ProgramOptionsKey[]).forEach((k) => { RnvTaskOptions[k].key = k; }); -export const RnvTaskOptionPresets = { - withBase: (arr?: Array) => +export const RnvTaskCoreOptionPresets = { + withCore: (arr?: Array) => [ + RnvTaskOptions.platform, // platform is necessary to be accepted as base for the `rnv` command to work with enginie plugins RnvTaskOptions.info, RnvTaskOptions.ci, RnvTaskOptions.mono, RnvTaskOptions.maxErrorLength, RnvTaskOptions.only, + RnvTaskOptions.yes, + RnvTaskOptions.help, + RnvTaskOptions.printExec, ].concat(arr || []), +}; + +export const RnvTaskOptionPresets = { withConfigure: (arr?: Array) => [ RnvTaskOptions.reset, @@ -321,7 +262,8 @@ export const RnvTaskOptionPresets = { RnvTaskOptions.resetAssets, RnvTaskOptions.appConfigID, RnvTaskOptions.scheme, - RnvTaskOptions.platform, + RnvTaskOptions.packageManager, + // RnvTaskOptions.platform, ].concat(arr || []), withRun: (arr?: Array) => [ @@ -329,7 +271,7 @@ export const RnvTaskOptionPresets = { RnvTaskOptions.device, RnvTaskOptions.hosted, RnvTaskOptions.port, - RnvTaskOptions.debug, + // RnvTaskOptions.debug, RnvTaskOptions.debugIp, RnvTaskOptions.skipTargetCheck, RnvTaskOptions.host, diff --git a/packages/core/src/tasks/creators.ts b/packages/core/src/tasks/creators.ts new file mode 100644 index 0000000000..92fe806375 --- /dev/null +++ b/packages/core/src/tasks/creators.ts @@ -0,0 +1,11 @@ +import { CreateRnvTaskOpt, RnvTask } from './types'; + +export const createTask = (task: CreateRnvTaskOpt) => { + const response: RnvTask = { ...task, key: 'unknown', ownerID: 'unknown' }; + + return response; +}; + +export const createTaskOptionsMap = () => { + // TODO +}; diff --git a/packages/core/src/tasks/index.ts b/packages/core/src/tasks/index.ts deleted file mode 100644 index 0d6c48f6f7..0000000000 --- a/packages/core/src/tasks/index.ts +++ /dev/null @@ -1,591 +0,0 @@ -import { logDefault, logInitTask, logExitTask, chalk, logRaw, logInfo, logWarning } from '../logger'; -import { executePipe } from '../buildHooks'; -import { - getEngineRunner, - getEngineTask, - getRegisteredEngines, - hasEngineTask, - getEngineSubTasks, - registerAllPlatformEngines, -} from '../engines'; -import type { RnvContext } from '../context/types'; -import type { RnvTask, RnvTaskMap, RnvTaskOption, TaskItemMap, TaskObj, TaskPromptOption } from './types'; -import type { RnvEngine } from '../engines/types'; -import { inquirerPrompt, inquirerSeparator, pressAnyKeyToContinue } from '../api'; -import { getApi } from '../api/provider'; -import type { PlatformKey, RenativeConfigRnvTaskName } from '../schema/types'; -import { checkIfProjectAndNodeModulesExists } from '../projects/dependencyManager'; -import { DEFAULT_TASK_DESCRIPTIONS } from './constants'; -import { getContext } from '../context/provider'; - -let executedTasks: Record = {}; - -const CUSTOM_TASKS: RnvTaskMap = {}; - -export const registerCustomTask = async (task: RnvTask) => { - if (task.task) { - CUSTOM_TASKS[task.task] = task; - } -}; - -export const initializeTask = async (task: string) => { - logDefault('initializeTask', task); - const c = getContext(); - - logInfo( - `Current engine: ${chalk().bold(c.runtime.engine?.config.id)} ${chalk().grey( - `(${c.runtime.engine?.rootPath})` - )}` - ); - c.runtime.task = task; - executedTasks = {}; - - getApi().analytics.captureEvent({ - type: task, - platform: c.platform, - }); - - await executeTask(task, undefined, task, true); - return true; -}; - -const _getTaskOption = ({ taskInstance }: TaskObj, provider?: string): TaskPromptOption => { - const asArray = taskInstance.task.split(' '); - const output: TaskPromptOption = { - value: taskInstance.task, - command: '', - name: '', - asArray, - isPriorityOrder: taskInstance.isPriorityOrder, - description: taskInstance.description, - isGlobalScope: taskInstance.isGlobalScope, - isPrivate: taskInstance.isPrivate, - params: taskInstance.options, - providers: [], - }; - - if (taskInstance.description && taskInstance.description !== '') { - output.description = taskInstance.description; - output.name = `${taskInstance.task} ${chalk().grey(`(${taskInstance.description})`)}`; - } else { - output.name = taskInstance.task; - } - output.command = asArray[0]; - output.subCommand = asArray[1]; // TODO don't treat options like --myopt as subcommands - - if (provider) { - output.providers.push(provider); - } - - return output; -}; - -const _getTaskObj = (taskInstance: RnvTask) => { - const key = taskInstance.task; - const taskNameArr = key.split(' '); - let parent: null | string = null; - if (taskNameArr.length > 1) { - taskNameArr.pop(); - parent = taskNameArr.join(' '); - } - - return { - key, - taskInstance, - parent, - }; -}; - -export const getAllSuitableTasks = (): Record => { - const REGISTERED_ENGINES = getRegisteredEngines(); - const suitableTasks: Record = {}; - - REGISTERED_ENGINES.forEach((engine) => { - Object.values(engine.tasks).forEach((taskInstance) => { - let taskObj: TaskPromptOption = _getTaskOption(_getTaskObj(taskInstance), engine?.config?.id); - if (!suitableTasks[taskObj.value]) { - suitableTasks[taskObj.value] = taskObj; - } else { - // In case of multiple competing tasks (same task name but coming from different engines) - taskObj = suitableTasks[taskObj.value]; - // We try to revert to generic description instead. - taskObj.description = DEFAULT_TASK_DESCRIPTIONS[taskObj.value] || taskObj.description; - // In case of multiple competing tasks we assume they are "commonly used" - taskObj.isPriorityOrder = true; - taskObj.providers.push(engine?.config?.id); - } - }); - }); - Object.values(CUSTOM_TASKS).forEach((taskInstance) => { - const taskObj = _getTaskOption(_getTaskObj(taskInstance), 'custom'); - suitableTasks[taskObj.value] = taskObj; - }); - // TODO: handle integration cli options - - return suitableTasks; -}; - -export const findSuitableGlobalTask = async () => { - const c = getContext(); - if (!c.command) return undefined; - let task = ''; - - if (c.command) task = c.command; - if (c.subCommand) task += ` ${c.subCommand}`; - - c.runtime.engine = getEngineRunner(task, undefined, false); - - const tsk = getEngineTask(task, c.runtime.engine?.tasks); - - return tsk; -}; - -export const findSuitableTask = async (specificTask?: string): Promise => { - logDefault('findSuitableTask'); - const c = getContext(); - - const REGISTERED_ENGINES = getRegisteredEngines(); - let task = ''; - if (!specificTask) { - if (!c.command) { - const suitableTasks = getAllSuitableTasks(); - - const taskInstances = Object.values(suitableTasks); - let tasks: TaskPromptOption[]; - - let defaultCmd: string | undefined = 'new'; - let addendum = ''; - if (!c.paths.project.configExists) { - tasks = taskInstances.filter((v) => v.isGlobalScope && !v.isPrivate).sort(); - addendum = ' (Not a ReNative project. options will be limited)'; - } else { - tasks = taskInstances.filter((v) => !v.isPrivate).sort(); - defaultCmd = tasks.find((v) => v.value === 'run')?.name; - } - - const commonTasks: TaskPromptOption[] = []; - const ungroupedTasks: TaskPromptOption[] = []; - const groupedTasks: TaskPromptOption[] = []; - const taskGroups: Record = {}; - tasks.forEach((task) => { - if (task.subCommand) { - if (!taskGroups[task.command]) { - const groupTask: TaskPromptOption = { - name: `${task.command}...`, - command: task.command, - value: task.command, - providers: [], - }; - taskGroups[task.command] = groupTask; - groupedTasks.push(groupTask); - } - } else if (task.isPriorityOrder) { - commonTasks.push(task); - } else { - ungroupedTasks.push(task); - } - }); - - const mergedTasks = [ - inquirerSeparator('─────────── Common tasks ───────────'), - ...commonTasks, - inquirerSeparator('─────────── More tasks ─────────────'), - ...ungroupedTasks, - ...groupedTasks, - ]; - - const { selectedTask } = await inquirerPrompt({ - type: 'list', - default: defaultCmd, - name: 'selectedTask', - message: `Pick a command${addendum}`, - choices: mergedTasks, - pageSize: 15, - logMessage: 'Welcome to the brave new world...', - }); - c.command = selectedTask; - } - if (c.command) task = c.command; - if (c.subCommand) task += ` ${c.subCommand}`; - - let suitableEngines = REGISTERED_ENGINES.filter((engine) => { - return hasEngineTask(task, engine.tasks, c.paths.project.configExists); - }); - - const autocompleteEngines = REGISTERED_ENGINES.filter( - (engine) => getEngineSubTasks(task, engine.tasks, true).length - ); - - const isAutoComplete = !suitableEngines.length && !!c.command && !autocompleteEngines.length; - if (!suitableEngines.length) { - // Get all supported tasks - const supportedSubtasksArr: Array<{ - desc: string; - taskKey: string; - }> = []; - REGISTERED_ENGINES.forEach((engine) => { - const st = getEngineSubTasks(task, engine.tasks); - - st.forEach((taskInstance) => { - const isNotViable = !c.paths.project.configExists && !taskInstance.isGlobalScope; - - if (!isNotViable) { - const taskKey = isAutoComplete ? taskInstance.task : taskInstance.task.split(' ')[1]; - - supportedSubtasksArr.push({ - desc: taskInstance.description?.toLowerCase?.(), - taskKey, - }); - } - }); - }); - Object.values(CUSTOM_TASKS).forEach((taskInstance) => { - const tskArr = taskInstance.task.split(' '); - - if (task === tskArr[0] && tskArr.length > 1) { - const taskKey = isAutoComplete ? taskInstance.task : taskInstance.task.split(' ')[1]; - - supportedSubtasksArr.push({ - desc: taskInstance.description?.toLowerCase?.(), - taskKey, - }); - } - }); - - const supportedSubtasks: TaskItemMap = {}; - // Normalize task options - const supportedSubtasksFilter: TaskItemMap = {}; - supportedSubtasksArr.forEach((tsk) => { - const mergedTask = supportedSubtasksFilter[tsk.taskKey]; - if (!mergedTask) { - supportedSubtasksFilter[tsk.taskKey] = tsk; - } else if (!mergedTask.desc?.includes(tsk.desc)) { - mergedTask.desc += `, ${tsk.desc}`; - } - }); - - // Generate final list object - Object.values(supportedSubtasksFilter).forEach((v) => { - const desc = v.desc ? `(${v.desc})` : ''; - const key = `${v.taskKey} ${chalk().grey(desc)}`; - supportedSubtasks[key] = { - taskKey: v.taskKey, - }; - }); - - const subTasks = Object.keys(supportedSubtasks); - if (subTasks.length && c.runtime.hasAllEnginesRegistered) { - // Only offer autocomple option if all engines are registered - - const message = isAutoComplete - ? `Autocomplete action for "${c.command}"` - : `Pick a subCommand for ${c.command}`; - const { subCommand } = await inquirerPrompt({ - type: 'list', - name: 'subCommand', - message, - choices: subTasks, - }); - if (isAutoComplete) { - task = supportedSubtasks[subCommand].taskKey; - c.command = task.split(' ')[0]; - c.subCommand = task.split(' ')[1]; - if (c.subCommand) { - task = `${c.command} ${c.subCommand}`; - } else { - task = `${c.command}`; - } - } else { - c.subCommand = supportedSubtasks[subCommand].taskKey; - task = `${c.command} ${c.subCommand}`; - } - - suitableEngines = REGISTERED_ENGINES.filter((engine) => - hasEngineTask(task, engine.tasks, c.paths.project.configExists) - ); - } - } - if (CUSTOM_TASKS[task]) { - // Custom tasks are executed by core engine - logInfo(`Running custom task ${chalk().bold(task)}`); - } else if (!suitableEngines.length) { - if (!c.runtime.hasAllEnginesRegistered) { - // No platform was specified. we have no option other than load all engines and offer platform list next round - await registerAllPlatformEngines(); - return findSuitableTask(); - } - - logInfo(`could not find suitable task for ${chalk().bold(c.command)}. GETTING OPTIONS...`); - c.command = null; - c.subCommand = null; - return findSuitableTask(); - } - //TODO: special type case for c.platform - if (!c.platform || c.program.platform === true) { - await _selectPlatform(c, suitableEngines, task); - } - c.runtime.engine = getEngineRunner(task, CUSTOM_TASKS, false); - // Cover scenarios of -p xxxxxxxxx - if (!c.runtime.engine) { - await _selectPlatform(c, suitableEngines, task); - c.runtime.engine = getEngineRunner(task, CUSTOM_TASKS); - } - if (c.runtime.engine?.runtimeExtraProps) { - c.runtime.runtimeExtraProps = c.runtime.engine.runtimeExtraProps; - } - - const customTask = CUSTOM_TASKS[task]; - if (customTask) { - c.runtime.availablePlatforms = customTask.platforms; - _populateExtraParameters(c, customTask); - return customTask; - } - } else { - task = specificTask; - c.runtime.engine = getEngineRunner(task); - } - const plats = c.runtime.engine?.platforms || []; - c.runtime.availablePlatforms = Object.keys(plats) as PlatformKey[]; - return getEngineTask(task, c.runtime.engine?.tasks); -}; - -export const generateStringFromTaskOption = (opt: RnvTaskOption) => { - let cmd = ''; - if (opt.shortcut) { - cmd += `-${opt.shortcut}, `; - } - cmd += `--${opt.key}`; - if (opt.isVariadic) { - if (opt.isRequired) { - cmd += ` `; - } else { - cmd += ` [value...]`; - } - } else if (opt.isValueType) { - if (opt.isRequired) { - cmd += ` `; - } else { - cmd += ` [value]`; - } - } - return cmd; -}; - -const _populateExtraParameters = (c: RnvContext, task: RnvTask) => { - if (task.options) { - task.options.forEach((opt) => { - c.program.option?.(generateStringFromTaskOption(opt), opt.description); - }); - c.program.parse?.(process.argv); - } -}; - -const _selectPlatform = async (c: RnvContext, suitableEngines: Array, task: string) => { - const supportedPlatforms: Partial> = {}; - suitableEngines.forEach((engine) => { - getEngineTask(task, engine.tasks)?.platforms.forEach((plat) => { - supportedPlatforms[plat] = true; - }); - }); - const platforms = Object.keys(supportedPlatforms); - - if (platforms.length) { - const { platform } = await inquirerPrompt({ - type: 'list', - name: 'platform', - message: `Pick a platform for ${task}`, - choices: platforms, - }); - c.platform = platform; - } -}; - -const _executePipe = async (c: RnvContext, task: string, phase: string) => - executePipe(`${task.split(' ').join(':')}:${phase}`); - -const TASK_LIMIT = 20; - -export const executeTask = async (task: string, parentTask?: string, originTask?: string, isFirstTask?: boolean) => { - const c = getContext(); - // const pt = parentTask ? `=> [${parentTask}] ` : ''; - c._currentTask = task; - // logInitTask(`${pt}=> [${chalk().bold.rgb(170, 106, 170)(task)}]`); - logInitTask(`${task}`); - - if (!executedTasks[task]) executedTasks[task] = 0; - if (executedTasks[task] > TASK_LIMIT) { - return Promise.reject(`You reached maximum amount of executions per one task (${TASK_LIMIT}) task: ${task}. -This is to warn you ended up in task loop. -(${task} calls same or another task which calls ${task} again) -but issue migh not be necessarily with this task - -To avoid that test your task code against parentTask and avoid executing same task X from within task X`); - } - await executeEngineTask(task, parentTask, originTask, getEngineRunner(task, CUSTOM_TASKS)?.tasks, isFirstTask); - // await getEngineRunner(task, CUSTOM_TASKS).executeTask(task, parentTask, originTask, isFirstTask); - executedTasks[task]++; - - c._currentTask = parentTask; - // const prt = parentTask ? `<= [${chalk().rgb(170, 106, 170)(parentTask)}] ` : ''; - logExitTask(`${task}`); -}; - -/** - * @deprecated Use executeDependantTask instead - */ -export const executeOrSkipTask = async (task: string, parentTask: string, originTask?: string) => { - const c = getContext(); - if (!c.program.only) { - return executeTask(task, parentTask, originTask); - } - return executeTask('configureSoft', parentTask, originTask); -}; - -export const executeDependantTask = async ({ - task, - parentTask, - originTask, - alternativeTask, -}: { - task: string; - parentTask: string; - originTask?: string; - alternativeTask?: string; -}) => { - const ctx = getContext(); - if (!ctx.program.only) { - return executeTask(task, parentTask, originTask); - } - if (alternativeTask) { - return executeTask(alternativeTask, parentTask, originTask); - } - return true; -}; - -const ACCEPTED_CONDITIONS = ['platform', 'target', 'appId', 'scheme'] as const; - -type ACKey = (typeof ACCEPTED_CONDITIONS)[number]; - -const _logSkip = (task: string) => { - logInfo(`Original RNV task ${chalk().bold(task)} marked to ignore. SKIPPING...`); -}; - -export const shouldSkipTask = (taskKey: string, originRnvTaskName?: string) => { - const c = getContext(); - const task = taskKey as RenativeConfigRnvTaskName; - const originTask = originRnvTaskName as RenativeConfigRnvTaskName; - const tasks = c.buildConfig?.tasks; - c.runtime.platform = c.platform; - if (!tasks) return; - - if (c.program.skipTasks?.split) { - const skipTaskArr = c.program.skipTasks.split(','); - if (skipTaskArr.includes(task)) return true; - } - - if (Array.isArray(tasks)) { - for (let k = 0; k < tasks.length; k++) { - const t = tasks[k]; - if (t.name === task) { - if (t.filter) { - const conditions = t.filter.split('&'); - let conditionsToMatch = conditions.length; - conditions.forEach((con: string) => { - const conArr = con.split('='); - const conKey = conArr[0] as ACKey; - if (ACCEPTED_CONDITIONS.includes(conKey)) { - const rt = c.runtime; - if (rt[conKey] === conArr[1]) { - conditionsToMatch--; - } - } else { - logWarning( - `Condition ${con} not valid. only following keys are valid: ${ACCEPTED_CONDITIONS.join( - ',' - )} SKIPPING...` - ); - } - }); - if (conditionsToMatch === 0) { - if (t.ignore) { - _logSkip(task); - return true; - } - } - } else if (t.ignore) { - _logSkip(task); - return true; - } - } - } - } else if (c.platform) { - const ignoreTask = tasks[task]?.platform?.[c.platform]?.ignore; - if (ignoreTask) { - _logSkip(task); - return true; - } - if (!originTask) { - return false; - } - const ignoreTasks = tasks[originTask]?.platform?.[c.platform]?.ignoreTasks || []; - if (ignoreTasks.includes(task)) { - logInfo(`Task ${task} marked to skip during rnv ${originTask}. SKIPPING...`); - return true; - } - } - - return false; -}; - -export const executeEngineTask = async ( - task: string, - parentTask?: string, - originTask?: string, - tasks?: Record, - isFirstTask?: boolean -) => { - const c = getContext(); - const needsHelp = Object.prototype.hasOwnProperty.call(c.program, 'help'); - - const t = getEngineTask(task, tasks, CUSTOM_TASKS); - - if (needsHelp && !parentTask && t) { - logRaw(` -======================================================= -INTERACTIVE HELP FOR TASK: ${chalk().green(t.task)} - -Description: ${t.description} - -Options: - -${t.options - .map((v) => { - const option = v.shortcut ? `\`-${v.shortcut}\`, ` : ''; - return `${option}\`--${v.key}\` - ${v.description}`; - }) - .join('\n')} - - `); - if (t.fnHelp) { - await t.fnHelp(c, parentTask, originTask); - } - - await pressAnyKeyToContinue(); - logRaw(` -=======================================================`); - } - if (t && !t.isGlobalScope && isFirstTask) { - if (c.files.project.package) { - // This has to happen in order for hooks to be able to run - await checkIfProjectAndNodeModulesExists(); - } - } - if (isFirstTask) { - c.runtime.forceBuildHookRebuild = !!t?.forceBuildHookRebuild; - } - const inOnlyMode = c.program.only; - const doPipe = t && !t.isGlobalScope && (!inOnlyMode || (inOnlyMode && isFirstTask)); - if (doPipe) await _executePipe(c, task, 'before'); - if (t && t.fn) await t.fn(c, parentTask, originTask); - if (doPipe) await _executePipe(c, task, 'after'); -}; diff --git a/packages/core/src/tasks/taskExecutors.ts b/packages/core/src/tasks/taskExecutors.ts new file mode 100644 index 0000000000..16612aa4e4 --- /dev/null +++ b/packages/core/src/tasks/taskExecutors.ts @@ -0,0 +1,195 @@ +import { logDefault, logInitTask, logExitTask, chalk, logRaw, logInfo, logToSummary } from '../logger'; +import { executePipe } from '../buildHooks'; +import type { RnvContext } from '../context/types'; +import type { RnvTask } from './types'; +import { getApi } from '../api/provider'; +import { getContext } from '../context/provider'; +import { RnvTaskName } from '../enums/taskName'; +import { generateStringFromTaskOption, shouldSkipTask } from './taskHelpers'; +import { getEngineRunnerByOwnerID } from '../engines'; +import { extractSingleExecutableTask, findTasksByTaskName } from './taskFinder'; +import { checkIfProjectAndNodeModulesExists } from '../projects/npm'; + +let executedTasks: Record = {}; +const TASK_LIMIT = 20; + +export const executeTask = async (opts: { + taskName: string; + parentTaskName?: string; + originTaskName?: string; + isFirstTask?: boolean; + isOptional?: boolean; + skipInOnlyMode?: boolean; + alternativeTaskInOnlyMode?: string; +}) => { + const { + taskName, + parentTaskName, + originTaskName, + isOptional, + isFirstTask, + skipInOnlyMode, + alternativeTaskInOnlyMode, + } = opts; + const ctx = getContext(); + const inOnlyMode = ctx.program.opts().only; + if (skipInOnlyMode && inOnlyMode) { + const availableTasks = findTasksByTaskName(alternativeTaskInOnlyMode || RnvTaskName.configureSoft); + const taskInstance = await extractSingleExecutableTask(availableTasks.match, taskName); + return _executeTaskInstance({ taskInstance, parentTaskName, originTaskName, isOptional, isFirstTask }); + } + + const availableTasks = findTasksByTaskName(taskName); + + if (availableTasks.match.length === 0 && !isOptional) { + logToSummary(`Current task registry: +${availableTasks.available.map((t) => `${t.task} ${chalk().gray(t.ownerID)}`).join('\n')} +`); + return Promise.reject(`Task "${taskName}" not found in registry!`); + } + + const taskInstance = await extractSingleExecutableTask(availableTasks.match, taskName); + return _executeTaskInstance({ taskInstance, parentTaskName, originTaskName, isOptional, isFirstTask }); +}; + +export const initializeTask = async (taskInstance: RnvTask | undefined) => { + if (!taskInstance) { + throw new Error('Task instance is undefined'); + } + const { task } = taskInstance; + logDefault('initializeTask', task); + const c = getContext(); + _populateExtraParameters(c, taskInstance); + + // If engine has not been selected by picking interactive platform selection + // let's pick it based on task ownerID + if (!c.runtime.engine) { + c.runtime.engine = getEngineRunnerByOwnerID(taskInstance); + c.runtime.runtimeExtraProps = c.runtime.engine?.runtimeExtraProps || {}; + } + + if (c.runtime.engine?.config) { + logInfo( + `Current engine: ${chalk().bold(c.runtime.engine?.config?.id)} ${chalk().grey( + `(${c.runtime.engine?.rootPath})` + )}` + ); + } else { + logInfo(`Current engine: n/a`); + } + + c.runtime.task = task; + executedTasks = {}; + + getApi().analytics.captureEvent({ + type: task, + platform: c.platform, + }); + + await _executeTaskInstance({ taskInstance, originTaskName: task, isFirstTask: true }); + return true; +}; + +const _executeTaskInstance = async (opts: { + taskInstance?: RnvTask; + parentTaskName?: string; + originTaskName?: string; + isFirstTask?: boolean; + isOptional?: boolean; +}) => { + const { taskInstance, parentTaskName, originTaskName, isFirstTask, isOptional } = opts; + const c = getContext(); + if (!taskInstance) { + if (isOptional) { + return; + } + throw new Error(`Task Instance is undefined`); + } + const needsHelp = c.program.opts().help; + const inOnlyMode = c.program.opts().only; + + c._currentTask = taskInstance.task; + // logInitTask(`${pt}=> [${chalk().bold.rgb(170, 106, 170)(task)}]`); + logInitTask(`${taskInstance.task}`); + + if (!executedTasks[taskInstance.task]) executedTasks[taskInstance.task] = 0; + if (executedTasks[taskInstance.task] > TASK_LIMIT) { + return Promise.reject(`You reached maximum amount of executions per one task (${TASK_LIMIT}) task: ${taskInstance.task}. +This is to warn you ended up in task loop. +(${taskInstance.task} calls same or another task which calls ${taskInstance.task} again) +but issue migh not be necessarily with this task + +To avoid that test your task code against parentTask and avoid executing same task X from within task X`); + } + + if (needsHelp && !parentTaskName && taskInstance) { + logRaw(` +Description: ${taskInstance.description} + `); + c.program.outputHelp(); + + if (taskInstance.fnHelp) { + await taskInstance.fnHelp(); + } + return; + } + if (!taskInstance.isGlobalScope && isFirstTask) { + if (c.files.project.package) { + // This has to happen in order for hooks to be able to run + await checkIfProjectAndNodeModulesExists(); + } + } + if (isFirstTask) { + c.runtime.forceBuildHookRebuild = !!taskInstance?.forceBuildHookRebuild; + } + + const doPipe = !taskInstance.isGlobalScope && (!inOnlyMode || (inOnlyMode && isFirstTask)); + if (doPipe) await _executePipe(taskInstance, 'before'); + executedTasks[taskInstance.task]++; + c._currentTask = parentTaskName; + const shouldSkip = shouldSkipTask({ taskName: taskInstance.task }); + if (taskInstance.dependsOn) { + for (const dep of taskInstance.dependsOn) { + if (taskInstance.beforeDependsOn) { + await taskInstance.beforeDependsOn({ + taskName: dep, + parentTaskName: taskInstance.task, + originTaskName, + ctx: c, + shouldSkip: false, + }); + } + await executeTask({ taskName: dep, parentTaskName: taskInstance.task, originTaskName }); + } + } + if (taskInstance.fn && !shouldSkip) { + await taskInstance.fn({ + taskName: taskInstance.task, + parentTaskName, + originTaskName, + shouldSkip, + ctx: c, + }); + } + if (doPipe) await _executePipe(taskInstance, 'after'); + + executedTasks[taskInstance.task]++; + + c._currentTask = parentTaskName; + + logExitTask(`${taskInstance.task}`); +}; + +const _populateExtraParameters = (c: RnvContext, task: RnvTask) => { + c.program?.allowUnknownOption(false); // integration options are not known ahead of time + if (task.options) { + task.options.forEach((opt) => { + c.program.option?.(generateStringFromTaskOption(opt), opt.description); + }); + } + c.program.showHelpAfterError(); + c.program.parse?.(process.argv); +}; + +const _executePipe = async (taskInstance: RnvTask, phase: string) => + executePipe(`${taskInstance.task.split(' ').join(':')}:${phase}`); diff --git a/packages/core/src/tasks/taskFinder.ts b/packages/core/src/tasks/taskFinder.ts new file mode 100644 index 0000000000..8a60995b19 --- /dev/null +++ b/packages/core/src/tasks/taskFinder.ts @@ -0,0 +1,87 @@ +import { logDefault, logWarning } from '../logger'; +import type { RnvTask } from './types'; +import { getContext } from '../context/provider'; +import { getRegisteredTasks } from './taskRegistry'; +import { getTaskNameFromCommand, selectPlatformIfRequired } from './taskHelpers'; +import { inquirerPrompt } from '../api'; + +export const findSuitableTask = async (): Promise => { + logDefault('findSuitableTask'); + const taskName = getTaskNameFromCommand(); + if (!taskName) { + // Trigger auto selection outside of this function + return undefined; + } + const suitableTasks = findTasksByTaskName(taskName); + + const taskInstance = await extractSingleExecutableTask(suitableTasks.match, taskName); + return taskInstance; +}; + +export const findTasksByTaskName = (taskName: string) => { + const result: RnvTask[] = []; + const ctx = getContext(); + const tasks = getRegisteredTasks(); + const taskArr = Object.values(tasks); + taskArr.forEach((v) => { + const plat = ctx.platform; + + if (v.platforms && typeof plat === 'string') { + if (!v.platforms.includes(plat)) { + // If we found a task with platform restriction and it does not match current platform we skip it + return; + } + if (ctx.runtime.engine && v.ownerID !== ctx.runtime.engine?.config?.packageName) { + // If we already know specific engine to be used and task is not from that engine we skip it + return; + } + } + if (v.task === taskName) { + result.push(v); + } + }); + return { match: result, available: taskArr }; +}; + +export const extractSingleExecutableTask = async ( + suitableTasks: RnvTask[], + taskName: string +): Promise => { + if (suitableTasks.length === 1) { + return suitableTasks[0]; + } else if (suitableTasks.length > 1) { + // Found multiple Tasks with same name + let hasPlatformAwareTasks = false; + suitableTasks.forEach((v) => { + if (v.platforms) { + hasPlatformAwareTasks = true; + } + }); + + if (hasPlatformAwareTasks) { + // Restart the process now we defined specific platform + await selectPlatformIfRequired(); + const newSuitableTasks = await findTasksByTaskName(taskName); + if (newSuitableTasks.match.length === 0) { + logWarning('No suitable tasks found after platform selection'); + // throw new Error('TODO cannot find any suitable tasks after platform selection'); + } else if (newSuitableTasks.match.length === 1) { + return newSuitableTasks.match[0]; + } + } + + logWarning(`Multiple competing tasks found for ${taskName} task. Please select one:`); + const { result } = await inquirerPrompt({ + type: 'list', + name: 'result', + message: 'Select task', + choices: suitableTasks.map((v) => ({ + name: `${v.task} - registered to: ${v.ownerID}`, + value: v, + })), + }); + return result; + } + // Found no tasks + return undefined; +}; diff --git a/packages/core/src/tasks/taskHelpers.ts b/packages/core/src/tasks/taskHelpers.ts new file mode 100644 index 0000000000..48567a0682 --- /dev/null +++ b/packages/core/src/tasks/taskHelpers.ts @@ -0,0 +1,179 @@ +import { inquirerPrompt } from '../api'; +import { getContext } from '../context/provider'; +import { getEngineRunnerByPlatform, registerPlatformEngine } from '../engines'; +import { chalk, logInfo } from '../logger'; +import { RnvTask, RnvTaskMap, RnvTaskOption } from './types'; + +const printCurrentPlatform = () => { + const ctx = getContext(); + const msg = `Current platform: ${chalk().white.bold(ctx.platform)}`; + logInfo(msg); +}; + +export const selectPlatformIfRequired = async ( + knownTaskInstance?: RnvTask, + registerEngineIfPlatformSelected?: boolean +) => { + const c = getContext(); + // TODO: move this to more generic place? + c.runtime.availablePlatforms = c.buildConfig.defaults?.supportedPlatforms || []; + if (typeof c.platform !== 'string') { + const taskName = getTaskNameFromCommand(); + const platforms = knownTaskInstance?.platforms || c.runtime.availablePlatforms; + if (platforms) { + if (platforms.length === 1) { + logInfo( + `Task "${knownTaskInstance?.task}" has only one supported platform: "${platforms[0]}". Automatically selecting it.` + ); + c.platform = platforms[0]; + c.program.opts().platform = c.platform; + } else { + const { platform } = await inquirerPrompt({ + type: 'list', + name: 'platform', + message: `Pick a platform for task: "rnv ${knownTaskInstance?.task || taskName}"`, + choices: platforms, + }); + c.platform = platform; + } + printCurrentPlatform(); + } + } else { + printCurrentPlatform(); + } + // TODO: move all below to more generic place? + if (registerEngineIfPlatformSelected) { + await registerPlatformEngine(c.platform); + } + c.runtime.engine = getEngineRunnerByPlatform(c.platform); + c.runtime.runtimeExtraProps = c.runtime.engine?.runtimeExtraProps || {}; +}; + +export const getTaskNameFromCommand = (): string | undefined => { + const c = getContext(); + if (!c.command) return undefined; + let taskName = ''; + + if (c.command) taskName = c.command; + if (c.subCommand) taskName += ` ${c.subCommand}`; + + return taskName; +}; + +export const generateRnvTaskMap = ( + taskArr: ReadonlyArray>, + config: { name?: string; packageName?: string } +) => { + const tasks: RnvTaskMap = {}; + + const ownerID = config.packageName || config.name; + if (!ownerID) throw new Error('generateRnvTaskMap() requires config. to be defined!'); + + taskArr.forEach((taskBlueprint) => { + const taskInstance = { ...taskBlueprint }; + const plts = taskInstance.platforms || []; + const key = `${ownerID}:${plts.join('-')}:${taskInstance.task}`; + taskInstance.ownerID = ownerID; + taskInstance.key = key; + tasks[key] = taskInstance; + }); + // if (extedTaskMaps) { + // extedTaskMaps.forEach((taskMap) => { + // Object.keys(taskMap).forEach((key) => { + // tasks[key] = taskMap[key]; + // }); + // }); + // } + return tasks; +}; + +export const generateStringFromTaskOption = (opt: RnvTaskOption) => { + let cmd = ''; + if (opt.shortcut) { + cmd += `-${opt.shortcut}, `; + } + cmd += `--${opt.key}`; + if (opt.isVariadic) { + if (opt.isRequired) { + cmd += ` `; + } else { + cmd += ` [value...]`; + } + } else if (opt.isValueType) { + if (opt.isRequired) { + cmd += ` `; + } else { + cmd += ` [value]`; + } + } + return cmd; +}; + +// const ACCEPTED_CONDITIONS = ['platform', 'target', 'appId', 'scheme'] as const; + +export const shouldSkipTask = ({ taskName }: { taskName: string }) => { + const c = getContext(); + // const task = taskKey as RenativeConfigRnvTaskName; + // const originTask = originRnvTaskName as RenativeConfigRnvTaskName; + const tasks = c.buildConfig?.tasks; + c.runtime.platform = c.platform; + if (!tasks) return false; + + if (c.program.opts().skipTasks?.split) { + const skipTaskArr = c.program.opts().skipTasks.split(','); + if (skipTaskArr.includes(taskName)) return true; + } + + // if (Array.isArray(tasks)) { + // for (let k = 0; k < tasks.length; k++) { + // const t = tasks[k]; + // if (t.name === task) { + // if (t.filter) { + // const conditions = t.filter.split('&'); + // let conditionsToMatch = conditions.length; + // conditions.forEach((con: string) => { + // const conArr = con.split('='); + // const conKey = conArr[0] as ACKey; + // if (ACCEPTED_CONDITIONS.includes(conKey)) { + // const rt = c.runtime; + // if (rt[conKey] === conArr[1]) { + // conditionsToMatch--; + // } + // } else { + // logWarning( + // `Condition ${con} not valid. only following keys are valid: ${ACCEPTED_CONDITIONS.join( + // ',' + // )} SKIPPING...` + // ); + // } + // }); + // if (conditionsToMatch === 0) { + // if (t.ignore) { + // _logSkip(task); + // return true; + // } + // } + // } else if (t.ignore) { + // _logSkip(task); + // return true; + // } + // } + // } + // } else if (c.platform) { + // const ignoreTask = tasks[task]?.platform?.[c.platform]?.ignore; + // if (ignoreTask) { + // _logSkip(task); + // return true; + // } + // if (!originTask) { + // return false; + // } + // const ignoreTasks = tasks[originTask]?.platform?.[c.platform]?.ignoreTasks || []; + // if (ignoreTasks.includes(task)) { + // logInfo(`Task ${task} marked to skip during rnv ${originTask}. SKIPPING...`); + // return true; + // } + // } + + return false; +}; diff --git a/packages/core/src/tasks/taskRegistry.ts b/packages/core/src/tasks/taskRegistry.ts new file mode 100644 index 0000000000..674225f680 --- /dev/null +++ b/packages/core/src/tasks/taskRegistry.ts @@ -0,0 +1,20 @@ +import { RnvTask, RnvTaskMap } from './types'; + +const REGISTERED_TASKS: RnvTaskMap = {}; + +export const registerRnvTasks = async (tasks: RnvTaskMap) => { + Object.values(tasks).forEach((task) => registerRnvTask(task)); +}; + +const registerRnvTask = async (taskInstance: RnvTask) => { + if (!taskInstance.key) { + throw new Error('Task key is required'); + } + if (taskInstance.key in REGISTERED_TASKS) { + throw new Error(`Task key must be unique. Task with key ${taskInstance.key} already exists`); + } + + REGISTERED_TASKS[taskInstance.key] = taskInstance; +}; + +export const getRegisteredTasks = () => REGISTERED_TASKS; diff --git a/packages/core/src/tasks/types.ts b/packages/core/src/tasks/types.ts index 892d830973..949898f999 100644 --- a/packages/core/src/tasks/types.ts +++ b/packages/core/src/tasks/types.ts @@ -1,23 +1,46 @@ import type { RnvContext } from '../context/types'; -import type { PlatformKey } from '../schema/types'; +import type { RnvPlatformKey } from '../types'; -export type RnvTask = { +export type CreateRnvTaskOpt = { task: string; - options: Array; + dependsOn?: string[]; + options?: ReadonlyArray>; isGlobalScope?: boolean; - platforms: Array; + platforms?: Array; description: string; forceBuildHookRebuild?: boolean; - fn?: RnvTaskFn; - fnHelp?: RnvTaskFn; + beforeDependsOn?: RnvTaskFn; + fn?: RnvTaskFn; + fnHelp?: RnvTaskHelpFn; isPrivate?: boolean; isPriorityOrder?: boolean; ignoreEngines?: boolean; }; +export type RnvTask = { + task: string; + dependsOn?: string[]; + options?: ReadonlyArray>; + isGlobalScope?: boolean; + platforms?: Array; + description: string; + forceBuildHookRebuild?: boolean; + beforeDependsOn?: RnvTaskFn; + fn?: RnvTaskFn; + fnHelp?: RnvTaskHelpFn; + isPrivate?: boolean; + isPriorityOrder?: boolean; + ignoreEngines?: boolean; + ownerID?: string; + key: string; +}; + export type TaskPromptOption = { name: string; - value: string; + value: { + taskName: string; + subTsks?: TaskPromptOption[]; + }; command: string; asArray?: string[]; subCommand?: string; @@ -30,21 +53,29 @@ export type TaskPromptOption = { params?: Array; }; -export type RnvTaskOption = { +export type RnvTaskOption = { shortcut?: string; - key?: string; + key: OKey; isRequired?: boolean; isValueType?: boolean; isVariadic?: boolean; description: string; examples?: Array; - options?: Array; + // options?: ReadonlyArray>; }; -export type RnvTaskMap = Record; +export type RnvTaskMap = Record>; //Too many choices of return types -export type RnvTaskFn = (c: RnvContext, parentTask?: string, originTask?: string) => Promise; // Promise; +export type RnvTaskFn = (opts: { + ctx: RnvContext; + taskName: string; + parentTaskName: string | undefined; + originTaskName: string | undefined; + shouldSkip: boolean; +}) => Promise; // Promise; + +export type RnvTaskHelpFn = () => Promise; export type TaskItemMap = Record< string, diff --git a/packages/core/src/tasks/wizard.ts b/packages/core/src/tasks/wizard.ts new file mode 100644 index 0000000000..96f54b3d7c --- /dev/null +++ b/packages/core/src/tasks/wizard.ts @@ -0,0 +1,135 @@ +import { findSuitableTask } from './taskFinder'; +import { inquirerPrompt } from '../api'; +import { getContext } from '../context/provider'; +import { chalk, logInfo } from '../logger'; +import { getRegisteredTasks } from './taskRegistry'; +import { initializeTask } from './taskExecutors.js'; +import { getTaskNameFromCommand } from './taskHelpers'; + +type TaskOpt = { + name: string; + value: string; +}; + +const generateOptionPrompt = async (options: TaskOpt[]) => { + const ctx = getContext(); + + // const { selectedTask } = await inquirerPrompt({ + // type: 'list', + // // default: defaultCmd, + // name: 'selectedTask', + // message: `Pick a command`, + // choices: options, + // pageSize: 15, + // logMessage: 'Welcome to the brave new world...', + // }); + // const taskArr = selectedTask.split(' '); + // ctx.command = taskArr[0]; + // ctx.subCommand = taskArr[1] || null; + + // const initTask = await findSuitableTask(); + // return initializeTask(initTask); + + const { selectedTask } = await inquirerPrompt({ + type: 'list', + // default: defaultCmd, + name: 'selectedTask', + message: `Pick a command`, + choices: options, + pageSize: 15, + logMessage: 'Welcome to the brave new world...', + }); + + const taskArr = selectedTask.split(' '); + ctx.command = taskArr[0]; + ctx.subCommand = taskArr[1] || null; + + const initTask = await findSuitableTask(); + return initializeTask(initTask); +}; + +export const runInteractiveWizardForSubTasks = async () => { + const ctx = getContext(); + + const tasks = getRegisteredTasks(); + const optionsMap: Record = {}; + const alternativeOptionsMap: Record = {}; + + const selectedEngineID = ctx.platform && ctx.runtime.enginesByPlatform[ctx.platform]?.config?.packageName; + + Object.values(tasks).forEach((taskInstance) => { + if (ctx.platform) { + if (selectedEngineID && taskInstance.ownerID !== selectedEngineID) { + // If we already specified platform we can skip tasks registered to unsupported engines + return; + } + if (taskInstance.platforms && !taskInstance.platforms.includes(ctx.platform)) { + // We can also filter out tasks that are not supported on current platform + return; + } + } + + const taskCmdName = taskInstance.task.split(' ')[0]; + + if (taskCmdName === ctx.command) { + if (!optionsMap[taskInstance.task]) { + optionsMap[taskInstance.task] = { + name: `${taskInstance.task} ${chalk().gray(taskInstance.description)}`, + value: taskInstance.task, + }; + } else { + // If multiple tasks with same name we append ... to indicate there are more options coming + optionsMap[taskInstance.task].name = `${taskInstance.task}${chalk().gray('...')}`; + } + } else { + if (!alternativeOptionsMap[taskInstance.task]) { + alternativeOptionsMap[taskInstance.task] = { + name: `${taskInstance.task} ${chalk().gray(taskInstance.description)}`, + value: taskInstance.task, + }; + } else { + // If multiple tasks with same name we append ... to indicate there are more options coming + alternativeOptionsMap[taskInstance.task].name = `${taskInstance.task}${chalk().gray('...')}`; + } + } + }); + + const options: TaskOpt[] = Object.values(optionsMap); + + if (options.length > 0) { + if (ctx.subCommand) { + logInfo(`No sub task named "${chalk().red(ctx.subCommand)}" found. Will look for available ones instead.`); + ctx.subCommand = null; + } + return generateOptionPrompt(options); + } + + const alternativeOptions: TaskOpt[] = Object.values(alternativeOptionsMap); + // No subtasks found but we found closest matches + if (alternativeOptions.length > 0) { + return generateOptionPrompt(alternativeOptions); + } + + if (ctx.subCommand) { + logInfo(`No tasks found for "${chalk().red(getTaskNameFromCommand())}". Launching wizard...`); + ctx.subCommand = null; + } + + // If nothing could be found we resort to default wizard + return runInteractiveWizard(); +}; + +export const runInteractiveWizard = async () => { + const tasks = getRegisteredTasks(); + + const options: TaskOpt[] = []; + + Object.values(tasks).forEach((taskInstance) => { + options.push({ + name: `${taskInstance.task} ${chalk().gray(taskInstance.description)}`, + value: taskInstance.task, + }); + }); + + return generateOptionPrompt(options); +}; diff --git a/packages/core/src/templates/index.ts b/packages/core/src/templates/index.ts index 7714b786bb..ed771b1a36 100644 --- a/packages/core/src/templates/index.ts +++ b/packages/core/src/templates/index.ts @@ -2,61 +2,101 @@ import path from 'path'; import { copyFolderContentsRecursiveSync, copyFileSync, - removeDirsSync, - removeFilesSync, mergeObjects, readObjectSync, fsExistsSync, fsLstatSync, - fsUnlinkSync, - removeDirSync, } from '../system/fs'; import { chalk, logError, logInfo, logWarning, logDefault, logDebug } from '../logger'; -import { loadFileExtended } from '../configs'; import { doResolve } from '../system/resolve'; import { RnvContext } from '../context/types'; -import { generateOptions, inquirerPrompt } from '../api'; -import { PromptOptions } from '../api/types'; -import { RnvPlatform } from '../types'; -import { listAppConfigsFoldersSync } from '../configs/appConfigs'; -import { writeRenativeConfigFile } from '../configs/utils'; -import { checkIfProjectAndNodeModulesExists } from '../projects/dependencyManager'; -import { ConfigFileApp, ConfigFileProject, ConfigFileTemplate } from '../schema/configFiles/types'; -import { PlatformKey } from '../schema/types'; -import { getConfigProp } from '../context/contextProps'; -import { ConfigName } from '../enums/configName'; +import { RnvFileName } from '../enums/fileName'; import { getContext } from '../context/provider'; +import { RnvFolderName } from '../enums/folderName'; +import { checkIfProjectAndNodeModulesExists } from '../projects/npm'; +import type { ConfigFileProject, ConfigFileTemplate } from '../schema/types'; -const _cleanProjectTemplateSync = (c: RnvContext) => { - logDefault('_cleanProjectTemplateSync'); - const dirsToRemove = [c.paths.project.appConfigBase.dir, c.paths.project.srcDir!, c.paths.project.appConfigsDir]; +export const configureTemplateFiles = async () => { + logDefault('configureTemplateFiles'); - const filesToRemove = c.buildConfig.defaults?.supportedPlatforms?.map((p) => - path.join(c.paths.project.dir, `index.${p}.js`) - ); + const c = getContext(); + + const templateConfig = readObjectSync(c.paths.template.configTemplate); - removeDirsSync(dirsToRemove); - // TODO: NOT SERVED FROM TEMPLATE YET - if (filesToRemove) removeFilesSync(filesToRemove); + let mergedObj = _getProjectTemplateMergedConfig(templateConfig); + const includedPaths = mergedObj?.templateConfig?.includedPaths; + + if (includedPaths) { + includedPaths.forEach((pth) => { + if (c.paths.template.dir) { + if (typeof pth === 'string') { + _copyIncludedPaths(c, pth); + } else { + let matched: boolean = true; + const suPlats = c.buildConfig?.defaults?.supportedPlatforms || []; + if (pth.platforms && suPlats?.length) { + const match = pth.platforms.some((v) => suPlats.includes(v)); + if (!match) { + matched = false; + } + } else if (pth.engines?.length) { + const engId = c.runtime.engine?.config?.id; + if (engId && !pth.engines?.includes?.(engId)) { + matched = false; + } + } + if (matched) { + pth.paths.forEach((pth) => { + _copyIncludedPaths(c, pth); + }); + } + } + } + }); + } }; -const _applyTemplate = async (c: RnvContext) => { - logDefault('_applyTemplate', `current:${c.buildConfig.currentTemplate} selected:${c.runtime.selectedTemplate}`); +export const isTemplateInstalled = () => { + const ctx = getContext(); + const tplName = ctx.buildConfig.templateConfig?.name; + return tplName ? doResolve(tplName) : false; +}; - if (c.runtime.selectedTemplate) { - _cleanProjectTemplateSync(c); +export const applyTemplate = async () => { + const c = getContext(); + logDefault('applyTemplate'); + if (c.buildConfig?.isTemplate) return true; + if (!c.files.project.config) { + logError('Project config not loaded. cannot apply template'); + return false; + } + if (!isTemplateInstalled()) { + // We Need template to be installed before other dependency resolutions (due to scoping) + await checkIfProjectAndNodeModulesExists(); + } + await _applyTemplate(c); +}; + +const _applyTemplate = async (c: RnvContext) => { + logDefault('_applyTemplate'); - c.paths.template.dir = doResolve(c.runtime.selectedTemplate) || 'Error: unresolved'; - } else { - c.paths.template.dir = doResolve(c.buildConfig.currentTemplate) || 'Error: unresolved'; + const tplName = c.buildConfig.templateConfig?.name; + if (!tplName) { + logError(`Template config missing. Make sure renative.json >> templateConfig.name is set`); + return; } + const tpPath = doResolve(tplName); + if (!tpPath) { + logError(`Template ${tplName} not found. Make sure it's installed`); + return; + } + c.paths.template.dir = tpPath; if (c.paths.template.dir) { - c.paths.template.configTemplate = path.join(c.paths.template.dir, ConfigName.renativeTemplate); + c.paths.template.configTemplate = path.join(c.paths.template.dir, RnvFileName.renativeTemplate); - c.paths.template.config = path.join(c.paths.template.dir, ConfigName.renative); + c.paths.template.config = path.join(c.paths.template.dir, RnvFileName.renative); } - if (!fsExistsSync(c.paths.template.configTemplate)) { logWarning( `Template file ${chalk().bold(c.paths.template.configTemplate)} does not exist. check your ${chalk().bold( @@ -65,143 +105,17 @@ const _applyTemplate = async (c: RnvContext) => { ); return true; } - - logDebug(`_applyTemplate:${c.runtime.selectedTemplate}:${c.paths.template.dir}`); - - if (c.paths.template.dir) c.paths.template.appConfigsDir = path.join(c.paths.template.dir, 'appConfigs'); - c.paths.template.appConfigBase.dir = path.join(c.paths.template.appConfigsDir, 'base'); - c.runtime.currentTemplate = c.files.project.config?.currentTemplate || c.runtime.currentTemplate; - if (!c.runtime.currentTemplate) { - if (c.files.project.config?.templates) { - c.runtime.currentTemplate = Object.keys(c.files.project.config.templates)[0]; - } - - c.runtime.requiresForcedTemplateApply = true; - } - - if (c.buildConfig.currentTemplate) { - c.runtime.activeTemplate = `${c.buildConfig.currentTemplate}@${ - c.buildConfig.templates?.[c.buildConfig.currentTemplate]?.version - }`; - } - - return true; -}; - -const _configureSrc = (c: RnvContext) => - new Promise((resolve) => { - // Check src - logDebug('configureProject:check src'); - if (!fsExistsSync(c.paths.project.srcDir)) { - logInfo(`Your src folder ${chalk().bold(c.paths.project.srcDir)} is missing! CREATING...DONE`); - copyFolderContentsRecursiveSync(path.join(c.paths.template.dir, 'src'), c.paths.project.srcDir); - } - resolve(); - }); - -const _configureAppConfigs = async (c: RnvContext) => { - // Check appConfigs - logDebug('configureProject:check appConfigs'); - // - if (!fsExistsSync(c.paths.project.appConfigsDir)) { - logInfo( - `Your appConfig folder ${chalk().bold( - c.paths.project.appConfigsDir - )} is missing! ReNative will create one from template.` - ); - - // TODO: GET CORRECT PROJECT TEMPLATE - copyFolderContentsRecursiveSync(c.paths.template.appConfigsDir, c.paths.project.appConfigsDir); - - const appConfigIds = listAppConfigsFoldersSync(false); - - // Update App Title to match package.json - try { - const supPlats = c.files.project?.config?.defaults?.supportedPlatforms; - appConfigIds.forEach((v) => { - const appConfigPath = path.join(c.paths.project.appConfigsDir, v, ConfigName.renative); - const appConfig = readObjectSync(appConfigPath); - if (appConfig) { - if (appConfig.skipBootstrapCopy) { - fsUnlinkSync(appConfigPath); - if (v !== 'base') { - removeDirSync(path.join(c.paths.project.appConfigsDir, v)); - } - } else if (!appConfig.hidden) { - appConfig.common = appConfig.common || {}; - //TODO: this needs to use bootstrap_metadata to work properly - // appConfig.common.title = c.files.project.config?.defaults?.title; - // appConfig.common.id = c.files.project.config?.defaults?.id; - - if (supPlats && appConfig.platforms) { - (Object.keys(appConfig.platforms) as PlatformKey[]).forEach((pk) => { - if (!supPlats.includes(pk)) { - delete appConfig.platforms?.[pk]; - } - }); - } - - writeRenativeConfigFile(appConfigPath, appConfig); - } - } - }); - } catch (e) { - logError(e); - } - } -}; - -const _configureProjectConfig = (c: RnvContext) => - new Promise((resolve) => { - // Check projectConfigs - logDebug('configureProject:check projectConfigs'); - if (!fsExistsSync(c.paths.project.appConfigBase.dir)) { - logInfo( - `Your projectConfig folder ${chalk().bold( - c.paths.project.appConfigBase.dir - )} is missing! CREATING...DONE` - ); - copyFolderContentsRecursiveSync(c.paths.template.appConfigBase.dir, c.paths.project.appConfigBase.dir); - } - resolve(); - }); - -const _configureRenativeConfig = async (c: RnvContext) => { - // renative.json - const templateConfig = readObjectSync(c.paths.template.configTemplate); - logDebug('configureProject:check renative.json'); - - if (c.runtime.selectedTemplate || c.runtime.requiresForcedTemplateApply || c.files.project.config?.isNew) { - logInfo( - `Your ${c.paths.project.config} needs to be updated with ${c.paths.template.configTemplate}. UPDATING...DONE` - ); - const mergedObjBase = getProjectTemplateMergedConfig(templateConfig); - if (mergedObjBase) { - const mergedObj = { ...mergedObjBase, ...(mergedObjBase.templateConfig?.renative_json || {}) }; - - // Do not override supportedPlatforms - mergedObj.defaults = mergedObj.defaults || {}; - mergedObj.defaults.supportedPlatforms = c.files.project.config_original?.defaults?.supportedPlatforms; - // Do not override engines - mergedObj.engines = c.files.project.config_original?.engines; - // Set current template - if (c.runtime.currentTemplate) { - mergedObj.currentTemplate = c.runtime.currentTemplate; - } - - // mergedObj.isNew = null; - delete mergedObj.isNew; - delete mergedObj.templateConfig; - // c.files.project.config = mergedObj; - writeRenativeConfigFile(c.paths.project.config, mergedObj); - loadFileExtended(c.files.project, c.paths.project, 'config'); - } + logDebug(`_applyTemplate:${c.paths.template.dir}`); + if (c.paths.template.dir) { + c.paths.template.appConfigsDir = path.join(c.paths.template.dir, 'appConfigs'); } + c.paths.template.appConfigBase.dir = path.join(c.paths.template.appConfigsDir, 'base'); + c.runtime.currentTemplate = tplName; return true; }; -const getProjectTemplateMergedConfig = (templateConfig: ConfigFileTemplate | null) => { +const _getProjectTemplateMergedConfig = (templateConfig: ConfigFileTemplate | null) => { const c = getContext(); if (c.files.project.config_original && templateConfig) { const mergedObj = mergeObjects( @@ -216,9 +130,12 @@ const getProjectTemplateMergedConfig = (templateConfig: ConfigFileTemplate | nul return null; }; -const _copyIncludedPath = (c: RnvContext, name: string) => { - const sourcePath = path.join(c.paths.template.dir, name); +const _copyIncludedPaths = (c: RnvContext, name: string) => { + const sourcePathOriginal = path.join(c.paths.template.dir, name); + const sourceOverridePath = path.join(c.paths.template.dir, RnvFolderName.templateOverrides, name); const destPath = path.join(c.paths.project.dir, name); + // If override exists use it, otherwise use original and continue with rest of the logic + const sourcePath = fsExistsSync(sourceOverridePath) ? sourceOverridePath : sourcePathOriginal; if (!fsExistsSync(destPath) && fsExistsSync(sourcePath)) { try { if (fsLstatSync(sourcePath).isDirectory()) { @@ -233,129 +150,3 @@ const _copyIncludedPath = (c: RnvContext, name: string) => { } } }; - -export const configureTemplateFiles = async () => { - logDefault('configureTemplateFiles'); - - const c = getContext(); - - const templateConfig = readObjectSync(c.paths.template.configTemplate); - - let mergedObj = getProjectTemplateMergedConfig(templateConfig); - const includedPaths = mergedObj?.templateConfig?.includedPaths; - - if (includedPaths) { - includedPaths.forEach((pth) => { - if (c.paths.template.dir) { - if (typeof pth === 'string') { - _copyIncludedPath(c, pth); - } else { - const engId = c.runtime.engine?.config?.id; - if (!pth.engines || (engId && pth.engines?.includes?.(engId))) { - const incPaths = pth.paths; - if (incPaths.length > 0) { - incPaths.forEach((pth) => { - _copyIncludedPath(c, pth); - }); - } - } - } - } - }); - } -}; - -export const configureEntryPoint = async (platform: RnvPlatform) => { - logDefault('configureEntryPoint'); - const c = getContext(); - - if (c.files.project.config?.isTemplate) return true; - - const entryFile = getConfigProp('entryFile'); - - try { - const source = path.join(c.paths.template.dir, `${entryFile}.js`); - const dest = path.join(c.paths.project.dir, `${entryFile}.js`); - if (!fsExistsSync(dest)) { - if (!entryFile) { - logWarning( - `Missing entryFile key for ${chalk().bold(c.platform)} platform in your ${chalk().bold( - c.paths.appConfig.config - )}.` - ); - } else if (!fsExistsSync(source)) { - logWarning( - `Missing entry file ${chalk().bold( - `${entryFile}.js` - )}. Not available in your current template. You need to create one manually` - ); - } else { - logInfo(`Missing entry file ${chalk().bold(`${entryFile}.js`)}. COPYING from TEMPATE...DONE`); - copyFileSync(source, dest); - } - } - } catch (e) { - return Promise.reject(e); - } - - return true; -}; - -export const getInstalledTemplateOptions = (): PromptOptions | null => { - const c = getContext(); - if (c.files.project.config?.isTemplate) return null; - if (c.buildConfig.templates) { - return generateOptions(c.buildConfig.templates); - } - logError("You don't have any local templates installed", false, true); - return null; -}; - -export const isTemplateInstalled = () => { - const c = getContext(); - return c.buildConfig.currentTemplate ? doResolve(c.buildConfig.currentTemplate) : false; -}; - -export const applyTemplate = async (selectedTemplate?: string) => { - const c = getContext(); - logDefault('applyTemplate', `${c.buildConfig.currentTemplate}=>${selectedTemplate}`); - if (c.files.project.config?.isTemplate) return true; - - if (!c.files.project.config) { - logError('Project config not loaded. cannot apply template'); - return false; - } - - c.runtime.selectedTemplate = selectedTemplate; - - if (!c.buildConfig.currentTemplate) { - logWarning("You don't have any current template selected"); - const opts = getInstalledTemplateOptions(); - - if (opts) { - const { template } = await inquirerPrompt({ - type: 'list', - name: 'template', - message: 'Pick which template to apply', - choices: opts.keysAsArray, - }); - c.buildConfig.currentTemplate = template; - c.files.project.config.currentTemplate = template; - writeRenativeConfigFile(c.paths.project.config, c.files.project.config); - } else { - logError('Could not find any installed templates'); - } - } - - const templateIsInstalled = doResolve(c.buildConfig.currentTemplate); - if (!templateIsInstalled) { - // We Need template to be installed before other dependency resolutions (due to scoping) - await checkIfProjectAndNodeModulesExists(); - } - - await _applyTemplate(c); - await _configureSrc(c); - await _configureAppConfigs(c); - await _configureProjectConfig(c); - await _configureRenativeConfig(c); -}; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 4b0ea823ba..220a48c40b 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,46 +1,7 @@ -import type { ConfigFileBuildConfig } from './schema'; -import type { PlatformKey } from './schema/types'; - -export * from './schema/configFiles/types'; - -export type RnvPlatform = PlatformKey | null; - -export type RnvPlatformWithAll = PlatformKey | 'all'; +import { RnvPlatformName } from './enums/platformName'; +export type RnvPlatformKey = keyof typeof RnvPlatformName; +export type RnvPlatform = RnvPlatformKey | null; export type RenativeConfigVersion = string | { version: string }; - export type RnvError = any; - export type Env = Record; - -export type BabelConfig = { - retainLines?: boolean; - plugins?: Array< - [ - string, - { - root?: Array; - alias?: Record; - } - ] - >; - presets?: Array< - | string - | [ - string, - { - useTransformReactJSXExperimental?: boolean; - } - ] - >; -}; - -export type BabelApi = { - cache: (value: boolean) => void; -}; - -type Plat = Required['platforms']>[PlatformKey]; -export type PlatPropKey = keyof Plat; -export type BuildSchemePropKey = keyof Required['buildSchemes'][string]; -export type CommonPropKey = keyof ConfigFileBuildConfig['common']; -export type BuildConfigPropKey = keyof ConfigFileBuildConfig; diff --git a/packages/rnv/coreTemplateFiles/buildHooks/src/index.ts b/packages/core/templateFiles/buildHooksSrc/index.ts similarity index 53% rename from packages/rnv/coreTemplateFiles/buildHooks/src/index.ts rename to packages/core/templateFiles/buildHooksSrc/index.ts index 30cc2c7a20..09a75b36b3 100644 --- a/packages/rnv/coreTemplateFiles/buildHooks/src/index.ts +++ b/packages/core/templateFiles/buildHooksSrc/index.ts @@ -1,8 +1,8 @@ -import { RnvContext, logHook } from '@rnv/core'; +import { RnvContext } from '@rnv/core'; const hooks = { hello: async (c: RnvContext) => { - logHook('Hello build hook!'); + console.log('Hello build hook!', c.rnvVersion); }, }; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index a3988e5648..cfb20bba6a 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -5,5 +5,40 @@ "rootDir": "./src", "resolveJsonModule": false }, - "exclude": ["./src/**/*.test.ts", "./lib/**/*"] + "exclude": ["./src/**/*.test.ts", "./lib/**/*", "./templateFiles/**/*"] } + +// { +// "compilerOptions": { +// "incremental": true, +// "removeComments": true, +// "preserveConstEnums": true, +// "sourceMap": true, +// "strict": true, +// "noImplicitReturns": true, +// "moduleResolution": "node", +// "stripInternal": true, +// "noEmit": true, +// "lib": ["esnext", "dom"], +// "target": "esnext", +// "baseUrl": ".", +// "paths": { +// "@rxjs/observable": ["../observable/src/index"], +// "rxjs": ["./src/index"], +// "rxjs/operators": ["./src/operators/index"], +// "rxjs/testing": ["./src/testing/index"], +// "rxjs/ajax": ["./src/ajax/index"], +// "rxjs/webSocket": ["./src/webSocket/index"], +// "rxjs/fetch": ["./src/fetch/index"], +// "rxjs/internal/*": ["./src/internal/*"] +// } +// } +// } + +// interface EnvironmentVars { +// NAME: string; +// OS: string; + +// // Unknown properties are covered by this index signature. +// [propName: string]: string; +// } diff --git a/packages/engine-core/.gitignore b/packages/engine-core/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/engine-core/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/engine-core/package.json b/packages/engine-core/package.json index 14f22077db..a22f3b4f9a 100644 --- a/packages/engine-core/package.json +++ b/packages/engine-core/package.json @@ -29,12 +29,7 @@ "watch": "tsc --watch --preserveWatchOutput" }, "dependencies": { - "@rnv/sdk-android": "1.0.0-rc.12", - "@rnv/sdk-apple": "1.0.0-rc.12", - "@rnv/sdk-kaios": "1.0.0-rc.12", - "@rnv/sdk-tizen": "1.0.0-rc.12", "@rnv/sdk-utils": "1.0.0-rc.12", - "@rnv/sdk-webos": "1.0.0-rc.12", "iocane": "4.0.0", "kill-port": "1.6.1", "lodash": "4.17.21", diff --git a/packages/engine-core/src/buildSchemes.ts b/packages/engine-core/src/buildSchemes.ts index 2a3973324a..3a882a6460 100644 --- a/packages/engine-core/src/buildSchemes.ts +++ b/packages/engine-core/src/buildSchemes.ts @@ -4,7 +4,7 @@ import { chalk, getContext, inquirerPrompt, logDefault, logError, logInfo, logWa export const isBuildSchemeSupported = async () => { logDefault('isBuildSchemeSupported'); const c = getContext(); - const { scheme } = c.program; + const { scheme } = c.program.opts(); if (!c.platform) return; @@ -52,8 +52,8 @@ export const isBuildSchemeSupported = async () => { logMessage: 'You need to specify scheme', }); - c.program.scheme = schemeVals[selectedScheme]; - c.runtime.scheme = c.program.scheme; + c.program.opts().scheme = schemeVals[selectedScheme]; + c.runtime.scheme = c.program.opts().scheme; } logInfo(`Current Build Scheme: ${chalk().bold(c.runtime.scheme)}`); return true; diff --git a/packages/engine-core/src/common.ts b/packages/engine-core/src/common.ts deleted file mode 100644 index 4aebfcc1ec..0000000000 --- a/packages/engine-core/src/common.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { getContext, logDefault } from '@rnv/core'; -import { checkAndConfigureAndroidSdks, checkAndroidSdk } from '@rnv/sdk-android'; -import { checkAndConfigureTizenSdks, checkTizenSdk } from '@rnv/sdk-tizen'; -import { checkAndConfigureWebosSdks, checkWebosSdk } from '@rnv/sdk-webos'; - -export const checkAndConfigureSdks = async () => { - logDefault('checkAndConfigureSdks'); - - const c = getContext(); - - switch (c.platform) { - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - return checkAndConfigureAndroidSdks(); - case 'tizen': - case 'tizenmobile': - case 'tizenwatch': - return checkAndConfigureTizenSdks(); - case 'webos': - return checkAndConfigureWebosSdks(); - default: - return true; - } -}; - -export const checkSdk = async () => { - logDefault('checkSdk'); - const c = getContext(); - - switch (c.platform) { - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - return checkAndroidSdk(); - case 'tizen': - case 'tizenmobile': - case 'tizenwatch': - return checkTizenSdk(); - case 'webos': - return checkWebosSdk(); - default: - return true; - } -}; diff --git a/packages/engine-core/src/getContext.ts b/packages/engine-core/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-core/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-core/src/index.ts b/packages/engine-core/src/index.ts index 5f786a5acd..c076842b09 100644 --- a/packages/engine-core/src/index.ts +++ b/packages/engine-core/src/index.ts @@ -1,4 +1,4 @@ -import { RnvEngine, generateEngineTasks } from '@rnv/core'; +import { createRnvEngine, ConfigFileEngine, GetContextType } from '@rnv/core'; import taskCryptoDecrypt from './tasks/crypto/taskCryptoDecrypt'; import taskCryptoEncrypt from './tasks/crypto/taskCryptoEncrypt'; @@ -6,17 +6,14 @@ import taskPlatformEject from './tasks/platform/taskPlatformEject'; import taskPlatformConnect from './tasks/platform/taskPlatformConnect'; import taskPlatformList from './tasks/platform/taskPlatformList'; import taskPlatformConfigure from './tasks/platform/taskPlatformConfigure'; -import taskPlatformSetup from './tasks/platform/taskPlatformSetup'; -import taskTemplateAdd from './tasks/template/taskTemplateAdd'; +import taskPlatformSetup from './tasks/project/taskProjectPlatforms'; import taskTemplateApply from './tasks/template/taskTemplateApply'; -import taskTemplateList from './tasks/template/taskTemplateList'; import taskPluginAdd from './tasks/plugin/taskPluginAdd'; import taskPluginList from './tasks/plugin/taskPluginList'; import taskPluginUpdate from './tasks/plugin/taskPluginUpdate'; import taskWorkspaceList from './tasks/workspace/taskWorkspaceList'; import taskWorkspaceAdd from './tasks/workspace/taskWorkspaceAdd'; import taskWorkspaceConnect from './tasks/workspace/taskWorkspaceConnect'; -import taskWorkspaceUpdate from './tasks/workspace/taskWorkspaceUpdate'; import taskHooksList from './tasks/hooks/taskHooksList'; import taskHooksRun from './tasks/hooks/taskHooksRun'; import taskHooksPipes from './tasks/hooks/taskHooksPipes'; @@ -24,30 +21,34 @@ import taskClean from './tasks/global/taskClean'; import taskStatus from './tasks/global/taskStatus'; import taskConfig from './tasks/global/taskConfig'; import taskHelp from './tasks/global/taskHelp'; -import taskNew from './tasks/global/taskNew'; -import taskInstall from './tasks/global/taskInstall'; +import taskNew from './tasks/bootstrap/taskNew'; import taskProjectConfigure from './tasks/project/taskProjectConfigure'; import taskProjectUpgrade from './tasks/project/taskProjectUpgrade'; import taskAppConfigure from './tasks/app/taskAppConfigure'; import taskAppCreate from './tasks/app/taskAppCreate'; import taskWorkspaceConfigure from './tasks/workspace/taskWorkspaceConfigure'; -import taskConfigureSoft from './tasks/global/taskConfigureSoft'; +import taskConfigureSoft from './tasks/project/taskConfigureSoft'; import taskRvnKill from './tasks/global/taskKill'; import taskRvnDoctor from './tasks/global/taskDoctor'; -import taskTargetList from './tasks/target/taskTargetList'; -import taskTargetLaunch from './tasks/target/taskTargetLaunch'; import taskLink from './tasks/linking/taskLink'; import taskUnlink from './tasks/linking/taskUnlink'; import taskTelemetryStatus from './tasks/telemetry/taskTelemetryStatus'; import taskTelemetryEnable from './tasks/telemetry/taskTelemetryEnable'; import taskTelemetryDisable from './tasks/telemetry/taskTelemetryDisable'; import taskSwitch from './tasks/app/taskAppSwitch'; -import taskDeploy from './tasks/global/taskDeploy'; -const Engine: RnvEngine = { - runtimeExtraProps: {}, +const Config: ConfigFileEngine = { + id: 'engine-core', + platforms: {}, + npm: {}, + engineExtension: 'core', + overview: '', + packageName: '@rnv/engine-core', +}; + +const Engine = createRnvEngine({ serverDirName: '', - tasks: generateEngineTasks([ + tasks: [ taskCryptoDecrypt, taskCryptoEncrypt, taskPlatformEject, @@ -55,16 +56,13 @@ const Engine: RnvEngine = { taskPlatformList, taskPlatformConfigure, taskPlatformSetup, - taskTemplateAdd, taskTemplateApply, - taskTemplateList, taskPluginAdd, taskPluginList, taskPluginUpdate, taskWorkspaceList, taskWorkspaceAdd, taskWorkspaceConnect, - taskWorkspaceUpdate, taskHooksList, taskHooksRun, taskHooksPipes, @@ -73,7 +71,6 @@ const Engine: RnvEngine = { taskConfig, taskHelp, taskNew, - taskInstall, taskProjectConfigure, taskProjectUpgrade, taskAppConfigure, @@ -82,29 +79,22 @@ const Engine: RnvEngine = { taskConfigureSoft, taskRvnKill, taskRvnDoctor, - taskTargetList, - taskTargetLaunch, taskLink, taskUnlink, taskTelemetryStatus, taskTelemetryEnable, taskTelemetryDisable, taskSwitch, - taskDeploy, - ]), - config: { - // title: 'Engine Core', - id: 'engine-core', - platforms: {}, - npm: {}, - engineExtension: 'core', - overview: '', - }, + ], + config: Config, // package: '', projectDirName: '', // ejectPlatform: null, platforms: {}, rootPath: __dirname, -}; +}); + +// export newly decorated type for getContext proxy with decorated types +export type GetContext = GetContextType; export default Engine; diff --git a/packages/engine-core/src/taskHelpers.ts b/packages/engine-core/src/taskHelpers.ts new file mode 100644 index 0000000000..5765839a43 --- /dev/null +++ b/packages/engine-core/src/taskHelpers.ts @@ -0,0 +1,36 @@ +import { + areNodeModulesInstalled, + checkForPluginDependencies, + getContext, + installPackageDependencies, + logDefault, + overrideTemplatePlugins, +} from '@rnv/core'; +import { configureFonts } from '@rnv/sdk-utils'; + +export const installPackageDependenciesAndPlugins = async () => { + logDefault('installPackageDependenciesAndPlugins'); + + await installPackageDependencies(); + await overrideTemplatePlugins(); + await configureFonts(); + await checkForPluginDependencies(async () => { + await installPackageDependenciesAndPlugins(); + }); +}; + +export const checkAndInstallIfRequired = async () => { + const ctx = getContext(); + if (ctx.program.opts().skipDependencyCheck) return true; + const isNmInstalled = areNodeModulesInstalled(); + if (isNmInstalled && !ctx._requiresNpmInstall) { + return true; + } + // if (!isNmInstalled) { + // logInfo('node_modules folder is missing. INSTALLING...'); + // } else if (ctx._requiresNpmInstall) { + // logInfo('node_modules folder is out of date. INSTALLING...'); + // } + + await installPackageDependenciesAndPlugins(); +}; diff --git a/packages/engine-core/src/tasks/app/taskAppConfigure.ts b/packages/engine-core/src/tasks/app/taskAppConfigure.ts index 8ced25d6d4..1ef7ad8456 100644 --- a/packages/engine-core/src/tasks/app/taskAppConfigure.ts +++ b/packages/engine-core/src/tasks/app/taskAppConfigure.ts @@ -18,8 +18,8 @@ import { inquirerPrompt, RnvContext, inquirerSeparator, - RnvTask, RnvTaskName, + createTask, } from '@rnv/core'; const _loadAppConfigIDfromDir = (dirName: string, appConfigsDir: string) => { @@ -36,12 +36,12 @@ const _loadAppConfigIDfromDir = (dirName: string, appConfigsDir: string) => { return { dir: dirName, id: null }; }; -const _askUserAboutConfigs = async (c: RnvContext, dir: string, id: string, basePath: string) => { +const _askUserAboutConfigs = async (ctx: RnvContext, dir: string, id: string, basePath: string) => { logTask('_askUserAboutConfigs'); logWarning( `AppConfig error - It seems you have a mismatch between appConfig folder name (${dir}) and the id defined in renative.json (${id}). They must match.` ); - if (c.program.ci === true) { + if (ctx.program.opts().ci === true) { throw new Error('You cannot continue if you set --ci flag. please fix above error first'); } const { choice } = await inquirerPrompt({ @@ -89,19 +89,19 @@ const _askUserAboutConfigs = async (c: RnvContext, dir: string, id: string, base }; /* eslint-disable no-await-in-loop */ -const matchAppConfigID = async (c: RnvContext, appConfigID: string) => { +const matchAppConfigID = async (ctx: RnvContext, appConfigID: string) => { logTask('matchAppConfigID', `appId:${appConfigID}`); if (!appConfigID) return false; - const { appConfigsDirs, appConfigsDirNames } = c.paths.project; + const { appConfigsDirs, appConfigsDirNames } = ctx.paths.project; const acIndex = appConfigsDirNames.indexOf(appConfigID); if (acIndex !== -1) { let conf = _loadAppConfigIDfromDir(appConfigID, appConfigsDirs[acIndex]); const { dir, id } = conf; if (id !== dir) { - conf = await _askUserAboutConfigs(c, conf.dir, conf.id, path.join(appConfigsDirs[acIndex], '..')); + conf = await _askUserAboutConfigs(ctx, conf.dir, conf.id, path.join(appConfigsDirs[acIndex], '..')); } return conf.id; @@ -109,14 +109,14 @@ const matchAppConfigID = async (c: RnvContext, appConfigID: string) => { return false; }; -const _findAndSwitchAppConfigDir = async (c: RnvContext) => { +const _findAndSwitchAppConfigDir = async (ctx: RnvContext) => { logTask('_findAndSwitchAppConfigDir'); - const { appConfigsDirNames } = c.paths.project; + const { appConfigsDirNames } = ctx.paths.project; if (appConfigsDirNames.length) { if (appConfigsDirNames.length === 1) { // we have only one, skip the question logInfo(`Found only one app config available. Will use ${chalk().bold(appConfigsDirNames[0])}`); - _setAppId(c, appConfigsDirNames[0]); + _setAppId(ctx, appConfigsDirNames[0]); return true; } @@ -130,7 +130,7 @@ const _findAndSwitchAppConfigDir = async (c: RnvContext) => { }); if (conf) { - _setAppId(c, conf); + _setAppId(ctx, conf); return true; } } @@ -138,79 +138,72 @@ const _findAndSwitchAppConfigDir = async (c: RnvContext) => { return false; }; -const _setAppId = (c: RnvContext, appId: string) => { - const currentAppConfigId = c.files.project?.configLocal?._meta?.currentAppConfigId; +const _setAppId = (ctx: RnvContext, appId: string) => { + const currentAppConfigId = ctx.files.project?.configLocal?._meta?.currentAppConfigId; - logTask('_setAppId', `appId:${appId} runtime.appId:${c.runtime.appId} _meta.appId:${currentAppConfigId}`); - c.runtime.appId = appId || c.runtime.appId || currentAppConfigId; - c.runtime.appDir = path.join(c.paths.project.builds.dir, `${c.runtime.appId}_${c.platform}`); + logTask('_setAppId', `appId:${appId} runtime.appId:${ctx.runtime.appId} _meta.appId:${currentAppConfigId}`); + ctx.runtime.appId = appId || ctx.runtime.appId || currentAppConfigId; + ctx.runtime.appDir = path.join(ctx.paths.project.builds.dir, `${ctx.runtime.appId}_${ctx.platform}`); }; -const taskAppConfigure = async (c: RnvContext) => { - logTask('taskAppConfigure'); - - c.paths.project.appConfigsDirNames = listAppConfigsFoldersSync(true); - c.paths.project.appConfigsDirNames.forEach((dirName) => { - c.paths.project.appConfigsDirs.push(path.join(c.paths.project.appConfigsDir, dirName)); - }); - - const appConfigsDirsExt = c.buildConfig?.paths?.appConfigsDirs; - if (appConfigsDirsExt) { - appConfigsDirsExt.forEach((apePath) => { - const appConfigsExt = listAppConfigsFoldersSync(true, apePath); - appConfigsExt.forEach((appExtName) => { - c.paths.project.appConfigsDirNames.push(appExtName); - c.paths.project.appConfigsDirs.push(path.join(apePath, appExtName)); - }); +export default createTask({ + description: 'Configure project with specific appConfig', + fn: async ({ ctx }) => { + ctx.paths.project.appConfigsDirNames = listAppConfigsFoldersSync(true); + ctx.paths.project.appConfigsDirNames.forEach((dirName) => { + ctx.paths.project.appConfigsDirs.push(path.join(ctx.paths.project.appConfigsDir, dirName)); }); - } - // Reset appId if appConfig no longer exists but renative.local.json still has reference to it - if (c.runtime.appId && !c.paths.project.appConfigsDirNames.includes(c.runtime.appId)) { - c.runtime.appId = undefined; - } + const appConfigsDirsExt = ctx.buildConfig?.paths?.appConfigsDirs; + if (appConfigsDirsExt) { + appConfigsDirsExt.forEach((apePath) => { + const appConfigsExt = listAppConfigsFoldersSync(true, apePath); + appConfigsExt.forEach((appExtName) => { + ctx.paths.project.appConfigsDirNames.push(appExtName); + ctx.paths.project.appConfigsDirs.push(path.join(apePath, appExtName)); + }); + }); + } - if (c.program.appConfigID === true || (!c.program.appConfigID && !c.runtime.appId)) { - const hasAppConfig = await _findAndSwitchAppConfigDir(c); - if (!hasAppConfig) { - // await executeTask(c, RnvTaskName.appCreate, RnvTaskName.appConfigure); - // return Promise.reject('No app configs found for this project'); - logWarning('No app configs found for this project'); - return true; + // Reset appId if appConfig no longer exists but renative.local.json still has reference to it + if (ctx.runtime.appId && !ctx.paths.project.appConfigsDirNames.includes(ctx.runtime.appId)) { + ctx.runtime.appId = undefined; } - } else if (c.program.appConfigID) { - const aid = await matchAppConfigID(c, c.program.appConfigID); - if (!aid) { - logWarning(`Cannot find app config ${chalk().bold(c.program.appConfigID)}`); - const hasAppConfig = await _findAndSwitchAppConfigDir(c); + + if (ctx.program.opts().appConfigID === true || (!ctx.program.opts().appConfigID && !ctx.runtime.appId)) { + const hasAppConfig = await _findAndSwitchAppConfigDir(ctx); if (!hasAppConfig) { // await executeTask(c, RnvTaskName.appCreate, RnvTaskName.appConfigure); // return Promise.reject('No app configs found for this project'); logWarning('No app configs found for this project'); return true; } + } else if (ctx.program.opts().appConfigID) { + const aid = await matchAppConfigID(ctx, ctx.program.opts().appConfigID); + if (!aid) { + logWarning(`Cannot find app config ${chalk().bold(ctx.program.opts().appConfigID)}`); + const hasAppConfig = await _findAndSwitchAppConfigDir(ctx); + if (!hasAppConfig) { + // await executeTask(c, RnvTaskName.appCreate, RnvTaskName.appConfigure); + // return Promise.reject('No app configs found for this project'); + logWarning('No app configs found for this project'); + return true; + } + } + _setAppId(ctx, aid); } - _setAppId(c, aid); - } - - // Generate true path to appConfig (ensure external appConfigsDirs are included) - if (c.runtime.appId) { - c.runtime.appConfigDir = - c.paths.project.appConfigsDirs[c.paths.project.appConfigsDirNames.indexOf(c.runtime.appId)]; - } - await updateRenativeConfigs(); - logAppInfo(c); + // Generate true path to appConfig (ensure external appConfigsDirs are included) + if (ctx.runtime.appId) { + ctx.runtime.appConfigDir = + ctx.paths.project.appConfigsDirs[ctx.paths.project.appConfigsDirNames.indexOf(ctx.runtime.appId)]; + } - return true; -}; + await updateRenativeConfigs(); + logAppInfo(ctx); -const Task: RnvTask = { - description: 'Configure project with specific appConfig', - fn: taskAppConfigure, + return true; + }, task: RnvTaskName.appConfigure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: [], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), +}); diff --git a/packages/engine-core/src/tasks/app/taskAppCreate.ts b/packages/engine-core/src/tasks/app/taskAppCreate.ts index bc15e52a5c..1f75c73b54 100644 --- a/packages/engine-core/src/tasks/app/taskAppCreate.ts +++ b/packages/engine-core/src/tasks/app/taskAppCreate.ts @@ -7,79 +7,76 @@ import { fsReaddirSync, readObjectSync, writeFileSync, - doResolve, - RnvTaskFn, configureRuntimeDefaults, inquirerPrompt, logInfo, logTask, - RnvTaskOptionPresets, - RnvTask, ConfigFileApp, RnvTaskName, + createTask, } from '@rnv/core'; +import { getContext } from '../../getContext'; -const taskAppCreate: RnvTaskFn = async (c) => { - logTask('taskAppCreate'); +export default createTask({ + description: 'Create new app config', + fn: async () => { + logTask('taskAppCreate'); - await configureRuntimeDefaults(); + await configureRuntimeDefaults(); - let sourcePath: string | undefined; + let sourcePath: string | undefined; - if (c.program.sourceAppConfigID) { - const sourceAppConfigDirPath = path.join(c.paths.project.appConfigsDir, c.program.sourceAppConfigID); + const c = getContext(); - if (fsExistsSync(sourceAppConfigDirPath)) { - sourcePath = sourceAppConfigDirPath; - } - } else if (c.program.ci) { - if (c.buildConfig.currentTemplate) { - const tacPath = doResolve(c.buildConfig.currentTemplate); - if (tacPath && fsExistsSync(tacPath)) { - const tacDirsPath = path.join(tacPath, 'appConfigs'); - const tacDirs = fsReaddirSync(tacDirsPath); - tacDirs.forEach((v) => { - if (v !== 'base') { - const pth = path.join(tacDirsPath, v); - if (fsLstatSync(pth).isDirectory()) { - sourcePath = pth; - } - } - }); - } - } - } else { - const appConfigChoicesObj: Record< - string, - { - path: string; + if (c.program.opts().sourceAppConfigID) { + const sourceAppConfigDirPath = path.join(c.paths.project.appConfigsDir, c.program.opts().sourceAppConfigID); + + if (fsExistsSync(sourceAppConfigDirPath)) { + sourcePath = sourceAppConfigDirPath; } - > = {}; - const appConfigChoices: Array = []; - // Project Configs - const acDirs = fsReaddirSync(c.paths.project.appConfigsDir); - acDirs.forEach((v) => { - if (v !== 'base') { - const pth = path.join(c.paths.project.appConfigsDir, v); - if (fsLstatSync(pth).isDirectory()) { - const key = `project>${v}`; - appConfigChoices.push(key); - appConfigChoicesObj[key] = { - path: pth, - }; + } else if (c.program.opts().ci) { + if (c.paths.template.appConfigsDir) { + if (fsExistsSync(c.paths.template.appConfigsDir)) { + const tacDirs = fsReaddirSync(c.paths.template.appConfigsDir); + tacDirs.forEach((v) => { + if (v !== 'base') { + const pth = path.join(c.paths.template.appConfigsDir, v); + if (fsLstatSync(pth).isDirectory()) { + sourcePath = pth; + } + } + }); } } - }); - - // Template Configs - if (c.buildConfig.currentTemplate) { - const tacPath = doResolve(c.buildConfig.currentTemplate); - if (tacPath && fsExistsSync(tacPath)) { - const tacDirsPath = path.join(tacPath, 'appConfigs'); - const tacDirs = fsReaddirSync(tacDirsPath); + } else { + const appConfigChoicesObj: Record< + string, + { + path: string; + } + > = {}; + const appConfigChoices: Array = []; + // Project Configs + const acDirs = fsReaddirSync(c.paths.project.appConfigsDir); + acDirs.forEach((v) => { + if (v !== 'base') { + const pth = path.join(c.paths.project.appConfigsDir, v); + if (fsLstatSync(pth).isDirectory()) { + const key = `project>${v}`; + appConfigChoices.push(key); + appConfigChoicesObj[key] = { + path: pth, + }; + } + } + }); + + // Template Configs + if (c.paths.template.appConfigsDir) { + const tacDirs = fsReaddirSync(c.paths.template.appConfigsDir); tacDirs.forEach((v) => { if (v !== 'base') { - const pth = path.join(tacDirsPath, v); + const pth = path.join(c.paths.template.appConfigsDir, v); if (fsLstatSync(pth).isDirectory()) { const key = `template>${v}`; appConfigChoices.push(key); @@ -90,86 +87,85 @@ const taskAppCreate: RnvTaskFn = async (c) => { } }); } + + const { sourceAppConfig } = await inquirerPrompt({ + name: 'sourceAppConfig', + type: 'list', + choices: appConfigChoices, + message: 'Which App config to use as copy source?', + }); + + sourcePath = appConfigChoicesObj[sourceAppConfig].path; } - const { sourceAppConfig } = await inquirerPrompt({ - name: 'sourceAppConfig', - type: 'list', - choices: appConfigChoices, - message: 'Which App config to use as copy source?', - }); - - sourcePath = appConfigChoicesObj[sourceAppConfig].path; - } - - let destPath; - let appConfigId; - if (c.program.appConfigID) { - appConfigId = c.program.appConfigID.toLowerCase(); - destPath = path.join(c.paths.project.appConfigsDir, appConfigId); - } else { - const { confName } = await inquirerPrompt({ - name: 'confName', - type: 'input', - message: 'Type name of app config (lowercase)', - }); - appConfigId = confName.toLowerCase(); - destPath = path.join(c.paths.project.appConfigsDir, appConfigId); - } - - logInfo('Copying new app config...'); - if (sourcePath) await copyFolderContentsRecursive(sourcePath, destPath); - logInfo('Copying new app config...DONE'); - - const confObjPath = path.join(destPath, 'renative.json'); - const confObj = readObjectSync(confObjPath) || {}; - - confObj.id = appConfigId; - confObj.common = confObj.common || {}; - - let appConfigTitle; - if (c.program.title) { - appConfigTitle = c.program.title; - } else if (c.program.ci) { - // Ignore - } else { - const { confTitle } = await inquirerPrompt({ - name: 'confTitle', - type: 'input', - default: confObj.common?.title || '', - message: 'Type the title of the app', - }); - appConfigTitle = confTitle; - } - confObj.common.title = appConfigTitle || confObj.common.title; - - let bundleId; - if (c.program.id) { - bundleId = c.program.id; - } else if (c.program.ci) { - // Ignore - } else { - const { confId } = await inquirerPrompt({ - name: 'confId', - type: 'input', - default: confObj.common?.id || '', - message: 'Type the id of the app (bundle identifier)', - }); - bundleId = confId; - } - confObj.common.id = bundleId || confObj.common.id; - - writeFileSync(confObjPath, confObj); - - return true; -}; - -const Task: RnvTask = { - description: 'Create new app config', - fn: taskAppCreate, - task: RnvTaskName.appCreate, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; + let destPath; + let appConfigId; + if (c.program.opts().appConfigID) { + appConfigId = c.program.opts().appConfigID.toLowerCase(); + destPath = path.join(c.paths.project.appConfigsDir, appConfigId); + } else { + const { confName } = await inquirerPrompt({ + name: 'confName', + type: 'input', + message: 'Type name of app config (lowercase)', + }); + appConfigId = confName.toLowerCase(); + destPath = path.join(c.paths.project.appConfigsDir, appConfigId); + } -export default Task; + logInfo('Copying new app config...'); + if (sourcePath) await copyFolderContentsRecursive(sourcePath, destPath); + logInfo('Copying new app config...DONE'); + + const confObjPath = path.join(destPath, 'renative.json'); + const confObj = readObjectSync(confObjPath) || {}; + + confObj.id = appConfigId; + confObj.common = confObj.common || {}; + + let appConfigTitle; + if (c.program.opts().title) { + appConfigTitle = c.program.opts().title; + } else if (c.program.opts().ci) { + // Ignore + } else { + const { confTitle } = await inquirerPrompt({ + name: 'confTitle', + type: 'input', + default: confObj.common?.title || '', + message: 'Type the title of the app', + }); + appConfigTitle = confTitle; + } + confObj.common.title = appConfigTitle || confObj.common.title; + + let bundleId; + if (c.program.opts().id) { + bundleId = c.program.opts().id; + } else if (c.program.opts().ci) { + // Ignore + } else { + const { confId } = await inquirerPrompt({ + name: 'confId', + type: 'input', + default: confObj.common?.id || '', + message: 'Type the id of the app (bundle identifier)', + }); + bundleId = confId; + } + confObj.common.id = bundleId || confObj.common.id; + + writeFileSync(confObjPath, confObj); + + return true; + }, + options: [ + { + key: 'sourceAppConfigID', + isValueType: true, + isRequired: true, + description: 'name of source appConfig folder to copy from', + }, + ], + task: RnvTaskName.appCreate, +}); diff --git a/packages/engine-core/src/tasks/app/taskAppSwitch.ts b/packages/engine-core/src/tasks/app/taskAppSwitch.ts index e18ab7ad40..ba7a3672cc 100644 --- a/packages/engine-core/src/tasks/app/taskAppSwitch.ts +++ b/packages/engine-core/src/tasks/app/taskAppSwitch.ts @@ -1,35 +1,16 @@ -import { - logTask, - configureFonts, - copyRuntimeAssets, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - generatePlatformAssetsRuntimeConfig, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { copyRuntimeAssets, createTask, generatePlatformAssetsRuntimeConfig, RnvTaskName } from '@rnv/core'; +import { configureFonts } from '@rnv/sdk-utils'; -const taskSwitch: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskSwitch'); - - c.program.appConfigID = true; - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.appSwitch, originTask); - - await copyRuntimeAssets(); - await generatePlatformAssetsRuntimeConfig(); - await configureFonts(); - - return true; -}; - -const Task: RnvTask = { +export default createTask({ description: 'Switch between different app configs in current project', - fn: taskSwitch, + beforeDependsOn: async ({ ctx }) => { + ctx.program.opts().appConfigID = true; + }, + dependsOn: [RnvTaskName.projectConfigure], + fn: async () => { + await copyRuntimeAssets(); + await generatePlatformAssetsRuntimeConfig(); + await configureFonts(); + }, task: RnvTaskName.appSwitch, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/bootstrap/__tests__/taskNew.test.ts b/packages/engine-core/src/tasks/bootstrap/__tests__/taskNew.test.ts new file mode 100644 index 0000000000..c4682cd7dd --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/__tests__/taskNew.test.ts @@ -0,0 +1,115 @@ +import { getContext, createRnvContext } from '@rnv/core'; +import taskNew from '../taskNew'; +import { + initNewProject, + saveProgressIntoProjectConfig, + telemetryNewProject, + processChdirToProject, +} from '../questionHelpers'; +import { NewProjectData } from '../types'; +import appConfigs from '../questions/appConfigs'; +import bootstrapQuestions from '../questions/bootstrapQuestions'; +import confirmGit from '../questions/confirmGit'; +import isRenativeProject from '../questions/isRenativeProject'; +import hasNodeModules from '../questions/hasNodeModules'; +import projectName from '../questions/projectName'; +import workspace from '../questions/workspace'; +import supportedPlatforms from '../questions/supportedPlatforms'; +import appTitle from '../questions/appTitle'; +import appID from '../questions/appID'; +import appVersion from '../questions/appVersion'; +import installTemplate from '../questions/installTemplate'; +import applyTemplate from '../questions/applyTemplate'; +import bookmarkTemplate from '../questions/bookmarkTemplate'; +import configTemplates from '../questions/configTemplates'; +import projectFolder from '../questions/projectFolder'; +import installProject from '../questions/installProject'; + +jest.mock('@rnv/core'); +jest.mock('lodash/set'); +jest.mock('path'); +jest.mock('semver'); +jest.mock('../questions/bootstrapQuestions'); +jest.mock('../questions/appTitle'); +jest.mock('../questions/installTemplate'); +jest.mock('../questions/applyTemplate'); +jest.mock('../questions/bookmarkTemplate'); +jest.mock('../questions/appID'); +jest.mock('../questions/appVersion'); +jest.mock('../questions/workspace'); +jest.mock('../questions/hasNodeModules'); +jest.mock('../questions/isRenativeProject'); +jest.mock('../questions/projectName'); +jest.mock('../questions/supportedPlatforms'); +jest.mock('../questions/confirmGit'); +jest.mock('../questions/configTemplates'); +jest.mock('../questions/projectFolder'); +jest.mock('../questions/installProject'); +jest.mock('../questionHelpers'); +jest.mock('../questions/appConfigs'); + +beforeEach(() => { + createRnvContext(); +}); + +afterEach(() => { + jest.resetAllMocks(); +}); + +test('Execute task.rnv.new', async () => { + // GIVEN + const ctx = getContext(); + const payload: NewProjectData = { + defaults: { + appVersion: 'MOCK_VERSION', + templateName: 'MOCK_TEMPLATE', + projectName: 'MOCK_PROJECT_NAME', + appTitle: 'MOCK_APP_TITLE', + workspaceID: 'MOCK_WORKSPACE', + }, + inputs: {}, + files: { + project: { + renativeConfig: {}, + packageJson: {}, + }, + configTemplates: {}, + template: { + renativeTemplateConfig: {}, + renativeConfig: {}, + }, + }, + }; + jest.mocked(initNewProject).mockResolvedValue(payload); + // WHEN + const result = await taskNew.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }); + // THEN + expect(result).toEqual(true); + expect(initNewProject).toHaveBeenCalled(); + expect(projectName).toHaveBeenCalledWith(payload); + expect(processChdirToProject).toHaveBeenCalled(); + expect(isRenativeProject).toHaveBeenCalledWith(payload); + expect(hasNodeModules).toHaveBeenCalledWith(payload); + expect(installTemplate).toHaveBeenCalledWith(payload); + expect(applyTemplate).toHaveBeenCalledWith(payload); + expect(saveProgressIntoProjectConfig).toHaveBeenCalledWith(payload); + expect(appTitle).toHaveBeenCalledWith(payload); + expect(appID).toHaveBeenCalledWith(payload); + expect(appVersion).toHaveBeenCalledWith(payload); + expect(workspace).toHaveBeenCalledWith(payload); + expect(supportedPlatforms).toHaveBeenCalledWith(payload); + expect(bootstrapQuestions).toHaveBeenCalledWith(payload); + expect(confirmGit).toHaveBeenCalledWith(payload); + expect(bookmarkTemplate).toHaveBeenCalledWith(payload); + expect(appConfigs).toHaveBeenCalledWith(payload); + expect(telemetryNewProject).toHaveBeenCalledWith(payload); + expect(configTemplates).toHaveBeenCalled(); + expect(projectFolder).toHaveBeenCalled(); + expect(installProject).toHaveBeenCalled(); +}); diff --git a/packages/engine-core/src/tasks/bootstrap/questionHelpers.ts b/packages/engine-core/src/tasks/bootstrap/questionHelpers.ts new file mode 100644 index 0000000000..cf0c2ec536 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questionHelpers.ts @@ -0,0 +1,214 @@ +import { + RnvPlatformKey, + RnvFileName, + chalk, + getApi, + getContext, + inquirerPrompt, + isYarnInstalled, + logDebug, + populateContextPaths, + updateRenativeConfigs, + writeFileSync, +} from '@rnv/core'; +import path from 'path'; +import { NewProjectData } from './types'; + +export const processChdirToProject = async () => { + const c = getContext(); + // In order to execute rnv from new origin (sub folder we need to reset paths to new cwd()) + process.chdir(c.paths.project.dir); + populateContextPaths(c, c.paths.rnv.dir); + return true; +}; + +export const checkInputValue = (value: string | boolean): boolean => { + return value && typeof value === 'string' && value !== '' ? true : false; +}; + +export const validateAndAssign = async ( + { + value, + validFn, + name, + defaultVal, + message, + warning, + }: { + value: string; + validFn: (value: string) => true | string; + name: string; + defaultVal: (() => string) | string | undefined; + message: string; + warning: string; + }, + ci: boolean +): Promise => { + const isValid = validFn(value); + if (value && isValid === true) { + return value; + } else { + const warningMessage = typeof isValid === 'string'; + const answer = await inquirerPrompt({ + name, + type: 'input', + default: defaultVal, + validate: validFn, + message, + warningMessage: ci && warningMessage ? warning : undefined, + }); + return answer[name]; + } +}; + +export const saveProgressIntoProjectConfig = async (data: NewProjectData) => { + const c = getContext(); + writeFileSync(c.paths.project.config, data.files.project.renativeConfig); + writeFileSync(c.paths.project.package, data.files.project.packageJson); +}; + +export const initNewProject = async () => { + const c = getContext(); + + c.paths.project.package = path.join(c.paths.project.dir, RnvFileName.package); + c.paths.project.config = path.join(c.paths.project.dir, RnvFileName.renative); + + const data: NewProjectData = { + defaults: { + appVersion: '0.1.0', + templateName: '@rnv/template-starter', + projectName: 'My Renative Project', + appTitle: 'My Renative App', + workspaceID: 'rnv', + }, + inputs: {}, + files: { + project: { + renativeConfig: {}, + packageJson: {}, + }, + configTemplates: {}, + template: { + renativeTemplateConfig: {}, + renativeConfig: {}, + }, + }, + }; + // TODO: This enforces to generate initial runtime configs. find more reliable way to do this + await updateRenativeConfigs(); + return data; +}; + +export const configureConfigOverrides = async (data: NewProjectData) => { + const { inputs, files } = data; + const { renativeConfig } = files.project; + + const c = getContext(); + + const supPlats = inputs.supportedPlatforms || []; + + // In case of copied config instead of extended we want to cleanup unused platforms + if (renativeConfig.platforms) { + Object.keys(renativeConfig.platforms).forEach((k) => { + const key = k as RnvPlatformKey; + if (!supPlats.includes(key) && renativeConfig.platforms) { + delete renativeConfig.platforms[key]; + } + }); + } + + // This is project config override only + renativeConfig.defaults = renativeConfig.defaults || {}; + renativeConfig.defaults.supportedPlatforms = supPlats; + renativeConfig.engines = renativeConfig.engines || {}; + + // This is merged config result + const loadedConf = c.files.project.config; + + // Configure only required engines based on supportedPlatforms + const engines = files.project.renativeConfig?.engines; + if (engines) { + // Remove unused engines based on selected platforms + supPlats.forEach((k) => { + const selectedEngineId = + loadedConf?.platforms?.[k]?.engine || c.files.rnvConfigTemplates.config?.platformTemplates?.[k]?.engine; + + if (selectedEngineId) { + const selectedEngine = findEngineKeyById(selectedEngineId); + if (selectedEngine?.key && renativeConfig.engines) { + renativeConfig.engines[selectedEngine.key] = engines[selectedEngine.key]; + } + } + }); + } + Object.keys(renativeConfig.engines).forEach((engKey) => { + const engVersion = files.configTemplates.config?.engineTemplates?.[engKey]?.version; + if (engVersion) { + if (files.project.packageJson.devDependencies) { + files.project.packageJson.devDependencies[engKey] = engVersion; + } + } + }); +}; + +export const telemetryNewProject = async (data: NewProjectData) => { + // Do not log telementry when developing rnv + if (getContext().paths.IS_LINKED) return; + try { + const { inputs } = data; + getApi().analytics.captureEvent({ + type: 'newProject', + template: inputs.template?.packageName, + platforms: inputs.supportedPlatforms, + }); + } catch (e) { + logDebug(e); + } +}; + +export const generateProjectOverview = (data: NewProjectData) => { + const { inputs } = data; + + // const addon = inputs.template?.localPath ? ` ${chalk().gray(inputs.template?.localPath)}` : ''; + const tempString = inputs.template?.localPath || `${inputs.template?.packageName}@${inputs.template?.version}`; + + const highlight = chalk().bold; + + const installAddon = !inputs.confirmProjectInstall ? `\n ${isYarnInstalled() ? 'yarn' : 'npm install'}` : ''; + + const str = ` Generated Project Summary: + ------------------------- + Project Name (--projectName): ${highlight(inputs.projectName)} + Package name: ${highlight(inputs.packageName)} + Project Version (--appVersion): ${highlight(inputs.appVersion)} + Workspace (--workspace): ${highlight(inputs.workspaceID)} + App Title (--title): ${highlight(inputs.appTitle)} + App ID (--id): ${highlight(inputs.appID)} + Project Template (--template): ${highlight(tempString)} + Git Enabled (--gitEnabled): ${highlight(inputs.confirmEnableGit)} + Enabled Platforms: ${highlight((inputs.supportedPlatforms || []).join(', '))} + ------------------------- + ${chalk().green('✔ Your project is ready!')} Run it with: +${chalk().bold(` + cd ${inputs.projectFolderName}${installAddon} + npx rnv run`)}`; + + return str; +}; + +const findEngineKeyById = (id: string) => { + const c = getContext(); + const engineTemplates = c.files.rnvConfigTemplates.config?.engineTemplates; + if (engineTemplates) { + const etk = Object.keys(engineTemplates); + for (let i = 0; i < etk.length; i++) { + const engine = engineTemplates[etk[i]]; + if (engine) { + if (engine.id === id) { + engine.key = etk[i]; + return engine; + } + } + } + } +}; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/appConfigs.ts b/packages/engine-core/src/tasks/bootstrap/questions/appConfigs.ts new file mode 100644 index 0000000000..477d0761ab --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/appConfigs.ts @@ -0,0 +1,39 @@ +import { + type ConfigFileApp, + getContext, + listAppConfigsFoldersSync, + readObjectSync, + logInfo, + chalk, + RnvFileName, + writeFileSync, +} from '@rnv/core'; +import type { NewProjectData } from '../types'; +import path from 'path'; + +const Question = async (data: NewProjectData): Promise => { + const c = getContext(); + const { inputs } = data; + // Update appConfigs with new appTitle and appID + const appConfigs = listAppConfigsFoldersSync(true); + if (appConfigs && appConfigs.length > 0) { + appConfigs.forEach((appConfigID) => { + const appCnfPath = path.join(c.paths.project.appConfigsDir, appConfigID, RnvFileName.renative); + const appConfig = readObjectSync(appCnfPath); + if (appConfig) { + appConfig.common = appConfig.common || {}; + appConfig.common.title = inputs.appTitle; + appConfig.common.id = inputs.appID; + appConfig.common.description = `This is ${inputs.appTitle} app!`; + logInfo( + `Updating appConfig ${chalk().bold(appConfigID)} with title: ${chalk().bold( + inputs.appTitle + )} and id: ${chalk().bold(inputs.appID)}` + ); + writeFileSync(appCnfPath, appConfig); + } + }); + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/appID.ts b/packages/engine-core/src/tasks/bootstrap/questions/appID.ts new file mode 100644 index 0000000000..f74a2072c8 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/appID.ts @@ -0,0 +1,31 @@ +import type { NewProjectData } from '../types'; +import { validateAndAssign } from '../questionHelpers'; +import { getContext } from '../../../getContext'; + +const Question = async (data: NewProjectData): Promise => { + const c = getContext(); + const { id, ci } = c.program.opts(); + const { inputs } = data; + const validator = (appId: string) => + (typeof appId === 'string' && !!appId.match(/^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+[0-9a-z_]$/)) || + 'Please enter a valid app ID (com.test.app)'; + + const result = await validateAndAssign( + { + value: id, + validFn: validator, + name: 'inputAppID', + defaultVal: () => { + inputs.appID = `com.mycompany.${inputs.projectName?.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()}`; + return inputs.appID; + }, + message: "What's your App ID?", + warning: `Command contains invalid appId : ${id}`, + }, + ci + ); + + inputs.appID = result ? result.replace(/\s+/g, '-').toLowerCase() : inputs.appID; +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/appTitle.ts b/packages/engine-core/src/tasks/bootstrap/questions/appTitle.ts new file mode 100644 index 0000000000..bda6a4e573 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/appTitle.ts @@ -0,0 +1,26 @@ +import type { NewProjectData } from '../types'; +import { checkInputValue, validateAndAssign } from '../questionHelpers'; +import { getContext } from '../../../getContext'; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + const { title, ci } = c.program.opts(); + const { inputs, defaults } = data; + const validator = (val: string) => checkInputValue(val) || 'Please enter a title'; + + const result = await validateAndAssign( + { + value: title, + validFn: validator, + name: 'inputAppTitle', + defaultVal: defaults.appTitle, + message: "What's your project Title?", + warning: 'Title was not provided', + }, + ci + ); + + inputs.appTitle = result || defaults.appTitle; +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/appVersion.ts b/packages/engine-core/src/tasks/bootstrap/questions/appVersion.ts new file mode 100644 index 0000000000..e0d494a870 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/appVersion.ts @@ -0,0 +1,30 @@ +import type { NewProjectData } from '../types'; +import { validateAndAssign } from '../questionHelpers'; +import semver from 'semver'; +import { merge } from 'lodash'; +import { getContext } from '../../../getContext'; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + const { appVersion, ci } = c.program.opts(); + + const validator = (version: string) => + !!semver.valid(semver.coerce(version)) || 'Please enter a valid semver version (1.0.0, 42.6.7.9.3-alpha, etc.)'; + + const result = await validateAndAssign( + { + value: appVersion, + validFn: validator, + name: 'inputVersion', + defaultVal: data.defaults.appVersion, + message: "What's your project version?", + warning: `Command contains invalid appVersion. Please enter a valid semver version (1.0.0, 42.6.7.9.3-alpha, etc.`, + }, + ci + ); + + data.inputs.appVersion = result || data.defaults.appVersion; + data.files.project.packageJson = merge(data.files.project.packageJson, { version: data.inputs.appVersion }); +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/applyTemplate.ts b/packages/engine-core/src/tasks/bootstrap/questions/applyTemplate.ts new file mode 100644 index 0000000000..5c4257e2b6 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/applyTemplate.ts @@ -0,0 +1,44 @@ +import { getContext, inquirerPrompt, mergeObjects } from '@rnv/core'; +import type { NewProjectData } from '../types'; + +const Question = async (data: NewProjectData): Promise => { + const c = getContext(); + const { inputs, files } = data; + + const tplName = inputs.template?.packageName; + if (!tplName) { + return Promise.reject('Template not selected'); + } + + const optExtend = 'Extend template (cleaner, overridable)'; + const optCopy = 'Copy from template (full control)'; + const options = [optExtend, optCopy]; + const { configOption } = await inquirerPrompt({ + name: 'configOption', + type: 'list', + message: 'How to create config renative.json?', + default: optExtend, + choices: options, + }); + + if (!tplName) { + return Promise.reject('Template not selected'); + } + + if (configOption === optExtend) { + const rnvConfig = files.template.renativeTemplateConfig.templateConfig?.renative_json || { + extendsTemplate: `${tplName}/renative.json`, + }; + files.project.renativeConfig = { ...rnvConfig, ...files.project.renativeConfig }; + } else if (configOption === optCopy) { + files.project.renativeConfig = { + ...files.template.renativeConfig, + ...files.project.renativeConfig, + }; + } + + const packageJson = files.template.renativeTemplateConfig.templateConfig?.package_json || {}; + files.project.packageJson = mergeObjects(c, files.project.packageJson, packageJson); +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/bookmarkTemplate.ts b/packages/engine-core/src/tasks/bootstrap/questions/bookmarkTemplate.ts new file mode 100644 index 0000000000..641416f77d --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/bookmarkTemplate.ts @@ -0,0 +1,57 @@ +import { chalk, getContext, inquirerPrompt, logInfo, writeFileSync } from '@rnv/core'; +import type { NewProjectData } from '../types'; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + + const { inputs } = data; + + if (!inputs.template?.packageName) { + return Promise.reject('Template not selected'); + } + + const configFile = c.files.workspace.config || {}; + // const defProjTemplates = c.files.rnvConfigTemplates.config?.projectTemplates || {}; + // const wsProjTemplates = configFile.projectTemplates || {}; + const projTemplates = c.buildConfig.projectTemplates || {}; + const allKeys = Object.keys(projTemplates); + + if ( + (!allKeys.includes(inputs.template.packageName) || !!inputs.template.localPath) && + inputs.template.type !== 'existing' + ) { + const { confirmAddTemplate } = await inquirerPrompt({ + name: 'confirmAddTemplate', + type: 'confirm', + message: `Would you like to add ${chalk().bold(inputs.template.packageName)} to your ${ + inputs.workspaceID + } workspace template list?`, + }); + + const { templateName } = await inquirerPrompt({ + name: 'templateName', + type: 'input', + default: `${inputs.template.packageName} (local)`, + validate: (v) => !allKeys.includes(v) || 'Name already exists', + message: 'Add short description', + }); + + if (configFile) { + if (confirmAddTemplate) { + if (!configFile.projectTemplates) { + configFile.projectTemplates = {}; + } + configFile.projectTemplates[templateName] = { + packageName: inputs.template.packageName, + localPath: inputs.template.localPath, + description: inputs.template.description, + }; + writeFileSync(c.paths.workspace.config, configFile); + + logInfo(`Updating ${c.paths.workspace.config}...DONE`); + } + } + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/bootstrapQuestions.ts b/packages/engine-core/src/tasks/bootstrap/questions/bootstrapQuestions.ts new file mode 100644 index 0000000000..799d47b25a --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/bootstrapQuestions.ts @@ -0,0 +1,118 @@ +import { ConfigFileTemplate, PromptParams, inquirerPrompt, logDebug } from '@rnv/core'; +import lSet from 'lodash/set'; +import type { NewProjectData } from '../types'; +import { getContext } from '../../../getContext'; + +type ConfigProp = Required['bootstrapConfig']>['bootstrapQuestions'][number]['configProp']; +type BootstrapQuestions = Required['bootstrapConfig']>['bootstrapQuestions']; +type QuestionResults = Record< + string, + { + answer: string; + configProp: ConfigProp; + value: string; + } +>; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + const { inputs, files } = data; + inputs.bootstrapQuestions = {}; + const bootstrapQuestions = files.template.renativeTemplateConfig?.bootstrapConfig?.bootstrapQuestions || []; + const results: QuestionResults = {}; + const providedAnswers: Record = {}; + + if (c.program.opts().answer) { + c.program.opts().answer.forEach((a: string) => { + const key = a.split('=')[0]; + let value; + + try { + value = JSON.parse(a.split('=')[1]); + } catch (e) { + value = a.split('=')[1]; + } + + providedAnswers[key] = value; + }); + } + + await interactiveQuestion(results, bootstrapQuestions, providedAnswers); + + logDebug('asnwer', JSON.stringify(results, null, 2)); + + Object.keys(results).forEach((targetKey) => { + const objValue = results[targetKey].value; + + logDebug('setting', targetKey, objValue); + + if (targetKey) { + lSet(inputs.bootstrapQuestions, targetKey, objValue); + } + }); +}; + +const interactiveQuestion = async ( + results: QuestionResults, + bootstrapQuestions: BootstrapQuestions, + providedAnswers: Record +) => { + if (bootstrapQuestions?.length) { + for (let i = 0; i < bootstrapQuestions.length; i++) { + const q = bootstrapQuestions[i]; + const qKey = q?.configProp?.key || ''; + // inquirer will nest them if they look like an object + const qKeyClean = qKey.replace('.', '__'); + + const choicesObj: Record = {}; + if (q.options) { + q.options.forEach((opt) => { + choicesObj[opt.title] = opt; + }); + } + + // answer already passed into the command line + const answer = providedAnswers[qKey.replace('__', '.')]; + if (answer) { + let value; + if (typeof answer === 'string' && q.type === 'list') { + value = choicesObj[answer]?.value; + } else { + value = answer; + } + + results[qKey] = { + answer, + configProp: q.configProp, + value, + }; + } else { + const inqQuestion: PromptParams = { + name: qKeyClean, + type: q.type, + message: q.title, + choices: Object.keys(choicesObj), + }; + // eslint-disable-next-line no-await-in-loop + const result = await inquirerPrompt(inqQuestion); + const val = q.type === 'list' ? choicesObj[result[qKeyClean]]?.value : result[qKeyClean]; + results[qKey] = { + answer: result[qKeyClean], + configProp: q.configProp, + value: val, + }; + } + + if (choicesObj[results[qKey].answer]?.bootstrapQuestions) { + // eslint-disable-next-line no-await-in-loop + await interactiveQuestion( + results, + choicesObj[results[qKey].answer].bootstrapQuestions, + providedAnswers + ); + } + } + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/configTemplates.ts b/packages/engine-core/src/tasks/bootstrap/questions/configTemplates.ts new file mode 100644 index 0000000000..6ba3e76aba --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/configTemplates.ts @@ -0,0 +1,38 @@ +import { + ConfigFileTemplates, + RnvFileName, + executeAsync, + fsExistsSync, + getContext, + isYarnInstalled, + readObjectSync, +} from '@rnv/core'; +import type { NewProjectData } from '../types'; +import path from 'path'; + +const Question = async (data: NewProjectData): Promise => { + const c = getContext(); + const { files } = data; + + const cnfTemplatesName = '@rnv/config-templates'; + const cnfDepVer = + files.template.renativeTemplateConfig?.templateConfig?.package_json?.devDependencies?.[cnfTemplatesName]; + if (cnfDepVer) { + // If we find the config-templates package in the devDependencies of the project's package.json, + // we will use it as source for engines + await executeAsync(`${isYarnInstalled() ? 'yarn' : 'npm'} add ${cnfTemplatesName}@${cnfDepVer} --dev`, { + cwd: c.paths.project.dir, + }); + const ctCnfPath = path.join(c.paths.project.nodeModulesDir, cnfTemplatesName, RnvFileName.renativeTemplates); + if (fsExistsSync(ctCnfPath)) { + files.configTemplates.config = readObjectSync(ctCnfPath) || undefined; + } + } + + if (!files.configTemplates.config) { + // As fallback we'll use current rnv executor's config-templates + files.configTemplates.config = c.files.rnvConfigTemplates.config; + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/confirmGit.ts b/packages/engine-core/src/tasks/bootstrap/questions/confirmGit.ts new file mode 100644 index 0000000000..420444fac7 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/confirmGit.ts @@ -0,0 +1,45 @@ +import { commandExistsSync, executeAsync, fsExistsSync, inquirerPrompt, logInfo, logTask, logWarning } from '@rnv/core'; +import type { NewProjectData } from '../types'; +import path from 'path'; +import { getContext } from '../../../getContext'; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + const { gitEnabled, ci } = c.program.opts(); + const { inputs } = data; + inputs.confirmEnableGit = !!gitEnabled; + + if (gitEnabled === undefined && !ci) { + const response = await inquirerPrompt({ + name: 'gitEnabled', + type: 'confirm', + message: 'Do you want to set-up git in your new project?', + }); + + inputs.confirmEnableGit = response.gitEnabled; + } + + if (inputs.confirmEnableGit) { + await configureGit(); + } +}; + +const configureGit = async () => { + const c = getContext(); + const projectPath = c.paths.project.dir; + logTask(`configureGit:${projectPath}`); + + if (!fsExistsSync(path.join(projectPath, '.git'))) { + logInfo('Your project does not have a git repo. Creating one...DONE'); + if (commandExistsSync('git')) { + await executeAsync('git init', { cwd: projectPath }); + // NOTE: let user do this manually + // await executeAsync('git add -A', { cwd: projectPath }); + // await executeAsync('git commit -m "Initial"', { cwd: projectPath }); + } else { + logWarning("We tried to create a git repo inside your project but you don't seem to have git installed"); + } + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/hasNodeModules.ts b/packages/engine-core/src/tasks/bootstrap/questions/hasNodeModules.ts new file mode 100644 index 0000000000..25c6d32f01 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/hasNodeModules.ts @@ -0,0 +1,23 @@ +import { fsExistsSync, getContext, inquirerPrompt, logWarning, removeDirs } from '@rnv/core'; +import { NewProjectData } from '../types'; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + if (fsExistsSync(c.paths.project.nodeModulesDir)) { + const { inputs } = data; + logWarning( + `Found node_modules directory at your location. If you continue it will be deleted: ${c.paths.project.nodeModulesDir}` + ); + const { confirmDeleteNodeModules } = await inquirerPrompt({ + name: 'confirmDeleteNodeModules', + type: 'confirm', + message: 'Are you sure you want to continue?', + }); + inputs.confirmDeleteNodeModules = confirmDeleteNodeModules; + if (confirmDeleteNodeModules) { + await removeDirs([c.paths.project.nodeModulesDir]); + } + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/installProject.ts b/packages/engine-core/src/tasks/bootstrap/questions/installProject.ts new file mode 100644 index 0000000000..2b0a6da873 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/installProject.ts @@ -0,0 +1,22 @@ +import { executeAsync, getContext, inquirerPrompt, isYarnInstalled } from '@rnv/core'; +import type { NewProjectData } from '../types'; + +const Question = async (data: NewProjectData) => { + const { inputs } = data; + const c = getContext(); + + const { confirmInstallProject } = await inquirerPrompt({ + name: 'confirmInstallProject', + type: 'confirm', + message: 'Project is ready. Do you want to install all dependencies now?', + }); + inputs.confirmProjectInstall = confirmInstallProject; + + if (confirmInstallProject) { + await executeAsync(`${isYarnInstalled() ? 'yarn' : 'npm install'}`, { + cwd: c.paths.project.dir, + }); + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/installTemplate.ts b/packages/engine-core/src/tasks/bootstrap/questions/installTemplate.ts new file mode 100644 index 0000000000..2e36ac7264 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/installTemplate.ts @@ -0,0 +1,217 @@ +import { + ConfigFileProject, + ConfigFileTemplate, + NpmPackageFile, + RnvFileName, + RnvFolderName, + chalk, + copyFileSync, + copyFolderRecursiveSync, + executeAsync, + fsExistsSync, + fsLstatSync, + fsReaddirSync, + inquirerPrompt, + inquirerSeparator, + isYarnInstalled, + listAndSelectNpmVersion, + logInfo, + mkdirSync, + readObjectSync, +} from '@rnv/core'; +import type { NewProjectData, TemplateOption } from '../types'; +import path from 'path'; +import { checkInputValue } from '../questionHelpers'; +import { saveProgressIntoProjectConfig } from '../questionHelpers'; +import { merge } from 'lodash'; +import { getContext } from '../../../getContext'; + +const Question = async (data: NewProjectData) => { + const { inputs, defaults, files } = data; + + const customTemplate: TemplateOption = { name: 'Custom Template (npm)...', value: { type: 'custom' } }; + const localTemplate: TemplateOption = { name: 'Local Template...', value: { type: 'local' } }; + const noTemplate: TemplateOption = { name: 'No Template (blank project)', value: { type: 'none' } }; + + const c = getContext(); + const { templateVersion, projectTemplate } = c.program.opts(); + + const projectTemplates = c.buildConfig.projectTemplates || {}; // c.files.rnvConfigTemplates.config?.projectTemplates || {}; + + const options: TemplateOption[] = []; + let defaultOverride; + Object.keys(projectTemplates).forEach((k) => { + const value = projectTemplates[k]; + const option: TemplateOption = { + name: `${k} ${chalk().grey(`- ${value.localPath || value.description}`)}`, + value: { ...value, type: 'existing' }, + }; + options.push(option); + if (value.localPath) { + defaultOverride = option.value; + } + }); + + options.push(inquirerSeparator('Advanced:----------------')); + options.push(customTemplate); + options.push(localTemplate); + options.push(noTemplate); + let localTemplatePath: string | undefined; + + inputs.template = {}; + + if (checkInputValue(projectTemplate)) { + inputs.template.packageName = projectTemplate; + } else { + const iRes = await inquirerPrompt({ + name: 'inputTemplate', + type: 'list', + message: 'What template to use?', + default: defaultOverride || defaults.templateName, + loop: false, + choices: options, + }); + const result: TemplateOption['value'] = iRes.inputTemplate; + inputs.template.type = result.type; + + if (result.type === 'custom') { + const { inputTemplateCustom } = await inquirerPrompt({ + name: 'inputTemplateCustom', + type: 'input', + message: 'NPM package name:', + }); + inputs.template.packageName = inputTemplateCustom; + } else if (result.type === 'local') { + const { inputTemplateLocal } = await inquirerPrompt({ + name: 'inputTemplateLocal', + type: 'input', + message: 'Path (absolute):', + }); + localTemplatePath = inputTemplateLocal; + } else if (result.type === 'none') { + // TODO: add support for no templates + return Promise.reject('No templates NOT SUPPORTED YET'); + } else if (result.type === 'existing') { + if (result.localPath) { + localTemplatePath = result.localPath; + } else { + inputs.template.packageName = result.packageName; + } + } + } + + const nmDir = path.join(c.paths.project.dir, RnvFolderName.dotRnv, RnvFolderName.npmCache); + + if (localTemplatePath) { + if (!fsExistsSync(localTemplatePath)) { + return Promise.reject(`Local template path ${localTemplatePath} does not exist`); + } + const localTemplatePkgPath = path.join(localTemplatePath, RnvFileName.package); + if (!fsExistsSync(localTemplatePath)) { + return Promise.reject(`Local template package ${localTemplatePkgPath} does not exist`); + } + const pkg = readObjectSync(localTemplatePkgPath); + + mkdirSync(nmDir); + if (!pkg?.name) { + return Promise.reject(`Invalid package ${localTemplatePkgPath} missing name field`); + } + + inputs.template.packageName = pkg.name; + inputs.template.version = pkg.version; + inputs.template.localPath = localTemplatePath; + + if (!inputs.template) return; + + const nmTemplatePath = path.join(nmDir, pkg?.name); + + logInfo(`Found local template: ${pkg.name}@${pkg.version}`); + + mkdirSync(nmTemplatePath); + + // TODO: read .npmignore and .gitignore and apply those rules + const ignorePaths = [ + RnvFolderName.nodeModules, + 'package-lock.json', + 'yarn.lock', + RnvFolderName.platformBuilds, + 'builds', + RnvFolderName.platformAssets, + RnvFolderName.secrets, + RnvFolderName.dotRnv, + ]; + fsReaddirSync(localTemplatePath).forEach((file) => { + if (!ignorePaths.includes(file) && localTemplatePath) { + const sourcePath = path.join(localTemplatePath, file); + const destPath = path.join(nmTemplatePath, file); + if (fsLstatSync(sourcePath).isDirectory()) { + copyFolderRecursiveSync(sourcePath, nmTemplatePath); + } else { + copyFileSync(sourcePath, destPath); + } + } + }); + + if (!inputs.template.packageName) { + return; + } + // NOTE: this is a workaround for npm/yarn bug where manually added packages are overriden on next install + const filePath = `file:${RnvFolderName.dotRnv}/${RnvFolderName.npmCache}/${inputs.template.packageName}`; + files.project.packageJson = merge(files.project.packageJson, { + devDependencies: { + [inputs.template?.packageName]: filePath, + }, + }); + files.project.renativeConfig = merge(files.project.renativeConfig, { + templates: { + [inputs.template.packageName]: { + version: filePath, + }, + }, + }); + await saveProgressIntoProjectConfig(data); + await executeAsync(`${isYarnInstalled() ? 'yarn' : 'npm install'}`, { + cwd: c.paths.project.dir, + }); + } else { + if (checkInputValue(templateVersion)) { + inputs.template.version = templateVersion; + } else { + inputs.template.version = await listAndSelectNpmVersion(inputs.template.packageName || ''); + } + + await executeAsync( + `${isYarnInstalled() ? 'yarn' : 'npm'} add ${inputs.template.packageName}@${inputs.template.version} --dev`, + { + cwd: c.paths.project.dir, + } + ); + // Check if node_modules folder exists + if (!fsExistsSync(nmDir)) { + return Promise.reject( + `${isYarnInstalled() ? 'yarn' : 'npm'} add ${inputs.template.packageName}@${ + inputs.template.version + } : FAILED. this could happen if you have package.json accidentally created somewhere in parent directory` + ); + } + } + + if (!inputs.template.packageName) { + return; + } + + const templateDir = path.join(c.paths.project.dir, 'node_modules', inputs.template.packageName); + + const renativeTemplateConfig = + readObjectSync(path.join(templateDir, RnvFileName.renativeTemplate)) || {}; + if (renativeTemplateConfig) { + files.template.renativeTemplateConfig = renativeTemplateConfig; + } + + const renativeConfig = readObjectSync(path.join(templateDir, RnvFileName.renative)); + if (renativeConfig) { + files.template.renativeConfig = renativeConfig; + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/isRenativeProject.ts b/packages/engine-core/src/tasks/bootstrap/questions/isRenativeProject.ts new file mode 100644 index 0000000000..1dfdffaa39 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/isRenativeProject.ts @@ -0,0 +1,20 @@ +import { fsExistsSync, getContext, inquirerPrompt, logWarning } from '@rnv/core'; +import { NewProjectData } from '../types'; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + if (fsExistsSync(c.paths.project.config)) { + logWarning(`You are in ReNative project. Found: ${c.paths.project.config}`); + const { confirmInRnvProject } = await inquirerPrompt({ + name: 'confirmInRnvProject', + type: 'confirm', + message: 'Are you sure you want to continue?', + }); + data.inputs.confirmInRnvProject = confirmInRnvProject; + if (!confirmInRnvProject) { + return Promise.reject('Cancelled'); + } + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/projectFolder.ts b/packages/engine-core/src/tasks/bootstrap/questions/projectFolder.ts new file mode 100644 index 0000000000..3ee11ede4d --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/projectFolder.ts @@ -0,0 +1,47 @@ +import { + RnvFileName, + cleanFolder, + fsExistsSync, + getContext, + inquirerPrompt, + logInfo, + logWarning, + mkdirSync, +} from '@rnv/core'; +import type { NewProjectData } from '../types'; +import path from 'path'; + +const Question = async (data: NewProjectData): Promise => { + const c = getContext(); + + const { inputs, files } = data; + + inputs.projectFolderName = inputs.projectName?.replace?.(/(\s+)/g, '_'); + inputs.packageName = inputs.projectName?.replace(/\s+/g, '-').toLowerCase(); + c.paths.project.dir = path.join(c.paths.user.currentDir, inputs.projectFolderName || ''); + c.paths.project.package = path.join(c.paths.project.dir, RnvFileName.package); + c.paths.project.config = path.join(c.paths.project.dir, RnvFileName.renative); + + files.project.renativeConfig.projectName = inputs.projectName; + files.project.packageJson.name = inputs.packageName; + + if (fsExistsSync(c.paths.project.dir)) { + logWarning(`Folder ${c.paths.project.dir} already exists. RNV will override it.`); + const { confirm } = await inquirerPrompt({ + type: 'confirm', + name: 'confirm', + message: 'Continue?', + }); + + if (!confirm) { + return Promise.reject('Cancelled by user'); + } else { + logInfo('Cleaning up existing folder...'); + } + await cleanFolder(c.paths.project.dir); + } + + mkdirSync(c.paths.project.dir); +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/projectName.ts b/packages/engine-core/src/tasks/bootstrap/questions/projectName.ts new file mode 100644 index 0000000000..14a2eea143 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/projectName.ts @@ -0,0 +1,24 @@ +import { inquirerPrompt } from '@rnv/core'; +import type { NewProjectData } from '../types'; +import { checkInputValue } from '../questionHelpers'; +import { getContext } from '../../../getContext'; + +const Question = async (data: NewProjectData): Promise => { + const c = getContext(); + const { projectName } = c.program.opts(); + const { inputs } = data; + if (checkInputValue(projectName)) { + inputs.projectName = projectName; + } else { + const inputProjectNameObj = await inquirerPrompt({ + name: 'inputProjectName', + type: 'input', + default: 'hello-renative', + validate: (value) => checkInputValue(value), + message: "What's your project Name? (folder will be created)", + }); + inputs.projectName = inputProjectNameObj?.inputProjectName; + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/supportedPlatforms.ts b/packages/engine-core/src/tasks/bootstrap/questions/supportedPlatforms.ts new file mode 100644 index 0000000000..fece6d12a9 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/supportedPlatforms.ts @@ -0,0 +1,76 @@ +import { RnvPlatforms, getContext, inquirerPrompt, logError } from '@rnv/core'; +import type { NewProjectData } from '../types'; +import { checkInputValue } from '../questionHelpers'; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + const { platform } = c.program.opts(); + const { inputs, files } = data; + + // TODO: grouped platforms + // const orderedPlatforms = [ + // PlatformName.web, + // inquirerSeparator('Mobile:') + // // Mobile + // PlatformName.ios, + // PlatformName.android, + // PlatformName.tizenmobile, + // PlatformName.kaios, + // inquirerSeparator('TV:') + // // TV + // PlatformName.androidtv, + // PlatformName.firetv, + // PlatformName.webtv, + // PlatformName.tizen, + // PlatformName.tvos, + // PlatformName.webos, + // inquirerSeparator('Desktop:') + // //Desktop + // PlatformName.macos, + // PlatformName.windows, + // PlatformName.linux, + // inquirerSeparator('Wareables:') + // //Wareables + // PlatformName.tizenwatch, + // PlatformName.androidwear, + // inquirerSeparator('Other:') + // // Other + // PlatformName.chromecast, + // PlatformName.xbox, + // ] + + const supportedPlatforms = + // files.template.renativeTemplateConfig?.templateConfig?.renative_json?..supportedPlatforms || + files.template.renativeConfig?.defaults?.supportedPlatforms || []; + + supportedPlatforms.sort((a, b) => RnvPlatforms.indexOf(a) - RnvPlatforms.indexOf(b)); + + const optsPlatforms = c.program.opts().platform && [c.program.opts().platform]; + const selectedPlatforms = + optsPlatforms || + files.template.renativeTemplateConfig?.bootstrapConfig?.defaultSelectedPlatforms || + supportedPlatforms; + + if (supportedPlatforms.length === 0) { + logError( + `Template ${inputs.template?.packageName} does not seem to export any default platforms to support. contact the author.` + ); + } + + if (checkInputValue(platform)) { + inputs.supportedPlatforms = platform.split(','); + } else { + const answer = await inquirerPrompt({ + name: 'inputSupportedPlatforms', + type: 'checkbox', + pageSize: 20, + message: 'What platforms would you like to use?', + validate: (val) => !!val.length || 'Please select at least a platform', + default: selectedPlatforms, + choices: supportedPlatforms, + }); + inputs.supportedPlatforms = answer?.inputSupportedPlatforms || []; + } +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/questions/workspace.ts b/packages/engine-core/src/tasks/bootstrap/questions/workspace.ts new file mode 100644 index 0000000000..49c790eda2 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/questions/workspace.ts @@ -0,0 +1,29 @@ +import { getWorkspaceOptions, inquirerPrompt } from '@rnv/core'; +import type { NewProjectData } from '../types'; +import { checkInputValue } from '../questionHelpers'; +import { getContext } from '../../../getContext'; + +const Question = async (data: NewProjectData) => { + const c = getContext(); + const { ci, workspace } = c.program.opts(); + if (checkInputValue(workspace)) { + data.inputs.workspaceID = workspace; + } else if (ci) { + data.inputs.workspaceID = data.defaults.workspaceID; + } else { + const answer = await inquirerPrompt({ + name: 'inputWorkspace', + type: 'list', + message: 'What workspace to use?', + default: data.defaults.workspaceID, + choices: getWorkspaceOptions().keysAsArray, + }); + + data.inputs.workspaceID = answer?.inputWorkspace; + } + + c.runtime.selectedWorkspace = data.inputs.workspaceID; + data.files.project.renativeConfig.workspaceID = data.inputs.workspaceID; +}; + +export default Question; diff --git a/packages/engine-core/src/tasks/bootstrap/taskNew.ts b/packages/engine-core/src/tasks/bootstrap/taskNew.ts new file mode 100644 index 0000000000..7324825009 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/taskNew.ts @@ -0,0 +1,152 @@ +import { + RnvTaskName, + updateRenativeConfigs, + logToSummary, + applyTemplate, + configureTemplateFiles, + generateLocalJsonSchemas, + createTask, +} from '@rnv/core'; +import inquiryProjectFolder from './questions/projectFolder'; +import inquiryBootstrapQuestions from './questions/bootstrapQuestions'; +import inquiryGit from './questions/confirmGit'; +import inquiryIsRenativeProject from './questions/isRenativeProject'; +import inquiryHasNodeModules from './questions/hasNodeModules'; +import inquiryProjectName from './questions/projectName'; +import inquiryWorkspace from './questions/workspace'; +import inquirySupportedPlatforms from './questions/supportedPlatforms'; +import inquiryAppTitle from './questions/appTitle'; +import inquiryAppID from './questions/appID'; +import inquiryAppVersion from './questions/appVersion'; +import inquiryInstallTemplate from './questions/installTemplate'; +import inquiryApplyTemplate from './questions/applyTemplate'; +import inquiryBookmarkTemplate from './questions/bookmarkTemplate'; +import inquiryAppConfigs from './questions/appConfigs'; +import inquiryConfigTemplates from './questions/configTemplates'; +import inquiryProjectInstall from './questions/installProject'; +import { + configureConfigOverrides, + generateProjectOverview, + initNewProject, + saveProgressIntoProjectConfig, + telemetryNewProject, + processChdirToProject, +} from './questionHelpers'; + +export default createTask({ + description: 'Create new ReNative project', + fn: async () => { + // Initialize Project + const payload = await initNewProject(); + // Initial questions + await inquiryProjectName(payload); + await inquiryProjectFolder(payload); + await inquiryIsRenativeProject(payload); + await inquiryHasNodeModules(payload); + await inquiryWorkspace(payload); + await saveProgressIntoProjectConfig(payload); + // Switch execution context to new directory + await processChdirToProject(); + // Install template only (this avoids whole npm project install) + await inquiryInstallTemplate(payload); + await inquiryConfigTemplates(payload); + await inquiryApplyTemplate(payload); + await saveProgressIntoProjectConfig(payload); + // Gather project/app info + await inquiryBookmarkTemplate(payload); + await inquiryAppTitle(payload); + await inquiryAppID(payload); + await inquiryAppVersion(payload); + await saveProgressIntoProjectConfig(payload); + + await inquirySupportedPlatforms(payload); + await inquiryBootstrapQuestions(payload); + await inquiryGit(payload); + // Configure final config overrides + await updateRenativeConfigs(); + await configureConfigOverrides(payload); + await saveProgressIntoProjectConfig(payload); + // Now we can apply template (required for appConfigs to be generated properly) + await updateRenativeConfigs(); + await applyTemplate(); + await configureTemplateFiles(); + await generateLocalJsonSchemas(); + await inquiryAppConfigs(payload); + // Telementry + await telemetryNewProject(payload); + await inquiryProjectInstall(payload); + + logToSummary(generateProjectOverview(payload)); + + return true; + }, + task: RnvTaskName.new, + options: [ + { + key: 'gitEnabled', + description: 'Enable git in your newly created project', + isValueType: true, + }, + { + key: 'answer', + isValueType: true, + isVariadic: true, + description: 'Pass in answers to prompts', + examples: ['--answer question=response question2=response2', '--answer question=\'{"some": "json"}\''], + }, + { + key: 'workspace', + isValueType: true, + description: 'select the workspace for the new project', + }, + { + key: 'template', + shortcut: 'T', + isValueType: true, + isRequired: true, + description: 'select specific template', + }, + { + key: 'projectName', + isValueType: true, + description: 'select the name of the new project', + }, + { + key: 'projectTemplate', + isValueType: true, + description: 'select the template of new project', + }, + { + key: 'templateVersion', + isValueType: true, + description: 'select the template version', + }, + { + key: 'title', + isValueType: true, + description: 'select the title of the app', + }, + { + key: 'appVersion', + isValueType: true, + description: 'select the version of the app', + }, + { + key: 'id', + isValueType: true, + description: 'select the id of the app', + }, + // RnvTaskOptions.gitEnabled, + // RnvTaskOptions.answer, + // RnvTaskOptions.workspace, + // RnvTaskOptions.template, + // RnvTaskOptions.projectName, + // RnvTaskOptions.projectTemplate, + // RnvTaskOptions.templateVersion, + // RnvTaskOptions.title, + // RnvTaskOptions.appVersion, + // RnvTaskOptions.id, + ], + isGlobalScope: true, + isPriorityOrder: true, +}); diff --git a/packages/engine-core/src/tasks/bootstrap/types.ts b/packages/engine-core/src/tasks/bootstrap/types.ts new file mode 100644 index 0000000000..79024f8763 --- /dev/null +++ b/packages/engine-core/src/tasks/bootstrap/types.ts @@ -0,0 +1,58 @@ +import type { + ConfigFileBuildConfig, + ConfigFileProject, + ConfigFileTemplate, + ConfigFileTemplates, + NpmPackageFile, + RnvPlatformKey, +} from '@rnv/core'; + +export type NewProjectData = { + defaults: { + appVersion: string; + templateName: string; + projectName: string; + appTitle: string; + workspaceID: string; + }; + inputs: { + bootstrapQuestions?: any; + confirmDeleteNodeModules?: boolean; + confirmInRnvProject?: boolean; + confirmEnableGit?: boolean; + confirmProjectInstall?: boolean; + appID?: string; + appVersion?: string; + projectName?: string; + projectFolderName?: string; + appTitle?: string; + workspaceID?: string; + packageName?: string; + template?: TemplateOptionValue; + supportedPlatforms?: Array; + }; + files: { + template: { + renativeTemplateConfig: ConfigFileTemplate; + renativeConfig: ConfigFileProject; + }; + configTemplates: { + config?: ConfigFileTemplates; + }; + project: { + renativeConfig: ConfigFileProject; + packageJson: NpmPackageFile; + // renativeAppConfig: ConfigFileApp; + }; + }; +}; + +type TemplateOptionValue = { + type?: 'existing' | 'custom' | 'local' | 'none'; + version?: string; +} & Required['projectTemplates'][string]; + +export type TemplateOption = { + name: string; + value: TemplateOptionValue; +}; diff --git a/packages/engine-core/src/tasks/crypto/common.ts b/packages/engine-core/src/tasks/crypto/common.ts index e4e38ea56e..06cb450981 100644 --- a/packages/engine-core/src/tasks/crypto/common.ts +++ b/packages/engine-core/src/tasks/crypto/common.ts @@ -36,11 +36,11 @@ export const getEnvVar = () => { return envVar; }; -export const checkCrypto = async (parentTask?: string, originTask?: string) => { +export const checkCrypto = async (parentTaskName?: string, originTaskName?: string) => { const c = getContext(); logTask('checkCrypto'); - if (c.program.ci || c.files.project.config?.crypto?.isOptional) return; + if (c.program.opts().ci || c.files.project.config?.crypto?.isOptional) return; const sourceRaw = c.files.project.config?.crypto?.path; if (!c.files.project.package.name) { @@ -71,7 +71,7 @@ export const checkCrypto = async (parentTask?: string, originTask?: string) => { project timestamp: ${chalk().grey(`${tsProject} - ${new Date(tsProject)}`)} workspace timestamp: ${chalk().grey(`${tsWorkspace} - ${new Date(tsWorkspace)}`)} you should run decrypt`); - await executeTask(RnvTaskName.cryptoDecrypt, parentTask, originTask); + await executeTask({ taskName: RnvTaskName.cryptoDecrypt, parentTaskName, originTaskName }); return; } @@ -81,3 +81,13 @@ you should run decrypt`); } } }; + +export const TaskOptions = { + key: { + key: 'key', + shortcut: 'k', + isValueType: true, + isRequired: true, + description: 'Pass the key/password', + }, +}; diff --git a/packages/engine-core/src/tasks/crypto/taskCryptoDecrypt.ts b/packages/engine-core/src/tasks/crypto/taskCryptoDecrypt.ts index bd2f4e9e16..e64b339827 100644 --- a/packages/engine-core/src/tasks/crypto/taskCryptoDecrypt.ts +++ b/packages/engine-core/src/tasks/crypto/taskCryptoDecrypt.ts @@ -3,7 +3,6 @@ import tar from 'tar'; import { chalk, logWarning, - logTask, logSuccess, getRealPath, removeFilesSync, @@ -13,19 +12,16 @@ import { fsExistsSync, fsReadFileSync, inquirerPrompt, - executeTask, - RnvTaskOptionPresets, RnvContext, - RnvTaskFn, - RnvTask, RnvTaskName, + createTask, } from '@rnv/core'; -import { getEnvExportCmd, getEnvVar } from './common'; +import { TaskOptions, getEnvExportCmd, getEnvVar } from './common'; const iocane = require('iocane'); const _unzipAndCopy = async ( - c: RnvContext, + ctx: RnvContext, shouldCleanFolder: boolean, destTemp: string, wsPath: string, @@ -38,91 +34,87 @@ const _unzipAndCopy = async ( await tar.x({ file: destTemp, - cwd: c.paths.workspace.dir, + cwd: ctx.paths.workspace.dir, }); removeFilesSync([destTemp]); - if (c.files.project.package.name && fsExistsSync(ts)) { - copyFileSync(ts, path.join(c.paths.workspace.dir, c.files.project.package.name, 'timestamp')); + if (ctx.files.project.package.name && fsExistsSync(ts)) { + copyFileSync(ts, path.join(ctx.paths.workspace.dir, ctx.files.project.package.name, 'timestamp')); } logSuccess(`Files succesfully extracted into ${destFolder}`); }; -const taskCryptoDecrypt: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskCryptoDecrypt'); - - if (!parentTask) { - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoDecrypt, originTask); - } - - const crypto = c.files.project.config?.crypto; - const sourceRaw = crypto?.path; - const projectName = c.files.project.config?.projectName; - - if (!crypto?.isOptional && sourceRaw) { - const envVar = getEnvVar(); - if (!projectName || !envVar) return; - - const source = `${getRealPath(sourceRaw, 'crypto.path')}`; - const ts = `${source}.timestamp`; - const destFolder = path.join(c.paths.workspace.dir, projectName); - const destTemp = `${path.join(c.paths.workspace.dir, projectName.replace('/', '-'))}.tgz`; - - let shouldCleanFolder = false; - const wsPath = path.join(c.paths.workspace.dir, projectName); - const isCryptoReset = c.command === 'crypto' && c.program.reset === true; - - if (c.program.ci !== true && !isCryptoReset && fsExistsSync(destFolder)) { - const options = ['Yes - override (recommended)', 'Yes - merge', 'Skip']; - const { option } = await inquirerPrompt({ - name: 'option', - type: 'list', - choices: options, - message: `How to decrypt to ${chalk().bold(destFolder)} ?`, - }); - if (option === options[0]) { +export default createTask({ + description: 'Decrypt encrypted project files into local `~///..`', + fn: async ({ ctx }) => { + const crypto = ctx.files.project.config?.crypto; + const sourceRaw = crypto?.path; + const projectName = ctx.files.project.config?.projectName; + + if (!crypto?.isOptional && sourceRaw) { + const envVar = getEnvVar(); + if (!projectName || !envVar) return; + + const source = `${getRealPath(sourceRaw, 'crypto.path')}`; + const ts = `${source}.timestamp`; + const destFolder = path.join(ctx.paths.workspace.dir, projectName); + const destTemp = `${path.join(ctx.paths.workspace.dir, projectName.replace('/', '-'))}.tgz`; + + let shouldCleanFolder = false; + const wsPath = path.join(ctx.paths.workspace.dir, projectName); + const isCryptoReset = ctx.command === 'crypto' && ctx.program.opts().reset === true; + + if (ctx.program.opts().ci !== true && !isCryptoReset && fsExistsSync(destFolder)) { + const options = ['Yes - override (recommended)', 'Yes - merge', 'Skip']; + const { option } = await inquirerPrompt({ + name: 'option', + type: 'list', + choices: options, + message: `How to decrypt to ${chalk().bold(destFolder)} ?`, + }); + if (option === options[0]) { + shouldCleanFolder = true; + } else if (option === options[2]) { + return true; + } + } else { shouldCleanFolder = true; - } else if (option === options[2]) { - return true; } - } else { - shouldCleanFolder = true; - } - if (fsExistsSync(destTemp)) { - const { confirm } = await inquirerPrompt({ - type: 'confirm', - message: `Found existing decrypted file at ${chalk().bold( - destTemp - )}. want to use it and skip decrypt ?`, - }); - if (confirm) { - await _unzipAndCopy(c, shouldCleanFolder, destTemp, wsPath, ts, destFolder); - return true; + if (fsExistsSync(destTemp)) { + const { confirm } = await inquirerPrompt({ + type: 'confirm', + message: `Found existing decrypted file at ${chalk().bold( + destTemp + )}. want to use it and skip decrypt ?`, + }); + if (confirm) { + await _unzipAndCopy(ctx, shouldCleanFolder, destTemp, wsPath, ts, destFolder); + return true; + } } - } - const key = c.program.key || c.process.env[envVar]; - if (!key) { - return Promise.reject(`encrypt: You must pass ${chalk().bold('--key')} or have env var defined: + const key = ctx.program.opts().key || ctx.process.env[envVar]; + if (!key) { + return Promise.reject(`encrypt: You must pass ${chalk().bold('--key')} or have env var defined: ${getEnvExportCmd(envVar, 'REPLACE_WITH_ENV_VARIABLE')} Make sure you take into account special characters that might need to be escaped. `); - } - if (!fsExistsSync(source)) { - return Promise.reject(`Can't decrypt. ${chalk().bold(source)} is missing!`); - } + } + if (!fsExistsSync(source)) { + return Promise.reject(`Can't decrypt. ${chalk().bold(source)} is missing!`); + } - let data; - try { - data = await iocane.createSession().use('cbc').decrypt(fsReadFileSync(source), key); - } catch (e) { - if (e instanceof Error) { - if (e?.message?.includes) { - if (e.message.includes('Signature mismatch')) { - const err = `You're trying to decode crypto file encoded with previous version of crypto. + let data; + try { + data = await iocane.createSession().use('cbc').decrypt(fsReadFileSync(source), key); + } catch (e) { + if (e instanceof Error) { + if (e?.message?.includes) { + if (e.message.includes('Signature mismatch')) { + const err = `You're trying to decode crypto file encoded with previous version of crypto. this change was introduced in "rnv@0.29.0" ${e} @@ -142,10 +134,10 @@ ${e} `; - return Promise.reject(err); - } - if (e.message.includes('Authentication failed')) { - return Promise.reject(`It seems like you provided invalid decryption key. + return Promise.reject(err); + } + if (e.message.includes('Authentication failed')) { + return Promise.reject(`It seems like you provided invalid decryption key. ${e.stack} @@ -165,53 +157,46 @@ ${chalk().bold('https://github.com/flexn-io/renative/issues')} and we will try to help! `); + } } } + + return Promise.reject(e); } - return Promise.reject(e); + fsWriteFileSync(destTemp, data); + + // try { + // await executeAsync( + // c, + // `${_getOpenSllPath( + // c + // )} enc -aes-256-cbc -md md5 -d -in ${source} -out ${destTemp} -k ${key}`, + // { privateParams: [key] } + // ); + // } catch (e) { + // const cmd1 = chalk().bold( + // `openssl enc -aes-256-cbc -md md5 -d -in ${source} -out ${destTemp} -k $${envVar}` + // ); + // return Promise.reject(`${e} + + // ${chalk().green('SUGGESTION:')} + + // ${chalk().yellow('STEP 1:')} + // ${cmd1} + + // ${chalk().yellow('STEP 2:')} + // ${chalk().bold( + // 'run your previous command again and choose to skip openssl once asked' + // )}`); + // } + + await _unzipAndCopy(ctx, shouldCleanFolder, destTemp, wsPath, ts, destFolder); + } else { + logWarning(`You don't have {{ crypto.path }} specificed in ${chalk().bold(ctx.paths.appConfigBase)}`); + return true; } - - fsWriteFileSync(destTemp, data); - - // try { - // await executeAsync( - // c, - // `${_getOpenSllPath( - // c - // )} enc -aes-256-cbc -md md5 -d -in ${source} -out ${destTemp} -k ${key}`, - // { privateParams: [key] } - // ); - // } catch (e) { - // const cmd1 = chalk().bold( - // `openssl enc -aes-256-cbc -md md5 -d -in ${source} -out ${destTemp} -k $${envVar}` - // ); - // return Promise.reject(`${e} - - // ${chalk().green('SUGGESTION:')} - - // ${chalk().yellow('STEP 1:')} - // ${cmd1} - - // ${chalk().yellow('STEP 2:')} - // ${chalk().bold( - // 'run your previous command again and choose to skip openssl once asked' - // )}`); - // } - - await _unzipAndCopy(c, shouldCleanFolder, destTemp, wsPath, ts, destFolder); - } else { - logWarning(`You don't have {{ crypto.path }} specificed in ${chalk().bold(c.paths.appConfigBase)}`); - return true; - } -}; - -const Task: RnvTask = { - description: 'Decrypt encrypted project files into local `~///..`', - fn: taskCryptoDecrypt, + }, + options: [TaskOptions.key], task: RnvTaskName.cryptoDecrypt, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/crypto/taskCryptoEncrypt.ts b/packages/engine-core/src/tasks/crypto/taskCryptoEncrypt.ts index 481e709084..89e07cc056 100644 --- a/packages/engine-core/src/tasks/crypto/taskCryptoEncrypt.ts +++ b/packages/engine-core/src/tasks/crypto/taskCryptoEncrypt.ts @@ -4,7 +4,6 @@ import { promisify } from 'util'; import { chalk, logWarning, - logTask, logSuccess, logInfo, getRealPath, @@ -16,17 +15,13 @@ import { fsReadFileSync, fsReaddir, inquirerPrompt, - executeTask, - RnvTaskOptionPresets, - RnvContext, - RnvTaskFn, copyFileSync, - RnvTask, RnvTaskName, - getContext, + createTask, } from '@rnv/core'; import { statSync } from 'fs'; -import { getEnvExportCmd, getEnvVar } from './common'; +import { TaskOptions, getEnvExportCmd, getEnvVar } from './common'; +import { getContext } from '../../getContext'; const iocane = require('iocane'); @@ -39,13 +34,13 @@ const generateRandomKey = (length: number) => .join(''); const initializeCryptoDirectory = async (sourceFolder: string) => { - const c = getContext(); + const ctx = getContext(); const configDir = path.join(sourceFolder, 'appConfigs'); const targetFile = 'renative.private.json'; mkdirSync(sourceFolder); mkdirSync(configDir); - if (c.paths.project.configPrivateExists) { + if (ctx.paths.project.configPrivateExists) { const options = [ 'Move renative.private.json into encrypted folder (Recommended)', 'Copy renative.private.json into encrypted folder', @@ -56,24 +51,24 @@ const initializeCryptoDirectory = async (sourceFolder: string) => { type: 'list', choices: options, message: `Found existing private config in your project ${chalk().grey( - c.paths.project.configPrivate + ctx.paths.project.configPrivate )}. What to do next?`, }); if (option === options[0]) { - copyFileSync(c.paths.project.configPrivate, path.join(sourceFolder, targetFile)); - removeFilesSync([c.paths.project.configPrivate]); + copyFileSync(ctx.paths.project.configPrivate, path.join(sourceFolder, targetFile)); + removeFilesSync([ctx.paths.project.configPrivate]); } else if (option === options[1]) { - copyFileSync(c.paths.project.configPrivate, path.join(sourceFolder, targetFile)); + copyFileSync(ctx.paths.project.configPrivate, path.join(sourceFolder, targetFile)); } } - const appConfigsDirs = await readdirAsync(c.paths.project.appConfigsDir); + const appConfigsDirs = await readdirAsync(ctx.paths.project.appConfigsDir); appConfigsDirs.forEach(async (item: string) => { if (item == targetFile) { - copyFileSync(path.join(c.paths.project.appConfigsDir, item), path.join(configDir, targetFile)); + copyFileSync(path.join(ctx.paths.project.appConfigsDir, item), path.join(configDir, targetFile)); } const appConfigDir = path.join(configDir, item); - const itemPath = path.join(c.paths.project.appConfigsDir, item); + const itemPath = path.join(ctx.paths.project.appConfigsDir, item); const stat = statSync(itemPath); if (stat && stat.isDirectory()) { @@ -85,7 +80,7 @@ const initializeCryptoDirectory = async (sourceFolder: string) => { mkdirSync(path.join(appConfigDir, 'certs')); copyFileSync( - path.join(c.paths.project.appConfigsDir, item, targetFile), + path.join(ctx.paths.project.appConfigsDir, item, targetFile), path.join(appConfigDir, targetFile) ); } @@ -94,16 +89,17 @@ const initializeCryptoDirectory = async (sourceFolder: string) => { }); }; -const _checkAndConfigureCrypto = async (c: RnvContext) => { +const _checkAndConfigureCrypto = async () => { + const ctx = getContext(); // handle missing config - const source = `./${c.files.project.config?.projectName}`; + const source = `./${ctx.files.project.config?.projectName}`; - const cnf = c.files.project.config_original; + const cnf = ctx.files.project.config_original; if (!cnf) return; const envVar = getEnvVar(); if (!envVar) return; - if (c.files.project.config && !c.files.project.config.crypto) { + if (ctx.files.project.config && !ctx.files.project.config.crypto) { const { location } = await inquirerPrompt({ type: 'input', name: 'location', @@ -114,13 +110,13 @@ const _checkAndConfigureCrypto = async (c: RnvContext) => { cnf.crypto = { path: `./${location}/privateConfigs.enc`, }; - c.files.project.config.crypto = cnf.crypto; + ctx.files.project.config.crypto = cnf.crypto; - writeFileSync(c.paths.project.config, cnf); + writeFileSync(ctx.paths.project.config, cnf); } // check if src folder actually exists - const sourceFolder = path.join(c.paths.workspace.dir, source); + const sourceFolder = path.join(ctx.paths.workspace.dir, source); if (!fsExistsSync(sourceFolder)) { logInfo( @@ -130,7 +126,7 @@ const _checkAndConfigureCrypto = async (c: RnvContext) => { RNV will create it for you, make sure you add whatever you want encrypted in it and then run the command again` ); await initializeCryptoDirectory(sourceFolder); - // writeFileSync(path.join(sourceFolder), c.files.project.config); + // writeFileSync(path.join(sourceFolder), ctx.files.project.config); await inquirerPrompt({ type: 'confirm', message: 'Once ready, Continue?', @@ -139,7 +135,7 @@ RNV will create it for you, make sure you add whatever you want encrypted in it // if (confirm) return true; } - let key = c.program.key || c.process.env[envVar]; + let key = ctx.program.opts().key || ctx.process.env[envVar]; let keyGenerated = false; if (!key) { const { confirm } = await inquirerPrompt({ @@ -170,77 +166,69 @@ ${getEnvExportCmd(envVar, key)} Make sure you take into account special characters that might need to be escaped `); - c.process.env[envVar] = key; + ctx.process.env[envVar] = key; } } }; -const taskCryptoEncrypt: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskCryptoEncrypt'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoEncrypt, originTask); +export default createTask({ + description: 'Encrypts secure files from `~///..` to project', + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const projectName = ctx.files.project.config?.projectName; - const projectName = c.files.project.config?.projectName; + if (!projectName) return; - if (!projectName) return; + const source = `./${projectName}`; - const source = `./${projectName}`; + await _checkAndConfigureCrypto(); - await _checkAndConfigureCrypto(c); + const destRaw = ctx.files.project.config?.crypto?.path; + const tsWorkspacePath = path.join(ctx.paths.workspace.dir, projectName, 'timestamp'); + const envVar = getEnvVar(); - const destRaw = c.files.project.config?.crypto?.path; - const tsWorkspacePath = path.join(c.paths.workspace.dir, projectName, 'timestamp'); - const envVar = getEnvVar(); + if (!envVar) return; - if (!envVar) return; + const key = ctx.program.opts().key || ctx.process.env[envVar]; - const key = c.program.key || c.process.env[envVar]; + if (destRaw) { + const dest = `${getRealPath(destRaw, 'crypto.path')}`; + const destTemp = `${path.join(ctx.paths.workspace.dir, projectName.replace('/', '-'))}.tgz`; + const timestamp = new Date().getTime(); - if (destRaw) { - const dest = `${getRealPath(destRaw, 'crypto.path')}`; - const destTemp = `${path.join(c.paths.workspace.dir, projectName.replace('/', '-'))}.tgz`; - const timestamp = new Date().getTime(); + // check if dest folder actually exists + const destFolder = dest.slice(0, dest.lastIndexOf('/')); - // check if dest folder actually exists - const destFolder = dest.slice(0, dest.lastIndexOf('/')); + !fsExistsSync(destFolder) && mkdirSync(destFolder); - !fsExistsSync(destFolder) && mkdirSync(destFolder); + await tar.c( + { + gzip: true, + file: destTemp, + cwd: ctx.paths.workspace.dir, + }, + [source] + ); - await tar.c( - { - gzip: true, - file: destTemp, - cwd: c.paths.workspace.dir, - }, - [source] - ); + const data = await iocane.createSession().use('cbc').encrypt(fsReadFileSync(destTemp), key); - const data = await iocane.createSession().use('cbc').encrypt(fsReadFileSync(destTemp), key); - - fsWriteFileSync(dest, data); - - // await executeAsync( - // c, - // `${_getOpenSllPath( - // c - // )} enc -aes-256-cbc -md md5 -salt -in ${destTemp} -out ${dest} -k ${key}`, - // { privateParams: [key] } - // ); - removeFilesSync([destTemp]); - fsWriteFileSync(`${dest}.timestamp`, `${timestamp}`); - fsWriteFileSync(`${tsWorkspacePath}`, `${timestamp}`); - logSuccess(`Files succesfully encrypted into ${dest}`); - } else { - logWarning(`You don't have {{ crypto.path }} specificed in ${chalk().bold(c.paths.appConfigBase)}`); - } -}; + fsWriteFileSync(dest, data); -const Task: RnvTask = { - description: 'Encrypts secure files from `~///..` to project', - fn: taskCryptoEncrypt, + // await executeAsync( + // c, + // `${_getOpenSllPath( + // c + // )} enc -aes-256-cbc -md md5 -salt -in ${destTemp} -out ${dest} -k ${key}`, + // { privateParams: [key] } + // ); + removeFilesSync([destTemp]); + fsWriteFileSync(`${dest}.timestamp`, `${timestamp}`); + fsWriteFileSync(`${tsWorkspacePath}`, `${timestamp}`); + logSuccess(`Files succesfully encrypted into ${dest}`); + } else { + logWarning(`You don't have {{ crypto.path }} specificed in ${chalk().bold(ctx.paths.appConfigBase)}`); + } + }, + options: [TaskOptions.key], task: RnvTaskName.cryptoEncrypt, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/global/__tests__/taskClean.test.ts b/packages/engine-core/src/tasks/global/__tests__/taskClean.test.ts index 160c26ea14..a487b123a6 100644 --- a/packages/engine-core/src/tasks/global/__tests__/taskClean.test.ts +++ b/packages/engine-core/src/tasks/global/__tests__/taskClean.test.ts @@ -28,9 +28,17 @@ test('Execute task.rnv.clean', async () => { ); jest.mocked(fsExistsSync).mockReturnValue(true); jest.mocked(fsReaddirSync).mockReturnValue([]); - ctx.program.ci = false; + ctx.program.opts().ci = false; //WHEN - await expect(taskClean.fn?.(ctx)).resolves.toEqual(true); + await expect( + taskClean.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }) + ).resolves.toEqual(true); //THEN expect(removeDirs).toHaveBeenCalledTimes(3); expect(executeAsync).toHaveBeenCalledWith('watchman watch-del-all'); diff --git a/packages/engine-core/src/tasks/global/__tests__/taskKill.test.ts b/packages/engine-core/src/tasks/global/__tests__/taskKill.test.ts index 9e91129cb0..31c0098363 100644 --- a/packages/engine-core/src/tasks/global/__tests__/taskKill.test.ts +++ b/packages/engine-core/src/tasks/global/__tests__/taskKill.test.ts @@ -18,7 +18,19 @@ test('Execute task.rnv.kill', async () => { const ctx = getContext(); ctx.paths.project.configExists = true; //WHEN - await expect(taskKill.fn?.(ctx)).resolves.toEqual(true); + await expect( + taskKill.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }) + ).resolves.toEqual(true); //THEN - expect(executeTask).toHaveBeenCalledWith('app configure', 'kill', undefined); + expect(executeTask).toHaveBeenCalledWith({ + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_taskName', + taskName: 'app configure', + }); }); diff --git a/packages/engine-core/src/tasks/global/__tests__/taskNew.test.ts b/packages/engine-core/src/tasks/global/__tests__/taskNew.test.ts deleted file mode 100644 index 243f377d5f..0000000000 --- a/packages/engine-core/src/tasks/global/__tests__/taskNew.test.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { - createRnvContext, - fsExistsSync, - getContext, - writeFileSync, - inquirerPrompt, - getWorkspaceOptions, - getTemplateOptions, - checkAndCreateGitignore, - commandExistsSync, -} from '@rnv/core'; -import taskNew from '../taskNew'; - -jest.mock('@rnv/core'); -jest.mock('lodash/set'); -jest.mock('path'); -jest.mock('semver'); - -beforeEach(() => { - createRnvContext(); -}); - -afterEach(() => { - jest.resetAllMocks(); -}); - -test('Execute task.rnv.new', async () => { - //GIVEN - const ctx = getContext(); - - jest.mocked(checkAndCreateGitignore).mockReturnValue(Promise.resolve(true)); - jest.mocked(commandExistsSync).mockReturnValue(true); - jest.mocked(fsExistsSync).mockReturnValue(true); - - jest.mocked(inquirerPrompt).mockReturnValue( - Promise.resolve({ - inputProjectName: 'test', - confirm: true, - inputAppTitle: 'testtitle', - inputAppID: 'com.test.app', - inputVersion: '1.0.0', - inputWorkspace: 'rnv', - // inputTemplate: '@rnv/template-starter', - // inputTemplateVersion: '1.0.0-canary.7', - inputSupportedPlatforms: ['android', 'ios', 'web'], - gitEnabled: true, - confirmInRnvProject: true, - }) - ); - - jest.mocked(getWorkspaceOptions).mockReturnValue({ - keysAsArray: ['company', 'rnv'], - valuesAsArray: [{ path: '/Users/someuser/.rnv' }, { path: '/Users/someuser/.company' }], - keysAsObject: { rnv: 'rnv', company: 'company' }, - valuesAsObject: { - rnv: { path: '/Users/someuser/.rnv' }, - company: { path: '/Users/someuser/.company' }, - }, - asString: ' [\x1B[90m1\x1B[39m]> \x1B[1mrnv\x1B[22m \n [\x1B[90m2\x1B[39m]> \x1B[1mcompany\x1B[22m \n', - optionsAsArray: [ - ' [\x1B[90m1\x1B[39m]> \x1B[1mrnv\x1B[22m \n', - ' [\x1B[90m2\x1B[39m]> \x1B[1mcompany\x1B[22m \n', - ], - }); - - jest.mocked(getTemplateOptions).mockReturnValue({ - keysAsArray: ['@flexn/create-template-starter', '@rnv/template-starter'], - valuesAsArray: [ - { description: "Multiplatform 'hello world' template" }, - { - description: 'Advanced multiplatform template using flexn Create SDK', - }, - ], - keysAsObject: { - '@rnv/template-starter': '@rnv/template-starter', - '@flexn/create-template-starter': '@flexn/create-template-starter', - }, - valuesAsObject: { - '@rnv/template-starter': { description: "Multiplatform 'hello world' template" }, - '@flexn/create-template-starter': { - description: 'Advanced multiplatform template using flexn Create SDK', - }, - }, - asString: - ' [\x1B[90m1\x1B[39m]> \x1B[1m@rnv/template-starter\x1B[22m \n' + - ' [\x1B[90m2\x1B[39m]> \x1B[1m@flexn/create-template-starter\x1B[22m \n', - optionsAsArray: [ - ' [\x1B[90m1\x1B[39m]> \x1B[1m@rnv/template-starter\x1B[22m \n', - ' [\x1B[90m2\x1B[39m]> \x1B[1m@flexn/create-template-starter\x1B[22m \n', - ], - }); - - ctx.program.ci = false; - ctx.program.templateVersion = '1.0.0-canary.7'; - ctx.program.projectTemplate = '@rnv/template-starter'; - //WHEN - await expect(taskNew.fn?.(ctx)).resolves.toEqual(true); - //THEN - expect(writeFileSync).toHaveBeenCalledTimes(1); - expect(writeFileSync).toHaveBeenCalledWith(undefined, { - currentTemplate: '@rnv/template-starter', - common: { - id: 'com.test.app', - title: 'testtitle', - }, - defaults: { - supportedPlatforms: ['android', 'ios', 'web'], - }, - engines: {}, - isMonorepo: false, - isNew: true, - platforms: {}, - projectName: 'test', - projectVersion: '1.0.0', - templates: { - '@rnv/template-starter': { - version: '1.0.0-canary.7', - }, - }, - workspaceID: 'rnv', - }); - expect(checkAndCreateGitignore).toHaveBeenCalledTimes(1); -}); diff --git a/packages/engine-core/src/tasks/global/taskClean.ts b/packages/engine-core/src/tasks/global/taskClean.ts index b7590d42ca..2e59ea52e4 100644 --- a/packages/engine-core/src/tasks/global/taskClean.ts +++ b/packages/engine-core/src/tasks/global/taskClean.ts @@ -5,16 +5,13 @@ import { fsExistsSync, fsReaddirSync, chalk, - logTask, logToSummary, logDebug, executeAsync, - RnvTaskOptionPresets, isSystemWin, - RnvTaskFn, inquirerPrompt, - RnvTask, RnvTaskName, + createTask, } from '@rnv/core'; function clearWindowsCacheFiles() { @@ -43,178 +40,171 @@ function clearWindowsCacheFiles() { return true; } -const taskClean: RnvTaskFn = async (c) => { - logTask('taskClean'); - const skipQuestion = c.program.ci; - const pathsToRemove = []; - const localFiles = []; - const immediateNodeModuleDir = path.join(c.paths.project.dir, 'node_modules'); - - const pkgLock = path.join(c.paths.project.dir, 'package-lock.json'); - - if (fsExistsSync(immediateNodeModuleDir)) { - pathsToRemove.push(immediateNodeModuleDir); - } - if (fsExistsSync(pkgLock)) pathsToRemove.push(pkgLock); - - const yarnLock = path.join(c.paths.project.dir, 'yarn.lock'); - if (fsExistsSync(yarnLock)) { - pathsToRemove.push(yarnLock); - } - - const packagesFolder = path.join(c.paths.project.dir, 'packages'); - if (fsExistsSync(packagesFolder)) { - fsReaddirSync(packagesFolder).forEach((dir) => { - if (dir === '.DS_Store') { - const pth = path.join(packagesFolder, dir); - - if (fsExistsSync(pth)) { - pathsToRemove.push(pth); - } - } else { - const pth2 = path.join(packagesFolder, dir, 'node_modules'); - if (fsExistsSync(pth2)) { - pathsToRemove.push(pth2); - } +export default createTask({ + description: 'Automatically removes all node_modules and lock in your project and its dependencies', + fn: async ({ ctx }) => { + const skipQuestion = ctx.program.opts().ci; + const pathsToRemove = []; + const localFiles = []; + const immediateNodeModuleDir = path.join(ctx.paths.project.dir, 'node_modules'); - const pth3 = path.join(packagesFolder, dir, 'package-lock.json'); - if (fsExistsSync(pth3)) { - pathsToRemove.push(pth3); - } + const pkgLock = path.join(ctx.paths.project.dir, 'package-lock.json'); - const pth4 = path.join(packagesFolder, dir, 'yarn.lock'); - if (fsExistsSync(pth4)) { - pathsToRemove.push(pth4); - } + if (fsExistsSync(immediateNodeModuleDir)) { + pathsToRemove.push(immediateNodeModuleDir); + } + if (fsExistsSync(pkgLock)) pathsToRemove.push(pkgLock); + + const yarnLock = path.join(ctx.paths.project.dir, 'yarn.lock'); + if (fsExistsSync(yarnLock)) { + pathsToRemove.push(yarnLock); + } - const pth5 = path.join(packagesFolder, dir, 'dist'); - if (fsExistsSync(pth5)) { - pathsToRemove.push(pth5); + const packagesFolder = path.join(ctx.paths.project.dir, 'packages'); + if (fsExistsSync(packagesFolder)) { + fsReaddirSync(packagesFolder).forEach((dir) => { + if (dir === '.DS_Store') { + const pth = path.join(packagesFolder, dir); + + if (fsExistsSync(pth)) { + pathsToRemove.push(pth); + } + } else { + const pth2 = path.join(packagesFolder, dir, 'node_modules'); + if (fsExistsSync(pth2)) { + pathsToRemove.push(pth2); + } + + const pth3 = path.join(packagesFolder, dir, 'package-lock.json'); + if (fsExistsSync(pth3)) { + pathsToRemove.push(pth3); + } + + const pth4 = path.join(packagesFolder, dir, 'yarn.lock'); + if (fsExistsSync(pth4)) { + pathsToRemove.push(pth4); + } + + const pth5 = path.join(packagesFolder, dir, 'dist'); + if (fsExistsSync(pth5)) { + pathsToRemove.push(pth5); + } } + }); + } + + const buildDirs = []; + if (fsExistsSync(ctx.paths.project.builds.dir)) { + buildDirs.push(ctx.paths.project.builds.dir); + } + if (fsExistsSync(ctx.paths.project.assets.dir)) { + buildDirs.push(ctx.paths.project.assets.dir); + } + + const local1 = path.join(ctx.paths.project.dir, '.DS_Store'); + if (fsExistsSync(local1)) localFiles.push(local1); + const local2 = path.join(ctx.paths.project.dir, 'renative.local.json'); + if (fsExistsSync(local2)) localFiles.push(local2); + const local3 = path.join(ctx.paths.project.dir, 'metro.config.local.js'); + if (fsExistsSync(local3)) localFiles.push(local3); + + const answers = { + modules: false, + builds: false, + cache: false, + nothingToClean: !skipQuestion, + locals: false, + }; + + if (pathsToRemove.length) { + if (!skipQuestion) { + const { confirm } = await inquirerPrompt({ + name: 'confirm', + type: 'confirm', + message: `Do you want to remove node_module related files/folders? \n${chalk().red( + pathsToRemove.join('\n') + )}`, + }); + answers.modules = confirm; + if (confirm) answers.nothingToClean = false; + } else { + answers.modules = true; } - }); - } - - const buildDirs = []; - if (fsExistsSync(c.paths.project.builds.dir)) { - buildDirs.push(c.paths.project.builds.dir); - } - if (fsExistsSync(c.paths.project.assets.dir)) { - buildDirs.push(c.paths.project.assets.dir); - } - - const local1 = path.join(c.paths.project.dir, '.DS_Store'); - if (fsExistsSync(local1)) localFiles.push(local1); - const local2 = path.join(c.paths.project.dir, 'renative.local.json'); - if (fsExistsSync(local2)) localFiles.push(local2); - const local3 = path.join(c.paths.project.dir, 'metro.config.local.js'); - if (fsExistsSync(local3)) localFiles.push(local3); - - const answers = { - modules: false, - builds: false, - cache: false, - nothingToClean: !skipQuestion, - locals: false, - }; + } - if (pathsToRemove.length) { - if (!skipQuestion) { - const { confirm } = await inquirerPrompt({ - name: 'confirm', - type: 'confirm', - message: `Do you want to remove node_module related files/folders? \n${chalk().red( - pathsToRemove.join('\n') - )}`, - }); - answers.modules = confirm; - if (confirm) answers.nothingToClean = false; - } else { - answers.modules = true; + if (buildDirs.length) { + if (!skipQuestion) { + const { confirmBuilds } = await inquirerPrompt({ + name: 'confirmBuilds', + type: 'confirm', + message: `Do you want to clean your platformBuilds and platformAssets? \n${chalk().red( + buildDirs.join('\n') + )}`, + }); + answers.builds = confirmBuilds; + if (confirmBuilds) answers.nothingToClean = false; + } else { + answers.builds = true; + } } - } - if (buildDirs.length) { - if (!skipQuestion) { - const { confirmBuilds } = await inquirerPrompt({ - name: 'confirmBuilds', - type: 'confirm', - message: `Do you want to clean your platformBuilds and platformAssets? \n${chalk().red( - buildDirs.join('\n') - )}`, - }); - answers.builds = confirmBuilds; - if (confirmBuilds) answers.nothingToClean = false; - } else { - answers.builds = true; + if (localFiles.length) { + if (!skipQuestion) { + const { confirmLocals } = await inquirerPrompt({ + name: 'confirmLocals', + type: 'confirm', + message: `Do you want to clean local files? \n${chalk().red(localFiles.join('\n'))}`, + }); + answers.locals = confirmLocals; + if (confirmLocals) answers.nothingToClean = false; + } else { + answers.locals = true; + } } - } - if (localFiles.length) { if (!skipQuestion) { - const { confirmLocals } = await inquirerPrompt({ - name: 'confirmLocals', + const { confirmCache } = await inquirerPrompt({ + name: 'confirmCache', type: 'confirm', - message: `Do you want to clean local files? \n${chalk().red(localFiles.join('\n'))}`, + message: 'Do you want to clean your npm/bundler cache?', }); - answers.locals = confirmLocals; - if (confirmLocals) answers.nothingToClean = false; + answers.cache = confirmCache; + if (confirmCache) answers.nothingToClean = false; } else { - answers.locals = true; + answers.cache = true; } - } - - if (!skipQuestion) { - const { confirmCache } = await inquirerPrompt({ - name: 'confirmCache', - type: 'confirm', - message: 'Do you want to clean your npm/bundler cache?', - }); - answers.cache = confirmCache; - if (confirmCache) answers.nothingToClean = false; - } else { - answers.cache = true; - } - - if (answers.nothingToClean) { - logToSummary('Nothing to clean'); - return true; - } - - if (answers.modules) { - await removeDirs(pathsToRemove); - } - if (answers.builds) { - await removeDirs(buildDirs); - } - if (answers.locals) { - await removeDirs(localFiles); - } - if (answers.cache) { - if (isSystemWin) { - clearWindowsCacheFiles(); - } else { - try { - await executeAsync('watchman watch-del-all'); - } catch (e) { - logDebug('watchman not installed. skipping'); - } - await executeAsync( - 'npx rimraf -I $TMPDIR/metro-* && npx rimraf -I $TMPDIR/react-* && npx rimraf -I $TMPDIR/haste-*' - ); + if (answers.nothingToClean) { + logToSummary('Nothing to clean'); + return true; } - } - return true; -}; -const Task: RnvTask = { - description: 'Automatically removes all node_modules and lock in your project and its dependencies', - fn: taskClean, + if (answers.modules) { + await removeDirs(pathsToRemove); + } + if (answers.builds) { + await removeDirs(buildDirs); + } + if (answers.locals) { + await removeDirs(localFiles); + } + if (answers.cache) { + if (isSystemWin) { + clearWindowsCacheFiles(); + } else { + try { + await executeAsync('watchman watch-del-all'); + } catch (e) { + logDebug('watchman not installed. skipping'); + } + + await executeAsync( + 'npx rimraf -I $TMPDIR/metro-* && npx rimraf -I $TMPDIR/react-* && npx rimraf -I $TMPDIR/haste-*' + ); + } + } + return true; + }, task: RnvTaskName.clean, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/global/taskConfig.ts b/packages/engine-core/src/tasks/global/taskConfig.ts index 6b34bae0b8..8f085c87d5 100644 --- a/packages/engine-core/src/tasks/global/taskConfig.ts +++ b/packages/engine-core/src/tasks/global/taskConfig.ts @@ -1,29 +1,11 @@ -import { - logTask, - RnvTaskOptionPresets, - RnvTaskFn, - executeTask, - SUPPORTED_PLATFORMS, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { RnvTaskName, createTask } from '@rnv/core'; -const taskConfig: RnvTaskFn = async (c, _, originTask) => { - logTask('taskConfig'); - - await executeTask(RnvTaskName.configureSoft, RnvTaskName.config, originTask); - - console.log(JSON.stringify(c.buildConfig, null, 2)); - - return true; -}; - -const Task: RnvTask = { +export default createTask({ description: 'Display RNV config', - fn: taskConfig, + dependsOn: [RnvTaskName.configureSoft], + fn: async ({ ctx }) => { + console.log(JSON.stringify(ctx.buildConfig, null, 2)); + return true; + }, task: RnvTaskName.config, - options: RnvTaskOptionPresets.withBase(), - platforms: [...SUPPORTED_PLATFORMS], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/global/taskConfigureSoft.ts b/packages/engine-core/src/tasks/global/taskConfigureSoft.ts deleted file mode 100644 index a1799465c5..0000000000 --- a/packages/engine-core/src/tasks/global/taskConfigureSoft.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { - RnvTaskFn, - RnvTaskOptionPresets, - executeTask, - configureRuntimeDefaults, - isPlatformSupported, - logTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { checkAndConfigureSdks, checkSdk } from '../../common'; -import { isBuildSchemeSupported } from '../../buildSchemes'; - -const taskConfigureSoft: RnvTaskFn = async (_c, parentTask, originTask) => { - logTask('taskConfigureSoft'); - - await configureRuntimeDefaults(); - await executeTask(RnvTaskName.appConfigure, parentTask, originTask); - await isPlatformSupported(); - await isBuildSchemeSupported(); - await checkAndConfigureSdks(); - await checkSdk(); - await configureRuntimeDefaults(); - return true; -}; - -const Task: RnvTask = { - description: 'Configure system and project without recreating files (used for --only)', - fn: taskConfigureSoft, - task: RnvTaskName.configureSoft, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - isPrivate: true, -}; - -export default Task; diff --git a/packages/engine-core/src/tasks/global/taskDeploy.ts b/packages/engine-core/src/tasks/global/taskDeploy.ts deleted file mode 100644 index 68d69c7b11..0000000000 --- a/packages/engine-core/src/tasks/global/taskDeploy.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - RnvTaskFn, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - SUPPORTED_PLATFORMS, -} from '@rnv/core'; - -const taskDeploy: RnvTaskFn = async (_c, parentTask, originTask) => { - logTask('taskDeploy', `parent:${parentTask}`); - - await executeOrSkipTask(RnvTaskName.export, RnvTaskName.deploy, originTask); - - if (shouldSkipTask(RnvTaskName.deploy, originTask)) return true; - - // Deploy simply trggets hook - return true; -}; - -const Task: RnvTask = { - description: 'Deploy the binary via selected deployment intgeration or buld hook', - fn: taskDeploy, - task: RnvTaskName.deploy, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: [...SUPPORTED_PLATFORMS], -}; - -export default Task; diff --git a/packages/engine-core/src/tasks/global/taskDoctor.ts b/packages/engine-core/src/tasks/global/taskDoctor.ts index 2a0d4d08ee..35101eea3a 100644 --- a/packages/engine-core/src/tasks/global/taskDoctor.ts +++ b/packages/engine-core/src/tasks/global/taskDoctor.ts @@ -1,17 +1,13 @@ import lGet from 'lodash/get'; import { chalk, - logTask, logToSummary, - RnvTaskOptionPresets, - executeTask, configureRuntimeDefaults, readObjectSync, fsExistsSync, - RnvTaskFn, validateRenativeProjectSchema, - RnvTask, RnvTaskName, + createTask, } from '@rnv/core'; const configTargets = [ @@ -22,78 +18,72 @@ const configTargets = [ 'appConfig.configs', ]; -const taskDoctor: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskDoctor'); - - await configureRuntimeDefaults(); - await executeTask(RnvTaskName.appConfigure, parentTask, originTask); - await configureRuntimeDefaults(); +export default createTask({ + description: 'Checks validity and config health of your project', + dependsOn: [RnvTaskName.appConfigure], + beforeDependsOn: async () => { + await configureRuntimeDefaults(); + }, + fn: async ({ ctx }) => { + await configureRuntimeDefaults(); - const configPaths: Array = []; + const configPaths: Array = []; - configTargets.forEach((target) => { - const tPath = lGet(c.paths, target); + configTargets.forEach((target) => { + const tPath = lGet(ctx.paths, target); - if (tPath) { - if (Array.isArray(tPath)) { - configPaths.push(...tPath); - } else { - configPaths.push(tPath); + if (tPath) { + if (Array.isArray(tPath)) { + configPaths.push(...tPath); + } else { + configPaths.push(tPath); + } } - } - }); + }); - let errMsg = 'RENATIVE JSON SCHEMA VALIDITY CHECK:\n\n'; - let hasErrors = false; - configPaths.forEach((cPath) => { - if (fsExistsSync(cPath)) { - const cObj = readObjectSync(cPath); - const result = validateRenativeProjectSchema(cObj); - if (!result.success) { - hasErrors = true; - errMsg += chalk().yellow(`\nInvalid schema in ${cPath}. ISSUES:\n\n`); - result.error.errors?.forEach((err) => { - errMsg += chalk().yellow(`${chalk().grey(err.path)}: ${err.message}`); - }); + let errMsg = 'RENATIVE JSON SCHEMA VALIDITY CHECK:\n\n'; + let hasErrors = false; + configPaths.forEach((cPath) => { + if (fsExistsSync(cPath)) { + const cObj = readObjectSync(cPath); + const result = validateRenativeProjectSchema(cObj); + if (!result.success) { + hasErrors = true; + errMsg += chalk().yellow(`\nInvalid schema in ${cPath}. ISSUES:\n\n`); + result.error.errors?.forEach((err) => { + errMsg += chalk().yellow(`${chalk().grey(err.path)}: ${err.message}`); + }); + } + // if (!valid) { + // hasErrors = true; + // // console.log('ERROR', ajv.errors); + // errMsg += chalk().yellow( + // `\nInvalid schema in ${ + // // cPath}. ISSUES: ${JSON.stringify(ajv.errors, null, 2)}\n`); + // cPath + // }. ISSUES:\n\n` + // ); + // if (typeof ajv !== 'boolean' && ajv) { + // ajv.errors?.forEach((err) => { + // errMsg += chalk().yellow( + // `${chalk().grey(err.dataPath === '' ? '/' : err.dataPath)}: ${err.message} ${Object.keys( + // err.params + // ) + // .map((k) => `=> ${chalk().red(err.params[k])}`) + // .join('\n')}\n` + // ); + // }); + // } + // } } - // if (!valid) { - // hasErrors = true; - // // console.log('ERROR', ajv.errors); - // errMsg += chalk().yellow( - // `\nInvalid schema in ${ - // // cPath}. ISSUES: ${JSON.stringify(ajv.errors, null, 2)}\n`); - // cPath - // }. ISSUES:\n\n` - // ); - // if (typeof ajv !== 'boolean' && ajv) { - // ajv.errors?.forEach((err) => { - // errMsg += chalk().yellow( - // `${chalk().grey(err.dataPath === '' ? '/' : err.dataPath)}: ${err.message} ${Object.keys( - // err.params - // ) - // .map((k) => `=> ${chalk().red(err.params[k])}`) - // .join('\n')}\n` - // ); - // }); - // } - // } - } - }); + }); - if (!hasErrors) { - errMsg += chalk().green(`PASSED ${configPaths.length} files`); - } - - logToSummary(errMsg); -}; + if (!hasErrors) { + errMsg += chalk().green(`PASSED ${configPaths.length} files`); + } -const Task: RnvTask = { - description: 'Checks validity and config health of your project', - fn: taskDoctor, + logToSummary(errMsg); + }, task: RnvTaskName.doctor, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/global/taskHelp.ts b/packages/engine-core/src/tasks/global/taskHelp.ts index fe83e4d93a..9b3c9c1a76 100644 --- a/packages/engine-core/src/tasks/global/taskHelp.ts +++ b/packages/engine-core/src/tasks/global/taskHelp.ts @@ -1,37 +1,35 @@ import { chalk, logToSummary, - logTask, RnvTaskOptionPresets, getRegisteredEngines, - RnvTaskFn, - RnvTask, + createTask, RnvTaskName, generateStringFromTaskOption, } from '@rnv/core'; -const taskHelp: RnvTaskFn = async () => { - logTask('taskHelp'); - - // PARAMS - let optsString = ''; +export default createTask({ + description: 'Display generic help', + fn: async () => { + // PARAMS + let optsString = ''; - RnvTaskOptionPresets.withAll().forEach((param) => { - optsString += chalk().grey(`${generateStringFromTaskOption(param)}, ${param.description}\n`); - }); + RnvTaskOptionPresets.withAll().forEach((param) => { + optsString += chalk().grey(`${generateStringFromTaskOption(param)}, ${param.description}\n`); + }); - // TASKS - const commands: Array = []; - const engines = getRegisteredEngines(); + // TASKS + const commands: Array = []; + const engines = getRegisteredEngines(); - engines.forEach((engine) => { - Object.values(engine.tasks).forEach(({ task }) => { - commands.push(task); + engines.forEach((engine) => { + Object.values(engine.tasks).forEach(({ task }) => { + commands.push(task); + }); }); - }); - const cmdsString = commands.join(', '); + const cmdsString = commands.join(', '); - logToSummary(` + logToSummary(` ${chalk().bold('COMMANDS:')} ${cmdsString} @@ -40,16 +38,8 @@ ${chalk().bold('OPTIONS:')} ${optsString} `); -}; - -const Task: RnvTask = { - description: 'Display generic help', - fn: taskHelp, + }, task: RnvTaskName.help, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, isPriorityOrder: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/global/taskInstall.ts b/packages/engine-core/src/tasks/global/taskInstall.ts deleted file mode 100644 index 6c9e0102e4..0000000000 --- a/packages/engine-core/src/tasks/global/taskInstall.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - areNodeModulesInstalled, - RnvTaskOptionPresets, - installPackageDependenciesAndPlugins, - logTask, - logInfo, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; - -const taskInstall: RnvTaskFn = async (c, parentTask, _) => { - logTask('taskInstall', `requiresInstall:${!!c._requiresNpmInstall}:${!c.runtime.skipPackageUpdate}`); - - if (c.program.only && !!parentTask) return true; - - if (c.program.skipDependencyCheck) return true; - - // Check node_modules - // c.runtime.skipPackageUpdate only reflects rnv version mismatch. should not prevent updating other deps - if (!areNodeModulesInstalled() || c._requiresNpmInstall /* && !c.runtime.skipPackageUpdate */) { - if (!areNodeModulesInstalled()) { - logInfo('node_modules folder is missing. INSTALLING...'); - } else { - logInfo('node_modules folder is out of date. INSTALLING...'); - } - c._requiresNpmInstall = false; - await installPackageDependenciesAndPlugins(); - } - return true; -}; - -const Task: RnvTask = { - description: 'Install package node_modules via yarn or npm', - fn: taskInstall, - task: RnvTaskName.install, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; diff --git a/packages/engine-core/src/tasks/global/taskKill.ts b/packages/engine-core/src/tasks/global/taskKill.ts index 1ce87abc36..a40544fda0 100644 --- a/packages/engine-core/src/tasks/global/taskKill.ts +++ b/packages/engine-core/src/tasks/global/taskKill.ts @@ -1,77 +1,66 @@ import { - RnvTaskOptionPresets, - PlatformKey, + RnvPlatformKey, RnvContext, - RnvTask, - RnvTaskFn, + createTask, RnvTaskName, chalk, configureRuntimeDefaults, executeTask, inquirerPrompt, logSuccess, - logTask, } from '@rnv/core'; import { checkPortInUse } from '@rnv/sdk-utils'; import killPort from 'kill-port'; -const taskKill: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskKill'); - - const usedPorts: RnvContext['runtime']['supportedPlatforms'] = []; - let platArray: RnvContext['runtime']['supportedPlatforms'] = []; - const results = []; - let ports: Partial> = {}; - - await configureRuntimeDefaults(); +export default createTask({ + description: 'Kills all the processes related to this project', + fn: async ({ ctx, taskName, originTaskName }) => { + const usedPorts: RnvContext['runtime']['supportedPlatforms'] = []; + let platArray: RnvContext['runtime']['supportedPlatforms'] = []; + const results = []; + let ports: Partial> = {}; - if (c.paths.project.configExists) { - await executeTask(RnvTaskName.appConfigure, RnvTaskName.kill, originTask); await configureRuntimeDefaults(); - platArray = Object.values(c.runtime.supportedPlatforms); - ports = c.buildConfig?.defaults?.ports || {}; - } - for (let i = 0; i < platArray.length; i++) { - const plat = platArray[i]; - const port = ports?.[plat.platform]; - plat.port = port; - if (port) { - results.push(checkPortInUse(port)); + + if (ctx.paths.project.configExists) { + await executeTask({ taskName: RnvTaskName.appConfigure, parentTaskName: taskName, originTaskName }); + await configureRuntimeDefaults(); + platArray = Object.values(ctx.runtime.supportedPlatforms); + ports = ctx.buildConfig?.defaults?.ports || {}; } - } - const usedPortsArr = await Promise.all(results); - usedPortsArr.forEach((isInUse, i) => { - if (isInUse) { - usedPorts.push(platArray[i]); + for (let i = 0; i < platArray.length; i++) { + const plat = platArray[i]; + const port = ports?.[plat.platform]; + plat.port = port; + if (port) { + results.push(checkPortInUse(port)); + } } - }); + const usedPortsArr = await Promise.all(results); + usedPortsArr.forEach((isInUse, i) => { + if (isInUse) { + usedPorts.push(platArray[i]); + } + }); - if (usedPorts.length) { - const { confirm } = await inquirerPrompt({ - type: 'confirm', - message: 'Processes attached to the ports will be killed. Continue?', - warningMessage: `Found active ports: + if (usedPorts.length) { + const { confirm } = await inquirerPrompt({ + type: 'confirm', + message: 'Processes attached to the ports will be killed. Continue?', + warningMessage: `Found active ports: ${usedPorts.map((v) => chalk().bold(`> ${v.port} (${v.platform})`)).join('\n')}`, - }); - if (confirm) { - const killPromise = []; - usedPorts.forEach((v) => { - if (v.port) killPromise.push(killPort(v.port)); }); - await Promise.all(usedPorts); - logSuccess('Processes KILLED'); + if (confirm) { + const killPromise = []; + usedPorts.forEach((v) => { + if (v.port) killPromise.push(killPort(v.port)); + }); + await Promise.all(usedPorts); + logSuccess('Processes KILLED'); + } } - } - return true; -}; - -const Task: RnvTask = { - description: 'Kills all the processes related to this project', - fn: taskKill, + return true; + }, task: RnvTaskName.kill, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/global/taskNew.ts b/packages/engine-core/src/tasks/global/taskNew.ts deleted file mode 100644 index 0a70b48250..0000000000 --- a/packages/engine-core/src/tasks/global/taskNew.ts +++ /dev/null @@ -1,820 +0,0 @@ -import lSet from 'lodash/set'; -import path from 'path'; -import semver from 'semver'; -import { - RnvTaskOptionPresets, - getTemplateOptions, - mkdirSync, - writeFileSync, - cleanFolder, - fsExistsSync, - readObjectSync, - removeDirs, - checkAndCreateGitignore, - getWorkspaceOptions, - updateRenativeConfigs, - executeAsync, - chalk, - logDebug, - logInfo, - logSuccess, - logTask, - logError, - logWarning, - printArrIntoBox, - printBoxEnd, - printBoxStart, - printIntoBox, - isYarnInstalled, - listAndSelectNpmVersion, - RnvContext, - getApi, - inquirerPrompt, - PlatformKey, - commandExistsSync, - PromptParams, - RnvTask, - ConfigFileProject, - ConfigFileTemplate, - RnvTaskName, - ConfigName, -} from '@rnv/core'; - -type NewProjectData = { - appTitle?: string; - inputAppTitle?: string; - packageName?: string; - defaultAppTitle?: string; - defaultTemplate?: string; - inputProjectName?: string; - teamID?: string; - appID?: string; - inputAppID?: string; - inputVersion?: string; - defaultVersion: string; - inputTemplate?: string; - version?: string; - optionTemplates: { - selectedOption?: string; - selectedVersion?: string; - valuesAsObject?: Record< - string, - { - title: string; - key: string; - description: string; - } - >; - valuesAsArray?: Array<{ - title: string; - key: string; - }>; - keysAsArray?: Array; - }; - projectName?: string; - optionWorkspaces: { - selectedOption?: string; - valuesAsObject?: Record< - string, - { - title: string; - key: string; - } - >; - valuesAsArray?: Array; - keysAsArray?: Array; - }; - gitEnabled?: boolean; - optionPlatforms: { - selectedOptions?: Array; - }; - confirmString?: string; - defaultProjectName?: string; - defaultWorkspace?: string; - inputSupportedPlatforms?: Array; - inputWorkspace?: string; -}; - -export const configureGit = async (c: RnvContext) => { - const projectPath = c.paths.project.dir; - logTask(`configureGit:${projectPath}`); - - if (!fsExistsSync(path.join(projectPath, '.git'))) { - logInfo('Your project does not have a git repo. Creating one...DONE'); - if (commandExistsSync('git')) { - await executeAsync('git init', { cwd: projectPath }); - await executeAsync('git add -A', { cwd: projectPath }); - await executeAsync('git commit -m "Initial"', { cwd: projectPath }); - } else { - logWarning("We tried to create a git repo inside your project but you don't seem to have git installed"); - } - } -}; -const checkInputValue = (value: string | boolean): boolean => { - return value && typeof value === 'string' && value !== '' ? true : false; -}; -const _prepareProjectOverview = (c: RnvContext, data: NewProjectData) => { - data.appTitle = data.inputAppTitle || data.defaultAppTitle; - data.teamID = ''; - data.appID = data.inputAppID ? data.inputAppID.replace(/\s+/g, '-').toLowerCase() : data.appID; - data.version = data.inputVersion || data.defaultVersion; - const tempString = `${data.optionTemplates.selectedOption}@${data.optionTemplates.selectedVersion}`; - - const highlight = chalk().green; - - let str = printBoxStart('🚀 ReNative Project Generator'); - str += printIntoBox(''); - str += printIntoBox(`Project Name (folder): ${highlight(data.projectName)}`); - str += printIntoBox(`Workspace: ${highlight(data.optionWorkspaces.selectedOption)}`); - str += printIntoBox(`Project Title: ${highlight(data.appTitle)}`); - str += printIntoBox(`Project Version: ${highlight(data.version)}`); - str += printIntoBox(`App ID: ${highlight(data.appID)}`); - str += printIntoBox(`Project Template: ${highlight(tempString)}`); - str += printIntoBox(`Git Enabled: ${highlight(data.gitEnabled)}`); - str += printIntoBox(''); - str += printIntoBox('Project Platforms:'); - str += printArrIntoBox(data.optionPlatforms.selectedOptions || []); - str += printIntoBox(''); - str += printIntoBox('Project Structure:'); - str += printIntoBox(''); - str += printIntoBox(data.projectName || 'UNKNOWN'); - str += chalk().gray(`│ ├── appConfigs # Application flavour configuration files/assets │ -│ │ └── [APP_ID] # Example application flavour │ -│ │ ├── assets # Platform assets injected to ./platformAssets │ -│ │ ├── builds # Platform files injected to ./platformBuilds │ -│ │ ├── fonts # Folder for all custom fonts │ -│ │ ├── plugins # Multi-platform plugins injections │ -│ │ └── renative.json # Application flavour config │ -│ ├── platformAssets # Generated cross-platform assets │ -│ ├── platformBuilds # Generated platform app projects │ -│ ├── src # Source code files │ -│ ├── index.*.js # Entry files │ -│ └── renative.json # ReNative project configuration │ -`); - str += printIntoBox(''); - str += printBoxEnd(); - str += '\n'; - - data.confirmString = str; -}; - -type ConfigProp = Required['bootstrapConfig']>['bootstrapQuestions'][number]['configProp']; - -type QuestionResults = Record< - string, - { - answer: string; - configProp: ConfigProp; - value: string; - } ->; - -type BootstrapQuestions = Required['bootstrapConfig']>['bootstrapQuestions']; - -const interactiveQuestion = async ( - results: QuestionResults, - bootstrapQuestions: BootstrapQuestions, - providedAnswers: Record -) => { - if (bootstrapQuestions?.length) { - for (let i = 0; i < bootstrapQuestions.length; i++) { - const q = bootstrapQuestions[i]; - const qKey = q?.configProp?.key || ''; - // inquirer will nest them if they look like an object - const qKeyClean = qKey.replace('.', '__'); - - const choicesObj: Record = {}; - if (q.options) { - q.options.forEach((opt) => { - choicesObj[opt.title] = opt; - }); - } - - // answer already passed into the command line - const answer = providedAnswers[qKey.replace('__', '.')]; - if (answer) { - let value; - if (typeof answer === 'string' && q.type === 'list') { - value = choicesObj[answer]?.value; - } else { - value = answer; - } - - results[qKey] = { - answer, - configProp: q.configProp, - value, - }; - } else { - const inqQuestion: PromptParams = { - name: qKeyClean, - type: q.type, - message: q.title, - choices: Object.keys(choicesObj), - }; - // eslint-disable-next-line no-await-in-loop - const result = await inquirerPrompt(inqQuestion); - const val = q.type === 'list' ? choicesObj[result[qKeyClean]]?.value : result[qKeyClean]; - results[qKey] = { - answer: result[qKeyClean], - configProp: q.configProp, - value: val, - }; - } - - if (choicesObj[results[qKey].answer]?.bootstrapQuestions) { - // eslint-disable-next-line no-await-in-loop - await interactiveQuestion( - results, - choicesObj[results[qKey].answer].bootstrapQuestions, - providedAnswers - ); - } - } - } -}; - -const taskNew = async (c: RnvContext) => { - logTask('taskNew'); - const { - ci, - projectName, - title, - id, - appVersion, - workspace, - projectTemplate, - templateVersion, - platform, - gitEnabled, - } = c.program; - - if (fsExistsSync(c.paths.project.config)) { - logWarning(`You are in ReNative project. Found: ${c.paths.project.config}`); - const { confirmInRnvProject } = await inquirerPrompt({ - name: 'confirmInRnvProject', - type: 'confirm', - message: 'Are you sure you want to continue?', - }); - if (!confirmInRnvProject) { - return Promise.reject('Cancelled'); - } - } - - if (fsExistsSync(c.paths.project.nodeModulesDir)) { - logWarning( - `Found node_modules directory at your location. If you continue it will be deleted: ${c.paths.project.nodeModulesDir}` - ); - const { confirmDeleteNodeModules } = await inquirerPrompt({ - name: 'confirmDeleteNodeModules', - type: 'confirm', - message: 'Are you sure you want to continue?', - }); - if (confirmDeleteNodeModules) { - await removeDirs([c.paths.project.nodeModulesDir]); - } - } - - let data: NewProjectData = { - defaultVersion: '0.1.0', - defaultTemplate: '@rnv/template-starter', - defaultProjectName: 'helloRenative', - defaultAppTitle: 'Hello Renative', - defaultWorkspace: 'rnv', - optionPlatforms: {}, - optionTemplates: {}, - optionWorkspaces: {}, - }; - data.optionPlatforms = {}; - data.optionTemplates = {}; - data.optionWorkspaces = getWorkspaceOptions(c); - - // ================================================== - // INPUT: Project Name - // ================================================== - - let inputProjectName: string; - - if (checkInputValue(projectName)) { - inputProjectName = projectName; - } else { - const inputProjectNameObj = await inquirerPrompt({ - name: 'inputProjectName', - type: 'input', - validate: (value) => checkInputValue(value), - message: "What's your project Name? (no spaces, folder based on ID will be created in this directory)", - }); - inputProjectName = inputProjectNameObj?.inputProjectName; - } - - data.projectName = inputProjectName.replace(/(\s+)/g, '_'); - c.paths.project.dir = path.join(c.paths.CURRENT_DIR, data.projectName); - - if (fsExistsSync(c.paths.project.dir)) { - const { confirm } = await inquirerPrompt({ - type: 'confirm', - name: 'confirm', - message: `Folder ${c.paths.project.dir} already exists. RNV will override it. Continue?`, - }); - - if (!confirm) { - return Promise.reject('Cancelled by user'); - } - await cleanFolder(c.paths.project.dir); - } - - mkdirSync(c.paths.project.dir); - - // ================================================== - // INPUT: Project Title, ID, Version - // ================================================== - - const validator = { - validateAppTitle: (val: string) => checkInputValue(val) || 'Please enter a title', - validateAppID: (appId: string) => - (typeof appId === 'string' && !!appId.match(/^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+[0-9a-z_]$/)) || - 'Please enter a valid appID (com.test.app)', - validateAppVersion: (version: string) => - !!semver.valid(semver.coerce(version)) || - 'Please enter a valid semver version (1.0.0, 42.6.7.9.3-alpha, etc.)', - }; - - const inputValues = [ - { - value: title, - validFn: validator.validateAppTitle, - name: 'inputAppTitle', - defaultVal: data.defaultAppTitle, - message: "What's your project Title?", - warning: 'Title was not provided', - }, - { - value: id, - validFn: validator.validateAppID, - name: 'inputAppID', - defaultVal: () => { - data.appID = `com.mycompany.${inputProjectName.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()}`; - return data.appID; - }, - message: "What's your App ID?", - warning: `Command contains invalid appId : ${id}`, - }, - { - value: appVersion, - validFn: validator.validateAppVersion, - name: 'inputVersion', - defaultVal: data.defaultVersion, - message: "What's your Version?", - warning: `Command contains invalid appVersion. Please enter a valid semver version (1.0.0, 42.6.7.9.3-alpha, etc.`, - }, - ]; - - const validateAndAssign = async ({ - value, - validFn, - name, - defaultVal, - message, - warning, - }: { - value: string; - validFn: (value: string) => true | string; - name: string; - defaultVal: (() => string) | string | undefined; - message: string; - warning: string; - }): Promise => { - const isValid = validFn(value); - if (value && isValid === true) { - return value; - } else { - const warningMessage = typeof isValid === 'string'; - const answer = await inquirerPrompt({ - name, - type: 'input', - default: defaultVal, - validate: validFn, - message, - warningMessage: ci && warningMessage && warning, - }); - return answer[name]; - } - }; - const inputsResult = []; - for (const value of inputValues) { - const res = await validateAndAssign(value); - inputsResult.push(res); - } - - const [inputAppTitle, inputAppID, inputVersion] = inputsResult; - - // ================================================== - // INPUT: Workspace - // ================================================== - let inputWorkspace; - if (checkInputValue(workspace)) { - inputWorkspace = workspace; - } else if (ci) { - inputWorkspace = data.defaultWorkspace; - } else { - const answer = await inquirerPrompt({ - name: 'inputWorkspace', - type: 'list', - message: 'What workspace to use?', - default: data.defaultWorkspace, - choices: data.optionWorkspaces.keysAsArray, - }); - - inputWorkspace = answer?.inputWorkspace; - } - data.optionWorkspaces.selectedOption = inputWorkspace; - c.runtime.selectedWorkspace = inputWorkspace; - - await updateRenativeConfigs(); - data.optionTemplates = getTemplateOptions(); - - const options = []; - const values = data.optionTemplates.valuesAsObject; - if (values) { - Object.keys(values).forEach((k) => { - const val = values[k]; - if (val.description) { - val.title = `${k} ${chalk().grey(`- ${val.description}`)}`; - } else { - val.title = k; - } - - val.key = k; - options.push(val.title); - }); - } - - const getTemplateKey = (val: string) => data.optionTemplates.valuesAsArray?.find((v) => v.title === val)?.key; - - // ================================================== - // INPUT: Template - // ================================================== - const customTemplate = 'Custom Template ...'; - - // data.optionTemplates.keysAsArray.push(customTemplate); - options.push(customTemplate); - let selectedInputTemplate; - if (checkInputValue(projectTemplate)) { - selectedInputTemplate = projectTemplate; - } else { - const { inputTemplate } = await inquirerPrompt({ - name: 'inputTemplate', - type: 'list', - message: 'What template to use?', - default: data.defaultTemplate, - choices: options, - }); - - if (inputTemplate === customTemplate) { - const { inputTemplateCustom } = await inquirerPrompt({ - name: 'inputTemplateCustom', - type: 'input', - message: 'Type exact name of your template NPM package.', - }); - selectedInputTemplate = inputTemplateCustom; - } else { - selectedInputTemplate = getTemplateKey(inputTemplate); - } - } - - data.optionTemplates.selectedOption = selectedInputTemplate; - - let inputTemplateVersion; - if (checkInputValue(templateVersion)) { - inputTemplateVersion = templateVersion; - } else { - inputTemplateVersion = await listAndSelectNpmVersion(data.optionTemplates.selectedOption || ''); - } - - data.optionTemplates.selectedVersion = inputTemplateVersion; - - await executeAsync(`${isYarnInstalled() ? 'yarn' : 'npm'} add ${selectedInputTemplate}@${inputTemplateVersion}`, { - cwd: c.paths.project.dir, - }); - - // Add rnv to package.json - await executeAsync(`${isYarnInstalled() ? 'yarn' : 'npm'} add rnv@${c.rnvVersion}`, { - cwd: c.paths.project.dir, - }); - - // Check if node_modules folder exists - if (!fsExistsSync(path.join(c.paths.project.dir, 'node_modules'))) { - logError( - `${ - isYarnInstalled() ? 'yarn' : 'npm' - } add ${selectedInputTemplate}@${inputTemplateVersion} : FAILED. this could happen if you have package.json accidentally created somewhere in parent directory` - ); - return; - } - // This ensures that the correct version of the npm packages will be used to run the project for the first time after creation - - const renativeTemplateConfig = - readObjectSync( - path.join(c.paths.project.dir, 'node_modules', selectedInputTemplate, ConfigName.renativeTemplate) - ) || {}; - - const rnvNewPatchDependencies = renativeTemplateConfig.bootstrapConfig?.rnvNewPatchDependencies; - - if (rnvNewPatchDependencies) { - const patchDeps = Object.entries(rnvNewPatchDependencies); - for (const [dependency, version] of patchDeps) { - const command = `${isYarnInstalled() ? 'yarn' : 'npm'} add ${dependency}@${version}`; - await executeAsync(command, { cwd: c.paths.project.dir }); - } - } - - if (!data.optionTemplates.keysAsArray?.includes(selectedInputTemplate)) { - const { confirmAddTemplate } = await inquirerPrompt({ - name: 'confirmAddTemplate', - type: 'confirm', - message: `Would you like to add ${chalk().bold(selectedInputTemplate)} to your ${ - c.runtime.selectedWorkspace - } workspace template list?`, - }); - - const configFile = c.files.workspace.config; - - if (configFile) { - if (confirmAddTemplate) { - if (!configFile.projectTemplates) { - configFile.projectTemplates = {}; - } - configFile.projectTemplates[selectedInputTemplate] = {}; - writeFileSync(c.paths.workspace.config, configFile); - await updateRenativeConfigs(); - - logInfo(`Updating ${c.paths.workspace.config}...DONE`); - } - } - } - - const renativeConfig = readObjectSync( - path.join(c.paths.project.dir, 'node_modules', selectedInputTemplate, ConfigName.renative) - ); - - // ================================================== - // INPUT: Supported Platforms - // ================================================== - - const supportedPlatforms = - renativeTemplateConfig?.defaults?.supportedPlatforms || renativeConfig?.defaults?.supportedPlatforms || []; - - if (supportedPlatforms.length === 0) { - logError( - `Template ${selectedInputTemplate} does not seem to export any default platforms to support. contact the author.` - ); - } - - let inputSupportedPlatforms; - if (checkInputValue(platform)) { - inputSupportedPlatforms = platform.split(','); - } else { - const answer = await inquirerPrompt({ - name: 'inputSupportedPlatforms', - type: 'checkbox', - pageSize: 20, - message: 'What platforms would you like to use?', - validate: (val) => !!val.length || 'Please select at least a platform', - default: supportedPlatforms, - choices: supportedPlatforms, - }); - inputSupportedPlatforms = answer?.inputSupportedPlatforms; - } - - // ================================================== - // INPUT: Custom Questions - // ================================================== - const renativeTemplateConfigExt = {}; - const bootstrapQuestions = renativeTemplateConfig?.bootstrapConfig?.bootstrapQuestions || []; - const results: QuestionResults = {}; - const providedAnswers: Record = {}; - - if (c.program.answer) { - c.program.answer.forEach((a: string) => { - const key = a.split('=')[0]; - let value; - - try { - value = JSON.parse(a.split('=')[1]); - } catch (e) { - value = a.split('=')[1]; - } - - providedAnswers[key] = value; - }); - } - - await interactiveQuestion(results, bootstrapQuestions, providedAnswers); - - logDebug('asnwer', JSON.stringify(results, null, 2)); - - Object.keys(results).forEach((targetKey) => { - const objValue = results[targetKey].value; - - logDebug('setting', targetKey, objValue); - - if (targetKey) { - lSet(renativeTemplateConfigExt, targetKey, objValue); - } - }); - - let isGitEnabled = gitEnabled === 'true' || gitEnabled === true; - // ================================================== - // INPUT: Git Enabled - // ================================================== - if (gitEnabled === undefined && !ci) { - const response = await inquirerPrompt({ - name: 'gitEnabled', - type: 'confirm', - message: 'Do you want to set-up git in your new project?', - }); - - isGitEnabled = response.gitEnabled; - } - - // ================================================== - // INPUT: Confirm Overview - // ================================================== - data = { - ...data, - inputProjectName, - inputAppTitle, - inputAppID, - inputVersion, - inputTemplate: selectedInputTemplate, - inputSupportedPlatforms, - inputWorkspace, - gitEnabled: isGitEnabled, - }; - data.optionPlatforms.selectedOptions = inputSupportedPlatforms; - - _prepareProjectOverview(c, data); - if (!ci) { - const { confirm } = await inquirerPrompt({ - type: 'confirm', - name: 'confirm', - message: `\n${data.confirmString}\nIs all this correct?`, - }); - - if (!confirm) { - return; - } - } - - // ================================================== - // Setup Project - - try { - await getApi().analytics.captureEvent({ - type: 'newProject', - template: selectedInputTemplate, - platforms: inputSupportedPlatforms, - }); - } catch (e) { - logDebug(e); - } - - c.paths.project.package = path.join(c.paths.project.dir, 'package.json'); - c.paths.project.config = path.join(c.paths.project.dir, ConfigName.renative); - - data.packageName = data?.appTitle?.replace(/\s+/g, '-').toLowerCase(); - - const templates: Record< - string, - { - version: string; - } - > = {}; - - logTask( - `_generateProject:${data.optionTemplates.selectedOption}:${data.optionTemplates.selectedVersion}`, - chalk().grey - ); - - if (!data.optionTemplates.selectedVersion) { - return; - } - - if (data.optionTemplates.selectedOption) { - templates[data.optionTemplates.selectedOption] = { - version: data.optionTemplates.selectedVersion, - }; - } - - delete renativeTemplateConfig.templateConfig; - delete renativeTemplateConfig.bootstrapConfig; - - if (!data.optionTemplates.selectedOption) { - logError('Current template not selected!'); - return; - } - - const config: ConfigFileProject = { - platforms: {}, - ...renativeTemplateConfig, - ...renativeTemplateConfigExt, - projectName: data.projectName || 'my-project', - projectVersion: data.inputVersion || '0.1.0', - //TODO: TEMPORARY WORKAROUND this neds to use bootstrap_metadata to work properly - common: { - id: data.inputAppID || 'com.mycompany.myapp', - title: data.inputAppTitle || 'My App', - }, - workspaceID: data.optionWorkspaces.selectedOption || 'project description', - // paths: { - // appConfigsDir: './appConfigs', - // entryDir: './', - // platformAssetsDir: './platformAssets', - // platformBuildsDir: './platformBuilds', - // }, - defaults: { - supportedPlatforms: data.optionPlatforms.selectedOptions, - }, - engines: {}, - templates, - currentTemplate: data.optionTemplates.selectedOption, - isNew: true, - isMonorepo: false, - }; - - const platforms: ConfigFileProject['platforms'] = config.platforms || {}; - const engines: ConfigFileProject['engines'] = config.engines || {}; - const defaults: ConfigFileProject['defaults'] = config.defaults || {}; - - const supPlats = defaults.supportedPlatforms || []; - - // Remove unused platforms - Object.keys(platforms).forEach((k) => { - const key = k as PlatformKey; - if (!supPlats.includes(key)) { - delete platforms[key]; - } - }); - - const tplEngines = renativeTemplateConfig.engines; - if (tplEngines) { - // Remove unused engines based on selected platforms - supPlats.forEach((k) => { - const selectedEngineId = - platforms[k]?.engine || c.files.rnv.projectTemplates.config?.platformTemplates?.[k]?.engine; - if (selectedEngineId) { - const selectedEngine = findEngineKeyById(c, selectedEngineId); - if (selectedEngine?.key) { - engines[selectedEngine.key] = tplEngines[selectedEngine.key]; - } - } - }); - } - - config.platforms = platforms; - config.engines = engines; - config.defaults = defaults; - - writeFileSync(c.paths.project.config, config); - - if (data.gitEnabled) { - await checkAndCreateGitignore(); - await configureGit(c); - } - - logSuccess( - `Your project is ready! navigate to project ${chalk().bold(`cd ${data.projectName}`)} and run ${chalk().bold( - 'npx rnv run' - )} to see magic happen!` - ); - - return true; -}; - -const findEngineKeyById = (c: RnvContext, id: string) => { - const engineTemplates = c.files.rnv.projectTemplates.config?.engineTemplates; - if (engineTemplates) { - const etk = Object.keys(engineTemplates); - for (let i = 0; i < etk.length; i++) { - const engine = engineTemplates[etk[i]]; - if (engine) { - if (engine.id === id) { - engine.key = etk[i]; - return engine; - } - } - } - } -}; - -const Task: RnvTask = { - description: 'Create new ReNative project', - fn: taskNew, - task: RnvTaskName.new, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - isGlobalScope: true, - isPriorityOrder: true, -}; - -export default Task; diff --git a/packages/engine-core/src/tasks/global/taskStatus.ts b/packages/engine-core/src/tasks/global/taskStatus.ts index bd7b2e772f..bcf4a6723d 100644 --- a/packages/engine-core/src/tasks/global/taskStatus.ts +++ b/packages/engine-core/src/tasks/global/taskStatus.ts @@ -1,14 +1,10 @@ -import { RnvTaskOptionPresets, RnvTask, RnvTaskName } from '@rnv/core'; +import { createTask, RnvTaskName } from '@rnv/core'; -const taskStatus = async () => Promise.resolve(); - -const Task: RnvTask = { +export default createTask({ description: 'Show current info about the project', - fn: taskStatus, + fn: async () => { + return true; + }, task: RnvTaskName.status, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/hooks/taskHooksList.ts b/packages/engine-core/src/tasks/hooks/taskHooksList.ts index d8589e9068..3bad7bb5b2 100644 --- a/packages/engine-core/src/tasks/hooks/taskHooksList.ts +++ b/packages/engine-core/src/tasks/hooks/taskHooksList.ts @@ -1,42 +1,24 @@ -import { - logToSummary, - logTask, - generateOptions, - buildHooks, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { logToSummary, generateOptions, buildHooks, createTask, RnvTaskName } from '@rnv/core'; -const taskHooksList: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskHooksList'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.hooksList, originTask); - await buildHooks(); +export default createTask({ + description: 'Get list of all available hooks', + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + await buildHooks(); - if (c.buildHooks) { - const hookOpts = generateOptions(c.buildHooks); - let hooksAsString = `\n${'Hooks:'}\n${hookOpts.asString}`; + if (ctx.buildHooks) { + const hookOpts = generateOptions(ctx.buildHooks); + let hooksAsString = `\n${'Hooks:'}\n${hookOpts.asString}`; - if (c.buildPipes) { - const pipeOpts = generateOptions(c.buildPipes); - hooksAsString += `\n${'Pipes:'}\n${pipeOpts.asString}`; + if (ctx.buildPipes) { + const pipeOpts = generateOptions(ctx.buildPipes); + hooksAsString += `\n${'Pipes:'}\n${pipeOpts.asString}`; + } + logToSummary(hooksAsString); + return; } - logToSummary(hooksAsString); - return; - } - return Promise.reject('Your buildHooks object is empty!'); -}; - -const Task: RnvTask = { - description: 'Get list of all available hooks', - fn: taskHooksList, + return Promise.reject('Your buildHooks object is empty!'); + }, task: RnvTaskName.hooksList, - options: RnvTaskOptionPresets.withBase(), - platforms: [], forceBuildHookRebuild: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/hooks/taskHooksPipes.ts b/packages/engine-core/src/tasks/hooks/taskHooksPipes.ts index 3de65ec7a1..2b7a44267b 100644 --- a/packages/engine-core/src/tasks/hooks/taskHooksPipes.ts +++ b/packages/engine-core/src/tasks/hooks/taskHooksPipes.ts @@ -1,32 +1,13 @@ -import { - logTask, - logRaw, - generateOptions, - buildHooks, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { logRaw, generateOptions, buildHooks, createTask, RnvTaskName } from '@rnv/core'; -const taskHooksPipes: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskHooksPipes'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.hooksPipes, originTask); - - await buildHooks(); - - const pipeOpts = generateOptions(c.buildPipes); - logRaw(`Pipes:\n${pipeOpts.asString}`); -}; - -const Task: RnvTask = { +export default createTask({ description: 'Get the list of all available pipes', - fn: taskHooksPipes, - task: RnvTaskName.hooksPipes, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + await buildHooks(); -export default Task; + const pipeOpts = generateOptions(ctx.buildPipes); + logRaw(`Pipes:\n${pipeOpts.asString}`); + }, + task: RnvTaskName.hooksPipes, +}); diff --git a/packages/engine-core/src/tasks/hooks/taskHooksRun.ts b/packages/engine-core/src/tasks/hooks/taskHooksRun.ts index 81a350c4c3..61d5bd9aeb 100644 --- a/packages/engine-core/src/tasks/hooks/taskHooksRun.ts +++ b/packages/engine-core/src/tasks/hooks/taskHooksRun.ts @@ -1,69 +1,60 @@ import { - logTask, - logInfo, buildHooks, executeTask, fsExistsSync, - RnvTaskOptionPresets, - RnvTaskFn, inquirerPrompt, - RnvTask, + createTask, RnvTaskName, RnvTaskOptions, + logDebug, } from '@rnv/core'; -const taskHooksRun: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskHooksRun'); - - if (fsExistsSync(c.paths.project.config)) { - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.hooksRun, originTask); - } else { - logInfo('Your are running your buildHook outside of renative project'); - } - - await buildHooks(); - - if (!c.buildHooks) { - return Promise.reject('Build hooks have not been compiled properly!'); - } - - let hookName = c.program?.exeMethod; - let showHookList = false; - - if (!hookName || hookName === true) { - showHookList = true; - } else if (!c.buildHooks[hookName]) { - showHookList = true; - } +export default createTask({ + description: 'Run specific build hook', + // dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx, taskName, originTaskName }) => { + if (fsExistsSync(ctx.paths.project.config)) { + await executeTask({ taskName: RnvTaskName.projectConfigure, parentTaskName: taskName, originTaskName }); + } else { + logDebug('Your are running your buildHook outside of renative project. SKIPPING project configure'); + } + + await buildHooks(); + + if (!ctx.buildHooks) { + return Promise.reject('Build hooks have not been compiled properly!'); + } + + let hookName = ctx.program?.opts()?.exeMethod; + let showHookList = false; + + if (!hookName || hookName === true) { + showHookList = true; + } else if (!ctx.buildHooks[hookName]) { + showHookList = true; + } + + if (Object.keys(ctx.buildHooks).length === 0) { + return true; + } + + if (showHookList) { + const hooksList = Object.keys(ctx.buildHooks); + + const { selectedHook } = await inquirerPrompt({ + name: 'selectedHook', + type: 'list', + message: 'Pick an available hook:', + choices: hooksList, + }); + hookName = selectedHook; + } + await ctx.buildHooks[hookName](ctx); - if (Object.keys(c.buildHooks).length === 0) { return true; - } - - if (showHookList) { - const hooksList = Object.keys(c.buildHooks); - - const { selectedHook } = await inquirerPrompt({ - name: 'selectedHook', - type: 'list', - message: 'Pick an available hook:', - choices: hooksList, - }); - hookName = selectedHook; - } - await c.buildHooks[hookName](c); - - return true; -}; - -const Task: RnvTask = { - description: 'Run specific build hook', - fn: taskHooksRun, + }, task: RnvTaskName.hooksRun, - options: RnvTaskOptionPresets.withBase([RnvTaskOptions.exeMethod]), - platforms: [], + options: [RnvTaskOptions.exeMethod], forceBuildHookRebuild: true, isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/linking/constants.ts b/packages/engine-core/src/tasks/linking/constants.ts deleted file mode 100644 index d7455b2fe4..0000000000 --- a/packages/engine-core/src/tasks/linking/constants.ts +++ /dev/null @@ -1,103 +0,0 @@ -export const RNV_PACKAGES = [ - { - packageName: '@rnv/renative', - folderName: 'renative', - skipLinking: false, - }, - { - packageName: '@rnv/core', - folderName: 'core', - }, - { - packageName: '@rnv/engine-core', - folderName: 'engine-core', - }, - { - packageName: '@rnv/cli', - folderName: 'cli', - }, - { - packageName: '@rnv/template-starter', - folderName: 'template-starter', - }, - { - packageName: 'rnv', - folderName: 'rnv', - }, - { - packageName: '@rnv/engine-lightning', - folderName: 'engine-lightning', - }, - { - packageName: '@rnv/engine-rn', - folderName: 'engine-rn', - }, - { - packageName: '@rnv/engine-rn-electron', - folderName: 'engine-rn-electron', - }, - { - packageName: '@rnv/engine-rn-windows', - folderName: 'engine-rn-windows', - }, - { - packageName: '@rnv/engine-rn-next', - folderName: 'engine-rn-next', - }, - { - packageName: '@rnv/engine-rn-tvos', - folderName: 'engine-rn-tvos', - }, - { - packageName: '@rnv/engine-rn-web', - folderName: 'engine-rn-web', - }, - { - packageName: '@rnv/engine-roku', - folderName: 'engine-roku', - }, - { - packageName: '@rnv/integration-docker', - folderName: 'integration-docker', - }, - { - packageName: '@rnv/integration-ftp', - folderName: 'integration-ftp', - }, - { - packageName: '@rnv/integration-vercel', - folderName: 'integration-vercel', - }, - { - packageName: '@rnv/build-hooks-git', - folderName: 'build-hooks-git', - }, - { - packageName: '@rnv/sdk-apple', - folderName: 'sdk-apple', - }, - { - packageName: '@rnv/sdk-android', - folderName: 'sdk-android', - }, - { - packageName: '@rnv/sdk-tizen', - folderName: 'sdk-tizen', - }, - { - packageName: '@rnv/sdk-kaios', - folderName: 'sdk-kaios', - }, - { - packageName: '@rnv/sdk-react-native', - folderName: 'sdk-react-native', - }, - { - packageName: '@rnv/sdk-webpack', - folderName: 'sdk-webpack', - }, - { - packageName: '@rnv/sdk-webos', - folderName: 'sdk-webos', - }, -]; diff --git a/packages/engine-core/src/tasks/linking/linker.ts b/packages/engine-core/src/tasks/linking/linker.ts new file mode 100644 index 0000000000..caa828500e --- /dev/null +++ b/packages/engine-core/src/tasks/linking/linker.ts @@ -0,0 +1,120 @@ +import { + NpmPackageFile, + RnvFileName, + chalk, + fsExistsSync, + fsLstatSync, + fsReaddirSync, + getContext, + logInfo, + readObjectSync, +} from '@rnv/core'; +import path from 'path'; +import { LinkablePackage, SourcePackage } from './types'; + +const captureLinkablePackages = ( + baseDir: string, + sourcePackages: SourcePackage[], + linkablePackages: LinkablePackage[] +) => { + sourcePackages.forEach((pkg) => { + const rnvDepPath = path.join(baseDir, pkg.name); + let isSymLink = false; + const nmPathExists = fsExistsSync(rnvDepPath); + try { + isSymLink = fsLstatSync(rnvDepPath).isSymbolicLink(); + if (!nmPathExists) { + // Broken link + } + } catch (e) { + //Catch error + } + const cacheDir = path.join(baseDir, '.rnv/unlinked_cache'); + const unlinkedPath = path.join(cacheDir, pkg.name); + const unlinkedPathExists = fsExistsSync(unlinkedPath); + + if (nmPathExists || isSymLink || unlinkedPathExists) { + linkablePackages.push({ + name: pkg.name, + nmPath: rnvDepPath, + sourcePath: pkg.path, + sourcePathRelative: path.relative(rnvDepPath.replace(`/${pkg.name}`, ''), pkg.path), + unlinkedPath, + cacheDir, + skipLinking: pkg.skipLinking || false, + isLinked: isSymLink, + isBrokenLink: isSymLink && !nmPathExists, + nmPathExists, + unlinkedPathExists, + }); + } + }); +}; + +export const traverseTargetProject = (sourceDir: string) => { + const c = getContext(); + const linkablePackages: LinkablePackage[] = []; + const sourcePackages = traverseSourceProject(sourceDir); + captureLinkablePackages(c.paths.project.nodeModulesDir, sourcePackages, linkablePackages); + const monoPackages = path.join(c.paths.project.dir, 'packages'); + // If monorepo, we need to link all packages + if (fsExistsSync(monoPackages)) { + fsReaddirSync(monoPackages).forEach((pkgName) => { + const pkgPath = path.join(monoPackages, pkgName); + captureLinkablePackages(path.join(pkgPath, 'node_modules'), sourcePackages, linkablePackages); + }); + } + return linkablePackages; +}; + +export const getSourceDir = () => { + const ctx = getContext(); + const dirOption = ctx.program.opts().dir; + + if (dirOption) { + logInfo(`Using custom source directory: ${chalk().bold(dirOption)}`); + } + + // As default we'll use the development source directory which is a monorepo + const sourceDir = ctx.program.opts().dir || path.join(ctx.paths.rnvCore.dir, '../../'); + if (!fsExistsSync(sourceDir)) { + throw new Error(`Source directory ${sourceDir} does not exist!`); + } + return sourceDir; +}; + +const captureSourcePackage = (baseDir: string, sourcePackages: SourcePackage[]) => { + const pkgPath = path.join(baseDir, RnvFileName.package); + if (fsExistsSync(pkgPath)) { + const pkgFile = readObjectSync(pkgPath); + if (pkgFile?.name) { + sourcePackages.push({ + name: pkgFile.name, + path: baseDir, + skipLinking: false, + }); + } + } +}; + +export const traverseSourceProject = (sourceDir: string) => { + const sourcePackages: SourcePackage[] = []; + captureSourcePackage(sourceDir, sourcePackages); + const monoPackages = path.join(sourceDir, 'packages'); + // If monorepo, we need to link all packages + if (fsExistsSync(monoPackages)) { + fsReaddirSync(monoPackages).forEach((pkgName) => { + if (pkgName.startsWith('@')) { + const monoPackageGroup = path.join(monoPackages, pkgName); + fsReaddirSync(monoPackages).forEach((pkgName) => { + const pkgPath = path.join(monoPackageGroup, pkgName); + captureSourcePackage(pkgPath, sourcePackages); + }); + } else { + const pkgPath = path.join(monoPackages, pkgName); + captureSourcePackage(pkgPath, sourcePackages); + } + }); + } + return sourcePackages; +}; diff --git a/packages/engine-core/src/tasks/linking/taskLink.ts b/packages/engine-core/src/tasks/linking/taskLink.ts index e5b2b412c9..0a9efc7ef0 100644 --- a/packages/engine-core/src/tasks/linking/taskLink.ts +++ b/packages/engine-core/src/tasks/linking/taskLink.ts @@ -1,60 +1,93 @@ -import path from 'path'; import { logInfo, - logTask, - logSuccess, - RnvTaskOptionPresets, fsExistsSync, fsRenameSync, fsSymlinkSync, - RnvTaskFn, - RnvContext, - RnvTask, + createTask, RnvTaskName, + mkdirSync, + chalk, + fsUnlinkSync, + removeDirSync, + inquirerPrompt, } from '@rnv/core'; -import { RNV_PACKAGES } from './constants'; +import { LinkablePackage } from './types'; +import { getSourceDir, traverseTargetProject } from './linker'; -const _linkPackage = (c: RnvContext, key: string, folder: string) => { - const rnvPath = path.join(c.paths.project.nodeModulesDir, key); - const rnvPathUnlinked = path.join(c.paths.project.nodeModulesDir, `${key}_unlinked`); - const pkgDir = path.join(c.paths.rnv.dir, '../', folder); - - if (fsExistsSync(rnvPathUnlinked)) { - logInfo(`${key} is already linked. SKIPPING`); +const _linkPackage = (pkg: LinkablePackage) => { + if (!fsExistsSync(pkg.cacheDir)) { + mkdirSync(pkg.cacheDir); + } - try { - fsSymlinkSync(pkgDir, rnvPath); - } catch (e) { - // In case of corrupted symlinks we attempt to relink - // however existing symlinks will throw error + if (pkg.isBrokenLink) { + logInfo(`${pkg.name} is a ${chalk().red('broken')} link. Attempting to fix...`); + fsUnlinkSync(pkg.nmPath); + } else if (pkg.isLinked) { + logInfo(`${pkg.name} is already linked. SKIPPING`); + } else if (pkg.skipLinking) { + logInfo(`${pkg.name} is set to skip linking. SKIPPING`); + } else if (pkg.nmPathExists) { + if (pkg.unlinkedPathExists) { + logInfo(`${pkg.name} found in exisitng cache. Removing and relinking...`); + removeDirSync(pkg.unlinkedPath); } - } else if (fsExistsSync(rnvPath)) { - fsRenameSync(rnvPath, rnvPathUnlinked); - fsSymlinkSync(pkgDir, rnvPath); - logSuccess(`${key} => link => SUCCESS`); + mkdirSync(pkg.unlinkedPath); + fsRenameSync(pkg.nmPath, pkg.unlinkedPath); + fsSymlinkSync(pkg.sourcePath, pkg.nmPath); + logInfo(`${chalk().green('✔')} ${pkg.name} (${chalk().gray(pkg.nmPath)})`); + } else if (pkg.unlinkedPathExists) { + logInfo(`${pkg.name} found in unlinked cache. Attempting to relink...`); + fsSymlinkSync(pkg.sourcePath, pkg.nmPath); + logInfo(`${pkg.name} => link => ${chalk().green('SUCCESS')} (${chalk().gray(pkg.nmPath)})`); } }; -const taskLink: RnvTaskFn = async (c, _parentTask, _originalTask) => { - logTask('taskLink'); +const runtimeLibs = ['@rnv/renative']; - RNV_PACKAGES.forEach((pkg) => { - if (!pkg.skipLinking) { - _linkPackage(c, pkg.packageName, pkg.folderName); - } - }); +export default createTask({ + description: 'Links development version or renative with this project', + fn: async () => { + const linkablePackages = traverseTargetProject(getSourceDir()); - return true; -}; + let msg = 'Found following source packages:\n\n'; -const Task: RnvTask = { - description: 'Links development version or renative with this project', - fn: taskLink, + const choices: { name: string; value: LinkablePackage }[] = []; + + linkablePackages.forEach((pkg) => { + const title = `${pkg.nmPath.replace(pkg.name, chalk().bold(pkg.name))} ${ + pkg.isBrokenLink ? chalk().red('(broken)') : pkg.isLinked ? chalk().green('(linked)') : '(unlinked)' + }\n`; + + msg += title; + const addon = runtimeLibs.includes(pkg.name) + ? chalk().yellow(' (Runtime lib. will not work with react-native)') + : ''; + + choices.push({ name: `${pkg.name}${addon}`, value: pkg }); + }); + + logInfo(msg); + + const slpDefaults = linkablePackages.filter((pkg) => !runtimeLibs.includes(pkg.name)); + + const { selectedLinkableProjects } = await inquirerPrompt({ + name: 'selectedLinkableProjects', + type: 'checkbox', + message: `Found following packages to link?`, + default: slpDefaults, + loop: false, + choices, + }); + + logInfo('Linking packages...'); + selectedLinkableProjects.forEach((pkg: LinkablePackage) => { + _linkPackage(pkg); + }); + + return true; + }, task: RnvTaskName.link, - options: RnvTaskOptionPresets.withBase(), - platforms: [], + options: [{ key: 'dir', description: 'Source folder to be linked into project', isValueType: true }], isGlobalScope: true, ignoreEngines: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/linking/taskUnlink.ts b/packages/engine-core/src/tasks/linking/taskUnlink.ts index 38ab7ce66b..bb6c631e4a 100644 --- a/packages/engine-core/src/tasks/linking/taskUnlink.ts +++ b/packages/engine-core/src/tasks/linking/taskUnlink.ts @@ -1,57 +1,46 @@ -import path from 'path'; -import { - logInfo, - logTask, - logSuccess, - RnvTaskOptionPresets, - fsExistsSync, - fsRenameSync, - fsUnlinkSync, - fsLstatSync, - RnvTaskFn, - RnvContext, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { RNV_PACKAGES } from './constants'; - -const _unlinkPackage = (c: RnvContext, key: string) => { - const rnvPath = path.join(c.paths.project.nodeModulesDir, key); - const rnvPathUnlinked = path.join(c.paths.project.nodeModulesDir, `${key}_unlinked`); - - if (!fsExistsSync(rnvPathUnlinked)) { - logInfo(`${key} is not linked. SKIPPING`); - } else if (fsExistsSync(rnvPath)) { - if (fsLstatSync(rnvPath).isSymbolicLink()) { - fsUnlinkSync(rnvPath); - fsRenameSync(rnvPathUnlinked, rnvPath); - logSuccess(`${key} => unlink => SUCCESS`); - } else { - logInfo(`${key} is not a symlink anymore. SKIPPING`); - } +import { logInfo, fsRenameSync, fsUnlinkSync, createTask, RnvTaskName, chalk } from '@rnv/core'; +import { getSourceDir, traverseTargetProject } from './linker'; +import { LinkablePackage } from './types'; + +const _unlinkPackage = (pkg: LinkablePackage) => { + if (pkg.isBrokenLink) { + logInfo(`${pkg.name} is a ${chalk().red('broken')} link. Attempting to fix...`); + fsUnlinkSync(pkg.nmPath); + } else if (pkg.isLinked && pkg.unlinkedPathExists) { + fsUnlinkSync(pkg.nmPath); + fsRenameSync(pkg.unlinkedPath, pkg.nmPath); + logInfo(`${chalk().green('✔')} ${pkg.name} (${chalk().gray(pkg.nmPath)})`); + } else if (!pkg.isLinked) { + logInfo(`${pkg.name} is not linked. SKIPPING`); + } else if (pkg.skipLinking) { + logInfo(`${pkg.name} is set to skip linking. SKIPPING`); } }; -const taskUnlink: RnvTaskFn = async (c) => { - logTask('taskUnlink'); +export default createTask({ + description: 'Replaces rnv version in project with original node_modules version', + fn: async () => { + const linkablePackages = traverseTargetProject(getSourceDir()); - RNV_PACKAGES.forEach((pkg) => { - if (!pkg.skipLinking) { - _unlinkPackage(c, pkg.packageName); - } - }); + let msg = 'Found following source packages:\n\n'; - return true; -}; + linkablePackages.forEach((pkg) => { + msg += `${pkg.nmPath.replace(pkg.name, chalk().bold(pkg.name))} ${ + pkg.isBrokenLink ? chalk().red('(broken)') : pkg.isLinked ? chalk().green('(linked)') : '(unlinked)' + }\n`; + }); -const Task: RnvTask = { - description: 'Replaces rnv version in project with original node_modules version', - fn: taskUnlink, + logInfo(msg); + + logInfo('Unlinking packages...'); + + linkablePackages.forEach((pkg) => { + _unlinkPackage(pkg); + }); + + return true; + }, task: RnvTaskName.unlink, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, ignoreEngines: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/linking/types.ts b/packages/engine-core/src/tasks/linking/types.ts new file mode 100644 index 0000000000..3bef51821e --- /dev/null +++ b/packages/engine-core/src/tasks/linking/types.ts @@ -0,0 +1,18 @@ +export type LinkablePackage = { + name: string; + sourcePath: string; + sourcePathRelative: string; + nmPath: string; + unlinkedPath: string; + cacheDir: string; + skipLinking: boolean; + isLinked: boolean; + isBrokenLink: boolean; + nmPathExists: boolean; + unlinkedPathExists: boolean; +}; +export type SourcePackage = { + name: string; + path: string; + skipLinking?: boolean; +}; diff --git a/packages/engine-core/src/tasks/platform/__tests__/taskPlatformConfigure.test.ts b/packages/engine-core/src/tasks/platform/__tests__/taskPlatformConfigure.test.ts index 1afd83046c..cfcec76931 100644 --- a/packages/engine-core/src/tasks/platform/__tests__/taskPlatformConfigure.test.ts +++ b/packages/engine-core/src/tasks/platform/__tests__/taskPlatformConfigure.test.ts @@ -1,8 +1,17 @@ -import { createRnvContext, executeTask, getContext } from '@rnv/core'; +import { + configureRuntimeDefaults, + createPlatformBuild, + createRnvContext, + executeTask, + getContext, + resolveEngineDependencies, +} from '@rnv/core'; import taskPlatformConfigure from '../taskPlatformConfigure'; +import { checkAndInstallIfRequired } from '../../../taskHelpers'; +import { isBuildSchemeSupported } from '../../../buildSchemes'; -jest.mock('../../../common'); jest.mock('../../../buildSchemes'); +jest.mock('../../../taskHelpers'); jest.mock('@rnv/core'); beforeEach(() => { @@ -16,8 +25,27 @@ afterEach(() => { test('Execute task.rnv.platform.configure', async () => { //GIVEN const ctx = getContext(); + jest.mocked(checkAndInstallIfRequired).mockResolvedValue(true); //WHEN - await expect(taskPlatformConfigure.fn?.(ctx)).resolves.toEqual(true); + await expect( + taskPlatformConfigure.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }) + ).resolves.toEqual(true); //THEN - expect(executeTask).toHaveBeenCalledWith('project configure', 'platform configure', undefined); + expect(executeTask).toHaveBeenCalledWith({ + isOptional: true, + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_taskName', + taskName: 'sdk configure', + }); + expect(isBuildSchemeSupported).toHaveBeenCalled(); + expect(configureRuntimeDefaults).toHaveBeenCalled(); + expect(createPlatformBuild).toHaveBeenCalled(); + expect(resolveEngineDependencies).toHaveBeenCalled(); + expect(checkAndInstallIfRequired).toHaveBeenCalled(); }); diff --git a/packages/engine-core/src/tasks/platform/__tests__/taskPlatformList.test.ts b/packages/engine-core/src/tasks/platform/__tests__/taskPlatformList.test.ts index b8d33a0d6f..d7d67ea055 100644 --- a/packages/engine-core/src/tasks/platform/__tests__/taskPlatformList.test.ts +++ b/packages/engine-core/src/tasks/platform/__tests__/taskPlatformList.test.ts @@ -1,4 +1,4 @@ -import { createRnvContext, executeTask, generatePlatformChoices, getContext } from '@rnv/core'; +import { createRnvContext, generatePlatformChoices, getContext, logToSummary } from '@rnv/core'; import taskPlatformList from '../taskPlatformList'; jest.mock('@rnv/core'); @@ -14,9 +14,21 @@ afterEach(() => { test('Execute task.rnv.platform.list', async () => { //GIVEN const ctx = getContext(); - jest.mocked(generatePlatformChoices).mockReturnValue([]); + jest.mocked(generatePlatformChoices).mockReturnValue([ + { name: 'MOCK_PLATFORM', value: 'android', isConnected: false }, + ]); //WHEN - await expect(taskPlatformList.fn?.(ctx)).resolves.toEqual(true); + await expect( + taskPlatformList.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }) + ).resolves.toEqual(true); //THEN - expect(executeTask).toHaveBeenCalledWith('project configure', 'platform list', undefined); + expect(taskPlatformList.dependsOn).toEqual(['project configure']); + expect(generatePlatformChoices).toHaveBeenCalled(); + expect(logToSummary).toHaveBeenCalledWith(`Platforms:\n\n [1]> MOCK_PLATFORM`); }); diff --git a/packages/engine-core/src/tasks/platform/taskPlatformConfigure.ts b/packages/engine-core/src/tasks/platform/taskPlatformConfigure.ts index 8e89c402d5..f715721eb7 100644 --- a/packages/engine-core/src/tasks/platform/taskPlatformConfigure.ts +++ b/packages/engine-core/src/tasks/platform/taskPlatformConfigure.ts @@ -4,62 +4,89 @@ import { logInfo, fsExistsSync, getAppFolder, - isPlatformSupported, cleanPlatformBuild, createPlatformBuild, - injectPlatformDependencies, configureRuntimeDefaults, executeTask, - shouldSkipTask, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, + createTask, RnvTaskName, + // installPackageDependencies, + // overrideTemplatePlugins, + resolveEngineDependencies, + logWarning, + getConfigProp, } from '@rnv/core'; -import { checkAndConfigureSdks, checkSdk } from '../../common'; import { isBuildSchemeSupported } from '../../buildSchemes'; +import path from 'path'; +import { checkAndInstallIfRequired } from '../../taskHelpers'; +// import { configureFonts } from '@rnv/sdk-utils'; -const taskPlatformConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskPlatformConfigure', ''); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.platformConfigure, originTask); +export default createTask({ + description: 'Low-level task used by engines to prepare platformBuilds folder', + isPrivate: true, + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx, taskName, originTaskName }) => { + const { program } = ctx; + await isBuildSchemeSupported(); - if (shouldSkipTask(RnvTaskName.platformConfigure, originTask)) return true; + const entryFile = getConfigProp('entryFile'); - await isPlatformSupported(); - await isBuildSchemeSupported(); - await checkAndConfigureSdks(); - await checkSdk(); - await configureRuntimeDefaults(); + const dest = path.join(ctx.paths.project.dir, `${entryFile}.js`); + if (!fsExistsSync(dest)) { + if (!entryFile) { + logWarning( + `Missing ${chalk().red(entryFile)} key for ${chalk().bold( + ctx.platform + )} platform in your ${chalk().bold(ctx.paths.appConfig.config)}.` + ); + } + } - if (c.program.only && !!parentTask) return true; + await executeTask({ + taskName: RnvTaskName.sdkConfigure, + parentTaskName: taskName, + originTaskName, + isOptional: true, + }); - await executeTask(RnvTaskName.install, RnvTaskName.platformConfigure, originTask); + await configureRuntimeDefaults(); + await checkAndInstallIfRequired(); - const hasBuild = fsExistsSync(c.paths.project.builds.dir); - logTask('', `taskPlatformConfigure hasBuildFolderPresent:${hasBuild}`); + const hasBuild = fsExistsSync(ctx.paths.project.builds.dir); + logTask('', `taskPlatformConfigure hasBuildFolderPresent:${hasBuild}`); - if ((c.program.reset || c.program.resetHard) && !c.runtime.disableReset) { - logInfo( - `You passed ${chalk().bold(c.program.reset ? '-r' : '-R')} argument. "${chalk().bold( - getAppFolder() - )}" CLEANING...DONE` - ); - await cleanPlatformBuild(c.platform); - } + if ((program.opts().reset || program.opts().resetHard) && !ctx.runtime.disableReset) { + logInfo( + `You passed ${chalk().bold(program.opts().reset ? '-r' : '-R')} argument. "${chalk().bold( + getAppFolder() + )}" CLEANING...DONE` + ); + await cleanPlatformBuild(ctx.platform); + } - await createPlatformBuild(c.platform); - await injectPlatformDependencies(); - // await _runCopyPlatforms(c); - return true; -}; + await createPlatformBuild(ctx.platform); + await resolveEngineDependencies(); + // TODO: check if this is needed or can be handled down the line + // if not monorepo && mutations were found + // await installPackageDependencies(); + // await overrideTemplatePlugins(); + // await configureFonts(); -const Task: RnvTask = { - description: 'Low-level task used by engines to prepare platformBuilds folder', - fn: taskPlatformConfigure, + // OLD STUFFF + // await injectPlatformDependencies( + // async () => { + // await installPackageDependencies(); + // await overrideTemplatePlugins(); + // await configureFonts(); + // }, + // async () => { + // await installPackageDependencies(); + // await overrideTemplatePlugins(); + // await configureFonts(); + // } + // ); + // await _runCopyPlatforms(c); + return true; + }, task: RnvTaskName.platformConfigure, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/platform/taskPlatformConnect.ts b/packages/engine-core/src/tasks/platform/taskPlatformConnect.ts index 6b18a2017f..cd1f51b01f 100644 --- a/packages/engine-core/src/tasks/platform/taskPlatformConnect.ts +++ b/packages/engine-core/src/tasks/platform/taskPlatformConnect.ts @@ -1,98 +1,84 @@ import path from 'path'; - import { chalk, - logTask, logSuccess, logToSummary, writeFileSync, removeDirs, generatePlatformChoices, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, inquirerPrompt, - PlatformKey, - RnvTask, + RnvPlatformKey, + createTask, RnvTaskName, } from '@rnv/core'; -const taskPlatformConnect: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskPlatformConnect'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.platformConnect, originTask); - - const configOriginal = c.files.project.config_original; - if (!configOriginal) { - return; - } - - if (!c.files.project.config?.paths?.platformTemplatesDirs) { - logToSummary('All supported platforms are connected. nothing to do.'); - return; - } - - let selectedPlatforms: Array; - if (c.platform) { - selectedPlatforms = [c.platform]; - } else { - const { connectedPlatforms } = await inquirerPrompt({ - name: 'connectedPlatforms', - message: - 'This will point platformTemplates folders from your local project to ReNative managed one. Select platforms you would like to connect', - type: 'checkbox', - choices: generatePlatformChoices().map((choice) => ({ - ...choice, - disabled: choice.isConnected, - })), - }); - selectedPlatforms = connectedPlatforms; - } - - if (selectedPlatforms.length) { - selectedPlatforms.forEach((platform) => { - if (configOriginal.paths?.platformTemplatesDirs?.[platform]) { - delete configOriginal.paths.platformTemplatesDirs[platform]; - } - - if (!Object.keys(configOriginal.paths?.platformTemplatesDirs || {}).length) { - delete configOriginal.paths?.platformTemplatesDirs; // also cleanup the empty object - } - - writeFileSync(c.paths.project.config, configOriginal); - }); - } - - const { deletePlatformFolder } = await inquirerPrompt({ - name: 'deletePlatformFolder', - type: 'confirm', - message: 'Would you also like to delete the previously used platform folder?', - }); - - if (deletePlatformFolder) { - const pathsToRemove: Array = []; - selectedPlatforms.forEach((platform) => { - pathsToRemove.push(path.join(c.paths.project.platformTemplatesDirs[platform], platform)); +export default createTask({ + description: 'Connect platform template back to rnv', + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const configOriginal = ctx.files.project.config_original; + if (!configOriginal) { + return; + } + + if (!ctx.files.project.config?.paths?.platformTemplatesDirs) { + logToSummary('All supported platforms are connected. nothing to do.'); + return; + } + + let selectedPlatforms: Array; + if (ctx.platform) { + selectedPlatforms = [ctx.platform]; + } else { + const { connectedPlatforms } = await inquirerPrompt({ + name: 'connectedPlatforms', + message: + 'This will point platformTemplates folders from your local project to ReNative managed one. Select platforms you would like to connect', + type: 'checkbox', + choices: generatePlatformChoices().map((choice) => ({ + ...choice, + disabled: choice.isConnected, + })), + }); + selectedPlatforms = connectedPlatforms; + } + + if (selectedPlatforms.length) { + selectedPlatforms.forEach((platform) => { + if (configOriginal.paths?.platformTemplatesDirs?.[platform]) { + delete configOriginal.paths.platformTemplatesDirs[platform]; + } + + if (!Object.keys(configOriginal.paths?.platformTemplatesDirs || {}).length) { + delete configOriginal.paths?.platformTemplatesDirs; // also cleanup the empty object + } + + writeFileSync(ctx.paths.project.config, configOriginal); + }); + } + + const { deletePlatformFolder } = await inquirerPrompt({ + name: 'deletePlatformFolder', + type: 'confirm', + message: 'Would you also like to delete the previously used platform folder?', }); - // TODO: Remove shared folders as well + if (deletePlatformFolder) { + const pathsToRemove: Array = []; + selectedPlatforms.forEach((platform) => { + pathsToRemove.push(path.join(ctx.paths.project.platformTemplatesDirs[platform], platform)); + }); - await removeDirs(pathsToRemove); - } + // TODO: Remove shared folders as well - logSuccess( - `${chalk().bold( - selectedPlatforms.join(',') - )} now using ReNative platformTemplates located associated platform engines.` - ); -}; + await removeDirs(pathsToRemove); + } -const Task: RnvTask = { - description: 'Connect platform template back to rnv', - fn: taskPlatformConnect, + logSuccess( + `${chalk().bold( + selectedPlatforms.join(',') + )} now using ReNative platformTemplates located associated platform engines.` + ); + }, task: RnvTaskName.platformConnect, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/platform/taskPlatformEject.ts b/packages/engine-core/src/tasks/platform/taskPlatformEject.ts index 225975e0f1..92354289c1 100644 --- a/packages/engine-core/src/tasks/platform/taskPlatformEject.ts +++ b/packages/engine-core/src/tasks/platform/taskPlatformEject.ts @@ -1,81 +1,67 @@ import { chalk, - logTask, logSuccess, logError, logInfo, writeFileSync, - RnvTaskOptionPresets, generatePlatformChoices, ejectPlatform, - executeTask, - RnvTaskFn, inquirerPrompt, - PlatformKey, - RnvTask, + RnvPlatformKey, + createTask, RnvTaskName, } from '@rnv/core'; -const taskPlatformEject: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskPlatformEject'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.platformEject, originTask); - - const configOriginal = c.files.project.config_original; +export default createTask({ + description: 'Copy all platform files directly to project', + fn: async ({ ctx }) => { + const configOriginal = ctx.files.project.config_original; - if (!configOriginal) { - return; - } + if (!configOriginal) { + return; + } - let selectedPlatforms: Array; - if (c.platform) { - selectedPlatforms = [c.platform]; - } else { - logInfo(`Preparing to eject engine platforms to local ${chalk().bold('./platformTemplates')}`); - const { ejectedPlatforms } = await inquirerPrompt({ - name: 'ejectedPlatforms', - message: 'Select platforms you would like to eject (use SPACE key)', - type: 'checkbox', - choices: generatePlatformChoices().map((choice) => ({ - ...choice, - disabled: !choice.isConnected, - })), - }); - selectedPlatforms = ejectedPlatforms; - } + let selectedPlatforms: Array; + if (ctx.platform) { + selectedPlatforms = [ctx.platform]; + } else { + logInfo(`Preparing to eject engine platforms to local ${chalk().bold('./platformTemplates')}`); + const { ejectedPlatforms } = await inquirerPrompt({ + name: 'ejectedPlatforms', + message: 'Select platforms you would like to eject (use SPACE key)', + type: 'checkbox', + choices: generatePlatformChoices().map((choice) => ({ + ...choice, + disabled: !choice.isConnected, + })), + }); + selectedPlatforms = ejectedPlatforms; + } - if (selectedPlatforms.length) { - selectedPlatforms.forEach((platform) => { - // const engine = getEngineRunnerByPlatform(c, platform); - // const destDir = path.join(c.paths.project.dir, 'platformTemplates', platform); + if (selectedPlatforms.length) { + selectedPlatforms.forEach((platform) => { + // const engine = getEngineRunnerByPlatform(c, platform); + // const destDir = path.join(c.paths.project.dir, 'platformTemplates', platform); - // engine.ejectPlatform(c, platform, destDir); - ejectPlatform(platform); + // engine.ejectPlatform(c, platform, destDir); + ejectPlatform(platform); - configOriginal.paths = configOriginal.paths || {}; + configOriginal.paths = configOriginal.paths || {}; - configOriginal.paths.platformTemplatesDirs = configOriginal.paths.platformTemplatesDirs || {}; - configOriginal.paths.platformTemplatesDirs[platform] = `./${'platformTemplates'}`; - writeFileSync(c.paths.project.config, configOriginal); - }); + configOriginal.paths.platformTemplatesDirs = configOriginal.paths.platformTemplatesDirs || {}; + configOriginal.paths.platformTemplatesDirs[platform] = `./${'platformTemplates'}`; + writeFileSync(ctx.paths.project.config, configOriginal); + }); - logSuccess( - `${chalk().bold(selectedPlatforms.join(','))} platform templates are located in ${chalk().bold( - c.files.project.config?.paths?.platformTemplatesDirs?.[selectedPlatforms[0]] - )} now. You can edit them directly!` - ); - } else { - logError(`You haven't selected any platform to eject. + logSuccess( + `${chalk().bold(selectedPlatforms.join(','))} platform templates are located in ${chalk().bold( + ctx.files.project.config?.paths?.platformTemplatesDirs?.[selectedPlatforms[0]] + )} now. You can edit them directly!` + ); + } else { + logError(`You haven't selected any platform to eject. TIP: You can select options with ${chalk().bold('SPACE')} key before pressing ENTER!`); - } -}; - -const Task: RnvTask = { - description: 'Copy all platform files directly to project', - fn: taskPlatformEject, + } + }, task: RnvTaskName.platformEject, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/platform/taskPlatformList.ts b/packages/engine-core/src/tasks/platform/taskPlatformList.ts index 7880926255..b9e7f2e038 100644 --- a/packages/engine-core/src/tasks/platform/taskPlatformList.ts +++ b/packages/engine-core/src/tasks/platform/taskPlatformList.ts @@ -1,31 +1,12 @@ -import { - chalk, - logToSummary, - logTask, - generatePlatformChoices, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { chalk, logToSummary, generatePlatformChoices, createTask, RnvTaskName } from '@rnv/core'; -const taskPlatformList: RnvTaskFn = async (_c, _parentTask, originTask) => { - logTask('taskPlatformList'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.platformList, originTask); - - const opts = generatePlatformChoices().map((v, i) => ` [${chalk().bold(i + 1)}]> ${v.name}`); - logToSummary(`Platforms:\n\n${opts.join('\n')}`); - return true; -}; - -const Task: RnvTask = { +export default createTask({ description: 'List all available platforms', - fn: taskPlatformList, + dependsOn: [RnvTaskName.projectConfigure], + fn: async () => { + const opts = generatePlatformChoices().map((v, i) => ` [${chalk().bold(i + 1)}]> ${v.name}`); + logToSummary(`Platforms:\n\n${opts.join('\n')}`); + return true; + }, task: RnvTaskName.platformList, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/platform/taskPlatformSetup.ts b/packages/engine-core/src/tasks/platform/taskPlatformSetup.ts deleted file mode 100644 index 902b07a646..0000000000 --- a/packages/engine-core/src/tasks/platform/taskPlatformSetup.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - RnvTaskOptionPresets, - updateProjectPlatforms, - logTask, - executeTask, - RnvTaskFn, - inquirerPrompt, - RnvTask, - RnvTaskName, -} from '@rnv/core'; - -const taskPlatformSetup: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskPlatformSetup'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.platformSetup, originTask); - - const currentPlatforms = c.files.project.config?.defaults?.supportedPlatforms || []; - - const { inputSupportedPlatforms } = await inquirerPrompt({ - name: 'inputSupportedPlatforms', - type: 'checkbox', - pageSize: 20, - message: 'What platforms would you like to use?', - validate: (val) => !!val.length || 'Please select at least a platform', - default: currentPlatforms, - choices: c.runtime.availablePlatforms, - }); - - updateProjectPlatforms(inputSupportedPlatforms); -}; - -const Task: RnvTask = { - description: 'Allows you to change supportedPlatforms for your project', - fn: taskPlatformSetup, - task: RnvTaskName.platformSetup, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; diff --git a/packages/engine-core/src/plugins.ts b/packages/engine-core/src/tasks/plugin/taskHelpers.ts similarity index 94% rename from packages/engine-core/src/plugins.ts rename to packages/engine-core/src/tasks/plugin/taskHelpers.ts index a738ddb9db..36cca370e1 100644 --- a/packages/engine-core/src/plugins.ts +++ b/packages/engine-core/src/tasks/plugin/taskHelpers.ts @@ -13,8 +13,9 @@ export const getPluginList = (isUpdate = false) => { let i = 1; - Object.keys(c.files.rnv.pluginTemplates.configs).forEach((pk) => { - const plugins = c.files.rnv.pluginTemplates.configs[pk].pluginTemplates; + Object.keys(c.files.scopedConfigTemplates).forEach((pk) => { + const plugins = c.files.scopedConfigTemplates[pk]?.pluginTemplates; + if (!plugins) return; Object.keys(plugins).forEach((k) => { const plugin = plugins[k]; diff --git a/packages/engine-core/src/tasks/plugin/taskPluginAdd.ts b/packages/engine-core/src/tasks/plugin/taskPluginAdd.ts index 1b98f0e4f5..60cf0467da 100644 --- a/packages/engine-core/src/tasks/plugin/taskPluginAdd.ts +++ b/packages/engine-core/src/tasks/plugin/taskPluginAdd.ts @@ -1,111 +1,97 @@ import { writeRenativeConfigFile, - RnvTaskOptionPresets, chalk, logSuccess, - logTask, resolvePluginDependants, - executeTask, - RnvTaskFn, PluginListResponseItem, getApi, inquirerPrompt, - RenativeConfigPlugin, - RnvTask, + RnvPluginSchema, + createTask, RnvTaskName, } from '@rnv/core'; -import { getPluginList } from '../../plugins'; +import { checkAndInstallIfRequired } from '../../taskHelpers'; +import { getPluginList } from './taskHelpers'; -/* eslint-disable no-await-in-loop */ -const taskPluginAdd: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskPluginAdd'); +export default createTask({ + description: 'Add selected plugin to the project', + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const selPluginKey = ctx.program.rawArgs?.[4]; + + const o = getPluginList(); + + const selPlugin = selPluginKey && o.allPlugins[selPluginKey]; + const selectedPlugins: Record = {}; + const installMessage = []; + + if (!selPlugin) { + const { plugin } = await inquirerPrompt({ + name: 'plugin', + type: 'rawlist', + message: 'Select the plugins you want to add', + choices: o.asArray, + pageSize: 50, + }); - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.pluginAdd, originTask); + selectedPlugins[plugin] = o.allPlugins[plugin]; + installMessage.push(`${chalk().bold(plugin)} v(${chalk().green(o.allPlugins[plugin].version)})`); + } else { + selectedPlugins[selPluginKey] = selPlugin; + installMessage.push(`${chalk().bold(selPluginKey)} v(${chalk().green(selPlugin.version)})`); + } - const selPluginKey = c.program.rawArgs?.[4]; + const questionPlugins: Record = {}; - const o = getPluginList(); + const cnfOriginal = ctx.files.project.config_original; + if (!cnfOriginal) { + return; + } - const selPlugin = selPluginKey && o.allPlugins[selPluginKey]; - const selectedPlugins: Record = {}; - const installMessage = []; + const cnfPlugins = cnfOriginal.plugins || {}; + cnfOriginal.plugins = cnfPlugins; - if (!selPlugin) { - const { plugin } = await inquirerPrompt({ - name: 'plugin', - type: 'rawlist', - message: 'Select the plugins you want to add', - choices: o.asArray, - pageSize: 50, - }); + Object.keys(selectedPlugins).forEach((key) => { + // c.buildConfig.plugins[key] = 'source:rnv'; + const plugin = selectedPlugins[key]; + if (plugin.props) questionPlugins[key] = plugin; - selectedPlugins[plugin] = o.allPlugins[plugin]; - installMessage.push(`${chalk().bold(plugin)} v(${chalk().green(o.allPlugins[plugin].version)})`); - } else { - selectedPlugins[selPluginKey] = selPlugin; - installMessage.push(`${chalk().bold(selPluginKey)} v(${chalk().green(selPlugin.version)})`); - } - - const questionPlugins: Record = {}; - - const cnfOriginal = c.files.project.config_original; - if (!cnfOriginal) { - return; - } - - const cnfPlugins = cnfOriginal.plugins || {}; - cnfOriginal.plugins = cnfPlugins; - - Object.keys(selectedPlugins).forEach((key) => { - // c.buildConfig.plugins[key] = 'source:rnv'; - const plugin = selectedPlugins[key]; - if (plugin.props) questionPlugins[key] = plugin; - - cnfPlugins[key] = 'source:rnv'; - - // c.buildConfig.plugins[key] = selectedPlugins[key]; - }); - - const pluginKeys = Object.keys(questionPlugins); - for (let i = 0; i < pluginKeys.length; i++) { - const pluginKey = pluginKeys[i]; - const plugin = questionPlugins[pluginKey]; - const pluginProps = Object.keys(plugin.props || {}); - const finalProps: Record = {}; - for (let i2 = 0; i2 < pluginProps.length; i2++) { - const { propValue } = await inquirerPrompt({ - name: 'propValue', - type: 'input', - message: `${pluginKey}: Add value for ${pluginProps[i2]} (You can do this later in ./renative.json file)`, - }); - finalProps[pluginProps[i2]] = propValue; - } - const pluginToAdd: RenativeConfigPlugin = {}; - pluginToAdd.props = finalProps; - cnfPlugins[pluginKey] = pluginToAdd; - } + cnfPlugins[key] = 'source:rnv'; - const spinner = getApi() - .spinner(`Installing: ${installMessage.join(', ')}`) - .start(''); + // c.buildConfig.plugins[key] = selectedPlugins[key]; + }); - writeRenativeConfigFile(c.paths.project.config, cnfOriginal); + const pluginKeys = Object.keys(questionPlugins); + for (let i = 0; i < pluginKeys.length; i++) { + const pluginKey = pluginKeys[i]; + const plugin = questionPlugins[pluginKey]; + const pluginProps = Object.keys(plugin.props || {}); + const finalProps: Record = {}; + for (let i2 = 0; i2 < pluginProps.length; i2++) { + const { propValue } = await inquirerPrompt({ + name: 'propValue', + type: 'input', + message: `${pluginKey}: Add value for ${pluginProps[i2]} (You can do this later in ./renative.json file)`, + }); + finalProps[pluginProps[i2]] = propValue; + } + const pluginToAdd: RnvPluginSchema = {}; + pluginToAdd.props = finalProps; + cnfPlugins[pluginKey] = pluginToAdd; + } - await resolvePluginDependants(); + const spinner = getApi() + .spinner(`Installing: ${installMessage.join(', ')}`) + .start(''); - await executeTask(RnvTaskName.install, RnvTaskName.pluginAdd, originTask); + writeRenativeConfigFile(ctx.paths.project.config, cnfOriginal); - spinner.succeed('All plugins installed!'); - logSuccess('Plugins installed successfully!'); - return true; -}; + await resolvePluginDependants(); + await checkAndInstallIfRequired(); -const Task: RnvTask = { - description: 'Add selected plugin to the project', - fn: taskPluginAdd, + spinner.succeed('All plugins installed!'); + logSuccess('Plugins installed successfully!'); + return true; + }, task: RnvTaskName.pluginAdd, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/plugin/taskPluginList.ts b/packages/engine-core/src/tasks/plugin/taskPluginList.ts index e8e46ee907..811584d0b7 100644 --- a/packages/engine-core/src/tasks/plugin/taskPluginList.ts +++ b/packages/engine-core/src/tasks/plugin/taskPluginList.ts @@ -1,25 +1,13 @@ -import { logTask, logToSummary, executeTask, RnvTaskOptionPresets, RnvTaskFn, RnvTask, RnvTaskName } from '@rnv/core'; -import { getPluginList } from '../../plugins'; +import { logToSummary, createTask, RnvTaskName } from '@rnv/core'; +import { getPluginList } from './taskHelpers'; -const taskPluginList: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskPluginList'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.pluginList, originTask); - - const o = getPluginList(); - - // console.log(o.asString); - logToSummary(`Plugins:\n\n${o.asString}`); - - return true; -}; - -const Task: RnvTask = { +export default createTask({ description: 'Show list of all available plugins', - fn: taskPluginList, + dependsOn: [RnvTaskName.projectConfigure], + fn: async () => { + const o = getPluginList(); + logToSummary(`Plugins:\n\n${o.asString}`); + return true; + }, task: RnvTaskName.pluginList, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/plugin/taskPluginUpdate.ts b/packages/engine-core/src/tasks/plugin/taskPluginUpdate.ts index f56635f62a..d5c36cc3aa 100644 --- a/packages/engine-core/src/tasks/plugin/taskPluginUpdate.ts +++ b/packages/engine-core/src/tasks/plugin/taskPluginUpdate.ts @@ -1,59 +1,35 @@ -import { - writeFileSync, - logSuccess, - logTask, - logWarning, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - inquirerPrompt, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { writeFileSync, logSuccess, logWarning, inquirerPrompt, createTask, RnvTaskName } from '@rnv/core'; -const taskPluginUpdate: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskPluginUpdate'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.pluginUpdate, originTask); - - // const pluginList = getPluginList(c, true); - - // console.log(o.asString); - - const { confirm } = await inquirerPrompt({ - name: 'confirm', - type: 'confirm', - message: 'Above installed plugins will be updated with RNV', - }); - - if (confirm) { - const { plugins } = c.buildConfig; - if (plugins) { - const cnf = c.files.project.config_original; - - if (!cnf) return; - Object.keys(plugins).forEach((_key) => { - //TODO: fix this. not working - // c.buildConfig.plugins[key] = o.json[key]; - cnf.plugins = cnf.plugins || {}; - // cnf.plugins[key] = pluginList.json[key]; - }); - - writeFileSync(c.paths.project.config, cnf); - - logSuccess('Plugins updated successfully!'); - } else { - logWarning(`No plugins found in renative.json`); - } - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Update specific plugin to latest supported version (rnv)', - fn: taskPluginUpdate, + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const { confirm } = await inquirerPrompt({ + name: 'confirm', + type: 'confirm', + message: 'Above installed plugins will be updated with RNV', + }); + + if (confirm) { + const { plugins } = ctx.buildConfig; + if (plugins) { + const cnf = ctx.files.project.config_original; + + if (!cnf) return; + Object.keys(plugins).forEach((_key) => { + //TODO: fix this. not working + // c.buildConfig.plugins[key] = o.json[key]; + cnf.plugins = cnf.plugins || {}; + // cnf.plugins[key] = pluginList.json[key]; + }); + + writeFileSync(ctx.paths.project.config, cnf); + + logSuccess('Plugins updated successfully!'); + } else { + logWarning(`No plugins found in renative.json`); + } + } + }, task: RnvTaskName.pluginUpdate, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/project/taskConfigureSoft.ts b/packages/engine-core/src/tasks/project/taskConfigureSoft.ts new file mode 100644 index 0000000000..ae8834624c --- /dev/null +++ b/packages/engine-core/src/tasks/project/taskConfigureSoft.ts @@ -0,0 +1,23 @@ +import { executeTask, configureRuntimeDefaults, createTask, RnvTaskName } from '@rnv/core'; +import { isBuildSchemeSupported } from '../../buildSchemes'; + +export default createTask({ + description: 'Configure system and project without recreating files (used for --only)', + fn: async ({ taskName, originTaskName }) => { + await configureRuntimeDefaults(); + await executeTask({ taskName: RnvTaskName.appConfigure, parentTaskName: taskName, originTaskName }); + await isBuildSchemeSupported(); + + await executeTask({ + taskName: RnvTaskName.sdkConfigure, + parentTaskName: taskName, + originTaskName, + isOptional: true, + }); + + await configureRuntimeDefaults(); + return true; + }, + task: RnvTaskName.configureSoft, + isPrivate: true, +}); diff --git a/packages/engine-core/src/tasks/project/taskProjectConfigure.ts b/packages/engine-core/src/tasks/project/taskProjectConfigure.ts index 6d756ce11d..14fab37026 100644 --- a/packages/engine-core/src/tasks/project/taskProjectConfigure.ts +++ b/packages/engine-core/src/tasks/project/taskProjectConfigure.ts @@ -4,42 +4,38 @@ import { overrideTemplatePlugins, resolvePluginDependants, chalk, - logTask, logInfo, updateRenativeConfigs, configureRuntimeDefaults, applyTemplate, - checkIfTemplateConfigured, - configureTemplateFiles, isTemplateInstalled, fsExistsSync, fsMkdirSync, checkAndMigrateProject, - RnvTaskOptionPresets, copyRuntimeAssets, cleanPlaformAssets, - checkAndCreateGitignore, versionCheck, - configureFonts, configureEngines, executeTask, initializeTask, findSuitableTask, - RnvTaskFn, generatePlatformAssetsRuntimeConfig, - RnvTask, + createTask, generateLocalJsonSchemas, RnvTaskName, getContext, } from '@rnv/core'; import { checkCrypto } from '../crypto/common'; +import { checkAndInstallIfRequired, installPackageDependenciesAndPlugins } from '../../taskHelpers'; +import { configureFonts } from '@rnv/sdk-utils'; const checkIsRenativeProject = async () => { const c = getContext(); - if (!c.paths.project.configExists) { + const { paths } = c; + if (!paths.project.configExists) { return Promise.reject( `This directory is not ReNative project. Project config ${chalk().bold( - c.paths.project.config + paths.project.config )} is missing!. You can create new project with ${chalk().bold('rnv new')}` ); } @@ -48,102 +44,108 @@ const checkIsRenativeProject = async () => { const configurePlatformBuilds = async () => { const c = getContext(); - if (c.paths.project.builds.dir && !fsExistsSync(c.paths.project.builds.dir)) { - logInfo(`Creating folder ${c.paths.project.builds.dir} ...DONE`); - fsMkdirSync(c.paths.project.builds.dir); + const { paths } = c; + if (paths.project.builds.dir && !fsExistsSync(paths.project.builds.dir)) { + logInfo(`Creating folder ${paths.project.builds.dir} ...DONE`); + fsMkdirSync(paths.project.builds.dir); } }; -const taskProjectConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskProjectConfigure'); +export default createTask({ + description: 'Configure current project', + fn: async ({ ctx, taskName, originTaskName, parentTaskName }) => { + const { runtime, program } = ctx; + // if (!paths.project.configExists) { + // return Promise.reject(`${RnvTaskName.projectConfigure} not supported outside of renative project`); + // } - await configurePlatformBuilds(); - await checkAndMigrateProject(); - await updateRenativeConfigs(); - await checkIsRenativeProject(); - await generateLocalJsonSchemas(); + await configurePlatformBuilds(); + await checkAndMigrateProject(); + await updateRenativeConfigs(); + await checkIsRenativeProject(); + await generateLocalJsonSchemas(); - await executeTask(RnvTaskName.workspaceConfigure, RnvTaskName.projectConfigure, originTask); + await executeTask({ taskName: RnvTaskName.workspaceConfigure, parentTaskName: taskName, originTaskName }); - if (c.program.only && !!parentTask) { - await configureRuntimeDefaults(); - await executeTask(RnvTaskName.appConfigure, RnvTaskName.projectConfigure, originTask); - await generatePlatformAssetsRuntimeConfig(); - return true; - } + if (program.opts().only && !!parentTaskName) { + await configureRuntimeDefaults(); + await executeTask({ taskName: RnvTaskName.appConfigure, parentTaskName: taskName, originTaskName }); - await checkIfTemplateConfigured(); - await executeTask(RnvTaskName.install, RnvTaskName.projectConfigure, originTask); - if (originTask !== RnvTaskName.cryptoDecrypt) { - //If we explicitly running rnv crypto decrypt there is no need to check crypto - await checkCrypto(parentTask, originTask); - } - - await configureRuntimeDefaults(); + await generatePlatformAssetsRuntimeConfig(); + return true; + } - if (originTask !== RnvTaskName.templateApply) { - if ((c.runtime.requiresBootstrap || !isTemplateInstalled()) && !c.files.project.config?.isTemplate) { - await applyTemplate(); - // We'll have to install the template first and reset current engine - logInfo('Your template has been bootstraped. Command reset is required. RESTRATING...DONE'); + await checkAndInstallIfRequired(); - const taskInstance = await findSuitableTask(); - c.runtime.requiresBootstrap = false; - if (taskInstance?.task) { - return initializeTask(taskInstance?.task); - } + if (originTaskName !== RnvTaskName.cryptoDecrypt) { + //If we explicitly running rnv crypto decrypt there is no need to check crypto + await checkCrypto(parentTaskName, originTaskName); } - await applyTemplate(); - await configureRuntimeDefaults(); - await executeTask(RnvTaskName.install, RnvTaskName.projectConfigure, originTask); - await executeTask(RnvTaskName.appConfigure, RnvTaskName.projectConfigure, originTask); - // IMPORTANT: configurePlugins must run after appConfig present to ensure merge of all configs/plugins - await versionCheck(c); - await configureEngines(c); - await resolvePluginDependants(); - await configurePlugins(); await configureRuntimeDefaults(); - if (!c.runtime.disableReset) { - if (c.program.resetHard) { - logInfo( - `You passed ${chalk().bold('-R, --resetHard')} argument. "${chalk().bold( - './platformAssets' - )}" will be cleaned up first` - ); - await cleanPlaformAssets(); - } else if (c.program.resetAssets) { - logInfo( - `You passed ${chalk().bold('-a, --resetAssets')} argument. "${chalk().bold( - './platformAssets' - )}" will be cleaned up first` - ); - await cleanPlaformAssets(); + + if (originTaskName !== RnvTaskName.templateApply) { + if ((runtime.requiresBootstrap || !isTemplateInstalled()) && !ctx.buildConfig?.isTemplate) { + await applyTemplate(); + // We'll have to install the template first and reset current engine + logInfo('Your template has been bootstraped. Command reset is required. RESTRATING...DONE'); + + const taskInstance = await findSuitableTask(); + runtime.requiresBootstrap = false; + if (taskInstance?.task) { + return initializeTask(taskInstance); + } } - } + await applyTemplate(); + // We need to ensure appConfigs are populated from template before proceeding further + // await configureTemplateFiles(); // NOTE: We only do this during bootstrap once + await configureRuntimeDefaults(); + await checkAndInstallIfRequired(); - await copyRuntimeAssets(); - await configureTemplateFiles(); - await checkAndCreateGitignore(); - if (!c.buildConfig.platforms) { - await updateRenativeConfigs(); - } - await generatePlatformAssetsRuntimeConfig(); - await overrideTemplatePlugins(); - // NOTE: this is needed to ensure missing rnv plugin sub-deps are caught - await checkForPluginDependencies(); - await configureFonts(); - } + await executeTask({ taskName: RnvTaskName.appConfigure, parentTaskName: taskName, originTaskName }); - return true; -}; + // IMPORTANT: configurePlugins must run after appConfig present to ensure merge of all configs/plugins + await versionCheck(ctx); + await configureEngines(ctx); + await resolvePluginDependants(); + await configurePlugins(); -const Task: RnvTask = { - description: 'Configure current project', - fn: taskProjectConfigure, - task: RnvTaskName.projectConfigure, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; + await configureRuntimeDefaults(); + if (!runtime.disableReset) { + if (program.opts().resetHard) { + logInfo( + `You passed ${chalk().bold('-R, --resetHard')} argument. "${chalk().bold( + './platformAssets' + )}" will be cleaned up first` + ); + await cleanPlaformAssets(); + } else if (program.opts().resetAssets) { + logInfo( + `You passed ${chalk().bold('-a, --resetAssets')} argument. "${chalk().bold( + './platformAssets' + )}" will be cleaned up first` + ); + await cleanPlaformAssets(); + } + } + + await copyRuntimeAssets(); + // Moved this up stream to ensure all configs are ready before copyRuntimeAssets + // await configureTemplateFiles(); -export default Task; + if (!ctx.buildConfig.platforms) { + await updateRenativeConfigs(); + } + await generatePlatformAssetsRuntimeConfig(); + await overrideTemplatePlugins(); + // NOTE: this is needed to ensure missing rnv plugin sub-deps are caught + await checkForPluginDependencies(async () => { + await installPackageDependenciesAndPlugins(); + }); + await configureFonts(); + } + + return true; + }, + task: RnvTaskName.projectConfigure, +}); diff --git a/packages/engine-core/src/tasks/project/taskProjectPlatforms.ts b/packages/engine-core/src/tasks/project/taskProjectPlatforms.ts new file mode 100644 index 0000000000..3db1c52445 --- /dev/null +++ b/packages/engine-core/src/tasks/project/taskProjectPlatforms.ts @@ -0,0 +1,22 @@ +import { updateProjectPlatforms, inquirerPrompt, createTask, RnvTaskName } from '@rnv/core'; + +export default createTask({ + description: 'Allows you to change supportedPlatforms for your project', + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const currentPlatforms = ctx.files.project.config?.defaults?.supportedPlatforms || []; + + const { inputSupportedPlatforms } = await inquirerPrompt({ + name: 'inputSupportedPlatforms', + type: 'checkbox', + pageSize: 20, + message: 'What platforms would you like to use?', + validate: (val) => !!val.length || 'Please select at least a platform', + default: currentPlatforms, + choices: ctx.runtime.availablePlatforms, + }); + + updateProjectPlatforms(inputSupportedPlatforms); + }, + task: RnvTaskName.projectPlatforms, +}); diff --git a/packages/engine-core/src/tasks/project/taskProjectUpgrade.ts b/packages/engine-core/src/tasks/project/taskProjectUpgrade.ts index a94c4bde27..39031f2555 100644 --- a/packages/engine-core/src/tasks/project/taskProjectUpgrade.ts +++ b/packages/engine-core/src/tasks/project/taskProjectUpgrade.ts @@ -1,86 +1,80 @@ import path from 'path'; import fs from 'fs'; import { - RnvTaskOptionPresets, - logTask, logInfo, logToSummary, upgradeProjectDependencies, upgradeDependencies, executeTask, listAndSelectNpmVersion, - installPackageDependenciesAndPlugins, fsExistsSync, readObjectSync, - RnvTaskFn, - RnvTask, + createTask, RnvTaskName, + NpmPackageFile, + ConfigFileProject, + RnvFileName, } from '@rnv/core'; -import { NpmPackageFile } from '@rnv/core/lib/configs/types'; -import { ConfigFileProject } from '@rnv/core/lib/schema/configFiles/types'; +import { installPackageDependenciesAndPlugins } from '../../taskHelpers'; -const taskProjectUpgrade: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskProjectUpgrade'); - const upgradedPaths = []; - if (fsExistsSync(c.paths.project.config)) { - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.projectUpgrade, originTask); - const selectedVersion = await listAndSelectNpmVersion('rnv'); +export default createTask({ + description: 'Upgrade or downgrade RNV dependencies in your ReNative project', + fn: async ({ ctx, taskName, originTaskName }) => { + const { paths, files } = ctx; + const upgradedPaths = []; + if (fsExistsSync(paths.project.config)) { + await executeTask({ taskName: RnvTaskName.projectConfigure, parentTaskName: taskName, originTaskName }); + const selectedVersion = await listAndSelectNpmVersion('rnv'); - upgradedPaths.push(...upgradeProjectDependencies(selectedVersion)); + upgradedPaths.push(...upgradeProjectDependencies(selectedVersion)); - await installPackageDependenciesAndPlugins(); - } else { - logInfo('Your are running rnv upgrade outside of renative project'); - const packagesPath = path.join(c.paths.project.dir, 'packages'); - if (fsExistsSync(c.paths.project.package) && fsExistsSync(packagesPath)) { - const selectedVersion = await listAndSelectNpmVersion('rnv'); + await installPackageDependenciesAndPlugins(); + } else { + logInfo('Your are running rnv upgrade outside of renative project'); + const packagesPath = path.join(paths.project.dir, 'packages'); + if (fsExistsSync(paths.project.package) && fsExistsSync(packagesPath)) { + const selectedVersion = await listAndSelectNpmVersion('rnv'); - upgradedPaths.push( - ...upgradeDependencies( - c.files.project.package, - c.paths.project.package, - undefined, - null, - selectedVersion - ) - ); + upgradedPaths.push( + ...upgradeDependencies( + files.project.package, + paths.project.package, + undefined, + null, + selectedVersion + ) + ); - const dirs = fs.readdirSync(packagesPath); + const dirs = fs.readdirSync(packagesPath); - dirs.forEach((dir) => { - const dirPath = path.join(packagesPath, dir); - if (fs.statSync(dirPath).isDirectory()) { - const pkgPath = path.join(dirPath, 'package.json'); - const rnvPath = path.join(dirPath, 'renative.json'); - let pkgFile; - let rnvFile; - if (fsExistsSync(pkgPath)) { - pkgFile = readObjectSync(pkgPath); - } + dirs.forEach((dir) => { + const dirPath = path.join(packagesPath, dir); + if (fs.statSync(dirPath).isDirectory()) { + const pkgPath = path.join(dirPath, RnvFileName.package); + const rnvPath = path.join(dirPath, RnvFileName.renative); + let pkgFile; + let rnvFile; + if (fsExistsSync(pkgPath)) { + pkgFile = readObjectSync(pkgPath); + } - if (fsExistsSync(rnvPath)) { - rnvFile = readObjectSync(rnvPath); + if (fsExistsSync(rnvPath)) { + rnvFile = readObjectSync(rnvPath); + } + if (pkgFile && rnvFile) { + upgradedPaths.push( + ...upgradeDependencies(pkgFile, pkgPath, rnvFile, rnvPath, selectedVersion) + ); + } } - if (pkgFile && rnvFile) { - upgradedPaths.push(...upgradeDependencies(pkgFile, pkgPath, rnvFile, rnvPath, selectedVersion)); - } - } - }); + }); + } } - } - - logToSummary(`Upgraded following files:\n${upgradedPaths.join('\n')}`); - return true; -}; + logToSummary(`Upgraded following files:\n${upgradedPaths.join('\n')}`); -const Task: RnvTask = { - description: 'Upgrade or downgrade RNV dependencies in your ReNative project', - fn: taskProjectUpgrade, + return true; + }, task: RnvTaskName.projectUpgrade, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/target/taskTargetLaunch.ts b/packages/engine-core/src/tasks/target/taskTargetLaunch.ts deleted file mode 100644 index 4152d88db0..0000000000 --- a/packages/engine-core/src/tasks/target/taskTargetLaunch.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - isPlatformSupported, - chalk, - logTask, - RnvTaskOptionPresets, - executeTask, - RnvTaskFn, - inquirerPrompt, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { checkAndConfigureSdks, checkSdk } from '../../common'; -import { launchAndroidSimulator } from '@rnv/sdk-android'; -import { launchAppleSimulator } from '@rnv/sdk-apple'; -import { launchTizenSimulator } from '@rnv/sdk-tizen'; -import { launchWebOSimulator } from '@rnv/sdk-webos'; -import { launchKaiOSSimulator } from '@rnv/sdk-kaios'; - -const taskTargetLaunch: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskTargetLaunch'); - - await isPlatformSupported(true); - await checkAndConfigureSdks(); - await executeTask(RnvTaskName.workspaceConfigure, RnvTaskName.targetLaunch, originTask); - - const { platform, program } = c; - let target = program?.target; - const options = []; - - if (platform && !target) { - const projectTarget = c.files.project.configLocal?.defaultTargets?.[platform]; - if (projectTarget) { - options.push({ name: `${projectTarget} (project default)`, value: projectTarget }); - } - const workspaceTarget = c.files.workspace.config?.defaultTargets?.[platform]; - if (workspaceTarget) { - options.push({ name: `${workspaceTarget} (global default)`, value: workspaceTarget }); - } - - options.push({ name: 'Pick from available targets...', value: true }); - - const { selectedOption } = await inquirerPrompt({ - name: 'selectedOption', - type: 'list', - message: 'Which target to use?', - choices: options, - }); - - if (selectedOption) { - target = selectedOption; - } - } - - await checkSdk(); - - switch (platform) { - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - return launchAndroidSimulator(target); - case 'ios': - case 'tvos': - return launchAppleSimulator(target); - case 'tizen': - return launchTizenSimulator(target); - case 'webos': - return launchWebOSimulator(target); - case 'kaios': - return launchKaiOSSimulator(target); - default: - return Promise.reject( - `"target launch" command does not support ${chalk().white.bold( - platform - )} platform yet. You will have to launch the target manually. Working on it!` - ); - } -}; - -const Task: RnvTask = { - description: 'Launch specific target', - fn: taskTargetLaunch, - task: RnvTaskName.targetLaunch, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - isGlobalScope: true, -}; - -export default Task; diff --git a/packages/engine-core/src/tasks/target/taskTargetList.ts b/packages/engine-core/src/tasks/target/taskTargetList.ts deleted file mode 100644 index d993f57eb1..0000000000 --- a/packages/engine-core/src/tasks/target/taskTargetList.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - isPlatformSupported, - chalk, - logTask, - RnvTaskOptionPresets, - executeTask, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { listAndroidTargets } from '@rnv/sdk-android'; -import { listAppleDevices } from '@rnv/sdk-apple'; -import { listTizenTargets } from '@rnv/sdk-tizen'; -import { listWebOSTargets } from '@rnv/sdk-webos'; -import { checkAndConfigureSdks, checkSdk } from '../../common'; - -const taskTargetList: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskTargetList'); - - await isPlatformSupported(true); - await checkAndConfigureSdks(); - await executeTask(RnvTaskName.workspaceConfigure, RnvTaskName.targetList, originTask); - - const { platform } = c; - - await checkSdk(); - - switch (platform) { - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - return listAndroidTargets(c); - case 'ios': - case 'tvos': - return listAppleDevices(c); - case 'tizen': - return listTizenTargets(); - case 'webos': - return listWebOSTargets(c); - default: - return Promise.reject( - `"target list" command does not support ${chalk().white.bold(platform)} platform yet. Working on it!` - ); - } -}; - -const Task: RnvTask = { - description: 'List all available targets for specific platform', - fn: taskTargetList, - task: RnvTaskName.targetList, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - isGlobalScope: true, -}; - -export default Task; diff --git a/packages/engine-core/src/tasks/telemetry/taskTelemetryDisable.ts b/packages/engine-core/src/tasks/telemetry/taskTelemetryDisable.ts index 60efa63c21..4430aa427d 100644 --- a/packages/engine-core/src/tasks/telemetry/taskTelemetryDisable.ts +++ b/packages/engine-core/src/tasks/telemetry/taskTelemetryDisable.ts @@ -1,39 +1,22 @@ -import { - chalk, - logTask, - logToSummary, - RnvTaskOptionPresets, - RnvTask, - RnvTaskFn, - RnvTaskName, - writeFileSync, -} from '@rnv/core'; +import { chalk, logToSummary, createTask, RnvTaskName, writeFileSync } from '@rnv/core'; -const taskTelemetryDisable: RnvTaskFn = async (c) => { - logTask('taskTelemetryDisable'); - - const { config } = c.files.defaultWorkspace; - if (config) { - config.disableTelemetry = true; +export default createTask({ + description: 'Disables rnv telemetry on your machine', + fn: async ({ ctx }) => { + const { config } = ctx.files.dotRnv; + if (config) { + config.disableTelemetry = true; - writeFileSync(c.paths.GLOBAL_RNV_CONFIG, config); + writeFileSync(ctx.paths.dotRnv.config, config); - logToSummary(` Succesfully ${chalk().red('disabled')} ReNative telemetry on your machine. + logToSummary(` Succesfully ${chalk().red('disabled')} ReNative telemetry on your machine. No data will be collected from your machine. Learn more: https://renative.org/telemetry`); - } - - return true; -}; + } -const Task: RnvTask = { - description: 'Disables rnv telemetry on your machine', - fn: taskTelemetryDisable, + return true; + }, task: RnvTaskName.telemetryDisable, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/telemetry/taskTelemetryEnable.ts b/packages/engine-core/src/tasks/telemetry/taskTelemetryEnable.ts index 9b5ed0dcf2..2cfd7787df 100644 --- a/packages/engine-core/src/tasks/telemetry/taskTelemetryEnable.ts +++ b/packages/engine-core/src/tasks/telemetry/taskTelemetryEnable.ts @@ -1,39 +1,22 @@ -import { - chalk, - logTask, - logToSummary, - RnvTaskOptionPresets, - RnvTask, - RnvTaskFn, - RnvTaskName, - writeFileSync, -} from '@rnv/core'; +import { chalk, logToSummary, createTask, RnvTaskName, writeFileSync } from '@rnv/core'; -const taskTelemetryEnable: RnvTaskFn = async (c) => { - logTask('taskTelemetryEnable'); - - const { config } = c.files.defaultWorkspace; - if (config) { - config.disableTelemetry = false; +export default createTask({ + description: 'Enables rnv telemetry on your machine', + fn: async ({ ctx }) => { + const { config } = ctx.files.dotRnv; + if (config) { + config.disableTelemetry = false; - writeFileSync(c.paths.GLOBAL_RNV_CONFIG, config); + writeFileSync(ctx.paths.dotRnv.config, config); - logToSummary(` Succesfully ${chalk().green('enabled')} ReNative telemetry on your machine. + logToSummary(` Succesfully ${chalk().green('enabled')} ReNative telemetry on your machine. ReNative telemetry is completely anonymous. Thank you for participating! Learn more: https://renative.org/telemetry `); - } - - return true; -}; + } -const Task: RnvTask = { - description: 'Enables rnv telemetry on your machine', - fn: taskTelemetryEnable, + return true; + }, task: RnvTaskName.telemetryEnable, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/telemetry/taskTelemetryStatus.ts b/packages/engine-core/src/tasks/telemetry/taskTelemetryStatus.ts index e883b43b53..c085aa7ef7 100644 --- a/packages/engine-core/src/tasks/telemetry/taskTelemetryStatus.ts +++ b/packages/engine-core/src/tasks/telemetry/taskTelemetryStatus.ts @@ -1,37 +1,29 @@ -import { chalk, logTask, logToSummary, RnvTaskOptionPresets, RnvTask, RnvTaskFn, RnvTaskName } from '@rnv/core'; +import { chalk, logToSummary, createTask, RnvTaskName } from '@rnv/core'; -const taskTelemetryStatus: RnvTaskFn = async (c) => { - logTask('taskTelemetryStatus'); - - const disableTelemetry = c.files.defaultWorkspace.config?.disableTelemetry; +export default createTask({ + description: 'Show current rnv telemetry status on your machine', + fn: async ({ ctx }) => { + const disableTelemetry = ctx.files.dotRnv.config?.disableTelemetry; - if (disableTelemetry) { - logToSummary( - ` Status: ${chalk().red('Disabled')} + if (disableTelemetry) { + logToSummary( + ` Status: ${chalk().red('Disabled')} You have opted-out of ReNative anonymous telemetry program. No data will be collected from your machine. Learn more: https://renative.org/telemetry` - ); - } else { - logToSummary( - ` Status: ${chalk().green('Enabled')} + ); + } else { + logToSummary( + ` Status: ${chalk().green('Enabled')} ReNative telemetry is completely anonymous. Thank you for participating! Learn more: https://renative.org/telemetry ` - ); - } - - return true; -}; + ); + } -const Task: RnvTask = { - description: 'Show current rnv telemetry status on your machine', - fn: taskTelemetryStatus, + return true; + }, task: RnvTaskName.telemetryStatus, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/template/taskTemplateAdd.ts b/packages/engine-core/src/tasks/template/taskTemplateAdd.ts deleted file mode 100644 index 6784443103..0000000000 --- a/packages/engine-core/src/tasks/template/taskTemplateAdd.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - writeFileSync, - logTask, - generateBuildConfig, - executeTask, - RnvTaskOptionPresets, - getTemplateOptions, - RnvContext, - RnvTaskFn, - inquirerPrompt, - RnvTask, - RnvTaskName, -} from '@rnv/core'; - -const _writeObjectSync = (p: string, s: object) => { - writeFileSync(p, s); - generateBuildConfig(); -}; - -export const _addTemplate = (c: RnvContext, template: string) => { - logTask('addTemplate'); - - const cnf = c.files.project.config; - if (!cnf) return; - - cnf.templates = cnf.templates || {}; - - if (!cnf.templates[template]) { - cnf.templates[template] = { - version: 'latest', - }; - } - - _writeObjectSync(c.paths.project.config, cnf); -}; - -const taskTemplateAdd: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskTemplateAdd'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.templateAdd, originTask); - - const opts = getTemplateOptions(); - - const { template } = await inquirerPrompt({ - type: 'list', - message: 'Pick which template to install', - name: 'template', - choices: opts.keysAsArray, - }); - - _addTemplate(c, template); - - return true; -}; - -const Task: RnvTask = { - description: 'Install additional template to the project', - fn: taskTemplateAdd, - task: RnvTaskName.templateAdd, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; diff --git a/packages/engine-core/src/tasks/template/taskTemplateApply.ts b/packages/engine-core/src/tasks/template/taskTemplateApply.ts index 28d1e158e7..34f981d586 100644 --- a/packages/engine-core/src/tasks/template/taskTemplateApply.ts +++ b/packages/engine-core/src/tasks/template/taskTemplateApply.ts @@ -1,54 +1,25 @@ -import { - logTask, - applyTemplate, - getInstalledTemplateOptions, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - inquirerPrompt, - RnvTask, - RnvTaskName, -} from '@rnv/core'; - -const taskTemplateApply: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskTemplateApply', `template: ${c.program.template}`); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.templateApply, originTask); - - if (c.files.project.config?.isTemplate) { - return Promise.reject('Template projects cannot use template apply command'); - } - - if (c.program.template) { - await applyTemplate(c.program.template); - if (c.program.appConfigID) { - await executeTask(RnvTaskName.appConfigure, RnvTaskName.templateApply, originTask); +import { applyTemplate, createTask, RnvTaskName, logInfo, inquirerPrompt } from '@rnv/core'; + +export default createTask({ + description: 'Reapply template (if configured) to current project', + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const { buildConfig } = ctx; + if (buildConfig?.isTemplate) { + return Promise.reject('Template projects cannot use template apply command'); } - - return true; - } - const opts = getInstalledTemplateOptions(); - - const { template } = await inquirerPrompt({ - type: 'list', - message: 'Pick which template to install', - name: 'template', - choices: opts?.keysAsArray, - }); - - await applyTemplate(template); - if (c.program.appConfigID) { - await executeTask(RnvTaskName.appConfigure, RnvTaskName.templateApply, originTask); - } - return true; -}; - -const Task: RnvTask = { - description: 'Reset project to specific template', - fn: taskTemplateApply, + logInfo( + 'This command will reapply template to current project. files will be overwritten. make sure you backed up your project before proceeding.' + ); + const { confirm } = await inquirerPrompt({ + type: 'confirm', + name: 'confirm', + message: 'Proceed?', + }); + if (!confirm) { + return; + } + return applyTemplate(); + }, task: RnvTaskName.templateApply, - options: RnvTaskOptionPresets.withBase(), - platforms: [], -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/template/taskTemplateList.ts b/packages/engine-core/src/tasks/template/taskTemplateList.ts deleted file mode 100644 index 5226044c4c..0000000000 --- a/packages/engine-core/src/tasks/template/taskTemplateList.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - logToSummary, - logTask, - getTemplateOptions, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; - -const taskTemplateList: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskTemplateList'); - - if (c.paths.project.configExists) { - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.templateList, originTask); - } - const opts = getTemplateOptions(!c.paths.project.configExists); - logToSummary(`Templates:\n\n${opts.asString}`); - return true; -}; - -const Task: RnvTask = { - description: 'Show list of available templates', - fn: taskTemplateList, - task: RnvTaskName.templateList, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - isGlobalScope: true, -}; - -export default Task; diff --git a/packages/engine-core/src/tasks/workspace/taskWorkspaceAdd.ts b/packages/engine-core/src/tasks/workspace/taskWorkspaceAdd.ts index 4ad6facfc1..53864b99b5 100644 --- a/packages/engine-core/src/tasks/workspace/taskWorkspaceAdd.ts +++ b/packages/engine-core/src/tasks/workspace/taskWorkspaceAdd.ts @@ -1,60 +1,41 @@ import path from 'path'; -import { - inquirerPrompt, - logTask, - createWorkspace, - fsExistsSync, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { inquirerPrompt, createWorkspace, fsExistsSync, createTask, RnvTaskName } from '@rnv/core'; -const taskWorkspaceAdd: RnvTaskFn = async (_c, _parentTask, originTask) => { - logTask('taskWorkspaceAdd'); +export default createTask({ + description: 'Add new workspace', + dependsOn: [RnvTaskName.projectConfigure], + fn: async () => { + const { workspace } = await inquirerPrompt({ + name: 'workspace', + type: 'input', + message: 'absolute path to new workspace', + validate: (i: string) => !!i || 'No path provided', + }); - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.workspaceAdd, originTask); + const workspacePath = path.join(workspace); - const { workspace } = await inquirerPrompt({ - name: 'workspace', - type: 'input', - message: 'absolute path to new workspace', - validate: (i: string) => !!i || 'No path provided', - }); + if (fsExistsSync(workspacePath)) { + const { confirm } = await inquirerPrompt({ + name: 'confirm', + type: 'confirm', + message: `Folder ${workspacePath} already exists are you sure you want to override it?`, + }); + if (!confirm) return false; + } - const workspacePath = path.join(workspace); + let workspaceID = workspacePath.split('/').pop()?.replace(/@|\./g, '') || 'rnv'; - if (fsExistsSync(workspacePath)) { - const { confirm } = await inquirerPrompt({ - name: 'confirm', - type: 'confirm', - message: `Folder ${workspacePath} already exists are you sure you want to override it?`, + const { workspaceIDInput } = await inquirerPrompt({ + name: 'workspaceIDInput', + type: 'input', + message: `ID of the workspace (${workspaceID})`, }); - if (!confirm) return false; - } - - let workspaceID = workspacePath.split('/').pop()?.replace(/@|\./g, '') || 'rnv'; - - const { workspaceIDInput } = await inquirerPrompt({ - name: 'workspaceIDInput', - type: 'input', - message: `ID of the workspace (${workspaceID})`, - }); - workspaceID = workspaceIDInput || workspaceID; - createWorkspace(workspaceID, workspacePath); + workspaceID = workspaceIDInput || workspaceID; + createWorkspace(workspaceID, workspacePath); - return true; -}; - -const Task: RnvTask = { - description: 'Add new workspace', - fn: taskWorkspaceAdd, + return true; + }, task: RnvTaskName.workspaceAdd, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/workspace/taskWorkspaceConfigure.ts b/packages/engine-core/src/tasks/workspace/taskWorkspaceConfigure.ts index f4fe693ab6..766ffbef6d 100644 --- a/packages/engine-core/src/tasks/workspace/taskWorkspaceConfigure.ts +++ b/packages/engine-core/src/tasks/workspace/taskWorkspaceConfigure.ts @@ -1,100 +1,84 @@ import path from 'path'; import { - RnvTaskOptionPresets, copyFileSync, mkdirSync, fsWriteFileSync, fsExistsSync, fsReadFileSync, chalk, - logTask, logWarning, logDebug, logInfo, - RnvTaskFn, - RnvTask, + createTask, RnvTaskName, - ConfigName, + RnvFileName, } from '@rnv/core'; +import { writeFileSync } from 'fs'; -const taskWorkspaceConfigure: RnvTaskFn = async (c) => { - logTask('taskWorkspaceConfigure'); - - // Check globalConfig Dir - if (fsExistsSync(c.paths.workspace.dir)) { - logDebug(`${c.paths.workspace.dir} folder exists!`); - } else { - logInfo(`${c.paths.workspace.dir} folder missing! Creating one for you...`); - mkdirSync(c.paths.workspace.dir); - } +export default createTask({ + description: 'Preconfigures your current workspace defined via "workspaceID" prop in renative config file', + fn: async ({ ctx }) => { + const { paths, files } = ctx; + // Check globalConfig Dir + if (fsExistsSync(paths.workspace.dir)) { + logDebug(`${paths.workspace.dir} folder exists!`); + } else { + logInfo(`${paths.workspace.dir} folder missing! Creating one for you...`); + mkdirSync(paths.workspace.dir); + } - // Check globalConfig - if (fsExistsSync(c.paths.workspace.config)) { - logDebug(`${c.paths.workspace.dir}/${ConfigName.renative} file exists!`); - } else { - const oldGlobalConfigPath = path.join(c.paths.workspace.dir, 'config.json'); - if (fsExistsSync(oldGlobalConfigPath)) { - logWarning('Found old version of your config. will copy it to new renative.json config'); - copyFileSync(oldGlobalConfigPath, c.paths.workspace.config); + // Check globalConfig + if (fsExistsSync(paths.workspace.config)) { + logDebug(`${paths.workspace.dir}/${RnvFileName.renative} file exists!`); } else { - logInfo(`${c.paths.workspace.dir}/${ConfigName.renative} file missing! Creating one for you...`); - copyFileSync( - path.join(c.paths.rnv.dir, 'coreTemplateFiles', 'global-config-template.json'), - c.paths.workspace.config - ); + const oldGlobalConfigPath = path.join(paths.workspace.dir, 'config.json'); + if (fsExistsSync(oldGlobalConfigPath)) { + logWarning('Found old version of your config. will copy it to new renative.json config'); + copyFileSync(oldGlobalConfigPath, paths.workspace.config); + } else { + logInfo(`${paths.workspace.dir}/${RnvFileName.renative} file missing! Creating one for you...`); + writeFileSync(paths.workspace.config, '{}'); + } } - } - if (fsExistsSync(c.paths.workspace.config)) { - c.files.workspace.config = JSON.parse(fsReadFileSync(c.paths.workspace.config).toString()); + if (fsExistsSync(paths.workspace.config)) { + files.workspace.config = JSON.parse(fsReadFileSync(paths.workspace.config).toString()); + + if (files.workspace.config?.appConfigsPath) { + if (!fsExistsSync(files.workspace.config.appConfigsPath)) { + logWarning( + `Your custom global appConfig is pointing to ${chalk().bold( + files.workspace.config.appConfigsPath + )} which doesn't exist! Make sure you create one in that location` + ); + } else { + logInfo( + `Found custom appConfing location pointing to ${chalk().bold( + files.workspace.config.appConfigsPath + )}. ReNativewill now swith to that location!` + ); + paths.project.appConfigsDir = files.workspace.config.appConfigsPath; + } + } - if (c.files.workspace.config?.appConfigsPath) { - if (!fsExistsSync(c.files.workspace.config.appConfigsPath)) { + // Check config sanity + if (files.workspace.config?.defaultTargets === undefined) { logWarning( - `Your custom global appConfig is pointing to ${chalk().bold( - c.files.workspace.config.appConfigsPath - )} which doesn't exist! Make sure you create one in that location` + `You're missing defaultTargets in your config ${chalk().bold( + paths.workspace.config + )}. Let's add them!` ); - } else { - logInfo( - `Found custom appConfing location pointing to ${chalk().bold( - c.files.workspace.config.appConfigsPath - )}. ReNativewill now swith to that location!` - ); - c.paths.project.appConfigsDir = c.files.workspace.config.appConfigsPath; - } - } - // Check config sanity - if (c.files.workspace.config?.defaultTargets === undefined) { - logWarning( - `You're missing defaultTargets in your config ${chalk().bold( - c.paths.workspace.config - )}. Let's add them!` - ); - const defaultConfig = JSON.parse( - fsReadFileSync( - path.join(c.paths.rnv.dir, 'coreTemplateFiles', 'global-config-template.json') - ).toString() - ); - const newConfig = { - ...c.files.workspace.config, - defaultTargets: defaultConfig.defaultTargets, - }; - fsWriteFileSync(c.paths.workspace.config, JSON.stringify(newConfig, null, 2)); + const newConfig = { + ...files.workspace.config, + defaultTargets: {}, + }; + fsWriteFileSync(paths.workspace.config, JSON.stringify(newConfig, null, 2)); + } } - } - - return true; -}; -const Task: RnvTask = { - description: 'Preconfigures your current workspace defined via "workspaceID" prop in renative config file', - fn: taskWorkspaceConfigure, + return true; + }, task: RnvTaskName.workspaceConfigure, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/workspace/taskWorkspaceConnect.ts b/packages/engine-core/src/tasks/workspace/taskWorkspaceConnect.ts index 4e1d05bf10..d587014b9a 100644 --- a/packages/engine-core/src/tasks/workspace/taskWorkspaceConnect.ts +++ b/packages/engine-core/src/tasks/workspace/taskWorkspaceConnect.ts @@ -1,45 +1,23 @@ -import { - inquirerPrompt, - logTask, - logRaw, - getWorkspaceConnectionString, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { inquirerPrompt, logRaw, getWorkspaceConnectionString, createTask, RnvTaskName } from '@rnv/core'; -const taskWorkspaceConnect: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskWorkspaceConnect'); - - if (!c.paths.project.configExists) { - return Promise.reject(`${RnvTaskName.projectConfigure} not supported outside of renative project`); - } - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.workspaceConnect, originTask); - - const cnf = c.files.rnv.configWorkspaces; - if (!cnf) return; - - const opts = Object.keys(cnf.workspaces).map((v) => `${v} ${getWorkspaceConnectionString(cnf.workspaces[v])}`); - - const { selectedWS } = await inquirerPrompt({ - type: 'list', - name: 'selectedWS', - message: 'Pick a workspace', - choices: opts, - }); - - logRaw(selectedWS); -}; - -const Task: RnvTask = { +export default createTask({ description: 'Connect project with selected workspace', - fn: taskWorkspaceConnect, + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const cnf = ctx.files.dotRnv.configWorkspaces; + if (!cnf) return; + + const opts = Object.keys(cnf.workspaces).map((v) => `${v} ${getWorkspaceConnectionString(cnf.workspaces[v])}`); + + const { selectedWS } = await inquirerPrompt({ + type: 'list', + name: 'selectedWS', + message: 'Pick a workspace', + choices: opts, + }); + + logRaw(selectedWS); + }, task: RnvTaskName.workspaceConnect, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/workspace/taskWorkspaceList.ts b/packages/engine-core/src/tasks/workspace/taskWorkspaceList.ts index 6f6e58618d..776e63ab58 100644 --- a/packages/engine-core/src/tasks/workspace/taskWorkspaceList.ts +++ b/packages/engine-core/src/tasks/workspace/taskWorkspaceList.ts @@ -1,42 +1,21 @@ -import { - generateOptions, - chalk, - logTask, - logToSummary, - executeTask, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { generateOptions, chalk, logToSummary, createTask, RnvTaskName } from '@rnv/core'; -const taskWorkspaceList: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskWorkspaceList'); - - if (c.paths.project.configExists) { - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.workspaceList, originTask); - } - - const opts = generateOptions( - c.files.rnv.configWorkspaces?.workspaces, - true, - null, - (i, obj, mapping, defaultVal) => { - const isConnected = ''; - return ` [${chalk().grey(i + 1)}]> ${chalk().bold(defaultVal)}${isConnected} \n`; - } - ); - - logToSummary(`Workspaces:\n\n${opts.asString}`); -}; - -const Task: RnvTask = { +export default createTask({ description: 'Show list of all available workspaces', - fn: taskWorkspaceList, + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const opts = generateOptions( + ctx.files.dotRnv.configWorkspaces?.workspaces, + true, + null, + (i, obj, mapping, defaultVal) => { + const isConnected = ''; + return ` [${chalk().grey(i + 1)}]> ${chalk().bold(defaultVal)}${isConnected} \n`; + } + ); + + logToSummary(`Workspaces:\n\n${opts.asString}`); + }, task: RnvTaskName.workspaceList, - options: RnvTaskOptionPresets.withBase(), - platforms: [], isGlobalScope: true, -}; - -export default Task; +}); diff --git a/packages/engine-core/src/tasks/workspace/taskWorkspaceUpdate.ts b/packages/engine-core/src/tasks/workspace/taskWorkspaceUpdate.ts deleted file mode 100644 index b0e7c55e2d..0000000000 --- a/packages/engine-core/src/tasks/workspace/taskWorkspaceUpdate.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { logTask, executeTask, RnvTaskOptionPresets, RnvTaskFn, RnvTask, RnvTaskName } from '@rnv/core'; - -const taskWorkspaceUpdate: RnvTaskFn = async (_c, _parentTask, originTask) => { - // TODO: taskWorkspaceUpdate - logTask('taskWorkspaceUpdate'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.workspaceUpdate, originTask); - - return true; -}; - -const Task: RnvTask = { - description: 'TODO: unused task', - fn: taskWorkspaceUpdate, - task: RnvTaskName.workspaceUpdate, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - isGlobalScope: true, - isPrivate: true, -}; - -export default Task; diff --git a/packages/engine-lightning/.gitignore b/packages/engine-lightning/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-lightning/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-lightning/.npmignore b/packages/engine-lightning/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-lightning/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-lightning/renative.engine.json b/packages/engine-lightning/renative.engine.json index dafbbff582..1c704911e5 100644 --- a/packages/engine-lightning/renative.engine.json +++ b/packages/engine-lightning/renative.engine.json @@ -1,6 +1,7 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-lightning", + "packageName": "@rnv/engine-lightning", "overview": "ReNative Engine to build lightning based apps.", "plugins": { "@lightningjs/sdk": "source:rnv", diff --git a/packages/engine-lightning/src/config.ts b/packages/engine-lightning/src/config.ts new file mode 100644 index 0000000000..6eadb226bb --- /dev/null +++ b/packages/engine-lightning/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileEngine } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.engine.json'; +export const Config: ConfigFileEngine = CNF; diff --git a/packages/engine-lightning/src/getContext.ts b/packages/engine-lightning/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-lightning/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-lightning/src/index.ts b/packages/engine-lightning/src/index.ts index 74f8030e34..f7b933bae5 100644 --- a/packages/engine-lightning/src/index.ts +++ b/packages/engine-lightning/src/index.ts @@ -1,29 +1,30 @@ -import { RnvEngine, generateEngineTasks, generateEngineExtensions } from '@rnv/core'; -//@ts-ignore -import CNF from '../renative.engine.json'; +import { GetContextType, createRnvEngine } from '@rnv/core'; +import { Tasks as TasksSdkWebOS } from '@rnv/sdk-webos'; +import { Tasks as TasksSdkTizen } from '@rnv/sdk-tizen'; import taskBuild from './tasks/taskBuild'; import taskConfigure from './tasks/taskConfigure'; import taskRun from './tasks/taskRun'; +import { Config } from './config'; -const Engine: RnvEngine = { - tasks: generateEngineTasks([taskRun, taskBuild, taskConfigure]), - config: CNF, +const Engine = createRnvEngine({ + tasks: [taskRun, taskBuild, taskConfigure, ...TasksSdkWebOS, ...TasksSdkTizen], + config: Config, projectDirName: 'project', serverDirName: 'server', - runtimeExtraProps: {}, - // ejectPlatform: null, platforms: { tizen: { defaultPort: 8087, isWebHosted: true, - extensions: generateEngineExtensions(['lng', 'tizen.tv', 'web.tv', 'tv', 'tizen', 'tv.web', 'web'], CNF), + extensions: ['lng', 'tizen.tv', 'web.tv', 'tv', 'tizen', 'tv.web', 'web'], }, webos: { defaultPort: 8088, isWebHosted: true, - extensions: generateEngineExtensions(['lng', 'webos.tv', 'web.tv', 'tv', 'webos', 'tv.web', 'web'], CNF), + extensions: ['lng', 'webos.tv', 'web.tv', 'tv', 'webos', 'tv.web', 'web'], }, }, -}; +}); + +export type GetContext = GetContextType; export default Engine; diff --git a/packages/engine-lightning/src/sdk/constants.ts b/packages/engine-lightning/src/sdk/constants.ts new file mode 100644 index 0000000000..ecc74d68cb --- /dev/null +++ b/packages/engine-lightning/src/sdk/constants.ts @@ -0,0 +1,3 @@ +import { RnvPlatformKey } from '@rnv/core'; + +export const SdkPlatforms: Array = ['tizen', 'webos']; diff --git a/packages/engine-lightning/src/sdks/sdk-lightning/env.ts b/packages/engine-lightning/src/sdk/env.ts similarity index 100% rename from packages/engine-lightning/src/sdks/sdk-lightning/env.ts rename to packages/engine-lightning/src/sdk/env.ts diff --git a/packages/engine-lightning/src/sdks/sdk-lightning/index.ts b/packages/engine-lightning/src/sdk/runner.ts similarity index 99% rename from packages/engine-lightning/src/sdks/sdk-lightning/index.ts rename to packages/engine-lightning/src/sdk/runner.ts index 32565bb5ea..0735152179 100644 --- a/packages/engine-lightning/src/sdks/sdk-lightning/index.ts +++ b/packages/engine-lightning/src/sdk/runner.ts @@ -30,7 +30,7 @@ export const runLightningProject = async () => { const c = getContext(); logDefault('runLightningProject'); const { platform } = c; - const { hosted } = c.program; + const { hosted } = c.program.opts(); const isHosted = hosted && !getConfigProp('bundleAssets'); if (isHosted) { diff --git a/packages/engine-lightning/src/sdks/index.ts b/packages/engine-lightning/src/sdks/index.ts deleted file mode 100644 index 524d4026b4..0000000000 --- a/packages/engine-lightning/src/sdks/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as SDKLightning from './sdk-lightning'; - -export { SDKLightning }; diff --git a/packages/engine-lightning/src/tasks/taskBuild.ts b/packages/engine-lightning/src/tasks/taskBuild.ts index 4b66486cc0..e81dd974e6 100644 --- a/packages/engine-lightning/src/tasks/taskBuild.ts +++ b/packages/engine-lightning/src/tasks/taskBuild.ts @@ -1,40 +1,14 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { buildLightningProject } from '../sdks/sdk-lightning'; +import { RnvTaskName, RnvTaskOptionPresets, createTask } from '@rnv/core'; +import { buildLightningProject } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskBuild: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskBuild', `parent:${parentTask}`); - const { platform } = c; - c.runtime.forceBundleAssets = true; - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.build, originTask); - - if (shouldSkipTask(RnvTaskName.build, originTask)) return true; - - switch (platform) { - case 'tizen': - case 'webos': - await buildLightningProject(); - return; - default: - logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Build project binary', - fn: taskBuild, + fn: async () => { + return buildLightningProject(); + }, task: RnvTaskName.build, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['tizen', 'webos'], -}; - -export default Task; + dependsOn: [RnvTaskName.configure], + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-lightning/src/tasks/taskConfigure.ts b/packages/engine-lightning/src/tasks/taskConfigure.ts index 21e11193fd..efe19d12eb 100644 --- a/packages/engine-lightning/src/tasks/taskConfigure.ts +++ b/packages/engine-lightning/src/tasks/taskConfigure.ts @@ -1,38 +1,14 @@ -import { - logErrorPlatform, - logTask, - executeTask, - RnvTaskFn, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { configureLightningProject } from '../sdks/sdk-lightning'; +import { RnvTaskName, RnvTaskOptionPresets, createTask } from '@rnv/core'; +import { configureLightningProject } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskConfigure'); - - await executeTask(RnvTaskName.platformConfigure, RnvTaskName.configure, originTask); - - if (c.program.only && !!parentTask) { - return true; - } - - switch (c.platform) { - case 'tizen': - case 'webos': - return configureLightningProject(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ + dependsOn: [RnvTaskName.platformConfigure], description: 'Configure current project', - fn: taskConfigure, + fn: async () => { + return configureLightningProject(); + }, task: RnvTaskName.configure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['tizen', 'webos'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-lightning/src/tasks/taskRun.ts b/packages/engine-lightning/src/tasks/taskRun.ts index f0162a0b11..322f022838 100644 --- a/packages/engine-lightning/src/tasks/taskRun.ts +++ b/packages/engine-lightning/src/tasks/taskRun.ts @@ -1,50 +1,15 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - logRaw, - executeOrSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { runLightningProject } from '../sdks/sdk-lightning'; +import { RnvTaskName, RnvTaskOptionPresets, createTask } from '@rnv/core'; +import { runLightningProject } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskRun: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { target } = c.runtime; - const { hosted } = c.program; - logTask('taskRun', `parent:${parentTask} port:${port} target:${target} hosted:${hosted}`); - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.run, originTask); - - switch (platform) { - case 'tizen': - case 'webos': - return runLightningProject(); - default: - return logErrorPlatform(); - } -}; - -const taskRunHelp = async () => { - logRaw(` -More info at: https://renative.org/docs/api-cli -`); -}; - -const Task: RnvTask = { +export default createTask({ + dependsOn: [RnvTaskName.configure], description: 'Run your lightning app on target device or emulator', - fn: taskRun, - fnHelp: taskRunHelp, + fn: async () => { + return runLightningProject(); + }, task: RnvTaskName.run, isPriorityOrder: true, - // dependencies: { - // before: RnvTaskName.configure, - // }, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun())), - platforms: ['tizen', 'webos'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun()), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-electron/.gitignore b/packages/engine-rn-electron/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-rn-electron/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-rn-electron/.npmignore b/packages/engine-rn-electron/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-rn-electron/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-rn-electron/package.json b/packages/engine-rn-electron/package.json index e5a7008366..157d0bf8f9 100644 --- a/packages/engine-rn-electron/package.json +++ b/packages/engine-rn-electron/package.json @@ -37,9 +37,11 @@ "@rnv/sdk-react-native": "1.0.0-rc.12", "@rnv/sdk-utils": "1.0.0-rc.12", "@rnv/sdk-webpack": "1.0.0-rc.12", + "@rnv/adapter": "1.0.0-rc.12", "electron": "26.3.0", "electron-builder": "24.6.4", - "electron-notarize": "1.2.2" + "electron-notarize": "1.2.2", + "metro-react-native-babel-preset": "0.76.8" }, "peerDependencies": { "@rnv/core": "^1.0.0-rc.12" diff --git a/packages/engine-rn-electron/renative.engine.json b/packages/engine-rn-electron/renative.engine.json index 10fa56c4bf..4fbaa59a02 100644 --- a/packages/engine-rn-electron/renative.engine.json +++ b/packages/engine-rn-electron/renative.engine.json @@ -1,6 +1,7 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-rn-electron", + "packageName": "@rnv/engine-rn-electron", "engineExtension": "rne", "overview": "React native based engine with web transpiler provided by react-native-web and native desktop wrapper provided by electron", "plugins": { diff --git a/packages/engine-rn-electron/src/adapter.ts b/packages/engine-rn-electron/src/adapter.ts index 0cc3624f00..c9264b4c9a 100644 --- a/packages/engine-rn-electron/src/adapter.ts +++ b/packages/engine-rn-electron/src/adapter.ts @@ -1,19 +1,13 @@ -import { BabelConfig } from '@rnv/core'; +import { BabelConfig, withBabelPluginModuleResolver } from '@rnv/adapter'; export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { const plugins = cnf?.plugins || []; return { retainLines: true, - presets: [['module:metro-react-native-babel-preset', { useTransformReactJSXExperimental: true }]], + // TODO: determine if this is the best preset for rn-electron as we do not use metro/hermes features in this engine + // presets: [['module:metro-react-native-babel-preset', { useTransformReactJSXExperimental: true }]], + presets: [[require.resolve('metro-react-native-babel-preset'), { useTransformReactJSXExperimental: true }]], ...cnf, - plugins: [ - [ - require.resolve('babel-plugin-module-resolver'), - { - root: [process.env.RNV_MONO_ROOT || '.'], - }, - ], - ...plugins, - ], + plugins: [withBabelPluginModuleResolver(), ...plugins], }; }; diff --git a/packages/engine-rn-electron/src/config.ts b/packages/engine-rn-electron/src/config.ts new file mode 100644 index 0000000000..6eadb226bb --- /dev/null +++ b/packages/engine-rn-electron/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileEngine } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.engine.json'; +export const Config: ConfigFileEngine = CNF; diff --git a/packages/engine-rn-electron/src/getContext.ts b/packages/engine-rn-electron/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-rn-electron/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-rn-electron/src/index.ts b/packages/engine-rn-electron/src/index.ts index a43ccbbc85..1fb6529f34 100644 --- a/packages/engine-rn-electron/src/index.ts +++ b/packages/engine-rn-electron/src/index.ts @@ -1,47 +1,35 @@ -import { generateEngineExtensions, generateEngineTasks, RnvEngine } from '@rnv/core'; -//@ts-ignore -import CNF from '../renative.engine.json'; +import { createRnvEngine, GetContextType } from '@rnv/core'; import taskBuild from './tasks/taskBuild'; import taskConfigure from './tasks/taskConfigure'; import taskExport from './tasks/taskExport'; import taskRun from './tasks/taskRun'; import taskStart from './tasks/taskStart'; import { withRNVBabel } from './adapter'; +import { Config } from './config'; -const Engine: RnvEngine = { - tasks: generateEngineTasks([taskRun, taskBuild, taskConfigure, taskStart, taskExport]), - config: CNF, - projectDirName: '', - serverDirName: '', - // ejectPlatform: null, - runtimeExtraProps: {}, +const Engine = createRnvEngine({ + tasks: [taskRun, taskBuild, taskConfigure, taskStart, taskExport], + config: Config, platforms: { macos: { defaultPort: 8086, isWebHosted: true, - extensions: generateEngineExtensions( - ['macos.desktop', 'desktop', 'macos', 'desktop.web', 'electron', 'web'], - CNF - ), + extensions: ['macos.desktop', 'desktop', 'macos', 'desktop.web', 'electron', 'web'], }, windows: { defaultPort: 8092, isWebHosted: true, - extensions: generateEngineExtensions( - ['windows.desktop', 'desktop', 'windows', 'desktop.web', 'electron', 'web'], - CNF - ), + extensions: ['windows.desktop', 'desktop', 'windows', 'desktop.web', 'electron', 'web'], }, linux: { defaultPort: 8100, isWebHosted: true, - extensions: generateEngineExtensions( - ['linux.desktop', 'desktop', 'linux', 'desktop.web', 'electron', 'web'], - CNF - ), + extensions: ['linux.desktop', 'desktop', 'linux', 'desktop.web', 'electron', 'web'], }, }, -}; +}); + +export type GetContext = GetContextType; export { withRNVBabel }; diff --git a/packages/engine-rn-electron/src/sdk/constants.ts b/packages/engine-rn-electron/src/sdk/constants.ts new file mode 100644 index 0000000000..8d8c8cd58f --- /dev/null +++ b/packages/engine-rn-electron/src/sdk/constants.ts @@ -0,0 +1,3 @@ +import { RnvPlatformKey } from '@rnv/core'; + +export const SdkPlatforms: Array = ['macos', 'windows', 'linux']; diff --git a/packages/engine-rn-electron/src/sdk.ts b/packages/engine-rn-electron/src/sdk/runner.ts similarity index 97% rename from packages/engine-rn-electron/src/sdk.ts rename to packages/engine-rn-electron/src/sdk/runner.ts index 75834d241c..a0fa124700 100644 --- a/packages/engine-rn-electron/src/sdk.ts +++ b/packages/engine-rn-electron/src/sdk/runner.ts @@ -28,9 +28,10 @@ import { getAppFolder, RnvTaskName, getContext, + NpmPackageFile, + RnvFileName, } from '@rnv/core'; import { FileElectronPackage } from './types'; -import { NpmPackageFile } from '@rnv/core/lib/configs/types'; import { checkPortInUse, waitForHost, @@ -84,7 +85,7 @@ const configureProject = (exitOnFail?: boolean) => const platformBuildDir = getAppFolder()!; const bundleAssets = getConfigProp('bundleAssets') === true; const electronConfigPath = path.join(platformBuildDir, 'electronConfig.json'); - const packagePath = path.join(platformBuildDir, 'package.json'); + const packagePath = path.join(platformBuildDir, RnvFileName.package); // If path does not exist for png, try iconset const pngIconPath = path.join(c.paths.appConfig.dir, `assets/${platform}/resources/icon.png`); const appId = getAppId(); @@ -101,7 +102,7 @@ const configureProject = (exitOnFail?: boolean) => reject(`${packagePath} does not exist!`); return; } - const pkgJson = path.join(engine.originalTemplatePlatformsDir!, platform, 'package.json'); + const pkgJson = path.join(engine.originalTemplatePlatformsDir!, platform, RnvFileName.package); const packageJson = readObjectSync(pkgJson) || {}; packageJson.name = `${c.runtime.appId}-${platform}`; @@ -228,7 +229,7 @@ const configureProject = (exitOnFail?: boolean) => // Fix `Cannot compute electron version from installed node modules - none of the possible electron modules are installed.` // See https://github.com/electron-userland/electron-builder/issues/3984#issuecomment-505307933 - const enginePkgJson = path.join(engine.rootPath!, 'package.json'); + const enginePkgJson = path.join(engine.rootPath!, RnvFileName.package); const enginePackageJson = readObjectSync(enginePkgJson); let electronConfig = merge( @@ -266,8 +267,8 @@ const buildElectron = async () => { // workaround: electron-builder fails export in npx mode due to trying install node_modules. we trick it not to do that mkdirSync(path.join(platformBuildDir, 'build', 'node_modules')); - const packagePathSrc = path.join(platformBuildDir, 'package.json'); - const packagePathDest = path.join(platformBuildDir, 'build', 'package.json'); + const packagePathSrc = path.join(platformBuildDir, RnvFileName.package); + const packagePathDest = path.join(platformBuildDir, 'build', RnvFileName.package); copyFileSync(packagePathSrc, packagePathDest); const mainPathSrc = path.join(platformBuildDir, 'main.js'); diff --git a/packages/engine-rn-electron/src/types.ts b/packages/engine-rn-electron/src/sdk/types.ts similarity index 57% rename from packages/engine-rn-electron/src/types.ts rename to packages/engine-rn-electron/src/sdk/types.ts index b3124d708b..fddf0a6905 100644 --- a/packages/engine-rn-electron/src/types.ts +++ b/packages/engine-rn-electron/src/sdk/types.ts @@ -1,4 +1,4 @@ -import { NpmPackageFile } from '@rnv/core/lib/configs/types'; +import { NpmPackageFile } from '@rnv/core'; export type FileElectronPackage = NpmPackageFile & { productName?: string; diff --git a/packages/engine-rn-electron/src/tasks/taskBuild.ts b/packages/engine-rn-electron/src/tasks/taskBuild.ts index 271483148c..ad812e299c 100644 --- a/packages/engine-rn-electron/src/tasks/taskBuild.ts +++ b/packages/engine-rn-electron/src/tasks/taskBuild.ts @@ -1,40 +1,14 @@ -import { - RnvTaskFn, - logTask, - logErrorPlatform, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { buildElectron } from '../sdk'; +import { createTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; +import { buildElectron } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskBuild: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskBuild', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.build, originTask); - - if (shouldSkipTask(RnvTaskName.build, originTask)) return true; - - switch (platform) { - case 'macos': - case 'windows': - case 'linux': - await buildElectron(); - return; - default: - logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Build project binary', - fn: taskBuild, + dependsOn: [RnvTaskName.configure], + fn: async () => { + return buildElectron(); + }, task: RnvTaskName.build, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos', 'windows', 'linux'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-electron/src/tasks/taskConfigure.ts b/packages/engine-rn-electron/src/tasks/taskConfigure.ts index 5fadfdea33..6780011869 100644 --- a/packages/engine-rn-electron/src/tasks/taskConfigure.ts +++ b/packages/engine-rn-electron/src/tasks/taskConfigure.ts @@ -1,48 +1,15 @@ -import { - RnvTaskFn, - logErrorPlatform, - copySharedPlatforms, - logTask, - executeTask, - shouldSkipTask, - configureEntryPoint, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { configureElectronProject } from '../sdk'; +import { copySharedPlatforms, createTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; +import { configureElectronProject } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskConfigure'); - - await executeTask(RnvTaskName.platformConfigure, RnvTaskName.configure, originTask); - - if (shouldSkipTask(RnvTaskName.configure, originTask)) return true; - - await configureEntryPoint(c.platform); - - await copySharedPlatforms(); - - if (c.program.only && !!parentTask) { - return true; - } - - switch (c.platform) { - case 'macos': - case 'windows': - case 'linux': - return configureElectronProject(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Configure current project', - fn: taskConfigure, + dependsOn: [RnvTaskName.platformConfigure], + fn: async () => { + await copySharedPlatforms(); + return configureElectronProject(); + }, task: RnvTaskName.configure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos', 'windows', 'linux'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-electron/src/tasks/taskExport.ts b/packages/engine-rn-electron/src/tasks/taskExport.ts index 9b49a9cff3..6b4dec6268 100644 --- a/packages/engine-rn-electron/src/tasks/taskExport.ts +++ b/packages/engine-rn-electron/src/tasks/taskExport.ts @@ -1,39 +1,14 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { exportElectron } from '../sdk'; +import { createTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; +import { exportElectron } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskExport: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskExport', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.build, RnvTaskName.export, originTask); - - if (shouldSkipTask(RnvTaskName.export, originTask)) return true; - - switch (platform) { - case 'macos': - case 'windows': - case 'linux': - return exportElectron(); - default: - logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Export the app into deployable binary', - fn: taskExport, + dependsOn: [RnvTaskName.build], + fn: async () => { + return exportElectron(); + }, task: RnvTaskName.export, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos', 'windows', 'linux'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-electron/src/tasks/taskRun.ts b/packages/engine-rn-electron/src/tasks/taskRun.ts index 9dedcbf054..d60fce2a31 100644 --- a/packages/engine-rn-electron/src/tasks/taskRun.ts +++ b/packages/engine-rn-electron/src/tasks/taskRun.ts @@ -1,43 +1,15 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { runElectron } from '../sdk'; +import { createTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; +import { runElectron } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskRun: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { target } = c.runtime; - const { hosted } = c.program; - logTask('taskRun', `parent:${parentTask} port:${port} target:${target} hosted:${hosted}`); - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.run, originTask); - - if (shouldSkipTask(RnvTaskName.run, originTask)) return true; - - switch (platform) { - case 'macos': - case 'windows': - case 'linux': - return runElectron(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Run your electron app on your machine', - fn: taskRun, + dependsOn: [RnvTaskName.configure], + fn: async () => { + return runElectron(); + }, task: RnvTaskName.run, isPriorityOrder: true, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun())), - platforms: ['macos', 'windows', 'linux'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun()), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-electron/src/tasks/taskStart.ts b/packages/engine-rn-electron/src/tasks/taskStart.ts index cd61ec490d..949b6e5413 100644 --- a/packages/engine-rn-electron/src/tasks/taskStart.ts +++ b/packages/engine-rn-electron/src/tasks/taskStart.ts @@ -1,52 +1,14 @@ import { runWebpackServer } from '@rnv/sdk-webpack'; -import { - RnvTaskFn, - logErrorPlatform, - logTask, - logError, - RnvTaskOptionPresets, - executeTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { openBrowser, waitForHost } from '@rnv/sdk-utils'; +import { RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { SdkPlatforms } from '../sdk/constants'; -const taskStart: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { hosted } = c.program; - - logTask('taskStart', `parent:${parentTask} port:${c.runtime.port} hosted:${!!hosted}`); - - if (hosted) { - waitForHost('') - .then(() => openBrowser(`http://${c.runtime.localhost}:${port}/`)) - .catch(logError); - } - - if (!parentTask) { - await executeTask(RnvTaskName.configure, RnvTaskName.start, originTask); - } - - if (shouldSkipTask(RnvTaskName.start, originTask)) return true; - - switch (platform) { - case 'macos': - case 'windows': - case 'linux': - return runWebpackServer(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Starts bundler / server', - fn: taskStart, + dependsOn: [RnvTaskName.configure], + fn: async () => { + return runWebpackServer(); + }, task: RnvTaskName.start, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos', 'windows', 'linux'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-macos/.gitignore b/packages/engine-rn-macos/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-rn-macos/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-rn-macos/.npmignore b/packages/engine-rn-macos/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-rn-macos/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-rn-macos/package.json b/packages/engine-rn-macos/package.json index e5039cdd04..4f5ff01082 100644 --- a/packages/engine-rn-macos/package.json +++ b/packages/engine-rn-macos/package.json @@ -34,7 +34,8 @@ "dependencies": { "@react-native/babel-preset": "0.73.21", "@rnv/sdk-apple": "1.0.0-rc.12", - "@rnv/sdk-react-native": "1.0.0-rc.12" + "@rnv/sdk-react-native": "1.0.0-rc.12", + "@rnv/adapter": "1.0.0-rc.12" }, "peerDependencies": { "@rnv/core": "^1.0.0-rc.12" diff --git a/packages/engine-rn-macos/renative.engine.json b/packages/engine-rn-macos/renative.engine.json index 04a93fff55..80816f4311 100644 --- a/packages/engine-rn-macos/renative.engine.json +++ b/packages/engine-rn-macos/renative.engine.json @@ -1,6 +1,7 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-rn-macos", + "packageName": "@rnv/engine-rn-macos", "engineExtension": "rnm", "overview": "React native based engine with react-native-macos extension which adds support for macOS platform.", "plugins": { diff --git a/packages/engine-rn-macos/src/adapters/babelAdapter.ts b/packages/engine-rn-macos/src/adapters/babelAdapter.ts index 69ce237bba..9943fe5742 100644 --- a/packages/engine-rn-macos/src/adapters/babelAdapter.ts +++ b/packages/engine-rn-macos/src/adapters/babelAdapter.ts @@ -1,4 +1,4 @@ -import { BabelConfig } from '@rnv/core'; +import { BabelConfig, withBabelPluginModuleResolver } from '@rnv/adapter'; export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { const plugins = cnf?.plugins || []; @@ -7,14 +7,6 @@ export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { retainLines: true, presets: ['module:@react-native/babel-preset'], ...cnf, - plugins: [ - [ - require.resolve('babel-plugin-module-resolver'), - { - root: [process.env.RNV_MONO_ROOT || '.'], - }, - ], - ...plugins, - ], + plugins: [withBabelPluginModuleResolver(), ...plugins], }; }; diff --git a/packages/engine-rn-macos/src/config.ts b/packages/engine-rn-macos/src/config.ts new file mode 100644 index 0000000000..6eadb226bb --- /dev/null +++ b/packages/engine-rn-macos/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileEngine } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.engine.json'; +export const Config: ConfigFileEngine = CNF; diff --git a/packages/engine-rn-macos/src/getContext.ts b/packages/engine-rn-macos/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-rn-macos/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-rn-macos/src/index.ts b/packages/engine-rn-macos/src/index.ts index 890c5f226d..2278c5c038 100644 --- a/packages/engine-rn-macos/src/index.ts +++ b/packages/engine-rn-macos/src/index.ts @@ -1,19 +1,14 @@ -import { generateEngineExtensions, generateEngineTasks, RnvEngine } from '@rnv/core'; +import { createRnvEngine, GetContextType } from '@rnv/core'; import { withRNVMetro } from './adapters/metroAdapter'; import { withRNVBabel } from './adapters/babelAdapter'; -//@ts-ignore -import CNF from '../renative.engine.json'; -import taskRun from './tasks/taskRun'; -import taskPackage from './tasks/taskPackage'; -import taskBuild from './tasks/taskBuild'; -import taskConfigure from './tasks/taskConfigure'; -import taskStart from './tasks/taskStart'; -import taskExport from './tasks/taskExport'; +import { Tasks as TasksSdkApple } from '@rnv/sdk-apple'; +import { Tasks as TasksSdkReactNative } from '@rnv/sdk-react-native'; import { withRNVRNConfig } from '@rnv/sdk-react-native'; +import { Config } from './config'; -const Engine: RnvEngine = { - tasks: generateEngineTasks([taskRun, taskPackage, taskBuild, taskConfigure, taskStart, taskExport]), - config: CNF, +const Engine = createRnvEngine({ + tasks: [...TasksSdkApple, ...TasksSdkReactNative], + config: Config, runtimeExtraProps: { reactNativePackageName: 'react-native', reactNativeMetroConfigName: 'metro.config.js', @@ -24,13 +19,12 @@ const Engine: RnvEngine = { platforms: { macos: { defaultPort: 8086, - extensions: generateEngineExtensions( - ['macos.desktop', 'desktop', 'macos', 'desktop.native', 'native'], - CNF - ), + extensions: ['macos.desktop', 'desktop', 'macos', 'desktop.native', 'native'], }, }, -}; +}); + +export type GetContext = GetContextType; export { withRNVMetro, withRNVBabel, withRNVRNConfig }; diff --git a/packages/engine-rn-macos/src/tasks/taskBuild.ts b/packages/engine-rn-macos/src/tasks/taskBuild.ts deleted file mode 100644 index b4ee9e9bce..0000000000 --- a/packages/engine-rn-macos/src/tasks/taskBuild.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { buildXcodeProject } from '@rnv/sdk-apple'; - -const taskBuild: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskBuild'); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.package, RnvTaskName.build, originTask); - - if (shouldSkipTask(RnvTaskName.build, originTask)) return true; - - switch (platform) { - case 'macos': - if (parentTask === RnvTaskName.export) { - // build task is not necessary when exporting macos - return true; - } - return buildXcodeProject(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Build project binary', - fn: taskBuild, - task: RnvTaskName.build, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos'], -}; - -export default Task; diff --git a/packages/engine-rn-macos/src/tasks/taskConfigure.ts b/packages/engine-rn-macos/src/tasks/taskConfigure.ts deleted file mode 100644 index bbf64953f6..0000000000 --- a/packages/engine-rn-macos/src/tasks/taskConfigure.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeTask, - shouldSkipTask, - configureEntryPoint, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { configureXcodeProject } from '@rnv/sdk-apple'; - -const taskConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskConfigure'); - - await executeTask(RnvTaskName.platformConfigure, RnvTaskName.configure, originTask); - if (shouldSkipTask(RnvTaskName.configure, originTask)) return true; - - await configureEntryPoint(c.platform); - - if (c.program.only && !!parentTask) { - return true; - } - - switch (c.platform) { - case 'macos': - await configureXcodeProject(); - return true; - default: - await logErrorPlatform(); - return true; - } -}; - -const Task: RnvTask = { - description: 'Configure current project', - fn: taskConfigure, - task: RnvTaskName.configure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos'], -}; - -export default Task; diff --git a/packages/engine-rn-macos/src/tasks/taskExport.ts b/packages/engine-rn-macos/src/tasks/taskExport.ts deleted file mode 100644 index 39cf506e2f..0000000000 --- a/packages/engine-rn-macos/src/tasks/taskExport.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { exportXcodeProject } from '@rnv/sdk-apple'; - -const taskExport: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskExport', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.build, RnvTaskName.export, originTask); - - if (shouldSkipTask(RnvTaskName.export, originTask)) return true; - - switch (platform) { - case 'macos': - return exportXcodeProject(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Export the app into deployable binary', - fn: taskExport, - task: RnvTaskName.export, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos'], -}; - -export default Task; diff --git a/packages/engine-rn-macos/src/tasks/taskPackage.ts b/packages/engine-rn-macos/src/tasks/taskPackage.ts deleted file mode 100644 index 48e9f0c3d0..0000000000 --- a/packages/engine-rn-macos/src/tasks/taskPackage.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - getConfigProp, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { packageBundleForXcode } from '@rnv/sdk-apple'; - -const taskPackage: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskPackage', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.package, originTask); - - const bundleAssets = getConfigProp('bundleAssets'); - - if (!bundleAssets) { - return true; - } - - if (shouldSkipTask(RnvTaskName.package, originTask)) return true; - - switch (platform) { - case 'macos': - return packageBundleForXcode(); - default: - logErrorPlatform(); - return false; - } -}; - -const Task: RnvTask = { - description: 'Package source files into bundle', - fn: taskPackage, - task: RnvTaskName.package, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos'], -}; - -export default Task; diff --git a/packages/engine-rn-macos/src/tasks/taskRun.ts b/packages/engine-rn-macos/src/tasks/taskRun.ts deleted file mode 100644 index 4a28888851..0000000000 --- a/packages/engine-rn-macos/src/tasks/taskRun.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - RnvTaskFn, - getConfigProp, - logErrorPlatform, - logTask, - logSummary, - logRaw, - RnvTaskOptionPresets, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { runXcodeProject } from '@rnv/sdk-apple'; -import { startBundlerIfRequired, waitForBundlerIfRequired } from '@rnv/sdk-react-native'; - -const taskRun: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { target } = c.runtime; - const { hosted } = c.program; - logTask('taskRun', `parent:${parentTask} port:${port} target:${target} hosted:${hosted}`); - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.run, originTask); - - if (shouldSkipTask(RnvTaskName.run, originTask)) return true; - - const bundleAssets = getConfigProp('bundleAssets', false); - - switch (platform) { - case 'macos': - if (!c.program.only) { - await startBundlerIfRequired(RnvTaskName.run, originTask); - await runXcodeProject(); - if (!bundleAssets) { - logSummary('BUNDLER STARTED'); - } - return waitForBundlerIfRequired(); - } - return runXcodeProject(); - default: - return logErrorPlatform(); - } -}; - -const taskRunHelp = async () => { - logRaw(` -More info at: https://renative.org/docs/api-cli -`); -}; - -const Task: RnvTask = { - description: 'Run your macos app on target device or emulator', - fn: taskRun, - fnHelp: taskRunHelp, - task: RnvTaskName.run, - isPriorityOrder: true, - // dependencies: { - // before: RnvTaskName.configure, - // }, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun())), - platforms: ['macos'], -}; - -export default Task; diff --git a/packages/engine-rn-macos/src/tasks/taskStart.ts b/packages/engine-rn-macos/src/tasks/taskStart.ts deleted file mode 100644 index 309aba751b..0000000000 --- a/packages/engine-rn-macos/src/tasks/taskStart.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - doResolve, - logErrorPlatform, - executeTask, - shouldSkipTask, - logTask, - logError, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - PlatformKey, - RnvTaskName, -} from '@rnv/core'; -import { startReactNative } from '@rnv/sdk-react-native'; - -const BUNDLER_PLATFORMS: Partial> = {}; - -BUNDLER_PLATFORMS['macos'] = 'macos'; - -const taskStart: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { hosted } = c.program; - - logTask('taskStart', `parent:${parentTask} port:${c.runtime.port} hosted:${!!hosted}`); - - if (hosted) { - return logError('This platform does not support hosted mode', true); - } - // Disable reset for other commands (ie. cleaning platforms) - c.runtime.disableReset = true; - if (!parentTask) { - await executeTask(RnvTaskName.configureSoft, RnvTaskName.start, originTask); - } - - if (shouldSkipTask(RnvTaskName.start, originTask)) return true; - - switch (platform) { - case 'macos': { - return startReactNative({ - waitForBundler: !parentTask, - customCliPath: `${doResolve('react-native')}/local-cli/cli.js`, - metroConfigName: 'metro.config.rnm.js', - }); - } - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Starts bundler / server', - fn: taskStart, - task: RnvTaskName.start, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['macos'], -}; - -export default Task; diff --git a/packages/engine-rn-macos/templates/platforms/macos/.gitignore b/packages/engine-rn-macos/templates/platforms/macos/.gitignore deleted file mode 100644 index 3e8cc2aec8..0000000000 --- a/packages/engine-rn-macos/templates/platforms/macos/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# CocoaPods -Pods/ diff --git a/packages/engine-rn-next/.gitignore b/packages/engine-rn-next/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-rn-next/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-rn-next/.npmignore b/packages/engine-rn-next/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-rn-next/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-rn-next/package.json b/packages/engine-rn-next/package.json index 4f445153a5..297f82570f 100644 --- a/packages/engine-rn-next/package.json +++ b/packages/engine-rn-next/package.json @@ -36,7 +36,8 @@ "@rnv/sdk-utils": "1.0.0-rc.12", "babel-preset-expo": "9.5.2", "next-fonts": "1.5.1", - "next-images": "1.8.4" + "next-images": "1.8.4", + "@rnv/adapter": "1.0.0-rc.12" }, "peerDependencies": { "@rnv/core": "^1.0.0-rc.12", diff --git a/packages/engine-rn-next/renative.engine.json b/packages/engine-rn-next/renative.engine.json index d66bacd7d7..c7c5f5e159 100644 --- a/packages/engine-rn-next/renative.engine.json +++ b/packages/engine-rn-next/renative.engine.json @@ -1,6 +1,7 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-rn-next", + "packageName": "@rnv/engine-rn-next", "engineExtension": "rnx", "overview": "React native based engine with web transpiler provided by react-native-web and render by nextjs", "plugins": { diff --git a/packages/engine-rn-next/src/adapters/babelAdapter.ts b/packages/engine-rn-next/src/adapters/babelAdapter.ts index af2ea79f70..7f6afcb57b 100644 --- a/packages/engine-rn-next/src/adapters/babelAdapter.ts +++ b/packages/engine-rn-next/src/adapters/babelAdapter.ts @@ -1,4 +1,4 @@ -import { BabelConfig } from '@rnv/core'; +import { BabelConfig, withBabelPluginModuleResolver } from '@rnv/adapter'; export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { const plugins = cnf?.plugins || []; @@ -17,14 +17,6 @@ export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { ], ], ...cnf, - plugins: [ - [ - require.resolve('babel-plugin-module-resolver'), - { - root: [process.env.RNV_MONO_ROOT || '.'], - }, - ], - ...plugins, - ], + plugins: [withBabelPluginModuleResolver(), ...plugins], }; }; diff --git a/packages/engine-rn-next/src/adapters/nextAdapter.ts b/packages/engine-rn-next/src/adapters/nextAdapter.ts index 83edbcab5e..a9d6e064d8 100644 --- a/packages/engine-rn-next/src/adapters/nextAdapter.ts +++ b/packages/engine-rn-next/src/adapters/nextAdapter.ts @@ -3,7 +3,7 @@ const withFonts = require('next-fonts'); import { Configuration, DefinePlugin } from 'webpack'; import { NextConfig } from 'next'; -export function withRNWNext(nextConfig: NextConfig = {}): NextConfig { +function _withRNWNext(nextConfig: NextConfig = {}): NextConfig { return { ...nextConfig, webpack(config: Configuration, options: any): Configuration { @@ -90,7 +90,7 @@ export const withRNVNext = (config: NextConfig) => { let transModules: string[] = []; - const cnf1 = withRNWNext(withFonts(withImages(cnf))); + const cnf1 = _withRNWNext(withFonts(withImages(cnf))); if (process.env.RNV_EXTENSIONS) { cnf1.pageExtensions = process.env.RNV_EXTENSIONS.split(','); diff --git a/packages/engine-rn-next/src/config.ts b/packages/engine-rn-next/src/config.ts new file mode 100644 index 0000000000..6eadb226bb --- /dev/null +++ b/packages/engine-rn-next/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileEngine } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.engine.json'; +export const Config: ConfigFileEngine = CNF; diff --git a/packages/engine-rn-next/src/constants.ts b/packages/engine-rn-next/src/constants.ts deleted file mode 100644 index 2fafba5c5e..0000000000 --- a/packages/engine-rn-next/src/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const NEXT_CONFIG_NAME = 'next.config.js'; diff --git a/packages/engine-rn-next/src/getContext.ts b/packages/engine-rn-next/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-rn-next/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-rn-next/src/index.ts b/packages/engine-rn-next/src/index.ts index 550ab679ba..03fe18bbe0 100644 --- a/packages/engine-rn-next/src/index.ts +++ b/packages/engine-rn-next/src/index.ts @@ -1,36 +1,31 @@ -import { generateEngineExtensions, generateEngineTasks, RnvEngine } from '@rnv/core'; +import { createRnvEngine, GetContextType } from '@rnv/core'; import { withRNVNext } from './adapters/nextAdapter'; import { withRNVBabel } from './adapters/babelAdapter'; -//@ts-ignore -import CNF from '../renative.engine.json'; import taskRun from './tasks/taskRun'; import taskBuild from './tasks/taskBuild'; import taskConfigure from './tasks/taskConfigure'; import taskStart from './tasks/taskStart'; import taskExport from './tasks/taskExport'; +import { Config } from './config'; -const Engine: RnvEngine = { - tasks: generateEngineTasks([taskRun, taskBuild, taskConfigure, taskStart, taskExport]), - config: CNF, - projectDirName: '', - runtimeExtraProps: {}, - serverDirName: '', +const Engine = createRnvEngine({ + tasks: [taskRun, taskBuild, taskConfigure, taskStart, taskExport], + config: Config, platforms: { web: { defaultPort: 8080, isWebHosted: true, - extensions: generateEngineExtensions( - ['web.browser', 'browser', 'server.next', 'server.web', 'next', 'browser.web', 'web'], - CNF - ), + extensions: ['web.browser', 'browser', 'server.next', 'server.web', 'next', 'browser.web', 'web'], }, chromecast: { defaultPort: 8095, isWebHosted: true, - extensions: generateEngineExtensions(['chromecast.tv', 'web.tv', 'tv', 'chromecast', 'tv.web', 'web'], CNF), + extensions: ['chromecast.tv', 'web.tv', 'tv', 'chromecast', 'tv.web', 'web'], }, }, -}; +}); + +export type GetContext = GetContextType; export { withRNVNext, withRNVBabel }; diff --git a/packages/engine-rn-next/src/sdk/constants.ts b/packages/engine-rn-next/src/sdk/constants.ts new file mode 100644 index 0000000000..26478ffb70 --- /dev/null +++ b/packages/engine-rn-next/src/sdk/constants.ts @@ -0,0 +1,3 @@ +import { RnvPlatformKey } from '@rnv/core'; + +export const SdkPlatforms: Array = ['web', 'chromecast']; diff --git a/packages/engine-rn-next/src/env.ts b/packages/engine-rn-next/src/sdk/env.ts similarity index 98% rename from packages/engine-rn-next/src/env.ts rename to packages/engine-rn-next/src/sdk/env.ts index 4ed491a446..0df661cc36 100644 --- a/packages/engine-rn-next/src/env.ts +++ b/packages/engine-rn-next/src/sdk/env.ts @@ -1,6 +1,6 @@ import { chalk, fsExistsSync, getConfigProp, getContext, logWarning, parsePlugins } from '@rnv/core'; import path from 'path'; -import { getExportDir } from './sdk'; +import { getExportDir } from './runner'; export const EnvVars = { RNV_NEXT_TRANSPILE_MODULES: () => { diff --git a/packages/engine-rn-next/src/sdk.ts b/packages/engine-rn-next/src/sdk/runner.ts similarity index 92% rename from packages/engine-rn-next/src/sdk.ts rename to packages/engine-rn-next/src/sdk/runner.ts index cc847685e9..63a9db0007 100644 --- a/packages/engine-rn-next/src/sdk.ts +++ b/packages/engine-rn-next/src/sdk/runner.ts @@ -65,7 +65,7 @@ export const runWebNext = async () => { await _runWebBrowser(devServerHost, port, false); if (!bundleAssets) { - logSummary('BUNDLER STARTED'); + logSummary({ header: 'BUNDLER STARTED' }); } await runWebDevServer(c); } else { @@ -74,7 +74,7 @@ export const runWebNext = async () => { if (resetCompleted) { await _runWebBrowser(devServerHost, port, false); if (!bundleAssets) { - logSummary('BUNDLER STARTED'); + logSummary({ header: 'BUNDLER STARTED' }); } await runWebDevServer(c); } else { @@ -88,11 +88,13 @@ const _runWebBrowser = (devServerHost: string, port: number, alreadyStarted: boo const c = getContext(); logDefault('_runWebBrowser', `ip:${devServerHost} port:${port} openBrowser:${!!c.runtime.shouldOpenBrowser}`); if (!c.runtime.shouldOpenBrowser) return resolve(); - const wait = waitForHost('') + const wait = waitForHost('', { maxAttempts: 10, checkInterval: 1000 }) .then(() => { openBrowser(`http://${devServerHost}:${port}/`); }) .catch((e) => { + // Let's opent the browser anyway as sometimes we get timeout waiting for next to compile + openBrowser(`http://${devServerHost}:${port}/`); logWarning(e); }); if (alreadyStarted) return wait; // if it's already started, return the promise so it rnv will wait, otherwise it will exit before opening the browser @@ -137,7 +139,7 @@ Dev server running at: ${url} `); const bundleAssets = getConfigProp('bundleAssets', false); - const opts = !c.program?.json + const opts = !c.program?.opts()?.json ? ExecOptionsPresets.INHERIT_OUTPUT_NO_SPINNER : ExecOptionsPresets.SPINNER_FULL_ERROR_SUMMARY; return executeAsync(`npx next ${bundleAssets ? 'start' : 'dev'} --port ${c.runtime.port}`, { diff --git a/packages/engine-rn-next/src/tasks/taskBuild.ts b/packages/engine-rn-next/src/tasks/taskBuild.ts index d59544630a..d86b2ed4ad 100644 --- a/packages/engine-rn-next/src/tasks/taskBuild.ts +++ b/packages/engine-rn-next/src/tasks/taskBuild.ts @@ -1,43 +1,14 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { buildWebNext } from '../sdk'; +import { RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { buildWebNext } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskBuild: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskBuild', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.build, originTask); - - if (shouldSkipTask(RnvTaskName.build, originTask)) return true; - - switch (platform) { - case 'web': - case 'chromecast': - if (parentTask === RnvTaskName.export) { - // build task is not necessary when exporting. They do the same thing, only difference is a next.config.js config flag - return true; - } - await buildWebNext(); - return; - default: - logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Build project binary', - fn: taskBuild, + dependsOn: [RnvTaskName.configure], + fn: async () => { + await buildWebNext(); + }, task: RnvTaskName.build, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['web', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-next/src/tasks/taskConfigure.ts b/packages/engine-rn-next/src/tasks/taskConfigure.ts index 8bbf32fc51..6a699176e9 100644 --- a/packages/engine-rn-next/src/tasks/taskConfigure.ts +++ b/packages/engine-rn-next/src/tasks/taskConfigure.ts @@ -1,41 +1,14 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { configureNextIfRequired } from '../sdk'; +import { RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { configureNextIfRequired } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskConfigure'); - - await executeTask(RnvTaskName.platformConfigure, RnvTaskName.configure, originTask); - - if (shouldSkipTask(RnvTaskName.configure, originTask)) return true; - - if (c.program.only && !!parentTask) { - return true; - } - - switch (c.platform) { - case 'web': - case 'chromecast': - return configureNextIfRequired(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Configure current project', - fn: taskConfigure, + dependsOn: [RnvTaskName.platformConfigure], + fn: async () => { + return configureNextIfRequired(); + }, task: RnvTaskName.configure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['web', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-next/src/tasks/taskExport.ts b/packages/engine-rn-next/src/tasks/taskExport.ts index 89c1977d70..87ae6ffaa5 100644 --- a/packages/engine-rn-next/src/tasks/taskExport.ts +++ b/packages/engine-rn-next/src/tasks/taskExport.ts @@ -1,38 +1,14 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - shouldSkipTask, - executeOrSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { exportWebNext } from '../sdk'; +import { RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { exportWebNext } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskExport: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskExport', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.build, RnvTaskName.export, originTask); - - if (shouldSkipTask(RnvTaskName.export, originTask)) return true; - - switch (platform) { - case 'web': - case 'chromecast': - return exportWebNext(); - default: - logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Export the app into deployable binary', - fn: taskExport, + dependsOn: [RnvTaskName.configure], + fn: async () => { + return exportWebNext(); + }, task: RnvTaskName.export, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['web', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-next/src/tasks/taskRun.ts b/packages/engine-rn-next/src/tasks/taskRun.ts index 48862ffd5f..8fff1086ee 100644 --- a/packages/engine-rn-next/src/tasks/taskRun.ts +++ b/packages/engine-rn-next/src/tasks/taskRun.ts @@ -1,40 +1,16 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { runWebNext } from '../sdk'; +import { RnvTaskOptionPresets, RnvTaskName, createTask } from '@rnv/core'; +import { runWebNext } from '../sdk/runner'; +import { SdkPlatforms } from '../sdk/constants'; -const taskRun: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - logTask('taskRun', `parent:${parentTask}`); - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.run, originTask); - - if (shouldSkipTask(RnvTaskName.run, originTask)) return true; - - switch (platform) { - case 'web': - case 'chromecast': - c.runtime.shouldOpenBrowser = true; - return runWebNext(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Run your app in browser', - fn: taskRun, + dependsOn: [RnvTaskName.configure], + fn: async ({ ctx }) => { + ctx.runtime.shouldOpenBrowser = true; + return runWebNext(); + }, task: RnvTaskName.run, isPriorityOrder: true, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun())), - platforms: ['web', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun()), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-next/src/tasks/taskStart.ts b/packages/engine-rn-next/src/tasks/taskStart.ts index a04d81fdd6..e5977b3082 100644 --- a/packages/engine-rn-next/src/tasks/taskStart.ts +++ b/packages/engine-rn-next/src/tasks/taskStart.ts @@ -1,55 +1,19 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - logError, - RnvTaskOptionPresets, - executeTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { runWebNext } from '../sdk'; +import { logError, RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { runWebNext } from '../sdk/runner'; import { openBrowser, waitForHost } from '@rnv/sdk-utils'; +import { SdkPlatforms } from '../sdk/constants'; -const taskStart: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { hosted } = c.program; - - logTask('taskStart', `parent:${parentTask} port:${c.runtime.port} hosted:${!!hosted}`); - - if (hosted) { +export default createTask({ + description: 'Starts bundler / server', + dependsOn: [RnvTaskName.configure], + fn: async ({ ctx }) => { + const { localhost, port } = ctx.runtime; waitForHost() - .then(() => openBrowser(`http://${c.runtime.localhost}:${port}/`)) + .then(() => openBrowser(`http://${localhost}:${port}/`)) .catch(logError); - } - - if (!parentTask) { - await executeTask(RnvTaskName.configure, RnvTaskName.start, originTask); - } - - if (shouldSkipTask(RnvTaskName.start, originTask)) return true; - - if (hosted) { - return logError('This platform does not support hosted mode', true); - } - switch (platform) { - case 'web': - case 'chromecast': - c.runtime.shouldOpenBrowser = false; - return runWebNext(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Starts bundler / server', - fn: taskStart, + return runWebNext(); + }, task: RnvTaskName.start, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['web', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-tvos/.gitignore b/packages/engine-rn-tvos/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-rn-tvos/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-rn-tvos/.npmignore b/packages/engine-rn-tvos/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-rn-tvos/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-rn-tvos/package.json b/packages/engine-rn-tvos/package.json index 29a9fd1aee..a92a45f3ee 100644 --- a/packages/engine-rn-tvos/package.json +++ b/packages/engine-rn-tvos/package.json @@ -35,7 +35,8 @@ "@react-native/babel-preset": "0.73.21", "@rnv/sdk-android": "1.0.0-rc.12", "@rnv/sdk-apple": "1.0.0-rc.12", - "@rnv/sdk-react-native": "1.0.0-rc.12" + "@rnv/sdk-react-native": "1.0.0-rc.12", + "@rnv/adapter": "1.0.0-rc.12" }, "peerDependencies": { "@rnv/core": "^1.0.0-rc.12", diff --git a/packages/engine-rn-tvos/renative.engine.json b/packages/engine-rn-tvos/renative.engine.json index 53f5a92c1e..d4880b1325 100644 --- a/packages/engine-rn-tvos/renative.engine.json +++ b/packages/engine-rn-tvos/renative.engine.json @@ -1,8 +1,8 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-rn-tvos", + "packageName": "@rnv/engine-rn-tvos", "engineExtension": "rntvos", - "extends": "engine-rn", "overview": "React native based engine with added support for tvOS platform. Runs standard react native apps with native support", "plugins": { "react": "source:rnv", diff --git a/packages/engine-rn-tvos/src/adapters/babelAdapter.ts b/packages/engine-rn-tvos/src/adapters/babelAdapter.ts index 85579d8ef5..e0a0d1b844 100644 --- a/packages/engine-rn-tvos/src/adapters/babelAdapter.ts +++ b/packages/engine-rn-tvos/src/adapters/babelAdapter.ts @@ -1,4 +1,4 @@ -import { BabelConfig } from '@rnv/core'; +import { BabelConfig, withBabelPluginModuleResolver } from '@rnv/adapter'; export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { const plugins = cnf?.plugins || []; @@ -8,15 +8,23 @@ export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { presets: ['module:@react-native/babel-preset'], ...cnf, plugins: [ - [ - require.resolve('babel-plugin-module-resolver'), - { - root: [process.env.RNV_MONO_ROOT], - alias: { - 'react-native': 'react-native-tvos', - }, + withBabelPluginModuleResolver({ + alias: { + 'react-native': 'react-native-tvos', + // '^react-native/(.+)': 'react-native-tvos/\\1', + 'react-native/Libraries/Utilities/codegenNativeComponent': + 'react-native-tvos/Libraries/Utilities/codegenNativeComponent', + 'react-native/Libraries/Types/CodegenTypes': 'react-native-tvos/Libraries/Types/CodegenTypes', + 'react-native/Libraries/Components/ScrollView/ScrollView': + 'react-native-tvos/Libraries/Components/ScrollView/ScrollView', + 'react-native/Libraries/StyleSheet/flattenStyle': + 'react-native-tvos/Libraries/StyleSheet/flattenStyle', + 'react-native/Libraries/Pressability/PressabilityDebug': + 'react-native-tvos/Libraries/StyleSheet/flattenStyle', + 'react-native/Libraries/Pressability/Pressability': + 'react-native-tvos/Libraries/StyleSheet/flattenStyle', }, - ], + }), ...plugins, ], }; diff --git a/packages/engine-rn-tvos/src/adapters/metroAdapter.ts b/packages/engine-rn-tvos/src/adapters/metroAdapter.ts index 5e5d3ee7bb..fddcdf2e6e 100644 --- a/packages/engine-rn-tvos/src/adapters/metroAdapter.ts +++ b/packages/engine-rn-tvos/src/adapters/metroAdapter.ts @@ -69,6 +69,17 @@ export const withRNVMetro = (config: InputConfig) => { assetRegistryPath: path.resolve(`${doResolve('react-native-tvos')}/Libraries/Image/AssetRegistry.js`), }, resolver: { + resolveRequest: (context, moduleName, platform) => { + if (moduleName.startsWith('react-native/')) { + return context.resolveRequest( + context, + moduleName.replace('react-native/', 'react-native-tvos/'), + platform + ); + } + // Optionally, chain to the standard Metro resolver. + return context.resolveRequest(context, moduleName, platform); + }, blacklistRE: blacklist([ /platformBuilds\/.*/, /buildHooks\/.*/, diff --git a/packages/engine-rn-tvos/src/config.ts b/packages/engine-rn-tvos/src/config.ts new file mode 100644 index 0000000000..6eadb226bb --- /dev/null +++ b/packages/engine-rn-tvos/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileEngine } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.engine.json'; +export const Config: ConfigFileEngine = CNF; diff --git a/packages/engine-rn-tvos/src/getContext.ts b/packages/engine-rn-tvos/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-rn-tvos/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-rn-tvos/src/index.ts b/packages/engine-rn-tvos/src/index.ts index 3ab04fa7ed..0dc5050764 100644 --- a/packages/engine-rn-tvos/src/index.ts +++ b/packages/engine-rn-tvos/src/index.ts @@ -1,36 +1,15 @@ -import { generateEngineExtensions, generateEngineTasks, RnvEngine } from '@rnv/core'; -import taskRun from './tasks/taskRun'; -import taskPackage from './tasks/taskPackage'; -import taskBuild from './tasks/taskBuild'; -import taskConfigure from './tasks/taskConfigure'; -import taskStart from './tasks/taskStart'; -import taskExport from './tasks/taskExport'; -import taskCryptoInstallCerts from './tasks/taskCryptoInstallCerts'; -import taskCryptoUpdateProfile from './tasks/taskCryptoUpdateProfile'; -import taskCryptoUpdateProfiles from './tasks/taskCryptoUpdateProfiles'; -import taskCryptoInstallProfiles from './tasks/taskCryptoInstallProfiles'; -import taskLog from './tasks/taskLog'; -//@ts-ignore -import CNF from '../renative.engine.json'; +import { createRnvEngine, GetContextType } from '@rnv/core'; +import { Tasks as TasksSdkAndroid } from '@rnv/sdk-android'; +import { Tasks as TasksSdkApple } from '@rnv/sdk-apple'; +import { Tasks as TasksSdkReactNative } from '@rnv/sdk-react-native'; import { withRNVBabel } from './adapters/babelAdapter'; import { withRNVMetro } from './adapters/metroAdapter'; import { withRNVRNConfig } from '@rnv/sdk-react-native'; +import { Config } from './config'; -const Engine: RnvEngine = { - tasks: generateEngineTasks([ - taskRun, - taskPackage, - taskBuild, - taskConfigure, - taskStart, - taskExport, - taskCryptoInstallCerts, - taskCryptoUpdateProfile, - taskCryptoUpdateProfiles, - taskCryptoInstallProfiles, - taskLog, - ]), - config: CNF, +const Engine = createRnvEngine({ + tasks: [...TasksSdkAndroid, ...TasksSdkApple, ...TasksSdkReactNative], + config: Config, runtimeExtraProps: { reactNativePackageName: 'react-native-tvos', reactNativeMetroConfigName: 'metro.config.js', @@ -41,24 +20,20 @@ const Engine: RnvEngine = { platforms: { tvos: { defaultPort: 8089, - extensions: generateEngineExtensions(['tvos.tv', 'tv', 'tvos', 'tv.native', 'native'], CNF), + extensions: ['tvos.tv', 'tv', 'tvos', 'tv.native', 'native'], }, androidtv: { defaultPort: 8084, - extensions: generateEngineExtensions( - ['androidtv.tv', 'tv', 'androidtv', 'android', 'tv.native', 'native'], - CNF - ), + extensions: ['androidtv.tv', 'tv', 'androidtv', 'android', 'tv.native', 'native'], }, firetv: { defaultPort: 8098, - extensions: generateEngineExtensions( - ['firetv.tv', 'androidtv.tv', 'tv', 'firetv', 'androidtv', 'android', 'tv.native', 'native'], - CNF - ), + extensions: ['firetv.tv', 'androidtv.tv', 'tv', 'firetv', 'androidtv', 'android', 'tv.native', 'native'], }, }, -}; +}); + +export type GetContext = GetContextType; export { withRNVMetro, withRNVBabel, withRNVRNConfig }; diff --git a/packages/engine-rn-tvos/src/tasks/__tests__/run.test.ts b/packages/engine-rn-tvos/src/tasks/__tests__/run.test.ts deleted file mode 100644 index ce0e25f2af..0000000000 --- a/packages/engine-rn-tvos/src/tasks/__tests__/run.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { createRnvContext, getContext } from '@rnv/core'; -import taskRun from '../taskRun'; -import { getIosDeviceToRunOn, runXcodeProject } from '@rnv/sdk-apple'; - -jest.mock('@rnv/core'); -jest.mock('@rnv/sdk-apple'); -jest.mock('@rnv/sdk-android'); -jest.mock('@rnv/sdk-react-native'); - -beforeEach(() => { - createRnvContext(); -}); - -afterEach(() => { - jest.resetAllMocks(); -}); - -test('Execute task.rnv.run', async () => { - // GIVEN - const ctx = getContext(); - ctx.platform = 'tvos'; - jest.mocked(getIosDeviceToRunOn).mockResolvedValue('MOCK_DEVICE_ARGS'); - // WHEN - await taskRun.fn?.(ctx, undefined, undefined); - // THEN - expect(runXcodeProject).toHaveBeenCalledWith('MOCK_DEVICE_ARGS'); -}); diff --git a/packages/engine-rn-tvos/src/tasks/__tests__/start.test.ts b/packages/engine-rn-tvos/src/tasks/__tests__/start.test.ts deleted file mode 100644 index 20513fbd7f..0000000000 --- a/packages/engine-rn-tvos/src/tasks/__tests__/start.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { createRnvContext, getContext, logError, doResolve, executeTask } from '@rnv/core'; -import taskStart from '../taskStart'; -import { startReactNative } from '@rnv/sdk-react-native'; - -jest.mock('@rnv/core'); -jest.mock('@rnv/sdk-react-native'); - -beforeEach(() => { - createRnvContext(); -}); - -afterEach(() => { - jest.resetAllMocks(); -}); - -test('Execute task.rnv.start with no parent', async () => { - // GIVEN - const ctx = getContext(); - ctx.platform = 'tvos'; - jest.mocked(doResolve).mockReturnValueOnce('MOCKED_PATH'); - // WHEN - await taskStart.fn?.(ctx, undefined, undefined); - // THEN - expect(executeTask).toHaveBeenCalledTimes(1); - expect(startReactNative).toHaveBeenCalledWith({ - waitForBundler: true, - customCliPath: 'MOCKED_PATH/local-cli/cli.js', - metroConfigName: 'metro.config.js', - }); -}); - -test('Execute task.rnv.start', async () => { - // GIVEN - const ctx = getContext(); - ctx.platform = 'tvos'; - jest.mocked(doResolve).mockReturnValueOnce('MOCKED_PATH'); - // WHEN - await taskStart.fn?.(ctx, 'parent', undefined); - // THEN - expect(startReactNative).toHaveBeenCalledWith({ - waitForBundler: false, - customCliPath: 'MOCKED_PATH/local-cli/cli.js', - metroConfigName: 'metro.config.js', - }); -}); - -test('Execute task.rnv.start in hosted mode', async () => { - // GIVEN - const ctx = getContext(); - ctx.platform = 'tvos'; - ctx.program.hosted = true; - // WHEN - await taskStart.fn?.(ctx, 'parent', undefined); - // THEN - expect(logError).toHaveBeenCalledWith('This platform does not support hosted mode', true); -}); diff --git a/packages/engine-rn-tvos/src/tasks/taskBuild.ts b/packages/engine-rn-tvos/src/tasks/taskBuild.ts deleted file mode 100644 index d3afed5e5e..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskBuild.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { buildReactNativeAndroid } from '@rnv/sdk-react-native'; -import { buildXcodeProject } from '@rnv/sdk-apple'; - -const taskBuild: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskBuild'); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.package, RnvTaskName.build, originTask); - - if (shouldSkipTask(RnvTaskName.build, originTask)) return true; - - switch (platform) { - case 'androidtv': - case 'firetv': - return buildReactNativeAndroid(); - case 'tvos': - if (parentTask === RnvTaskName.export) { - // build task is not necessary when exporting ios - return true; - } - return buildXcodeProject(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Build project binary', - fn: taskBuild, - task: RnvTaskName.build, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['tvos', 'androidtv', 'firetv'], -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskConfigure.ts b/packages/engine-rn-tvos/src/tasks/taskConfigure.ts deleted file mode 100644 index 43a255daf1..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskConfigure.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - RnvTaskFn, - jetifyIfRequired, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeTask, - shouldSkipTask, - configureEntryPoint, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { configureGradleProject } from '@rnv/sdk-android'; -import { configureXcodeProject } from '@rnv/sdk-apple'; - -const taskConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskConfigure'); - - await executeTask(RnvTaskName.platformConfigure, RnvTaskName.configure, originTask); - if (shouldSkipTask(RnvTaskName.configure, originTask)) return true; - - await configureEntryPoint(c.platform); - - if (c.program.only && !!parentTask) { - return true; - } - - switch (c.platform) { - case 'androidtv': - case 'firetv': - await configureGradleProject(); - await jetifyIfRequired(); - return true; - case 'tvos': - await configureXcodeProject(); - return true; - default: - await logErrorPlatform(); - return true; - } -}; - -const Task: RnvTask = { - description: 'Configure current project', - fn: taskConfigure, - task: RnvTaskName.configure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['tvos', 'androidtv', 'firetv'], -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskCryptoInstallCerts.ts b/packages/engine-rn-tvos/src/tasks/taskCryptoInstallCerts.ts deleted file mode 100644 index bfb9a51ec3..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskCryptoInstallCerts.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - RnvTaskFn, - logWarning, - logError, - logTask, - getFileListSync, - executeAsync, - executeTask, - shouldSkipTask, - RnvTaskOptionPresets, - RnvTask, - RnvTaskName, -} from '@rnv/core'; - -const taskCryptoInstallCerts: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskCryptoInstallCerts'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoInstallCerts, originTask); - - if (shouldSkipTask(RnvTaskName.cryptoInstallCerts, originTask)) return true; - - if (c.platform !== 'tvos') { - logError(`_installTempCerts: platform ${c.platform} not supported`); - return true; - } - const kChain = c.program.keychain || 'ios-build.keychain'; - - const list = getFileListSync(c.paths.workspace.project.dir); - const cerArr = list.filter((v) => v.endsWith('.cer')); - - try { - Promise.all(cerArr.map((v) => executeAsync(`security import ${v} -k ${kChain} -A`))); - } catch (e) { - logWarning(e); - return true; - } -}; - -const Task: RnvTask = { - description: 'Installs certificates into keychain (mac only)', - fn: taskCryptoInstallCerts, - task: RnvTaskName.cryptoInstallCerts, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - // skipPlatforms: true, -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskCryptoInstallProfiles.ts b/packages/engine-rn-tvos/src/tasks/taskCryptoInstallProfiles.ts deleted file mode 100644 index 43311186c7..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskCryptoInstallProfiles.ts +++ /dev/null @@ -1,62 +0,0 @@ -import path from 'path'; -import { - RnvTaskFn, - logWarning, - logError, - logTask, - logDebug, - getFileListSync, - copyFileSync, - mkdirSync, - fsExistsSync, - executeTask, - shouldSkipTask, - RnvTaskOptionPresets, - RnvTask, - RnvTaskName, -} from '@rnv/core'; - -const taskCryptoInstallProfiles: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskCryptoInstallProfiles'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoInstallProfiles, originTask); - - if (shouldSkipTask(RnvTaskName.cryptoInstallProfiles, originTask)) return true; - - if (c.platform !== 'tvos') { - logError(`taskCryptoInstallProfiles: platform ${c.platform} not supported`); - return true; - } - - const ppFolder = path.join(c.paths.home.dir, 'Library/MobileDevice/Provisioning Profiles'); - - if (!fsExistsSync(ppFolder)) { - logWarning(`folder ${ppFolder} does not exist!`); - mkdirSync(ppFolder); - } - - const list = getFileListSync(c.paths.workspace.project.dir); - const mobileprovisionArr = list.filter((v) => v.endsWith('.mobileprovision')); - - try { - mobileprovisionArr.forEach((v) => { - logDebug(`taskCryptoInstallProfiles: Installing: ${v}`); - copyFileSync(v, ppFolder); - }); - } catch (e) { - logError(e); - } - - return true; -}; - -const Task: RnvTask = { - description: 'Installs provisioning certificates found in your workspace (mac only)', - fn: taskCryptoInstallProfiles, - task: RnvTaskName.cryptoInstallProfiles, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - // skipPlatforms: true, -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskCryptoUpdateProfile.ts b/packages/engine-rn-tvos/src/tasks/taskCryptoUpdateProfile.ts deleted file mode 100644 index 58afdc544a..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskCryptoUpdateProfile.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { RnvTaskFn, executeTask, shouldSkipTask, logTask, RnvTaskOptionPresets, RnvTask, RnvTaskName } from '@rnv/core'; -import { updateProfile } from '@rnv/sdk-apple'; - -const taskCryptoUpdateProfile: RnvTaskFn = async (_c, _parentTask, originTask) => { - logTask('taskCryptoUpdateProfile'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoUpdateProfile, originTask); - - if (shouldSkipTask(RnvTaskName.cryptoUpdateProfile, originTask)) return true; - - await updateProfile(); -}; - -const Task: RnvTask = { - description: 'Update provisioning profile (mac only)', - fn: taskCryptoUpdateProfile, - task: RnvTaskName.cryptoUpdateProfile, - options: RnvTaskOptionPresets.withBase(), - platforms: ['tvos'], - // skipPlatforms: true, -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskCryptoUpdateProfiles.ts b/packages/engine-rn-tvos/src/tasks/taskCryptoUpdateProfiles.ts deleted file mode 100644 index d0186ff767..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskCryptoUpdateProfiles.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - RnvTaskFn, - listAppConfigsFoldersSync, - chalk, - logTask, - RnvTaskOptionPresets, - executeTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { updateProfile } from '@rnv/sdk-apple'; - -const _updateProfile = (v: string) => - new Promise((resolve, reject) => { - logTask(`_updateProfile:${v}`, chalk().grey); - updateProfile() - .then(() => resolve()) - .catch((e) => reject(e)); - }); - -const _updateProfiles = () => { - logTask('_updateProfiles', chalk().grey); - const acList = listAppConfigsFoldersSync(true); - - return acList.reduce((previousPromise, v) => previousPromise.then(() => _updateProfile(v)), Promise.resolve()); -}; - -const taskCryptoUpdateProfiles: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskCryptoUpdateProfiles'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoUpdateProfiles, originTask); - - if (shouldSkipTask(RnvTaskName.cryptoUpdateProfiles, originTask)) return true; - - switch (c.platform) { - case 'tvos': - await _updateProfiles(); - break; - default: - return true; - } - return Promise.reject(`updateProfiles: Platform ${c.platform} not supported`); -}; - -const Task: RnvTask = { - description: 'Will attempt to update all provisioning profiles (mac only)', - fn: taskCryptoUpdateProfiles, - task: RnvTaskName.cryptoUpdateProfiles, - options: RnvTaskOptionPresets.withBase(), - platforms: ['tvos'], - // skipPlatforms: true, -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskExport.ts b/packages/engine-rn-tvos/src/tasks/taskExport.ts deleted file mode 100644 index 4a75c170b1..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskExport.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { exportXcodeProject } from '@rnv/sdk-apple'; - -const taskExport: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskExport', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.build, RnvTaskName.export, originTask); - - if (shouldSkipTask(RnvTaskName.export, originTask)) return true; - - switch (platform) { - case 'androidtv': - case 'firetv': - // Android Platforms don't need extra export step - return true; - case 'tvos': - return exportXcodeProject(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Export the app into deployable binary', - fn: taskExport, - task: RnvTaskName.export, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['tvos', 'androidtv', 'firetv'], -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskLog.ts b/packages/engine-rn-tvos/src/tasks/taskLog.ts deleted file mode 100644 index 03f984a782..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskLog.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - logTask, - RnvTaskOptionPresets, - executeTask, - logErrorPlatform, - RnvTaskFn, - RnvTask, - RnvTaskName, -} from '@rnv/core'; - -import { runAppleLog } from '@rnv/sdk-apple'; -import { runAndroidLog, checkAndConfigureAndroidSdks } from '@rnv/sdk-android'; - -const taskLog: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskLog', `parent:${parentTask}`); - - await executeTask(RnvTaskName.workspaceConfigure, RnvTaskName.projectConfigure, originTask); - - switch (c.platform) { - case 'androidtv': - case 'firetv': - await checkAndConfigureAndroidSdks(); - return runAndroidLog(); - case 'tvos': - return runAppleLog(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Attach logger to device or emulator and print out logs', - fn: taskLog, - task: RnvTaskName.log, - options: RnvTaskOptionPresets.withBase(), - platforms: ['tvos', 'androidtv', 'firetv'], - isGlobalScope: true, -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskPackage.ts b/packages/engine-rn-tvos/src/tasks/taskPackage.ts deleted file mode 100644 index 129415b452..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskPackage.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - getConfigProp, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { packageAndroid } from '@rnv/sdk-android'; -import { packageBundleForXcode } from '@rnv/sdk-apple'; - -const taskPackage: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskPackage', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.package, originTask); - - const bundleAssets = getConfigProp('bundleAssets'); - - if (!bundleAssets) { - return true; - } - - if (shouldSkipTask(RnvTaskName.package, originTask)) return true; - - switch (platform) { - case 'androidtv': - case 'firetv': { - // NOTE: react-native v0.73 triggers packaging automatically so we skipping it unless we need to - // package it explicitly for tasks where it is not triggered automatically - const signingConfig = getConfigProp('signingConfig'); - - if (originTask === RnvTaskName.eject || signingConfig !== 'Release') { - return packageAndroid(); - } - return true; - } - case 'tvos': - return packageBundleForXcode(); - default: - logErrorPlatform(); - return false; - } -}; - -const Task: RnvTask = { - description: 'Package source files into bundle', - fn: taskPackage, - task: RnvTaskName.package, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['tvos', 'androidtv', 'firetv'], -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskRun.ts b/packages/engine-rn-tvos/src/tasks/taskRun.ts deleted file mode 100644 index 7279f66c36..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskRun.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - RnvTaskFn, - RnvTaskOptionPresets, - getConfigProp, - logTask, - logSummary, - logRaw, - logErrorPlatform, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { packageAndroid, runAndroid, getAndroidDeviceToRunOn } from '@rnv/sdk-android'; -import { runXcodeProject, getIosDeviceToRunOn } from '@rnv/sdk-apple'; -import { startBundlerIfRequired, waitForBundlerIfRequired } from '@rnv/sdk-react-native'; - -const taskRun: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { target } = c.runtime; - const { hosted } = c.program; - logTask('taskRun', `parent:${parentTask} port:${port} target:${target} hosted:${hosted}`); - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.run, originTask); - - if (shouldSkipTask(RnvTaskName.run, originTask)) return true; - - const bundleAssets = getConfigProp('bundleAssets', false); - - switch (platform) { - case 'androidtv': - case 'firetv': - // eslint-disable-next-line no-case-declarations - const runDevice = await getAndroidDeviceToRunOn(); - if (!c.program.only) { - await startBundlerIfRequired(RnvTaskName.run, originTask); - if (bundleAssets) { - await packageAndroid(); - } - await runAndroid(runDevice!); - if (!bundleAssets) { - logSummary('BUNDLER STARTED'); - } - return waitForBundlerIfRequired(); - } - return runAndroid(runDevice!); - case 'tvos': - // eslint-disable-next-line no-case-declarations - const runDeviceArgs = await getIosDeviceToRunOn(c); - if (!c.program.only) { - await startBundlerIfRequired(RnvTaskName.run, originTask); - await runXcodeProject(runDeviceArgs); - if (!bundleAssets) { - logSummary('BUNDLER STARTED'); - } - return waitForBundlerIfRequired(); - } - return runXcodeProject(runDeviceArgs); - default: - return logErrorPlatform(); - } -}; - -const taskRunHelp = async () => { - logRaw(` -More info at: https://renative.org/docs/api-cli -`); -}; - -const Task: RnvTask = { - description: 'Run your tv app on target device or emulator', - fn: taskRun, - fnHelp: taskRunHelp, - task: RnvTaskName.run, - isPriorityOrder: true, - // dependencies: { - // before: RnvTaskName.configure, - // }, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun())), - platforms: ['tvos', 'androidtv', 'firetv'], -}; - -export default Task; diff --git a/packages/engine-rn-tvos/src/tasks/taskStart.ts b/packages/engine-rn-tvos/src/tasks/taskStart.ts deleted file mode 100644 index a00d47fb10..0000000000 --- a/packages/engine-rn-tvos/src/tasks/taskStart.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { - doResolve, - logErrorPlatform, - executeTask, - shouldSkipTask, - logTask, - logError, - RnvTaskOptionPresets, - RnvTaskFn, - RnvTask, - PlatformKey, - RnvTaskName, -} from '@rnv/core'; -import { startReactNative } from '@rnv/sdk-react-native'; - -const BUNDLER_PLATFORMS: Partial> = {}; - -BUNDLER_PLATFORMS['tvos'] = 'ios'; -BUNDLER_PLATFORMS['androidtv'] = 'android'; -BUNDLER_PLATFORMS['firetv'] = 'android'; - -const taskStart: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { hosted } = c.program; - - logTask('taskStart', `parent:${parentTask} port:${c.runtime.port} hosted:${!!hosted}`); - - if (hosted) { - return logError('This platform does not support hosted mode', true); - } - // Disable reset for other commands (ie. cleaning platforms) - c.runtime.disableReset = true; - if (!parentTask) { - await executeTask(RnvTaskName.configureSoft, RnvTaskName.start, originTask); - } - - if (shouldSkipTask(RnvTaskName.start, originTask)) return true; - - switch (platform) { - case 'androidtv': - case 'firetv': - case 'tvos': { - return startReactNative({ - waitForBundler: !parentTask, - customCliPath: `${doResolve('react-native-tvos')}/local-cli/cli.js`, - metroConfigName: 'metro.config.js', - }); - } - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Starts bundler / server', - fn: taskStart, - task: RnvTaskName.start, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['tvos', 'androidtv', 'firetv'], -}; - -export default Task; diff --git a/packages/engine-rn-tvos/templates/platforms/androidtv/app/src/main/AndroidManifest.xml b/packages/engine-rn-tvos/templates/platforms/androidtv/app/src/main/AndroidManifest.xml index 9055065933..c94b6e04a9 100755 --- a/packages/engine-rn-tvos/templates/platforms/androidtv/app/src/main/AndroidManifest.xml +++ b/packages/engine-rn-tvos/templates/platforms/androidtv/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ {{PLUGIN_MANIFEST_FILE}} \ No newline at end of file diff --git a/packages/engine-rn-tvos/templates/platforms/firetv/app/src/main/AndroidManifest.xml b/packages/engine-rn-tvos/templates/platforms/firetv/app/src/main/AndroidManifest.xml index 82101e040e..926050047d 100755 --- a/packages/engine-rn-tvos/templates/platforms/firetv/app/src/main/AndroidManifest.xml +++ b/packages/engine-rn-tvos/templates/platforms/firetv/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ {{PLUGIN_MANIFEST_FILE}} diff --git a/packages/engine-rn-tvos/templates/platforms/tvos/Podfile b/packages/engine-rn-tvos/templates/platforms/tvos/Podfile index f221c517b1..92afdc3633 100644 --- a/packages/engine-rn-tvos/templates/platforms/tvos/Podfile +++ b/packages/engine-rn-tvos/templates/platforms/tvos/Podfile @@ -82,6 +82,19 @@ post_install do |installer| :mac_catalyst_enabled => false ) {{INJECT_POST_INSTALL}} + + installer.pods_project.targets.each do |target| + if target.name == 'Flipper' + file_path = 'Pods/Flipper/xplat/Flipper/FlipperTransportTypes.h' + contents = File.read(file_path) + unless contents.include?('#include ') + File.open(file_path, 'w') do |file| + file.puts('#include ') + file.puts(contents) + end + end + end + end end {{INJECT_PLUGIN_PODFILE_INJECT}} \ No newline at end of file diff --git a/packages/engine-rn-web/.gitignore b/packages/engine-rn-web/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-rn-web/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-rn-web/.npmignore b/packages/engine-rn-web/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-rn-web/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-rn-web/package.json b/packages/engine-rn-web/package.json index 7eba17006b..b857a5ca55 100644 --- a/packages/engine-rn-web/package.json +++ b/packages/engine-rn-web/package.json @@ -34,9 +34,12 @@ "dependencies": { "@react-native/babel-preset": "0.73.21", "@rnv/sdk-tizen": "1.0.0-rc.12", + "@rnv/sdk-kaios": "1.0.0-rc.12", "@rnv/sdk-utils": "1.0.0-rc.12", "@rnv/sdk-webos": "1.0.0-rc.12", - "@rnv/sdk-webpack": "1.0.0-rc.12" + "@rnv/sdk-webpack": "1.0.0-rc.12", + "@rnv/adapter": "1.0.0-rc.12", + "metro-react-native-babel-preset": "0.76.8" }, "peerDependencies": { "@rnv/core": "^1.0.0-rc.12" diff --git a/packages/engine-rn-web/renative.engine.json b/packages/engine-rn-web/renative.engine.json index 874e22a468..5ab2744505 100644 --- a/packages/engine-rn-web/renative.engine.json +++ b/packages/engine-rn-web/renative.engine.json @@ -1,6 +1,8 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-rn-web", + "engineExtension": "rnw", + "packageName": "@rnv/engine-rn-web", "overview": "React native based engine with web transpiler provided by react-native-web", "plugins": { "react": "source:rnv", diff --git a/packages/engine-rn-web/src/adapter.ts b/packages/engine-rn-web/src/adapter.ts index 5ea1229578..6136b2005e 100644 --- a/packages/engine-rn-web/src/adapter.ts +++ b/packages/engine-rn-web/src/adapter.ts @@ -1,4 +1,4 @@ -import { BabelConfig } from '@rnv/core'; +import { BabelConfig, withBabelPluginModuleResolver } from '@rnv/adapter'; import { withRNVWebpack } from '@rnv/sdk-webpack'; const withRNVBabel = (cnf: BabelConfig): BabelConfig => { @@ -6,17 +6,9 @@ const withRNVBabel = (cnf: BabelConfig): BabelConfig => { return { retainLines: true, - presets: [['module:metro-react-native-babel-preset', { useTransformReactJSXExperimental: true }]], + presets: [[require.resolve('metro-react-native-babel-preset'), { useTransformReactJSXExperimental: true }]], ...cnf, - plugins: [ - [ - require.resolve('babel-plugin-module-resolver'), - { - root: [process.env.RNV_MONO_ROOT || '.'], - }, - ], - ...plugins, - ], + plugins: [withBabelPluginModuleResolver(), ...plugins], }; }; diff --git a/packages/engine-rn-web/src/config.ts b/packages/engine-rn-web/src/config.ts new file mode 100644 index 0000000000..6eadb226bb --- /dev/null +++ b/packages/engine-rn-web/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileEngine } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.engine.json'; +export const Config: ConfigFileEngine = CNF; diff --git a/packages/engine-rn-web/src/constants.ts b/packages/engine-rn-web/src/constants.ts new file mode 100644 index 0000000000..344ae343f1 --- /dev/null +++ b/packages/engine-rn-web/src/constants.ts @@ -0,0 +1,12 @@ +import { RnvPlatformKey } from '@rnv/core'; + +export const EnginePlatforms: Array = [ + 'web', + 'webtv', + 'tizen', + 'webos', + 'tizenmobile', + 'tizenwatch', + 'kaios', + 'chromecast', +]; diff --git a/packages/engine-rn-web/src/getContext.ts b/packages/engine-rn-web/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-rn-web/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-rn-web/src/index.ts b/packages/engine-rn-web/src/index.ts index 62e06c5b11..8a5c40f415 100644 --- a/packages/engine-rn-web/src/index.ts +++ b/packages/engine-rn-web/src/index.ts @@ -1,69 +1,64 @@ -import { generateEngineExtensions, generateEngineTasks, RnvEngine } from '@rnv/core'; +import { createRnvEngine, GetContextType } from '@rnv/core'; +import { Tasks as TasksSdkWebOS } from '@rnv/sdk-webos'; +import { Tasks as TasksSdkTizen } from '@rnv/sdk-tizen'; import { withRNVBabel, withRNVWebpack } from './adapter'; -//@ts-ignore -import CNF from '../renative.engine.json'; import taskRun from './tasks/taskRun'; import taskBuild from './tasks/taskBuild'; import taskConfigure from './tasks/taskConfigure'; import taskStart from './tasks/taskStart'; import taskDebug from './tasks/taskDebug'; +import { Config } from './config'; -const Engine: RnvEngine = { - tasks: generateEngineTasks([taskRun, taskBuild, taskConfigure, taskStart, taskDebug]), - config: CNF, - projectDirName: '', - serverDirName: '', - runtimeExtraProps: {}, +const Engine = createRnvEngine({ + tasks: [taskRun, taskBuild, taskConfigure, taskStart, taskDebug, ...TasksSdkWebOS, ...TasksSdkTizen], + config: Config, platforms: { web: { defaultPort: 8080, isWebHosted: true, - extensions: generateEngineExtensions(['web.browser', 'browser', 'browser.web', 'web'], CNF), + extensions: ['web.browser', 'browser', 'browser.web', 'web'], }, chromecast: { defaultPort: 8095, isWebHosted: true, - extensions: generateEngineExtensions(['chromecast.tv', 'web.tv', 'tv', 'chromecast', 'tv.web', 'web'], CNF), + extensions: ['chromecast.tv', 'web.tv', 'tv', 'chromecast', 'tv.web', 'web'], }, tizen: { defaultPort: 8087, isWebHosted: true, - extensions: generateEngineExtensions(['tizen.tv', 'web.tv', 'tv', 'tizen', 'tv.web', 'web'], CNF), + extensions: ['tizen.tv', 'web.tv', 'tv', 'tizen', 'tv.web', 'web'], }, webtv: { defaultPort: 8096, isWebHosted: true, - extensions: generateEngineExtensions(['webtv.tv', 'web.tv', 'tv', 'webtv', 'tv.web', 'web'], CNF), + extensions: ['webtv.tv', 'web.tv', 'tv', 'webtv', 'tv.web', 'web'], }, tizenmobile: { defaultPort: 8091, isWebHosted: true, - extensions: generateEngineExtensions( - ['tizenmobile.mobile', 'mobile', 'tizenmobile', 'mobile.web', 'native'], - CNF - ), + extensions: ['tizenmobile.mobile', 'mobile', 'tizenmobile', 'mobile.web', 'native'], }, tizenwatch: { defaultPort: 8090, isWebHosted: true, - extensions: generateEngineExtensions( - ['tizenwatch.watch', 'web.watch', 'watch', 'tizenwatch', 'watch.web', 'web'], - CNF - ), + extensions: ['tizenwatch.watch', 'web.watch', 'watch', 'tizenwatch', 'watch.web', 'web'], }, webos: { defaultPort: 8088, isWebHosted: true, - extensions: generateEngineExtensions(['webos.tv', 'web.tv', 'tv', 'webos', 'tv.web', 'web'], CNF), + extensions: ['webos.tv', 'web.tv', 'tv', 'webos', 'tv.web', 'web'], }, kaios: { defaultPort: 8093, isWebHosted: true, - extensions: generateEngineExtensions(['kaios.mobile', 'mobile', 'kaios', 'mobile.web', 'native'], CNF), + extensions: ['kaios.mobile', 'mobile', 'kaios', 'mobile.web', 'native'], }, }, -}; +}); +export type GetContext = GetContextType; + +//TODO: export this withing engine export { withRNVBabel, withRNVWebpack }; export default Engine; diff --git a/packages/engine-rn-web/src/tasks/__tests__/run.test.ts b/packages/engine-rn-web/src/tasks/__tests__/run.test.ts index f48610ba5a..16b44516bf 100644 --- a/packages/engine-rn-web/src/tasks/__tests__/run.test.ts +++ b/packages/engine-rn-web/src/tasks/__tests__/run.test.ts @@ -5,7 +5,6 @@ import { runTizen } from '@rnv/sdk-tizen'; jest.mock('fs'); jest.mock('path'); -jest.mock('axios'); jest.mock('@rnv/core'); jest.mock('process'); jest.mock('@rnv/sdk-webpack'); @@ -27,7 +26,13 @@ test('Execute task.rnv.run -p web', async () => { jest.mocked(getAppFolder).mockReturnValueOnce('MOCKED_PATH'); //WHEN - await taskRun.fn?.(ctx); + await taskRun.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }); //THEN expect(runWebpackServer).toHaveBeenCalled(); }); @@ -38,7 +43,13 @@ test('Execute task.rnv.run -p tizen', async () => { ctx.platform = 'tizen'; jest.mocked(getPlatformProjectDir).mockReturnValue(''); //WHEN - await taskRun.fn?.(ctx); + await taskRun.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }); //THEN expect(runTizen).toHaveBeenCalled(); }); diff --git a/packages/engine-rn-web/src/tasks/taskBuild.ts b/packages/engine-rn-web/src/tasks/taskBuild.ts index 42592a0561..c03b874e6e 100644 --- a/packages/engine-rn-web/src/tasks/taskBuild.ts +++ b/packages/engine-rn-web/src/tasks/taskBuild.ts @@ -1,58 +1,36 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; import { buildWeb } from '@rnv/sdk-webpack'; import { buildTizenProject } from '@rnv/sdk-tizen'; import { buildWebOSProject } from '@rnv/sdk-webos'; import { buildKaiOSProject } from '@rnv/sdk-kaios'; +import { EnginePlatforms } from '../constants'; -const taskBuild: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskBuild', `parent:${parentTask}`); - - const { platform } = c; - - // Build aways bundles assets - c.runtime.forceBundleAssets = true; - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.build, originTask); - - if (shouldSkipTask(RnvTaskName.build, originTask)) return true; - - switch (platform) { - case 'web': - case 'webtv': - case 'chromecast': - await buildWeb(); - return; - case 'kaios': - await buildKaiOSProject(); - return; - case 'tizen': - case 'tizenmobile': - case 'tizenwatch': - await buildTizenProject(); - return; - case 'webos': - await buildWebOSProject(); - return; - default: - logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Build project binary', - fn: taskBuild, + dependsOn: [RnvTaskName.configure], + fn: async ({ ctx }) => { + switch (ctx.platform) { + case 'web': + case 'webtv': + case 'chromecast': + await buildWeb(); + return; + case 'kaios': + await buildKaiOSProject(); + return; + case 'tizen': + case 'tizenmobile': + case 'tizenwatch': + await buildTizenProject(); + return; + case 'webos': + await buildWebOSProject(); + return; + default: + // DO nothing + } + }, task: RnvTaskName.build, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['web', 'webtv', 'tizen', 'webos', 'tizenmobile', 'tizenwatch', 'kaios', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: EnginePlatforms, +}); diff --git a/packages/engine-rn-web/src/tasks/taskConfigure.ts b/packages/engine-rn-web/src/tasks/taskConfigure.ts index c16c9d7fa2..e148d5a312 100644 --- a/packages/engine-rn-web/src/tasks/taskConfigure.ts +++ b/packages/engine-rn-web/src/tasks/taskConfigure.ts @@ -1,58 +1,34 @@ -import { - RnvTaskFn, - logErrorPlatform, - copySharedPlatforms, - logTask, - RnvTaskOptionPresets, - executeTask, - shouldSkipTask, - configureEntryPoint, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { copySharedPlatforms, RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; import { configureWebProject, configureChromecastProject } from '@rnv/sdk-webpack'; import { configureKaiOSProject } from '@rnv/sdk-kaios'; import { configureWebOSProject } from '@rnv/sdk-webos'; import { configureTizenProject } from '@rnv/sdk-tizen'; +import { EnginePlatforms } from '../constants'; -const taskConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskConfigure'); - - await executeTask(RnvTaskName.platformConfigure, RnvTaskName.configure, originTask); - if (shouldSkipTask(RnvTaskName.configure, originTask)) return true; - await configureEntryPoint(c.platform); - - await copySharedPlatforms(); - - if (c.program.only && !!parentTask) { - return true; - } - - switch (c.platform) { - case 'web': - case 'webtv': - return configureWebProject(); - case 'tizen': - case 'tizenmobile': - case 'tizenwatch': - return configureTizenProject(); - case 'webos': - return configureWebOSProject(); - case 'chromecast': - return configureChromecastProject(); - case 'kaios': - return configureKaiOSProject(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Configure current project', - fn: taskConfigure, + dependsOn: [RnvTaskName.platformConfigure], + fn: async ({ ctx }) => { + await copySharedPlatforms(); + switch (ctx.platform) { + case 'web': + case 'webtv': + return configureWebProject(); + case 'tizen': + case 'tizenmobile': + case 'tizenwatch': + return configureTizenProject(); + case 'webos': + return configureWebOSProject(); + case 'chromecast': + return configureChromecastProject(); + case 'kaios': + return configureKaiOSProject(); + default: + // DO nothing + } + }, task: RnvTaskName.configure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['web', 'webtv', 'tizen', 'webos', 'tizenmobile', 'tizenwatch', 'kaios', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: EnginePlatforms, +}); diff --git a/packages/engine-rn-web/src/tasks/taskDebug.ts b/packages/engine-rn-web/src/tasks/taskDebug.ts index f8cf670561..f03577cff0 100644 --- a/packages/engine-rn-web/src/tasks/taskDebug.ts +++ b/packages/engine-rn-web/src/tasks/taskDebug.ts @@ -1,37 +1,10 @@ -import { - RnvTaskFn, - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - executeAsync, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { executeAsync, createTask, RnvTaskName } from '@rnv/core'; -const taskDebug: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskDebug', `parent:${parentTask}`); - - if (shouldSkipTask(RnvTaskName.debug, originTask)) return true; - - const { platform } = c; - - switch (platform) { - case 'web': - case 'webtv': - case 'tizen': - return executeAsync('npx weinre --boundHost -all-'); - default: - logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Debug your app on target device or emulator', - fn: taskDebug, + fn: async () => { + return executeAsync('npx weinre --boundHost -all-'); + }, task: RnvTaskName.debug, - options: RnvTaskOptionPresets.withBase(), platforms: ['web', 'webtv', 'tizen'], -}; - -export default Task; +}); diff --git a/packages/engine-rn-web/src/tasks/taskRun.ts b/packages/engine-rn-web/src/tasks/taskRun.ts index a5fd147b0a..5562c16c68 100644 --- a/packages/engine-rn-web/src/tasks/taskRun.ts +++ b/packages/engine-rn-web/src/tasks/taskRun.ts @@ -1,17 +1,13 @@ import { RnvContext, - RnvTaskFn, RnvTaskOptionPresets, - logErrorPlatform, logTask, logDebug, getConfigProp, getPlatformProjectDir, writeCleanFile, executeTask, - executeOrSkipTask, - shouldSkipTask, - RnvTask, + createTask, getAppFolder, fsExistsSync, getAppConfigBuildsFolder, @@ -23,6 +19,7 @@ import { runTizen } from '@rnv/sdk-tizen'; import { runWebOS } from '@rnv/sdk-webos'; import { runKaiOSProject } from '@rnv/sdk-kaios'; import { getIP } from '@rnv/sdk-utils'; +import { EnginePlatforms } from '../constants'; const existBuildsOverrideForTargetPathSync = (c: RnvContext, destPath: string) => { const appFolder = getAppFolder(); @@ -54,7 +51,7 @@ const _configureHostedIfRequired = async (c: RnvContext) => { if (!bundleAssets && !existBuildsOverrideForTargetPathSync(c, path.join(getPlatformProjectDir()!, 'index.html'))) { logDebug('Running hosted build'); - const ipAddress = c.program.hostIp || getIP(); + const ipAddress = c.program.opts().hostIp || getIP(); if (c.runtime.currentEngine?.rootPath) { writeCleanFile( @@ -73,59 +70,47 @@ const _configureHostedIfRequired = async (c: RnvContext) => { } }; -const taskRun: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { target } = c.runtime; - const { hosted } = c.program; - logTask('taskRun', `parent:${parentTask} port:${port} target:${target} hosted:${hosted}`); - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.run, originTask); - - if (hosted) { - c.runtime.shouldOpenBrowser = true; - // return _taskStart(c); - return executeTask(RnvTaskName.start, RnvTaskName.run, originTask); - } - - if (shouldSkipTask(RnvTaskName.run, originTask)) return true; - - switch (platform) { - case 'web': - case 'webtv': - c.runtime.shouldOpenBrowser = true; - return runWebpackServer(); - case 'tizen': - case 'tizenmobile': - case 'tizenwatch': - if (!c.program.only) { - await _configureHostedIfRequired(c); - } - return runTizen(c, target); - case 'webos': - if (!c.program.only) { - await _configureHostedIfRequired(c); - } - return runWebOS(c); - case 'kaios': - return runKaiOSProject(); - case 'chromecast': - if (!c.program.only) { - await _configureHostedIfRequired(c); - } - return runChromecast(c); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Run your app in browser', - fn: taskRun, + dependsOn: [RnvTaskName.configure], + fn: async ({ ctx, taskName, originTaskName }) => { + const { hosted } = ctx.program.opts(); + if (hosted) { + ctx.runtime.shouldOpenBrowser = true; + // return _taskStart(c); + return executeTask({ taskName: RnvTaskName.start, parentTaskName: taskName, originTaskName }); + } + + switch (ctx.platform) { + case 'web': + case 'webtv': + ctx.runtime.shouldOpenBrowser = true; + return runWebpackServer(); + case 'tizen': + case 'tizenmobile': + case 'tizenwatch': + if (!ctx.program.opts().only) { + await _configureHostedIfRequired(ctx); + } + return runTizen(ctx, ctx.runtime.target); + case 'webos': + if (!ctx.program.opts().only) { + await _configureHostedIfRequired(ctx); + } + return runWebOS(ctx); + case 'kaios': + return runKaiOSProject(); + case 'chromecast': + if (!ctx.program.opts().only) { + await _configureHostedIfRequired(ctx); + } + return runChromecast(ctx); + default: + // Do nothing + } + }, task: RnvTaskName.run, isPriorityOrder: true, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun())), - platforms: ['web', 'webtv', 'tizen', 'webos', 'tizenmobile', 'tizenwatch', 'kaios', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun()), + platforms: EnginePlatforms, +}); diff --git a/packages/engine-rn-web/src/tasks/taskStart.ts b/packages/engine-rn-web/src/tasks/taskStart.ts index f50bdf875f..58c6b6d962 100644 --- a/packages/engine-rn-web/src/tasks/taskStart.ts +++ b/packages/engine-rn-web/src/tasks/taskStart.ts @@ -1,64 +1,22 @@ import { runWebpackServer } from '@rnv/sdk-webpack'; -import { - RnvTaskFn, - getConfigProp, - logErrorPlatform, - logTask, - logError, - RnvTaskOptionPresets, - executeTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { REMOTE_DEBUGGER_ENABLED_PLATFORMS, openBrowser, waitForHost } from '@rnv/sdk-utils'; +import { getConfigProp, RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { REMOTE_DEBUGGER_ENABLED_PLATFORMS } from '@rnv/sdk-utils'; +import { EnginePlatforms } from '../constants'; -const taskStart: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { hosted } = c.program; - - if (!platform) return; - - logTask('taskStart', `parent:${parentTask} port:${port} hosted:${!!hosted}`); - - if (!parentTask) { - await executeTask(RnvTaskName.configure, RnvTaskName.start, originTask); - } - - if (shouldSkipTask(RnvTaskName.start, originTask)) return true; - - if (hosted) { - waitForHost('') - .then(() => openBrowser(`http://${c.runtime.localhost}:${port}/`)) - .catch(logError); - } - const bundleAssets = getConfigProp('bundleAssets'); - const isWeinreEnabled = REMOTE_DEBUGGER_ENABLED_PLATFORMS.includes(platform) && !bundleAssets && !hosted; +export default createTask({ + description: 'Starts bundler / server', + dependsOn: [RnvTaskName.configure], + fn: async ({ ctx }) => { + const { platform, program } = ctx; + const { hosted } = program.opts(); - switch (platform) { - case 'web': - case 'webtv': - case 'tizen': - case 'webos': - case 'tizenmobile': - case 'tizenwatch': - // c.runtime.keepSessionActive = true; - return runWebpackServer(isWeinreEnabled); - default: - if (hosted) { - return logError('This platform does not support hosted mode', true); - } - return logErrorPlatform(); - } -}; + const bundleAssets = getConfigProp('bundleAssets'); + const isWeinreEnabled = + (platform && REMOTE_DEBUGGER_ENABLED_PLATFORMS.includes(platform) && !bundleAssets && !hosted) || undefined; -const Task: RnvTask = { - description: 'Starts bundler / server', - fn: taskStart, + return runWebpackServer(isWeinreEnabled); + }, task: RnvTaskName.start, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['web', 'webtv', 'tizen', 'webos', 'tizenmobile', 'tizenwatch', 'kaios', 'chromecast'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: EnginePlatforms, +}); diff --git a/packages/engine-rn-windows/.gitignore b/packages/engine-rn-windows/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-rn-windows/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-rn-windows/.npmignore b/packages/engine-rn-windows/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-rn-windows/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-rn-windows/package.json b/packages/engine-rn-windows/package.json index c494f88044..7e430748ad 100644 --- a/packages/engine-rn-windows/package.json +++ b/packages/engine-rn-windows/package.json @@ -18,7 +18,7 @@ "lib", "pluginTemplates", "renative.engine.json", - "supportFiles" + "templateFiles" ], "main": "lib/index.js", "repository": { @@ -35,6 +35,7 @@ }, "dependencies": { "@rnv/sdk-react-native": "1.0.0-rc.12", + "@rnv/adapter": "1.0.0-rc.12", "@xmldom/xmldom": "0.7.7", "react-native-windows": "0.72.10" }, diff --git a/packages/engine-rn-windows/renative.engine.json b/packages/engine-rn-windows/renative.engine.json index e6ccfda83c..f978395919 100644 --- a/packages/engine-rn-windows/renative.engine.json +++ b/packages/engine-rn-windows/renative.engine.json @@ -1,6 +1,7 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-rn-windows", + "packageName": "@rnv/engine-rn-windows", "engineExtension": "rnwin", "overview": "React native based engine with react-native-windows cli tool", "plugins": { diff --git a/packages/engine-rn-windows/src/adapters/babelAdapter.ts b/packages/engine-rn-windows/src/adapters/babelAdapter.ts index 69ce237bba..9943fe5742 100644 --- a/packages/engine-rn-windows/src/adapters/babelAdapter.ts +++ b/packages/engine-rn-windows/src/adapters/babelAdapter.ts @@ -1,4 +1,4 @@ -import { BabelConfig } from '@rnv/core'; +import { BabelConfig, withBabelPluginModuleResolver } from '@rnv/adapter'; export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { const plugins = cnf?.plugins || []; @@ -7,14 +7,6 @@ export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { retainLines: true, presets: ['module:@react-native/babel-preset'], ...cnf, - plugins: [ - [ - require.resolve('babel-plugin-module-resolver'), - { - root: [process.env.RNV_MONO_ROOT || '.'], - }, - ], - ...plugins, - ], + plugins: [withBabelPluginModuleResolver(), ...plugins], }; }; diff --git a/packages/engine-rn-windows/src/config.ts b/packages/engine-rn-windows/src/config.ts new file mode 100644 index 0000000000..6eadb226bb --- /dev/null +++ b/packages/engine-rn-windows/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileEngine } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.engine.json'; +export const Config: ConfigFileEngine = CNF; diff --git a/packages/engine-rn-windows/src/getContext.ts b/packages/engine-rn-windows/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-rn-windows/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-rn-windows/src/index.ts b/packages/engine-rn-windows/src/index.ts index 55c7c70f80..39f3cdd7fb 100644 --- a/packages/engine-rn-windows/src/index.ts +++ b/packages/engine-rn-windows/src/index.ts @@ -1,34 +1,31 @@ -import { RnvEngine, generateEngineTasks, generateEngineExtensions } from '@rnv/core'; +import { createRnvEngine, GetContextType } from '@rnv/core'; import { withRNVMetro } from './adapters/metroAdapter'; import { withRNVBabel } from './adapters/babelAdapter'; -//@ts-ignore -import CNF from '../renative.engine.json'; import taskBuild from './tasks/taskBuild'; import taskConfigure from './tasks/taskConfigure'; import taskExport from './tasks/taskExport'; import taskPackage from './tasks/taskPackage'; import taskRun from './tasks/taskRun'; -import taskStart from './tasks/taskStart'; -import { withRNVRNConfig } from '@rnv/sdk-react-native'; +import { Tasks as TasksSdkReactNative, withRNVRNConfig } from '@rnv/sdk-react-native'; +import { Config } from './config'; -const Engine: RnvEngine = { - tasks: generateEngineTasks([taskRun, taskPackage, taskBuild, taskConfigure, taskStart, taskExport]), - config: CNF, - projectDirName: '', - runtimeExtraProps: {}, - serverDirName: '', +const Engine = createRnvEngine({ + tasks: [taskRun, taskPackage, taskBuild, taskConfigure, taskExport, ...TasksSdkReactNative], + config: Config, platforms: { windows: { defaultPort: 8092, - extensions: generateEngineExtensions(['windows.desktop', 'windows', 'win', 'desktop'], CNF), + extensions: ['windows.desktop', 'windows', 'win', 'desktop'], }, xbox: { defaultPort: 8099, // What works on windows will work on xbox, but it needs to be scaled as for TVs - extensions: generateEngineExtensions(['xbox', 'windows', 'win', 'tv', 'desktop'], CNF), + extensions: ['xbox', 'windows', 'win', 'tv', 'desktop'], }, }, -}; +}); + +export type GetContext = GetContextType; export { withRNVMetro, withRNVBabel, withRNVRNConfig }; diff --git a/packages/engine-rn-windows/src/sdks/sdk-windows/config/configUtils.js b/packages/engine-rn-windows/src/sdk/config/configUtils.js similarity index 100% rename from packages/engine-rn-windows/src/sdks/sdk-windows/config/configUtils.js rename to packages/engine-rn-windows/src/sdk/config/configUtils.js diff --git a/packages/engine-rn-windows/src/sdk/constants.ts b/packages/engine-rn-windows/src/sdk/constants.ts new file mode 100644 index 0000000000..7075f1f5c9 --- /dev/null +++ b/packages/engine-rn-windows/src/sdk/constants.ts @@ -0,0 +1,3 @@ +import { RnvPlatformKey } from '@rnv/core'; + +export const SdkPlatforms: Array = ['windows', 'xbox']; diff --git a/packages/engine-rn-windows/src/sdks/sdk-windows/copyTemplate.js b/packages/engine-rn-windows/src/sdk/copyTemplate.js similarity index 100% rename from packages/engine-rn-windows/src/sdks/sdk-windows/copyTemplate.js rename to packages/engine-rn-windows/src/sdk/copyTemplate.js diff --git a/packages/engine-rn-windows/src/sdks/sdk-windows/generator-common/index.js b/packages/engine-rn-windows/src/sdk/generator-common/index.js similarity index 100% rename from packages/engine-rn-windows/src/sdks/sdk-windows/generator-common/index.js rename to packages/engine-rn-windows/src/sdk/generator-common/index.js diff --git a/packages/engine-rn-windows/src/sdks/sdk-windows/index.ts b/packages/engine-rn-windows/src/sdk/index.ts similarity index 96% rename from packages/engine-rn-windows/src/sdks/sdk-windows/index.ts rename to packages/engine-rn-windows/src/sdk/index.ts index b84e2bb19f..1e8f539dd8 100644 --- a/packages/engine-rn-windows/src/sdks/sdk-windows/index.ts +++ b/packages/engine-rn-windows/src/sdk/index.ts @@ -13,6 +13,7 @@ import { logError, logDefault, logWarning, + getContext, } from '@rnv/core'; // import cli from '@react-native-windows/cli'; // import runWindowsCMD from '@react-native-windows/cli/lib-commonjs/runWindows/runWindows'; @@ -191,9 +192,11 @@ type InjectOptions = { }; // TODO Document/comment each of the functions -export const ruWindowsProject = async (c: RnvContext, injectedOptions?: InjectOptions) => { +export const ruWindowsProject = async (injectedOptions?: InjectOptions) => { logDefault('runWindowsProject'); + const c = getContext(); + const options = getOptions(c, injectedOptions); const args: string[] = []; @@ -243,7 +246,7 @@ export const ruWindowsProject = async (c: RnvContext, injectedOptions?: InjectOp // For release bundle needs to be created if (options.bundleAssets || options.release) { logDebug('Assets will be bundled'); - await packageBundleForWindows(c, options.bundleIsDev); + await packageBundleForWindows(options.bundleIsDev); } await runWindows(args, config, options); @@ -251,7 +254,8 @@ export const ruWindowsProject = async (c: RnvContext, injectedOptions?: InjectOp return true; }; -const copyWindowsTemplateProject = async (c: RnvContext, injectedOptions = {}) => { +const copyWindowsTemplateProject = async (injectedOptions = {}) => { + const c = getContext(); const options = getOptions(c, injectedOptions); const opts = { @@ -267,7 +271,8 @@ const copyWindowsTemplateProject = async (c: RnvContext, injectedOptions = {}) = return true; }; -function clearWindowsTemporaryFiles(c: RnvContext) { +function clearWindowsTemporaryFiles() { + const c = getContext(); logDefault('clearWindowsTemporaryFiles'); const logging = getConfigProp('logging', defaultOptions.logging); const opts = { @@ -294,9 +299,10 @@ function clearWindowsTemporaryFiles(c: RnvContext) { return new Promise((resolve) => setTimeout(() => resolve(true), 4000)); } -const packageBundleForWindows = (c: RnvContext, isDev = false) => { +const packageBundleForWindows = (isDev = false) => { + const c = getContext(); logDefault('packageBundleForWindows'); - // const { maxErrorLength } = c.program; + // const { maxErrorLength } = c.program.opts(); const entryFile = getConfigProp('entryFile'); if (!c.runtime.appId) return; @@ -315,7 +321,7 @@ const packageBundleForWindows = (c: RnvContext, isDev = false) => { `${getAppFolder().replace(/\//g, '\\')}\\${c.runtime.appId}\\Bundle\\index.windows.bundle`, ]; - if (c.program.info) { + if (c.program.opts().info) { args.push('--verbose'); } @@ -439,7 +445,8 @@ const installWindowsApp = async (c: RnvContext, script: string, windowsStoreAppU ); }; -const packageWindowsApp = async (c: RnvContext, injectedOptions?: InjectOptions) => { +const packageWindowsApp = async (injectedOptions?: InjectOptions) => { + const c = getContext(); if (!c.runtime.appId) return; try { const appFolder = getAppFolder(); diff --git a/packages/engine-rn-windows/src/sdks/index.ts b/packages/engine-rn-windows/src/sdks/index.ts deleted file mode 100644 index 2eefd8e5b9..0000000000 --- a/packages/engine-rn-windows/src/sdks/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as SDKWindows from './sdk-windows'; - -export { SDKWindows }; diff --git a/packages/engine-rn-windows/src/tasks/taskBuild.ts b/packages/engine-rn-windows/src/tasks/taskBuild.ts index 5713b2a093..e9305c7462 100644 --- a/packages/engine-rn-windows/src/tasks/taskBuild.ts +++ b/packages/engine-rn-windows/src/tasks/taskBuild.ts @@ -1,38 +1,14 @@ -import { - RnvTaskFn, - executeOrSkipTask, - logErrorPlatform, - RnvTaskOptionPresets, - logTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { ruWindowsProject } from '../sdks/sdk-windows'; +import { RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { ruWindowsProject } from '../sdk'; +import { SdkPlatforms } from '../sdk/constants'; -const taskBuild: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskBuild'); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.package, RnvTaskName.build, originTask); - - if (shouldSkipTask(RnvTaskName.build, originTask)) return true; - - switch (platform) { - case 'xbox': - case 'windows': - return ruWindowsProject(c, { release: true, launch: false, deploy: false, logging: false }); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Build project binary', - fn: taskBuild, + dependsOn: [RnvTaskName.package], + fn: async () => { + return ruWindowsProject({ release: true, launch: false, deploy: false, logging: false }); + }, task: RnvTaskName.build, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['windows', 'xbox'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-windows/src/tasks/taskConfigure.ts b/packages/engine-rn-windows/src/tasks/taskConfigure.ts index dd86e211bb..87b6205904 100644 --- a/packages/engine-rn-windows/src/tasks/taskConfigure.ts +++ b/packages/engine-rn-windows/src/tasks/taskConfigure.ts @@ -1,47 +1,15 @@ -import { - logErrorPlatform, - copySharedPlatforms, - logTask, - RnvTaskOptionPresets, - RnvTaskFn, - configureEntryPoint, - executeTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { SDKWindows } from '../sdks'; +import { copySharedPlatforms, RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { configureWindowsProject } from '../sdk'; +import { SdkPlatforms } from '../sdk/constants'; -const { configureWindowsProject } = SDKWindows; - -const taskConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskConfigure'); - - await executeTask(RnvTaskName.platformConfigure, RnvTaskName.configure, originTask); - if (shouldSkipTask(RnvTaskName.configure, originTask)) return true; - await configureEntryPoint(c.platform); - - await copySharedPlatforms(); - - if (c.program.only && !!parentTask) { - return true; - } - - switch (c.platform) { - case 'xbox': - case 'windows': - return configureWindowsProject(c); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Configure current project', - fn: taskConfigure, + dependsOn: [RnvTaskName.platformConfigure], + fn: async () => { + await copySharedPlatforms(); + return configureWindowsProject(); + }, task: RnvTaskName.configure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['windows', 'xbox'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-windows/src/tasks/taskExport.ts b/packages/engine-rn-windows/src/tasks/taskExport.ts index b10f6dc0e6..8ab4c2aac2 100644 --- a/packages/engine-rn-windows/src/tasks/taskExport.ts +++ b/packages/engine-rn-windows/src/tasks/taskExport.ts @@ -1,43 +1,16 @@ -import { - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - RnvTaskFn, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { SDKWindows } from '../sdks'; +import { RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; +import { clearWindowsTemporaryFiles, packageWindowsApp } from '../sdk'; +import { SdkPlatforms } from '../sdk/constants'; // TODO Implement export windows app (currently it only seems to be available through VS Studio itself...) -const { packageWindowsApp, clearWindowsTemporaryFiles } = SDKWindows; - -const taskExport: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskExport', `parent:${parentTask}`); - - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.build, RnvTaskName.export, originTask); - - if (shouldSkipTask(RnvTaskName.export, originTask)) return true; - - switch (platform) { - case 'xbox': - case 'windows': - await clearWindowsTemporaryFiles(c); - return packageWindowsApp(c); - default: - logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Export the app into deployable binary', - fn: taskExport, + dependsOn: [RnvTaskName.build], + fn: async () => { + await clearWindowsTemporaryFiles(); + return packageWindowsApp(); + }, task: RnvTaskName.export, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['windows', 'xbox'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-windows/src/tasks/taskPackage.ts b/packages/engine-rn-windows/src/tasks/taskPackage.ts index edd2b2afd1..eaa8e93555 100644 --- a/packages/engine-rn-windows/src/tasks/taskPackage.ts +++ b/packages/engine-rn-windows/src/tasks/taskPackage.ts @@ -1,48 +1,18 @@ -import { - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - RnvTaskFn, - executeOrSkipTask, - shouldSkipTask, - getConfigProp, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { SDKWindows } from '../sdks'; +import { RnvTaskOptionPresets, getConfigProp, createTask, RnvTaskName } from '@rnv/core'; +import { SdkPlatforms } from '../sdk/constants'; +import { packageBundleForWindows } from '../sdk'; -const { packageBundleForWindows } = SDKWindows; - -const taskPackage: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskPackage', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.package, originTask); - - const bundleAssets = getConfigProp('bundleAssets'); - - if (!bundleAssets) { - return true; - } - - if (shouldSkipTask(RnvTaskName.package, originTask)) return true; - - switch (platform) { - case 'xbox': - case 'windows': - return packageBundleForWindows(c); - default: - logErrorPlatform(); - return false; - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Package source files into bundle', - fn: taskPackage, + dependsOn: [RnvTaskName.configure], + fn: async () => { + const bundleAssets = getConfigProp('bundleAssets'); + if (!bundleAssets) { + return true; + } + return packageBundleForWindows(); + }, task: RnvTaskName.package, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['windows', 'xbox'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-windows/src/tasks/taskRun.ts b/packages/engine-rn-windows/src/tasks/taskRun.ts index a21db06f91..3f0b022201 100644 --- a/packages/engine-rn-windows/src/tasks/taskRun.ts +++ b/packages/engine-rn-windows/src/tasks/taskRun.ts @@ -1,48 +1,19 @@ -import { - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - RnvTaskFn, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; -import { SDKWindows } from '../sdks'; +import { RnvTaskOptionPresets, createTask, RnvTaskName } from '@rnv/core'; import { startBundlerIfRequired, waitForBundlerIfRequired } from '@rnv/sdk-react-native'; +import { clearWindowsTemporaryFiles, ruWindowsProject } from '../sdk'; +import { SdkPlatforms } from '../sdk/constants'; -const { ruWindowsProject, clearWindowsTemporaryFiles } = SDKWindows; - -const taskRun: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { target } = c.runtime; - const { hosted } = c.program; - logTask('taskRun', `parent:${parentTask} port:${port} target:${target} hosted:${hosted}`); - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.run, originTask); - - if (shouldSkipTask(RnvTaskName.run, originTask)) return true; - - switch (platform) { - case 'xbox': - case 'windows': - await clearWindowsTemporaryFiles(c); - await startBundlerIfRequired(RnvTaskName.run, originTask); - await ruWindowsProject(c); - return waitForBundlerIfRequired(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { +export default createTask({ description: 'Run your app in a window on desktop', - fn: taskRun, + dependsOn: [RnvTaskName.configure], + fn: async ({ originTaskName }) => { + await clearWindowsTemporaryFiles(); + await startBundlerIfRequired(RnvTaskName.run, originTaskName); + await ruWindowsProject(); + return waitForBundlerIfRequired(); + }, task: RnvTaskName.run, isPriorityOrder: true, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun())), - platforms: ['windows', 'xbox'], -}; - -export default Task; + options: RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun()), + platforms: SdkPlatforms, +}); diff --git a/packages/engine-rn-windows/src/tasks/taskStart.ts b/packages/engine-rn-windows/src/tasks/taskStart.ts deleted file mode 100644 index c100a6b4b9..0000000000 --- a/packages/engine-rn-windows/src/tasks/taskStart.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskOptionPresets, - RnvTaskFn, - executeTask, - shouldSkipTask, - doResolve, - logError, - RnvTask, - PlatformKey, - RnvTaskName, -} from '@rnv/core'; -import { startReactNative } from '@rnv/sdk-react-native'; - -const BUNDLER_PLATFORMS: Partial> = {}; - -BUNDLER_PLATFORMS['windows'] = 'windows'; -BUNDLER_PLATFORMS['xbox'] = 'windows'; - -const taskStart: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { hosted } = c.program; - - logTask('taskStart', `parent:${parentTask} port:${c.runtime.port} hosted:${!!hosted}`); - - if (hosted) { - return logError('This platform does not support hosted mode', true); - } - // Disable reset for other commands (ie. cleaning platforms) - c.runtime.disableReset = true; - if (!parentTask) { - await executeTask(RnvTaskName.configureSoft, RnvTaskName.start, originTask); - } - - if (shouldSkipTask(RnvTaskName.start, originTask)) return true; - - switch (platform) { - case 'xbox': - case 'windows': { - return startReactNative({ - waitForBundler: !!parentTask, - customCliPath: `${doResolve('react-native')}/local-cli/cli.js`, - metroConfigName: 'metro.config.js', - }); - } - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Starts bundler / server', - fn: taskStart, - task: RnvTaskName.start, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['windows', 'xbox'], -}; - -export default Task; diff --git a/packages/engine-rn/.gitignore b/packages/engine-rn/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-rn/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-rn/.npmignore b/packages/engine-rn/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-rn/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-rn/package.json b/packages/engine-rn/package.json index fdc1196491..fc3870bc99 100644 --- a/packages/engine-rn/package.json +++ b/packages/engine-rn/package.json @@ -35,7 +35,8 @@ "@react-native/babel-preset": "0.73.21", "@rnv/sdk-android": "1.0.0-rc.12", "@rnv/sdk-apple": "1.0.0-rc.12", - "@rnv/sdk-react-native": "1.0.0-rc.12" + "@rnv/sdk-react-native": "1.0.0-rc.12", + "@rnv/adapter": "1.0.0-rc.12" }, "peerDependencies": { "@rnv/core": "^1.0.0-rc.12" diff --git a/packages/engine-rn/renative.engine.json b/packages/engine-rn/renative.engine.json index c323d113ef..b0612b0913 100644 --- a/packages/engine-rn/renative.engine.json +++ b/packages/engine-rn/renative.engine.json @@ -1,6 +1,7 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-rn", + "packageName": "@rnv/engine-rn", "engineExtension": "rn", "overview": "Default react-native based engine. Runs standard react native apps with native support", "plugins": { @@ -14,45 +15,16 @@ }, "platforms": { "ios": { - "engine": "engine-rn", - "npm": { - "devDependencies": {} - } + "engine": "engine-rn" }, "macos": { - "engine": "engine-rn", - "npm": { - "devDependencies": {} - } + "engine": "engine-rn" }, "android": { - "engine": "engine-rn", - "npm": { - "devDependencies": { - "jetifier": "2.0.0" - } - } + "engine": "engine-rn" }, "androidwear": { - "npm": { - "devDependencies": { - "jetifier": "2.0.0" - } - } - }, - "androidtv": { - "npm": { - "devDependencies": { - "jetifier": "2.0.0" - } - } - }, - "firetv": { - "npm": { - "devDependencies": { - "jetifier": "2.0.0" - } - } + "engine": "engine-rn" } } } diff --git a/packages/engine-rn/src/adapters/babelAdapter.ts b/packages/engine-rn/src/adapters/babelAdapter.ts index 69ce237bba..9943fe5742 100644 --- a/packages/engine-rn/src/adapters/babelAdapter.ts +++ b/packages/engine-rn/src/adapters/babelAdapter.ts @@ -1,4 +1,4 @@ -import { BabelConfig } from '@rnv/core'; +import { BabelConfig, withBabelPluginModuleResolver } from '@rnv/adapter'; export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { const plugins = cnf?.plugins || []; @@ -7,14 +7,6 @@ export const withRNVBabel = (cnf: BabelConfig): BabelConfig => { retainLines: true, presets: ['module:@react-native/babel-preset'], ...cnf, - plugins: [ - [ - require.resolve('babel-plugin-module-resolver'), - { - root: [process.env.RNV_MONO_ROOT || '.'], - }, - ], - ...plugins, - ], + plugins: [withBabelPluginModuleResolver(), ...plugins], }; }; diff --git a/packages/engine-rn/src/config.ts b/packages/engine-rn/src/config.ts new file mode 100644 index 0000000000..6eadb226bb --- /dev/null +++ b/packages/engine-rn/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileEngine } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.engine.json'; +export const Config: ConfigFileEngine = CNF; diff --git a/packages/engine-rn/src/getContext.ts b/packages/engine-rn/src/getContext.ts new file mode 100644 index 0000000000..f04c039d3a --- /dev/null +++ b/packages/engine-rn/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from '.'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/engine-rn/src/index.ts b/packages/engine-rn/src/index.ts index d8f65c5cd1..af6e8034bb 100644 --- a/packages/engine-rn/src/index.ts +++ b/packages/engine-rn/src/index.ts @@ -1,90 +1,48 @@ +import { createRnvEngine, GetContextType } from '@rnv/core'; +import { Tasks as TasksSdkAndroid } from '@rnv/sdk-android'; +import { Tasks as TasksSdkApple } from '@rnv/sdk-apple'; +import { Tasks as TasksSdkReactNative, withRNVRNConfig } from '@rnv/sdk-react-native'; import { withRNVMetro } from './adapters/metroAdapter'; import { withRNVBabel } from './adapters/babelAdapter'; +import { Config } from './config'; -//@ts-ignore -import CNF from '../renative.engine.json'; -import taskRun from './tasks/taskRun'; -import taskPackage from './tasks/taskPackage'; -import taskBuild from './tasks/taskBuild'; -import taskConfigure from './tasks/taskConfigure'; -import taskStart from './tasks/taskStart'; -import taskExport from './tasks/taskExport'; -import taskCryptoInstallCerts from './tasks/taskCryptoInstallCerts'; -import taskCryptoUpdateProfile from './tasks/taskCryptoUpdateProfile'; -import taskCryptoUpdateProfiles from './tasks/taskCryptoUpdateProfiles'; -import taskCryptoInstallProfiles from './tasks/taskCryptoInstallProfiles'; -import taskLog from './tasks/taskLog'; -import taskEject from './tasks/taskEject'; -import { generateEngineExtensions, generateEngineTasks, RnvEngine } from '@rnv/core'; -import { withRNVRNConfig } from '@rnv/sdk-react-native'; - -const Engine: RnvEngine = { - tasks: generateEngineTasks([ - taskRun, - taskPackage, - taskBuild, - taskConfigure, - taskStart, - taskExport, - taskEject, - taskCryptoInstallCerts, - taskCryptoUpdateProfile, - taskCryptoUpdateProfiles, - taskCryptoInstallProfiles, - taskLog, - ]), - config: CNF, +const Engine = createRnvEngine({ + tasks: [...TasksSdkAndroid, ...TasksSdkApple, ...TasksSdkReactNative], + config: Config, runtimeExtraProps: { reactNativePackageName: 'react-native', reactNativeMetroConfigName: 'metro.config.js', xcodeProjectName: 'RNVApp', }, - projectDirName: '', - serverDirName: '', - // package: '', - // ejectPlatform: null, platforms: { ios: { defaultPort: 8082, - extensions: generateEngineExtensions(['ios.mobile', 'mobile', 'ios', 'mobile.native', 'native'], CNF), + extensions: ['ios.mobile', 'mobile', 'ios', 'mobile.native', 'native'], }, android: { defaultPort: 8083, - extensions: generateEngineExtensions( - ['android.mobile', 'mobile', 'android', 'mobile.native', 'native'], - CNF - ), + extensions: ['android.mobile', 'mobile', 'android', 'mobile.native', 'native'], }, androidtv: { defaultPort: 8084, - extensions: generateEngineExtensions( - ['androidtv.tv', 'tv', 'androidtv', 'android', 'tv.native', 'native'], - CNF - ), + extensions: ['androidtv.tv', 'tv', 'androidtv', 'android', 'tv.native', 'native'], }, firetv: { defaultPort: 8098, - extensions: generateEngineExtensions( - ['firetv.tv', 'androidtv.tv', 'tv', 'firetv', 'androidtv', 'android', 'tv.native', 'native'], - CNF - ), + extensions: ['firetv.tv', 'androidtv.tv', 'tv', 'firetv', 'androidtv', 'android', 'tv.native', 'native'], }, androidwear: { defaultPort: 8084, - extensions: generateEngineExtensions( - ['androidwear.watch', 'watch', 'androidwear', 'android', 'watch.native', 'native'], - CNF - ), + extensions: ['androidwear.watch', 'watch', 'androidwear', 'android', 'watch.native', 'native'], }, macos: { defaultPort: 8086, - extensions: generateEngineExtensions( - ['macos.desktop', 'desktop', 'macos', 'ios', 'desktop.native', 'native'], - CNF - ), + extensions: ['macos.desktop', 'desktop', 'macos', 'ios', 'desktop.native', 'native'], }, }, -}; +}); + +export type GetContext = GetContextType; export default Engine; diff --git a/packages/engine-rn/src/tasks/__tests__/taskStart.test.ts b/packages/engine-rn/src/tasks/__tests__/taskStart.test.ts deleted file mode 100644 index 515f2f0b98..0000000000 --- a/packages/engine-rn/src/tasks/__tests__/taskStart.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { createRnvContext, executeTask, getContext } from '@rnv/core'; -import taskStart from '../taskStart'; -import { startReactNative } from '@rnv/sdk-react-native'; - -jest.mock('@rnv/core'); -jest.mock('@rnv/sdk-react-native'); - -beforeEach(() => { - createRnvContext(); -}); - -afterEach(() => { - jest.resetAllMocks(); -}); - -describe('taskStart', () => { - it('Execute task.rnv.start with no parent', async () => { - // GIVEN - const ctx = getContext(); - ctx.platform = 'ios'; - jest.mocked(executeTask).mockResolvedValueOnce(undefined); - // WHEN - await taskStart.fn?.(ctx, undefined, undefined); - // THEN - expect(startReactNative).toHaveBeenCalledWith({ waitForBundler: true }); - }); - it('Execute task.rnv.start', async () => { - // GIVEN - const ctx = getContext(); - ctx.platform = 'ios'; - // WHEN - await taskStart.fn?.(ctx, 'parent', undefined); - // THEN - expect(startReactNative).toHaveBeenCalledWith({ waitForBundler: false }); - }); -}); diff --git a/packages/engine-rn/src/tasks/taskBuild.ts b/packages/engine-rn/src/tasks/taskBuild.ts deleted file mode 100644 index d4347ee6b7..0000000000 --- a/packages/engine-rn/src/tasks/taskBuild.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskFn, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { buildReactNativeAndroid } from '@rnv/sdk-react-native'; -import { buildXcodeProject } from '@rnv/sdk-apple'; - -const taskBuild: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskBuild'); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.package, RnvTaskName.build, originTask); - - if (shouldSkipTask(RnvTaskName.build, originTask)) return true; - - switch (platform) { - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - return buildReactNativeAndroid(); - case 'ios': - case 'macos': - if (parentTask === RnvTaskName.export) { - // build task is not necessary when exporting ios - return true; - } - return buildXcodeProject(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Build project binary', - fn: taskBuild, - task: RnvTaskName.build, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['ios', 'android', 'androidtv', 'androidwear', 'macos'], -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskConfigure.ts b/packages/engine-rn/src/tasks/taskConfigure.ts deleted file mode 100644 index 8a04c3a121..0000000000 --- a/packages/engine-rn/src/tasks/taskConfigure.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskFn, - configureEntryPoint, - executeTask, - shouldSkipTask, - jetifyIfRequired, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { configureGradleProject } from '@rnv/sdk-android'; -import { configureXcodeProject } from '@rnv/sdk-apple'; -import { configureFonts } from '@rnv/sdk-react-native'; - -const taskConfigure: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskConfigure'); - - await executeTask(RnvTaskName.platformConfigure, RnvTaskName.configure, originTask); - if (shouldSkipTask(RnvTaskName.configure, originTask)) return true; - - await configureEntryPoint(c.platform); - - if (c.program.only && !!parentTask) { - return true; - } - - switch (c.platform) { - case 'ios': - case 'macos': - await configureXcodeProject(); - break; - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - await configureGradleProject(); - await jetifyIfRequired(); - break; - default: - logErrorPlatform(); - break; - } - - await configureFonts(); - return true; -}; - -const Task: RnvTask = { - description: 'Configure current project', - fn: taskConfigure, - task: RnvTaskName.configure, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['ios', 'android', 'androidtv', 'androidwear', 'macos'], -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskCryptoInstallCerts.ts b/packages/engine-rn/src/tasks/taskCryptoInstallCerts.ts deleted file mode 100644 index 6f96a86740..0000000000 --- a/packages/engine-rn/src/tasks/taskCryptoInstallCerts.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - logTask, - RnvTaskFn, - executeTask, - shouldSkipTask, - executeAsync, - logError, - getFileListSync, - logWarning, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; - -const taskCryptoInstallCerts: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskCryptoInstallCerts'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoInstallCerts, originTask); - - if (shouldSkipTask(RnvTaskName.cryptoInstallCerts, originTask)) return true; - - if (c.platform !== 'ios') { - logError(`_installTempCerts: platform ${c.platform} not supported`); - return true; - } - const kChain = c.program.keychain || 'ios-build.keychain'; - - const list = getFileListSync(c.paths.workspace.project.dir); - const cerArr = list.filter((v) => v.endsWith('.cer')); - - try { - Promise.all(cerArr.map((v) => executeAsync(`security import ${v} -k ${kChain} -A`))); - } catch (e) { - logWarning(e); - return true; - } -}; - -const Task: RnvTask = { - description: 'Installs certificates into keychain (mac only)', - fn: taskCryptoInstallCerts, - task: RnvTaskName.cryptoInstallCerts, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - // skipPlatforms: true, -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskCryptoInstallProfiles.ts b/packages/engine-rn/src/tasks/taskCryptoInstallProfiles.ts deleted file mode 100644 index 1b90be0aff..0000000000 --- a/packages/engine-rn/src/tasks/taskCryptoInstallProfiles.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { copyFileSync, mkdirSync } from 'fs'; -import path from 'path'; -import { - logTask, - RnvTaskFn, - executeTask, - shouldSkipTask, - logError, - fsExistsSync, - logWarning, - getFileListSync, - logDebug, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; - -const taskCryptoInstallProfiles: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskCryptoInstallProfiles'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoInstallProfiles, originTask); - - if (shouldSkipTask(RnvTaskName.cryptoInstallProfiles, originTask)) return true; - - if (c.platform !== 'ios') { - logError(`taskCryptoInstallProfiles: platform ${c.platform} not supported`); - return true; - } - - const ppFolder = path.join(c.paths.home.dir, 'Library/MobileDevice/Provisioning Profiles'); - - if (!fsExistsSync(ppFolder)) { - logWarning(`folder ${ppFolder} does not exist!`); - mkdirSync(ppFolder); - } - - const list = getFileListSync(c.paths.workspace.project.dir); - const mobileprovisionArr = list.filter((v) => v.endsWith('.mobileprovision')); - - try { - mobileprovisionArr.forEach((v) => { - logDebug(`taskCryptoInstallProfiles: Installing: ${v}`); - copyFileSync(v, ppFolder); - }); - } catch (e) { - logError(e); - } - - return true; -}; - -const Task: RnvTask = { - description: 'Installs provisioning certificates found in your workspace (mac only)', - fn: taskCryptoInstallProfiles, - task: RnvTaskName.cryptoInstallProfiles, - options: RnvTaskOptionPresets.withBase(), - platforms: [], - // skipPlatforms: true, -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskCryptoUpdateProfile.ts b/packages/engine-rn/src/tasks/taskCryptoUpdateProfile.ts deleted file mode 100644 index 2903e14182..0000000000 --- a/packages/engine-rn/src/tasks/taskCryptoUpdateProfile.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { logTask, RnvTaskFn, executeTask, shouldSkipTask, RnvTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; -import { updateProfile } from '@rnv/sdk-apple'; - -const taskCryptoUpdateProfile: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskCryptoUpdateProfile'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoUpdateProfile, originTask); - - if (shouldSkipTask(RnvTaskName.cryptoUpdateProfile, originTask)) return true; - - await updateProfile(); -}; - -const Task: RnvTask = { - description: 'Update provisioning profile (mac only)', - fn: taskCryptoUpdateProfile, - task: RnvTaskName.cryptoUpdateProfile, - options: RnvTaskOptionPresets.withBase(), - platforms: ['ios'], - // skipPlatforms: true, -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskCryptoUpdateProfiles.ts b/packages/engine-rn/src/tasks/taskCryptoUpdateProfiles.ts deleted file mode 100644 index 7e49fb907a..0000000000 --- a/packages/engine-rn/src/tasks/taskCryptoUpdateProfiles.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - logTask, - RnvTaskFn, - executeTask, - shouldSkipTask, - chalk, - RnvContext, - listAppConfigsFoldersSync, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { updateProfile } from '@rnv/sdk-apple'; - -const _updateProfile = (c: RnvContext, v: string) => - new Promise((resolve, reject) => { - logTask(`_updateProfile:${v}`, chalk().grey); - updateProfile() - .then(() => resolve()) - .catch((e) => reject(e)); - }); - -const _updateProfiles = (c: RnvContext) => { - logTask('_updateProfiles', chalk().grey); - const acList = listAppConfigsFoldersSync(true); - - return acList.reduce((previousPromise, v) => previousPromise.then(() => _updateProfile(c, v)), Promise.resolve()); -}; - -const taskCryptoUpdateProfiles: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskCryptoUpdateProfiles'); - - await executeTask(RnvTaskName.projectConfigure, RnvTaskName.cryptoUpdateProfiles, originTask); - - if (shouldSkipTask(RnvTaskName.cryptoUpdateProfiles, originTask)) return true; - - switch (c.platform) { - case 'ios': - await _updateProfiles(c); - break; - default: - return true; - } - return Promise.reject(`updateProfiles: Platform ${c.platform} not supported`); -}; - -const Task: RnvTask = { - description: 'Will attempt to update all provisioning profiles (mac only)', - fn: taskCryptoUpdateProfiles, - task: RnvTaskName.cryptoUpdateProfiles, - options: RnvTaskOptionPresets.withBase(), - platforms: ['ios'], - // skipPlatforms: true, -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskEject.ts b/packages/engine-rn/src/tasks/taskEject.ts deleted file mode 100644 index a926f3f551..0000000000 --- a/packages/engine-rn/src/tasks/taskEject.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskFn, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { ejectGradleProject } from '@rnv/sdk-android'; -import { ejectXcodeProject } from '@rnv/sdk-apple'; - -const taskEject: RnvTaskFn = async (c, _parentTask, originTask) => { - logTask('taskEject'); - const { platform } = c; - - c.runtime._platformBuildsSuffix = '_eject'; - - switch (platform) { - case 'android': - case 'androidtv': - case 'androidwear': - c.runtime._platformBuildsSuffix = '_eject/android'; - break; - default: - // Do nothing - } - - c.runtime._skipNativeDepResolutions = true; - - await executeOrSkipTask(RnvTaskName.package, RnvTaskName.eject, originTask); - - if (shouldSkipTask(RnvTaskName.eject, originTask)) return true; - - switch (platform) { - case 'ios': - case 'macos': - await ejectXcodeProject(); - return true; - case 'android': - case 'androidtv': - case 'androidwear': - await ejectGradleProject(); - return true; - default: - await logErrorPlatform(); - return true; - } -}; - -const Task: RnvTask = { - description: 'Eject current project app to self contained native project', - fn: taskEject, - task: RnvTaskName.eject, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['ios', 'android', 'androidtv', 'androidwear', 'macos'], -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskExport.ts b/packages/engine-rn/src/tasks/taskExport.ts deleted file mode 100644 index 549e073cb1..0000000000 --- a/packages/engine-rn/src/tasks/taskExport.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskFn, - executeOrSkipTask, - shouldSkipTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { exportXcodeProject } from '@rnv/sdk-apple'; - -const taskExport: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskExport', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.build, RnvTaskName.export, originTask); - - if (shouldSkipTask(RnvTaskName.export, originTask)) return true; - - switch (platform) { - case 'ios': - case 'macos': - return exportXcodeProject(); - case 'android': - case 'androidtv': - case 'androidwear': - // Android Platforms don't need extra export step - return true; - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Export the app into deployable binary', - fn: taskExport, - task: RnvTaskName.export, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['ios', 'android', 'androidtv', 'androidwear', 'macos'], -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskLog.ts b/packages/engine-rn/src/tasks/taskLog.ts deleted file mode 100644 index 3f07c342a5..0000000000 --- a/packages/engine-rn/src/tasks/taskLog.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskFn, - executeTask, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { runAndroidLog, checkAndConfigureAndroidSdks } from '@rnv/sdk-android'; -import { runAppleLog } from '@rnv/sdk-apple'; - -import {} from '@rnv/sdk-android'; - -const taskLog: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskLog', `parent:${parentTask}`); - - await executeTask(RnvTaskName.workspaceConfigure, RnvTaskName.projectConfigure, originTask); - - switch (c.platform) { - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - await checkAndConfigureAndroidSdks(); - return runAndroidLog(); - case 'ios': - return runAppleLog(); - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Attach logger to device or emulator and print out logs', - fn: taskLog, - task: RnvTaskName.log, - options: RnvTaskOptionPresets.withBase(), - platforms: ['ios', 'android', 'androidtv', 'androidwear', 'macos'], - isGlobalScope: true, -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskPackage.ts b/packages/engine-rn/src/tasks/taskPackage.ts deleted file mode 100644 index 14cb0929e2..0000000000 --- a/packages/engine-rn/src/tasks/taskPackage.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskFn, - executeOrSkipTask, - shouldSkipTask, - getConfigProp, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { packageAndroid } from '@rnv/sdk-android'; -import { packageBundleForXcode } from '@rnv/sdk-apple'; - -const taskPackage: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskPackage', `parent:${parentTask}`); - const { platform } = c; - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.package, originTask); - - if (shouldSkipTask(RnvTaskName.package, originTask)) return true; - - const bundleAssets = getConfigProp('bundleAssets'); - - if (!bundleAssets) { - return true; - } - - switch (platform) { - case 'ios': - case 'macos': - return packageBundleForXcode(); - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': { - // NOTE: react-native v0.73 triggers packaging automatically so we skipping it unless we need to - // package it explicitly for tasks where it is not triggered automatically - - const signingConfig = getConfigProp('signingConfig'); - - if (originTask === RnvTaskName.eject || signingConfig !== 'Release') { - //if bundleAssets === true AND signingConfig is not releaase RN will not trigger packaging - return packageAndroid(); - } - return true; - } - default: - logErrorPlatform(); - return false; - } -}; - -const Task: RnvTask = { - description: 'Package source files into bundle', - fn: taskPackage, - task: RnvTaskName.package, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['ios', 'android', 'androidtv', 'androidwear', 'macos'], -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskRun.ts b/packages/engine-rn/src/tasks/taskRun.ts deleted file mode 100644 index 5b82196228..0000000000 --- a/packages/engine-rn/src/tasks/taskRun.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskFn, - executeOrSkipTask, - shouldSkipTask, - logRaw, - getConfigProp, - logSummary, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { packageAndroid, runAndroid, getAndroidDeviceToRunOn } from '@rnv/sdk-android'; -import { runXcodeProject, getIosDeviceToRunOn } from '@rnv/sdk-apple'; -import { startBundlerIfRequired, waitForBundlerIfRequired } from '@rnv/sdk-react-native'; - -const taskRun: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { port } = c.runtime; - const { hosted } = c.program; - logTask('taskRun', `parent:${parentTask} port:${port} hosted:${hosted}`); - - await executeOrSkipTask(RnvTaskName.configure, RnvTaskName.run, originTask); - - if (shouldSkipTask(RnvTaskName.run, originTask)) return true; - - const bundleAssets = getConfigProp('bundleAssets', false); - - switch (platform) { - case 'ios': - case 'macos': - // eslint-disable-next-line no-case-declarations - const runDeviceArgs = await getIosDeviceToRunOn(c); - if (!c.program.only) { - await startBundlerIfRequired(RnvTaskName.run, originTask); - await runXcodeProject(runDeviceArgs); - if (!bundleAssets) { - logSummary('BUNDLER STARTED'); - } - return waitForBundlerIfRequired(); - } - return runXcodeProject(runDeviceArgs); - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - // eslint-disable-next-line no-case-declarations - const runDevice = await getAndroidDeviceToRunOn(); - if (runDevice) { - c.runtime.target = runDevice?.name || runDevice?.udid; - } - if (!c.program.only) { - await startBundlerIfRequired(RnvTaskName.run, originTask); - if (bundleAssets || platform === 'androidwear') { - await packageAndroid(); - } - await runAndroid(runDevice!); - if (!bundleAssets) { - logSummary('BUNDLER STARTED'); - } - return waitForBundlerIfRequired(); - } - return runAndroid(runDevice!); - default: - return logErrorPlatform(); - } -}; - -const taskRunHelp = async () => { - logRaw(` -More info at: https://renative.org/docs/api-cli -`); -}; - -const Task: RnvTask = { - description: 'Run your rn app on target device or emulator', - fn: taskRun, - fnHelp: taskRunHelp, - task: RnvTaskName.run, - isPriorityOrder: true, - // dependencies: { - // before: RnvTaskName.configure, - // }, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun())), - platforms: ['ios', 'android', 'androidtv', 'androidwear', 'macos'], -}; - -export default Task; diff --git a/packages/engine-rn/src/tasks/taskStart.ts b/packages/engine-rn/src/tasks/taskStart.ts deleted file mode 100644 index 2840748c69..0000000000 --- a/packages/engine-rn/src/tasks/taskStart.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - logErrorPlatform, - logTask, - RnvTaskFn, - executeTask, - shouldSkipTask, - logError, - RnvTask, - RnvTaskName, - RnvTaskOptionPresets, -} from '@rnv/core'; -import { startReactNative } from '@rnv/sdk-react-native'; - -const taskStart: RnvTaskFn = async (c, parentTask, originTask) => { - const { platform } = c; - const { hosted } = c.program; - - logTask('taskStart', `parent:${parentTask} port:${c.runtime.port} hosted:${!!hosted}`); - - if (hosted) { - return logError('This platform does not support hosted mode', true); - } - // Disable reset for other commands (ie. cleaning platforms) - c.runtime.disableReset = true; - if (!parentTask) { - await executeTask(RnvTaskName.configureSoft, RnvTaskName.start, originTask); - } - - if (shouldSkipTask(RnvTaskName.start, originTask)) return true; - - switch (platform) { - case 'ios': - case 'macos': - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': { - return startReactNative({ waitForBundler: !parentTask }); - } - default: - return logErrorPlatform(); - } -}; - -const Task: RnvTask = { - description: 'Starts bundler / server', - fn: taskStart, - task: RnvTaskName.start, - options: RnvTaskOptionPresets.withBase(RnvTaskOptionPresets.withConfigure()), - platforms: ['ios', 'android', 'androidtv', 'androidwear', 'macos'], -}; - -export default Task; diff --git a/packages/engine-rn/templates/platforms/android/app/src/main/AndroidManifest.xml b/packages/engine-rn/templates/platforms/android/app/src/main/AndroidManifest.xml index de39d3d501..62d079c778 100755 --- a/packages/engine-rn/templates/platforms/android/app/src/main/AndroidManifest.xml +++ b/packages/engine-rn/templates/platforms/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ {{PLUGIN_MANIFEST_FILE}} \ No newline at end of file diff --git a/packages/engine-rn/templates/platforms/androidwear/app/src/main/AndroidManifest.xml b/packages/engine-rn/templates/platforms/androidwear/app/src/main/AndroidManifest.xml index 43d72d41ee..69def7d3ae 100755 --- a/packages/engine-rn/templates/platforms/androidwear/app/src/main/AndroidManifest.xml +++ b/packages/engine-rn/templates/platforms/androidwear/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ {{PLUGIN_MANIFEST_FILE}} \ No newline at end of file diff --git a/packages/engine-rn/templates/platforms/ios/Podfile b/packages/engine-rn/templates/platforms/ios/Podfile index 80770050c4..93c1d15fcf 100755 --- a/packages/engine-rn/templates/platforms/ios/Podfile +++ b/packages/engine-rn/templates/platforms/ios/Podfile @@ -65,6 +65,19 @@ target 'RNVApp' do :mac_catalyst_enabled => false ) {{INJECT_POST_INSTALL}} + + installer.pods_project.targets.each do |target| + if target.name == 'Flipper' + file_path = 'Pods/Flipper/xplat/Flipper/FlipperTransportTypes.h' + contents = File.read(file_path) + unless contents.include?('#include ') + File.open(file_path, 'w') do |file| + file.puts('#include ') + file.puts(contents) + end + end + end + end end end diff --git a/packages/engine-roku/.gitignore b/packages/engine-roku/.gitignore deleted file mode 100644 index 4b15278a7a..0000000000 --- a/packages/engine-roku/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -!pluginTemplates/**/dist diff --git a/packages/engine-roku/.npmignore b/packages/engine-roku/.npmignore deleted file mode 100644 index d9ddfacb67..0000000000 --- a/packages/engine-roku/.npmignore +++ /dev/null @@ -1,54 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -platformBuilds/ -platformAssets/ - -package-lock.json - -Dockerfile -coverage/ diff --git a/packages/engine-roku/renative.engine.json b/packages/engine-roku/renative.engine.json index d56c8f374e..5f307c819a 100644 --- a/packages/engine-roku/renative.engine.json +++ b/packages/engine-roku/renative.engine.json @@ -1,6 +1,7 @@ { "$schema": "../../.rnv/schema/rnv.engine.json", "id": "engine-roku", + "packageName": "@rnv/engine-roku", "engineExtension": "rk", "overview": "ReNative Roku Engine", "plugins": {}, diff --git a/packages/integration-docker/renative.integration.json b/packages/integration-docker/renative.integration.json index df4ce83ade..322f0939a5 100644 --- a/packages/integration-docker/renative.integration.json +++ b/packages/integration-docker/renative.integration.json @@ -1,5 +1,5 @@ { "$schema": "../../.rnv/schema/rnv.integration.json", "id": "docker", - "npmPackage": "@rnv/integration-docker" + "packageName": "@rnv/integration-docker" } diff --git a/packages/integration-docker/src/config.ts b/packages/integration-docker/src/config.ts new file mode 100644 index 0000000000..282475cf5e --- /dev/null +++ b/packages/integration-docker/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileIntegration } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.integration.json'; +export const Config: ConfigFileIntegration = CNF; diff --git a/packages/integration-docker/src/docker.ts b/packages/integration-docker/src/docker.ts index 4c23b71753..d7d61bae21 100644 --- a/packages/integration-docker/src/docker.ts +++ b/packages/integration-docker/src/docker.ts @@ -83,11 +83,8 @@ class Docker { async saveImage() { const { c } = this; - const { - runtime, - files, - program: { scheme = 'debug' }, - } = c; + const { runtime, files, program } = c; + const scheme = program?.opts()?.scheme || 'debug'; const imageName = runtime.appId?.toLowerCase(); const appVersion = files.project.package.version; diff --git a/packages/integration-docker/src/index.ts b/packages/integration-docker/src/index.ts index 153b75c451..8cac0b5cf0 100644 --- a/packages/integration-docker/src/index.ts +++ b/packages/integration-docker/src/index.ts @@ -1,16 +1,11 @@ import taskDockerDeploy from './tasks/taskDockerDeploy'; import taskDockerExport from './tasks/taskDockerExport'; -//@ts-ignore -import config from '../renative.integration.json'; -import { RnvIntegration } from '@rnv/core'; +import { createRnvIntegration } from '@rnv/core'; +import { Config } from './config'; -const TASKS = [taskDockerExport, taskDockerDeploy]; - -const getTasks = () => TASKS; - -const Integration: RnvIntegration = { - getTasks, - config, -}; +const Integration = createRnvIntegration({ + tasks: [taskDockerExport, taskDockerDeploy], + config: Config, +}); export default Integration; diff --git a/packages/integration-docker/src/tasks/taskDockerDeploy.ts b/packages/integration-docker/src/tasks/taskDockerDeploy.ts index 62cd8863c5..b579ec2b40 100644 --- a/packages/integration-docker/src/tasks/taskDockerDeploy.ts +++ b/packages/integration-docker/src/tasks/taskDockerDeploy.ts @@ -1,37 +1,13 @@ -import { - RnvTaskFn, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - initializeTask, - findSuitableTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { createTask, RnvTaskName } from '@rnv/core'; import Docker from '../docker'; -const taskDockerDeploy: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskDockerDeploy', `parent:${parentTask}`); - - if (c.program.only) { - // If run as standalone command skip all the export - await executeOrSkipTask(RnvTaskName.export, 'docker export', originTask); - } else { - const taskInstance = await findSuitableTask(RnvTaskName.export); - if (taskInstance) await initializeTask(taskInstance.task); - } - - const docker = new Docker(); - await docker.doDeploy(); - return true; -}; - -const Task: RnvTask = { +export default createTask({ + dependsOn: [RnvTaskName.export], description: 'Deploys your project to docker image', - fn: taskDockerDeploy, + fn: async () => { + const docker = new Docker(); + return docker.doDeploy(); + }, task: 'docker deploy', - options: RnvTaskOptionPresets.withBase(), platforms: ['web'], -}; - -export default Task; +}); diff --git a/packages/integration-docker/src/tasks/taskDockerExport.ts b/packages/integration-docker/src/tasks/taskDockerExport.ts index 7fd2b18bc1..69c737e02d 100644 --- a/packages/integration-docker/src/tasks/taskDockerExport.ts +++ b/packages/integration-docker/src/tasks/taskDockerExport.ts @@ -1,37 +1,15 @@ -import { - RnvTaskFn, - logTask, - RnvTaskOptionPresets, - executeOrSkipTask, - initializeTask, - findSuitableTask, - RnvTask, - RnvTaskName, -} from '@rnv/core'; +import { createTask, RnvTaskName } from '@rnv/core'; import Docker from '../docker'; -const taskDockerExport: RnvTaskFn = async (c, parentTask, originTask) => { - logTask('taskDockerExport', `parent:${parentTask}`); - - if (c.program.only) { - // If run as standalone command skip all the export - await executeOrSkipTask(RnvTaskName.export, 'docker export', originTask); - } else { - const taskInstance = await findSuitableTask(RnvTaskName.export); - if (taskInstance) await initializeTask(taskInstance.task); - } - - const docker = new Docker(); - await docker.doExport(); - return true; -}; - -const Task: RnvTask = { +export default createTask({ description: 'Exports your project to docker image', - fn: taskDockerExport, + // TODO: we need to do this differently + // Project neds to define pipeline of tasks instead of integration + dependsOn: [RnvTaskName.export], + fn: async () => { + const docker = new Docker(); + await docker.doExport(); + }, task: 'docker export', - options: RnvTaskOptionPresets.withBase(), platforms: ['web'], -}; - -export default Task; +}); diff --git a/packages/integration-starter/renative.integration.json b/packages/integration-starter/renative.integration.json index 4f566ce229..c16d6679b4 100644 --- a/packages/integration-starter/renative.integration.json +++ b/packages/integration-starter/renative.integration.json @@ -1,5 +1,5 @@ { "$schema": "../../.rnv/schema/rnv.integration.json", "id": "starter", - "npmPackage": "@rnv/integration-starter" + "packageName": "@rnv/integration-starter" } diff --git a/packages/integration-starter/src/config.ts b/packages/integration-starter/src/config.ts new file mode 100644 index 0000000000..282475cf5e --- /dev/null +++ b/packages/integration-starter/src/config.ts @@ -0,0 +1,4 @@ +import type { ConfigFileIntegration } from '@rnv/core'; +//@ts-ignore +import CNF from '../renative.integration.json'; +export const Config: ConfigFileIntegration = CNF; diff --git a/packages/integration-starter/src/index.ts b/packages/integration-starter/src/index.ts index 49078ece38..115f8feccb 100644 --- a/packages/integration-starter/src/index.ts +++ b/packages/integration-starter/src/index.ts @@ -1,13 +1,11 @@ import taskStarterHello from './tasks/taskStarterHello'; import taskSingleCommand from './tasks/taskSingleCommand'; +import { createRnvIntegration } from '@rnv/core'; +import { Config } from './config'; -//@ts-ignore -import config from '../renative.integration.json'; -import { RnvIntegration } from '@rnv/core'; - -const Integration: RnvIntegration = { - getTasks: () => [taskStarterHello, taskSingleCommand], - config, -}; +const Integration = createRnvIntegration({ + tasks: [taskStarterHello, taskSingleCommand], + config: Config, +}); export default Integration; diff --git a/packages/integration-starter/src/tasks/taskSingleCommand.ts b/packages/integration-starter/src/tasks/taskSingleCommand.ts index 95988e8caa..28d6324f71 100644 --- a/packages/integration-starter/src/tasks/taskSingleCommand.ts +++ b/packages/integration-starter/src/tasks/taskSingleCommand.ts @@ -1,16 +1,16 @@ -import { RnvContext, RnvTaskOptionPresets, logSuccess, RnvTask, RnvTaskFn } from '@rnv/core'; +import { RnvTaskName, createTask, logSuccess } from '@rnv/core'; -const task: RnvTaskFn = async (c: RnvContext) => { - logSuccess(`Hello from Integration Starter single command! ---my-opt: "${c.program.myOpt}"`); -}; - -const Task: RnvTask = { +export default createTask({ description: 'Prints hello message', - fn: task, + dependsOn: [RnvTaskName.package], + beforeDependsOn: async () => { + console.log('>>> beforeDependsOn called!!!'); + }, + fn: async ({ ctx }) => { + logSuccess(`Hello from Integration Starter single command! + --my-opt value: ${ctx.program.opts().myOpt}`); + }, task: 'starter-single-command', - options: RnvTaskOptionPresets.withBase([{ key: 'my-opt', description: 'Hello', isValueType: true }]), - platforms: [], -}; - -export default Task; + platforms: ['ios', 'android'], + options: [{ key: 'my-opt', description: 'Hello', isValueType: true }], +}); diff --git a/packages/integration-starter/src/tasks/taskStarterHello.ts b/packages/integration-starter/src/tasks/taskStarterHello.ts index 14193740e5..9545d25e9c 100644 --- a/packages/integration-starter/src/tasks/taskStarterHello.ts +++ b/packages/integration-starter/src/tasks/taskStarterHello.ts @@ -1,16 +1,13 @@ -import { RnvContext, RnvTaskOptionPresets, logSuccess, RnvTask, RnvTaskFn } from '@rnv/core'; +import { RnvTaskName, createTask, logSuccess } from '@rnv/core'; -const task: RnvTaskFn = async (c: RnvContext) => { - logSuccess(`Hello from Integration Starter! ---my-opt: "${c.program.myOpt}"`); -}; - -const Task: RnvTask = { +export default createTask({ description: 'Prints hello message', - fn: task, + dependsOn: [RnvTaskName.package], + fn: async ({ ctx }) => { + logSuccess(`Hello from Integration Starter! +--my-opt value: ${ctx.program.opts().myOpt}`); + }, task: 'starter hello', - options: RnvTaskOptionPresets.withBase([{ key: 'my-opt', description: 'Hello', isValueType: true }]), - platforms: [], -}; - -export default Task; + platforms: ['ios'], + options: [{ key: 'my-opt', description: 'Hello', isValueType: true }], +}); diff --git a/packages/plugins/README.md b/packages/plugins/README.md deleted file mode 100644 index 8835da8b1a..0000000000 --- a/packages/plugins/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# @rnv/plugins - diff --git a/packages/rnv/.gitignore b/packages/rnv/.gitignore deleted file mode 100644 index b1df6575cc..0000000000 --- a/packages/rnv/.gitignore +++ /dev/null @@ -1,52 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android Studio -# -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -index/ - -# BUCK -buck-out/ -\.buckd/ - -# Visual Studio -# -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -package-lock.json - -dist/ -lib/ -!pluginTemplates/**/dist diff --git a/packages/rnv/bin/index.js b/packages/rnv/bin/index.js deleted file mode 100755 index 967b28b86a..0000000000 --- a/packages/rnv/bin/index.js +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env node - -'use strict'; - -var cli = require('@rnv/cli'); - -if (require.main === module) { - cli.run(); -} - -module.exports = cli; diff --git a/packages/rnv/coreTemplateFiles/.gitignore.tpl b/packages/rnv/coreTemplateFiles/.gitignore.tpl deleted file mode 100644 index bff41ac458..0000000000 --- a/packages/rnv/coreTemplateFiles/.gitignore.tpl +++ /dev/null @@ -1,35 +0,0 @@ -# -------------------------------- -# Generated by ReNative -# -------------------------------- - -.DS_Store -node_modules/ -npm-debug.log -yarn-error.log -.env -.next -.expo - -#------------------------------- -# Visual Studio -#------------------------------- -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -#------------------------------- -# RENATIVE -#------------------------------- - -platformBuilds/ -platformAssets/ -buildHooks/dist -buildHooks/lib -renative.local.json -renative.private.json -renative.build.json -renative.runtime.json -rnv-config.local.json -metro.config.local.js diff --git a/packages/rnv/coreTemplateFiles/buildHooks/tsconfig.json b/packages/rnv/coreTemplateFiles/buildHooks/tsconfig.json deleted file mode 100644 index 82dac4d899..0000000000 --- a/packages/rnv/coreTemplateFiles/buildHooks/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "@rnv/core/tsconfig.hooks.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "src" - } -} diff --git a/packages/rnv/coreTemplateFiles/global-config-template.json b/packages/rnv/coreTemplateFiles/global-config-template.json deleted file mode 100644 index 85b56a76cd..0000000000 --- a/packages/rnv/coreTemplateFiles/global-config-template.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "sdks": { - "ANDROID_SDK": "/Users//Library/Android/sdk", - "ANDROID_NDK": "/Users//Library/Android/sdk/ndk-bundle", - "TIZEN_SDK": "/Users//tizen-studio", - "WEBOS_SDK": "/Users//Library/webOS_TV_SDK", - "KAIOS_SDK": "/Applications/KaiosSimulators" - }, - "defaultTargets": { - "android": "Nexus_5X_API_26", - "androidtv": "Android_TV_720p_API_22", - "firetv": "Android_TV_720p_API_22", - "androidwear": "Android_Wear_Round_API_28", - "ios": "iPhone 8", - "tvos": "Apple TV", - "tizen": "T-samsung-5.5-x86", - "tizenwatch": "W-5.5-circle-x86", - "tizenmobile": "mobile-5.5-x86", - "webos": "emulator", - "kaios": "Kaiosrtv3.0_ubuntu" - } -} diff --git a/packages/rnv/coreTemplateFiles/permissions.json b/packages/rnv/coreTemplateFiles/permissions.json deleted file mode 100644 index 71776356cb..0000000000 --- a/packages/rnv/coreTemplateFiles/permissions.json +++ /dev/null @@ -1,420 +0,0 @@ -{ - "permissions": { - "ios": { - "NSAppleMusicUsageDescription": { - "key": "NSAppleMusicUsageDescription", - "desc": "Get favorite music" - }, - "NSBluetoothPeripheralUsageDescription": { - "key": "NSBluetoothPeripheralUsageDescription", - "desc": "Allow you to use your bluetooth to play music" - }, - "NSCalendarsUsageDescription": { - "key": "NSCalendarsUsageDescription", - "desc": "Calendar for add events" - }, - "NSCameraUsageDescription": { - "key": "NSCameraUsageDescription", - "desc": "Need camera to scan QR Codes" - }, - "NSLocationWhenInUseUsageDescription": { - "key": "NSLocationWhenInUseUsageDescription", - "desc": "Geolocation tags for photos" - }, - "NSLocationAlwaysAndWhenInUseUsageDescription": { - "key": "NSLocationAlwaysAndWhenInUseUsageDescription", - "desc": "Geolocation tags for photos" - }, - "NSLocationAlwaysUsageDescription": { - "key": "NSLocationAlwaysUsageDescription", - "desc": "Geolocation tags for photos" - }, - "NSMicrophoneUsageDescription": { - "key": "NSMicrophoneUsageDescription", - "desc": "Need microphone for videos" - }, - "NSMotionUsageDescription": { - "key": "NSMotionUsageDescription", - "desc": "To know when device is moving" - }, - "NSPhotoLibraryAddUsageDescription": { - "key": "NSPhotoLibraryAddUsageDescription", - "desc": "Need library to save images" - }, - "NSPhotoLibraryUsageDescription": { - "key": "NSPhotoLibraryUsageDescription", - "desc": "Allows to upload images from photo library" - }, - "NSSpeechRecognitionUsageDescription": { - "key": "NSSpeechRecognitionUsageDescription", - "desc": "Speech Recognition to run in app commands" - } - }, - "android": { - "ACCESS_LOCATION_EXTRA_COMMANDS": { - "key": "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS", - "security": "normal" - }, - "ACCESS_NETWORK_STATE": { - "key": "android.permission.ACCESS_NETWORK_STATE", - "security": "normal" - }, - "ACCESS_NOTIFICATION_POLICY": { - "key": "android.permission.ACCESS_NOTIFICATION_POLICY", - "security": "normal" - }, - "ACCESS_WIFI_STATE": { - "key": "android.permission.ACCESS_WIFI_STATE", - "security": "normal" - }, - "BLUETOOTH": { - "key": "android.permission.BLUETOOTH", - "security": "normal" - }, - "BLUETOOTH_ADMIN": { - "key": "android.permission.BLUETOOTH_ADMIN", - "security": "normal" - }, - "BROADCAST_STICKY": { - "key": "android.permission.BROADCAST_STICKY", - "security": "normal" - }, - "CHANGE_NETWORK_STATE": { - "key": "android.permission.CHANGE_NETWORK_STATE", - "security": "normal" - }, - "CHANGE_WIFI_MULTICAST_STATE": { - "key": "android.permission.CHANGE_WIFI_MULTICAST_STATE", - "security": "normal" - }, - "CHANGE_WIFI_STATE": { - "key": "android.permission.CHANGE_WIFI_STATE", - "security": "normal" - }, - "DISABLE_KEYGUARD": { - "key": "android.permission.DISABLE_KEYGUARD", - "security": "normal" - }, - "EXPAND_STATUS_BAR": { - "key": "android.permission.EXPAND_STATUS_BAR", - "security": "normal" - }, - "FOREGROUND_SERVICE": { - "key": "android.permission.FOREGROUND_SERVICE", - "security": "normal" - }, - "GET_PACKAGE_SIZE": { - "key": "android.permission.GET_PACKAGE_SIZE", - "security": "normal" - }, - "INSTALL_SHORTCUT": { - "key": "android.permission.INSTALL_SHORTCUT", - "security": "normal" - }, - "INTERNET": { - "key": "android.permission.INTERNET", - "security": "normal" - }, - "KILL_BACKGROUND_PROCESSES": { - "key": "android.permission.KILL_BACKGROUND_PROCESSES", - "security": "normal" - }, - "MANAGE_OWN_CALLS": { - "key": "android.permission.MANAGE_OWN_CALLS", - "security": "normal" - }, - "MODIFY_AUDIO_SETTINGS": { - "key": "android.permission.MODIFY_AUDIO_SETTINGS", - "security": "normal" - }, - "NFC": { - "key": "android.permission.NFC", - "security": "normal" - }, - "READ_SYNC_SETTINGS": { - "key": "android.permission.READ_SYNC_SETTINGS", - "security": "normal" - }, - "READ_SYNC_STATS": { - "key": "android.permission.READ_SYNC_STATS", - "security": "normal" - }, - "RECEIVE_BOOT_COMPLETED": { - "key": "android.permission.RECEIVE_BOOT_COMPLETED", - "security": "normal" - }, - "REORDER_TASKS": { - "key": "android.permission.REORDER_TASKS", - "security": "normal" - }, - "REQUEST_COMPANION_RUN_IN_BACKGROUND": { - "key": "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND", - "security": "normal" - }, - "REQUEST_COMPANION_USE_DATA_IN_BACKGROUND": { - "key": "android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND", - "security": "normal" - }, - "REQUEST_DELETE_PACKAGES": { - "key": "android.permission.REQUEST_DELETE_PACKAGES", - "security": "normal" - }, - "REQUEST_IGNORE_BATTERY_OPTIMIZATIONS": { - "key": "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS", - "security": "normal" - }, - "SET_ALARM": { - "key": "android.permission.SET_ALARM", - "security": "normal" - }, - "SET_WALLPAPER": { - "key": "android.permission.SET_WALLPAPER", - "security": "normal" - }, - "SET_WALLPAPER_HINTS": { - "key": "android.permission.SET_WALLPAPER_HINTS", - "security": "normal" - }, - "TRANSMIT_IR": { - "key": "android.permission.TRANSMIT_IR", - "security": "normal" - }, - "USE_FINGERPRINT": { - "key": "android.permission.USE_FINGERPRINT", - "security": "normal" - }, - "VIBRATE": { - "key": "android.permission.VIBRATE", - "security": "normal" - }, - "WAKE_LOCK": { - "key": "android.permission.WAKE_LOCK", - "security": "normal" - }, - "WRITE_SYNC_SETTINGS": { - "key": "android.permission.WRITE_SYNC_SETTINGS", - "security": "normal" - }, - "BIND_ACCESSIBILITY_SERVICE": { - "key": "android.permission.BIND_ACCESSIBILITY_SERVICE", - "security": "signature" - }, - "BIND_AUTOFILL_SERVICE": { - "key": "android.permission.BIND_AUTOFILL_SERVICE", - "security": "signature" - }, - "BIND_CARRIER_SERVICES": { - "key": "android.permission.BIND_CARRIER_SERVICES", - "security": "signature" - }, - "BIND_CHOOSER_TARGET_SERVICE": { - "key": "android.permission.BIND_CHOOSER_TARGET_SERVICE", - "security": "signature" - }, - "BIND_CONDITION_PROVIDER_SERVICE": { - "key": "android.permission.BIND_CONDITION_PROVIDER_SERVICE", - "security": "signature" - }, - "BIND_DEVICE_ADMIN": { - "key": "android.permission.BIND_DEVICE_ADMIN", - "security": "signature" - }, - "BIND_DREAM_SERVICE": { - "key": "android.permission.BIND_DREAM_SERVICE", - "security": "signature" - }, - "BIND_INCALL_SERVICE": { - "key": "android.permission.BIND_INCALL_SERVICE", - "security": "signature" - }, - "BIND_INPUT_METHOD": { - "key": "android.permission.BIND_INPUT_METHOD", - "security": "signature" - }, - "BIND_MIDI_DEVICE_SERVICE": { - "key": "android.permission.BIND_MIDI_DEVICE_SERVICE", - "security": "signature" - }, - "BIND_NFC_SERVICE": { - "key": "android.permission.BIND_NFC_SERVICE", - "security": "signature" - }, - "BIND_NOTIFICATION_LISTENER_SERVICE": { - "key": "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE", - "security": "signature" - }, - "BIND_PRINT_SERVICE": { - "key": "android.permission.BIND_PRINT_SERVICE", - "security": "signature" - }, - "BIND_SCREENING_SERVICE": { - "key": "android.permission.BIND_SCREENING_SERVICE", - "security": "signature" - }, - "BIND_TELECOM_CONNECTION_SERVICE": { - "key": "android.permission.BIND_TELECOM_CONNECTION_SERVICE", - "security": "signature" - }, - "BIND_TEXT_SERVICE": { - "key": "android.permission.BIND_TEXT_SERVICE", - "security": "signature" - }, - "BIND_TV_INPUT": { - "key": "android.permission.BIND_TV_INPUT", - "security": "signature" - }, - "BIND_VISUAL_VOICEMAIL_SERVICE": { - "key": "android.permission.BIND_VISUAL_VOICEMAIL_SERVICE", - "security": "signature" - }, - "BIND_VOICE_INTERACTION": { - "key": "android.permission.BIND_VOICE_INTERACTION", - "security": "signature" - }, - "BIND_VPN_SERVICE": { - "key": "android.permission.BIND_VPN_SERVICE", - "security": "signature" - }, - "BIND_VR_LISTENER_SERVICE": { - "key": "android.permission.BIND_VR_LISTENER_SERVICE", - "security": "signature" - }, - "BIND_WALLPAPER": { - "key": "android.permission.BIND_WALLPAPER", - "security": "signature" - }, - "CLEAR_APP_CACHE": { - "key": "android.permission.CLEAR_APP_CACHE", - "security": "signature" - }, - "MANAGE_DOCUMENTS": { - "key": "android.permission.MANAGE_DOCUMENTS", - "security": "signature" - }, - "READ_VOICEMAIL": { - "key": "android.permission.READ_VOICEMAIL", - "security": "signature" - }, - "REQUEST_INSTALL_PACKAGES": { - "key": "android.permission.REQUEST_INSTALL_PACKAGES", - "security": "signature" - }, - "SYSTEM_ALERT_WINDOW": { - "key": "android.permission.SYSTEM_ALERT_WINDOW", - "security": "signature" - }, - "WRITE_SETTINGS": { - "key": "android.permission.WRITE_SETTINGS", - "security": "signature" - }, - "WRITE_VOICEMAIL": { - "key": "android.permission.WRITE_VOICEMAIL", - "security": "signature" - }, - "READ_CALENDAR": { - "key": "android.permission.READ_CALENDAR", - "security": "dangerous" - }, - "WRITE_CALENDAR": { - "key": "android.permission.WRITE_CALENDAR", - "security": "dangerous" - }, - "READ_CALL_LOG": { - "key": "android.permission.READ_CALL_LOG", - "security": "dangerous" - }, - "WRITE_CALL_LOG": { - "key": "android.permission.WRITE_CALL_LOG", - "security": "dangerous" - }, - "PROCESS_OUTGOING_CALLS": { - "key": "android.permission.PROCESS_OUTGOING_CALLS", - "security": "dangerous" - }, - "CAMERA": { - "key": "android.permission.CAMERA", - "security": "dangerous" - }, - "READ_CONTACTS": { - "key": "android.permission.READ_CONTACTS", - "security": "dangerous" - }, - "WRITE_CONTACTS": { - "key": "android.permission.WRITE_CONTACTS", - "security": "dangerous" - }, - "GET_ACCOUNTS": { - "key": "android.permission.GET_ACCOUNTS", - "security": "dangerous" - }, - "ACCESS_FINE_LOCATION": { - "key": "android.permission.ACCESS_FINE_LOCATION", - "security": "dangerous" - }, - "ACCESS_COARSE_LOCATION": { - "key": "android.permission.ACCESS_COARSE_LOCATION", - "security": "dangerous" - }, - "RECORD_AUDIO": { - "key": "android.permission.RECORD_AUDIO", - "security": "dangerous" - }, - "READ_PHONE_STATE": { - "key": "android.permission.READ_PHONE_STATE", - "security": "dangerous" - }, - "READ_PHONE_NUMBERS": { - "key": "android.permission.READ_PHONE_NUMBERS", - "security": "dangerous" - }, - "CALL_PHONE": { - "key": "android.permission.CALL_PHONE", - "security": "dangerous" - }, - "ANSWER_PHONE_CALLS": { - "key": "android.permission.ANSWER_PHONE_CALLS", - "security": "dangerous" - }, - "ADD_VOICEMAIL": { - "key": "android.permission.ADD_VOICEMAIL", - "security": "dangerous" - }, - "USE_SIP": { - "key": "android.permission.USE_SIP", - "security": "dangerous" - }, - "BODY_SENSORS": { - "key": "android.permission.BODY_SENSORS", - "security": "dangerous" - }, - "SEND_SMS": { - "key": "android.permission.SEND_SMS", - "security": "dangerous" - }, - "RECEIVE_SMS": { - "key": "android.permission.RECEIVE_SMS", - "security": "dangerous" - }, - "READ_SMS": { - "key": "android.permission.READ_SMS", - "security": "dangerous" - }, - "RECEIVE_WAP_PUSH": { - "key": "android.permission.RECEIVE_WAP_PUSH", - "security": "dangerous" - }, - "RECEIVE_MMS": { - "key": "android.permission.RECEIVE_MMS", - "security": "dangerous" - }, - "READ_EXTERNAL_STORAGE": { - "key": "android.permission.READ_EXTERNAL_STORAGE", - "security": "dangerous" - }, - "WRITE_EXTERNAL_STORAGE": { - "key": "android.permission.WRITE_EXTERNAL_STORAGE", - "security": "dangerous" - } - } - } -} diff --git a/packages/rnv/coreTemplateFiles/renative.templates.json b/packages/rnv/coreTemplateFiles/renative.templates.json deleted file mode 100644 index 83b19fddc7..0000000000 --- a/packages/rnv/coreTemplateFiles/renative.templates.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "$schema": "../../../.rnv/schema/rnv.templates.json", - "projectTemplates": { - "@rnv/template-starter": { - "description": "Multiplatform 'hello world' template" - }, - "@flexn/create-template-starter": { - "description": "Advanced multiplatform template using flexn Create SDK" - } - }, - "engineTemplates": { - "@rnv/engine-rn": { - "version": "1.0.0-rc.12", - "id": "engine-rn" - }, - "@rnv/engine-rn-tvos": { - "version": "1.0.0-rc.12", - "id": "engine-rn-tvos" - }, - "@rnv/engine-rn-web": { - "version": "1.0.0-rc.12", - "id": "engine-rn-web" - }, - "@rnv/engine-rn-next": { - "version": "1.0.0-rc.12", - "id": "engine-rn-next" - }, - "@rnv/engine-rn-electron": { - "version": "1.0.0-rc.12", - "id": "engine-rn-electron" - }, - "@rnv/engine-lightning": { - "version": "1.0.0-rc.12", - "id": "engine-lightning" - }, - "@rnv/engine-rn-macos": { - "version": "1.0.0-rc.12", - "id": "engine-rn-macos" - }, - "@rnv/engine-rn-windows": { - "version": "1.0.0-rc.12", - "id": "engine-rn-windows" - } - }, - "integrationTemplates": { - "@rnv/integration-vercel": { - "version": "0.2.0-alpha.0" - }, - "@rnv/integration-docker": { - "version": "0.1.0-alpha.0" - } - }, - "platformTemplates": { - "ios": { - "engine": "engine-rn" - }, - "android": { - "engine": "engine-rn" - }, - "androidwear": { - "engine": "engine-rn" - }, - "androidtv": { - "engine": "engine-rn" - }, - "firetv": { - "engine": "engine-rn" - }, - "tvos": { - "engine": "engine-rn-tvos" - }, - "macos": { - "engine": "engine-rn" - }, - "windows": { - "engine": "engine-rn-electron" - }, - "linux": { - "engine": "engine-rn-electron" - }, - "xbox": { - "engine": "engine-rn-windows" - }, - "tizen": { - "engine": "engine-rn-web" - }, - "tizenmobile": { - "engine": "engine-rn-web" - }, - "tizenwatch": { - "engine": "engine-rn-web" - }, - "webos": { - "engine": "engine-rn-web" - }, - "chromecast": { - "engine": "engine-rn-web" - }, - "kaios": { - "engine": "engine-rn-web" - }, - "web": { - "engine": "engine-rn-next" - }, - "webtv": { - "engine": "engine-rn-web" - } - } -} diff --git a/packages/rnv/package.json b/packages/rnv/package.json index 6710b2ec9d..6deb4db5de 100644 --- a/packages/rnv/package.json +++ b/packages/rnv/package.json @@ -50,13 +50,11 @@ "files": [ "LICENSE", "bin", - "coreTemplateFiles", "lib", "pluginTemplates" ], - "main": "lib/index.js", "bin": { - "rnv": "./bin/index.js" + "rnv": "./lib/bin.js" }, "repository": { "type": "git", @@ -72,17 +70,12 @@ }, "dependencies": { "@rnv/cli": "1.0.0-rc.12", - "@rnv/core": "1.0.0-rc.12", - "@rnv/engine-core": "1.0.0-rc.12", - "@sentry/integrations": "7.57.0", - "@sentry/node": "7.57.0", - "node-machine-id": "^1.1.12", + "@rnv/config-templates": "1.0.0-rc.12", "tslib": "2.5.2" }, "private": false, "publishConfig": { "access": "public" }, - "title": "ReNative CLI", - "gitHead": "48ef244c6ec2e206cbfd72fe8770d8dc03387591" + "title": "ReNative CLI" } diff --git a/packages/rnv/pluginTemplates/react-native-gesture-handler/overrides.json b/packages/rnv/pluginTemplates/react-native-gesture-handler/overrides.json deleted file mode 100644 index e298c25541..0000000000 --- a/packages/rnv/pluginTemplates/react-native-gesture-handler/overrides.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "overrides": { - "ios/Handlers/RNHoverHandler.m": { - "__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_4\n": "__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_4 && !TARGET_OS_TV\n" - }, - "ios/RNGestureHandlerButtonComponentView.mm": { - "_buttonView.userEnabled = newProps.enabled;\n _buttonView.exclusiveTouch = newProps.exclusive;": "_buttonView.userEnabled = newProps.enabled;\n#if !TARGET_OS_TV \n_buttonView.exclusiveTouch = newProps.exclusive; \n#endif" - } - } -} \ No newline at end of file diff --git a/packages/rnv/pluginTemplates/renative.plugins.json b/packages/rnv/pluginTemplates/renative.plugins.json deleted file mode 100644 index 803704fe79..0000000000 --- a/packages/rnv/pluginTemplates/renative.plugins.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "$schema": "../../../.rnv/schema/rnv.plugins.json", - "comments": [ - "This is the main configuration file for RNV plugins. It allows you to define which plugins you want to use and their versions.", - "It also acts as override against @flexn/plugins" - ], - "pluginTemplates": { - "@rnv/renative": { - "version": "1.0.0-rc.12" - }, - "react-native-tvos": { - "version": "0.73.1-3" - }, - "react-native-web": { - "version": "0.19.9", - "webpackConfig": { - "modulePaths": true - } - }, - "next": { - "version": "14.1.0", - "disablePluginTemplateOverrides": true - }, - "react-native": { - "version": "0.73.4" - }, - "@react-native-community/cli-platform-ios": { - "version": "11.3.7", - "disablePluginTemplateOverrides": false, - "disableNpm": true - }, - "react-native-gesture-handler": { - "version": "2.14.1", - "disablePluginTemplateOverrides": true - } - } -} diff --git a/packages/rnv/src/bin.ts b/packages/rnv/src/bin.ts new file mode 100644 index 0000000000..d939ba3fb6 --- /dev/null +++ b/packages/rnv/src/bin.ts @@ -0,0 +1,6 @@ +#!/usr/bin/env node + +import { run } from '@rnv/cli'; +import { RNV_HOME_DIR } from './constants'; + +run({ RNV_HOME_DIR }); diff --git a/packages/rnv/src/constants.ts b/packages/rnv/src/constants.ts index c56fe126e1..7719d7126e 100644 --- a/packages/rnv/src/constants.ts +++ b/packages/rnv/src/constants.ts @@ -1,6 +1,3 @@ import path from 'path'; export const RNV_HOME_DIR = path.join(__dirname, '..'); -export const REDASH_URL = 'https://analytics.prod.api.flexn.io/rnv'; -export const REDASH_KEY = '471577f3b856fb6348ae913ceb32545c'; -export const SENTRY_ENDPOINT = 'https://004caee3caa04c81a10f2ba31a945362@sentry.io/1795473'; diff --git a/packages/rnv/src/index.ts b/packages/rnv/src/index.ts deleted file mode 100755 index 98e83e44c9..0000000000 --- a/packages/rnv/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './adapter'; -export * from './runner'; diff --git a/packages/rnv/src/runner.ts b/packages/rnv/src/runner.ts deleted file mode 100644 index 42c23a0471..0000000000 --- a/packages/rnv/src/runner.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Analytics } from './analytics'; -import { - RnvApiLogger, - RnvApiPrompt, - RnvApiSpinner, - RnvContextProgram, - createRnvApi, - createRnvContext, - doResolve, - executeRnvCore, - getConfigProp, - loadWorkspacesConfigSync, - logInitialize, - registerEngine, -} from '@rnv/core'; -import { RNV_HOME_DIR } from './constants'; -import EngineCore from '@rnv/engine-core'; - -export const executeRnv = async ({ - cmd, - subCmd, - process, - program, - spinner, - prompt, - logger, -}: { - cmd: string; - subCmd: string; - process: NodeJS.Process; - program: RnvContextProgram; - spinner: RnvApiSpinner; - prompt: RnvApiPrompt; - logger: RnvApiLogger; -}) => { - // set mono and ci if json is enabled - if (program.json) { - program.mono = true; - program.ci = true; - } - - createRnvApi({ spinner, prompt, analytics: Analytics, logger, getConfigProp, doResolve }); - createRnvContext({ program, process, cmd, subCmd, RNV_HOME_DIR }); - - logInitialize(); - loadWorkspacesConfigSync(); - - Analytics.initialize(); - - await registerEngine(EngineCore); - - await executeRnvCore(); -}; diff --git a/packages/rnv/tsconfig.json b/packages/rnv/tsconfig.json index b26b9c6670..1dc09ed8d6 100644 --- a/packages/rnv/tsconfig.json +++ b/packages/rnv/tsconfig.json @@ -5,5 +5,5 @@ "rootDir": "./src", "resolveJsonModule": false }, - "exclude": ["./src/**/*.test.ts", "./lib/**/*", "./coreTemplateFiles/**/*"] + "exclude": ["./src/**/*.test.ts", "./lib/**/*", "./templateFiles/**/*"] } diff --git a/packages/sdk-android/.gitignore b/packages/sdk-android/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/sdk-android/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/sdk-android/package.json b/packages/sdk-android/package.json index cfeece62df..de2ccb266e 100644 --- a/packages/sdk-android/package.json +++ b/packages/sdk-android/package.json @@ -12,8 +12,7 @@ "files": [ "LICENSE", "lib", - "supportFiles", - "templates", + "templateFiles", "types.d.ts" ], "main": "lib/index.js", @@ -32,7 +31,8 @@ }, "dependencies": { "@rnv/sdk-react-native": "1.0.0-rc.12", - "@rnv/sdk-utils": "1.0.0-rc.12" + "@rnv/sdk-utils": "1.0.0-rc.12", + "jetifier": "2.0.0" }, "peerDependencies": { "@react-native-community/cli": "^11.3.8", diff --git a/packages/sdk-android/src/__tests__/runner.test.ts b/packages/sdk-android/src/__tests__/runner.test.ts index a8e3766363..4fbdb02878 100644 --- a/packages/sdk-android/src/__tests__/runner.test.ts +++ b/packages/sdk-android/src/__tests__/runner.test.ts @@ -20,15 +20,17 @@ describe('getAndroidDeviceToRunOn', () => { //GIVEN const ctx = getContext(); ctx.platform = 'android'; - ctx.program.target = true; - ctx.program.device = 'device1'; + ctx.program.opts().target = true; + ctx.program.opts().device = 'device1'; ctx.runtime.target = 'defaultTarget'; const mockFoundDevice = { name: 'simulator1', isActive: false, udid: '', isDevice: false }; jest.mocked(getAndroidTargets).mockResolvedValue([mockFoundDevice]); //WHEN - await expect(getAndroidDeviceToRunOn()).resolves.toBe(undefined); + await expect(getAndroidDeviceToRunOn()).rejects.toBe( + 'No active devices found, please connect one or remove the device argument' + ); //THEN }); @@ -37,9 +39,9 @@ describe('getAndroidDeviceToRunOn', () => { const targetToConnectWiFi = 'invalidIPAdress'; const ctx = getContext(); ctx.platform = 'android'; - ctx.program.target = true; + ctx.program.opts().target = true; ctx.runtime.target = 'defaultTarget'; - ctx.program.device = targetToConnectWiFi; + ctx.program.opts().device = targetToConnectWiFi; const mockFoundDevice = { name: 'simulator1', isActive: false, udid: '', isDevice: false }; net.isIP = jest.fn().mockReturnValue(false); @@ -47,7 +49,9 @@ describe('getAndroidDeviceToRunOn', () => { jest.mocked(getAndroidTargets).mockResolvedValue([mockFoundDevice]); //WHEN - await expect(getAndroidDeviceToRunOn()).resolves.toBe(undefined); + await expect(getAndroidDeviceToRunOn()).rejects.toBe( + 'No active devices found, please connect one or remove the device argument' + ); //THEN expect(connectToWifiDevice).not.toHaveBeenCalled(); @@ -57,9 +61,9 @@ describe('getAndroidDeviceToRunOn', () => { const targetToConnectWiFi = '192.168.0.1'; const ctx = getContext(); ctx.platform = 'android'; - ctx.program.target = true; + ctx.program.opts().target = true; ctx.runtime.target = 'defaultTarget'; - ctx.program.device = targetToConnectWiFi; + ctx.program.opts().device = targetToConnectWiFi; net.isIP = jest.fn().mockReturnValue(true); jest.mocked(connectToWifiDevice).mockResolvedValue(true); @@ -78,7 +82,7 @@ describe('getAndroidDeviceToRunOn', () => { //GIVEN const ctx = getContext(); ctx.platform = 'android'; - ctx.program.target = undefined; + ctx.program.opts().target = undefined; ctx.runtime.target = 'defaultTarget'; const mockFoundDevice = { name: 'defaultTarget', isActive: true, udid: '', isDevice: false }; @@ -92,7 +96,7 @@ describe('getAndroidDeviceToRunOn', () => { //GIVEN const ctx = getContext(); ctx.platform = 'android'; - ctx.program.target = 'existingTarget'; + ctx.program.opts().target = 'existingTarget'; ctx.runtime.target = 'defaultTarget'; const mockFoundDevice = { name: 'existingTarget', isActive: true, udid: '' }; jest.mocked(getAndroidTargets).mockResolvedValueOnce([mockFoundDevice]); @@ -105,7 +109,7 @@ describe('getAndroidDeviceToRunOn', () => { //GIVEN const ctx = getContext(); ctx.platform = 'android'; - ctx.program.target = false; + ctx.program.opts().target = false; ctx.runtime.target = 'defaultTarget'; const mockDevicesAndEmulators = [ diff --git a/packages/sdk-android/src/constants.ts b/packages/sdk-android/src/constants.ts index e38364e239..0fb60d8aa0 100644 --- a/packages/sdk-android/src/constants.ts +++ b/packages/sdk-android/src/constants.ts @@ -1,4 +1,8 @@ +import { RnvPlatformKey } from '@rnv/core'; + export const CLI_ANDROID_EMULATOR = 'androidEmulator'; export const CLI_ANDROID_ADB = 'androidAdb'; export const CLI_ANDROID_AVDMANAGER = 'androidAvdManager'; export const CLI_ANDROID_SDKMANAGER = 'androidSdkManager'; + +export const SdkPlatforms: Array = ['android', 'androidtv', 'androidwear', 'firetv']; diff --git a/packages/sdk-android/src/deviceManager.ts b/packages/sdk-android/src/deviceManager.ts index 814329a90e..83c1b4b864 100644 --- a/packages/sdk-android/src/deviceManager.ts +++ b/packages/sdk-android/src/deviceManager.ts @@ -17,13 +17,12 @@ import { logDebug, logSuccess, logRaw, - USER_HOME_DIR, RnvContext, waitForExecCLI, inquirerPrompt, executeAsync, ExecOptionsPresets, - PlatformKey, + RnvPlatformKey, getContext, } from '@rnv/core'; import { CLI_ANDROID_EMULATOR, CLI_ANDROID_ADB, CLI_ANDROID_AVDMANAGER, CLI_ANDROID_SDKMANAGER } from './constants'; @@ -66,9 +65,7 @@ export const launchAndroidSimulator = async ( let newTarget: { name: string } | string; if (target === true) { - const { - program: { device }, - } = c; + const { device } = c.program.opts(); const list = await getAndroidTargets(false, device, device); const devicesString = composeDevicesArray(list); @@ -95,8 +92,7 @@ export const launchAndroidSimulator = async ( if (err.includes && err.includes('WHPX')) { logWarning(err); logError( - 'It seems you do not have the Windows Hypervisor Platform virtualization enabled. Enter windows features in the Windows search box and select Turn Windows features on or off in the search results. In the Windows Features dialog, enable both Hyper-V and Windows Hypervisor Platform.', - true + 'It seems you do not have the Windows Hypervisor Platform virtualization enabled. Enter windows features in the Windows search box and select Turn Windows features on or off in the search results. In the Windows Features dialog, enable both Hyper-V and Windows Hypervisor Platform.' ); return false; } @@ -117,7 +113,7 @@ export const launchAndroidSimulator = async ( logWarning( `Target with name ${chalk().red( newTarget - )} does not exist. You can update it here: ${chalk().cyan(c.paths.GLOBAL_RNV_CONFIG)}` + )} does not exist. You can update it here: ${chalk().cyan(c.paths.dotRnv.config)}` ); await launchAndroidSimulator(true, false); return true; @@ -132,11 +128,10 @@ export const launchAndroidSimulator = async ( return Promise.reject('No simulator -t target name specified!'); }; -export const listAndroidTargets = async (c: RnvContext) => { +export const listAndroidTargets = async () => { + const c = getContext(); logDefault('listAndroidTargets'); - const { - program: { device }, - } = c; + const { device } = c.program.opts(); await resetAdb(); const list = await getAndroidTargets(false, device, device); @@ -188,7 +183,7 @@ const _getDeviceAsObject = (device: AndroidDevice): DeviceInfo => { export const resetAdb = async (forceRun?: boolean, ranBefore?: boolean) => { const c = getContext(); - if (!c.program.resetAdb && !forceRun) return; + if (!c.program.opts().resetAdb && !forceRun) return; try { if (!ranBefore) await execCLI(CLI_ANDROID_ADB, 'kill-server'); } catch (e) { @@ -390,7 +385,11 @@ const getAvdDetails = (c: RnvContext, deviceName: string) => { const { ANDROID_SDK_HOME, ANDROID_AVD_HOME } = process.env; // .avd dir might be in other place than homedir. (https://developer.android.com/studio/command-line/variables) - const avdConfigPaths = [`${ANDROID_AVD_HOME}`, `${ANDROID_SDK_HOME}/.android/avd`, `${USER_HOME_DIR}/.android/avd`]; + const avdConfigPaths = [ + `${ANDROID_AVD_HOME}`, + `${ANDROID_SDK_HOME}/.android/avd`, + `${c.paths.user.homeDir}/.android/avd`, + ]; const results: { avdConfig?: Record } = {}; @@ -445,7 +444,7 @@ export const connectToWifiDevice = async (target: string) => { const deviceResponse = await execCLI(CLI_ANDROID_ADB, connect_str); if (deviceResponse.includes('connected')) return true; - logError(`Failed to ${connect_str}`, false, true); + logError(`Failed to ${connect_str}`, { skipAnalytics: true }); return false; }; @@ -457,7 +456,7 @@ const _parseDevicesResult = async ( ) => { logDebug(`_parseDevicesResult:${devicesString}:${avdsString}:${deviceOnly}`); const devices: Array = []; - const { skipTargetCheck } = c.program; + const { skipTargetCheck } = c.program.opts(); if (devicesString) { const lines = devicesString.trim().split(/\r?\n/); @@ -644,7 +643,7 @@ const _createEmulator = (c: RnvContext, apiVersion: string, emuPlatform: string, ExecOptionsPresets.INHERIT_OUTPUT_NO_SPINNER ) ) - .catch((e) => logError(e, true)); + .catch((e) => logError(e)); }; const waitForEmulatorToBeReady = (emulator: string) => @@ -689,7 +688,7 @@ export const checkForActiveEmulator = (emulatorName?: string) => } else { logRaw(`looking for active emulators: attempt ${attempts}/${maxAttempts}`); attempts++; - const check: PlatformKey[] = ['androidtv', 'firetv', 'androidwear']; + const check: RnvPlatformKey[] = ['androidtv', 'firetv', 'androidwear']; if (check.includes(platform) && attempts === 2) { await resetAdb(true); // from time to time adb reports a recently started atv emu as being offline. Restarting adb fixes it } diff --git a/packages/sdk-android/src/ejector.ts b/packages/sdk-android/src/ejector.ts index 8caab11081..6411981c42 100644 --- a/packages/sdk-android/src/ejector.ts +++ b/packages/sdk-android/src/ejector.ts @@ -10,6 +10,7 @@ import { doResolvePath, parsePlugins, getContext, + RnvFileName, } from '@rnv/core'; export const ejectGradleProject = async () => { @@ -155,7 +156,7 @@ export const ejectGradleProject = async () => { c, extensionsFilter ); - copyFileSync(path.join(pluginPath, 'package.json'), path.join(destPath, 'package.json')); + copyFileSync(path.join(pluginPath, RnvFileName.package), path.join(destPath, RnvFileName.package)); }); //= ========== diff --git a/packages/sdk-android/src/getContext.ts b/packages/sdk-android/src/getContext.ts new file mode 100644 index 0000000000..1ca1bdf3e8 --- /dev/null +++ b/packages/sdk-android/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from './'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/sdk-android/src/gradleParser.ts b/packages/sdk-android/src/gradleParser.ts index 88b84e0d28..19b7e58b8e 100644 --- a/packages/sdk-android/src/gradleParser.ts +++ b/packages/sdk-android/src/gradleParser.ts @@ -1,6 +1,6 @@ import { OverridesOptions, - RenativeConfigPluginPlatform, + RnvPluginPlatformSchema, RnvContext, RnvPlugin, chalk, @@ -522,7 +522,7 @@ export const parseSettingsGradleSync = () => { }, { pattern: '{{RN_GRADLE_PROJECT_NAME}}', - override: c.files.project.config?.projectName.replace('/', '-'), + override: c.files.project.config?.projectName?.replace('/', '-'), }, ]; @@ -583,7 +583,7 @@ export const parseGradlePropertiesSync = () => { writeCleanFile(getBuildFilePath(gradleProperties), path.join(appFolder, gradleProperties), injects, undefined, c); }; -export const injectPluginGradleSync = (pluginRoot: RnvPlugin, plugin: RenativeConfigPluginPlatform, key: string) => { +export const injectPluginGradleSync = (pluginRoot: RnvPlugin, plugin: RnvPluginPlatformSchema, key: string) => { // const keyFixed = key.replace(/\//g, '-').replace(/@/g, ''); // const packagePath = plugin.path ?? `${key}/android`; // let pathAbsolute; @@ -628,7 +628,7 @@ export const injectPluginGradleSync = (pluginRoot: RnvPlugin, plugin: RenativeCo } }; -export const parseAndroidConfigObject = (plugin?: RenativeConfigPluginPlatform, key = '') => { +export const parseAndroidConfigObject = (plugin?: RnvPluginPlatformSchema, key = '') => { // APP/BUILD.GRADLE const c = getContext(); const templateAndroid = plugin?.templateAndroid; diff --git a/packages/sdk-android/src/gradleWrapperParser.ts b/packages/sdk-android/src/gradleWrapperParser.ts index 6c39dbb265..639c9e2957 100644 --- a/packages/sdk-android/src/gradleWrapperParser.ts +++ b/packages/sdk-android/src/gradleWrapperParser.ts @@ -11,7 +11,7 @@ import { } from '@rnv/core'; import { addSystemInjects, getBuildFilePath } from '@rnv/sdk-utils'; -const GRADLE_SOURCE_PATH = path.join(__dirname, '../templates/gradleProject'); +const GRADLE_SOURCE_PATH = path.join(__dirname, '../templateFiles/gradleProject'); const copyGradleProjectTemplate = async () => { logDefault('copyGradleProjectTemplate'); diff --git a/packages/sdk-android/src/index.ts b/packages/sdk-android/src/index.ts index 72c45c596d..5c44610413 100644 --- a/packages/sdk-android/src/index.ts +++ b/packages/sdk-android/src/index.ts @@ -2,3 +2,30 @@ export * from './runner'; export * from './deviceManager'; export * from './constants'; export * from './installer'; +export * from './jetifier'; +import taskTargetLaunch from './tasks/taskTargetLaunch'; +import taskTargetList from './tasks/taskTargetList'; +import taskSdkConfigure from './tasks/taskSdkConfigure'; +import taskLog from './tasks/taskLog'; +import taskPackage from './tasks/taskPackage'; +import taskConfigure from './tasks/taskConfigure'; +import taskRun from './tasks/taskRun'; +import taskBuild from './tasks/taskBuild'; +import { GetContextType, createRnvSDK } from '@rnv/core'; + +export const Tasks = [ + taskTargetLaunch, + taskTargetList, + taskSdkConfigure, + taskLog, + taskPackage, + taskConfigure, + taskRun, + taskBuild, +]; + +const Sdk = createRnvSDK({ + tasks: Tasks, +}); + +export type GetContext = GetContextType; diff --git a/packages/sdk-android/src/installer.ts b/packages/sdk-android/src/installer.ts index 3d88a0365f..c126af8576 100644 --- a/packages/sdk-android/src/installer.ts +++ b/packages/sdk-android/src/installer.ts @@ -1,6 +1,5 @@ import path from 'path'; import { - USER_HOME_DIR, isSystemWin, getRealPath, writeFileSync, @@ -24,26 +23,31 @@ import { CLI_ANDROID_EMULATOR, CLI_ANDROID_ADB, CLI_ANDROID_AVDMANAGER, CLI_ANDR type SDKKey = keyof Required['sdks']; -const SDK_LOCATIONS: Record> = { - android: [ - path.join('/usr/local/android-sdk'), - path.join(USER_HOME_DIR, 'Library/Android/sdk'), - path.join(USER_HOME_DIR, 'AppData/Local/Android/android-sdk'), - path.join(USER_HOME_DIR, 'AppData/Local/Android/sdk'), - path.join('Program Files (x86)/Android/android-sdk'), - ], - 'android-ndk': [ - path.join('/usr/local/android-sdk/ndk'), - path.join(USER_HOME_DIR, 'Library/Android/sdk/ndk'), - path.join(USER_HOME_DIR, 'AppData/Local/Android/android-sdk/ndk'), - path.join(USER_HOME_DIR, 'AppData/Local/Android/sdk/ndk'), - path.join('Program Files (x86)/Android/android-sdk/ndk'), - path.join('/usr/local/android-sdk/ndk-bundle'), - path.join(USER_HOME_DIR, 'Library/Android/sdk/ndk-bundle'), - path.join(USER_HOME_DIR, 'AppData/Local/Android/android-sdk/ndk-bundle'), - path.join(USER_HOME_DIR, 'AppData/Local/Android/sdk/ndk-bundle'), - path.join('Program Files (x86)/Android/android-sdk/ndk-bundle'), - ], +const getSdkLocations = () => { + const ctx = getContext(); + const { homeDir } = ctx.paths.user; + const SDK_LOCATIONS: Record> = { + android: [ + path.join('/usr/local/android-sdk'), + path.join(homeDir, 'Library/Android/sdk'), + path.join(homeDir, 'AppData/Local/Android/android-sdk'), + path.join(homeDir, 'AppData/Local/Android/sdk'), + path.join('Program Files (x86)/Android/android-sdk'), + ], + 'android-ndk': [ + path.join('/usr/local/android-sdk/ndk'), + path.join(homeDir, 'Library/Android/sdk/ndk'), + path.join(homeDir, 'AppData/Local/Android/android-sdk/ndk'), + path.join(homeDir, 'AppData/Local/Android/sdk/ndk'), + path.join('Program Files (x86)/Android/android-sdk/ndk'), + path.join('/usr/local/android-sdk/ndk-bundle'), + path.join(homeDir, 'Library/Android/sdk/ndk-bundle'), + path.join(homeDir, 'AppData/Local/Android/android-sdk/ndk-bundle'), + path.join(homeDir, 'AppData/Local/Android/sdk/ndk-bundle'), + path.join('Program Files (x86)/Android/android-sdk/ndk-bundle'), + ], + }; + return SDK_LOCATIONS; }; const _logSdkWarning = (c: RnvContext) => { @@ -108,12 +112,12 @@ const _findFolderWithFile = (dir: string, fileToFind: string) => { const _attemptAutoFix = async (c: RnvContext, sdkPlatform: string, sdkKey: SDKKey, traverseUntilFoundFile?: string) => { logDefault('_attemptAutoFix'); - if (c.program.hosted) { + if (c.program.opts().hosted) { logInfo('HOSTED Mode. Skipping SDK checks'); return true; } - let locations: Array = SDK_LOCATIONS[sdkPlatform]; + let locations: Array = getSdkLocations()[sdkPlatform]; // try common Android SDK env variables if (sdkKey === 'ANDROID_SDK') { @@ -140,7 +144,7 @@ const _attemptAutoFix = async (c: RnvContext, sdkPlatform: string, sdkKey: SDKKe if (result) { logSuccess(`Found existing ${chalk().bold(sdkKey)} location at ${chalk().bold(result)}`); let confirmSdk = true; - if (!c.program.ci) { + if (!c.program.opts().ci) { const { confirm } = await inquirerPrompt({ type: 'confirm', name: 'confirm', @@ -164,7 +168,7 @@ const _attemptAutoFix = async (c: RnvContext, sdkPlatform: string, sdkKey: SDKKe } } - logDefault(`_attemptAutoFix: no sdks found. searched at: ${SDK_LOCATIONS[sdkPlatform].join(', ')}`); + logDefault(`_attemptAutoFix: no sdks found. searched at: ${getSdkLocations()[sdkPlatform].join(', ')}`); // const setupInstance = PlatformSetup(c); // await setupInstance.askToInstallSDK(sdkPlatform); @@ -175,23 +179,16 @@ const _attemptAutoFix = async (c: RnvContext, sdkPlatform: string, sdkKey: SDKKe export const checkAndroidSdk = async () => { const c = getContext(); logDefault('checkAndroidSdk'); + if (!_isSdkInstalled(c)) { logWarning( - `${c.platform} requires SDK to be installed. Your SDK path in ${chalk().bold( + `${c.platform} platform requires Android SDK to be installed. Your SDK path in ${chalk().bold( c.paths.workspace.config )} does not exist: ${chalk().bold(_getCurrentSdkPath(c))}` ); - switch (c.platform) { - case 'android': - case 'androidtv': - case 'firetv': - case 'androidwear': - await _attemptAutoFix(c, 'android', 'ANDROID_SDK'); - return _attemptAutoFix(c, 'android-ndk', 'ANDROID_NDK', 'source.properties'); - default: - return true; - } + await _attemptAutoFix(c, 'android', 'ANDROID_SDK'); + return _attemptAutoFix(c, 'android-ndk', 'ANDROID_NDK', 'source.properties'); } else { await checkAndConfigureAndroidSdks(); } diff --git a/packages/sdk-android/src/jetifier.ts b/packages/sdk-android/src/jetifier.ts new file mode 100644 index 0000000000..1bbde35f5c --- /dev/null +++ b/packages/sdk-android/src/jetifier.ts @@ -0,0 +1,14 @@ +import { doResolve, executeAsync, getContext, logDefault, writeFileSync } from '@rnv/core'; + +export const jetifyIfRequired = async () => { + const c = getContext(); + logDefault('jetifyIfRequired'); + if (c.files.project.configLocal?._meta?.requiresJetify) { + if (doResolve('jetifier')) { + await executeAsync('npx jetify'); + c.files.project.configLocal._meta.requiresJetify = false; + writeFileSync(c.paths.project.configLocal, c.files.project.configLocal); + } + } + return true; +}; diff --git a/packages/sdk-android/src/kotlinParser.ts b/packages/sdk-android/src/kotlinParser.ts index d025a4d0a4..106f66352f 100644 --- a/packages/sdk-android/src/kotlinParser.ts +++ b/packages/sdk-android/src/kotlinParser.ts @@ -1,6 +1,6 @@ import { OverridesOptions, - RenativeConfigPluginPlatform, + RnvPluginPlatformSchema, RnvContext, getAppFolder, getConfigProp, @@ -10,7 +10,7 @@ import { import path from 'path'; import { getBuildFilePath, getEntryFile, getAppId, addSystemInjects } from '@rnv/sdk-utils'; -// const JS_BUNDLE_DEFAULTS: Partial> = { +// const JS_BUNDLE_DEFAULTS: Partial> = { // // Android Wear does not support webview required for connecting to packager. this is hack to prevent RN connectiing to running bundler // androidwear: '"assets://index.androidwear.bundle"', // }; @@ -184,7 +184,7 @@ export const parseSplashActivitySync = () => { ); }; -export const injectPluginKotlinSync = (plugin: RenativeConfigPluginPlatform, key: string, pkg: string | undefined) => { +export const injectPluginKotlinSync = (plugin: RnvPluginPlatformSchema, key: string, pkg: string | undefined) => { const c = getContext(); const templ = plugin.templateAndroid; const mainActivity = templ?.MainActivity_kt; @@ -243,7 +243,7 @@ export const injectPluginKotlinSync = (plugin: RenativeConfigPluginPlatform, key } }; -const _injectPackage = (c: RnvContext, plugin: RenativeConfigPluginPlatform, pkg: string | undefined) => { +const _injectPackage = (c: RnvContext, plugin: RnvPluginPlatformSchema, pkg: string | undefined) => { if (pkg && !plugin?.forceLinking) { c.payload.pluginConfigAndroid.pluginApplicationImports += `import ${pkg}\n`; } diff --git a/packages/sdk-android/src/manifestParser.ts b/packages/sdk-android/src/manifestParser.ts index ebaa9dcc2b..60417e4355 100644 --- a/packages/sdk-android/src/manifestParser.ts +++ b/packages/sdk-android/src/manifestParser.ts @@ -180,8 +180,8 @@ const _mergeFeatures = ( const getConfigPropArray = (c: RnvContext, platform: RnvPlatform, key: T) => { const result: Array = []; const configArr = [ - c.files.defaultWorkspace.config, - c.files.rnv.projectTemplates.config, + c.files.dotRnv.config, + c.files.rnvConfigTemplates.config, // { plugins: extraPlugins }, // { pluginTemplates }, c.files.workspace.config, @@ -203,7 +203,7 @@ const getConfigPropArray = (c: RnvContext, platform: Rn configArr.forEach((config) => { if (config) { //TODO: this is bit of a hack. _getConfigProp expectes already merged obj needs to be redone - const val = _getConfigProp(c, key, null, config as ConfigFileBuildConfig); + const val = _getConfigProp(c, key, undefined, config as ConfigFileBuildConfig); if (val) { result.push(val); } @@ -221,7 +221,7 @@ export const parseAndroidManifestSync = () => { if (!platform) return; try { - const baseManifestFilePath = path.join(__dirname, `../supportFiles/AndroidManifest_${platform}.json`); + const baseManifestFilePath = path.join(__dirname, `../templateFiles/AndroidManifest_${platform}.json`); const baseManifestFile = readObjectSync(baseManifestFilePath); if (!baseManifestFile) { diff --git a/packages/sdk-android/src/runner.ts b/packages/sdk-android/src/runner.ts index 4b6e6cb87d..483ac18faf 100644 --- a/packages/sdk-android/src/runner.ts +++ b/packages/sdk-android/src/runner.ts @@ -29,7 +29,7 @@ import { DEFAULTS, RnvPlatform, logInfo, - PlatformKey, + RnvPlatformKey, getContext, } from '@rnv/core'; import { parseAndroidManifestSync, injectPluginManifestSync } from './manifestParser'; @@ -78,7 +78,7 @@ export const getAndroidDeviceToRunOn = async () => { if (!c.platform) return; - const { target, device } = c.program; + const { target, device } = c.program.opts(); await resetAdb(); const targetToConnectWiFi = _isString(target) ? target : device; @@ -98,8 +98,8 @@ export const getAndroidDeviceToRunOn = async () => { const askWhereToRun = async () => { if (activeDevices.length || inactiveDevices.length) { // No device active and device param is passed, exiting - if (c.program.device && !activeDevices.length) { - return logError('No active devices found, please connect one or remove the device argument', true); + if (c.program.opts().device && !activeDevices.length) { + return Promise.reject('No active devices found, please connect one or remove the device argument'); } if (!foundDevice && (_isString(target) || _isString(device))) { logInfo( @@ -141,8 +141,8 @@ export const getAndroidDeviceToRunOn = async () => { return device; } } else { - if (c.program.device) { - return logError('No active devices found, please connect one or remove the device argument', true); + if (c.program.opts().device) { + return Promise.reject('No active devices found, please connect one or remove the device argument'); } await askForNewEmulator(); const device = await checkForActiveEmulator(); @@ -205,7 +205,7 @@ const _checkSigningCerts = async (c: Context) => { } app in release mode but you have't configured your ${chalk().bold( c.paths.workspace.appConfig.configPrivate )} for ${chalk().bold(c.platform)} platform yet.`; - if (c.program.ci === true) { + if (c.program.opts().ci === true) { return Promise.reject(msg); } logWarning(msg); @@ -228,7 +228,7 @@ const _checkSigningCerts = async (c: Context) => { const platforms = c.files.workspace.appConfig.configPrivate?.platforms || {}; if (c.files.workspace.appConfig.configPrivate) { - const platCandidates: PlatformKey[] = ['androidwear', 'androidtv', 'android', 'firetv']; + const platCandidates: RnvPlatformKey[] = ['androidwear', 'androidtv', 'android', 'firetv']; platCandidates.forEach((v) => { if (c.files.workspace.appConfig.configPrivate?.platforms?.[v]) { @@ -504,7 +504,7 @@ export const configureProject = async () => { export const runAndroidLog = async () => { const c = getContext(); logDefault('runAndroidLog'); - const filter = c.program.filter || ''; + const filter = c.program.opts().filter || ''; const child = execaCommand(`${c.cli[CLI_ANDROID_ADB]} logcat`); // use event hooks to provide a callback to execute when data are available: child.stdout?.on('data', (data: Buffer) => { diff --git a/packages/sdk-android/src/tasks/__tests__/taskRun.test.ts b/packages/sdk-android/src/tasks/__tests__/taskRun.test.ts new file mode 100644 index 0000000000..06354bba87 --- /dev/null +++ b/packages/sdk-android/src/tasks/__tests__/taskRun.test.ts @@ -0,0 +1,37 @@ +import { createRnvContext, getContext } from '@rnv/core'; +import taskRun from '../taskRun'; +import { getAndroidDeviceToRunOn, runAndroid } from '../../runner'; + +jest.mock('@rnv/core'); +jest.mock('@rnv/sdk-react-native'); +jest.mock('../../runner'); + +beforeEach(() => { + createRnvContext(); +}); + +afterEach(() => { + jest.resetAllMocks(); +}); + +test('Execute task.rnv.run', async () => { + // GIVEN + const ctx = getContext(); + ctx.platform = 'ios'; + const mockedDevice = { + name: 'MOCK_DEVICE_NAME', + udid: 'MOCK_DEVICE_UDID', + isActive: true, + }; + jest.mocked(getAndroidDeviceToRunOn).mockResolvedValueOnce(mockedDevice); + // WHEN + await taskRun.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }); + // THEN + expect(runAndroid).toHaveBeenCalledWith(mockedDevice); +}); diff --git a/packages/sdk-android/src/tasks/taskBuild.ts b/packages/sdk-android/src/tasks/taskBuild.ts new file mode 100644 index 0000000000..7802f5be11 --- /dev/null +++ b/packages/sdk-android/src/tasks/taskBuild.ts @@ -0,0 +1,14 @@ +import { RnvTaskName, RnvTaskOptionPresets, createTask } from '@rnv/core'; +import { buildReactNativeAndroid } from '@rnv/sdk-react-native'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Build project binary', + fn: async () => { + return buildReactNativeAndroid(); + }, + task: RnvTaskName.build, + dependsOn: [RnvTaskName.package], + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-android/src/tasks/taskConfigure.ts b/packages/sdk-android/src/tasks/taskConfigure.ts new file mode 100644 index 0000000000..ef7b45a669 --- /dev/null +++ b/packages/sdk-android/src/tasks/taskConfigure.ts @@ -0,0 +1,18 @@ +import { createTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; +import { configureGradleProject } from '../runner'; +import { jetifyIfRequired } from '../jetifier'; +import { configureFontSources } from '@rnv/sdk-react-native'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Configure current project', + fn: async () => { + await configureGradleProject(); + await jetifyIfRequired(); + return configureFontSources(); + }, + task: RnvTaskName.configure, + dependsOn: [RnvTaskName.platformConfigure], + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-android/src/tasks/taskEject.ts b/packages/sdk-android/src/tasks/taskEject.ts new file mode 100644 index 0000000000..28eda8aec2 --- /dev/null +++ b/packages/sdk-android/src/tasks/taskEject.ts @@ -0,0 +1,18 @@ +import { RnvTaskName, RnvTaskOptionPresets, createTask } from '@rnv/core'; +import { ejectGradleProject } from '../ejector'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Eject current project app to self contained native project', + beforeDependsOn: async ({ ctx }) => { + ctx.runtime._platformBuildsSuffix = '_eject/android'; + ctx.runtime._skipNativeDepResolutions = true; + }, + dependsOn: [RnvTaskName.package], + fn: async () => { + return ejectGradleProject(); + }, + task: RnvTaskName.eject, + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-android/src/tasks/taskLog.ts b/packages/sdk-android/src/tasks/taskLog.ts new file mode 100644 index 0000000000..c6c5bf81ce --- /dev/null +++ b/packages/sdk-android/src/tasks/taskLog.ts @@ -0,0 +1,16 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { runAndroidLog } from '../runner'; +import { checkAndConfigureAndroidSdks } from '../installer'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Attach logger to device or emulator and print out logs', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + await checkAndConfigureAndroidSdks(); + return runAndroidLog(); + }, + task: RnvTaskName.log, + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-android/src/tasks/taskPackage.ts b/packages/sdk-android/src/tasks/taskPackage.ts new file mode 100644 index 0000000000..071f276eaf --- /dev/null +++ b/packages/sdk-android/src/tasks/taskPackage.ts @@ -0,0 +1,26 @@ +import { getConfigProp, createTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; +import { packageAndroid } from '../runner'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Package source files into bundle', + dependsOn: [RnvTaskName.configure], + fn: async ({ originTaskName }) => { + const bundleAssets = getConfigProp('bundleAssets'); + if (!bundleAssets) { + return true; + } + // NOTE: react-native v0.73 triggers packaging automatically so we skipping it unless we need to + // package it explicitly for tasks where it is not triggered automatically + const signingConfig = getConfigProp('signingConfig'); + + if (originTaskName === RnvTaskName.eject || signingConfig !== 'Release') { + //if bundleAssets === true AND signingConfig is not releaase RN will not trigger packaging + return packageAndroid(); + } + return true; + }, + task: RnvTaskName.package, + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-android/src/tasks/taskRun.ts b/packages/sdk-android/src/tasks/taskRun.ts new file mode 100644 index 0000000000..7d92a0d529 --- /dev/null +++ b/packages/sdk-android/src/tasks/taskRun.ts @@ -0,0 +1,33 @@ +import { getConfigProp, logSummary, createTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; +import { startBundlerIfRequired, waitForBundlerIfRequired } from '@rnv/sdk-react-native'; +import { getAndroidDeviceToRunOn, packageAndroid, runAndroid } from '../runner'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Run your rn app on target device or emulator', + dependsOn: [RnvTaskName.configure], + fn: async ({ ctx, originTaskName }) => { + const bundleAssets = getConfigProp('bundleAssets', false); + + const runDevice = await getAndroidDeviceToRunOn(); + if (runDevice) { + ctx.runtime.target = runDevice?.name || runDevice?.udid; + } + if (!ctx.program.opts().only) { + await startBundlerIfRequired(RnvTaskName.run, originTaskName); + if (bundleAssets || ctx.platform === 'androidwear') { + await packageAndroid(); + } + await runAndroid(runDevice!); + if (!bundleAssets) { + logSummary({ header: 'BUNDLER STARTED' }); + } + return waitForBundlerIfRequired(); + } + return runAndroid(runDevice!); + }, + task: RnvTaskName.run, + isPriorityOrder: true, + options: RnvTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun()), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-android/src/tasks/taskSdkConfigure.ts b/packages/sdk-android/src/tasks/taskSdkConfigure.ts new file mode 100644 index 0000000000..e637bf3738 --- /dev/null +++ b/packages/sdk-android/src/tasks/taskSdkConfigure.ts @@ -0,0 +1,14 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { checkAndConfigureAndroidSdks, checkAndroidSdk } from '../installer'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Configures sdks', + isPrivate: true, + fn: async () => { + await checkAndConfigureAndroidSdks(); + return checkAndroidSdk(); + }, + task: RnvTaskName.sdkConfigure, + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-android/src/tasks/taskTargetLaunch.ts b/packages/sdk-android/src/tasks/taskTargetLaunch.ts new file mode 100644 index 0000000000..c67883a015 --- /dev/null +++ b/packages/sdk-android/src/tasks/taskTargetLaunch.ts @@ -0,0 +1,20 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { getTargetWithOptionalPrompt } from '@rnv/sdk-utils'; +import { checkAndConfigureAndroidSdks, checkAndroidSdk } from '../installer'; +import { launchAndroidSimulator } from '../deviceManager'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Launch specific target', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + await checkAndConfigureAndroidSdks(); + const target = await getTargetWithOptionalPrompt(); + await checkAndroidSdk(); + return launchAndroidSimulator(target); + }, + task: RnvTaskName.targetLaunch, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-android/src/tasks/taskTargetList.ts b/packages/sdk-android/src/tasks/taskTargetList.ts new file mode 100644 index 0000000000..e439a394e5 --- /dev/null +++ b/packages/sdk-android/src/tasks/taskTargetList.ts @@ -0,0 +1,18 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { listAndroidTargets } from '../deviceManager'; +import { checkAndConfigureAndroidSdks, checkAndroidSdk } from '../installer'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'List all available targets for specific platform', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + await checkAndConfigureAndroidSdks(); + await checkAndroidSdk(); + return listAndroidTargets(); + }, + task: RnvTaskName.targetList, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-android/src/types.ts b/packages/sdk-android/src/types.ts index 5d63bcb526..e251cab064 100644 --- a/packages/sdk-android/src/types.ts +++ b/packages/sdk-android/src/types.ts @@ -1,4 +1,4 @@ -import { RenativeConfigPluginPlatform, RnvContext } from '@rnv/core'; +import { RnvPluginPlatformSchema, RnvContext } from '@rnv/core'; export type Payload = { pluginConfigAndroid: { @@ -89,7 +89,7 @@ export type AndroidDevice = { isRunning?: boolean; }; -export type TemplateAndroid = Required['templateAndroid']>; +export type TemplateAndroid = Required['templateAndroid']>; // export type AndroidManifestJSONNode = { // tag: string; diff --git a/packages/sdk-android/src/xmlValuesParser.ts b/packages/sdk-android/src/xmlValuesParser.ts index 12925ada61..413588c1b2 100644 --- a/packages/sdk-android/src/xmlValuesParser.ts +++ b/packages/sdk-android/src/xmlValuesParser.ts @@ -1,6 +1,6 @@ import path from 'path'; import { - RenativeConfigPluginPlatform, + RnvPluginPlatformSchema, getAppFolder, getConfigProp, writeFileSync, @@ -40,7 +40,7 @@ export const parseValuesColorsSync = () => { writeCleanFile(getBuildFilePath(stringsPath), path.join(appFolder, stringsPath), injects, undefined, c); }; -export const injectPluginXmlValuesSync = (plugin: RenativeConfigPluginPlatform) => { +export const injectPluginXmlValuesSync = (plugin: RnvPluginPlatformSchema) => { const rStrings = plugin.templateAndroid?.strings_xml?.children; if (rStrings) { const c = getContext(); diff --git a/packages/sdk-android/supportFiles/AndroidManifest_android.json b/packages/sdk-android/templateFiles/AndroidManifest_android.json similarity index 100% rename from packages/sdk-android/supportFiles/AndroidManifest_android.json rename to packages/sdk-android/templateFiles/AndroidManifest_android.json diff --git a/packages/sdk-android/supportFiles/AndroidManifest_androidtv.json b/packages/sdk-android/templateFiles/AndroidManifest_androidtv.json similarity index 100% rename from packages/sdk-android/supportFiles/AndroidManifest_androidtv.json rename to packages/sdk-android/templateFiles/AndroidManifest_androidtv.json diff --git a/packages/sdk-android/supportFiles/AndroidManifest_androidwear.json b/packages/sdk-android/templateFiles/AndroidManifest_androidwear.json similarity index 100% rename from packages/sdk-android/supportFiles/AndroidManifest_androidwear.json rename to packages/sdk-android/templateFiles/AndroidManifest_androidwear.json diff --git a/packages/sdk-android/supportFiles/AndroidManifest_firetv.json b/packages/sdk-android/templateFiles/AndroidManifest_firetv.json similarity index 100% rename from packages/sdk-android/supportFiles/AndroidManifest_firetv.json rename to packages/sdk-android/templateFiles/AndroidManifest_firetv.json diff --git a/packages/sdk-android/supportFiles/app.build.gradle.json b/packages/sdk-android/templateFiles/app.build.gradle.json similarity index 100% rename from packages/sdk-android/supportFiles/app.build.gradle.json rename to packages/sdk-android/templateFiles/app.build.gradle.json diff --git a/packages/sdk-android/supportFiles/build.gradle.json b/packages/sdk-android/templateFiles/build.gradle.json similarity index 100% rename from packages/sdk-android/supportFiles/build.gradle.json rename to packages/sdk-android/templateFiles/build.gradle.json diff --git a/packages/sdk-android/templates/gradleProject/gradle/wrapper/gradle-wrapper.jar b/packages/sdk-android/templateFiles/gradleProject/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from packages/sdk-android/templates/gradleProject/gradle/wrapper/gradle-wrapper.jar rename to packages/sdk-android/templateFiles/gradleProject/gradle/wrapper/gradle-wrapper.jar diff --git a/packages/sdk-android/templates/gradleProject/gradle/wrapper/gradle-wrapper.properties b/packages/sdk-android/templateFiles/gradleProject/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/sdk-android/templates/gradleProject/gradle/wrapper/gradle-wrapper.properties rename to packages/sdk-android/templateFiles/gradleProject/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/sdk-android/templates/gradleProject/gradlew b/packages/sdk-android/templateFiles/gradleProject/gradlew similarity index 100% rename from packages/sdk-android/templates/gradleProject/gradlew rename to packages/sdk-android/templateFiles/gradleProject/gradlew diff --git a/packages/sdk-android/templates/gradleProject/gradlew.bat b/packages/sdk-android/templateFiles/gradleProject/gradlew.bat similarity index 100% rename from packages/sdk-android/templates/gradleProject/gradlew.bat rename to packages/sdk-android/templateFiles/gradleProject/gradlew.bat diff --git a/packages/sdk-apple/.gitignore b/packages/sdk-apple/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/sdk-apple/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/sdk-apple/package.json b/packages/sdk-apple/package.json index 9d2ca36757..e7a9d0efb6 100644 --- a/packages/sdk-apple/package.json +++ b/packages/sdk-apple/package.json @@ -12,7 +12,7 @@ "files": [ "LICENSE", "lib", - "supportFiles", + "templateFiles", "types.d.ts" ], "main": "lib/index.js", diff --git a/packages/sdk-apple/src/common.ts b/packages/sdk-apple/src/common.ts index 4934cf7e65..d0d8ba69a4 100644 --- a/packages/sdk-apple/src/common.ts +++ b/packages/sdk-apple/src/common.ts @@ -1,4 +1,4 @@ -import { getConfigProp, getContext } from '@rnv/core'; +import { RnvPlatformKey, RnvTaskOption, RnvTaskOptionPresets, getConfigProp, getContext } from '@rnv/core'; export const getAppFolderName = () => { const c = getContext(); @@ -15,3 +15,77 @@ export const getAppFolderName = () => { } return 'RNVApp'; }; + +export const SdkPlatforms: Array = ['ios', 'tvos', 'macos']; + +export const _TaskOptions = { + updatePods: { + key: 'updatePods', + // key: 'update-pods', + shortcut: 'u', + description: 'Force update dependencies (iOS only)', + }, + keychain: { + key: 'keychain', + isValueType: true, + isRequired: true, + description: 'Name of the keychain', + }, + provisioningStyle: { + key: 'provisioningStyle', + // key: 'provisioning-style', + isValueType: true, + isRequired: true, + description: 'Set provisioningStyle (Automatic | Manual)', + }, + codeSignIdentity: { + key: 'codeSignIdentity', + // key: 'code-sign-identity', + isValueType: true, + isRequired: true, + description: 'Set codeSignIdentity (ie iPhone Distribution)', + }, + provisionProfileSpecifier: { + key: 'provisionProfileSpecifier', + // key: 'provision-profile-specifier', + isValueType: true, + isRequired: true, + description: 'Name of provisionProfile', + }, + xcodebuildArgs: { + key: 'xcodebuildArgs', + // key: 'xcodebuild-args', + isValueType: true, + isRequired: true, + description: 'pass down custom xcodebuild arguments', + }, + xcodebuildArchiveArgs: { + key: 'xcodebuildArchiveArgs', + // key: 'xcodebuild-archive-args', + isValueType: true, + isRequired: true, + description: 'pass down custom xcodebuild arguments', + }, + xcodebuildExportArgs: { + key: 'xcodebuildExportArgs', + // key: 'xcodebuild-export-args', + isValueType: true, + isRequired: true, + description: 'pass down custom xcodebuild arguments', + }, +}; + +export type ProgramOptionsKey = keyof typeof _TaskOptions; + +export const SDKTaskOptions = _TaskOptions as Record; + +export const SDKTaskOptionPresets = { + withConfigure: (arr?: Array) => + RnvTaskOptionPresets.withConfigure( + [ + SDKTaskOptions.provisioningStyle, + SDKTaskOptions.provisionProfileSpecifier, + SDKTaskOptions.codeSignIdentity, + ].concat(arr || []) + ), +}; diff --git a/packages/sdk-apple/src/deviceManager.ts b/packages/sdk-apple/src/deviceManager.ts index 1f2b998d00..15bec2a153 100644 --- a/packages/sdk-apple/src/deviceManager.ts +++ b/packages/sdk-apple/src/deviceManager.ts @@ -26,9 +26,7 @@ export const getAppleDevices = async (c: RnvContext, ignoreDevices?: boolean, ig logDefault('getAppleDevices', `ignoreDevices:${ignoreDevices} ignoreSimulators:${ignoreSimulators}`); - const { - program: { skipTargetCheck }, - } = c; + const { skipTargetCheck } = c.program.opts(); const connectedDevicesIds = await utilities.getConnectedDevices(); const connectedDevicesArray = await Promise.all( @@ -260,8 +258,9 @@ const _launchSimulator = async (selectedDevice: AppleDevice) => { return true; }; -export const listAppleDevices = async (c: RnvContext) => { +export const listAppleDevices = async () => { logDefault('listAppleDevices'); + const c = getContext(); const { platform } = c; const devicesArr = await getAppleDevices(c); let devicesString = ''; diff --git a/packages/sdk-apple/src/ejector.ts b/packages/sdk-apple/src/ejector.ts index f0671c69f2..623f674461 100644 --- a/packages/sdk-apple/src/ejector.ts +++ b/packages/sdk-apple/src/ejector.ts @@ -12,6 +12,7 @@ import { parseFonts, parsePlugins, getContext, + RnvFileName, } from '@rnv/core'; import { getAppFolderName } from './common'; @@ -98,7 +99,7 @@ export const ejectXcodeProject = async () => { c, extensionsFilter ); - copyFileSync(path.join(podPath, 'package.json'), path.join(destPath, 'package.json')); + copyFileSync(path.join(podPath, RnvFileName.package), path.join(destPath, RnvFileName.package)); } }); diff --git a/packages/sdk-apple/src/fastlane.ts b/packages/sdk-apple/src/fastlane.ts index 3ebc439704..2c19860b43 100644 --- a/packages/sdk-apple/src/fastlane.ts +++ b/packages/sdk-apple/src/fastlane.ts @@ -32,9 +32,9 @@ export const updateProfile = async (): Promise => { // TODO: run trough all schemes // const schemes = c.buildConfig.platforms?.[c.platform]?.buildSchemes - // const currScheme = c.program.scheme + // const currScheme = c.program.opts().scheme // for(k in schemes) { - // c.program.scheme = k + // c.program.opts().scheme = k // } // if (appConfigId) await setAppConfig(c, appConfigId); @@ -42,7 +42,7 @@ export const updateProfile = async (): Promise => { if (c.platform !== 'ios') { return Promise.reject(`updateProfile:platform ${c.platform} not supported`); } - const { scheme } = c.program; + const { scheme } = c.program.opts(); const { platform } = c; diff --git a/packages/sdk-apple/src/getContext.ts b/packages/sdk-apple/src/getContext.ts new file mode 100644 index 0000000000..1ca1bdf3e8 --- /dev/null +++ b/packages/sdk-apple/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from './'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/sdk-apple/src/index.ts b/packages/sdk-apple/src/index.ts index f0cddc1948..17542acbf6 100644 --- a/packages/sdk-apple/src/index.ts +++ b/packages/sdk-apple/src/index.ts @@ -2,3 +2,37 @@ export * from './deviceManager'; export * from './runner'; export * from './ejector'; export * from './fastlane'; +import taskTargetLaunch from './tasks/taskTargetLaunch'; +import taskTargetList from './tasks/taskTargetList'; +import taskCryptoInstallCerts from './tasks/taskCryptoInstallCerts'; +import taskCryptoUpdateProfile from './tasks/taskCryptoUpdateProfile'; +import taskCryptoUpdateProfiles from './tasks/taskCryptoUpdateProfiles'; +import taskCryptoInstallProfiles from './tasks/taskCryptoInstallProfiles'; +import taskLog from './tasks/taskLog'; +import taskExport from './tasks/taskExport'; +import taskPackage from './tasks/taskPackage'; +import taskConfigure from './tasks/taskConfigure'; +import taskRun from './tasks/taskRun'; +import taskBuild from './tasks/taskBuild'; +import { GetContextType, createRnvSDK } from '@rnv/core'; + +export const Tasks = [ + taskTargetLaunch, + taskTargetList, + taskCryptoInstallCerts, + taskCryptoUpdateProfile, + taskCryptoUpdateProfiles, + taskCryptoInstallProfiles, + taskLog, + taskExport, + taskPackage, + taskConfigure, + taskRun, + taskBuild, +]; + +const Sdk = createRnvSDK({ + tasks: Tasks, +}); + +export type GetContext = GetContextType; diff --git a/packages/sdk-apple/src/objectiveCParser.ts b/packages/sdk-apple/src/objectiveCParser.ts index 167ea14ac3..783f86825e 100644 --- a/packages/sdk-apple/src/objectiveCParser.ts +++ b/packages/sdk-apple/src/objectiveCParser.ts @@ -1,6 +1,6 @@ import path from 'path'; import { - RenativeConfigPluginPlatform, + type RnvPluginPlatformSchema, getConfigProp, getFlavouredProp, chalk, @@ -9,7 +9,7 @@ import { logWarning, parsePlugins, writeCleanFile, - RenativeConfigAppDelegateMethod, + type ConfigAppDelegateMethod, getContext, } from '@rnv/core'; import { @@ -282,7 +282,7 @@ export const parseAppDelegate = ( resolve(); }); -export const injectPluginObjectiveCSync = (c: Context, plugin: RenativeConfigPluginPlatform, key: string) => { +export const injectPluginObjectiveCSync = (c: Context, plugin: RnvPluginPlatformSchema, key: string) => { logDebug(`injectPluginObjectiveCSync:${c.platform}:${key}`); const templateXcode = getFlavouredProp(plugin, 'templateXcode'); const appDelegateMmImports = templateXcode?.AppDelegate_mm?.appDelegateImports; @@ -319,12 +319,12 @@ export const injectPluginObjectiveCSync = (c: Context, plugin: RenativeConfigPlu if (apDelMet) { const amdk2 = Object.keys(apDelMet) as Array; amdk2.forEach((key2) => { - const plugArr: Array = + const plugArr: Array = c.payload.pluginConfigiOS.appDelegateMmMethods[delKey][key2]; if (!plugArr) { logWarning(`appDelegateMethods.${delKey}.${chalk().red(key2)} not supported. SKIPPING.`); } else { - const plugVal: Array = apDelMet[key2]; + const plugVal: Array = apDelMet[key2]; if (plugVal) { plugVal.forEach((v) => { const isString = typeof v === 'string'; diff --git a/packages/sdk-apple/src/plistParser.ts b/packages/sdk-apple/src/plistParser.ts index c0aaabce4f..e753562438 100644 --- a/packages/sdk-apple/src/plistParser.ts +++ b/packages/sdk-apple/src/plistParser.ts @@ -12,6 +12,7 @@ import { writeCleanFile, fsWriteFileSync, getContext, + chalk, } from '@rnv/core'; import { getAppFolderName } from './common'; import { Context, FilePlistJSON } from './types'; @@ -70,7 +71,7 @@ export const parseEntitlementsPlist = () => let pluginsEntitlementsObj = getConfigProp('entitlements'); if (!pluginsEntitlementsObj) { pluginsEntitlementsObj = - readObjectSync(path.join(__dirname, '../supportFiles/entitlements.json')) || undefined; + readObjectSync(path.join(__dirname, '../templateFiles/entitlements.json')) || undefined; } saveObjToPlistSync(c, entitlementsPath, pluginsEntitlementsObj); @@ -93,8 +94,16 @@ export const parseInfoPlist = () => // PLIST let plistObj = - readObjectSync(path.join(__dirname, `../supportFiles/info.plist.${platform}.json`)) || {}; + readObjectSync(path.join(__dirname, `../templateFiles/info.plist.${platform}.json`)) || {}; plistObj.CFBundleDisplayName = getAppTitle(); + + if (!plistObj.CFBundleDisplayName) { + throw new Error( + `CFBundleDisplayName is required!. set it by adding ${chalk().bold( + '"common": { "title": "" }' + )} prop in ${chalk().bold(c.paths.appConfig.config)}` + ); + } plistObj.CFBundleShortVersionString = getAppVersion(); plistObj.CFBundleVersion = getAppVersionCode(); // FONTS diff --git a/packages/sdk-apple/src/podfileParser.ts b/packages/sdk-apple/src/podfileParser.ts index b8c34fb8bf..e22ce8d160 100644 --- a/packages/sdk-apple/src/podfileParser.ts +++ b/packages/sdk-apple/src/podfileParser.ts @@ -1,7 +1,6 @@ import path from 'path'; import { RnvPlugin, - RenativeConfigPluginPlatform, OverridesOptions, getAppFolder, getConfigProp, @@ -11,6 +10,7 @@ import { writeCleanFile, DEFAULTS, getContext, + type RnvPluginPlatformSchema, } from '@rnv/core'; import { addSystemInjects, getAppTemplateFolder } from '@rnv/sdk-utils'; @@ -162,7 +162,7 @@ export const parsePodFile = async () => { const _injectPod = ( podName: string, - pluginPlat: RenativeConfigPluginPlatform | undefined, + pluginPlat: RnvPluginPlatformSchema | undefined, _plugin: RnvPlugin, _key: string ) => { diff --git a/packages/sdk-apple/src/provisionParser.ts b/packages/sdk-apple/src/provisionParser.ts index de3ece7d25..24ca1aba72 100644 --- a/packages/sdk-apple/src/provisionParser.ts +++ b/packages/sdk-apple/src/provisionParser.ts @@ -20,7 +20,7 @@ export const parseProvisioningProfiles = async (c: Context) => { } catch (e) { logWarning( `You have no provisioning files available. Check your ${chalk().bold( - path.join(c.paths.home.dir, 'Library/MobileDevice/Provisioning Profiles') + path.join(c.paths.user.homeDir, 'Library/MobileDevice/Provisioning Profiles') )} folder` ); } diff --git a/packages/sdk-apple/src/runner.ts b/packages/sdk-apple/src/runner.ts index eb1467d802..6dbb1351f6 100644 --- a/packages/sdk-apple/src/runner.ts +++ b/packages/sdk-apple/src/runner.ts @@ -22,7 +22,6 @@ import { logRaw, inquirerPrompt, CoreEnvVars, - getContext, } from '@rnv/core'; import { getAppleDevices } from './deviceManager'; @@ -36,6 +35,7 @@ import { AppleDevice, Context } from './types'; import { ObjectEncodingOptions } from 'fs'; import { packageReactNativeIOS, runCocoaPods, runReactNativeIOS, EnvVars } from '@rnv/sdk-react-native'; import { registerDevice } from './fastlane'; +import { getContext } from './getContext'; export const packageBundleForXcode = () => { return packageReactNativeIOS(); @@ -61,7 +61,7 @@ export const getIosDeviceToRunOn = async (c: Context) => { if (!c.platform) return; - const { device } = c.program; + const { device } = c.program.opts(); let devicesArr: AppleDevice[] = []; if (device === true) { devicesArr = await getAppleDevices(c, false, true); @@ -303,14 +303,13 @@ const _checkLockAndExec = async ( ); if (isAutomaticSigningDisabled) { return _handleProvisioningIssues( - c, e, "Your iOS App Development provisioning profiles don't match. under manual signing mode" ); } const isProvisioningMissing = e.includes('requires a provisioning profile'); if (isProvisioningMissing) { - return _handleProvisioningIssues(c, e, 'Your iOS App requires a provisioning profile'); + return _handleProvisioningIssues(e, 'Your iOS App requires a provisioning profile'); } } @@ -361,8 +360,9 @@ Type in your Apple Team ID to be used (will be saved to ${c.paths.appConfig?.con } }; -const _handleProvisioningIssues = async (c: Context, e: unknown, msg: string) => { - const provisioningStyle = c.program.provisioningStyle || getConfigProp('provisioningStyle'); +const _handleProvisioningIssues = async (e: unknown, msg: string) => { + const c = getContext(); + const provisioningStyle = c.program.opts().provisioningStyle || getConfigProp('provisioningStyle'); const appFolderName = getAppFolderName(); // Sometimes xcodebuild reports Automatic signing is disabled but it could be keychain not accepted by user const isProvAutomatic = provisioningStyle === 'Automatic'; const proAutoText = isProvAutomatic @@ -468,7 +468,7 @@ export const buildXcodeProject = async () => { let destinationPlatform = ''; switch (c.platform) { case 'ios': { - if (c.program.device) { + if (c.program.opts().device) { destinationPlatform = 'iOS'; } else { destinationPlatform = 'iOS Simulator'; @@ -476,7 +476,7 @@ export const buildXcodeProject = async () => { break; } case 'tvos': { - if (c.program.device) { + if (c.program.opts().device) { destinationPlatform = 'tvOS'; } else { destinationPlatform = 'tvOS Simulator'; @@ -496,8 +496,8 @@ export const buildXcodeProject = async () => { const allowProvisioningUpdates = getConfigProp('allowProvisioningUpdates') || true; const ignoreLogs = getConfigProp('ignoreLogs'); let ps = ''; - if (c.program.xcodebuildArgs) { - ps = c.program.xcodebuildArgs; + if (c.program.opts().xcodebuildArgs) { + ps = c.program.opts().xcodebuildArgs; } const p: string[] = []; @@ -588,8 +588,8 @@ const archiveXcodeProject = () => { const ignoreLogs = getConfigProp('ignoreLogs'); const exportPathArchive = `${exportPath}/${appFolderName}.xcarchive`; let ps = ''; - if (c.program.xcodebuildArchiveArgs) { - ps = c.program.xcodebuildArchiveArgs; + if (c.program.opts().xcodebuildArchiveArgs) { + ps = c.program.opts().xcodebuildArchiveArgs; } const p: string[] = []; @@ -658,8 +658,8 @@ export const exportXcodeProject = async () => { const ignoreLogs = getConfigProp('ignoreLogs'); let ps = ''; - if (c.program.xcodebuildExportArgs) { - ps = c.program.xcodebuildExportArgs; + if (c.program.opts().xcodebuildExportArgs) { + ps = c.program.opts().xcodebuildExportArgs; } const p = ['-exportArchive']; @@ -692,7 +692,7 @@ export const runAppleLog = () => new Promise(() => { const c = getContext(); logDefault('runAppleLog'); - const filter = c.program.filter || 'RNV'; + const filter = c.program.opts().filter || 'RNV'; const opts: ObjectEncodingOptions & ExecFileOptions = {}; //{ stdio: 'inherit', customFds: [0, 1, 2] }; const child = child_process.execFile( 'xcrun', @@ -718,7 +718,7 @@ export const configureXcodeProject = async () => { const c = getContext(); logDefault('configureXcodeProject'); - const { device } = c.program; + const { device } = c.program.opts(); const { platform } = c; // const bundlerIp = device ? getIP() : 'localhost'; const appFolder = getAppFolder(); @@ -833,7 +833,7 @@ export const configureXcodeProject = async () => { await parseEntitlementsPlist(); await parseInfoPlist(); await copyBuildsFolder(); - await runCocoaPods(); + await runCocoaPods(c.program.opts().updatePods); await parseXcodeProject(); return true; }; diff --git a/packages/sdk-apple/src/swiftParser.ts b/packages/sdk-apple/src/swiftParser.ts index 6161f78b39..f63245b720 100644 --- a/packages/sdk-apple/src/swiftParser.ts +++ b/packages/sdk-apple/src/swiftParser.ts @@ -1,6 +1,6 @@ // import path from 'path'; // import { -// RenativeConfigPluginPlatform, +// RnvPluginPlatformSchema, // getEntryFile, // getAppTemplateFolder, // getConfigProp, @@ -256,7 +256,7 @@ // resolve(); // }); -// export const injectPluginSwiftSync = (c: Context, plugin: RenativeConfigPluginPlatform, key: string) => { +// export const injectPluginSwiftSync = (c: Context, plugin: RnvPluginPlatformSchema, key: string) => { // logDebug(`injectPluginSwiftSync:${c.platform}:${key}`); // const templateXcode = getFlavouredProp(plugin, 'templateXcode'); // const appDelegateImports = templateXcode?.AppDelegate_mm?.appDelegateImports; diff --git a/packages/engine-rn/src/tasks/__tests__/taskRun.test.ts b/packages/sdk-apple/src/tasks/__tests__/taskRun.test.ts similarity index 64% rename from packages/engine-rn/src/tasks/__tests__/taskRun.test.ts rename to packages/sdk-apple/src/tasks/__tests__/taskRun.test.ts index 15c885f4f0..a5c6777c6d 100644 --- a/packages/engine-rn/src/tasks/__tests__/taskRun.test.ts +++ b/packages/sdk-apple/src/tasks/__tests__/taskRun.test.ts @@ -1,11 +1,10 @@ import { createRnvContext, getContext } from '@rnv/core'; import taskRun from '../taskRun'; -import { getIosDeviceToRunOn, runXcodeProject } from '@rnv/sdk-apple'; +import { getIosDeviceToRunOn, runXcodeProject } from '../../runner'; jest.mock('@rnv/core'); -jest.mock('@rnv/sdk-apple'); -jest.mock('@rnv/sdk-android'); jest.mock('@rnv/sdk-react-native'); +jest.mock('../../runner'); beforeEach(() => { createRnvContext(); @@ -21,7 +20,13 @@ test('Execute task.rnv.run', async () => { ctx.platform = 'ios'; jest.mocked(getIosDeviceToRunOn).mockResolvedValueOnce('MOCK_DEVICE_ARGS'); // WHEN - await taskRun.fn?.(ctx, undefined, undefined); + await taskRun.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }); // THEN expect(runXcodeProject).toHaveBeenCalledWith('MOCK_DEVICE_ARGS'); }); diff --git a/packages/sdk-apple/src/tasks/taskBuild.ts b/packages/sdk-apple/src/tasks/taskBuild.ts new file mode 100644 index 0000000000..1774f6d6d1 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskBuild.ts @@ -0,0 +1,18 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { buildXcodeProject } from '../runner'; +import { SdkPlatforms, SDKTaskOptionPresets, SDKTaskOptions } from '../common'; + +export default createTask({ + description: 'Build project binary', + dependsOn: [RnvTaskName.package], + fn: async ({ parentTaskName }) => { + if (parentTaskName === RnvTaskName.export) { + // build task is not necessary when exporting ios + return true; + } + return buildXcodeProject(); + }, + task: RnvTaskName.build, + options: SDKTaskOptionPresets.withConfigure([SDKTaskOptions.xcodebuildArgs]), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskConfigure.ts b/packages/sdk-apple/src/tasks/taskConfigure.ts new file mode 100644 index 0000000000..0a76c01efa --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskConfigure.ts @@ -0,0 +1,19 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { configureFontSources } from '@rnv/sdk-react-native'; +import { configureXcodeProject } from '../runner'; +import { SdkPlatforms, SDKTaskOptionPresets } from '../common'; + +export default createTask({ + description: 'Configure current project', + dependsOn: [RnvTaskName.platformConfigure], + fn: async ({ ctx, parentTaskName }) => { + if (ctx.program.opts().only && !!parentTaskName) { + return true; + } + await configureXcodeProject(); + await configureFontSources(); + }, + options: SDKTaskOptionPresets.withConfigure(), + task: RnvTaskName.configure, + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskCryptoInstallCerts.ts b/packages/sdk-apple/src/tasks/taskCryptoInstallCerts.ts new file mode 100644 index 0000000000..5e08b49027 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskCryptoInstallCerts.ts @@ -0,0 +1,22 @@ +import { logWarning, getFileListSync, executeAsync, createTask, RnvTaskName } from '@rnv/core'; +import { SdkPlatforms } from '../common'; + +export default createTask({ + description: 'Installs certificates into keychain (mac only)', + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const kChain = ctx.program.opts().keychain || 'ios-build.keychain'; + + const list = getFileListSync(ctx.paths.workspace.project.dir); + const cerArr = list.filter((v) => v.endsWith('.cer')); + + try { + Promise.all(cerArr.map((v) => executeAsync(`security import ${v} -k ${kChain} -A`))); + } catch (e) { + logWarning(e); + return true; + } + }, + task: RnvTaskName.cryptoInstallCerts, + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskCryptoInstallProfiles.ts b/packages/sdk-apple/src/tasks/taskCryptoInstallProfiles.ts new file mode 100644 index 0000000000..c3a7947a28 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskCryptoInstallProfiles.ts @@ -0,0 +1,40 @@ +import path from 'path'; +import { + logWarning, + logError, + logDebug, + getFileListSync, + copyFileSync, + mkdirSync, + fsExistsSync, + createTask, + RnvTaskName, +} from '@rnv/core'; +import { SdkPlatforms } from '../common'; + +export default createTask({ + description: 'Installs provisioning certificates found in your workspace (mac only)', + dependsOn: [RnvTaskName.projectConfigure], + fn: async ({ ctx }) => { + const ppFolder = path.join(ctx.paths.user.homeDir, 'Library/MobileDevice/Provisioning Profiles'); + + if (!fsExistsSync(ppFolder)) { + logWarning(`folder ${ppFolder} does not exist!`); + mkdirSync(ppFolder); + } + + const list = getFileListSync(ctx.paths.workspace.project.dir); + const mobileprovisionArr = list.filter((v) => v.endsWith('.mobileprovision')); + + try { + mobileprovisionArr.forEach((v) => { + logDebug(`taskCryptoInstallProfiles: Installing: ${v}`); + copyFileSync(v, ppFolder); + }); + } catch (e) { + logError(e); + } + }, + task: RnvTaskName.cryptoInstallProfiles, + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskCryptoUpdateProfile.ts b/packages/sdk-apple/src/tasks/taskCryptoUpdateProfile.ts new file mode 100644 index 0000000000..4074cb8c01 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskCryptoUpdateProfile.ts @@ -0,0 +1,13 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { updateProfile } from '../fastlane'; +import { SdkPlatforms } from '../common'; + +export default createTask({ + description: 'Update provisioning profile (mac only)', + dependsOn: [RnvTaskName.projectConfigure], + fn: async () => { + return updateProfile(); + }, + task: RnvTaskName.cryptoUpdateProfile, + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskCryptoUpdateProfiles.ts b/packages/sdk-apple/src/tasks/taskCryptoUpdateProfiles.ts new file mode 100644 index 0000000000..903e2dbf04 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskCryptoUpdateProfiles.ts @@ -0,0 +1,23 @@ +import { listAppConfigsFoldersSync, chalk, logTask, createTask, RnvTaskName } from '@rnv/core'; +import { updateProfile } from '../fastlane'; +import { SdkPlatforms } from '../common'; + +const _updateProfile = (v: string) => + new Promise((resolve, reject) => { + logTask(`_updateProfile:${v}`, chalk().grey); + updateProfile() + .then(() => resolve()) + .catch((e) => reject(e)); + }); + +export default createTask({ + description: 'Will attempt to update all provisioning profiles (mac only)', + dependsOn: [RnvTaskName.projectConfigure], + fn: async () => { + const acList = listAppConfigsFoldersSync(true); + + return acList.reduce((previousPromise, v) => previousPromise.then(() => _updateProfile(v)), Promise.resolve()); + }, + task: RnvTaskName.cryptoUpdateProfiles, + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskEject.ts b/packages/sdk-apple/src/tasks/taskEject.ts new file mode 100644 index 0000000000..ce02b7b7b6 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskEject.ts @@ -0,0 +1,18 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { ejectXcodeProject } from '../ejector'; +import { SdkPlatforms, SDKTaskOptionPresets } from '../common'; + +export default createTask({ + description: 'Eject current ios project app to self contained native project', + dependsOn: [RnvTaskName.package], + beforeDependsOn: async ({ ctx }) => { + ctx.runtime._platformBuildsSuffix = '_eject'; + ctx.runtime._skipNativeDepResolutions = true; + }, + fn: async () => { + return ejectXcodeProject(); + }, + task: RnvTaskName.eject, + options: SDKTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskExport.ts b/packages/sdk-apple/src/tasks/taskExport.ts new file mode 100644 index 0000000000..4b1fee59a2 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskExport.ts @@ -0,0 +1,14 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { exportXcodeProject } from '../runner'; +import { SDKTaskOptionPresets, SdkPlatforms } from '../common'; + +export default createTask({ + description: 'Export the app into deployable binary', + dependsOn: [RnvTaskName.build], + fn: async () => { + return exportXcodeProject(); + }, + task: RnvTaskName.export, + options: SDKTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskLog.ts b/packages/sdk-apple/src/tasks/taskLog.ts new file mode 100644 index 0000000000..d260c58e12 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskLog.ts @@ -0,0 +1,14 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { runAppleLog } from '../runner'; +import { SdkPlatforms } from '../common'; + +export default createTask({ + description: 'Attach logger to device or emulator and print out logs', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + return runAppleLog(); + }, + task: RnvTaskName.log, + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-apple/src/tasks/taskPackage.ts b/packages/sdk-apple/src/tasks/taskPackage.ts new file mode 100644 index 0000000000..c71862f156 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskPackage.ts @@ -0,0 +1,20 @@ +import { getConfigProp, createTask, RnvTaskName } from '@rnv/core'; +import { packageBundleForXcode } from '../runner'; +import { SDKTaskOptionPresets, SdkPlatforms } from '../common'; + +export default createTask({ + description: 'Package source files into bundle', + dependsOn: [RnvTaskName.configure], + fn: async () => { + const bundleAssets = getConfigProp('bundleAssets'); + + if (!bundleAssets) { + return true; + } + + return packageBundleForXcode(); + }, + task: RnvTaskName.package, + options: SDKTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskRun.ts b/packages/sdk-apple/src/tasks/taskRun.ts new file mode 100644 index 0000000000..0f2fdbd20e --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskRun.ts @@ -0,0 +1,27 @@ +import { getConfigProp, logSummary, createTask, RnvTaskName, RnvTaskOptionPresets } from '@rnv/core'; +import { startBundlerIfRequired, waitForBundlerIfRequired } from '@rnv/sdk-react-native'; +import { getIosDeviceToRunOn, runXcodeProject } from '../runner'; +import { SDKTaskOptionPresets, SdkPlatforms } from '../common'; + +export default createTask({ + description: 'Run your rn app on target device or emulator', + dependsOn: [RnvTaskName.configure], + fn: async ({ ctx, originTaskName }) => { + const bundleAssets = getConfigProp('bundleAssets', false); + + const runDeviceArgs = await getIosDeviceToRunOn(ctx); + if (!ctx.program.opts().only) { + await startBundlerIfRequired(RnvTaskName.run, originTaskName); + await runXcodeProject(runDeviceArgs); + if (!bundleAssets) { + logSummary({ header: 'BUNDLER STARTED' }); + } + return waitForBundlerIfRequired(); + } + await runXcodeProject(runDeviceArgs); + }, + task: RnvTaskName.run, + isPriorityOrder: true, + options: SDKTaskOptionPresets.withConfigure(RnvTaskOptionPresets.withRun()), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-apple/src/tasks/taskTargetLaunch.ts b/packages/sdk-apple/src/tasks/taskTargetLaunch.ts new file mode 100644 index 0000000000..e753631fdb --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskTargetLaunch.ts @@ -0,0 +1,17 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { getTargetWithOptionalPrompt } from '@rnv/sdk-utils'; +import { launchAppleSimulator } from '../deviceManager'; +import { SdkPlatforms } from '../common'; + +export default createTask({ + description: 'Launch specific ios target', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + const target = await getTargetWithOptionalPrompt(); + return launchAppleSimulator(target); + }, + task: RnvTaskName.targetLaunch, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-apple/src/tasks/taskTargetList.ts b/packages/sdk-apple/src/tasks/taskTargetList.ts new file mode 100644 index 0000000000..b5c76a6783 --- /dev/null +++ b/packages/sdk-apple/src/tasks/taskTargetList.ts @@ -0,0 +1,15 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { listAppleDevices } from '../deviceManager'; +import { SdkPlatforms } from '../common'; + +export default createTask({ + description: 'List all available targets for specific platform', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + return listAppleDevices(); + }, + task: RnvTaskName.targetList, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, //TODO: evaluate this after moving to SDK +}); diff --git a/packages/sdk-apple/src/types.ts b/packages/sdk-apple/src/types.ts index c046602129..0327bef455 100644 --- a/packages/sdk-apple/src/types.ts +++ b/packages/sdk-apple/src/types.ts @@ -1,4 +1,4 @@ -import { RenativeConfigPluginPlatform, RnvContext } from '@rnv/core'; +import { RnvPluginPlatformSchema, RnvContext } from '@rnv/core'; export type AppleDevice = { udid?: string; @@ -154,7 +154,7 @@ export type ObjectiveCAppDelegateSubKey = keyof ObjectiveCAppDelegate['applicati export type ObjectiveCAppDelegateKey = keyof ObjectiveCAppDelegate; -export type TemplateXcode = Required['templateXcode']>; +export type TemplateXcode = Required['templateXcode']>; export type FilePlistJSON = { CFBundleDisplayName?: string; diff --git a/packages/sdk-apple/src/xcodeParser.ts b/packages/sdk-apple/src/xcodeParser.ts index a3269fe971..46629560eb 100644 --- a/packages/sdk-apple/src/xcodeParser.ts +++ b/packages/sdk-apple/src/xcodeParser.ts @@ -13,7 +13,6 @@ import { logWarning, parsePlugins, writeFileSync, - getContext, } from '@rnv/core'; import { provision } from 'ios-mobileprovision-finder'; import path from 'path'; @@ -21,6 +20,7 @@ import { getAppFolderName } from './common'; import { parseProvisioningProfiles } from './provisionParser'; import { Context } from './types'; import { getAppId } from '@rnv/sdk-utils'; +import { getContext } from './getContext'; export const parseXcodeProject = async () => { const c = getContext(); @@ -30,13 +30,13 @@ export const parseXcodeProject = async () => { // PROJECT c.payload.xcodeProj = {}; c.payload.xcodeProj.provisioningStyle = - c.program.provisioningStyle || getConfigProp('provisioningStyle', 'Automatic'); + c.program.opts().provisioningStyle || getConfigProp('provisioningStyle', 'Automatic'); c.payload.xcodeProj.deploymentTarget = getConfigProp('deploymentTarget', '14.0'); c.payload.xcodeProj.provisionProfileSpecifier = - c.program.provisionProfileSpecifier || getConfigProp('provisionProfileSpecifier'); + c.program.opts().provisionProfileSpecifier || getConfigProp('provisionProfileSpecifier'); c.payload.xcodeProj.provisionProfileSpecifiers = getConfigProp('provisionProfileSpecifiers') || {}; c.payload.xcodeProj.codeSignIdentity = - c.program.codeSignIdentity || getConfigProp('codeSignIdentity', 'iPhone Developer'); + c.program.opts().codeSignIdentity || getConfigProp('codeSignIdentity', 'iPhone Developer'); c.payload.xcodeProj.codeSignIdentities = getConfigProp('codeSignIdentities'); @@ -70,7 +70,8 @@ export const parseXcodeProject = async () => { warningMessage: 'No provisionProfileSpecifier configured in appConfig despite setting provisioningStyle to manual', }); - const schemeToUpdate = c.files.appConfig.config?.platforms?.[platform]?.buildSchemes?.[c.program.scheme]; + const schemeToUpdate = + c.files.appConfig.config?.platforms?.[platform]?.buildSchemes?.[c.program.opts().scheme]; if (autoFix && schemeToUpdate && c.files.appConfig.config) { c.payload.xcodeProj.provisionProfileSpecifier = eligibleProfile.Name; if ('provisionProfileSpecifier' in schemeToUpdate) { diff --git a/packages/sdk-apple/supportFiles/AppleWWDRCA.cer b/packages/sdk-apple/templateFiles/AppleWWDRCA.cer similarity index 100% rename from packages/sdk-apple/supportFiles/AppleWWDRCA.cer rename to packages/sdk-apple/templateFiles/AppleWWDRCA.cer diff --git a/packages/sdk-apple/supportFiles/entitlements.json b/packages/sdk-apple/templateFiles/entitlements.json similarity index 100% rename from packages/sdk-apple/supportFiles/entitlements.json rename to packages/sdk-apple/templateFiles/entitlements.json diff --git a/packages/sdk-apple/supportFiles/info.plist.ios.json b/packages/sdk-apple/templateFiles/info.plist.ios.json similarity index 100% rename from packages/sdk-apple/supportFiles/info.plist.ios.json rename to packages/sdk-apple/templateFiles/info.plist.ios.json diff --git a/packages/sdk-apple/supportFiles/info.plist.macos.json b/packages/sdk-apple/templateFiles/info.plist.macos.json similarity index 100% rename from packages/sdk-apple/supportFiles/info.plist.macos.json rename to packages/sdk-apple/templateFiles/info.plist.macos.json diff --git a/packages/sdk-apple/supportFiles/info.plist.tvos.json b/packages/sdk-apple/templateFiles/info.plist.tvos.json similarity index 100% rename from packages/sdk-apple/supportFiles/info.plist.tvos.json rename to packages/sdk-apple/templateFiles/info.plist.tvos.json diff --git a/packages/sdk-kaios/.gitignore b/packages/sdk-kaios/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/sdk-kaios/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/sdk-kaios/package.json b/packages/sdk-kaios/package.json index f7f958db5d..cbf7c2840c 100644 --- a/packages/sdk-kaios/package.json +++ b/packages/sdk-kaios/package.json @@ -12,7 +12,7 @@ "files": [ "LICENSE", "lib", - "supportFiles", + "templateFiles", "types.d.ts" ], "main": "lib/index.js", diff --git a/packages/sdk-kaios/src/constants.ts b/packages/sdk-kaios/src/constants.ts index 9defc3359d..b424266be4 100644 --- a/packages/sdk-kaios/src/constants.ts +++ b/packages/sdk-kaios/src/constants.ts @@ -1 +1,5 @@ +import { RnvPlatformKey } from '@rnv/core'; + export const CLI_KAIOS_EMULATOR = 'kaiosEmulator'; + +export const SdkPlatforms: Array = ['kaios']; diff --git a/packages/sdk-kaios/src/getContext.ts b/packages/sdk-kaios/src/getContext.ts new file mode 100644 index 0000000000..1ca1bdf3e8 --- /dev/null +++ b/packages/sdk-kaios/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from './'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/sdk-kaios/src/index.ts b/packages/sdk-kaios/src/index.ts index e0b9ec084d..86274191e3 100644 --- a/packages/sdk-kaios/src/index.ts +++ b/packages/sdk-kaios/src/index.ts @@ -1,3 +1,14 @@ export * from './deviceManager'; export * from './runner'; export * from './constants'; + +import { GetContextType, createRnvSDK } from '@rnv/core'; +import taskTargetLaunch from './tasks/taskTargetLaunch'; + +export const Tasks = [taskTargetLaunch]; + +const Sdk = createRnvSDK({ + tasks: Tasks, +}); + +export type GetContext = GetContextType; diff --git a/packages/sdk-kaios/src/tasks/taskTargetLaunch.ts b/packages/sdk-kaios/src/tasks/taskTargetLaunch.ts new file mode 100644 index 0000000000..c22776d373 --- /dev/null +++ b/packages/sdk-kaios/src/tasks/taskTargetLaunch.ts @@ -0,0 +1,17 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { getTargetWithOptionalPrompt } from '@rnv/sdk-utils'; +import { launchKaiOSSimulator } from '../deviceManager'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Launch specific target', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + const target = await getTargetWithOptionalPrompt(); + return launchKaiOSSimulator(target); + }, + task: RnvTaskName.targetLaunch, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-react-native/.gitignore b/packages/sdk-react-native/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/sdk-react-native/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/sdk-react-native/src/adapters.ts b/packages/sdk-react-native/src/adapters.ts index b050c39c14..32b211dd78 100644 --- a/packages/sdk-react-native/src/adapters.ts +++ b/packages/sdk-react-native/src/adapters.ts @@ -172,7 +172,7 @@ export const withMetroConfig = (projectRoot: string): ConfigT => { }, }), }, - watchFolders: [], + watchFolders: [process.env.RNV_MONO_ROOT || process.cwd()], }; const { mergeConfig, getDefaultConfig } = require('metro-config'); diff --git a/packages/sdk-react-native/src/common.ts b/packages/sdk-react-native/src/common.ts index c3b3c93305..23227c111c 100644 --- a/packages/sdk-react-native/src/common.ts +++ b/packages/sdk-react-native/src/common.ts @@ -1,5 +1,4 @@ import path from 'path'; -import axios from 'axios'; import { logDefault, executeTask, @@ -12,11 +11,11 @@ import { RnvTaskName, getContext, } from '@rnv/core'; -import { confirmActiveBundler } from '@rnv/sdk-utils'; +import { confirmActiveBundler, axios } from '@rnv/sdk-utils'; let keepRNVRunning = false; -export const startBundlerIfRequired = async (parentTask: string, originTask?: string) => { +export const startBundlerIfRequired = async (parentTaskName: string, originTaskName?: string) => { logDefault('startBundlerIfRequired'); const bundleAssets = getConfigProp('bundleAssets'); if (bundleAssets === true) return; @@ -24,14 +23,14 @@ export const startBundlerIfRequired = async (parentTask: string, originTask?: st const isRunning = await isBundlerActive(); if (!isRunning) { // _taskStart(c, parentTask, originTask); - await executeTask(RnvTaskName.start, parentTask, originTask); + await executeTask({ taskName: RnvTaskName.start, parentTaskName, originTaskName }); keepRNVRunning = true; await waitForBundler(); } else { const resetCompleted = await confirmActiveBundler(); if (resetCompleted) { - await executeTask(RnvTaskName.start, parentTask, originTask); + await executeTask({ taskName: RnvTaskName.start, parentTaskName, originTaskName }); keepRNVRunning = true; await waitForBundler(); @@ -111,7 +110,7 @@ const poll = (fn: () => Promise, timeout = 30000, interval = 1000) => { return new Promise(checkCondition); }; -export const configureFonts = async () => { +export const configureFontSources = async () => { const c = getContext(); const fontFolders = new Set(); parseFonts((font, dir) => { diff --git a/packages/sdk-react-native/src/constants.ts b/packages/sdk-react-native/src/constants.ts new file mode 100644 index 0000000000..3f49080228 --- /dev/null +++ b/packages/sdk-react-native/src/constants.ts @@ -0,0 +1,13 @@ +import { RnvPlatformKey } from '@rnv/core'; + +export const SdkPlatforms: Array = [ + 'ios', + 'android', + 'androidtv', + 'androidwear', + 'firetv', + 'macos', + 'xbox', + 'windows', + 'tvos', +]; diff --git a/packages/sdk-react-native/src/env.ts b/packages/sdk-react-native/src/env.ts index eaa544a605..841badac77 100644 --- a/packages/sdk-react-native/src/env.ts +++ b/packages/sdk-react-native/src/env.ts @@ -31,6 +31,13 @@ export const EnvVars = { } return {}; }, + RNV_FLIPPER_ENABLED: () => { + const enableFlipper = getConfigProp('flipperEnabled', true); + if (!enableFlipper) { + return { NO_FLIPPER: '1' }; + } + return {}; + }, RNV_SKIP_LINKING: () => { const skipPlugins: string[] = []; parsePlugins( diff --git a/packages/sdk-react-native/src/getContext.ts b/packages/sdk-react-native/src/getContext.ts new file mode 100644 index 0000000000..1ca1bdf3e8 --- /dev/null +++ b/packages/sdk-react-native/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from './'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/sdk-react-native/src/index.ts b/packages/sdk-react-native/src/index.ts index 8a783fa408..8a737a24e8 100644 --- a/packages/sdk-react-native/src/index.ts +++ b/packages/sdk-react-native/src/index.ts @@ -4,3 +4,13 @@ export * from './iosRunner'; export * from './metroRunner'; export * from './adapters'; export * from './env'; +import { GetContextType, createRnvSDK } from '@rnv/core'; +import taskStart from './tasks/taskStart'; + +export const Tasks = [taskStart]; + +const Sdk = createRnvSDK({ + tasks: Tasks, +}); + +export type GetContext = GetContextType; diff --git a/packages/sdk-react-native/src/iosRunner.ts b/packages/sdk-react-native/src/iosRunner.ts index 09314c940e..1d799be9bf 100644 --- a/packages/sdk-react-native/src/iosRunner.ts +++ b/packages/sdk-react-native/src/iosRunner.ts @@ -14,8 +14,8 @@ import { getContext, getCurrentCommand, inquirerPrompt, + RnvEnvContext, } from '@rnv/core'; -import { RnvEnvContext } from '@rnv/core/lib/env/types'; import { EnvVars } from './env'; import shellQuote from 'shell-quote'; import path from 'path'; @@ -28,7 +28,7 @@ export const packageReactNativeIOS = (isDev = false) => { const entryFile = getConfigProp('entryFile'); if (!c.platform) return; - // const { maxErrorLength } = c.program; + // const { maxErrorLength } = c.program.opts(); const args = [ 'bundle', '--platform', @@ -49,7 +49,7 @@ export const packageReactNativeIOS = (isDev = false) => { args.push(`${getAppFolder()}/main.jsbundle.map`); } - if (c.program.info) { + if (c.program.opts().info) { args.push('--verbose'); } @@ -65,6 +65,7 @@ export const packageReactNativeIOS = (isDev = false) => { ...CoreEnvVars.RNV_EXTENSIONS(), ...EnvVars.RNV_REACT_NATIVE_PATH(), ...EnvVars.RNV_APP_ID(), + ...EnvVars.RNV_SKIP_LINKING(), }, } ); @@ -88,6 +89,7 @@ export const runReactNativeIOS = async ( ...EnvVars.RCT_METRO_PORT(), ...EnvVars.RNV_REACT_NATIVE_PATH(), ...EnvVars.RNV_APP_ID(), + ...EnvVars.RNV_SKIP_LINKING(), }; try { @@ -121,11 +123,14 @@ const generateCombinedChecksum = () => { return combinedChecksum; }; -const checkIfPodsIsRequired = (c: RnvContext): { result: boolean; reason: string; code: number } => { +const checkIfPodsIsRequired = ( + c: RnvContext, + forceUpdatePods: boolean +): { result: boolean; reason: string; code: number } => { if (c.runtime._skipNativeDepResolutions) { return { result: false, reason: `Command ${getCurrentCommand(true)} explicitly skips pod checks`, code: 1 }; } - if (c.program.updatePods) { + if (forceUpdatePods) { return { result: true, reason: 'You passed --updatePods option', code: 2 }; } const appFolder = getAppFolder(); @@ -167,11 +172,11 @@ const updatePodsChecksum = () => { return fsWriteFileSync(podChecksumPath, combinedChecksum); }; -export const runCocoaPods = async () => { +export const runCocoaPods = async (forceUpdatePods: boolean) => { const c = getContext(); - logDefault('runCocoaPods', `forceUpdate:${!!c.program.updatePods}`); + logDefault('runCocoaPods', `forceUpdate:${!!forceUpdatePods}`); - const checkResult = await checkIfPodsIsRequired(c); + const checkResult = await checkIfPodsIsRequired(c, forceUpdatePods); if (!checkResult.result) { logInfo(`Skipping pod action. Reason: ${checkResult.reason}`); @@ -198,9 +203,10 @@ export const runCocoaPods = async () => { ...EnvVars.RNV_REACT_NATIVE_PATH(), ...EnvVars.RCT_NEW_ARCH_ENABLED(), ...EnvVars.RNV_SKIP_LINKING(), + ...EnvVars.RNV_FLIPPER_ENABLED(), }; - if (c.program.updatePods) { + if (forceUpdatePods) { await executeAsync('bundle exec pod update', { cwd: appFolder, env, diff --git a/packages/sdk-react-native/src/metroRunner.ts b/packages/sdk-react-native/src/metroRunner.ts index a745fc61f4..46cd60dd15 100644 --- a/packages/sdk-react-native/src/metroRunner.ts +++ b/packages/sdk-react-native/src/metroRunner.ts @@ -1,10 +1,9 @@ import { CoreEnvVars, - PlatformKey, + RnvPlatformKey, chalk, executeAsync, logError, - logErrorPlatform, logInfo, logRaw, logDefault, @@ -14,9 +13,10 @@ import { isBundlerActive } from './common'; import { EnvVars } from './env'; import { confirmActiveBundler, getEntryFile } from '@rnv/sdk-utils'; -const BUNDLER_PLATFORMS: Partial> = {}; +const BUNDLER_PLATFORMS: Partial> = {}; BUNDLER_PLATFORMS['ios'] = 'ios'; +BUNDLER_PLATFORMS['tvos'] = 'ios'; BUNDLER_PLATFORMS['macos'] = 'ios'; BUNDLER_PLATFORMS['android'] = 'android'; BUNDLER_PLATFORMS['androidtv'] = 'android'; @@ -32,7 +32,6 @@ export const startReactNative = async (opts: { logDefault('startReactNative'); if (!c.platform) { - logErrorPlatform(); return false; } @@ -54,14 +53,15 @@ export const startReactNative = async (opts: { startCmd += ` --config=${metroConfigName}`; } - if (c.program.resetHard || c.program.reset) { + if (c.program.opts().resetHard || c.program.opts().reset) { startCmd += ' --reset-cache'; } - if (c.program.resetHard || c.program.reset) { + if (c.program.opts().resetHard || c.program.opts().reset) { logInfo(`You passed ${chalk().bold('-r')} argument. --reset-cache will be applied to react-native`); } // logSummary('BUNDLER STARTED'); + const url = chalk().cyan( `http://${c.runtime.localhost}:${c.runtime.port}/${getEntryFile()}.bundle?platform=${ BUNDLER_PLATFORMS[c.platform] @@ -114,6 +114,6 @@ Dev server running at: ${url} ...EnvVars.RNV_APP_ID(), ...CoreEnvVars.RNV_EXTENSIONS(), }, - }).catch((e) => logError(e, true)); + }).catch((e) => logError(e)); return true; }; diff --git a/packages/sdk-react-native/src/tasks/__tests__/taskStart.test.ts b/packages/sdk-react-native/src/tasks/__tests__/taskStart.test.ts new file mode 100644 index 0000000000..f422274695 --- /dev/null +++ b/packages/sdk-react-native/src/tasks/__tests__/taskStart.test.ts @@ -0,0 +1,115 @@ +import { RnvTaskName, createRnvContext, doResolve, getContext } from '@rnv/core'; +import taskStart from '../taskStart'; +import { startReactNative } from '../../metroRunner'; + +jest.mock('@rnv/core'); +jest.mock('@rnv/sdk-utils'); +jest.mock('../../metroRunner'); + +beforeEach(() => { + createRnvContext(); +}); + +afterEach(() => { + jest.resetAllMocks(); +}); + +describe('taskStart', () => { + it('Execute task.rnv.start with no parent', async () => { + // GIVEN + const ctx = getContext(); + ctx.platform = 'ios'; + // WHEN + await taskStart.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: undefined, + shouldSkip: false, + }); + // THEN + expect(taskStart.dependsOn).toEqual([RnvTaskName.configureSoft]); + expect(startReactNative).toHaveBeenCalledWith({ waitForBundler: true }); + }); + it('Execute task.rnv.start', async () => { + // GIVEN + const ctx = getContext(); + ctx.platform = 'ios'; + // WHEN + await taskStart.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }); + // THEN + expect(startReactNative).toHaveBeenCalledWith({ waitForBundler: false }); + }); + it('Execute task.rnv.start with no parent and custom customCliPath', async () => { + // GIVEN + const ctx = getContext(); + ctx.platform = 'tvos'; + ctx.runtime.runtimeExtraProps = { + reactNativePackageName: 'MOCKED_NAME', + reactNativeMetroConfigName: 'MOCKED_CONFIG', + }; + jest.mocked(doResolve).mockReturnValueOnce('MOCKED_PATH'); + // WHEN + await taskStart.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: undefined, + shouldSkip: false, + }); + // THEN + expect(startReactNative).toHaveBeenCalledWith({ + waitForBundler: true, + customCliPath: 'MOCKED_PATH/local-cli/cli.js', + metroConfigName: 'MOCKED_CONFIG', + }); + }); + + it('Execute task.rnv.start with customCliPath', async () => { + // GIVEN + const ctx = getContext(); + ctx.platform = 'tvos'; + ctx.runtime.runtimeExtraProps = { + reactNativePackageName: 'MOCKED_NAME', + reactNativeMetroConfigName: 'MOCKED_CONFIG', + }; + jest.mocked(doResolve).mockReturnValueOnce('MOCKED_PATH'); + // WHEN + await taskStart.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }); + // THEN + expect(startReactNative).toHaveBeenCalledWith({ + waitForBundler: false, + customCliPath: 'MOCKED_PATH/local-cli/cli.js', + metroConfigName: 'MOCKED_CONFIG', + }); + }); + + it('Execute task.rnv.start in hosted mode', async () => { + // GIVEN + const ctx = getContext(); + ctx.platform = 'tvos'; + ctx.program.opts().hosted = true; + // WHEN // THEN + await expect( + taskStart.fn?.({ + ctx, + taskName: 'MOCK_taskName', + originTaskName: 'MOCK_originTaskName', + parentTaskName: 'MOCK_parentTaskName', + shouldSkip: false, + }) + ).rejects.toBe('This platform does not support hosted mode'); + }); +}); diff --git a/packages/sdk-react-native/src/tasks/taskStart.ts b/packages/sdk-react-native/src/tasks/taskStart.ts new file mode 100644 index 0000000000..46711a9be4 --- /dev/null +++ b/packages/sdk-react-native/src/tasks/taskStart.ts @@ -0,0 +1,31 @@ +import { createTask, RnvTaskName, RnvTaskOptionPresets, doResolve } from '@rnv/core'; +import { startReactNative } from '../metroRunner'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Starts react-native bundler', + dependsOn: [RnvTaskName.configureSoft], + //TODO: implement dependsOnTrigger + // dependsOnTrigger: ({ parentTaskName }) => !parentTaskName, + fn: async ({ ctx, parentTaskName }) => { + const { hosted } = ctx.program.opts(); + if (hosted) { + return Promise.reject('This platform does not support hosted mode'); + } + // Disable reset for other commands (ie. cleaning platforms) + ctx.runtime.disableReset = true; + let customCliPath: string | undefined; + let metroConfigName: string | undefined; + const { reactNativePackageName, reactNativeMetroConfigName } = ctx.runtime?.runtimeExtraProps || {}; + if (reactNativePackageName) { + customCliPath = `${doResolve(reactNativePackageName)}/local-cli/cli.js`; + } + if (reactNativeMetroConfigName) { + metroConfigName = reactNativeMetroConfigName; + } + return startReactNative({ waitForBundler: !parentTaskName, customCliPath, metroConfigName }); + }, + task: RnvTaskName.start, + options: RnvTaskOptionPresets.withConfigure(), + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-telemetry/LICENSE b/packages/sdk-telemetry/LICENSE new file mode 100644 index 0000000000..9994b5bb3f --- /dev/null +++ b/packages/sdk-telemetry/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 - present, Flexn BV + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/sdk-telemetry/README.md b/packages/sdk-telemetry/README.md new file mode 100644 index 0000000000..15436521a6 --- /dev/null +++ b/packages/sdk-telemetry/README.md @@ -0,0 +1,2 @@ +# @rnv/sdk-telemetry + diff --git a/packages/sdk-telemetry/package.json b/packages/sdk-telemetry/package.json new file mode 100644 index 0000000000..94d4af2569 --- /dev/null +++ b/packages/sdk-telemetry/package.json @@ -0,0 +1,44 @@ +{ + "name": "@rnv/sdk-telemetry", + "version": "1.0.0-rc.12", + "description": "ReNative Telemetry SDK", + "keywords": [], + "homepage": "https://github.com/flexn-io/renative#readme", + "bugs": { + "url": "https://github.com/flexn-io/renative/issues" + }, + "license": "MIT", + "author": "Pavel Jacko (https://github.com/pavjacko)", + "files": [ + "LICENSE", + "lib", + "types.d.ts" + ], + "main": "lib/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/flexn-io/renative.git" + }, + "scripts": { + "bootstrap": "yarn && yarn build && npm link", + "build": "yarn clean && yarn compile", + "clean": "rimraf -I ./lib && rimraf -I tsconfig.tsbuildinfo", + "compile": "tsc -b tsconfig.json", + "compile:prod": "tsc -b tsconfig.json", + "lint": "eslint . --ext .ts", + "watch": "tsc --watch --preserveWatchOutput" + }, + "dependencies": { + "@rnv/sdk-utils": "1.0.0-rc.12", + "@sentry/integrations": "7.57.0", + "@sentry/node": "7.57.0", + "node-machine-id": "^1.1.12" + }, + "peerDependencies": { + "@rnv/core": "^1.0.0-rc.12" + }, + "private": false, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/sdk-telemetry/src/constants.ts b/packages/sdk-telemetry/src/constants.ts new file mode 100644 index 0000000000..b07b7841dc --- /dev/null +++ b/packages/sdk-telemetry/src/constants.ts @@ -0,0 +1,3 @@ +export const REDASH_URL = 'https://analytics.prod.api.flexn.io/rnv'; +export const REDASH_KEY = '471577f3b856fb6348ae913ceb32545c'; +export const SENTRY_ENDPOINT = 'https://004caee3caa04c81a10f2ba31a945362@sentry.io/1795473'; diff --git a/packages/rnv/src/analytics/index.ts b/packages/sdk-telemetry/src/index.ts similarity index 90% rename from packages/rnv/src/analytics/index.ts rename to packages/sdk-telemetry/src/index.ts index 5cdb869d22..0aebeb5c06 100644 --- a/packages/rnv/src/analytics/index.ts +++ b/packages/sdk-telemetry/src/index.ts @@ -6,8 +6,8 @@ import path from 'path'; import { RnvPlatform, getContext, logRaw } from '@rnv/core'; //@ts-ignore -import pkg from '../../package.json'; -import { REDASH_KEY, REDASH_URL, SENTRY_ENDPOINT } from '../constants'; +import pkg from '../package.json'; +import { REDASH_KEY, REDASH_URL, SENTRY_ENDPOINT } from './constants'; // deal with useless duplicate errors on sentry because of different error texts const sanitizeError = (err: string) => { @@ -28,6 +28,7 @@ class Redash { const defaultProps = { fingerprint: machineIdSync(), os: os.platform(), + //TODO: this points to telemetry version. migrate to universal RNV version (@rnv/core) rnvVersion: pkg.version, }; return axios @@ -55,7 +56,7 @@ export class AnalyticsCls { get isAnalyticsEnabled() { const c = getContext(); - return !c.files.defaultWorkspace.config?.disableTelemetry && c.process.env.RNV_TELEMETRY_DISABLED !== '1'; + return !c.files.dotRnv?.config?.disableTelemetry && c.process.env.RNV_TELEMETRY_DISABLED !== '1'; } initialize() { @@ -103,7 +104,7 @@ export class AnalyticsCls { scope.setTags({ ...tags, os: os.platform() }); scope.setExtras({ ...extra, fingerprint: machineIdSync() }); const c = getContext(); - if (c.program.telemetryDebug) { + if (c.program.opts().telemetryDebug) { logRaw(`TELEMETRY EXCEPTION PAYLOAD: ${e} `); @@ -121,7 +122,7 @@ export class AnalyticsCls { async captureEvent(e: { type: string; platform?: RnvPlatform; template?: string; platforms?: Array }) { const c = getContext(); if (this.isAnalyticsEnabled && this.knowItAll) { - if (c.program.telemetryDebug) { + if (c.program.opts().telemetryDebug) { logRaw(`TELEMETRY EVENT PAYLOAD: ${JSON.stringify(e, null, 2)} `); @@ -146,6 +147,6 @@ ${JSON.stringify(e, null, 2)} } } -const Analytics = new AnalyticsCls(); +const Telemetry = new AnalyticsCls(); -export { Analytics }; +export { Telemetry }; diff --git a/packages/sdk-telemetry/src/types.ts b/packages/sdk-telemetry/src/types.ts new file mode 100644 index 0000000000..298a0923f9 --- /dev/null +++ b/packages/sdk-telemetry/src/types.ts @@ -0,0 +1,12 @@ +export type TizenDevice = { + name: string; + type: string; + id: string; + deviceType: string; +}; + +export type TizenSecurityConfig = { + profileName: string; + certPath: string; + certPassword: string; +}; diff --git a/packages/sdk-telemetry/tsconfig.json b/packages/sdk-telemetry/tsconfig.json new file mode 100644 index 0000000000..bc57e8fcd2 --- /dev/null +++ b/packages/sdk-telemetry/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@flexn/typescript-config/tsconfig.lib.node.json", + "compilerOptions": { + "outDir": "./lib", + "rootDir": "./src", + "resolveJsonModule": false, + "lib": ["ES2021.String"] + }, + "include": ["./src/**/*", "./src/**/*.json", "./types.d.ts", "./package.json"], + "exclude": ["node_modules", "./src/**/*.test.ts"] +} diff --git a/packages/sdk-telemetry/types.d.ts b/packages/sdk-telemetry/types.d.ts new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/packages/sdk-telemetry/types.d.ts @@ -0,0 +1 @@ + diff --git a/packages/sdk-tizen/.gitignore b/packages/sdk-tizen/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/sdk-tizen/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/sdk-tizen/src/constants.ts b/packages/sdk-tizen/src/constants.ts index a1cea8867b..b23d504690 100644 --- a/packages/sdk-tizen/src/constants.ts +++ b/packages/sdk-tizen/src/constants.ts @@ -1,3 +1,7 @@ +import { RnvPlatformKey } from '@rnv/core'; + export const CLI_TIZEN_EMULATOR = 'tizenEmulator'; export const CLI_TIZEN = 'tizen'; export const CLI_SDB_TIZEN = 'tizenSdb'; + +export const SdkPlatforms: Array = ['tizen', 'tizenwatch', 'tizenmobile']; diff --git a/packages/sdk-tizen/src/deviceManager.ts b/packages/sdk-tizen/src/deviceManager.ts index de42626865..ed82e01615 100644 --- a/packages/sdk-tizen/src/deviceManager.ts +++ b/packages/sdk-tizen/src/deviceManager.ts @@ -18,7 +18,7 @@ import { DEFAULTS, executeAsync, ExecOptionsPresets, - ConfigName, + RnvFileName, getContext, } from '@rnv/core'; import { CLI_SDB_TIZEN, CLI_TIZEN, CLI_TIZEN_EMULATOR } from './constants'; @@ -171,7 +171,7 @@ export const addDevelopTizenCertificate = (c: RnvContext, secureProfileConfig: T }); const _getDeviceID = async (c: RnvContext, target: string) => { - const { device } = c.program; + const { device } = c.program.opts(); if (device) { let connectResponse: string; @@ -215,7 +215,7 @@ const _getDeviceID = async (c: RnvContext, target: string) => { }; const _getRunningDevices = async (c: RnvContext) => { - const { platform } = c.program; + const { platform } = c.program.opts(); const devicesList = await execCLI(CLI_SDB_TIZEN, 'devices'); const lines = devicesList .trim() @@ -350,7 +350,7 @@ export const runTizenSimOrDevice = async () => { logDebug(err); logError( `Could not find the specified target and could not create the emulator automatically. -Please create one and then edit the default target from ${c.paths.workspace.dir}/${ConfigName.renative}` +Please create one and then edit the default target from ${c.paths.workspace.dir}/${RnvFileName.renative}` ); } } diff --git a/packages/sdk-tizen/src/getContext.ts b/packages/sdk-tizen/src/getContext.ts new file mode 100644 index 0000000000..1ca1bdf3e8 --- /dev/null +++ b/packages/sdk-tizen/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from './'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/sdk-tizen/src/index.ts b/packages/sdk-tizen/src/index.ts index df58857356..f613913b09 100644 --- a/packages/sdk-tizen/src/index.ts +++ b/packages/sdk-tizen/src/index.ts @@ -2,3 +2,16 @@ export * from './deviceManager'; export * from './installer'; export * from './runner'; export * from './constants'; + +import taskTargetLaunch from './tasks/taskTargetLaunch'; +import taskTargetList from './tasks/taskTargetList'; +import taskSdkConfigure from './tasks/taskSdkConfigure'; +import { GetContextType, createRnvSDK } from '@rnv/core'; + +export const Tasks = [taskTargetLaunch, taskTargetList, taskSdkConfigure]; + +const Sdk = createRnvSDK({ + tasks: Tasks, +}); + +export type GetContext = GetContextType; diff --git a/packages/sdk-tizen/src/installer.ts b/packages/sdk-tizen/src/installer.ts index c4e014cef2..38abcd2fd7 100644 --- a/packages/sdk-tizen/src/installer.ts +++ b/packages/sdk-tizen/src/installer.ts @@ -1,6 +1,5 @@ import path from 'path'; import { - USER_HOME_DIR, isSystemWin, getRealPath, writeFileSync, @@ -18,11 +17,15 @@ import { } from '@rnv/core'; import { CLI_SDB_TIZEN, CLI_TIZEN, CLI_TIZEN_EMULATOR } from './constants'; -const SDK_LOCATIONS = [ - path.join('usr/local/tizen-studio'), - path.join(USER_HOME_DIR, 'tizen-studio'), - path.join('C:\\tizen-studio'), -]; +const getSdkLocations = () => { + const ctx = getContext(); + const sdkLocations = [ + path.join('usr/local/tizen-studio'), + path.join(ctx.paths.user.homeDir, 'tizen-studio'), + path.join('C:\\tizen-studio'), + ]; + return sdkLocations; +}; const _logSdkWarning = (c: RnvContext) => { logWarning(`Your ${c.paths.workspace.config} is missing SDK configuration object`); @@ -60,17 +63,17 @@ const _attemptAutoFix = async (c: RnvContext) => { if (!c.files.workspace.config) return; - if (c.program.hosted) { + if (c.program.opts().hosted) { logInfo('HOSTED Mode. Skipping SDK checks'); return true; } - const result = SDK_LOCATIONS.find((v) => fsExistsSync(v)); + const result = getSdkLocations().find((v) => fsExistsSync(v)); if (result) { logSuccess(`Found existing ${c.platform} SDK location at ${chalk().bold(result)}`); let confirmSdk = true; - if (!c.program.ci) { + if (!c.program.opts().ci) { const { confirm } = await inquirerPrompt({ type: 'confirm', name: 'confirm', @@ -95,7 +98,7 @@ const _attemptAutoFix = async (c: RnvContext) => { } } - logDefault(`_attemptAutoFix: no sdks found. searched at: ${SDK_LOCATIONS.join(', ')}`); + logDefault(`_attemptAutoFix: no sdks found. searched at: ${getSdkLocations().join(', ')}`); // const setupInstance = PlatformSetup(c); // await setupInstance.askToInstallSDK(sdkPlatform); @@ -109,19 +112,11 @@ export const checkTizenSdk = async () => { logDefault('checkTizenSdk'); if (!_isSdkInstalled(c)) { logWarning( - `${c.platform} requires SDK to be installed. Your SDK path in ${chalk().bold( + `${c.platform} platform requires Tizen SDK to be installed. Your SDK path in ${chalk().bold( c.paths.workspace.config )} does not exist: ${chalk().bold(_getCurrentSdkPath(c))}` ); - - switch (c.platform) { - case 'tizen': - case 'tizenmobile': - case 'tizenwatch': - return _attemptAutoFix(c); - default: - return true; - } + return _attemptAutoFix(c); } return true; }; diff --git a/packages/sdk-tizen/src/runner.ts b/packages/sdk-tizen/src/runner.ts index cc962d76a8..29bcc769c7 100644 --- a/packages/sdk-tizen/src/runner.ts +++ b/packages/sdk-tizen/src/runner.ts @@ -111,7 +111,7 @@ const _copyRequiredFiles = () => { export const runTizen = async (c: RnvContext, target?: string) => { logDefault('runTizen', `target:${target}`); const { platform } = c; - const { hosted } = c.program; + const { hosted } = c.program.opts(); if (!platform) return; @@ -174,7 +174,7 @@ export const buildTizenProject = async () => { await buildCoreWebpackProject(); - if (!c.program.hosted) { + if (!c.program.opts().hosted) { _copyRequiredFiles(); const tOut = path.join(tDir, 'output'); const tIntermediate = path.join(tDir, 'intermediate'); @@ -201,7 +201,7 @@ export const configureTizenProject = async () => { return; } - if (!_isGlobalConfigured && !c.program.hosted) { + if (!_isGlobalConfigured && !c.program.opts().hosted) { _isGlobalConfigured = true; await configureTizenGlobal(); } diff --git a/packages/sdk-tizen/src/tasks/taskSdkConfigure.ts b/packages/sdk-tizen/src/tasks/taskSdkConfigure.ts new file mode 100644 index 0000000000..bb1c96c19e --- /dev/null +++ b/packages/sdk-tizen/src/tasks/taskSdkConfigure.ts @@ -0,0 +1,14 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { checkAndConfigureTizenSdks, checkTizenSdk } from '../installer'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Configures sdks', + isPrivate: true, + fn: async () => { + await checkAndConfigureTizenSdks(); + await checkTizenSdk(); + }, + task: RnvTaskName.sdkConfigure, + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-tizen/src/tasks/taskTargetLaunch.ts b/packages/sdk-tizen/src/tasks/taskTargetLaunch.ts new file mode 100644 index 0000000000..b4bcf2f318 --- /dev/null +++ b/packages/sdk-tizen/src/tasks/taskTargetLaunch.ts @@ -0,0 +1,20 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { getTargetWithOptionalPrompt } from '@rnv/sdk-utils'; +import { checkAndConfigureTizenSdks, checkTizenSdk } from '../installer'; +import { launchTizenSimulator } from '../deviceManager'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Launch specific target', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + await checkAndConfigureTizenSdks(); + const target = await getTargetWithOptionalPrompt(); + await checkTizenSdk(); + return launchTizenSimulator(target); + }, + task: RnvTaskName.targetLaunch, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-tizen/src/tasks/taskTargetList.ts b/packages/sdk-tizen/src/tasks/taskTargetList.ts new file mode 100644 index 0000000000..697a5777a7 --- /dev/null +++ b/packages/sdk-tizen/src/tasks/taskTargetList.ts @@ -0,0 +1,18 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { checkAndConfigureTizenSdks, checkTizenSdk } from '../installer'; +import { listTizenTargets } from '../deviceManager'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'List all available targets for specific platform', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + await checkAndConfigureTizenSdks(); + await checkTizenSdk(); + return listTizenTargets(); + }, + task: RnvTaskName.targetList, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-utils/.gitignore b/packages/sdk-utils/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/sdk-utils/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/sdk-utils/package.json b/packages/sdk-utils/package.json index 26ba3d8e09..eabde32873 100644 --- a/packages/sdk-utils/package.json +++ b/packages/sdk-utils/package.json @@ -12,6 +12,7 @@ "files": [ "LICENSE", "lib", + "templateFiles", "types.d.ts" ], "main": "lib/index.js", @@ -33,7 +34,8 @@ "color-string": "1.9.0", "detect-port": "1.3.0", "ip": "2.0.1", - "kill-port": "1.6.1" + "kill-port": "1.6.1", + "axios": "1.6.0" }, "peerDependencies": { "@rnv/core": "^1.0.0-rc.12" diff --git a/packages/sdk-utils/src/axiosUtils.ts b/packages/sdk-utils/src/axiosUtils.ts new file mode 100644 index 0000000000..ee67dcee19 --- /dev/null +++ b/packages/sdk-utils/src/axiosUtils.ts @@ -0,0 +1,3 @@ +import axios from 'axios'; + +export { axios }; diff --git a/packages/sdk-utils/src/constants.ts b/packages/sdk-utils/src/constants.ts new file mode 100644 index 0000000000..dcfe070635 --- /dev/null +++ b/packages/sdk-utils/src/constants.ts @@ -0,0 +1,3 @@ +import { RnvPlatformKey } from '@rnv/core'; + +export const REMOTE_DEBUGGER_ENABLED_PLATFORMS: RnvPlatformKey[] = ['tizen', 'tizenmobile', 'tizenwatch']; diff --git a/packages/sdk-utils/src/fonts.ts b/packages/sdk-utils/src/fonts.ts new file mode 100644 index 0000000000..8e7478d4af --- /dev/null +++ b/packages/sdk-utils/src/fonts.ts @@ -0,0 +1,89 @@ +import { + chalk, + fsExistsSync, + fsReadFileSync, + fsWriteFileSync, + getConfigProp, + getContext, + logDebug, + logWarning, + parseFonts, +} from '@rnv/core'; +import { copyFileSync, mkdirSync } from 'fs'; +import path from 'path'; + +export const configureFonts = async () => { + const c = getContext(); + + // FONTS + let fontsObj = 'export default ['; + + const duplicateFontCheck: Array = []; + parseFonts((font, dir) => { + if (font.includes('.ttf') || font.includes('.otf') || font.includes('.woff')) { + const keOriginal = font.split('.')[0]; + const keyNormalised = keOriginal.replace(/__/g, ' '); + const includedFonts = getConfigProp('includedFonts'); + if (includedFonts) { + if ( + includedFonts.includes('*') || + includedFonts.includes(keOriginal) || + includedFonts.includes(keyNormalised) + ) { + if (font && !duplicateFontCheck.includes(font)) { + duplicateFontCheck.push(font); + const fontSource = path.join(dir, font).replace(/\\/g, '\\\\'); + if (fsExistsSync(fontSource)) { + // const fontFolder = path.join(appFolder, 'app/src/main/assets/fonts'); + // mkdirSync(fontFolder); + // const fontDest = path.join(fontFolder, font); + // copyFileSync(fontSource, fontDest); + fontsObj += `{ + fontFamily: '${keyNormalised}', + file: require('${fontSource}'), + },`; + } else { + logWarning(`Font ${chalk().bold(fontSource)} doesn't exist! Skipping.`); + } + } + } + } + } + }); + + fontsObj += '];'; + if (!fsExistsSync(c.paths.project.assets.dir)) { + mkdirSync(c.paths.project.assets.dir); + } + if (!fsExistsSync(c.paths.project.assets.runtimeDir)) { + mkdirSync(c.paths.project.assets.runtimeDir); + } + const fontJsPath = path.join(c.paths.project.assets.dir, 'runtime', 'fonts.web.js'); + if (fsExistsSync(fontJsPath)) { + const existingFileContents = fsReadFileSync(fontJsPath).toString(); + + if (existingFileContents !== fontsObj) { + logDebug('newFontsJsFile'); + fsWriteFileSync(fontJsPath, fontsObj); + } + } else { + logDebug('newFontsJsFile'); + fsWriteFileSync(fontJsPath, fontsObj); + } + + const templateFiles = path.resolve(__dirname, '..', 'templateFiles'); + copyFileSync( + path.resolve(templateFiles, 'fontManager.js'), + path.resolve(c.paths.project.assets.dir, 'runtime', 'fontManager.js') + ); + copyFileSync( + path.resolve(templateFiles, 'fontManager.js'), + path.resolve(c.paths.project.assets.dir, 'runtime', 'fontManager.server.web.js') + ); + copyFileSync( + path.resolve(templateFiles, 'fontManager.web.js'), + path.resolve(c.paths.project.assets.dir, 'runtime', 'fontManager.web.js') + ); + + return true; +}; diff --git a/packages/sdk-utils/src/getConfigProps.ts b/packages/sdk-utils/src/getConfigProps.ts new file mode 100644 index 0000000000..22f696c90a --- /dev/null +++ b/packages/sdk-utils/src/getConfigProps.ts @@ -0,0 +1,169 @@ +import { getAppConfigBuildsFolder, logWarning, RnvPlatform, getConfigProp, fsExistsSync, getContext } from '@rnv/core'; +import path from 'path'; + +export const getBuildFilePath = (filePath: string, altTemplateFolder?: string) => { + const c = getContext(); + // P1 => platformTemplates + let sp = path.join(altTemplateFolder || getAppTemplateFolder()!, filePath); + // P2 => appConfigs/base + @buildSchemes + const sp2bf = getAppConfigBuildsFolder(c.paths.project.appConfigBase.dir); + if (sp2bf) { + const sp2 = path.join(sp2bf, filePath); + if (fsExistsSync(sp2)) sp = sp2; + } + + // P3 => appConfigs + @buildSchemes + const sp3bf = getAppConfigBuildsFolder(); + + if (sp3bf) { + const sp3 = path.join(sp3bf, filePath); + if (fsExistsSync(sp3)) sp = sp3; + } + + return sp; +}; + +export const getAppId = () => { + const id = getConfigProp('id'); + const idSuffix = getConfigProp('idSuffix'); + return idSuffix ? `${id}${idSuffix}` : id; +}; + +export const getAppTitle = () => getConfigProp('title'); + +export const getAppAuthor = () => getConfigProp('author') || getContext().files.project.package?.author; + +export const getAppLicense = () => getConfigProp('license') || getContext().files.project.package?.license; + +export const getEntryFile = () => { + const c = getContext(); + return c.platform ? c.buildConfig.platforms?.[c.platform]?.entryFile : undefined; +}; + +export const getGetJsBundleFile = () => getConfigProp('getJsBundleFile'); + +export const getAppDescription = () => getConfigProp('description') || getContext().files.project.package?.description; + +export const getAppVersion = () => { + const version = getConfigProp('version') || getContext().files.project.package?.version; + if (!version) { + logWarning('You are missing version prop in your config. will default to 0'); + return '0'; + } + const versionFormat = getConfigProp('versionFormat'); + if (!versionFormat) return version; + const versionCodeArr = versionFormat.split('.'); + const dotLength = versionCodeArr.length; + const isNumArr = versionCodeArr.map((v: string) => !Number.isNaN(Number(v))); + + const verArr: Array = []; + let i = 0; + version.split('.').map((v: string) => + v.split('-').map((v2) => + v2.split('+').forEach((v3) => { + const isNum = !Number.isNaN(Number(v3)); + if (isNumArr[i] && isNum) { + verArr.push(v3); + } else if (!isNumArr[i]) { + verArr.push(v3); + } + + i++; + }) + ) + ); + if (verArr.length > dotLength) { + verArr.length = dotLength; + } + + const output = verArr.join('.'); + // console.log(`IN: ${version}\nOUT: ${output}`); + return output; +}; + +const _androidLikePlatform = (platform: RnvPlatform) => + ['android', 'androidtv', 'firetv', 'androidwear'].includes(platform!); + +/** + * Retrieves the version code for the specified platform from the configuration. + * If the platform is Android, the version code must be a positive integer. + * If the version code is not found or is invalid, it falls back to a default value of '0'. + * Otherwise version code is generated based on the version and version code format specified in the configuration. + * + * @param c - The RnvContext object. + * @param platform - The RnvPlatform object. + * @returns The version code as a string. + * @throws An error if the version code is not a positive integer for Android platforms. + */ +export const getAppVersionCode = () => { + const c = getContext(); + const versionCode = getConfigProp('versionCode'); + + if (versionCode) { + // android platforms don't allow versionCode to be a string, only positive integer + if (_androidLikePlatform(c.platform)) { + const isValidVersionCode = Number.isInteger(Number(versionCode)) && Number(versionCode) > 0; + if (!isValidVersionCode) { + throw new Error(`'versionCode' should be a positive integer. Check your config`); + } + } + return versionCode; + } + + const version = getConfigProp('version') || c.files.project.package?.version; + if (!version || typeof version !== 'string') { + logWarning('You are missing version prop in your config. will default to 0'); + return '0'; + } + const versionCodeFormat = getConfigProp('versionCodeFormat') || '00.00.00'; + const vFormatArr = versionCodeFormat.split('.').map((v: string) => v.length); + const versionCodeMaxCount = vFormatArr.length; + const verArr = []; + + version.split('.').map((v) => + v.split('-').map((v2) => + v2.split('+').forEach((v3) => { + const asNumber = Number(v3); + if (!Number.isNaN(asNumber)) { + let val = v3; + const maxDigits = vFormatArr[verArr.length] || 2; + + if (v3.length > maxDigits) { + val = v3.substr(0, maxDigits); + } else if (v3.length < maxDigits) { + let toAdd = maxDigits - v3.length; + val = v3; + while (toAdd > 0) { + val = `0${val}`; + toAdd--; + } + } + verArr.push(val); + } + }) + ) + ); + let verCountDiff = verArr.length - versionCodeMaxCount; + if (verCountDiff < 0) { + while (verCountDiff < 0) { + let extraVersionLen = vFormatArr[versionCodeMaxCount + verCountDiff]; + let num = ''; + while (extraVersionLen) { + num += '0'; + extraVersionLen--; + } + verArr.push(num); + verCountDiff++; + } + } + + const output = Number(verArr.join('')).toString(); + // console.log(`IN: ${version}\nOUT: ${output}`); + return output; +}; + +export const getAppTemplateFolder = () => { + const c = getContext(); + const { platform } = c; + return platform ? path.join(c.paths.project.platformTemplatesDirs[platform], `${platform}`) : undefined; +}; diff --git a/packages/sdk-utils/src/index.ts b/packages/sdk-utils/src/index.ts index 833b5c77f8..186e716a06 100644 --- a/packages/sdk-utils/src/index.ts +++ b/packages/sdk-utils/src/index.ts @@ -1,340 +1,7 @@ -import { - OverridesOptions, - chalk, - getAppConfigBuildsFolder, - inquirerPrompt, - logWarning, - DEFAULTS, - RnvPlatform, - getConfigProp, - logDefault, - fsExistsSync, - PlatformKey, - getContext, -} from '@rnv/core'; -import axios from 'axios'; -import open from 'better-opn'; -import detectPort from 'detect-port'; -import killPort from 'kill-port'; -import path from 'path'; -import ip from 'ip'; -import colorString from 'color-string'; - -export const REMOTE_DEBUGGER_ENABLED_PLATFORMS: PlatformKey[] = ['tizen', 'tizenmobile', 'tizenwatch']; - -export const getValidLocalhost = (value: string, localhost: string) => { - if (!value) return localhost; - switch (value) { - case 'localhost': - case '0.0.0.0': - case '127.0.0.1': - return localhost; - default: - return value; - } -}; - -export const openBrowser = open; - -export const getDevServerHost = () => { - const c = getContext(); - const devServerHostOrig = getConfigProp('devServerHost'); - - const devServerHostFixed = devServerHostOrig - ? getValidLocalhost(devServerHostOrig, c.runtime.localhost || DEFAULTS.devServerHost) - : DEFAULTS.devServerHost; - - return devServerHostFixed; -}; - -export const waitForHost = async (suffix = 'assets/bundle.js') => { - const c = getContext(); - logDefault('waitForHost', `port:${c.runtime.port}`); - let attempts = 0; - const maxAttempts = 10; - const CHECK_INTEVAL = 2000; - // const spinner = ora('Waiting for webpack to finish...').start(); - - const devServerHost = getDevServerHost(); - const url = `http://${devServerHost}:${c.runtime.port}/${suffix}`; - - return new Promise((resolve, reject) => { - const interval = setInterval(() => { - axios - .get(url) - .then((res) => { - if (res.status === 200) { - clearInterval(interval); - // spinner.succeed(); - return resolve(true); - } - attempts++; - if (attempts === maxAttempts) { - clearInterval(interval); - // spinner.fail('Can\'t connect to webpack. Try restarting it.'); - return reject(`Can't connect to host ${url}. Try restarting it.`); - } - }) - .catch(() => { - attempts++; - if (attempts > maxAttempts) { - clearInterval(interval); - // spinner.fail('Can\'t connect to webpack. Try restarting it.'); - return reject(`Can't connect to host ${url}. Try restarting it.`); - } - }); - }, CHECK_INTEVAL); - }); -}; - -export const checkPortInUse = (port: number) => - new Promise((resolve, reject) => { - if (port === undefined || port === null) { - resolve(false); - return; - } - detectPort(port, (err: string, availablePort: string) => { - if (err) { - reject(err); - return; - } - const result = port !== parseInt(availablePort, 10); - resolve(result); - }); - }); - -export const getBuildFilePath = (filePath: string, altTemplateFolder?: string) => { - const c = getContext(); - // P1 => platformTemplates - let sp = path.join(altTemplateFolder || getAppTemplateFolder()!, filePath); - // P2 => appConfigs/base + @buildSchemes - const sp2bf = getAppConfigBuildsFolder(c.paths.project.appConfigBase.dir); - if (sp2bf) { - const sp2 = path.join(sp2bf, filePath); - if (fsExistsSync(sp2)) sp = sp2; - } - - // P3 => appConfigs + @buildSchemes - const sp3bf = getAppConfigBuildsFolder(); - - if (sp3bf) { - const sp3 = path.join(sp3bf, filePath); - if (fsExistsSync(sp3)) sp = sp3; - } - - return sp; -}; - -export const getAppId = () => { - const id = getConfigProp('id'); - const idSuffix = getConfigProp('idSuffix'); - return idSuffix ? `${id}${idSuffix}` : id; -}; - -export const getAppTitle = () => getConfigProp('title'); - -export const getAppAuthor = () => getConfigProp('author') || getContext().files.project.package?.author; - -export const getAppLicense = () => getConfigProp('license') || getContext().files.project.package?.license; - -export const getEntryFile = () => { - const c = getContext(); - return c.platform ? c.buildConfig.platforms?.[c.platform]?.entryFile : undefined; -}; - -export const getGetJsBundleFile = () => getConfigProp('getJsBundleFile'); - -export const getAppDescription = () => getConfigProp('description') || getContext().files.project.package?.description; - -export const getAppVersion = () => { - const version = getConfigProp('version') || getContext().files.project.package?.version; - if (!version) { - logWarning('You are missing version prop in your config. will default to 0'); - return '0'; - } - const versionFormat = getConfigProp('versionFormat'); - if (!versionFormat) return version; - const versionCodeArr = versionFormat.split('.'); - const dotLength = versionCodeArr.length; - const isNumArr = versionCodeArr.map((v: string) => !Number.isNaN(Number(v))); - - const verArr: Array = []; - let i = 0; - version.split('.').map((v: string) => - v.split('-').map((v2) => - v2.split('+').forEach((v3) => { - const isNum = !Number.isNaN(Number(v3)); - if (isNumArr[i] && isNum) { - verArr.push(v3); - } else if (!isNumArr[i]) { - verArr.push(v3); - } - - i++; - }) - ) - ); - if (verArr.length > dotLength) { - verArr.length = dotLength; - } - - const output = verArr.join('.'); - // console.log(`IN: ${version}\nOUT: ${output}`); - return output; -}; - -const _androidLikePlatform = (platform: RnvPlatform) => - ['android', 'androidtv', 'firetv', 'androidwear'].includes(platform!); - -/** - * Retrieves the version code for the specified platform from the configuration. - * If the platform is Android, the version code must be a positive integer. - * If the version code is not found or is invalid, it falls back to a default value of '0'. - * Otherwise version code is generated based on the version and version code format specified in the configuration. - * - * @param c - The RnvContext object. - * @param platform - The RnvPlatform object. - * @returns The version code as a string. - * @throws An error if the version code is not a positive integer for Android platforms. - */ -export const getAppVersionCode = () => { - const c = getContext(); - const versionCode = getConfigProp('versionCode'); - - if (versionCode) { - // android platforms don't allow versionCode to be a string, only positive integer - if (_androidLikePlatform(c.platform)) { - const isValidVersionCode = Number.isInteger(Number(versionCode)) && Number(versionCode) > 0; - if (!isValidVersionCode) { - throw new Error(`'versionCode' should be a positive integer. Check your config`); - } - } - return versionCode; - } - - const version = getConfigProp('version') || c.files.project.package?.version; - if (!version || typeof version !== 'string') { - logWarning('You are missing version prop in your config. will default to 0'); - return '0'; - } - const versionCodeFormat = getConfigProp('versionCodeFormat') || '00.00.00'; - const vFormatArr = versionCodeFormat.split('.').map((v: string) => v.length); - const versionCodeMaxCount = vFormatArr.length; - const verArr = []; - - version.split('.').map((v) => - v.split('-').map((v2) => - v2.split('+').forEach((v3) => { - const asNumber = Number(v3); - if (!Number.isNaN(asNumber)) { - let val = v3; - const maxDigits = vFormatArr[verArr.length] || 2; - - if (v3.length > maxDigits) { - val = v3.substr(0, maxDigits); - } else if (v3.length < maxDigits) { - let toAdd = maxDigits - v3.length; - val = v3; - while (toAdd > 0) { - val = `0${val}`; - toAdd--; - } - } - verArr.push(val); - } - }) - ) - ); - let verCountDiff = verArr.length - versionCodeMaxCount; - if (verCountDiff < 0) { - while (verCountDiff < 0) { - let extraVersionLen = vFormatArr[versionCodeMaxCount + verCountDiff]; - let num = ''; - while (extraVersionLen) { - num += '0'; - extraVersionLen--; - } - verArr.push(num); - verCountDiff++; - } - } - - const output = Number(verArr.join('')).toString(); - // console.log(`IN: ${version}\nOUT: ${output}`); - return output; -}; - -export const confirmActiveBundler = async () => { - const c = getContext(); - if (c.runtime.skipActiveServerCheck) return true; - - if (c.program.ci) { - //TODO: handle return codes properly - await killPort(c.runtime.port); - return true; - } - - const choices = ['Restart the server (recommended)', 'Use existing session']; - - const { selectedOption } = await inquirerPrompt({ - name: 'selectedOption', - type: 'list', - choices, - warningMessage: `Another ${c.platform} server at port ${chalk().bold(c.runtime.port)} already running`, - }); - - if (choices[0] === selectedOption) { - const result = await killPort(c.runtime.port); - console.log('WTFFF', result); - } else { - return false; - } - return true; -}; - -export const getIP = () => ip.address(); - -export const getAppTemplateFolder = () => { - const c = getContext(); - const { platform } = c; - return platform ? path.join(c.paths.project.platformTemplatesDirs[platform], `${platform}`) : undefined; -}; - -export const addSystemInjects = (injects: OverridesOptions) => { - const c = getContext(); - if (!c.systemPropsInjects) c.systemPropsInjects = []; - if (injects) { - injects.forEach((item) => { - c.systemPropsInjects.push(item); - }); - } -}; - -export const sanitizeColor = (val: string | undefined, key: string) => { - if (!val) { - logWarning(`You are missing ${chalk().bold(key)} in your renative config. will use default #FFFFFF instead`); - return { - rgb: [255, 255, 255, 1], - rgbDecimal: [1, 1, 1, 1], - hex: '#FFFFFF', - }; - } - - const rgb = colorString.get.rgb(val); - const hex = colorString.to.hex(rgb); - - return { - rgb, - rgbDecimal: rgb.map((v: number) => (v > 1 ? Math.round((v / 255) * 10) / 10 : v)), - hex, - }; -}; - -export const isUrlLocalhost = (value: string) => { - if (value?.includes) { - if (value.includes('localhost')) return true; - if (value.includes('0.0.0.0')) return true; - if (value.includes('127.0.0.1')) return true; - } - return false; -}; +export * from './constants'; +export * from './fonts'; +export * from './getConfigProps'; +export * from './ipUtils'; +export * from './utils'; +export * from './target'; +export * from './axiosUtils'; diff --git a/packages/sdk-utils/src/ipUtils.ts b/packages/sdk-utils/src/ipUtils.ts new file mode 100644 index 0000000000..c748471e4c --- /dev/null +++ b/packages/sdk-utils/src/ipUtils.ts @@ -0,0 +1,128 @@ +import { DEFAULTS, getConfigProp, logDefault, getContext, inquirerPrompt, chalk } from '@rnv/core'; +import axios from 'axios'; +import open from 'better-opn'; +import detectPort from 'detect-port'; +import killPort from 'kill-port'; +import ip from 'ip'; + +export const confirmActiveBundler = async () => { + const c = getContext(); + if (c.runtime.skipActiveServerCheck) return true; + + if (c.program.opts().ci) { + //TODO: handle return codes properly + await killPort(c.runtime.port); + return true; + } + + const choices = ['Restart the server (recommended)', 'Use existing session']; + + const { selectedOption } = await inquirerPrompt({ + name: 'selectedOption', + type: 'list', + choices, + warningMessage: `Another ${c.platform} server at port ${chalk().bold(c.runtime.port)} already running`, + }); + + if (choices[0] === selectedOption) { + await killPort(c.runtime.port); + } else { + return false; + } + return true; +}; + +export const getValidLocalhost = (value: string, localhost: string) => { + if (!value) return localhost; + switch (value) { + case 'localhost': + case '0.0.0.0': + case '127.0.0.1': + return localhost; + default: + return value; + } +}; + +export const openBrowser = open; + +export const getDevServerHost = () => { + const c = getContext(); + const devServerHostOrig = getConfigProp('devServerHost'); + + const devServerHostFixed = devServerHostOrig + ? getValidLocalhost(devServerHostOrig, c.runtime.localhost || DEFAULTS.devServerHost) + : DEFAULTS.devServerHost; + + return devServerHostFixed; +}; + +export const waitForHost = async ( + suffix = 'assets/bundle.js', + opts?: { maxAttempts: number; checkInterval: number } +) => { + const c = getContext(); + logDefault('waitForHost', `port:${c.runtime.port}`); + let attempts = 0; + const maxAttempts = opts?.maxAttempts || 10; + const CHECK_INTEVAL = opts?.checkInterval || 2000; + // const spinner = ora('Waiting for webpack to finish...').start(); + + const devServerHost = getDevServerHost(); + const url = `http://${devServerHost}:${c.runtime.port}/${suffix}`; + + return new Promise((resolve, reject) => { + const interval = setInterval(() => { + axios + .get(url) + .then((res) => { + if (res.status === 200) { + clearInterval(interval); + // spinner.succeed(); + return resolve(true); + } + attempts++; + if (attempts === maxAttempts) { + clearInterval(interval); + // spinner.fail('Can\'t connect to webpack. Try restarting it.'); + return reject(`Can't connect to host ${url}. Try restarting it.`); + } + }) + .catch(() => { + attempts++; + if (attempts > maxAttempts) { + clearInterval(interval); + // spinner.fail('Can\'t connect to webpack. Try restarting it.'); + return reject(`Can't connect to host ${url}. Try restarting it.`); + } + }); + }, CHECK_INTEVAL); + }); +}; + +export const checkPortInUse = (port: number) => + new Promise((resolve, reject) => { + if (port === undefined || port === null) { + resolve(false); + return; + } + detectPort(port, (err: string, availablePort: string) => { + if (err) { + reject(err); + return; + } + const result = port !== parseInt(availablePort, 10); + resolve(result); + }); + }); + +export const isUrlLocalhost = (value: string) => { + if (value?.includes) { + if (value.includes('localhost')) return true; + if (value.includes('0.0.0.0')) return true; + if (value.includes('127.0.0.1')) return true; + } + return false; +}; + +export const getIP = () => ip.address(); diff --git a/packages/sdk-utils/src/target.ts b/packages/sdk-utils/src/target.ts new file mode 100644 index 0000000000..64974e0302 --- /dev/null +++ b/packages/sdk-utils/src/target.ts @@ -0,0 +1,33 @@ +import { getContext, inquirerPrompt } from '@rnv/core'; + +export const getTargetWithOptionalPrompt = async () => { + const ctx = getContext(); + const { platform, program } = ctx; + let target = program?.opts().target; + const options = []; + + if (platform && !target) { + const projectTarget = ctx.files.project.configLocal?.defaultTargets?.[platform]; + if (projectTarget) { + options.push({ name: `${projectTarget} (project default)`, value: projectTarget }); + } + const workspaceTarget = ctx.files.workspace.config?.defaultTargets?.[platform]; + if (workspaceTarget) { + options.push({ name: `${workspaceTarget} (global default)`, value: workspaceTarget }); + } + + options.push({ name: 'Pick from available targets...', value: true }); + + const { selectedOption } = await inquirerPrompt({ + name: 'selectedOption', + type: 'list', + message: 'Which target to use?', + choices: options, + }); + + if (selectedOption) { + target = selectedOption; + } + } + return target; +}; diff --git a/packages/sdk-utils/src/utils.ts b/packages/sdk-utils/src/utils.ts new file mode 100644 index 0000000000..a303a0e45a --- /dev/null +++ b/packages/sdk-utils/src/utils.ts @@ -0,0 +1,32 @@ +import { OverridesOptions, chalk, logWarning, getContext } from '@rnv/core'; +import colorString from 'color-string'; + +export const addSystemInjects = (injects: OverridesOptions) => { + const c = getContext(); + if (!c.systemPropsInjects) c.systemPropsInjects = []; + if (injects) { + injects.forEach((item) => { + c.systemPropsInjects.push(item); + }); + } +}; + +export const sanitizeColor = (val: string | undefined, key: string) => { + if (!val) { + logWarning(`You are missing ${chalk().bold(key)} in your renative config. will use default #FFFFFF instead`); + return { + rgb: [255, 255, 255, 1], + rgbDecimal: [1, 1, 1, 1], + hex: '#FFFFFF', + }; + } + + const rgb = colorString.get.rgb(val); + const hex = colorString.to.hex(rgb); + + return { + rgb, + rgbDecimal: rgb.map((v: number) => (v > 1 ? Math.round((v / 255) * 10) / 10 : v)), + hex, + }; +}; diff --git a/packages/rnv/coreTemplateFiles/fontManager.js b/packages/sdk-utils/templateFiles/fontManager.js similarity index 100% rename from packages/rnv/coreTemplateFiles/fontManager.js rename to packages/sdk-utils/templateFiles/fontManager.js diff --git a/packages/rnv/coreTemplateFiles/fontManager.web.js b/packages/sdk-utils/templateFiles/fontManager.web.js similarity index 100% rename from packages/rnv/coreTemplateFiles/fontManager.web.js rename to packages/sdk-utils/templateFiles/fontManager.web.js diff --git a/packages/sdk-webos/.gitignore b/packages/sdk-webos/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/sdk-webos/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/sdk-webos/src/constants.ts b/packages/sdk-webos/src/constants.ts index da3e01f222..7d91d28f37 100644 --- a/packages/sdk-webos/src/constants.ts +++ b/packages/sdk-webos/src/constants.ts @@ -1,3 +1,5 @@ +import { RnvPlatformKey } from '@rnv/core'; + export const CLI_WEBOS_ARES = 'webosAres'; export const CLI_WEBOS_ARES_PACKAGE = 'webosAresPackage'; export const CLI_WEBOS_ARES_INSTALL = 'webosAresInstall'; @@ -5,3 +7,5 @@ export const CLI_WEBOS_ARES_LAUNCH = 'webosAresLaunch'; export const CLI_WEBOS_ARES_SETUP_DEVICE = 'webosAresSetup'; export const CLI_WEBOS_ARES_DEVICE_INFO = 'webosAresDeviceInfo'; export const CLI_WEBOS_ARES_NOVACOM = 'webosAresNovacom'; + +export const SdkPlatforms: Array = ['webos']; diff --git a/packages/sdk-webos/src/deviceManager.ts b/packages/sdk-webos/src/deviceManager.ts index c0d918d718..e535deaed5 100644 --- a/packages/sdk-webos/src/deviceManager.ts +++ b/packages/sdk-webos/src/deviceManager.ts @@ -20,7 +20,6 @@ import { ExecOptionsPresets, isSystemLinux, isSystemMac, - logError, logSuccess, getConfigProp, getAppFolder, @@ -59,7 +58,7 @@ export const launchWebOSimulator = async (target: string | boolean) => { } else if (typeof target === 'string' && !availableSimulatorVersions.includes(target)) { logWarning( `Target with name ${chalk().red(target)} does not exist. You can update it here: ${chalk().cyan( - c.paths.GLOBAL_RNV_CONFIG + c.paths.dotRnv.config )}` ); await launchWebOSimulator(true); @@ -138,11 +137,10 @@ const launchAppOnSimulator = async (c: RnvContext, appPath: string) => { const webOS_cli_version_number = semver.coerce(webOS_cli_version); if (!webOS_cli_version_number) { - return logError(`Couldn't find webOS TV CLI. WebOS TV simulator requires webOS TV CLI 1.12 or higher.`, true); + return Promise.reject(`Couldn't find webOS TV CLI. WebOS TV simulator requires webOS TV CLI 1.12 or higher.`); } else if (semver.lt(webOS_cli_version_number, '1.12.0')) { - return logError( - `WebOS TV simulator requires webOS TV CLI 1.12 or higher. You are using webOS TV CLI ${webOS_cli_version_number}.`, - true + return Promise.reject( + `WebOS TV simulator requires webOS TV CLI 1.12 or higher. You are using webOS TV CLI ${webOS_cli_version_number}.` ); } @@ -188,7 +186,7 @@ const installAndLaunchApp = async (target: string, appPath: string, tId: string) // the device from time to time. Running it again works. await execCLI(CLI_WEBOS_ARES_INSTALL, `--device ${target} ${appPath}`); } - // const { hosted } = c.program; + // const { hosted } = c.program.opts(); // const { platform } = c; // const isHosted = hosted || !getConfigProp('bundleAssets'); const toReturn = true; @@ -207,7 +205,8 @@ const buildDeviceChoices = (devices: Array) => value: device.name, })); -export const listWebOSTargets = async (c: RnvContext) => { +export const listWebOSTargets = async () => { + const c = getContext(); const devicesResponse = await execCLI(CLI_WEBOS_ARES_DEVICE_INFO, '-D'); const devices = await parseDevices(c, devicesResponse); @@ -229,7 +228,7 @@ export const listWebOSTargets = async (c: RnvContext) => { export const runWebosSimOrDevice = async () => { const c = getContext(); - const { device } = c.program; + const { device } = c.program.opts(); const platDir = getAppFolder(); if (!platDir) { @@ -302,7 +301,7 @@ export const runWebosSimOrDevice = async () => { const tv = actualDevices[0]; return installAndLaunchApp(tv.name, appPath, tId); } - } else if (!c.program.target) { + } else if (!c.program.opts().target) { // No target specified if (activeDevices.length === 1) { // One device present @@ -325,6 +324,6 @@ export const runWebosSimOrDevice = async () => { } } else { // Target specified, using that - return installAndLaunchApp(c.program.target, appPath, tId); + return installAndLaunchApp(c.program.opts().target, appPath, tId); } }; diff --git a/packages/sdk-webos/src/getContext.ts b/packages/sdk-webos/src/getContext.ts new file mode 100644 index 0000000000..1ca1bdf3e8 --- /dev/null +++ b/packages/sdk-webos/src/getContext.ts @@ -0,0 +1,4 @@ +import { getContext as _getContext } from '@rnv/core'; +import type { GetContext } from './'; +// re-export the original getContext with newly decorated type +export const getContext = _getContext as GetContext; diff --git a/packages/sdk-webos/src/index.ts b/packages/sdk-webos/src/index.ts index df58857356..758cc4fb06 100644 --- a/packages/sdk-webos/src/index.ts +++ b/packages/sdk-webos/src/index.ts @@ -2,3 +2,15 @@ export * from './deviceManager'; export * from './installer'; export * from './runner'; export * from './constants'; +import taskTargetLaunch from './tasks/taskTargetLaunch'; +import taskTargetList from './tasks/taskTargetList'; +import taskSdkConfigure from './tasks/taskSdkConfigure'; +import { GetContextType, createRnvSDK } from '@rnv/core'; + +export const Tasks = [taskTargetLaunch, taskTargetList, taskSdkConfigure]; + +const Sdk = createRnvSDK({ + tasks: Tasks, +}); + +export type GetContext = GetContextType; diff --git a/packages/sdk-webos/src/installer.ts b/packages/sdk-webos/src/installer.ts index 54173b742f..282a24a72b 100644 --- a/packages/sdk-webos/src/installer.ts +++ b/packages/sdk-webos/src/installer.ts @@ -68,7 +68,7 @@ const _isSdkInstalled = (c: RnvContext) => { const _attemptAutoFix = async (c: RnvContext) => { logDefault('_attemptAutoFix'); - if (c.program.hosted) { + if (c.program.opts().hosted) { logInfo('HOSTED Mode. Skipping SDK checks'); return true; } @@ -78,7 +78,7 @@ const _attemptAutoFix = async (c: RnvContext) => { if (result) { logSuccess(`Found existing ${c.platform} SDK location at ${chalk().bold(result)}`); let confirmSdk = true; - if (!c.program.ci) { + if (!c.program.opts().ci) { const { confirm } = await inquirerPrompt({ type: 'confirm', name: 'confirm', @@ -104,7 +104,7 @@ const _attemptAutoFix = async (c: RnvContext) => { } } - logDefault(`_attemptAutoFix: no sdks found. searched at: ${SDK_LOCATIONS.join(', ')}`); + logError(`_attemptAutoFix: no sdks found. searched at: ${SDK_LOCATIONS.join(', ')}`); // const setupInstance = PlatformSetup(c); // await setupInstance.askToInstallSDK(sdkPlatform); @@ -118,17 +118,11 @@ export const checkWebosSdk = async () => { logDefault('checkWebosSdk'); if (!_isSdkInstalled(c)) { logWarning( - `${c.platform} requires SDK to be installed. Your SDK path in ${chalk().bold( + `${c.platform} platform requires WebOS SDK to be installed. Your SDK path in ${chalk().bold( c.paths.workspace.config )} does not exist: ${chalk().bold(_getCurrentSdkPath(c))}` ); - - switch (c.platform) { - case 'webos': - return _attemptAutoFix(c); - default: - return true; - } + return _attemptAutoFix(c); } return true; }; diff --git a/packages/sdk-webos/src/runner.ts b/packages/sdk-webos/src/runner.ts index d423967278..a4be2a9ac6 100644 --- a/packages/sdk-webos/src/runner.ts +++ b/packages/sdk-webos/src/runner.ts @@ -37,7 +37,7 @@ import { import { fsExistsSync } from '@rnv/core'; export const runWebOS = async (c: RnvContext) => { - const { hosted } = c.program; + const { hosted } = c.program.opts(); const { target } = c.runtime; const { platform } = c; @@ -119,7 +119,7 @@ export const buildWebOSProject = async () => { await buildCoreWebpackProject(); - if (!c.program.hosted) { + if (!c.program.opts().hosted) { const tDir = path.join(getPlatformProjectDir()!, 'build'); const tOut = path.join(getAppFolder()!, 'output'); diff --git a/packages/sdk-webos/src/tasks/taskSdkConfigure.ts b/packages/sdk-webos/src/tasks/taskSdkConfigure.ts new file mode 100644 index 0000000000..be045ec3cb --- /dev/null +++ b/packages/sdk-webos/src/tasks/taskSdkConfigure.ts @@ -0,0 +1,14 @@ +import { createTask, RnvTaskName } from '@rnv/core'; +import { checkAndConfigureWebosSdks, checkWebosSdk } from '../installer'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Configures sdks', + isPrivate: true, + fn: async () => { + await checkAndConfigureWebosSdks(); + await checkWebosSdk(); + }, + task: RnvTaskName.sdkConfigure, + platforms: SdkPlatforms, +}); diff --git a/packages/sdk-webos/src/tasks/taskTargetLaunch.ts b/packages/sdk-webos/src/tasks/taskTargetLaunch.ts new file mode 100644 index 0000000000..adcb116c30 --- /dev/null +++ b/packages/sdk-webos/src/tasks/taskTargetLaunch.ts @@ -0,0 +1,20 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { getTargetWithOptionalPrompt } from '@rnv/sdk-utils'; +import { checkAndConfigureWebosSdks, checkWebosSdk } from '../installer'; +import { launchWebOSimulator } from '../deviceManager'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'Launch specific target', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + await checkAndConfigureWebosSdks(); + const target = await getTargetWithOptionalPrompt(); + await checkWebosSdk(); + return launchWebOSimulator(target); + }, + task: RnvTaskName.targetLaunch, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-webos/src/tasks/taskTargetList.ts b/packages/sdk-webos/src/tasks/taskTargetList.ts new file mode 100644 index 0000000000..f5859e069f --- /dev/null +++ b/packages/sdk-webos/src/tasks/taskTargetList.ts @@ -0,0 +1,18 @@ +import { createTask, RnvTaskName, RnvTaskOptions } from '@rnv/core'; +import { checkAndConfigureWebosSdks, checkWebosSdk } from '../installer'; +import { listWebOSTargets } from '../deviceManager'; +import { SdkPlatforms } from '../constants'; + +export default createTask({ + description: 'List all available targets for specific platform', + dependsOn: [RnvTaskName.workspaceConfigure], + fn: async () => { + await checkAndConfigureWebosSdks(); + await checkWebosSdk(); + return listWebOSTargets(); + }, + task: RnvTaskName.targetList, + options: [RnvTaskOptions.target], + platforms: SdkPlatforms, + isGlobalScope: true, +}); diff --git a/packages/sdk-webpack/.gitignore b/packages/sdk-webpack/.gitignore deleted file mode 100644 index 0498e17dcb..0000000000 --- a/packages/sdk-webpack/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -coverage \ No newline at end of file diff --git a/packages/sdk-webpack/package.json b/packages/sdk-webpack/package.json index 405afdc056..1e4b36e998 100644 --- a/packages/sdk-webpack/package.json +++ b/packages/sdk-webpack/package.json @@ -33,7 +33,6 @@ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", "@rnv/sdk-utils": "1.0.0-rc.12", "@svgr/webpack": "6.3.1", - "axios": "1.6.0", "bfj": "^7.0.2", "browserslist": "^4.18.1", "camelcase": "^6.2.1", diff --git a/packages/sdk-webpack/src/config/webpack.config.js b/packages/sdk-webpack/src/config/webpack.config.js index 1f24f6b453..2831a24402 100644 --- a/packages/sdk-webpack/src/config/webpack.config.js +++ b/packages/sdk-webpack/src/config/webpack.config.js @@ -431,6 +431,7 @@ module.exports = function (webpackEnv) { babelrc: false, configFile: false, compact: false, + // RNV-UPDATE ------------------------------------------ // presets: [[require.resolve('babel-preset-react-app/dependencies'), { helpers: true }]], presets: [ [ @@ -440,6 +441,7 @@ module.exports = function (webpackEnv) { }, ], ], + // RNV-UPDATE ------------------------------------------ cacheDirectory: true, // See #6846 for context on why cacheCompression is disabled cacheCompression: false, diff --git a/packages/sdk-webpack/src/index.ts b/packages/sdk-webpack/src/index.ts index 6fb617c717..079a456288 100644 --- a/packages/sdk-webpack/src/index.ts +++ b/packages/sdk-webpack/src/index.ts @@ -1,4 +1,3 @@ -import axios from 'axios'; import path from 'path'; import commandExists from 'command-exists'; import { @@ -23,7 +22,14 @@ import { Env, getContext, } from '@rnv/core'; -import { checkPortInUse, getDevServerHost, openBrowser, waitForHost, confirmActiveBundler } from '@rnv/sdk-utils'; +import { + checkPortInUse, + getDevServerHost, + openBrowser, + waitForHost, + confirmActiveBundler, + axios, +} from '@rnv/sdk-utils'; import { EnvVars } from './env'; import { withRNVWebpack } from './adapter'; export { withRNVWebpack }; @@ -69,7 +75,7 @@ const _runWebBrowser = (devServerHost: string, port: number, alreadyStarted: boo }); const _runRemoteDebuggerChii = async (c: RnvContext, obj: { remoteDebuggerActive: boolean }) => { - const { debugIp } = c.program; + const { debugIp } = c.program.opts(); try { await commandExists('chii'); @@ -106,7 +112,7 @@ Debugger running at: ${debugUrl}`); }; const _runRemoteDebuggerWeinre = async (c: RnvContext, obj: { remoteDebuggerActive: boolean }) => { - const { debugIp } = c.program; + const { debugIp } = c.program.opts(); try { await commandExists('weinre'); @@ -142,7 +148,7 @@ Debugger running at: ${debugUrl}`); export const _runWebDevServer = async (c: RnvContext, enableRemoteDebugger?: boolean) => { logDefault('_runWebDevServer'); - const { debug } = c.program; + const { debug } = c.program.opts(); const env: Env = { ...CoreEnvVars.BASE(), @@ -187,7 +193,7 @@ export const _runWebDevServer = async (c: RnvContext, enableRemoteDebugger?: boo export const buildCoreWebpackProject = async () => { const c = getContext(); - const { debug, debugIp } = c.program; + const { debug, debugIp } = c.program.opts(); logDefault('buildCoreWebpackProject'); const env: Record = { ...CoreEnvVars.BASE(), @@ -247,7 +253,7 @@ export const runWebpackServer = async (enableRemoteDebugger?: boolean) => { ); await _runWebBrowser(devServerHost, port, false); if (!bundleAssets) { - logSummary('BUNDLER STARTED'); + logSummary({ header: 'BUNDLER STARTED' }); } await _runWebDevServer(c, enableRemoteDebugger); } else { @@ -256,7 +262,7 @@ export const runWebpackServer = async (enableRemoteDebugger?: boolean) => { if (resetCompleted) { await _runWebBrowser(devServerHost, port, false); if (!bundleAssets) { - logSummary('BUNDLER STARTED'); + logSummary({ header: 'BUNDLER STARTED' }); } await _runWebDevServer(c, enableRemoteDebugger); } else { diff --git a/packages/sdk-webpack/src/scripts/start.js b/packages/sdk-webpack/src/scripts/start.js index 85ba425793..fa200dab9c 100644 --- a/packages/sdk-webpack/src/scripts/start.js +++ b/packages/sdk-webpack/src/scripts/start.js @@ -1,6 +1,6 @@ -// RNV-ADDITION +// RNV-UPDATE ------------------------------------------ import { getMergedConfig } from '../adapter'; -// RNV-ADDITION +// RNV-UPDATE ------------------------------------------ // Do this as the first thing so that any code reading it knows the right env. process.env.BABEL_ENV = 'development'; process.env.NODE_ENV = 'development'; @@ -23,11 +23,11 @@ const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); const { createCompiler, prepareProxy, prepareUrls } = require('react-dev-utils/WebpackDevServerUtils'); // const openBrowser = require('react-dev-utils/openBrowser'); const semver = require('semver'); -const { Logger } = require('rnv'); const paths = require('../config/paths'); +// RNV-UPDATE ------------------------------------------ // const configFactory = require('../config/webpack.config'); -// const configFactory = require('react-scripts/config/webpack.config.js'); const config = getMergedConfig(require('../config/webpack.config')('development'), paths.appPath); +// RNV-UPDATE ------------------------------------------ const createDevServerConfig = require('../config/webpackDevServer.config'); const getClientEnvironment = require('../config/env'); @@ -51,12 +51,11 @@ export default async () => const HOST = process.env.HOST || '0.0.0.0'; if (process.env.HOST) { - Logger.logInfo( + console.log( `Attempting to bind to HOST environment variable: ${chalk.yellow(chalk.bold(process.env.HOST))}` ); - Logger.logInfo("If this was unintentional, check that you haven't mistakenly set it in your shell."); - Logger.logInfo(`Learn more here: ${chalk.yellow('https://cra.link/advanced-config')}`); - Logger.logInfo(); + console.log("If this was unintentional, check that you haven't mistakenly set it in your shell."); + console.log(`Learn more here: ${chalk.yellow('https://cra.link/advanced-config')}`); } const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; const appName = require(paths.appPackageJson).name; diff --git a/packages/template-starter/.gitignore b/packages/template-starter/.gitignore index cf867256d8..e8e92c8b24 100644 --- a/packages/template-starter/.gitignore +++ b/packages/template-starter/.gitignore @@ -1,61 +1,3 @@ -# -------------------------------- -# Generated by ReNative -# -------------------------------- -.DS_Store -node_modules/ -npm-debug.log -yarn-error.log -.env -.next -.expo - -#------------------------------- -# Visual Studio -#------------------------------- -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -#------------------------------- -# RENATIVE -#------------------------------- - -platformBuilds/ -platformAssets/ -buildHooks/dist -renative.local.json -renative.private.json -renative.build.json -renative.runtime.json -rnv-config.local.json -metro.config.local.js - - -vendor/ -appConfigs/base/assets/ios -appConfigs/base/assets/android -appConfigs/base/assets/web -appConfigs/base/assets/androidtv -appConfigs/base/assets/tvos -appConfigs/base/assets/webos -appConfigs/base/assets/tizen -appConfigs/base/assets/tizenwatch -appConfigs/base/assets/tizenwear -appConfigs/base/assets/kaios -appConfigs/base/assets/firetv -appConfigs/base/assets/androidwear -appConfigs/base/assets/xbox -appConfigs/base/assets/linux -appConfigs/base/assets/macos - -public/ - -# Does not work -# !appConfigs/base/assets/runtime - -reporting - -.bundle/ +# Special case for rnv template. public folder is generated we don't want to commit it +public/ \ No newline at end of file diff --git a/packages/template-starter/.npmignore b/packages/template-starter/.npmignore deleted file mode 100644 index c22cc87873..0000000000 --- a/packages/template-starter/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -buildHooks/dist -.env -.npmrc -docs/ \ No newline at end of file diff --git a/packages/template-starter/.watchmanconfig b/packages/template-starter/.watchmanconfig index 59a7131334..ad64dceb7e 100644 --- a/packages/template-starter/.watchmanconfig +++ b/packages/template-starter/.watchmanconfig @@ -1,6 +1,35 @@ { "ignore_dirs": [ "platformBuilds", - "buildHooks/dist" + "buildHooks/dist", + "../adapter", + "../app-harness", + "../build-hooks-git", + "../build-hooks-schema", + "../cli", + "../config-templates", + "../core", + "../engine-core", + "../engine-lightning", + "../engine-rn", + "../engine-rn-electron", + "../engine-rn-macos", + "../engine-rn-next", + "../engine-rn-tvos", + "../engine-rn-web", + "../engine-rn-windows", + "../engine-roku", + "../integration-docker", + "../integration-starter", + "../rnv", + "../sdk-android", + "../sdk-apple", + "../sdk-kaios", + "../sdk-react-native", + "../sdk-telemetry", + "../sdk-tizen", + "../sdk-utils", + "../sdk-webos", + "../sdk-webpack" ] -} \ No newline at end of file +} diff --git a/packages/template-starter/appConfigs/app/renative.json b/packages/template-starter/appConfigs/app/renative.json index 8d4e781699..4505e275e5 100644 --- a/packages/template-starter/appConfigs/app/renative.json +++ b/packages/template-starter/appConfigs/app/renative.json @@ -1,13 +1,10 @@ { "$schema": "../../.rnv/schema/rnv.app.json", "extendsTemplate": "@rnv/template-starter/appConfigs/base/renative.json", - "id": "com.app", + "id": "app", "common": { - "description": "ReNative App", - "buildSchemes": {}, "runtime": { "welcomeMessage": "Hello ReNative!" } - }, - "platforms": {} + } } \ No newline at end of file diff --git a/packages/template-starter/appConfigs/template/renative.json b/packages/template-starter/appConfigs/template/renative.json index 27234223ac..5b1271134f 100644 --- a/packages/template-starter/appConfigs/template/renative.json +++ b/packages/template-starter/appConfigs/template/renative.json @@ -2,6 +2,27 @@ "$schema": "../../.rnv/schema/rnv.app.json", "extend": "base", "id": "template", + "isTemplate": true, + "isMonorepo": true, + "defaults": { + "ports": { + "ios": 8082, + "android": 8083, + "androidtv": 8084, + "firetv": 8098, + "tvos": 8085, + "macos": 8086, + "web": 8080, + "tizen": 8087, + "webos": 8088, + "androidwear": 8089, + "tizenwatch": 8090, + "tizenmobile": 8091, + "windows": 8092, + "xbox": 8099, + "kaios": 8093 + } + }, "skipBootstrapCopy": true, "common": { "id": "renative.helloworld", diff --git a/packages/template-starter/babel.config.js b/packages/template-starter/babel.config.js index 8d4e054380..f0dfefd3c5 100644 --- a/packages/template-starter/babel.config.js +++ b/packages/template-starter/babel.config.js @@ -1,3 +1,3 @@ -const { withRNVBabel } = require('rnv'); +const { withRNVBabel } = require('@rnv/adapter'); module.exports = withRNVBabel({}); diff --git a/packages/template-starter/buildHooks/src/index.ts b/packages/template-starter/buildHooks/src/index.ts index 9c79bab25a..c180f4946b 100644 --- a/packages/template-starter/buildHooks/src/index.ts +++ b/packages/template-starter/buildHooks/src/index.ts @@ -1,8 +1,6 @@ -import { logHook } from '@rnv/core'; - const hooks = { hello: async () => { - logHook('Hello build hook!'); + console.log('Hello build hook!'); }, }; diff --git a/packages/template-starter/index.js b/packages/template-starter/index.js index 1a9d0877aa..68fe9ffb59 100644 --- a/packages/template-starter/index.js +++ b/packages/template-starter/index.js @@ -1 +1 @@ -import './src/entry/'; //eslint-disable-line +import './src/entry/'; diff --git a/packages/template-starter/metro.config.js b/packages/template-starter/metro.config.js index 58f9428bfb..fc7d7b4a41 100644 --- a/packages/template-starter/metro.config.js +++ b/packages/template-starter/metro.config.js @@ -1,3 +1,3 @@ -const { withRNVMetro } = require('rnv'); +const { withRNVMetro } = require('@rnv/adapter'); module.exports = withRNVMetro({}); diff --git a/packages/template-starter/next.config.js b/packages/template-starter/next.config.js index e82ad67a8d..92651f1cc7 100644 --- a/packages/template-starter/next.config.js +++ b/packages/template-starter/next.config.js @@ -1,4 +1,4 @@ -const { withRNVNext } = require('@rnv/engine-rn-next'); +const { withRNVNext } = require('@rnv/adapter'); const config = { compress: false, diff --git a/packages/template-starter/package.json b/packages/template-starter/package.json index 24a4df0905..ee490286ec 100644 --- a/packages/template-starter/package.json +++ b/packages/template-starter/package.json @@ -62,7 +62,8 @@ "static", "tsconfig.json", "typings", - "webpack.config.js" + "webpack.config.js", + ".gitignore" ], "repository": { "type": "git", @@ -97,6 +98,9 @@ "@flexn/graybox": "1.0.0-feat.12", "@lightningjs/sdk": "^5.4.1", "@rnv/core": "1.0.0-rc.12", + "@rnv/cli": "1.0.0-rc.12", + "@rnv/config-templates": "1.0.0-rc.12", + "@rnv/adapter": "1.0.0-rc.12", "@rnv/engine-lightning": "1.0.0-rc.12", "@rnv/engine-rn": "1.0.0-rc.12", "@rnv/engine-rn-electron": "1.0.0-rc.12", @@ -110,17 +114,15 @@ "babel-jest": "29.6.3", "babel-loader": "9.1.3", "detox": "18.20.2", - "jetifier": "2.0.0", - "next": "14.1.0", + "next": "14.1.4", "raf": "3.4.1", "react": "18.2.0", "react-art": "18.2.0", "react-dom": "18.2.0", "react-native": "0.73.4", "react-native-gesture-handler": "2.14.1", - "react-native-tvos": "0.73.1-3", - "react-native-web": "0.19.9", - "rnv": "1.0.0-rc.12" + "react-native-tvos": "0.73.6-0", + "react-native-web": "0.19.9" }, "private": false, "publishConfig": { @@ -129,8 +131,5 @@ "browserslist": [ ">0.2%", "op_mini all" - ], - "dependencies": { - "raf": "3.4.1" - } + ] } diff --git a/packages/template-starter/react-native.config.js b/packages/template-starter/react-native.config.js index ab5f2f06eb..d8dc90f703 100644 --- a/packages/template-starter/react-native.config.js +++ b/packages/template-starter/react-native.config.js @@ -1,5 +1,5 @@ //! NO CONSOLE LOGS HERE. IT WILL BREAK THE APP -const { withRNVRNConfig } = require('rnv'); +const { withRNVRNConfig } = require('@rnv/adapter'); const config = withRNVRNConfig({}); diff --git a/packages/template-starter/renative.json b/packages/template-starter/renative.json index 3f8b9c90ef..1f498e73eb 100644 --- a/packages/template-starter/renative.json +++ b/packages/template-starter/renative.json @@ -8,39 +8,15 @@ "@rnv/engine-rn-tvos": "source:rnv", "@rnv/engine-rn-web": "source:rnv" }, - "isTemplate": true, "projectName": "@rnv/template-starter", "enableHookRebuild": false, "workspaceID": "rnv", - "isMonorepo": true, "paths": { "appConfigsDir": "./appConfigs", "platformAssetsDir": "./platformAssets", "platformBuildsDir": "./platformBuilds" }, - "tasks": { - "install": { - "script": "yarn bootstrap" - } - }, "defaults": { - "ports": { - "ios": 8082, - "android": 8083, - "androidtv": 8084, - "firetv": 8098, - "tvos": 8085, - "macos": 8086, - "web": 8080, - "tizen": 8087, - "webos": 8088, - "androidwear": 8089, - "tizenwatch": 8090, - "tizenmobile": 8091, - "windows": 8092, - "xbox": 8099, - "kaios": 8093 - }, "supportedPlatforms": [ "ios", "android", @@ -48,14 +24,11 @@ "firetv", "androidwear", "web", - "webtv", "tizen", "tvos", "webos", "macos", - "windows", "tizenwatch", - "tizenmobile", "kaios", "chromecast", "linux" @@ -67,12 +40,10 @@ }, "targets": {} }, - "templates": { - "@rnv/template-starter": { - "version": "1.0.0-rc.12" - } + "templateConfig": { + "name": "@rnv/template-starter", + "version": "1.0.0-rc.12" }, - "currentTemplate": "@rnv/template-starter", "platforms": { "android": { "minSdkVersion": 26, @@ -140,11 +111,19 @@ "react-art": "source:rnv", "react-dom": "source:rnv", "react-native-gesture-handler": "source:rnv", - "@react-native-community/cli-platform-ios": "source:rnv", + "@react-native-community/cli-platform-ios": { + "supportedPlatforms": ["tvos", "ios"] + }, "react-native": "source:rnv", - "next": "source:rnv", - "react-native-web": "source:rnv", - "react-native-tvos": "source:rnv" + "next": { + "supportedPlatforms": ["web"] + }, + "react-native-web": { + "supportedPlatforms": ["web", "tizen", "webos", "macos"] + }, + "react-native-tvos": { + "supportedPlatforms": ["tvos", "firetv", "androidtv"] + } }, "permissions": { "ios": {}, diff --git a/packages/template-starter/renative.template.json b/packages/template-starter/renative.template.json index 7da29a1354..cf4813f895 100644 --- a/packages/template-starter/renative.template.json +++ b/packages/template-starter/renative.template.json @@ -1,22 +1,35 @@ { - "$schema": ".rnv/schema/rnv.template.json", + "$schema": "../../.rnv/schema/rnv.template.json", "templateConfig": { "disabled": false, "includedPaths": [ { - "paths": ["buildHooks", "src", "index.js", "tsconfig.json", "babel.config.js", "typings"] + "paths": [ + "buildHooks", + "src/app", + "src/entry", + "src/config.tsx", + "index.js", + "tsconfig.json", + "babel.config.js", + "typings", + ".gitignore", + "appConfigs/app", + "appConfigs/base/assets", + "appConfigs/base/fonts" + ] }, { "paths": ["Gemfile", "metro.config.js", ".bundle", "react-native.config.js"], - "engines": ["engine-rn", "engine-rn-tvos"] + "platforms": ["ios", "android", "tvos", "firetv", "androidtv"] }, { - "paths": ["next.config.js", "next-env.d.ts"], - "engines": ["engine-rn-next"] + "paths": ["next.config.js", "next-env.d.ts", "src/pages"], + "platforms": ["web"] }, { "paths": ["webpack.config.js"], - "engines": ["engine-web"] + "platforms": ["macos", "tizen", "webos", "tizenwatch", "tizenmobile"] } ], "renative_json": { @@ -25,21 +38,20 @@ }, "package_json": { "devDependencies": { - "typescript": "5.0.4", + "typescript": "5.2.2", "@types/react": "18.2.52", "@types/react-dom": "18.2.18", "@types/react-native": "0.72.3", "@flexn/typescript-config": "1.0.0", "@flexn/assets-renative-outline": "0.3.3", - "babel-loader": "9.1.3" + "@rnv/core": "1.0.0-rc.12", + "@rnv/cli": "1.0.0-rc.12", + "@rnv/adapter": "1.0.0-rc.12", + "@rnv/config-templates": "1.0.0-rc.12" }, "browserslist": { "production": [">0.2%", "not dead", "not op_mini all"], "development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"] - }, - "resolutions": { - "@babel/traverse": "7.15.0", - "@types/react": "18.2.52" } } }, @@ -47,6 +59,7 @@ "rnvNewPatchDependencies": { "pkg-dir": "7.0.0", "xmlbuilder": "^15.1.1" - } + }, + "defaultSelectedPlatforms": ["web", "ios", "android"] } } diff --git a/packages/template-starter/src/app/index.tsx b/packages/template-starter/src/app/index.tsx index 452d2f10d2..bdc00fe107 100644 --- a/packages/template-starter/src/app/index.tsx +++ b/packages/template-starter/src/app/index.tsx @@ -15,10 +15,12 @@ const AppThemed = () => { const [pixelRatio, setPixelRatio] = useState(1); const [fontScale, setFontScale] = useState(1); + const [isClient, setIsClient] = useState(false); useEffect(() => { setPixelRatio(PixelRatio.get()); setFontScale(PixelRatio.getFontScale()); + setIsClient(true); }, []); return ( @@ -39,9 +41,11 @@ const AppThemed = () => { v {packageJson.version} - - {`platform: ${Api.platform}, factor: ${Api.formFactor}, engine: ${Api.engine}`} - + {isClient ? ( + + {`platform: ${Api.platform}, factor: ${Api.formFactor}, engine: ${Api.engine}`} + + ) : null} {`hermes: ${ typeof HermesInternal === 'object' && HermesInternal !== null ? 'yes' : 'no' }`} diff --git a/packages/rnv/.npmignore b/packages/template-starter/templateOverrides/.gitignore old mode 100644 new mode 100755 similarity index 54% rename from packages/rnv/.npmignore rename to packages/template-starter/templateOverrides/.gitignore index 59f1496369..caf17fb4b8 --- a/packages/rnv/.npmignore +++ b/packages/template-starter/templateOverrides/.gitignore @@ -28,31 +28,67 @@ project.xcworkspace # node.js # node_modules/ +dist +lib + +# NPM +# npm-debug.log + +# Yarn +# yarn-error.log -index/ +# Lerna +# +lerna-debug.log # BUCK +# buck-out/ \.buckd/ # Visual Studio # .vscode/* +.vscode !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json -platformBuilds/ -platformAssets/ -package-lock.json +# Testing +# +coverage +reporting +coverage-ts + +# Expo +# +.expo -Dockerfile -coverage/ +# Next +# +.next -**/__tests__/ +# ReNative +# +.rnv +renative.private.json +renative.local.json +renative.local.json +renative.build.json +renative.runtime.json +rnv-config.local.json +metro.config.local.js +platformBuilds +platformAssets -*.map \ No newline at end of file +# Other +# +.binlog +*.binlog +.bundle +vendor +.watchman-cookie-* diff --git a/packages/template-starter/webpack.config.js b/packages/template-starter/webpack.config.js index 0e1f352ae5..b925808500 100644 --- a/packages/template-starter/webpack.config.js +++ b/packages/template-starter/webpack.config.js @@ -1,3 +1,3 @@ -const { withRNVWebpack } = require('@rnv/engine-rn-web'); +const { withRNVWebpack } = require('@rnv/adapter'); module.exports = withRNVWebpack({}); diff --git a/spec/playground.ts b/spec/playground.ts new file mode 100644 index 0000000000..0556e649ba --- /dev/null +++ b/spec/playground.ts @@ -0,0 +1,71 @@ +// type Obj = { +// key: T; +// }; + +type Obj2 = { + key2: T; +}; + +type Obj = { + key: T; + opts: ReadonlyArray>; +}; + +const getMagicKeys = (): K => { + const koko: K = 'ddd' as K; + return koko; +}; + +const createObjFromArr = (arr: ReadonlyArray>) => { + const response: Partial>> = {}; + arr.forEach((v) => { + response[v.key] = v; + }); + return { + response, + getMagic: () => getMagicKeys(), + }; +}; + +// type Bool = { +// 'foo-bar1': string; +// 'Foo-bar2': string; +// 'Foo-Bar3': string; +// 'foo_bar4': string; +// } + +// type FB = Camel; + +// const kk: FB = '' + +// const createObjFromArr = >>(arr: ReadonlyArray>) => { +// const response: Record> = { +// fff: { key: '' }, +// }; +// arr.forEach((v) => { +// response[v.key as K] = v; +// }); +// return response; +// }; + +const payloadArr = [ + { key: 'key1', opts: [{ key2: 'hoooo' }] }, + { key: 'key2', opts: [{ key2: 'hoooo2' }, { key2: 'hoooo3' }] }, +] as const; + +const koko = createObjFromArr(payloadArr); + +// type GetReturnType = Type extends (...args: never[]) => infer Return ? Return : never; + +// type Type1 = GetReturnType; + +// type Flatten = Type extends Array ? Item : Type; + +// type MyTyp = Flatten; + +// type Shite = typeof koko; +// type Bookla = +// type Bookla>> = T +// const loko: Shite; +// const koo: MyTyp +console.log('JFJFJFJ', koko.getMagic()); diff --git a/spec/renative.engine2.json b/spec/renative.engine2.json new file mode 100644 index 0000000000..f4774861c6 --- /dev/null +++ b/spec/renative.engine2.json @@ -0,0 +1,43 @@ +{ + "$schema": "../../.rnv/schema/rnv.engine.json", + "engineConfig": { + "id": "engine-rn-electron", + "engineExtension": "rne", + "overview": "React native based engine with web transpiler provided by react-native-web and native desktop wrapper provided by electron", + "pluginDependencies": [ + "react", + "react-art", + "react-dom", + "react-native", + "react-native-web", + "react-dev-utils" + ], + "npm": { + "devDependencies": {} + }, + "platforms": { + "macos": { + "npm": { + "devDependencies": {} + } + }, + "windows": { + "npm": { + "devDependencies": {} + } + }, + "linux": { + "npm": { + "devDependencies": {} + } + } + } + }, + "plugins": { + "react": "source:rnv", + "react-art": "source:rnv", + "react-dom": "source:rnv", + "react-native": "source:rnv", + "react-native-web": "source:rnv" + } +} diff --git a/spec/renative.spec.json b/spec/renative.spec.json new file mode 100644 index 0000000000..6e6307948c --- /dev/null +++ b/spec/renative.spec.json @@ -0,0 +1,33 @@ +{ + "templateConfig": { + "name": "@rnv/template-starter", + "version": "0.0.0" + }, + "modsConfig": { + "name": "@rnv/mods", + "version": "0.0.0", + "namespace": "rnv" + }, + "pluginsConfig": { + "name": "@rnv/plugins", + "version": "1.3.9" + }, + "platformsConfig": {}, + "projectConfig": { + "appConfigsDir": "./appConfigs", + "platformAssetsDir": "./platformAssets", + "platformBuildsDir": "./platformBuilds", + "defaultCommandSchemes": { + "run": "debug" + }, + "defaultTargets": {} + }, + "appConfigs": {}, + "tasks": {}, + "engines": {}, + "mods": {}, + "platforms": {}, + "plugins": {}, + "permissions": {}, + "supportedPlatforms": ["ios", "android"] +} diff --git a/packages/template-starter/renative.template.spec.json b/spec/renative.template.spec.json similarity index 51% rename from packages/template-starter/renative.template.spec.json rename to spec/renative.template.spec.json index 32a552faa6..4e4e5da8aa 100644 --- a/packages/template-starter/renative.template.spec.json +++ b/spec/renative.template.spec.json @@ -1,48 +1,4 @@ { - "$schema": ".rnv/schema/rnv.template.json", - "templateConfig": { - "disabled": false, - "includedPaths": [ - { - "paths": ["buildHooks", "src", "index.js", "tsconfig.json", "babel.config.js", "typings"] - }, - { - "paths": ["Gemfile", "metro.config.js", ".bundle", "react-native.config.js"], - "engines": ["engine-rn", "engine-rn-tvos"] - }, - { - "paths": ["next.config.js", "next-env.d.ts"], - "engines": ["engine-rn-next"] - }, - { - "paths": ["webpack.config.js"], - "engines": ["engine-web"] - } - ], - "renative_json": { - "$schema": ".rnv/schema/rnv.project.json", - "extendsTemplate": "@rnv/template-starter/renative.json" - }, - "package_json": { - "devDependencies": { - "typescript": "5.0.4", - "@types/react": "18.2.52", - "@types/react-dom": "18.2.18", - "@types/react-native": "0.72.3", - "@flexn/typescript-config": "1.0.0", - "@flexn/assets-renative-outline": "0.3.3", - "babel-loader": "9.1.3" - }, - "browserslist": { - "production": [">0.2%", "not dead", "not op_mini all"], - "development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"] - }, - "resolutions": { - "@babel/traverse": "7.15.0", - "@types/react": "18.2.52" - } - } - }, "bootstrapConfig": { "rnvNewPatchDependencies": { "pkg-dir": "7.0.0", diff --git a/spec/schema_v2/config.ts b/spec/schema_v2/config.ts new file mode 100644 index 0000000000..597665657b --- /dev/null +++ b/spec/schema_v2/config.ts @@ -0,0 +1,58 @@ +import { z } from 'zod'; + +const WorkspaceID = z + .string() //TODO: no spaces + .describe( + 'Workspace ID your project belongs to. This will mach same folder name in the root of your user directory. ie `~/` on macOS' + ); +type RnvConfigWorkspaceID = z.infer; + +type RnvConfigProject = { + workspaceID: string; +}; + +type RnvConfig = { + // reantive.app.json + app: { + id: string; + appConfigID: string; + common: {}; + }; + // reantive.project.json + project: { + projectName: string; + engines: {}; + extendsConfig: string; + supportedPlatforms: []; + platforms: { + android: { + buildSchemes: {}; + }; + }; + plugins: { + 'plugin-a': {}; + }; + }; + // reantive.template.json + template: {}; + // reantive.workspace.json + workspace: {}; + // reantive.engine.json + engine: {}; + // reantive.integration.json + integration: {}; + // reantive.solution.json + solution: {}; + // reantive.local.json + local: {}; + // reantive.private.json + private: {}; + // renative.runtime.json + runtime: {}; + // reantive.templates.json + configTemplates: { + plugins: {}; + templates: {}; + integrations: {}; + }; +}; diff --git a/spec/xml/AndroidManifest.xml b/spec/xml/AndroidManifest.xml index 4098f64aac..9aa8170dc6 100644 --- a/spec/xml/AndroidManifest.xml +++ b/spec/xml/AndroidManifest.xml @@ -1,5 +1,5 @@ {{PLUGIN_MANIFEST_FILE}} diff --git a/spec/zod_schema_master.ts b/spec/zod_schema_master.ts new file mode 100644 index 0000000000..c6441d83db --- /dev/null +++ b/spec/zod_schema_master.ts @@ -0,0 +1,461 @@ +import { AnyZodObject, z } from 'zod'; + +import { zodPlatformsKeys, zodSupportedPlatforms } from '../shared'; + +const _generatePlatformsSchema = (schema: AnyZodObject) => { + return z.object({ + android: schema, + androidtv: schema, + androidwear: schema, + firetv: schema, + ios: schema, + tvos: schema, + tizen: schema, + tizenmobile: schema, + tizenwatch: schema, + webos: schema, + web: schema, + webtv: schema, + chromecast: schema, + kaios: schema, + macos: schema, + linux: schema, + windows: schema, + xbox: schema, + }); +}; + +const SchemaRuntime = z + .any() + .describe( + 'This object will be automatically injected into `./platfromAssets/renative.runtime.json` making it possible to inject the values directly to JS source code' + ); + +const SchemaPluginPlatform = z.object({ + disabled: z.boolean().default(false).describe('Marks plugin platform disabled'), + forceLinking: z + .boolean() + .default(false) + .describe( + 'Packages that cannot be autolinked yet can still be added to MainApplication PackageList dynamically by setting this to true' + ), + path: z + .string() + .describe( + 'Enables you to pass custom path to plugin. If undefined, the default `node_modules/[plugin-name]` will be used.' + ), +}); + +const SchemaPluginBase = z.object({ + supportedPlatforms: zodSupportedPlatforms.optional(), + disabled: z.boolean().default(false).describe('Marks plugin disabled'), + props: z.record(z.string(), z.string()).describe('Custom props passed to plugin'), + version: z.string().describe('Version of plugin. Typically package version'), + deprecated: z + .string() + .describe('Marks your plugin deprecated with warning showing in the console during rnv commands'), + source: z + .string() + .describe( + 'Will define custom scope for your plugin config to extend from.\n\nNOTE: custom scopes can be defined via paths.pluginTemplates.[CUSTOM_SCOPE].{}' + ), + disableNpm: z.boolean().describe('Will skip including plugin in package.json and installing it via npm/yarn etc'), + skipMerge: z + .boolean() + .describe( + 'Will not attempt to merge with existing plugin configuration (ie. coming form renative pluginTemplates)\n\nNOTE: if set to `true` you need to configure your plugin object fully' + ), + npm: z + .record(z.string(), z.string()) + .describe('Object of npm dependencies of this plugin. These will be injected into package.json'), //=> npmDependencies + pluginDependencies: z + .record(z.string(), z.string().nullable()) + .describe('List of other Renative plugins this plugin depends on'), + webpackConfig: z + .object({ + modulePaths: z.union([z.boolean(), z.array(z.string())]).optional(), + moduleAliases: z + .union([ + z.boolean(), + z.record( + z.string(), + z.union([ + z.string(), + z.object({ + projectPath: z.string(), + }), + ]) + ), + ]) + .optional(), + nextTranspileModules: z.optional(z.array(z.string())), + }) + .describe('Allows you to configure webpack bahaviour per each individual plugin'), //Should this be at root plugin??? + disablePluginTemplateOverrides: z.boolean().describe('Disables plugin overrides for selected plugin'), + fontSources: z.array(z.string()), +}); + +const SchemaPlugin: any = SchemaPluginBase.merge(_generatePlatformsSchema(SchemaPluginPlatform)); + +const SchemaPackageJson = z + .object({ + dependencies: z.record(z.string(), z.string()), + devDependencies: z.record(z.string(), z.string()), + peerDependencies: z.record(z.string(), z.string()), + optionalDependencies: z.record(z.string(), z.string()), + name: z.string(), + version: z.string(), + }) + .passthrough(); + +const SchemaPlatform = z.object({ + engine: z + .string() + .describe('ID of engine to be used for this platform. Note: engine must be registered in `engines` field'), + + extendPlatform: z.optional(zodPlatformsKeys), + assetFolderPlatform: z + .string() + .describe( + 'Alternative platform assets. This is useful for example when you want to use same android assets in androidtv and want to avoid duplicating assets' + ), +}); + +const SchemaCommon = z.object({ + includedPermissions: z + .array(z.string()) + .describe( + "Allows you to include specific permissions by their KEY defined in `permissions` object. Use: `['*']` to include all" + ), + excludedPermissions: z + .array(z.string()) + .describe( + "Allows you to exclude specific permissions by their KEY defined in `permissions` object. Use: `['*']` to exclude all" + ), + id: z.string().describe('Bundle ID of application. ie: com.example.myapp'), + idSuffix: z.string().optional(), + version: z.string().describe('Semver style version of your app'), + versionCode: z.string().describe('Manual verride of generated version code'), + versionFormat: z.string().describe(`Allows you to fine-tune app version defined in package.json or renative.json. + If you do not define versionFormat, no formatting will apply to version. + `), + versionCodeFormat: z.string().describe(`Allows you to fine-tune auto generated version codes. + Version code is autogenerated from app version defined in package.json or renative.json. + `), + versionCodeOffset: z.number().optional(), + title: z + .string() + .describe( + 'Title of your app will be used to create title of the binary. ie App title of installed app iOS/Android app or Tab title of the website' + ), + description: z + .string() + .describe( + 'General description of your app. This prop will be injected to actual projects where description field is applicable' + ), + author: z.string().describe('Author name'), + license: z.string().describe('Injects license information into app'), + includedFonts: z + .array(z.string()) + .describe( + 'Array of fonts you want to include in specific app or scheme. Should use exact font file (without the extension) located in `./appConfigs/base/fonts` or `*` to mark all' + ), + backgroundColor: z + .string() + .min(4) + .max(9) + .regex(/^#/) + .describe('Defines root view backgroundColor for all platforms in HEX format'), + splashScreen: z.boolean().describe('Enable or disable splash screen'), + fontSources: z + .array(z.string()) + .describe( + 'Array of paths to location of external Fonts. you can use resolve function here example: `{{resolvePackage(react-native-vector-icons)}}/Fonts`' + ), + assetSources: z + .array(z.string()) + .describe( + 'Array of paths to alternative external assets. this will take priority over ./appConfigs/base/assets folder on your local project. You can use resolve function here example: `{{resolvePackage(@flexn/template-starter)}}/appConfigs/base/assets`' + ), + includedPlugins: z + .array(z.string()) + .describe( + "Defines an array of all included plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: includedPlugins is evaluated before excludedPlugins. Use: `['*']` to include all" + ), + excludedPlugins: z + .array(z.string()) + .describe( + "Defines an array of all excluded plugins for specific config or buildScheme. only full keys as defined in `plugin` should be used.\n\nNOTE: excludedPlugins is evaluated after includedPlugins. Use: `['*']` to exclude all" + ), + runtime: SchemaRuntime, +}); + +const SchemaProject = z.object({ + workspaceID: z + .string() //TODO: no spaces + .describe( + 'Workspace ID your project belongs to. This will mach same folder name in the root of your user directory. ie `~/` on macOS' + ), + projectVersion: z.string().describe('Version of project'), // TODO: if undefined it should infer from package.json + projectName: z + .string() + .describe( + 'Name of the project which will be used in workspace as folder name. this will also be used as part of the KEY in crypto env var generator' + ), + isTemplate: z + .boolean() + .describe('Marks project as template. This disables certain user checks like version mismatch etc'), + defaults: z + .object({ + ports: z + .record(zodPlatformsKeys, z.number()) //TODO maxValue(65535) + .describe( + 'Allows you to assign custom port per each supported platform specific to this project. this is useful if you foten switch between multiple projects and do not want to experience constant port conflicts' + ), + supportedPlatforms: zodSupportedPlatforms, + portOffset: z.number().describe('Offset each port default value by increment'), + defaultCommandSchemes: z + .record(z.enum(['run', 'export', 'build']), z.string()) + .describe( + 'List of default schemes for each rnv command. This is useful if you want to avoid specifying `-s ...` every time your run rnv command. bu default rnv uses `-s debug`. NOTE: you can only use schemes you defined in `buildSchemes`' + ), + targets: z + .record(zodPlatformsKeys, z.string()) + .describe('Override of default targets specific to this project'), + }) + .describe('Default system config for this project'), + common: SchemaCommon.merge( + z.object({ + buildSchemes: z.record(z.string(), SchemaCommon.merge(_generatePlatformsSchema(SchemaPlatform))), + }) + ).describe('Common config props used as default props for all available buildSchemes'), + pipes: z + .array(z.string()) + .describe( + 'To avoid rnv building `buildHooks/src` every time you can specify which specific pipes should trigger recompile of buildHooks' + ), + crypto: z + .object({ + path: z + .string() + .describe( + 'Relative path to encrypted file in your renative project. Example: "./secrets/mySecrets.enc"' + ), + isOptional: z.boolean().describe('Mark if crypto object should not checked every run'), + }) + .describe( + 'This prop enables automatic encrypt and decrypt of sensitive information in your project. \nRNV will generate new env variable with can be used to encrypt and decrypt. this env var is generated by combining (and sanitizing) 2 properties from your renative.json: \nworkspaceID + projectName.\nThese 2 properties are also used to generate path on your local machine where encrypted files will be decrypted into.' + ), + paths: z + .object({ + appConfigsDir: z.string().describe('Custom path to appConfigs. defaults to `./appConfigs`'), + platformTemplatesDirs: z + .record(zodPlatformsKeys, z.string()) + .describe( + 'Custom location of ejected platform templates. this is populated after you run `rnv platform eject`' + ), + appConfigsDirs: z.array(z.string()).describe('Array of custom location app configs directories`'), + platformAssetsDir: z + .string() + .describe('Custom path to platformAssets folder. defaults to `./platformAssets`'), + platformBuildsDir: z + .string() + .describe('Custom path to platformBuilds folder. defaults to `./platformBuilds`'), + pluginTemplates: z.record( + z.string(), + z.object({ + npm: z.string(), + path: z.string(), + }) + ).describe(` + Allows you to define custom plugin template scopes. default scope for all plugins is \`rnv\`.`), + }) + .describe('Define custom paths for RNV to look into'), + permissions: z + .object({ + android: z + .record( + z.string(), + z.object({ + key: z.string(), //TODO: type this + security: z.string(), //TODO: type this + }) + ) + .describe('Android SDK specific permissions'), + ios: z + .record( + z.string(), //TODO: type this + z.object({ + desc: z.string(), + }) + ) + .describe('iOS SDK specific permissions'), + }) + .describe( + 'Permission definititions which can be used by app configs via `includedPermissions` and `excludedPermissions` to customize permissions for each app' + ), + engines: z.record(z.string(), z.literal('source:rnv')).describe('List of engines available in this project'), // TODO: rename to mods (mods with type engine in the future) ? + enableHookRebuild: z + .boolean() + .describe( + 'If set to true in `./renative.json` build hooks will be compiled at each rnv command run. If set to `false` (default) rebuild will be triggered only if `dist` folder is missing, `-r` has been passed or you run `rnv hooks run` directly making your rnv commands faster' + ), + extendsTemplate: z + .string() + .describe( + 'You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`' + ), // TODO: rename to "extendsConfig" + tasks: z + .object({ + install: z.object({ + script: z.string(), + platform: z.record( + zodPlatformsKeys, + z.object({ + ignore: z.boolean(), + ignoreTasks: z.array(z.string()), + }) + ), + }), + }) + .describe( + 'Allows to override specific task within renative toolchain. (currently only `install` supported). this is useful if you want to change specific behaviour of built-in task. ie install task triggers yarn/npm install by default. but that might not be desirable installation trigger' + ), + integrations: z + .record(z.string(), z.object({})) + .describe('Object containing integration configurations where key represents package name'), // TODO: rename to mods + env: z.record(z.string(), z.any()).describe('Object containing injected env variables'), + platforms: _generatePlatformsSchema( + SchemaPlatform.extend({ + buildSchemes: z.record(z.string(), SchemaCommon.merge(_generatePlatformsSchema(SchemaPlatform))), + }) + ).describe('Object containing platform configurations'), + plugins: z + .record(z.string(), z.union([SchemaPlugin, z.string()]).nullable()) + .describe( + 'Define all plugins available in your project. you can then use `includedPlugins` and `excludedPlugins` props to define active and inactive plugins per each app config' + ), +}); + +const SchemaTemplate = z + .object({ + name: z.string().optional(), + version: z.string().optional(), + disabled: z.boolean().optional(), + includedPaths: z + .array( + z.union([ + z.string(), + z.object({ + paths: z.array(z.string()), + engines: z.array(z.string()).optional(), + platforms: zodSupportedPlatforms.optional(), + }), + ]) + ) + .describe('Defines list of all file/dir paths you want to include in template') + .optional(), + // bootstrapQuestions: BootstrapQuestionsSchema.optional(), + renative_json: z + .object({ + $schema: z.string().optional(), + extendsTemplate: z.string().optional(), + }) + .passthrough() + .optional(), + package_json: SchemaPackageJson, + }) + .describe('Used in `renative.template.json` allows you to define template behaviour.'); + +const SchemaApp = z.object({ + id: z + .string() + .describe('ID of the app in `./appConfigs/[APP_ID]/renative.json`. MUST match APP_ID name of the folder'), + custom: z + .any() + .describe( + 'Object used to extend your renative with custom props. This allows renative json schema to be validated' + ), + hidden: z + .boolean() + .describe( + 'If set to true in `./appConfigs/[APP_ID]/renative.json` the APP_ID will be hidden from list of appConfigs `-c`' + ), + extendsTemplate: z + .string() + .describe( + 'You can extend another renative.json file of currently applied template by providing relative or full package name path. Exampe: `@rnv/template-starter/renative.json`' + ), // TODO: rename to "extendsConfig" + extend: z.string().describe('extend another appConfig by id'), // TODO: rename to "extendsAppConfigID" +}); + +export const SchemaConfig: any = z + .object({ + app: SchemaApp, + project: SchemaProject, + runtime: SchemaRuntime, + template: SchemaTemplate, + plugin: SchemaPlugin, + }) + .partial(); +type PlatformsMap = { + android: T; + androidtv: T; + androidwear: T; + firetv: T; + ios: T; + tvos: T; + tizen: T; + tizenmobile: T; + tizenwatch: T; + webos: T; + web: T; + webtv: T; + chromecast: T; + kaios: T; + macos: T; + linux: T; + windows: T; + xbox: T; +}; + +export type RnvConfig = { + app: z.infer; + // project: SchemaProject, + // runtime: SchemaRuntime, + runtime: z.infer; + template: z.infer; + plugin: z.infer & PlatformsMap>; + + // plugin: SchemaPlugin, +}; + +// const kk: RnvConfig; +// kk.plugin.android. + +// DEPRECATED? +// const SplashScreen = z.object({ +// backgroundColor: z +// .string() +// .min(4) +// .max(9) +// .regex(/^#/) +// .describe('Defines root view backgroundColor for all platforms in HEX format'), +// image: z +// .string() +// .describe( +// 'Path to splash screen image. This path should be relative to `./appConfigs/base/assets` folder' +// ), +// resizeMode: z +// .string() +// .optional() +// .describe( +// 'Resize mode of splash screen image. This is specific to each platform. ie: `cover`, `contain`, `center` etc' +// ), +// style: z +// .string() +// .optional() +// .describe( +// 'Custom style for splash screen. This is specific to each platform. ie: `light-content`, `dark-content` etc' +// ), +// }); diff --git a/yarn.lock b/yarn.lock index dc4c737958..3fc7b2ddec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1940,11 +1940,6 @@ wdio-image-comparison-service "5.0.3" wdio-native-app-compare-service "2.1.0" -"@flexn/plugins@1.0.9": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@flexn/plugins/-/plugins-1.0.9.tgz#34b0c24b58729cad3efdd2ce0952645c0f23fcb5" - integrity sha512-a0a7VCZBdcuyXxWSbA7cY0/ybmxaF6rqMt8p2SNJ1Trkkv2My4XB4sS2o0by1SiMLEs9axCNPOIFcdDsepRJxg== - "@flexn/prettier-config@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@flexn/prettier-config/-/prettier-config-1.0.0.tgz#f4e4668aa880d9396831cf19f819d5dba386a38d" @@ -2679,55 +2674,55 @@ resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz#6bb788b2902e48bf5d460c38c6bb7fedd686ddd7" integrity sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ== -"@next/env@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341" - integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw== - -"@next/swc-darwin-arm64@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" - integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ== - -"@next/swc-darwin-x64@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" - integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g== - -"@next/swc-linux-arm64-gnu@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" - integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ== - -"@next/swc-linux-arm64-musl@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" - integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g== - -"@next/swc-linux-x64-gnu@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz#18967f100ec19938354332dcb0268393cbacf581" - integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ== - -"@next/swc-linux-x64-musl@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz#77077cd4ba8dda8f349dc7ceb6230e68ee3293cf" - integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== - -"@next/swc-win32-arm64-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" - integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ== - -"@next/swc-win32-ia32-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" - integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw== - -"@next/swc-win32-x64-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" - integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg== +"@next/env@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/env/-/env-14.1.4.tgz#432e80651733fbd67230bf262aee28be65252674" + integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ== + +"@next/swc-darwin-arm64@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz#a3bca0dc4393ac4cf3169bbf24df63441de66bb7" + integrity sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg== + +"@next/swc-darwin-x64@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz#ba3683d4e2d30099f3f2864dd7349a4d9f440140" + integrity sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ== + +"@next/swc-linux-arm64-gnu@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz#3519969293f16379954b7e196deb0c1eecbb2f8b" + integrity sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA== + +"@next/swc-linux-arm64-musl@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz#4bb3196bd402b3f84cf5373ff1021f547264d62f" + integrity sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g== + +"@next/swc-linux-x64-gnu@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz#1b3372c98c83dcdab946cdb4ee06e068b8139ba3" + integrity sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw== + +"@next/swc-linux-x64-musl@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz#8459088bdc872648ff78f121db596f2533df5808" + integrity sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg== + +"@next/swc-win32-arm64-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz#84280a08c00cc3be24ddd3a12f4617b108e6dea6" + integrity sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag== + +"@next/swc-win32-ia32-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz#23ff7f4bd0a27177428669ef6fa5c3923c738031" + integrity sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw== + +"@next/swc-win32-x64-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz#bccf5beccfde66d6c66fa4e2509118c796385eda" + integrity sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3231,24 +3226,24 @@ execa "^5.0.0" prompts "^2.4.0" -"@react-native-community/cli-clean@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-12.3.0.tgz#667b32daa58b4d11d5b5ab9eb0a2e216d500c90b" - integrity sha512-iAgLCOWYRGh9ukr+eVQnhkV/OqN3V2EGd/in33Ggn/Mj4uO6+oUncXFwB+yjlyaUNz6FfjudhIz09yYGSF+9sg== - dependencies: - "@react-native-community/cli-tools" "12.3.0" - chalk "^4.1.2" - execa "^5.0.0" - "@react-native-community/cli-clean@12.3.2": version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-12.3.2.tgz#d4f1730c3d22d816b4d513d330d5f3896a3f5921" + resolved "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.2.tgz#d4f1730c3d22d816b4d513d330d5f3896a3f5921" integrity sha512-90k2hCX0ddSFPT7EN7h5SZj0XZPXP0+y/++v262hssoey3nhurwF57NGWN0XAR0o9BSW7+mBfeInfabzDraO6A== dependencies: "@react-native-community/cli-tools" "12.3.2" chalk "^4.1.2" execa "^5.0.0" +"@react-native-community/cli-clean@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.6.tgz#e8a7910bebc97266fd5068649013a03958021fc4" + integrity sha512-gUU29ep8xM0BbnZjwz9MyID74KKwutq9x5iv4BCr2im6nly4UMf1B1D+V225wR7VcDGzbgWjaezsJShLLhC5ig== + dependencies: + "@react-native-community/cli-tools" "12.3.6" + chalk "^4.1.2" + execa "^5.0.0" + "@react-native-community/cli-config@11.3.7": version "11.3.7" resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.3.7.tgz#4ce95548252ecb094b576369abebf9867c95d277" @@ -3261,24 +3256,24 @@ glob "^7.1.3" joi "^17.2.1" -"@react-native-community/cli-config@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-12.3.0.tgz#255b4e5391878937a25888f452f50a968d053e3e" - integrity sha512-BrTn5ndFD9uOxO8kxBQ32EpbtOvAsQExGPI7SokdI4Zlve70FziLtTq91LTlTUgMq1InVZn/jJb3VIDk6BTInQ== +"@react-native-community/cli-config@12.3.2": + version "12.3.2" + resolved "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.2.tgz#1a5de302de4d597ff2fc9932a032134b6ec4325f" + integrity sha512-UUCzDjQgvAVL/57rL7eOuFUhd+d+6qfM7V8uOegQFeFEmSmvUUDLYoXpBa5vAK9JgQtSqMBJ1Shmwao+/oElxQ== dependencies: - "@react-native-community/cli-tools" "12.3.0" + "@react-native-community/cli-tools" "12.3.2" chalk "^4.1.2" cosmiconfig "^5.1.0" deepmerge "^4.3.0" glob "^7.1.3" joi "^17.2.1" -"@react-native-community/cli-config@12.3.2": - version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-12.3.2.tgz#1a5de302de4d597ff2fc9932a032134b6ec4325f" - integrity sha512-UUCzDjQgvAVL/57rL7eOuFUhd+d+6qfM7V8uOegQFeFEmSmvUUDLYoXpBa5vAK9JgQtSqMBJ1Shmwao+/oElxQ== +"@react-native-community/cli-config@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.6.tgz#5f0be68270217908a739c32e3155a0e354773251" + integrity sha512-JGWSYQ9EAK6m2v0abXwFLEfsqJ1zkhzZ4CV261QZF9MoUNB6h57a274h1MLQR9mG6Tsh38wBUuNfEPUvS1vYew== dependencies: - "@react-native-community/cli-tools" "12.3.2" + "@react-native-community/cli-tools" "12.3.6" chalk "^4.1.2" cosmiconfig "^5.1.0" deepmerge "^4.3.0" @@ -3292,20 +3287,20 @@ dependencies: serve-static "^1.13.1" -"@react-native-community/cli-debugger-ui@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.0.tgz#75bbb2082a369b3559e0dffa8bfeebf2a9107e3e" - integrity sha512-w3b0iwjQlk47GhZWHaeTG8kKH09NCMUJO729xSdMBXE8rlbm4kHpKbxQY9qKb6NlfWSJN4noGY+FkNZS2rRwnQ== - dependencies: - serve-static "^1.13.1" - "@react-native-community/cli-debugger-ui@12.3.2": version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.2.tgz#b2743876b03e560fbf5ef516e95387fcb6d91630" + resolved "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.2.tgz#b2743876b03e560fbf5ef516e95387fcb6d91630" integrity sha512-nSWQUL+51J682DlfcC1bjkUbQbGvHCC25jpqTwHIjmmVjYCX1uHuhPSqQKgPNdvtfOkrkACxczd7kVMmetxY2Q== dependencies: serve-static "^1.13.1" +"@react-native-community/cli-debugger-ui@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.6.tgz#418027a1ae76850079684d309a732eb378c7f690" + integrity sha512-SjUKKsx5FmcK9G6Pb6UBFT0s9JexVStK5WInmANw75Hm7YokVvHEgtprQDz2Uvy5znX5g2ujzrkIU//T15KQzA== + dependencies: + serve-static "^1.13.1" + "@react-native-community/cli-doctor@11.3.7": version "11.3.7" resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.3.7.tgz#7d5f5b1aea78134bba713fa97795986345ff1344" @@ -3330,15 +3325,15 @@ wcwidth "^1.0.1" yaml "^2.2.1" -"@react-native-community/cli-doctor@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-12.3.0.tgz#420eb4e80d482f16d431c4df33fbc203862508af" - integrity sha512-BPCwNNesoQMkKsxB08Ayy6URgGQ8Kndv6mMhIvJSNdST3J1+x3ehBHXzG9B9Vfi+DrTKRb8lmEl/b/7VkDlPkA== +"@react-native-community/cli-doctor@12.3.2": + version "12.3.2" + resolved "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.2.tgz#9e82b49f04ee03872b2975f26c8799cecac021ce" + integrity sha512-GrAabdY4qtBX49knHFvEAdLtCjkmndjTeqhYO6BhsbAeKOtspcLT/0WRgdLIaKODRa61ADNB3K5Zm4dU0QrZOg== dependencies: - "@react-native-community/cli-config" "12.3.0" - "@react-native-community/cli-platform-android" "12.3.0" - "@react-native-community/cli-platform-ios" "12.3.0" - "@react-native-community/cli-tools" "12.3.0" + "@react-native-community/cli-config" "12.3.2" + "@react-native-community/cli-platform-android" "12.3.2" + "@react-native-community/cli-platform-ios" "12.3.2" + "@react-native-community/cli-tools" "12.3.2" chalk "^4.1.2" command-exists "^1.2.8" deepmerge "^4.3.0" @@ -3353,22 +3348,21 @@ wcwidth "^1.0.1" yaml "^2.2.1" -"@react-native-community/cli-doctor@12.3.2": - version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-12.3.2.tgz#9e82b49f04ee03872b2975f26c8799cecac021ce" - integrity sha512-GrAabdY4qtBX49knHFvEAdLtCjkmndjTeqhYO6BhsbAeKOtspcLT/0WRgdLIaKODRa61ADNB3K5Zm4dU0QrZOg== +"@react-native-community/cli-doctor@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.6.tgz#f68b51bbc6554ff4837269d98e9e405044e6f1b9" + integrity sha512-fvBDv2lTthfw4WOQKkdTop2PlE9GtfrlNnpjB818MhcdEnPjfQw5YaTUcnNEGsvGomdCs1MVRMgYXXwPSN6OvQ== dependencies: - "@react-native-community/cli-config" "12.3.2" - "@react-native-community/cli-platform-android" "12.3.2" - "@react-native-community/cli-platform-ios" "12.3.2" - "@react-native-community/cli-tools" "12.3.2" + "@react-native-community/cli-config" "12.3.6" + "@react-native-community/cli-platform-android" "12.3.6" + "@react-native-community/cli-platform-ios" "12.3.6" + "@react-native-community/cli-tools" "12.3.6" chalk "^4.1.2" command-exists "^1.2.8" deepmerge "^4.3.0" envinfo "^7.10.0" execa "^5.0.0" hermes-profile-transformer "^0.0.6" - ip "^1.1.5" node-stream-zip "^1.9.1" ora "^5.4.1" semver "^7.5.2" @@ -3387,20 +3381,9 @@ hermes-profile-transformer "^0.0.6" ip "^1.1.5" -"@react-native-community/cli-hermes@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-12.3.0.tgz#c302acbfb07e1f4e73e76e3150c32f0e4f54e9ed" - integrity sha512-G6FxpeZBO4AimKZwtWR3dpXRqTvsmEqlIkkxgwthdzn3LbVjDVIXKpVYU9PkR5cnT+KuAUxO0WwthrJ6Nmrrlg== - dependencies: - "@react-native-community/cli-platform-android" "12.3.0" - "@react-native-community/cli-tools" "12.3.0" - chalk "^4.1.2" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" - "@react-native-community/cli-hermes@12.3.2": version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-12.3.2.tgz#5f266985fe32a37e9020e881460e9017870be2e5" + resolved "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.2.tgz#5f266985fe32a37e9020e881460e9017870be2e5" integrity sha512-SL6F9O8ghp4ESBFH2YAPLtIN39jdnvGBKnK4FGKpDCjtB3DnUmDsGFlH46S+GGt5M6VzfG2eeKEOKf3pZ6jUzA== dependencies: "@react-native-community/cli-platform-android" "12.3.2" @@ -3409,6 +3392,16 @@ hermes-profile-transformer "^0.0.6" ip "^1.1.5" +"@react-native-community/cli-hermes@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.6.tgz#5ac2c9ee26c69e1ce6b5047ba0f399984a6dea16" + integrity sha512-sNGwfOCl8OAIjWCkwuLpP8NZbuO0dhDI/2W7NeOGDzIBsf4/c4MptTrULWtGIH9okVPLSPX0NnRyGQ+mSwWyuQ== + dependencies: + "@react-native-community/cli-platform-android" "12.3.6" + "@react-native-community/cli-tools" "12.3.6" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + "@react-native-community/cli-platform-android@11.3.7": version "11.3.7" resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.7.tgz#7845bc48258b6bb55df208a23b3690647f113995" @@ -3420,24 +3413,24 @@ glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-android@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.0.tgz#eafa5fb12ebc25f716aea18cd55039c19fbedca6" - integrity sha512-VU1NZw63+GLU2TnyQ919bEMThpHQ/oMFju9MCfrd3pyPJz4Sn+vc3NfnTDUVA5Z5yfLijFOkHIHr4vo/C9bjnw== +"@react-native-community/cli-platform-android@12.3.2": + version "12.3.2" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.2.tgz#de54d89712f8ea95046d798ec274fd6caea70c34" + integrity sha512-MZ5nO8yi/N+Fj2i9BJcJ9C/ez+9/Ir7lQt49DWRo9YDmzye66mYLr/P2l/qxsixllbbDi7BXrlLpxaEhMrDopg== dependencies: - "@react-native-community/cli-tools" "12.3.0" + "@react-native-community/cli-tools" "12.3.2" chalk "^4.1.2" execa "^5.0.0" fast-xml-parser "^4.2.4" glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-android@12.3.2": - version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.2.tgz#de54d89712f8ea95046d798ec274fd6caea70c34" - integrity sha512-MZ5nO8yi/N+Fj2i9BJcJ9C/ez+9/Ir7lQt49DWRo9YDmzye66mYLr/P2l/qxsixllbbDi7BXrlLpxaEhMrDopg== +"@react-native-community/cli-platform-android@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.6.tgz#e1103692c659ff0b72ee6f00b7c72578db7376ec" + integrity sha512-DeDDAB8lHpuGIAPXeeD9Qu2+/wDTFPo99c8uSW49L0hkmZJixzvvvffbGQAYk32H0TmaI7rzvzH+qzu7z3891g== dependencies: - "@react-native-community/cli-tools" "12.3.2" + "@react-native-community/cli-tools" "12.3.6" chalk "^4.1.2" execa "^5.0.0" fast-xml-parser "^4.2.4" @@ -3456,24 +3449,24 @@ glob "^7.1.3" ora "^5.4.1" -"@react-native-community/cli-platform-ios@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.0.tgz#42a9185bb51f35a7eb9c5818b2f0072846945ef5" - integrity sha512-H95Sgt3wT7L8V75V0syFJDtv4YgqK5zbu69ko4yrXGv8dv2EBi6qZP0VMmkqXDamoPm9/U7tDTdbcf26ctnLfg== +"@react-native-community/cli-platform-ios@12.3.2": + version "12.3.2" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.2.tgz#07e298f69761424da85909790a43ec60ebfe6097" + integrity sha512-OcWEAbkev1IL6SUiQnM6DQdsvfsKZhRZtoBNSj9MfdmwotVZSOEZJ+IjZ1FR9ChvMWayO9ns/o8LgoQxr1ZXeg== dependencies: - "@react-native-community/cli-tools" "12.3.0" + "@react-native-community/cli-tools" "12.3.2" chalk "^4.1.2" execa "^5.0.0" fast-xml-parser "^4.0.12" glob "^7.1.3" ora "^5.4.1" -"@react-native-community/cli-platform-ios@12.3.2": - version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.2.tgz#07e298f69761424da85909790a43ec60ebfe6097" - integrity sha512-OcWEAbkev1IL6SUiQnM6DQdsvfsKZhRZtoBNSj9MfdmwotVZSOEZJ+IjZ1FR9ChvMWayO9ns/o8LgoQxr1ZXeg== +"@react-native-community/cli-platform-ios@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.6.tgz#e7decb5ee764f5fdc7a6ad1ba5e15de8929d54a5" + integrity sha512-3eZ0jMCkKUO58wzPWlvAPRqezVKm9EPZyaPyHbRPWU8qw7JqkvnRlWIaYDGpjCJgVW4k2hKsEursLtYKb188tg== dependencies: - "@react-native-community/cli-tools" "12.3.2" + "@react-native-community/cli-tools" "12.3.6" chalk "^4.1.2" execa "^5.0.0" fast-xml-parser "^4.0.12" @@ -3497,16 +3490,16 @@ metro-runtime "0.76.8" readline "^1.3.0" -"@react-native-community/cli-plugin-metro@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.0.tgz#b4ea8da691d294aee98ccfcd1162bcd958cae834" - integrity sha512-tYNHIYnNmxrBcsqbE2dAnLMzlKI3Cp1p1xUgTrNaOMsGPDN1epzNfa34n6Nps3iwKElSL7Js91CzYNqgTalucA== - "@react-native-community/cli-plugin-metro@12.3.2": version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.2.tgz#7db7dc8939b821b9aeebdd5ee3293f3a0201a2ea" + resolved "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.2.tgz#7db7dc8939b821b9aeebdd5ee3293f3a0201a2ea" integrity sha512-FpFBwu+d2E7KRhYPTkKvQsWb2/JKsJv+t1tcqgQkn+oByhp+qGyXBobFB8/R3yYvRRDCSDhS+atWTJzk9TjM8g== +"@react-native-community/cli-plugin-metro@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.6.tgz#ae62de18e998478db60a3fe10dc746162c272dbd" + integrity sha512-3jxSBQt4fkS+KtHCPSyB5auIT+KKIrPCv9Dk14FbvOaEh9erUWEm/5PZWmtboW1z7CYeNbFMeXm9fM2xwtVOpg== + "@react-native-community/cli-server-api@11.3.7": version "11.3.7" resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.3.7.tgz#2cce54b3331c9c51b9067129c297ab2e9a142216" @@ -3522,13 +3515,13 @@ serve-static "^1.13.1" ws "^7.5.1" -"@react-native-community/cli-server-api@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-12.3.0.tgz#0460472d44c121d1db8a98ad1df811200c074fb3" - integrity sha512-Rode8NrdyByC+lBKHHn+/W8Zu0c+DajJvLmOWbe2WY/ECvnwcd9MHHbu92hlT2EQaJ9LbLhGrSbQE3cQy9EOCw== +"@react-native-community/cli-server-api@12.3.2": + version "12.3.2" + resolved "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.2.tgz#11df4e20ed72d59cf22adf77bd30aff3d6e70dc9" + integrity sha512-iwa7EO9XFA/OjI5pPLLpI/6mFVqv8L73kNck3CNOJIUCCveGXBKK0VMyOkXaf/BYnihgQrXh+x5cxbDbggr7+Q== dependencies: - "@react-native-community/cli-debugger-ui" "12.3.0" - "@react-native-community/cli-tools" "12.3.0" + "@react-native-community/cli-debugger-ui" "12.3.2" + "@react-native-community/cli-tools" "12.3.2" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.1" @@ -3537,13 +3530,13 @@ serve-static "^1.13.1" ws "^7.5.1" -"@react-native-community/cli-server-api@12.3.2": - version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-12.3.2.tgz#11df4e20ed72d59cf22adf77bd30aff3d6e70dc9" - integrity sha512-iwa7EO9XFA/OjI5pPLLpI/6mFVqv8L73kNck3CNOJIUCCveGXBKK0VMyOkXaf/BYnihgQrXh+x5cxbDbggr7+Q== +"@react-native-community/cli-server-api@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.6.tgz#cd78122954a02d22c7821c365938635b51ddd1bd" + integrity sha512-80NIMzo8b2W+PL0Jd7NjiJW9mgaT8Y8wsIT/lh6mAvYH7mK0ecDJUYUTAAv79Tbo1iCGPAr3T295DlVtS8s4yQ== dependencies: - "@react-native-community/cli-debugger-ui" "12.3.2" - "@react-native-community/cli-tools" "12.3.2" + "@react-native-community/cli-debugger-ui" "12.3.6" + "@react-native-community/cli-tools" "12.3.6" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.1" @@ -3567,10 +3560,10 @@ semver "^7.5.2" shell-quote "^1.7.3" -"@react-native-community/cli-tools@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-12.3.0.tgz#d459a116e1a95034d3c9a6385069c9e2049fb2a6" - integrity sha512-2GafnCr8D88VdClwnm9KZfkEb+lzVoFdr/7ybqhdeYM0Vnt/tr2N+fM1EQzwI1DpzXiBzTYemw8GjRq+Utcz2Q== +"@react-native-community/cli-tools@12.3.2": + version "12.3.2" + resolved "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.2.tgz#d3362b04fba3f73ec82c5a493696b575acfb420c" + integrity sha512-nDH7vuEicHI2TI0jac/DjT3fr977iWXRdgVAqPZFFczlbs7A8GQvEdGnZ1G8dqRUmg+kptw0e4hwczAOG89JzQ== dependencies: appdirsjs "^1.2.4" chalk "^4.1.2" @@ -3583,10 +3576,10 @@ shell-quote "^1.7.3" sudo-prompt "^9.0.0" -"@react-native-community/cli-tools@12.3.2": - version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-12.3.2.tgz#d3362b04fba3f73ec82c5a493696b575acfb420c" - integrity sha512-nDH7vuEicHI2TI0jac/DjT3fr977iWXRdgVAqPZFFczlbs7A8GQvEdGnZ1G8dqRUmg+kptw0e4hwczAOG89JzQ== +"@react-native-community/cli-tools@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.6.tgz#c39965982347635dfaf1daa7b3c0133b3bd45e64" + integrity sha512-FPEvZn19UTMMXUp/piwKZSh8cMEfO8G3KDtOwo53O347GTcwNrKjgZGtLSPELBX2gr+YlzEft3CoRv2Qmo83fQ== dependencies: appdirsjs "^1.2.4" chalk "^4.1.2" @@ -3606,20 +3599,20 @@ dependencies: joi "^17.2.1" -"@react-native-community/cli-types@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-12.3.0.tgz#2d21a1f93aefbdb34a04311d68097aef0388704f" - integrity sha512-MgOkmrXH4zsGxhte4YqKL7d+N8ZNEd3w1wo56MZlhu5WabwCJh87wYpU5T8vyfujFLYOFuFK5jjlcbs8F4/WDw== - dependencies: - joi "^17.2.1" - "@react-native-community/cli-types@12.3.2": version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-12.3.2.tgz#0551c553c87701faae580097d7786dfff8ec2ef4" + resolved "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.2.tgz#0551c553c87701faae580097d7786dfff8ec2ef4" integrity sha512-9D0UEFqLW8JmS16mjHJxUJWX8E+zJddrHILSH8AJHZ0NNHv4u2DXKdb0wFLMobFxGNxPT+VSOjc60fGvXzWHog== dependencies: joi "^17.2.1" +"@react-native-community/cli-types@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.6.tgz#239de348800fe1ffba3eb1fe0edbeb9306981e57" + integrity sha512-xPqTgcUtZowQ8WKOkI9TLGBwH2bGggOC4d2FFaIRST3gTcjrEeGRNeR5aXCzJFIgItIft8sd7p2oKEdy90+01Q== + dependencies: + joi "^17.2.1" + "@react-native-community/cli@11.3.7": version "11.3.7" resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.3.7.tgz#564c0054269d8385fa9d301750b2e56dbb5c0cc9" @@ -3643,33 +3636,9 @@ prompts "^2.4.0" semver "^7.5.2" -"@react-native-community/cli@12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-12.3.0.tgz#c89aacc3973943bf24002255d7d0859b511d88a1" - integrity sha512-XeQohi2E+S2+MMSz97QcEZ/bWpi8sfKiQg35XuYeJkc32Til2g0b97jRpn0/+fV0BInHoG1CQYWwHA7opMsrHg== - dependencies: - "@react-native-community/cli-clean" "12.3.0" - "@react-native-community/cli-config" "12.3.0" - "@react-native-community/cli-debugger-ui" "12.3.0" - "@react-native-community/cli-doctor" "12.3.0" - "@react-native-community/cli-hermes" "12.3.0" - "@react-native-community/cli-plugin-metro" "12.3.0" - "@react-native-community/cli-server-api" "12.3.0" - "@react-native-community/cli-tools" "12.3.0" - "@react-native-community/cli-types" "12.3.0" - chalk "^4.1.2" - commander "^9.4.1" - deepmerge "^4.3.0" - execa "^5.0.0" - find-up "^4.1.0" - fs-extra "^8.1.0" - graceful-fs "^4.1.3" - prompts "^2.4.2" - semver "^7.5.2" - "@react-native-community/cli@12.3.2": version "12.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-12.3.2.tgz#002ae3683b9fe6b0a83a837f41d9db541ea7667f" + resolved "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.2.tgz#002ae3683b9fe6b0a83a837f41d9db541ea7667f" integrity sha512-WgoUWwLDcf/G1Su2COUUVs3RzAwnV/vUTdISSpAUGgSc57mPabaAoUctKTnfYEhCnE3j02k3VtaVPwCAFRO3TQ== dependencies: "@react-native-community/cli-clean" "12.3.2" @@ -3691,6 +3660,30 @@ prompts "^2.4.2" semver "^7.5.2" +"@react-native-community/cli@12.3.6": + version "12.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.6.tgz#7a323b78725b959bb8a31cca1145918263ff3c8d" + integrity sha512-647OSi6xBb8FbwFqX9zsJxOzu685AWtrOUWHfOkbKD+5LOpGORw+GQo0F9rWZnB68rLQyfKUZWJeaD00pGv5fw== + dependencies: + "@react-native-community/cli-clean" "12.3.6" + "@react-native-community/cli-config" "12.3.6" + "@react-native-community/cli-debugger-ui" "12.3.6" + "@react-native-community/cli-doctor" "12.3.6" + "@react-native-community/cli-hermes" "12.3.6" + "@react-native-community/cli-plugin-metro" "12.3.6" + "@react-native-community/cli-server-api" "12.3.6" + "@react-native-community/cli-tools" "12.3.6" + "@react-native-community/cli-types" "12.3.6" + chalk "^4.1.2" + commander "^9.4.1" + deepmerge "^4.3.0" + execa "^5.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + graceful-fs "^4.1.3" + prompts "^2.4.2" + semver "^7.5.2" + "@react-native-community/push-notification-ios@1.11.0": version "1.11.0" resolved "https://registry.yarnpkg.com/@react-native-community/push-notification-ios/-/push-notification-ios-1.11.0.tgz#d8ec4acfb52260cb779ed0379b9e197db7841b83" @@ -3706,6 +3699,14 @@ opencollective-postinstall "^2.0.3" superstruct "^0.6.2" +"@react-native-tvos/virtualized-lists@0.73.6-0": + version "0.73.6-0" + resolved "https://registry.npmjs.org/@react-native-tvos/virtualized-lists/-/virtualized-lists-0.73.6-0.tgz#9ba4b53aa79ac36230be5f86e905c1e3e7f8c6af" + integrity sha512-hnLlHHUeVW8sNKCmxcCTTI/X8sZEtsxhcSnMy3RvFCLH8/58WK6jOAWYiUnSYoUItdrhZmN8EI09I83tfKdRmA== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" + "@react-native-windows/cli@0.72.3": version "0.72.3" resolved "https://registry.yarnpkg.com/@react-native-windows/cli/-/cli-0.72.3.tgz#4e30f91cbc976d5c05e3bf28ffe43245c38831b6" @@ -3813,7 +3814,7 @@ dependencies: "@react-native/codegen" "0.73.3" -"@react-native/babel-preset@*", "@react-native/babel-preset@0.73.20": +"@react-native/babel-preset@*": version "0.73.20" resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.73.20.tgz#65ab68cce16bb222bb1faece498abb6f7b1d5db0" integrity sha512-fU9NqkusbfFq71l4BWQfqqD/lLcLC0MZ++UYgieA3j8lIEppJTLVauv2RwtD2yltBkjebgYEC5Rwvt1l0MUBXw== @@ -3948,23 +3949,6 @@ mkdirp "^0.5.1" nullthrows "^1.1.1" -"@react-native/community-cli-plugin@0.73.11": - version "0.73.11" - resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.11.tgz#8826cb81bb794408202e1ce7d87e45710eff1a9f" - integrity sha512-s0bprwljKS1Al8wOKathDDmRyF+70CcNE2G/aqZ7+L0NoOE0Uxxx/5P2BxlM2Mfht7O33B4SeMNiPdE/FqIubQ== - dependencies: - "@react-native-community/cli-server-api" "12.3.0" - "@react-native-community/cli-tools" "12.3.0" - "@react-native/dev-middleware" "^0.73.6" - "@react-native/metro-babel-transformer" "^0.73.12" - chalk "^4.0.0" - execa "^5.1.1" - metro "^0.80.0" - metro-config "^0.80.0" - metro-core "^0.80.0" - node-fetch "^2.2.0" - readline "^1.3.0" - "@react-native/community-cli-plugin@0.73.16": version "0.73.16" resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.16.tgz#29dca91aa3e24c8cd534dbf3db5766509da92ea3" @@ -3982,14 +3966,31 @@ node-fetch "^2.2.0" readline "^1.3.0" +"@react-native/community-cli-plugin@0.73.17": + version "0.73.17" + resolved "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.17.tgz#37b381a8b503a3296eaa6727e0c52ea8835add28" + integrity sha512-F3PXZkcHg+1ARIr6FRQCQiB7ZAA+MQXGmq051metRscoLvgYJwj7dgC8pvgy0kexzUkHu5BNKrZeySzUft3xuQ== + dependencies: + "@react-native-community/cli-server-api" "12.3.6" + "@react-native-community/cli-tools" "12.3.6" + "@react-native/dev-middleware" "0.73.8" + "@react-native/metro-babel-transformer" "0.73.15" + chalk "^4.0.0" + execa "^5.1.1" + metro "^0.80.3" + metro-config "^0.80.3" + metro-core "^0.80.3" + node-fetch "^2.2.0" + readline "^1.3.0" + "@react-native/debugger-frontend@0.73.3": version "0.73.3" resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz#033757614d2ada994c68a1deae78c1dd2ad33c2b" integrity sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw== -"@react-native/dev-middleware@0.73.7", "@react-native/dev-middleware@^0.73.6": +"@react-native/dev-middleware@0.73.7": version "0.73.7" - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.73.7.tgz#61d2bf08973d9a537fa3f2a42deeb13530d721ae" + resolved "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.7.tgz#61d2bf08973d9a537fa3f2a42deeb13530d721ae" integrity sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg== dependencies: "@isaacs/ttlcache" "^1.4.1" @@ -4003,6 +4004,23 @@ serve-static "^1.13.1" temp-dir "^2.0.0" +"@react-native/dev-middleware@0.73.8": + version "0.73.8" + resolved "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.8.tgz#2e43722a00c7b8db753f747f40267cbad6caba4d" + integrity sha512-oph4NamCIxkMfUL/fYtSsE+JbGOnrlawfQ0kKtDQ5xbOjPKotKoXqrs1eGwozNKv7FfQ393stk1by9a6DyASSg== + dependencies: + "@isaacs/ttlcache" "^1.4.1" + "@react-native/debugger-frontend" "0.73.3" + chrome-launcher "^0.15.2" + chromium-edge-launcher "^1.0.0" + connect "^3.6.5" + debug "^2.2.0" + node-fetch "^2.2.0" + open "^7.0.3" + serve-static "^1.13.1" + temp-dir "^2.0.0" + ws "^6.2.2" + "@react-native/gradle-plugin@0.73.4": version "0.73.4" resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.73.4.tgz#aa55784a8c2b471aa89934db38c090d331baf23b" @@ -4033,16 +4051,6 @@ hermes-parser "0.15.0" nullthrows "^1.1.1" -"@react-native/metro-babel-transformer@^0.73.12": - version "0.73.14" - resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.14.tgz#a4ee02c729216e4ab5b7c7aa28abbfe8e0a943a8" - integrity sha512-5wLeYw/lormpSqYfI9H/geZ/EtPmi+x5qLkEit15Q/70hkzYo/M+aWztUtbOITfgTEOP8d6ybROzoGsqgyZLcw== - dependencies: - "@babel/core" "^7.20.0" - "@react-native/babel-preset" "0.73.20" - hermes-parser "0.15.0" - nullthrows "^1.1.1" - "@react-native/metro-babel-transformer@^0.74.0": version "0.74.0" resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.0.tgz#ed84c03621ae0d9f985def55153fc35e8a062618" @@ -8103,6 +8111,11 @@ command-exists@1.2.9, command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +commander@12.0.0: + version "12.0.0" + resolved "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" + integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== + "commander@^10.0.0 ": version "10.0.1" resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -14548,7 +14561,7 @@ metro-config@0.76.8: metro-core "0.76.8" metro-runtime "0.76.8" -metro-config@0.80.5, metro-config@^0.80.0, metro-config@^0.80.3: +metro-config@0.80.5, metro-config@^0.80.3: version "0.80.5" resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.5.tgz#859e2ce307372f583bc8ebfe69bd233dd9328a8b" integrity sha512-elqo/lwvF+VjZ1OPyvmW/9hSiGlmcqu+rQvDKw5F5WMX48ZC+ySTD1WcaD7e97pkgAlJHVYqZ98FCjRAYOAFRQ== @@ -14569,7 +14582,7 @@ metro-core@0.76.8: lodash.throttle "^4.1.1" metro-resolver "0.76.8" -metro-core@0.80.5, metro-core@^0.80.0, metro-core@^0.80.3: +metro-core@0.80.5, metro-core@^0.80.3: version "0.80.5" resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.5.tgz#3ead635dcecfa6d0b380f8a80d3e5406f70846a9" integrity sha512-vkLuaBhnZxTVpaZO8ZJVEHzjaqSXpOdpAiztSZ+NDaYM6jEFgle3/XIbLW91jTSf2+T8Pj5yB1G7KuOX+BcVwg== @@ -14721,7 +14734,7 @@ metro-runtime@0.76.8: "@babel/runtime" "^7.0.0" react-refresh "^0.4.0" -metro-runtime@0.80.5, metro-runtime@^0.80.0, metro-runtime@^0.80.3: +metro-runtime@0.80.5, metro-runtime@^0.80.3: version "0.80.5" resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.5.tgz#48ac4c732be195e0ebdefb5ac5d32c7da76305ad" integrity sha512-L0syTWJUdWzfUmKgkScr6fSBVTh6QDr8eKEkRtn40OBd8LPagrJGySBboWSgbyn9eIb4ayW3Y347HxgXBSAjmg== @@ -14742,7 +14755,7 @@ metro-source-map@0.76.8: source-map "^0.5.6" vlq "^1.0.0" -metro-source-map@0.80.5, metro-source-map@^0.80.0, metro-source-map@^0.80.3: +metro-source-map@0.80.5, metro-source-map@^0.80.3: version "0.80.5" resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.5.tgz#21acdc1d5417cf3009209555d84cbeb61de5d6d5" integrity sha512-DwSF4l03mKPNqCtyQ6K23I43qzU1BViAXnuH81eYWdHglP+sDlPpY+/7rUahXEo6qXEHXfAJgVoo1sirbXbmsQ== @@ -14892,7 +14905,7 @@ metro@0.76.8: ws "^7.5.1" yargs "^17.6.2" -metro@0.80.5, metro@^0.80.0, metro@^0.80.3: +metro@0.80.5, metro@^0.80.3: version "0.80.5" resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.5.tgz#94cd36df2eab434f050314a6d31529e8dc1b26df" integrity sha512-OE/CGbOgbi8BlTN1QqJgKOBaC27dS0JBQw473JcivrpgVnqIsluROA7AavEaTVUrB9wPUZvoNVDROn5uiM2jfw== @@ -15495,12 +15508,12 @@ next-images@1.8.4: file-loader "^6.2.0" url-loader "^4.1.0" -next@14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69" - integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== +next@14.1.4: + version "14.1.4" + resolved "https://registry.npmjs.org/next/-/next-14.1.4.tgz#203310f7310578563fd5c961f0db4729ce7a502d" + integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ== dependencies: - "@next/env" "14.1.0" + "@next/env" "14.1.4" "@swc/helpers" "0.5.2" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -15508,15 +15521,15 @@ next@14.1.0: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.1.0" - "@next/swc-darwin-x64" "14.1.0" - "@next/swc-linux-arm64-gnu" "14.1.0" - "@next/swc-linux-arm64-musl" "14.1.0" - "@next/swc-linux-x64-gnu" "14.1.0" - "@next/swc-linux-x64-musl" "14.1.0" - "@next/swc-win32-arm64-msvc" "14.1.0" - "@next/swc-win32-ia32-msvc" "14.1.0" - "@next/swc-win32-x64-msvc" "14.1.0" + "@next/swc-darwin-arm64" "14.1.4" + "@next/swc-darwin-x64" "14.1.4" + "@next/swc-linux-arm64-gnu" "14.1.4" + "@next/swc-linux-arm64-musl" "14.1.4" + "@next/swc-linux-x64-gnu" "14.1.4" + "@next/swc-linux-x64-musl" "14.1.4" + "@next/swc-win32-arm64-msvc" "14.1.4" + "@next/swc-win32-ia32-msvc" "14.1.4" + "@next/swc-win32-x64-msvc" "14.1.4" nice-try@^1.0.4: version "1.0.5" @@ -17981,31 +17994,37 @@ react-native-permissions@4.1.4: dependencies: pod-installer "0.0.0" +react-native-safe-area-context@4.9.0: + version "4.9.0" + resolved "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.9.0.tgz#21a570ca3594cb4259ba65f93befaa60d91bcbd0" + integrity sha512-/OJD9Pb8IURyvn+1tWTszWPJqsbZ4hyHBU9P0xhOmk7h5owSuqL0zkfagU0pg7Vh0G2NKQkaPpUKUMMCUMDh/w== + react-native-splash-screen@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/react-native-splash-screen/-/react-native-splash-screen-3.3.0.tgz#3af71ed17afe50fee69590a45aec399d071ead02" integrity sha512-rGjt6HkoSXxMqH4SQUJ1gnPQlPJV8+J47+4yhgTIan4bVvAwJhEeJH7wWt9hXSdH4+VfwTS0GTaflj1Tw83IhA== -react-native-tvos@0.73.1-3: - version "0.73.1-3" - resolved "https://registry.yarnpkg.com/react-native-tvos/-/react-native-tvos-0.73.1-3.tgz#fa77431e4aaa312a2e59cab17f40ce7e5fb512bf" - integrity sha512-/T2HXOczNZ2OyB1TtWGDaiCB/aHPaTaAZ/xrNKyhMtIt/LHEQyJkLuFxP48Y4WPb+r5GavL/LBt0j+E09O3FEg== +react-native-tvos@0.73.6-0: + version "0.73.6-0" + resolved "https://registry.npmjs.org/react-native-tvos/-/react-native-tvos-0.73.6-0.tgz#c1f362a07beec36320c5f7a1f58494e57b7741ff" + integrity sha512-1zZGSwjXWE5056LJaDgtHpRI0blabx5TIOhT4A5d+9kL1TAVwLf9XiHTLWAhU00FrG4LCi5B+8mMmCM6IsefIw== dependencies: "@jest/create-cache-key-function" "^29.6.3" - "@react-native-community/cli" "12.3.0" - "@react-native-community/cli-platform-android" "12.3.0" - "@react-native-community/cli-platform-ios" "12.3.0" + "@react-native-community/cli" "12.3.6" + "@react-native-community/cli-platform-android" "12.3.6" + "@react-native-community/cli-platform-ios" "12.3.6" + "@react-native-tvos/virtualized-lists" "0.73.6-0" "@react-native/assets-registry" "0.73.1" - "@react-native/codegen" "0.73.2" - "@react-native/community-cli-plugin" "0.73.11" + "@react-native/codegen" "0.73.3" + "@react-native/community-cli-plugin" "0.73.17" "@react-native/gradle-plugin" "0.73.4" "@react-native/js-polyfills" "0.73.1" "@react-native/normalize-colors" "0.73.2" - "@react-native/virtualized-lists" "0.73.4" abort-controller "^3.0.0" anser "^1.4.9" ansi-regex "^5.0.0" base64-js "^1.5.1" + chalk "^4.0.0" deprecated-react-native-prop-types "^5.0.0" event-target-shim "^5.0.1" flow-enums-runtime "^0.0.6" @@ -18013,8 +18032,8 @@ react-native-tvos@0.73.1-3: jest-environment-node "^29.6.3" jsc-android "^250231.0.0" memoize-one "^5.0.0" - metro-runtime "^0.80.0" - metro-source-map "^0.80.0" + metro-runtime "^0.80.3" + metro-source-map "^0.80.3" mkdirp "^0.5.1" nullthrows "^1.1.1" pretty-format "^26.5.2" @@ -19817,7 +19836,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -19905,7 +19933,7 @@ stringify-object@^3.2.1, stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -19919,6 +19947,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -20676,6 +20711,11 @@ type-fest@3.13.1, type-fest@^3.8.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== +type-fest@4.14.0: + version "4.14.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.14.0.tgz#46f9a358e605f0ec5ca99ab83deaa7257a7ae379" + integrity sha512-on5/Cw89wwqGZQu+yWO0gGMGu8VNxsaW9SB2HE8yJjllEk7IDTwnSN1dUVldYILhYPN5HzD7WAaw2cc/jBfn0Q== + type-fest@4.9.0: version "4.9.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.9.0.tgz#d29c8efe5b1e703feeb29cef23d887b2f479844d" @@ -21944,7 +21984,16 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@7.0.0, wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==