create-react-native-library 0.51.1 → 0.52.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/lib/constants.js +1 -1
  2. package/lib/constants.js.map +1 -1
  3. package/lib/exampleApp/generateExampleApp.js +1 -1
  4. package/lib/exampleApp/generateExampleApp.js.map +1 -1
  5. package/lib/index.js +1 -1
  6. package/lib/index.js.map +1 -1
  7. package/lib/input.js +18 -5
  8. package/lib/input.js.map +1 -1
  9. package/lib/template.js +14 -3
  10. package/lib/template.js.map +1 -1
  11. package/package.json +2 -2
  12. package/templates/common/$.gitattributes +1 -1
  13. package/templates/common/$.github/actions/setup/action.yml +3 -3
  14. package/templates/common/$.github/workflows/ci.yml +13 -13
  15. package/templates/common/$package.json +5 -5
  16. package/templates/common/CONTRIBUTING.md +5 -3
  17. package/templates/common/README.md +9 -3
  18. package/templates/common/eslint.config.mjs +2 -14
  19. package/templates/native-common/android/build.gradle +8 -16
  20. package/templates/native-common/{%- project.name %}.podspec +2 -7
  21. package/templates/nitro-module/android/src/main/java/com/{{%- project.package_dir %} → margelo/nitro/{%- project.package_dir %}}/{%- project.name %}Package.kt +1 -1
  22. package/templates/nitro-view/android/CMakeLists.txt +24 -0
  23. package/templates/nitro-view/android/src/main/cpp/cpp-adapter.cpp +6 -0
  24. package/templates/nitro-view/android/src/main/java/com/margelo/nitro/{%- project.package_dir %}/{%- project.name %}.kt +23 -0
  25. package/templates/nitro-view/android/src/main/java/com/margelo/nitro/{%- project.package_dir %}/{%- project.name %}Package.kt +29 -0
  26. package/templates/nitro-view/ios/{%- project.name %}.swift +28 -0
  27. package/templates/nitro-view/nitro.json +17 -0
  28. package/templates/nitro-view/src/index.tsx +11 -0
  29. package/templates/nitro-view/src/{%- project.name %}.nitro.ts +15 -0
package/lib/constants.js CHANGED
@@ -5,6 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.SUPPORTED_REACT_NATIVE_VERSION = exports.FALLBACK_NITRO_MODULES_VERSION = exports.FALLBACK_BOB_VERSION = void 0;
7
7
  const FALLBACK_BOB_VERSION = exports.FALLBACK_BOB_VERSION = '0.40.8';
8
- const FALLBACK_NITRO_MODULES_VERSION = exports.FALLBACK_NITRO_MODULES_VERSION = '0.25.2';
8
+ const FALLBACK_NITRO_MODULES_VERSION = exports.FALLBACK_NITRO_MODULES_VERSION = '0.26.2';
9
9
  const SUPPORTED_REACT_NATIVE_VERSION = exports.SUPPORTED_REACT_NATIVE_VERSION = '0.79.2';
10
10
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["FALLBACK_BOB_VERSION","exports","FALLBACK_NITRO_MODULES_VERSION","SUPPORTED_REACT_NATIVE_VERSION"],"sources":["../src/constants.ts"],"sourcesContent":["export const FALLBACK_BOB_VERSION = '0.40.8';\nexport const FALLBACK_NITRO_MODULES_VERSION = '0.25.2';\nexport const SUPPORTED_REACT_NATIVE_VERSION = '0.79.2';\n"],"mappings":";;;;;;AAAO,MAAMA,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,GAAG,QAAQ;AACrC,MAAME,8BAA8B,GAAAD,OAAA,CAAAC,8BAAA,GAAG,QAAQ;AAC/C,MAAMC,8BAA8B,GAAAF,OAAA,CAAAE,8BAAA,GAAG,QAAQ","ignoreList":[]}
1
+ {"version":3,"file":"constants.js","names":["FALLBACK_BOB_VERSION","exports","FALLBACK_NITRO_MODULES_VERSION","SUPPORTED_REACT_NATIVE_VERSION"],"sources":["../src/constants.ts"],"sourcesContent":["export const FALLBACK_BOB_VERSION = '0.40.8';\nexport const FALLBACK_NITRO_MODULES_VERSION = '0.26.2';\nexport const SUPPORTED_REACT_NATIVE_VERSION = '0.79.2';\n"],"mappings":";;;;;;AAAO,MAAMA,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,GAAG,QAAQ;AACrC,MAAME,8BAA8B,GAAAD,OAAA,CAAAC,8BAAA,GAAG,QAAQ;AAC/C,MAAMC,8BAA8B,GAAAF,OAAA,CAAAE,8BAAA,GAAG,QAAQ","ignoreList":[]}
@@ -111,7 +111,7 @@ async function generateExampleApp({
111
111
  'react-native-builder-bob': `^${config.versions.bob}`,
112
112
  'react-native-monorepo-config': `^0.1.9`
113
113
  };
114
- if (config.project.moduleConfig === 'nitro-modules') {
114
+ if (config.project.moduleConfig === 'nitro-modules' || config.project.viewConfig === 'nitro-view') {
115
115
  const packagesToAddNitro = {
116
116
  'react-native-nitro-modules': `^${config.versions.nitro || 'latest'}`
117
117
  };
@@ -1 +1 @@
1
- {"version":3,"file":"generateExampleApp.js","names":["_fsExtra","_interopRequireDefault","require","_getLatestVersion","_https","_path","_sortObjectKeys","_spawn","e","__esModule","default","FILES_TO_DELETE","PACKAGES_TO_REMOVE","PACKAGES_TO_ADD_WEB","generateExampleApp","config","root","reactNativeVersion","directory","path","join","args","example","project","name","package","matchedReactNativeVersion","test","getLatestVersion","range","Error","spawn","env","process","npm_config_yes","file","fs","remove","pkg","readJSON","slug","jest","scripts","dependencies","devDependencies","lint","SCRIPTS_TO_ADD","Object","assign","androidBuild","iosBuild","app","android","ios","bundleIdentifier","writeJSON","spaces","forEach","PACKAGES_TO_ADD_DEV","versions","bob","moduleConfig","packagesToAddNitro","nitro","sdkVersion","expo","split","replace","bundledNativeModules","Promise","resolve","reject","https","get","res","data","on","chunk","JSON","parse","entries","version","web","field","sortObjectKeys","gradleProperties","readFile","podfile","writeFile","includes"],"sources":["../../src/exampleApp/generateExampleApp.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport getLatestVersion from 'get-latest-version';\nimport https from 'https';\nimport path from 'path';\nimport type { TemplateConfiguration } from '../template';\nimport sortObjectKeys from '../utils/sortObjectKeys';\nimport { spawn } from '../utils/spawn';\n\nconst FILES_TO_DELETE = [\n '__tests__',\n '.buckconfig',\n '.eslintrc.js',\n '.flowconfig',\n '.git',\n '.gitignore',\n '.prettierrc.js',\n 'App.js',\n 'App.tsx',\n 'index.js',\n 'tsconfig.json',\n];\n\nconst PACKAGES_TO_REMOVE = [\n '@react-native/eslint-config',\n '@tsconfig/react-native',\n '@types/jest',\n '@types/react-test-renderer',\n '@typescript-eslint/eslint-plugin',\n '@typescript-eslint/parser',\n 'babel-jest',\n 'eslint',\n 'jest',\n 'prettier',\n 'react-test-renderer',\n 'typescript',\n];\n\nconst PACKAGES_TO_ADD_WEB = {\n '@expo/metro-runtime': '~3.2.1',\n 'react-dom': '18.2.0',\n 'react-native-web': '~0.18.10',\n};\n\nexport default async function generateExampleApp({\n config,\n root,\n reactNativeVersion = 'latest',\n}: {\n config: TemplateConfiguration;\n root: string;\n reactNativeVersion?: string;\n}) {\n const directory = path.join(root, 'example');\n\n let args: string[] = [];\n\n switch (config.example) {\n case 'vanilla':\n // `npx @react-native-community/cli init <projectName> --directory example --skip-install`\n args = [\n `@react-native-community/cli`,\n 'init',\n `${config.project.name}Example`,\n '--package-name',\n `${config.project.package}.example`,\n '--directory',\n directory,\n '--version',\n reactNativeVersion,\n '--skip-install',\n '--skip-git-init',\n '--pm',\n 'npm',\n ];\n break;\n case 'test-app':\n {\n // Test App requires React Native version to be a semver version\n const matchedReactNativeVersion = /(\\d+\\.\\d+[-.0-9a-z]*)/.test(\n reactNativeVersion\n )\n ? reactNativeVersion\n : await getLatestVersion('react-native', {\n range: reactNativeVersion,\n });\n\n if (!matchedReactNativeVersion) {\n throw new Error(\n `Could not find a matching version for react-native: ${reactNativeVersion}`\n );\n }\n\n // `npx --package react-native-test-app@latest init --name ${projectName}Example --destination example --version ${reactNativeVersion}`\n args = [\n '--package',\n `react-native-test-app@latest`,\n 'init',\n '--name',\n `${config.project.name}Example`,\n `--destination`,\n directory,\n '--version',\n matchedReactNativeVersion,\n '--platform',\n 'ios',\n '--platform',\n 'android',\n ];\n }\n break;\n case 'expo':\n // `npx create-expo-app example --no-install --template blank`\n args = [\n 'create-expo-app@latest',\n directory,\n '--no-install',\n '--template',\n 'blank',\n ];\n break;\n case 'none': {\n // Do nothing\n }\n }\n\n await spawn('npx', args, {\n env: { ...process.env, npm_config_yes: 'true' },\n });\n\n // Remove unnecessary files and folders\n for (const file of FILES_TO_DELETE) {\n await fs.remove(path.join(directory, file));\n }\n\n // Patch the example app's package.json\n const pkg = await fs.readJSON(path.join(directory, 'package.json'));\n\n pkg.name = `${config.project.slug}-example`;\n\n // Remove Jest config for now\n delete pkg.jest;\n\n const { scripts, dependencies, devDependencies } = pkg;\n\n delete scripts.test;\n delete scripts.lint;\n\n const SCRIPTS_TO_ADD = {\n 'build:android':\n 'react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a\"',\n 'build:ios': `react-native build-ios --mode Debug`,\n };\n\n if (config.example === 'vanilla') {\n Object.assign(scripts, SCRIPTS_TO_ADD);\n } else if (config.example === 'test-app') {\n // `react-native-test-app` doesn't bundle application by default in 'Release' mode and also `bundle` command doesn't create a directory.\n // `mkdist` script should be removed after stable React Native major contains this fix: https://github.com/facebook/react-native/pull/45182.\n\n const androidBuild = [\n 'npm run mkdist',\n 'react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist',\n SCRIPTS_TO_ADD['build:android'],\n ].join(' && ');\n\n const iosBuild = [\n 'npm run mkdist',\n 'react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist',\n SCRIPTS_TO_ADD['build:ios'],\n ].join(' && ');\n\n Object.assign(scripts, {\n 'build:android': androidBuild,\n 'build:ios': iosBuild,\n });\n\n const app = await fs.readJSON(path.join(directory, 'app.json'));\n\n app.android = app.android || {};\n app.android.package = `${config.project.package}.example`;\n app.ios = app.ios || {};\n app.ios.bundleIdentifier = `${config.project.package}.example`;\n\n await fs.writeJSON(path.join(directory, 'app.json'), app, {\n spaces: 2,\n });\n }\n\n PACKAGES_TO_REMOVE.forEach((name) => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete devDependencies[name];\n });\n\n const PACKAGES_TO_ADD_DEV = {\n 'react-native-builder-bob': `^${config.versions.bob}`,\n 'react-native-monorepo-config': `^0.1.9`,\n };\n\n if (config.project.moduleConfig === 'nitro-modules') {\n const packagesToAddNitro = {\n 'react-native-nitro-modules': `^${config.versions.nitro || 'latest'}`,\n };\n\n Object.assign(dependencies, packagesToAddNitro);\n }\n\n Object.assign(devDependencies, PACKAGES_TO_ADD_DEV);\n\n if (config.example === 'expo') {\n const sdkVersion: string = dependencies.expo\n .split('.')[0]\n .replace(/[^\\d]/, '');\n\n let bundledNativeModules: Record<string, string>;\n\n try {\n bundledNativeModules = await new Promise((resolve, reject) => {\n https\n .get(\n `https://raw.githubusercontent.com/expo/expo/sdk-${sdkVersion}/packages/expo/bundledNativeModules.json`,\n (res) => {\n let data = '';\n\n res.on('data', (chunk: string) => (data += chunk));\n res.on('end', () => {\n try {\n resolve(JSON.parse(data));\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(e);\n }\n });\n }\n )\n .on('error', reject);\n });\n } catch (e) {\n bundledNativeModules = {};\n }\n\n Object.entries(PACKAGES_TO_ADD_WEB).forEach(([name, version]) => {\n dependencies[name] = bundledNativeModules[name] || version;\n });\n\n scripts.web = 'expo start --web';\n\n const app = await fs.readJSON(path.join(directory, 'app.json'));\n\n app.expo.android = app.expo.android || {};\n app.expo.android.package = `${config.project.package}.example`;\n app.expo.ios = app.expo.ios || {};\n app.expo.ios.bundleIdentifier = `${config.project.package}.example`;\n\n await fs.writeJSON(path.join(directory, 'app.json'), app, {\n spaces: 2,\n });\n }\n\n // Sort the deps by name to match behavior of package managers\n // This way the package.json doesn't get updated when installing deps\n for (const field of ['dependencies', 'devDependencies']) {\n if (pkg[field]) {\n pkg[field] = sortObjectKeys(pkg[field]);\n }\n }\n\n await fs.writeJSON(path.join(directory, 'package.json'), pkg, {\n spaces: 2,\n });\n\n if (config.example !== 'expo') {\n let gradleProperties = await fs.readFile(\n path.join(directory, 'android', 'gradle.properties'),\n 'utf8'\n );\n\n // Disable Jetifier.\n // Remove this when the app template is updated.\n gradleProperties = gradleProperties.replace(\n 'android.enableJetifier=true',\n 'android.enableJetifier=false'\n );\n\n // Enable new arch for iOS and Android\n // iOS\n // Add ENV['RCT_NEW_ARCH_ENABLED'] = 1 on top of example/ios/Podfile\n const podfile = await fs.readFile(\n path.join(directory, 'ios', 'Podfile'),\n 'utf8'\n );\n\n await fs.writeFile(\n path.join(directory, 'ios', 'Podfile'),\n \"ENV['RCT_NEW_ARCH_ENABLED'] = '1'\\n\\n\" + podfile\n );\n\n // Android\n // Make sure newArchEnabled=true is present in android/gradle.properties\n if (gradleProperties.split('\\n').includes('#newArchEnabled=true')) {\n gradleProperties = gradleProperties.replace(\n '#newArchEnabled=true',\n 'newArchEnabled=true'\n );\n } else if (gradleProperties.split('\\n').includes('newArchEnabled=false')) {\n gradleProperties = gradleProperties.replace(\n 'newArchEnabled=false',\n 'newArchEnabled=true'\n );\n } else if (!gradleProperties.split('\\n').includes('newArchEnabled=true')) {\n gradleProperties += '\\nnewArchEnabled=true';\n }\n\n await fs.writeFile(\n path.join(directory, 'android', 'gradle.properties'),\n gradleProperties\n );\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,KAAA,GAAAJ,sBAAA,CAAAC,OAAA;AAEA,IAAAI,eAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AAAuC,SAAAD,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEvC,MAAMG,eAAe,GAAG,CACtB,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACb,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,UAAU,EACV,eAAe,CAChB;AAED,MAAMC,kBAAkB,GAAG,CACzB,6BAA6B,EAC7B,wBAAwB,EACxB,aAAa,EACb,4BAA4B,EAC5B,kCAAkC,EAClC,2BAA2B,EAC3B,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,UAAU,EACV,qBAAqB,EACrB,YAAY,CACb;AAED,MAAMC,mBAAmB,GAAG;EAC1B,qBAAqB,EAAE,QAAQ;EAC/B,WAAW,EAAE,QAAQ;EACrB,kBAAkB,EAAE;AACtB,CAAC;AAEc,eAAeC,kBAAkBA,CAAC;EAC/CC,MAAM;EACNC,IAAI;EACJC,kBAAkB,GAAG;AAKvB,CAAC,EAAE;EACD,MAAMC,SAAS,GAAGC,aAAI,CAACC,IAAI,CAACJ,IAAI,EAAE,SAAS,CAAC;EAE5C,IAAIK,IAAc,GAAG,EAAE;EAEvB,QAAQN,MAAM,CAACO,OAAO;IACpB,KAAK,SAAS;MACZ;MACAD,IAAI,GAAG,CACL,6BAA6B,EAC7B,MAAM,EACN,GAAGN,MAAM,CAACQ,OAAO,CAACC,IAAI,SAAS,EAC/B,gBAAgB,EAChB,GAAGT,MAAM,CAACQ,OAAO,CAACE,OAAO,UAAU,EACnC,aAAa,EACbP,SAAS,EACT,WAAW,EACXD,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,EACN,KAAK,CACN;MACD;IACF,KAAK,UAAU;MACb;QACE;QACA,MAAMS,yBAAyB,GAAG,uBAAuB,CAACC,IAAI,CAC5DV,kBACF,CAAC,GACGA,kBAAkB,GAClB,MAAM,IAAAW,yBAAgB,EAAC,cAAc,EAAE;UACrCC,KAAK,EAAEZ;QACT,CAAC,CAAC;QAEN,IAAI,CAACS,yBAAyB,EAAE;UAC9B,MAAM,IAAII,KAAK,CACb,uDAAuDb,kBAAkB,EAC3E,CAAC;QACH;;QAEA;QACAI,IAAI,GAAG,CACL,WAAW,EACX,8BAA8B,EAC9B,MAAM,EACN,QAAQ,EACR,GAAGN,MAAM,CAACQ,OAAO,CAACC,IAAI,SAAS,EAC/B,eAAe,EACfN,SAAS,EACT,WAAW,EACXQ,yBAAyB,EACzB,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,SAAS,CACV;MACH;MACA;IACF,KAAK,MAAM;MACT;MACAL,IAAI,GAAG,CACL,wBAAwB,EACxBH,SAAS,EACT,cAAc,EACd,YAAY,EACZ,OAAO,CACR;MACD;IACF,KAAK,MAAM;MAAE;QACX;MAAA;EAEJ;EAEA,MAAM,IAAAa,YAAK,EAAC,KAAK,EAAEV,IAAI,EAAE;IACvBW,GAAG,EAAE;MAAE,GAAGC,OAAO,CAACD,GAAG;MAAEE,cAAc,EAAE;IAAO;EAChD,CAAC,CAAC;;EAEF;EACA,KAAK,MAAMC,IAAI,IAAIxB,eAAe,EAAE;IAClC,MAAMyB,gBAAE,CAACC,MAAM,CAAClB,aAAI,CAACC,IAAI,CAACF,SAAS,EAAEiB,IAAI,CAAC,CAAC;EAC7C;;EAEA;EACA,MAAMG,GAAG,GAAG,MAAMF,gBAAE,CAACG,QAAQ,CAACpB,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,cAAc,CAAC,CAAC;EAEnEoB,GAAG,CAACd,IAAI,GAAG,GAAGT,MAAM,CAACQ,OAAO,CAACiB,IAAI,UAAU;;EAE3C;EACA,OAAOF,GAAG,CAACG,IAAI;EAEf,MAAM;IAAEC,OAAO;IAAEC,YAAY;IAAEC;EAAgB,CAAC,GAAGN,GAAG;EAEtD,OAAOI,OAAO,CAACf,IAAI;EACnB,OAAOe,OAAO,CAACG,IAAI;EAEnB,MAAMC,cAAc,GAAG;IACrB,eAAe,EACb,8GAA8G;IAChH,WAAW,EAAE;EACf,CAAC;EAED,IAAI/B,MAAM,CAACO,OAAO,KAAK,SAAS,EAAE;IAChCyB,MAAM,CAACC,MAAM,CAACN,OAAO,EAAEI,cAAc,CAAC;EACxC,CAAC,MAAM,IAAI/B,MAAM,CAACO,OAAO,KAAK,UAAU,EAAE;IACxC;IACA;;IAEA,MAAM2B,YAAY,GAAG,CACnB,gBAAgB,EAChB,uIAAuI,EACvIH,cAAc,CAAC,eAAe,CAAC,CAChC,CAAC1B,IAAI,CAAC,MAAM,CAAC;IAEd,MAAM8B,QAAQ,GAAG,CACf,gBAAgB,EAChB,+HAA+H,EAC/HJ,cAAc,CAAC,WAAW,CAAC,CAC5B,CAAC1B,IAAI,CAAC,MAAM,CAAC;IAEd2B,MAAM,CAACC,MAAM,CAACN,OAAO,EAAE;MACrB,eAAe,EAAEO,YAAY;MAC7B,WAAW,EAAEC;IACf,CAAC,CAAC;IAEF,MAAMC,GAAG,GAAG,MAAMf,gBAAE,CAACG,QAAQ,CAACpB,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,UAAU,CAAC,CAAC;IAE/DiC,GAAG,CAACC,OAAO,GAAGD,GAAG,CAACC,OAAO,IAAI,CAAC,CAAC;IAC/BD,GAAG,CAACC,OAAO,CAAC3B,OAAO,GAAG,GAAGV,MAAM,CAACQ,OAAO,CAACE,OAAO,UAAU;IACzD0B,GAAG,CAACE,GAAG,GAAGF,GAAG,CAACE,GAAG,IAAI,CAAC,CAAC;IACvBF,GAAG,CAACE,GAAG,CAACC,gBAAgB,GAAG,GAAGvC,MAAM,CAACQ,OAAO,CAACE,OAAO,UAAU;IAE9D,MAAMW,gBAAE,CAACmB,SAAS,CAACpC,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,UAAU,CAAC,EAAEiC,GAAG,EAAE;MACxDK,MAAM,EAAE;IACV,CAAC,CAAC;EACJ;EAEA5C,kBAAkB,CAAC6C,OAAO,CAAEjC,IAAI,IAAK;IACnC;IACA,OAAOoB,eAAe,CAACpB,IAAI,CAAC;EAC9B,CAAC,CAAC;EAEF,MAAMkC,mBAAmB,GAAG;IAC1B,0BAA0B,EAAE,IAAI3C,MAAM,CAAC4C,QAAQ,CAACC,GAAG,EAAE;IACrD,8BAA8B,EAAE;EAClC,CAAC;EAED,IAAI7C,MAAM,CAACQ,OAAO,CAACsC,YAAY,KAAK,eAAe,EAAE;IACnD,MAAMC,kBAAkB,GAAG;MACzB,4BAA4B,EAAE,IAAI/C,MAAM,CAAC4C,QAAQ,CAACI,KAAK,IAAI,QAAQ;IACrE,CAAC;IAEDhB,MAAM,CAACC,MAAM,CAACL,YAAY,EAAEmB,kBAAkB,CAAC;EACjD;EAEAf,MAAM,CAACC,MAAM,CAACJ,eAAe,EAAEc,mBAAmB,CAAC;EAEnD,IAAI3C,MAAM,CAACO,OAAO,KAAK,MAAM,EAAE;IAC7B,MAAM0C,UAAkB,GAAGrB,YAAY,CAACsB,IAAI,CACzCC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACbC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAEvB,IAAIC,oBAA4C;IAEhD,IAAI;MACFA,oBAAoB,GAAG,MAAM,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;QAC5DC,cAAK,CACFC,GAAG,CACF,mDAAmDT,UAAU,0CAA0C,EACtGU,GAAG,IAAK;UACP,IAAIC,IAAI,GAAG,EAAE;UAEbD,GAAG,CAACE,EAAE,CAAC,MAAM,EAAGC,KAAa,IAAMF,IAAI,IAAIE,KAAM,CAAC;UAClDH,GAAG,CAACE,EAAE,CAAC,KAAK,EAAE,MAAM;YAClB,IAAI;cACFN,OAAO,CAACQ,IAAI,CAACC,KAAK,CAACJ,IAAI,CAAC,CAAC;YAC3B,CAAC,CAAC,OAAOnE,CAAC,EAAE;cACV;cACA+D,MAAM,CAAC/D,CAAC,CAAC;YACX;UACF,CAAC,CAAC;QACJ,CACF,CAAC,CACAoE,EAAE,CAAC,OAAO,EAAEL,MAAM,CAAC;MACxB,CAAC,CAAC;IACJ,CAAC,CAAC,OAAO/D,CAAC,EAAE;MACV4D,oBAAoB,GAAG,CAAC,CAAC;IAC3B;IAEArB,MAAM,CAACiC,OAAO,CAACnE,mBAAmB,CAAC,CAAC4C,OAAO,CAAC,CAAC,CAACjC,IAAI,EAAEyD,OAAO,CAAC,KAAK;MAC/DtC,YAAY,CAACnB,IAAI,CAAC,GAAG4C,oBAAoB,CAAC5C,IAAI,CAAC,IAAIyD,OAAO;IAC5D,CAAC,CAAC;IAEFvC,OAAO,CAACwC,GAAG,GAAG,kBAAkB;IAEhC,MAAM/B,GAAG,GAAG,MAAMf,gBAAE,CAACG,QAAQ,CAACpB,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,UAAU,CAAC,CAAC;IAE/DiC,GAAG,CAACc,IAAI,CAACb,OAAO,GAAGD,GAAG,CAACc,IAAI,CAACb,OAAO,IAAI,CAAC,CAAC;IACzCD,GAAG,CAACc,IAAI,CAACb,OAAO,CAAC3B,OAAO,GAAG,GAAGV,MAAM,CAACQ,OAAO,CAACE,OAAO,UAAU;IAC9D0B,GAAG,CAACc,IAAI,CAACZ,GAAG,GAAGF,GAAG,CAACc,IAAI,CAACZ,GAAG,IAAI,CAAC,CAAC;IACjCF,GAAG,CAACc,IAAI,CAACZ,GAAG,CAACC,gBAAgB,GAAG,GAAGvC,MAAM,CAACQ,OAAO,CAACE,OAAO,UAAU;IAEnE,MAAMW,gBAAE,CAACmB,SAAS,CAACpC,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,UAAU,CAAC,EAAEiC,GAAG,EAAE;MACxDK,MAAM,EAAE;IACV,CAAC,CAAC;EACJ;;EAEA;EACA;EACA,KAAK,MAAM2B,KAAK,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,EAAE;IACvD,IAAI7C,GAAG,CAAC6C,KAAK,CAAC,EAAE;MACd7C,GAAG,CAAC6C,KAAK,CAAC,GAAG,IAAAC,uBAAc,EAAC9C,GAAG,CAAC6C,KAAK,CAAC,CAAC;IACzC;EACF;EAEA,MAAM/C,gBAAE,CAACmB,SAAS,CAACpC,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,cAAc,CAAC,EAAEoB,GAAG,EAAE;IAC5DkB,MAAM,EAAE;EACV,CAAC,CAAC;EAEF,IAAIzC,MAAM,CAACO,OAAO,KAAK,MAAM,EAAE;IAC7B,IAAI+D,gBAAgB,GAAG,MAAMjD,gBAAE,CAACkD,QAAQ,CACtCnE,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,SAAS,EAAE,mBAAmB,CAAC,EACpD,MACF,CAAC;;IAED;IACA;IACAmE,gBAAgB,GAAGA,gBAAgB,CAAClB,OAAO,CACzC,6BAA6B,EAC7B,8BACF,CAAC;;IAED;IACA;IACA;IACA,MAAMoB,OAAO,GAAG,MAAMnD,gBAAE,CAACkD,QAAQ,CAC/BnE,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,EACtC,MACF,CAAC;IAED,MAAMkB,gBAAE,CAACoD,SAAS,CAChBrE,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,EACtC,uCAAuC,GAAGqE,OAC5C,CAAC;;IAED;IACA;IACA,IAAIF,gBAAgB,CAACnB,KAAK,CAAC,IAAI,CAAC,CAACuB,QAAQ,CAAC,sBAAsB,CAAC,EAAE;MACjEJ,gBAAgB,GAAGA,gBAAgB,CAAClB,OAAO,CACzC,sBAAsB,EACtB,qBACF,CAAC;IACH,CAAC,MAAM,IAAIkB,gBAAgB,CAACnB,KAAK,CAAC,IAAI,CAAC,CAACuB,QAAQ,CAAC,sBAAsB,CAAC,EAAE;MACxEJ,gBAAgB,GAAGA,gBAAgB,CAAClB,OAAO,CACzC,sBAAsB,EACtB,qBACF,CAAC;IACH,CAAC,MAAM,IAAI,CAACkB,gBAAgB,CAACnB,KAAK,CAAC,IAAI,CAAC,CAACuB,QAAQ,CAAC,qBAAqB,CAAC,EAAE;MACxEJ,gBAAgB,IAAI,uBAAuB;IAC7C;IAEA,MAAMjD,gBAAE,CAACoD,SAAS,CAChBrE,aAAI,CAACC,IAAI,CAACF,SAAS,EAAE,SAAS,EAAE,mBAAmB,CAAC,EACpDmE,gBACF,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"generateExampleApp.js","names":["_fsExtra","_interopRequireDefault","require","_getLatestVersion","_https","_path","_sortObjectKeys","_spawn","e","__esModule","default","FILES_TO_DELETE","PACKAGES_TO_REMOVE","PACKAGES_TO_ADD_WEB","generateExampleApp","config","root","reactNativeVersion","directory","path","join","args","example","project","name","package","matchedReactNativeVersion","test","getLatestVersion","range","Error","spawn","env","process","npm_config_yes","file","fs","remove","pkg","readJSON","slug","jest","scripts","dependencies","devDependencies","lint","SCRIPTS_TO_ADD","Object","assign","androidBuild","iosBuild","app","android","ios","bundleIdentifier","writeJSON","spaces","forEach","PACKAGES_TO_ADD_DEV","versions","bob","moduleConfig","viewConfig","packagesToAddNitro","nitro","sdkVersion","expo","split","replace","bundledNativeModules","Promise","resolve","reject","https","get","res","data","on","chunk","JSON","parse","entries","version","web","field","sortObjectKeys","gradleProperties","readFile","podfile","writeFile","includes"],"sources":["../../src/exampleApp/generateExampleApp.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport getLatestVersion from 'get-latest-version';\nimport https from 'https';\nimport path from 'path';\nimport type { TemplateConfiguration } from '../template';\nimport sortObjectKeys from '../utils/sortObjectKeys';\nimport { spawn } from '../utils/spawn';\n\nconst FILES_TO_DELETE = [\n '__tests__',\n '.buckconfig',\n '.eslintrc.js',\n '.flowconfig',\n '.git',\n '.gitignore',\n '.prettierrc.js',\n 'App.js',\n 'App.tsx',\n 'index.js',\n 'tsconfig.json',\n];\n\nconst PACKAGES_TO_REMOVE = [\n '@react-native/eslint-config',\n '@tsconfig/react-native',\n '@types/jest',\n '@types/react-test-renderer',\n '@typescript-eslint/eslint-plugin',\n '@typescript-eslint/parser',\n 'babel-jest',\n 'eslint',\n 'jest',\n 'prettier',\n 'react-test-renderer',\n 'typescript',\n];\n\nconst PACKAGES_TO_ADD_WEB = {\n '@expo/metro-runtime': '~3.2.1',\n 'react-dom': '18.2.0',\n 'react-native-web': '~0.18.10',\n};\n\nexport default async function generateExampleApp({\n config,\n root,\n reactNativeVersion = 'latest',\n}: {\n config: TemplateConfiguration;\n root: string;\n reactNativeVersion?: string;\n}) {\n const directory = path.join(root, 'example');\n\n let args: string[] = [];\n\n switch (config.example) {\n case 'vanilla':\n // `npx @react-native-community/cli init <projectName> --directory example --skip-install`\n args = [\n `@react-native-community/cli`,\n 'init',\n `${config.project.name}Example`,\n '--package-name',\n `${config.project.package}.example`,\n '--directory',\n directory,\n '--version',\n reactNativeVersion,\n '--skip-install',\n '--skip-git-init',\n '--pm',\n 'npm',\n ];\n break;\n case 'test-app':\n {\n // Test App requires React Native version to be a semver version\n const matchedReactNativeVersion = /(\\d+\\.\\d+[-.0-9a-z]*)/.test(\n reactNativeVersion\n )\n ? reactNativeVersion\n : await getLatestVersion('react-native', {\n range: reactNativeVersion,\n });\n\n if (!matchedReactNativeVersion) {\n throw new Error(\n `Could not find a matching version for react-native: ${reactNativeVersion}`\n );\n }\n\n // `npx --package react-native-test-app@latest init --name ${projectName}Example --destination example --version ${reactNativeVersion}`\n args = [\n '--package',\n `react-native-test-app@latest`,\n 'init',\n '--name',\n `${config.project.name}Example`,\n `--destination`,\n directory,\n '--version',\n matchedReactNativeVersion,\n '--platform',\n 'ios',\n '--platform',\n 'android',\n ];\n }\n break;\n case 'expo':\n // `npx create-expo-app example --no-install --template blank`\n args = [\n 'create-expo-app@latest',\n directory,\n '--no-install',\n '--template',\n 'blank',\n ];\n break;\n case 'none': {\n // Do nothing\n }\n }\n\n await spawn('npx', args, {\n env: { ...process.env, npm_config_yes: 'true' },\n });\n\n // Remove unnecessary files and folders\n for (const file of FILES_TO_DELETE) {\n await fs.remove(path.join(directory, file));\n }\n\n // Patch the example app's package.json\n const pkg = await fs.readJSON(path.join(directory, 'package.json'));\n\n pkg.name = `${config.project.slug}-example`;\n\n // Remove Jest config for now\n delete pkg.jest;\n\n const { scripts, dependencies, devDependencies } = pkg;\n\n delete scripts.test;\n delete scripts.lint;\n\n const SCRIPTS_TO_ADD = {\n 'build:android':\n 'react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a\"',\n 'build:ios': `react-native build-ios --mode Debug`,\n };\n\n if (config.example === 'vanilla') {\n Object.assign(scripts, SCRIPTS_TO_ADD);\n } else if (config.example === 'test-app') {\n // `react-native-test-app` doesn't bundle application by default in 'Release' mode and also `bundle` command doesn't create a directory.\n // `mkdist` script should be removed after stable React Native major contains this fix: https://github.com/facebook/react-native/pull/45182.\n\n const androidBuild = [\n 'npm run mkdist',\n 'react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist',\n SCRIPTS_TO_ADD['build:android'],\n ].join(' && ');\n\n const iosBuild = [\n 'npm run mkdist',\n 'react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist',\n SCRIPTS_TO_ADD['build:ios'],\n ].join(' && ');\n\n Object.assign(scripts, {\n 'build:android': androidBuild,\n 'build:ios': iosBuild,\n });\n\n const app = await fs.readJSON(path.join(directory, 'app.json'));\n\n app.android = app.android || {};\n app.android.package = `${config.project.package}.example`;\n app.ios = app.ios || {};\n app.ios.bundleIdentifier = `${config.project.package}.example`;\n\n await fs.writeJSON(path.join(directory, 'app.json'), app, {\n spaces: 2,\n });\n }\n\n PACKAGES_TO_REMOVE.forEach((name) => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete devDependencies[name];\n });\n\n const PACKAGES_TO_ADD_DEV = {\n 'react-native-builder-bob': `^${config.versions.bob}`,\n 'react-native-monorepo-config': `^0.1.9`,\n };\n\n if (\n config.project.moduleConfig === 'nitro-modules' ||\n config.project.viewConfig === 'nitro-view'\n ) {\n const packagesToAddNitro = {\n 'react-native-nitro-modules': `^${config.versions.nitro || 'latest'}`,\n };\n\n Object.assign(dependencies, packagesToAddNitro);\n }\n\n Object.assign(devDependencies, PACKAGES_TO_ADD_DEV);\n\n if (config.example === 'expo') {\n const sdkVersion: string = dependencies.expo\n .split('.')[0]\n .replace(/[^\\d]/, '');\n\n let bundledNativeModules: Record<string, string>;\n\n try {\n bundledNativeModules = await new Promise((resolve, reject) => {\n https\n .get(\n `https://raw.githubusercontent.com/expo/expo/sdk-${sdkVersion}/packages/expo/bundledNativeModules.json`,\n (res) => {\n let data = '';\n\n res.on('data', (chunk: string) => (data += chunk));\n res.on('end', () => {\n try {\n resolve(JSON.parse(data));\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(e);\n }\n });\n }\n )\n .on('error', reject);\n });\n } catch (e) {\n bundledNativeModules = {};\n }\n\n Object.entries(PACKAGES_TO_ADD_WEB).forEach(([name, version]) => {\n dependencies[name] = bundledNativeModules[name] || version;\n });\n\n scripts.web = 'expo start --web';\n\n const app = await fs.readJSON(path.join(directory, 'app.json'));\n\n app.expo.android = app.expo.android || {};\n app.expo.android.package = `${config.project.package}.example`;\n app.expo.ios = app.expo.ios || {};\n app.expo.ios.bundleIdentifier = `${config.project.package}.example`;\n\n await fs.writeJSON(path.join(directory, 'app.json'), app, {\n spaces: 2,\n });\n }\n\n // Sort the deps by name to match behavior of package managers\n // This way the package.json doesn't get updated when installing deps\n for (const field of ['dependencies', 'devDependencies']) {\n if (pkg[field]) {\n pkg[field] = sortObjectKeys(pkg[field]);\n }\n }\n\n await fs.writeJSON(path.join(directory, 'package.json'), pkg, {\n spaces: 2,\n });\n\n if (config.example !== 'expo') {\n let gradleProperties = await fs.readFile(\n path.join(directory, 'android', 'gradle.properties'),\n 'utf8'\n );\n\n // Disable Jetifier.\n // Remove this when the app template is updated.\n gradleProperties = gradleProperties.replace(\n 'android.enableJetifier=true',\n 'android.enableJetifier=false'\n );\n\n // Enable new arch for iOS and Android\n // iOS\n // Add ENV['RCT_NEW_ARCH_ENABLED'] = 1 on top of example/ios/Podfile\n const podfile = await fs.readFile(\n path.join(directory, 'ios', 'Podfile'),\n 'utf8'\n );\n\n await fs.writeFile(\n path.join(directory, 'ios', 'Podfile'),\n \"ENV['RCT_NEW_ARCH_ENABLED'] = '1'\\n\\n\" + podfile\n );\n\n // Android\n // Make sure newArchEnabled=true is present in android/gradle.properties\n if (gradleProperties.split('\\n').includes('#newArchEnabled=true')) {\n gradleProperties = gradleProperties.replace(\n '#newArchEnabled=true',\n 'newArchEnabled=true'\n );\n } else if (gradleProperties.split('\\n').includes('newArchEnabled=false')) {\n gradleProperties = gradleProperties.replace(\n 'newArchEnabled=false',\n 'newArchEnabled=true'\n );\n } else if (!gradleProperties.split('\\n').includes('newArchEnabled=true')) {\n gradleProperties += '\\nnewArchEnabled=true';\n }\n\n await fs.writeFile(\n path.join(directory, 'android', 'gradle.properties'),\n gradleProperties\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/lib/index.js CHANGED
@@ -39,7 +39,7 @@ async function create(_argv) {
39
39
  interactive: argv.interactive
40
40
  });
41
41
  const bobVersion = await bobVersionPromise;
42
- const nitroModulesVersion = answers.type === 'nitro-module' ? await nitroModulesVersionPromise : undefined;
42
+ const nitroModulesVersion = answers.type === 'nitro-module' || answers.type === 'nitro-view' ? await nitroModulesVersionPromise : undefined;
43
43
  const config = (0, _template.generateTemplateConfiguration)({
44
44
  versions: {
45
45
  bob: bobVersion,
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_fsExtra","_interopRequireDefault","require","_kleur","_ora","_path","_yargs","_constants","_dependencies","_generateExampleApp","_inform","_input","_template","_assert","_initialCommit","_local","_packageManager","_prompt","_resolveNpmPackageVersion","e","__esModule","default","yargs","command","acceptedArgs","create","demandCommand","recommendCommands","fail","printErrorHelp","parserConfiguration","strict","argv","_argv","_","$0","bobVersionPromise","resolveNpmPackageVersion","FALLBACK_BOB_VERSION","nitroModulesVersionPromise","FALLBACK_NITRO_MODULES_VERSION","assertNpxExists","questions","createQuestions","answers","prompt","interactive","bobVersion","nitroModulesVersion","type","undefined","config","generateTemplateConfiguration","versions","bob","nitro","basename","path","name","directory","folder","resolve","process","cwd","fs","mkdirp","reactNativeVersion","SUPPORTED_REACT_NATIVE_VERSION","printUsedRNVersion","spinner","ora","start","example","text","generateExampleApp","root","applyTemplates","rootPackageJson","readJson","join","alignDependencyVersionsWithExampleApp","libraryMetadata","createMetadata","writeJson","spaces","printSuccessMessage","succeed","kleur","yellow","relative","local","packageManager","determinePackageManager","addedNitro","project","moduleConfig","addNitroDependencyToLocalLibrary","linkedLocalLibrary","linkLocalLibrary","printLocalLibNextSteps","abortController","AbortController","Promise","race","createInitialGitCommit","signal","_resolve","reject","setTimeout","error","Error","abort","message","warn","printNonLocalLibNextSteps"],"sources":["../src/index.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport kleur from 'kleur';\nimport ora from 'ora';\nimport path from 'path';\nimport yargs from 'yargs';\nimport {\n FALLBACK_BOB_VERSION,\n FALLBACK_NITRO_MODULES_VERSION,\n SUPPORTED_REACT_NATIVE_VERSION,\n} from './constants';\nimport { alignDependencyVersionsWithExampleApp } from './exampleApp/dependencies';\nimport generateExampleApp from './exampleApp/generateExampleApp';\nimport {\n printErrorHelp,\n printLocalLibNextSteps,\n printNonLocalLibNextSteps,\n printUsedRNVersion,\n} from './inform';\nimport {\n acceptedArgs,\n createMetadata,\n createQuestions,\n type Answers,\n} from './input';\nimport { applyTemplates, generateTemplateConfiguration } from './template';\nimport { assertNpxExists } from './utils/assert';\nimport { createInitialGitCommit } from './utils/initialCommit';\nimport {\n addNitroDependencyToLocalLibrary,\n linkLocalLibrary,\n} from './utils/local';\nimport { determinePackageManager } from './utils/packageManager';\nimport { prompt } from './utils/prompt';\nimport { resolveNpmPackageVersion } from './utils/resolveNpmPackageVersion';\n\ntype Args = Partial<Answers> & {\n $0: string;\n [key: string]: unknown;\n};\n\nvoid yargs\n .command('$0 [name]', 'create a react native library', acceptedArgs, create)\n .demandCommand()\n .recommendCommands()\n .fail(printErrorHelp)\n .parserConfiguration({\n // don't pass kebab-case args to handler.\n 'strip-dashed': true,\n })\n .strict().argv;\n\nasync function create(_argv: Args) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _, $0, ...argv } = _argv;\n\n // Prefetch bob version in background while asking questions\n const bobVersionPromise = resolveNpmPackageVersion(\n 'react-native-builder-bob',\n FALLBACK_BOB_VERSION\n );\n const nitroModulesVersionPromise = resolveNpmPackageVersion(\n 'react-native-nitro-modules',\n FALLBACK_NITRO_MODULES_VERSION\n );\n\n await assertNpxExists();\n\n const questions = await createQuestions(argv);\n\n const answers = await prompt<Answers, typeof argv>(questions, argv, {\n interactive: argv.interactive,\n });\n\n const bobVersion = await bobVersionPromise;\n\n const nitroModulesVersion =\n answers.type === 'nitro-module'\n ? await nitroModulesVersionPromise\n : undefined;\n\n const config = generateTemplateConfiguration({\n versions: {\n bob: bobVersion,\n nitro: nitroModulesVersion,\n },\n basename: path.basename(answers.name ?? answers.directory),\n answers,\n });\n\n const folder = path.resolve(process.cwd(), answers.directory);\n\n await fs.mkdirp(folder);\n\n if (\n answers.reactNativeVersion != null &&\n answers.reactNativeVersion !== SUPPORTED_REACT_NATIVE_VERSION\n ) {\n printUsedRNVersion(answers.reactNativeVersion, config);\n }\n\n const spinner = ora().start();\n\n if (config.example !== 'none') {\n spinner.text = 'Generating example app';\n\n await generateExampleApp({\n root: folder,\n reactNativeVersion: answers.reactNativeVersion,\n config,\n });\n }\n\n spinner.text = 'Copying files';\n\n await applyTemplates(answers, config, folder);\n\n const rootPackageJson = await fs.readJson(path.join(folder, 'package.json'));\n\n if (config.example !== 'none') {\n await alignDependencyVersionsWithExampleApp(rootPackageJson, folder);\n }\n\n const libraryMetadata = createMetadata(answers);\n\n rootPackageJson['create-react-native-library'] = libraryMetadata;\n\n await fs.writeJson(path.join(folder, 'package.json'), rootPackageJson, {\n spaces: 2,\n });\n\n const printSuccessMessage = () =>\n spinner.succeed(\n `Project created successfully at ${kleur.yellow(\n path.relative(process.cwd(), folder)\n )}!\\n`\n );\n\n if (answers.local) {\n const packageManager = await determinePackageManager();\n\n let addedNitro = false;\n\n if (config.project.moduleConfig === 'nitro-modules') {\n addedNitro = await addNitroDependencyToLocalLibrary(config);\n }\n\n const linkedLocalLibrary = await linkLocalLibrary(\n config,\n folder,\n packageManager\n );\n\n printSuccessMessage();\n\n printLocalLibNextSteps({\n config,\n packageManager,\n linkedLocalLibrary,\n addedNitro,\n folder,\n });\n } else {\n spinner.text = 'Initializing git repository';\n\n try {\n const abortController = new AbortController();\n\n // Creating git repository can get stuck in some cases,\n // e.g. if git asks for ssh passphrase.\n // We abort it after a timeout so that this doesn't hang forever.\n await Promise.race([\n createInitialGitCommit(folder, abortController.signal),\n new Promise<void>((_resolve, reject) => {\n setTimeout(() => {\n const error = new Error('Creating git repository took too long');\n\n abortController.abort(error.message);\n reject(error);\n }, 5000);\n }),\n ]);\n } catch (error) {\n spinner.warn('Failed to create git repository');\n }\n\n printSuccessMessage();\n\n printNonLocalLibNextSteps(config);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_fsExtra","_interopRequireDefault","require","_kleur","_ora","_path","_yargs","_constants","_dependencies","_generateExampleApp","_inform","_input","_template","_assert","_initialCommit","_local","_packageManager","_prompt","_resolveNpmPackageVersion","e","__esModule","default","yargs","command","acceptedArgs","create","demandCommand","recommendCommands","fail","printErrorHelp","parserConfiguration","strict","argv","_argv","_","$0","bobVersionPromise","resolveNpmPackageVersion","FALLBACK_BOB_VERSION","nitroModulesVersionPromise","FALLBACK_NITRO_MODULES_VERSION","assertNpxExists","questions","createQuestions","answers","prompt","interactive","bobVersion","nitroModulesVersion","type","undefined","config","generateTemplateConfiguration","versions","bob","nitro","basename","path","name","directory","folder","resolve","process","cwd","fs","mkdirp","reactNativeVersion","SUPPORTED_REACT_NATIVE_VERSION","printUsedRNVersion","spinner","ora","start","example","text","generateExampleApp","root","applyTemplates","rootPackageJson","readJson","join","alignDependencyVersionsWithExampleApp","libraryMetadata","createMetadata","writeJson","spaces","printSuccessMessage","succeed","kleur","yellow","relative","local","packageManager","determinePackageManager","addedNitro","project","moduleConfig","addNitroDependencyToLocalLibrary","linkedLocalLibrary","linkLocalLibrary","printLocalLibNextSteps","abortController","AbortController","Promise","race","createInitialGitCommit","signal","_resolve","reject","setTimeout","error","Error","abort","message","warn","printNonLocalLibNextSteps"],"sources":["../src/index.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport kleur from 'kleur';\nimport ora from 'ora';\nimport path from 'path';\nimport yargs from 'yargs';\nimport {\n FALLBACK_BOB_VERSION,\n FALLBACK_NITRO_MODULES_VERSION,\n SUPPORTED_REACT_NATIVE_VERSION,\n} from './constants';\nimport { alignDependencyVersionsWithExampleApp } from './exampleApp/dependencies';\nimport generateExampleApp from './exampleApp/generateExampleApp';\nimport {\n printErrorHelp,\n printLocalLibNextSteps,\n printNonLocalLibNextSteps,\n printUsedRNVersion,\n} from './inform';\nimport {\n acceptedArgs,\n createMetadata,\n createQuestions,\n type Answers,\n} from './input';\nimport { applyTemplates, generateTemplateConfiguration } from './template';\nimport { assertNpxExists } from './utils/assert';\nimport { createInitialGitCommit } from './utils/initialCommit';\nimport {\n addNitroDependencyToLocalLibrary,\n linkLocalLibrary,\n} from './utils/local';\nimport { determinePackageManager } from './utils/packageManager';\nimport { prompt } from './utils/prompt';\nimport { resolveNpmPackageVersion } from './utils/resolveNpmPackageVersion';\n\ntype Args = Partial<Answers> & {\n $0: string;\n [key: string]: unknown;\n};\n\nvoid yargs\n .command('$0 [name]', 'create a react native library', acceptedArgs, create)\n .demandCommand()\n .recommendCommands()\n .fail(printErrorHelp)\n .parserConfiguration({\n // don't pass kebab-case args to handler.\n 'strip-dashed': true,\n })\n .strict().argv;\n\nasync function create(_argv: Args) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _, $0, ...argv } = _argv;\n\n // Prefetch bob version in background while asking questions\n const bobVersionPromise = resolveNpmPackageVersion(\n 'react-native-builder-bob',\n FALLBACK_BOB_VERSION\n );\n const nitroModulesVersionPromise = resolveNpmPackageVersion(\n 'react-native-nitro-modules',\n FALLBACK_NITRO_MODULES_VERSION\n );\n\n await assertNpxExists();\n\n const questions = await createQuestions(argv);\n\n const answers = await prompt<Answers, typeof argv>(questions, argv, {\n interactive: argv.interactive,\n });\n\n const bobVersion = await bobVersionPromise;\n const nitroModulesVersion =\n answers.type === 'nitro-module' || answers.type === 'nitro-view'\n ? await nitroModulesVersionPromise\n : undefined;\n\n const config = generateTemplateConfiguration({\n versions: {\n bob: bobVersion,\n nitro: nitroModulesVersion,\n },\n basename: path.basename(answers.name ?? answers.directory),\n answers,\n });\n\n const folder = path.resolve(process.cwd(), answers.directory);\n\n await fs.mkdirp(folder);\n\n if (\n answers.reactNativeVersion != null &&\n answers.reactNativeVersion !== SUPPORTED_REACT_NATIVE_VERSION\n ) {\n printUsedRNVersion(answers.reactNativeVersion, config);\n }\n\n const spinner = ora().start();\n\n if (config.example !== 'none') {\n spinner.text = 'Generating example app';\n\n await generateExampleApp({\n root: folder,\n reactNativeVersion: answers.reactNativeVersion,\n config,\n });\n }\n\n spinner.text = 'Copying files';\n\n await applyTemplates(answers, config, folder);\n\n const rootPackageJson = await fs.readJson(path.join(folder, 'package.json'));\n\n if (config.example !== 'none') {\n await alignDependencyVersionsWithExampleApp(rootPackageJson, folder);\n }\n\n const libraryMetadata = createMetadata(answers);\n\n rootPackageJson['create-react-native-library'] = libraryMetadata;\n\n await fs.writeJson(path.join(folder, 'package.json'), rootPackageJson, {\n spaces: 2,\n });\n\n const printSuccessMessage = () =>\n spinner.succeed(\n `Project created successfully at ${kleur.yellow(\n path.relative(process.cwd(), folder)\n )}!\\n`\n );\n\n if (answers.local) {\n const packageManager = await determinePackageManager();\n\n let addedNitro = false;\n\n if (config.project.moduleConfig === 'nitro-modules') {\n addedNitro = await addNitroDependencyToLocalLibrary(config);\n }\n\n const linkedLocalLibrary = await linkLocalLibrary(\n config,\n folder,\n packageManager\n );\n\n printSuccessMessage();\n\n printLocalLibNextSteps({\n config,\n packageManager,\n linkedLocalLibrary,\n addedNitro,\n folder,\n });\n } else {\n spinner.text = 'Initializing git repository';\n\n try {\n const abortController = new AbortController();\n\n // Creating git repository can get stuck in some cases,\n // e.g. if git asks for ssh passphrase.\n // We abort it after a timeout so that this doesn't hang forever.\n await Promise.race([\n createInitialGitCommit(folder, abortController.signal),\n new Promise<void>((_resolve, reject) => {\n setTimeout(() => {\n const error = new Error('Creating git repository took too long');\n\n abortController.abort(error.message);\n reject(error);\n }, 5000);\n }),\n ]);\n } catch (error) {\n spinner.warn('Failed to create git repository');\n }\n\n printSuccessMessage();\n\n printNonLocalLibNextSteps(config);\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/lib/input.js CHANGED
@@ -17,7 +17,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
17
17
  const LANGUAGE_CHOICES = [{
18
18
  title: 'Kotlin & Swift',
19
19
  value: 'kotlin-swift',
20
- types: ['nitro-module']
20
+ types: ['nitro-module', 'nitro-view']
21
21
  }, {
22
22
  title: 'Kotlin & Objective-C',
23
23
  value: 'kotlin-objc',
@@ -57,6 +57,10 @@ const TYPE_CHOICES = [{
57
57
  title: 'Nitro module',
58
58
  value: 'nitro-module',
59
59
  description: 'type-safe, fast integration for native APIs to JS (experimental)'
60
+ }, {
61
+ title: 'Nitro view',
62
+ value: 'nitro-view',
63
+ description: 'integration for native views to JS using nitro for prop parsing (experimental)'
60
64
  }, {
61
65
  title: 'JavaScript library',
62
66
  value: 'library',
@@ -142,8 +146,8 @@ async function createQuestions({
142
146
  name: 'directory',
143
147
  message: `Where do you want to create the library?`,
144
148
  initial: (_, answers) => {
145
- if ((answers.local ?? local) && name && !name?.includes('/')) {
146
- return `modules/${name}`;
149
+ if ((answers.local ?? local) && name && !name?.includes(_path.default.sep)) {
150
+ return _path.default.join('modules', name);
147
151
  }
148
152
  return name ?? '';
149
153
  },
@@ -151,8 +155,17 @@ async function createQuestions({
151
155
  if (!input) {
152
156
  return 'Cannot be empty';
153
157
  }
154
- if (_fsExtra.default.pathExistsSync(_path.default.join(process.cwd(), input))) {
155
- return 'Directory already exists';
158
+ const targetPath = _path.default.join(process.cwd(), input);
159
+ if (_fsExtra.default.pathExistsSync(targetPath)) {
160
+ const stat = _fsExtra.default.statSync(targetPath);
161
+ if (!stat.isDirectory()) {
162
+ return 'Path exists and is not a directory';
163
+ }
164
+ const files = _fsExtra.default.readdirSync(targetPath);
165
+ const isEmpty = files.length === 0 || files.length === 1 && files[0] === '.git';
166
+ if (!isEmpty) {
167
+ return 'Directory already exists';
168
+ }
156
169
  }
157
170
  return true;
158
171
  },
package/lib/input.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","names":["_fsExtra","_interopRequireDefault","require","_githubUsername","_path","_validateNpmPackageName","_package","_constants","_spawn","e","__esModule","default","LANGUAGE_CHOICES","title","value","types","EXAMPLE_CHOICES","description","disabled","process","env","CRNL_ENABLE_TEST_APP","filter","choice","TYPE_CHOICES","acceptedArgs","exports","type","choices","map","SUPPORTED_REACT_NATIVE_VERSION","createQuestions","name","local","fullname","email","spawn","questions","fs","pathExists","path","join","cwd","message","initial","_","answers","includes","validate","input","pathExistsSync","basename","directory","validateNpmPackage","validForNewPackages","test","Boolean","authorEmail","username","githubUsername","authorUrl","slug","replace","values","createMetadata","ignoredAnswers","libraryMetadata","Object","fromEntries","entries","answer","version"],"sources":["../src/input.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport githubUsername from 'github-username';\nimport path from 'path';\nimport validateNpmPackage from 'validate-npm-package-name';\nimport type yargs from 'yargs';\nimport { version } from '../package.json';\nimport { SUPPORTED_REACT_NATIVE_VERSION } from './constants';\nimport type { Question } from './utils/prompt';\nimport { spawn } from './utils/spawn';\n\nexport type ProjectLanguages = 'kotlin-objc' | 'kotlin-swift' | 'js';\n\nexport type ProjectType =\n | 'turbo-module'\n | 'fabric-view'\n | 'nitro-module'\n | 'library';\n\nconst LANGUAGE_CHOICES: {\n title: string;\n value: ProjectLanguages;\n types: ProjectType[];\n}[] = [\n {\n title: 'Kotlin & Swift',\n value: 'kotlin-swift',\n types: ['nitro-module'],\n },\n {\n title: 'Kotlin & Objective-C',\n value: 'kotlin-objc',\n types: ['turbo-module', 'fabric-view'],\n },\n {\n title: 'JavaScript for Android, iOS & Web',\n value: 'js',\n types: ['library'],\n },\n];\n\nconst EXAMPLE_CHOICES = (\n [\n {\n title: 'App with Community CLI',\n value: 'vanilla',\n description: \"provides access to app's native code\",\n disabled: false,\n },\n {\n title: 'Test App by Microsoft',\n value: 'test-app',\n description: \"app's native code is abstracted away\",\n // Test App currently doesn't work with React Native 0.79.2\n // due to missing `Gemfile` in the template\n disabled: !process.env.CRNL_ENABLE_TEST_APP,\n },\n {\n title: 'App with Expo CLI',\n value: 'expo',\n description: 'managed expo app with web support',\n disabled: false,\n },\n ] as const\n).filter((choice) => !choice.disabled);\n\nconst TYPE_CHOICES: {\n title: string;\n value: ProjectType;\n description: string;\n}[] = [\n {\n title: 'Turbo module',\n value: 'turbo-module',\n description: 'integration for native APIs to JS',\n },\n {\n title: 'Fabric view',\n value: 'fabric-view',\n description: 'integration for native views to JS',\n },\n {\n title: 'Nitro module',\n value: 'nitro-module',\n description:\n 'type-safe, fast integration for native APIs to JS (experimental)',\n },\n {\n title: 'JavaScript library',\n value: 'library',\n description: 'supports Expo Go and Web',\n },\n];\n\nexport const acceptedArgs = {\n 'slug': {\n description: 'Name of the npm package',\n type: 'string',\n },\n 'description': {\n description: 'Description of the npm package',\n type: 'string',\n },\n 'author-name': {\n description: 'Name of the package author',\n type: 'string',\n },\n 'author-email': {\n description: 'Email address of the package author',\n type: 'string',\n },\n 'author-url': {\n description: 'URL for the package author',\n type: 'string',\n },\n 'repo-url': {\n description: 'URL for the repository',\n type: 'string',\n },\n 'languages': {\n description: 'Languages you want to use',\n choices: LANGUAGE_CHOICES.map(({ value }) => value),\n },\n 'type': {\n description: 'Type of library you want to develop',\n choices: TYPE_CHOICES.map(({ value }) => value),\n },\n 'react-native-version': {\n description: 'Version of React Native to use',\n type: 'string',\n default: SUPPORTED_REACT_NATIVE_VERSION,\n },\n 'local': {\n description: 'Whether to create a local library',\n type: 'boolean',\n },\n 'example': {\n description: 'Type of the example app to create',\n type: 'string',\n choices: EXAMPLE_CHOICES.map(({ value }) => value),\n },\n 'interactive': {\n description: 'Whether to run in interactive mode',\n type: 'boolean',\n },\n} as const satisfies Record<string, yargs.Options>;\n\nexport type ExampleApp = 'none' | 'test-app' | 'expo' | 'vanilla';\n\ntype PromptAnswers = {\n directory: string;\n slug: string;\n description: string;\n authorName: string;\n authorEmail: string;\n authorUrl: string;\n repoUrl: string;\n languages: ProjectLanguages;\n type: ProjectType;\n example: ExampleApp;\n local: boolean;\n};\n\nexport type Answers = PromptAnswers & {\n name?: string;\n reactNativeVersion?: string;\n interactive?: boolean;\n};\n\nexport async function createQuestions({\n name,\n local,\n}: {\n name?: string;\n local?: boolean;\n}) {\n let fullname, email;\n\n try {\n fullname = await spawn('git', ['config', '--get', 'user.name']);\n email = await spawn('git', ['config', '--get', 'user.email']);\n } catch (e) {\n // Ignore error\n }\n\n const questions: Question<keyof PromptAnswers>[] = [\n {\n type:\n local == null &&\n (await fs.pathExists(path.join(process.cwd(), 'package.json')))\n ? 'confirm'\n : null,\n name: 'local',\n message: `Looks like you're under a project folder. Do you want to create a local library?`,\n initial: local,\n default: false,\n },\n {\n type: (_, answers) => (name && !(answers.local ?? local) ? null : 'text'),\n name: 'directory',\n message: `Where do you want to create the library?`,\n initial: (_, answers) => {\n if ((answers.local ?? local) && name && !name?.includes('/')) {\n return `modules/${name}`;\n }\n\n return name ?? '';\n },\n validate: (input) => {\n if (!input) {\n return 'Cannot be empty';\n }\n\n if (fs.pathExistsSync(path.join(process.cwd(), input))) {\n return 'Directory already exists';\n }\n\n return true;\n },\n default: name,\n },\n {\n type: 'text',\n name: 'slug',\n message: 'What is the name of the npm package?',\n initial: (_, answers) => {\n const basename = path.basename(\n typeof answers.directory === 'string'\n ? answers.directory\n : (name ?? '')\n );\n\n if (validateNpmPackage(basename).validForNewPackages) {\n if (/^(@|react-native)/.test(basename)) {\n return basename;\n }\n\n return `react-native-${basename}`;\n }\n\n return '';\n },\n validate: (input) =>\n validateNpmPackage(input).validForNewPackages ||\n 'Must be a valid npm package name',\n },\n {\n type: 'text',\n name: 'description',\n message: 'What is the description for the package?',\n validate: (input) => Boolean(input) || 'Cannot be empty',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorName',\n message: 'What is the name of package author?',\n initial: fullname,\n validate: (input) => Boolean(input) || 'Cannot be empty',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorEmail',\n message: 'What is the email address for the package author?',\n initial: email,\n validate: (input) =>\n /^\\S+@\\S+$/.test(input) || 'Must be a valid email address',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorUrl',\n message: 'What is the URL for the package author?',\n initial: async (_, answers) => {\n if (typeof answers.authorEmail !== 'string') {\n return '';\n }\n\n try {\n const username = await githubUsername(answers.authorEmail);\n\n if (username) {\n return `https://github.com/${username}`;\n }\n } catch (e) {\n // Ignore error\n }\n\n return '';\n },\n validate: (input) => /^https?:\\/\\//.test(input) || 'Must be a valid URL',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'repoUrl',\n message: 'What is the URL for the repository?',\n initial: (_, answers) => {\n if (\n typeof answers.authorUrl === 'string' &&\n typeof answers.slug === 'string' &&\n /^https?:\\/\\/github.com\\/[^/]+/.test(answers.authorUrl)\n ) {\n return `${answers.authorUrl}/${answers.slug\n .replace(/^@/, '')\n .replace(/\\//g, '-')}`;\n }\n\n return '';\n },\n validate: (input) => /^https?:\\/\\//.test(input) || 'Must be a valid URL',\n },\n {\n type: 'select',\n name: 'type',\n message: 'What type of library do you want to develop?',\n choices: TYPE_CHOICES,\n },\n {\n type: 'select',\n name: 'languages',\n message: 'Which languages do you want to use?',\n choices: (_, values) => {\n return LANGUAGE_CHOICES.filter((choice) => {\n if (choice.types && typeof values.type === 'string') {\n // @ts-expect-error `includes doesn't support checking arbitrary types\n return choice.types.includes(values.type);\n }\n\n return true;\n });\n },\n },\n {\n type: 'select',\n name: 'example',\n message: 'What type of example app do you want to create?',\n choices: (_, values) => {\n if (local) {\n return [\n {\n title: 'None',\n value: 'none',\n },\n ];\n }\n\n return EXAMPLE_CHOICES.filter((choice) => {\n if (values.type) {\n return values.type === 'library'\n ? choice.value === 'expo'\n : choice.value !== 'expo';\n }\n\n return true;\n });\n },\n },\n ];\n\n return questions;\n}\n\nexport function createMetadata(answers: Partial<PromptAnswers>) {\n // Some of the passed args can already be derived from the generated package.json file.\n const ignoredAnswers: (keyof Answers)[] = [\n 'name',\n 'directory',\n 'slug',\n 'description',\n 'authorName',\n 'authorEmail',\n 'authorUrl',\n 'repoUrl',\n 'example',\n 'reactNativeVersion',\n 'local',\n 'interactive',\n ];\n\n type AnswerEntries<T extends keyof PromptAnswers = keyof PromptAnswers> = [\n T,\n PromptAnswers[T],\n ][];\n\n const libraryMetadata = Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion\n (Object.entries(answers) as AnswerEntries).filter(\n ([answer]) => !ignoredAnswers.includes(answer)\n )\n );\n\n libraryMetadata.version = version;\n\n return libraryMetadata;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"input.js","names":["_fsExtra","_interopRequireDefault","require","_githubUsername","_path","_validateNpmPackageName","_package","_constants","_spawn","e","__esModule","default","LANGUAGE_CHOICES","title","value","types","EXAMPLE_CHOICES","description","disabled","process","env","CRNL_ENABLE_TEST_APP","filter","choice","TYPE_CHOICES","acceptedArgs","exports","type","choices","map","SUPPORTED_REACT_NATIVE_VERSION","createQuestions","name","local","fullname","email","spawn","questions","fs","pathExists","path","join","cwd","message","initial","_","answers","includes","sep","validate","input","targetPath","pathExistsSync","stat","statSync","isDirectory","files","readdirSync","isEmpty","length","basename","directory","validateNpmPackage","validForNewPackages","test","Boolean","authorEmail","username","githubUsername","authorUrl","slug","replace","values","createMetadata","ignoredAnswers","libraryMetadata","Object","fromEntries","entries","answer","version"],"sources":["../src/input.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport githubUsername from 'github-username';\nimport path from 'path';\nimport validateNpmPackage from 'validate-npm-package-name';\nimport type yargs from 'yargs';\nimport { version } from '../package.json';\nimport { SUPPORTED_REACT_NATIVE_VERSION } from './constants';\nimport type { Question } from './utils/prompt';\nimport { spawn } from './utils/spawn';\n\nexport type ProjectLanguages = 'kotlin-objc' | 'kotlin-swift' | 'js';\n\nexport type ProjectType =\n | 'turbo-module'\n | 'fabric-view'\n | 'nitro-module'\n | 'nitro-view'\n | 'library';\n\nconst LANGUAGE_CHOICES: {\n title: string;\n value: ProjectLanguages;\n types: ProjectType[];\n}[] = [\n {\n title: 'Kotlin & Swift',\n value: 'kotlin-swift',\n types: ['nitro-module', 'nitro-view'],\n },\n {\n title: 'Kotlin & Objective-C',\n value: 'kotlin-objc',\n types: ['turbo-module', 'fabric-view'],\n },\n {\n title: 'JavaScript for Android, iOS & Web',\n value: 'js',\n types: ['library'],\n },\n];\n\nconst EXAMPLE_CHOICES = (\n [\n {\n title: 'App with Community CLI',\n value: 'vanilla',\n description: \"provides access to app's native code\",\n disabled: false,\n },\n {\n title: 'Test App by Microsoft',\n value: 'test-app',\n description: \"app's native code is abstracted away\",\n // Test App currently doesn't work with React Native 0.79.2\n // due to missing `Gemfile` in the template\n disabled: !process.env.CRNL_ENABLE_TEST_APP,\n },\n {\n title: 'App with Expo CLI',\n value: 'expo',\n description: 'managed expo app with web support',\n disabled: false,\n },\n ] as const\n).filter((choice) => !choice.disabled);\n\nconst TYPE_CHOICES: {\n title: string;\n value: ProjectType;\n description: string;\n}[] = [\n {\n title: 'Turbo module',\n value: 'turbo-module',\n description: 'integration for native APIs to JS',\n },\n {\n title: 'Fabric view',\n value: 'fabric-view',\n description: 'integration for native views to JS',\n },\n {\n title: 'Nitro module',\n value: 'nitro-module',\n description:\n 'type-safe, fast integration for native APIs to JS (experimental)',\n },\n {\n title: 'Nitro view',\n value: 'nitro-view',\n description:\n 'integration for native views to JS using nitro for prop parsing (experimental)',\n },\n {\n title: 'JavaScript library',\n value: 'library',\n description: 'supports Expo Go and Web',\n },\n];\n\nexport const acceptedArgs = {\n 'slug': {\n description: 'Name of the npm package',\n type: 'string',\n },\n 'description': {\n description: 'Description of the npm package',\n type: 'string',\n },\n 'author-name': {\n description: 'Name of the package author',\n type: 'string',\n },\n 'author-email': {\n description: 'Email address of the package author',\n type: 'string',\n },\n 'author-url': {\n description: 'URL for the package author',\n type: 'string',\n },\n 'repo-url': {\n description: 'URL for the repository',\n type: 'string',\n },\n 'languages': {\n description: 'Languages you want to use',\n choices: LANGUAGE_CHOICES.map(({ value }) => value),\n },\n 'type': {\n description: 'Type of library you want to develop',\n choices: TYPE_CHOICES.map(({ value }) => value),\n },\n 'react-native-version': {\n description: 'Version of React Native to use',\n type: 'string',\n default: SUPPORTED_REACT_NATIVE_VERSION,\n },\n 'local': {\n description: 'Whether to create a local library',\n type: 'boolean',\n },\n 'example': {\n description: 'Type of the example app to create',\n type: 'string',\n choices: EXAMPLE_CHOICES.map(({ value }) => value),\n },\n 'interactive': {\n description: 'Whether to run in interactive mode',\n type: 'boolean',\n },\n} as const satisfies Record<string, yargs.Options>;\n\nexport type ExampleApp = 'none' | 'test-app' | 'expo' | 'vanilla';\n\ntype PromptAnswers = {\n directory: string;\n slug: string;\n description: string;\n authorName: string;\n authorEmail: string;\n authorUrl: string;\n repoUrl: string;\n languages: ProjectLanguages;\n type: ProjectType;\n example: ExampleApp;\n local: boolean;\n};\n\nexport type Answers = PromptAnswers & {\n name?: string;\n reactNativeVersion?: string;\n interactive?: boolean;\n};\n\nexport async function createQuestions({\n name,\n local,\n}: {\n name?: string;\n local?: boolean;\n}) {\n let fullname, email;\n\n try {\n fullname = await spawn('git', ['config', '--get', 'user.name']);\n email = await spawn('git', ['config', '--get', 'user.email']);\n } catch (e) {\n // Ignore error\n }\n\n const questions: Question<keyof PromptAnswers>[] = [\n {\n type:\n local == null &&\n (await fs.pathExists(path.join(process.cwd(), 'package.json')))\n ? 'confirm'\n : null,\n name: 'local',\n message: `Looks like you're under a project folder. Do you want to create a local library?`,\n initial: local,\n default: false,\n },\n {\n type: (_, answers) => (name && !(answers.local ?? local) ? null : 'text'),\n name: 'directory',\n message: `Where do you want to create the library?`,\n initial: (_, answers) => {\n if ((answers.local ?? local) && name && !name?.includes(path.sep)) {\n return path.join('modules', name);\n }\n\n return name ?? '';\n },\n validate: (input) => {\n if (!input) {\n return 'Cannot be empty';\n }\n\n const targetPath = path.join(process.cwd(), input);\n\n if (fs.pathExistsSync(targetPath)) {\n const stat = fs.statSync(targetPath);\n\n if (!stat.isDirectory()) {\n return 'Path exists and is not a directory';\n }\n\n const files = fs.readdirSync(targetPath);\n\n const isEmpty =\n files.length === 0 || (files.length === 1 && files[0] === '.git');\n\n if (!isEmpty) {\n return 'Directory already exists';\n }\n }\n\n return true;\n },\n default: name,\n },\n {\n type: 'text',\n name: 'slug',\n message: 'What is the name of the npm package?',\n initial: (_, answers) => {\n const basename = path.basename(\n typeof answers.directory === 'string'\n ? answers.directory\n : (name ?? '')\n );\n\n if (validateNpmPackage(basename).validForNewPackages) {\n if (/^(@|react-native)/.test(basename)) {\n return basename;\n }\n\n return `react-native-${basename}`;\n }\n\n return '';\n },\n validate: (input) =>\n validateNpmPackage(input).validForNewPackages ||\n 'Must be a valid npm package name',\n },\n {\n type: 'text',\n name: 'description',\n message: 'What is the description for the package?',\n validate: (input) => Boolean(input) || 'Cannot be empty',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorName',\n message: 'What is the name of package author?',\n initial: fullname,\n validate: (input) => Boolean(input) || 'Cannot be empty',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorEmail',\n message: 'What is the email address for the package author?',\n initial: email,\n validate: (input) =>\n /^\\S+@\\S+$/.test(input) || 'Must be a valid email address',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorUrl',\n message: 'What is the URL for the package author?',\n initial: async (_, answers) => {\n if (typeof answers.authorEmail !== 'string') {\n return '';\n }\n\n try {\n const username = await githubUsername(answers.authorEmail);\n\n if (username) {\n return `https://github.com/${username}`;\n }\n } catch (e) {\n // Ignore error\n }\n\n return '';\n },\n validate: (input) => /^https?:\\/\\//.test(input) || 'Must be a valid URL',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'repoUrl',\n message: 'What is the URL for the repository?',\n initial: (_, answers) => {\n if (\n typeof answers.authorUrl === 'string' &&\n typeof answers.slug === 'string' &&\n /^https?:\\/\\/github.com\\/[^/]+/.test(answers.authorUrl)\n ) {\n return `${answers.authorUrl}/${answers.slug\n .replace(/^@/, '')\n .replace(/\\//g, '-')}`;\n }\n\n return '';\n },\n validate: (input) => /^https?:\\/\\//.test(input) || 'Must be a valid URL',\n },\n {\n type: 'select',\n name: 'type',\n message: 'What type of library do you want to develop?',\n choices: TYPE_CHOICES,\n },\n {\n type: 'select',\n name: 'languages',\n message: 'Which languages do you want to use?',\n choices: (_, values) => {\n return LANGUAGE_CHOICES.filter((choice) => {\n if (choice.types && typeof values.type === 'string') {\n // @ts-expect-error `includes doesn't support checking arbitrary types\n return choice.types.includes(values.type);\n }\n\n return true;\n });\n },\n },\n {\n type: 'select',\n name: 'example',\n message: 'What type of example app do you want to create?',\n choices: (_, values) => {\n if (local) {\n return [\n {\n title: 'None',\n value: 'none',\n },\n ];\n }\n\n return EXAMPLE_CHOICES.filter((choice) => {\n if (values.type) {\n return values.type === 'library'\n ? choice.value === 'expo'\n : choice.value !== 'expo';\n }\n\n return true;\n });\n },\n },\n ];\n\n return questions;\n}\n\nexport function createMetadata(answers: Partial<PromptAnswers>) {\n // Some of the passed args can already be derived from the generated package.json file.\n const ignoredAnswers: (keyof Answers)[] = [\n 'name',\n 'directory',\n 'slug',\n 'description',\n 'authorName',\n 'authorEmail',\n 'authorUrl',\n 'repoUrl',\n 'example',\n 'reactNativeVersion',\n 'local',\n 'interactive',\n ];\n\n type AnswerEntries<T extends keyof PromptAnswers = keyof PromptAnswers> = [\n T,\n PromptAnswers[T],\n ][];\n\n const libraryMetadata = Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion\n (Object.entries(answers) as AnswerEntries).filter(\n ([answer]) => !ignoredAnswers.includes(answer)\n )\n );\n\n libraryMetadata.version = version;\n\n return libraryMetadata;\n}\n"],"mappings":"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","ignoreList":[]}
package/lib/template.js CHANGED
@@ -25,7 +25,8 @@ const NATIVE_COMMON_EXAMPLE_FILES = _path.default.resolve(__dirname, '../templat
25
25
  const NATIVE_FILES = {
26
26
  module_new: _path.default.resolve(__dirname, '../templates/native-library-new'),
27
27
  view_new: _path.default.resolve(__dirname, '../templates/native-view-new'),
28
- module_nitro: _path.default.resolve(__dirname, '../templates/nitro-module')
28
+ module_nitro: _path.default.resolve(__dirname, '../templates/nitro-module'),
29
+ view_nitro: _path.default.resolve(__dirname, '../templates/nitro-view')
29
30
  };
30
31
  const OBJC_FILES = {
31
32
  module_common: _path.default.resolve(__dirname, '../templates/objc-library'),
@@ -64,7 +65,7 @@ function generateTemplateConfiguration({
64
65
  // Otherwise, convert it to PascalCase and remove any non-alphanumeric characters
65
66
  `${project.charAt(0).toUpperCase()}${project.replace(/[^a-z0-9](\w)/g, (_, $1) => $1.toUpperCase()).slice(1)}`,
66
67
  package: pack,
67
- package_dir: pack.replace(/\./g, '/'),
68
+ package_dir: pack.replace(/\./g, _path.default.sep),
68
69
  package_cpp: pack.replace(/\./g, '_'),
69
70
  identifier: slug.replace(/[^a-z0-9]+/g, '-').replace(/^-/, ''),
70
71
  native: languages !== 'js',
@@ -90,6 +91,7 @@ function getModuleConfig(projectType) {
90
91
  return 'turbo-modules';
91
92
  case 'fabric-view':
92
93
  case 'library':
94
+ case 'nitro-view':
93
95
  return null;
94
96
  }
95
97
  }
@@ -97,9 +99,12 @@ function getViewConfig(projectType) {
97
99
  switch (projectType) {
98
100
  case 'fabric-view':
99
101
  return 'fabric-view';
102
+ case 'nitro-view':
103
+ return 'nitro-view';
100
104
  case 'nitro-module':
101
105
  case 'turbo-module':
102
106
  case 'library':
107
+ default:
103
108
  return null;
104
109
  }
105
110
  }
@@ -132,6 +137,10 @@ async function applyTemplates(answers, config, folder) {
132
137
  await applyTemplate(config, NATIVE_FILES['module_nitro'], folder);
133
138
  return;
134
139
  }
140
+ if (config.project.viewConfig === 'nitro-view') {
141
+ await applyTemplate(config, NATIVE_FILES['view_nitro'], folder);
142
+ return;
143
+ }
135
144
  if (config.project.moduleConfig !== null) {
136
145
  await applyTemplate(config, NATIVE_FILES[`module_new`], folder);
137
146
  } else {
@@ -174,7 +183,9 @@ async function applyTemplate(config, source, destination) {
174
183
  const content = await _fsExtra.default.readFile(file, 'utf8');
175
184
  let result;
176
185
  try {
177
- result = _ejs.default.render(content, config);
186
+ result = _ejs.default.render(content, config)
187
+ // Make sure that line endings are 'lf' (Unix style)
188
+ .replace(/\r\n/g, '\n');
178
189
  } catch (e) {
179
190
  throw new Error(`Failed to render template file content: ${f}`, {
180
191
  cause: e
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","names":["_path","_interopRequireDefault","require","_fsExtra","_ejs","e","__esModule","default","BINARIES","COMMON_FILES","path","resolve","__dirname","COMMON_LOCAL_FILES","EXAMPLE_COMMON_FILES","EXAMPLE_MODULE_NEW_FILES","EXAMPLE_VIEW_FILES","JS_FILES","EXPO_FILES","NATIVE_COMMON_FILES","NATIVE_COMMON_EXAMPLE_FILES","NATIVE_FILES","module_new","view_new","module_nitro","OBJC_FILES","module_common","KOTLIN_FILES","generateTemplateConfiguration","versions","basename","answers","slug","languages","type","project","replace","namespace","startsWith","includes","split","toLowerCase","pack","description","name","test","charAt","toUpperCase","_","$1","slice","package","package_dir","package_cpp","identifier","native","swift","viewConfig","getViewConfig","moduleConfig","getModuleConfig","author","authorName","email","authorEmail","url","authorUrl","repo","repoUrl","example","year","Date","getFullYear","projectType","applyTemplates","config","folder","local","applyTemplate","templateType","source","destination","fs","mkdirp","files","readdir","f","ejs","render","openDelimiter","closeDelimiter","Error","cause","target","join","file","stats","stat","isDirectory","some","r","content","readFile","result","writeFile","copyFile"],"sources":["../src/template.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs-extra';\nimport ejs from 'ejs';\nimport type { Answers, ExampleApp, ProjectType } from './input';\n\nexport type TemplateVersions = {\n bob: string;\n nitro: string | undefined;\n};\n\nexport type ModuleConfig =\n | 'native-modules'\n | 'turbo-modules'\n | 'nitro-modules'\n | null;\n\nexport type ViewConfig = 'paper-view' | 'fabric-view' | null;\n\n// Please think at least 5 times before introducing a new config key\n// You can just reuse the existing ones most of the time\nexport type TemplateConfiguration = {\n versions: TemplateVersions;\n project: {\n slug: string;\n description: string;\n name: string;\n package: string;\n package_dir: string;\n package_cpp: string;\n identifier: string;\n native: boolean;\n swift: boolean;\n viewConfig: ViewConfig;\n moduleConfig: ModuleConfig;\n };\n author: {\n name: string;\n email: string;\n url: string;\n };\n /** Git repo URL */\n repo: string;\n example: ExampleApp;\n year: number;\n};\n\nconst BINARIES = [\n /(gradlew|\\.(jar|keystore|png|jpg|gif))$/,\n /\\$\\.yarn(?![a-z])/,\n];\n\nconst COMMON_FILES = path.resolve(__dirname, '../templates/common');\nconst COMMON_LOCAL_FILES = path.resolve(__dirname, '../templates/common-local');\nconst EXAMPLE_COMMON_FILES = path.resolve(\n __dirname,\n '../templates/example-common'\n);\nconst EXAMPLE_MODULE_NEW_FILES = path.resolve(\n __dirname,\n '../templates/example-module-new'\n);\nconst EXAMPLE_VIEW_FILES = path.resolve(__dirname, '../templates/example-view');\n\nconst JS_FILES = path.resolve(__dirname, '../templates/js-library');\nconst EXPO_FILES = path.resolve(__dirname, '../templates/expo-library');\nconst NATIVE_COMMON_FILES = path.resolve(\n __dirname,\n '../templates/native-common'\n);\nconst NATIVE_COMMON_EXAMPLE_FILES = path.resolve(\n __dirname,\n '../templates/native-common-example'\n);\n\nconst NATIVE_FILES = {\n module_new: path.resolve(__dirname, '../templates/native-library-new'),\n view_new: path.resolve(__dirname, '../templates/native-view-new'),\n module_nitro: path.resolve(__dirname, '../templates/nitro-module'),\n} as const;\n\nconst OBJC_FILES = {\n module_common: path.resolve(__dirname, '../templates/objc-library'),\n view_new: path.resolve(__dirname, '../templates/objc-view-new'),\n} as const;\n\nconst KOTLIN_FILES = {\n module_new: path.resolve(__dirname, '../templates/kotlin-library-new'),\n view_new: path.resolve(__dirname, '../templates/kotlin-view-new'),\n} as const;\n\nexport function generateTemplateConfiguration({\n versions,\n basename,\n answers,\n}: {\n versions: TemplateVersions;\n basename: string;\n answers: Answers;\n}): TemplateConfiguration {\n const { slug, languages, type } = answers;\n\n const project = slug.replace(/^(react-native-|@[^/]+\\/)/, '');\n let namespace: string | undefined;\n\n if (slug.startsWith('@') && slug.includes('/')) {\n namespace = slug\n .split('/')[0]\n ?.replace(/[^a-z0-9]/g, '')\n .toLowerCase();\n }\n\n // Create a package identifier with specified namespace when possible\n const pack = `${namespace ? `${namespace}.` : ''}${project\n .replace(/[^a-z0-9]/g, '')\n .toLowerCase()}`;\n\n return {\n versions,\n project: {\n slug,\n description: answers.description,\n name:\n /^[A-Z]/.test(basename) && /^[a-z0-9]+$/i.test(basename)\n ? // If the project name is already in PascalCase, use it as-is\n basename\n : // Otherwise, convert it to PascalCase and remove any non-alphanumeric characters\n `${project.charAt(0).toUpperCase()}${project\n .replace(/[^a-z0-9](\\w)/g, (_, $1: string) => $1.toUpperCase())\n .slice(1)}`,\n package: pack,\n package_dir: pack.replace(/\\./g, '/'),\n package_cpp: pack.replace(/\\./g, '_'),\n identifier: slug.replace(/[^a-z0-9]+/g, '-').replace(/^-/, ''),\n native: languages !== 'js',\n swift: languages === 'kotlin-swift',\n viewConfig: getViewConfig(type),\n moduleConfig: getModuleConfig(type),\n },\n author: {\n name: answers.authorName,\n email: answers.authorEmail,\n url: answers.authorUrl,\n },\n repo: answers.repoUrl,\n example: answers.example,\n year: new Date().getFullYear(),\n };\n}\n\nfunction getModuleConfig(projectType: ProjectType): ModuleConfig {\n switch (projectType) {\n case 'nitro-module':\n return 'nitro-modules';\n case 'turbo-module':\n return 'turbo-modules';\n case 'fabric-view':\n case 'library':\n return null;\n }\n}\n\nfunction getViewConfig(projectType: ProjectType): ViewConfig {\n switch (projectType) {\n case 'fabric-view':\n return 'fabric-view';\n case 'nitro-module':\n case 'turbo-module':\n case 'library':\n return null;\n }\n}\n\nexport async function applyTemplates(\n answers: Answers,\n config: TemplateConfiguration,\n folder: string\n) {\n const { local } = answers;\n\n if (local) {\n await applyTemplate(config, COMMON_LOCAL_FILES, folder);\n } else {\n await applyTemplate(config, COMMON_FILES, folder);\n\n if (config.example !== 'none') {\n await applyTemplate(config, EXAMPLE_COMMON_FILES, folder);\n\n if (config.project.viewConfig !== null) {\n await applyTemplate(config, EXAMPLE_VIEW_FILES, folder);\n } else {\n await applyTemplate(config, EXAMPLE_MODULE_NEW_FILES, folder);\n }\n }\n }\n\n if (answers.languages === 'js') {\n await applyTemplate(config, JS_FILES, folder);\n await applyTemplate(config, EXPO_FILES, folder);\n } else {\n await applyTemplate(config, NATIVE_COMMON_FILES, folder);\n\n if (config.example !== 'none') {\n await applyTemplate(config, NATIVE_COMMON_EXAMPLE_FILES, folder);\n }\n\n if (config.project.moduleConfig === 'nitro-modules') {\n await applyTemplate(config, NATIVE_FILES['module_nitro'], folder);\n return;\n }\n\n if (config.project.moduleConfig !== null) {\n await applyTemplate(config, NATIVE_FILES[`module_new`], folder);\n } else {\n await applyTemplate(config, NATIVE_FILES[`view_new`], folder);\n }\n\n if (config.project.moduleConfig !== null) {\n await applyTemplate(config, OBJC_FILES[`module_common`], folder);\n } else {\n await applyTemplate(config, OBJC_FILES[`view_new`], folder);\n }\n\n const templateType = `${\n config.project.moduleConfig !== null ? 'module' : 'view'\n }_new` as const;\n\n await applyTemplate(config, KOTLIN_FILES[templateType], folder);\n }\n}\n\n/**\n * This copies the template files and renders them via ejs\n */\nasync function applyTemplate(\n config: TemplateConfiguration,\n source: string,\n destination: string\n) {\n await fs.mkdirp(destination);\n\n const files = await fs.readdir(source);\n\n for (const f of files) {\n let name;\n\n try {\n name = ejs.render(f.replace(/^\\$/, ''), config, {\n openDelimiter: '{',\n closeDelimiter: '}',\n });\n } catch (e) {\n throw new Error(`Failed to render template file name: ${f}`, {\n cause: e,\n });\n }\n\n const target = path.join(destination, name);\n\n const file = path.join(source, f);\n const stats = await fs.stat(file);\n\n if (stats.isDirectory()) {\n await applyTemplate(config, file, target);\n } else if (!BINARIES.some((r) => r.test(file))) {\n const content = await fs.readFile(file, 'utf8');\n\n let result;\n\n try {\n result = ejs.render(content, config);\n } catch (e) {\n throw new Error(`Failed to render template file content: ${f}`, {\n cause: e,\n });\n }\n\n await fs.writeFile(target, result);\n } else {\n await fs.copyFile(file, target);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"template.js","names":["_path","_interopRequireDefault","require","_fsExtra","_ejs","e","__esModule","default","BINARIES","COMMON_FILES","path","resolve","__dirname","COMMON_LOCAL_FILES","EXAMPLE_COMMON_FILES","EXAMPLE_MODULE_NEW_FILES","EXAMPLE_VIEW_FILES","JS_FILES","EXPO_FILES","NATIVE_COMMON_FILES","NATIVE_COMMON_EXAMPLE_FILES","NATIVE_FILES","module_new","view_new","module_nitro","view_nitro","OBJC_FILES","module_common","KOTLIN_FILES","generateTemplateConfiguration","versions","basename","answers","slug","languages","type","project","replace","namespace","startsWith","includes","split","toLowerCase","pack","description","name","test","charAt","toUpperCase","_","$1","slice","package","package_dir","sep","package_cpp","identifier","native","swift","viewConfig","getViewConfig","moduleConfig","getModuleConfig","author","authorName","email","authorEmail","url","authorUrl","repo","repoUrl","example","year","Date","getFullYear","projectType","applyTemplates","config","folder","local","applyTemplate","templateType","source","destination","fs","mkdirp","files","readdir","f","ejs","render","openDelimiter","closeDelimiter","Error","cause","target","join","file","stats","stat","isDirectory","some","r","content","readFile","result","writeFile","copyFile"],"sources":["../src/template.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs-extra';\nimport ejs from 'ejs';\nimport type { Answers, ExampleApp, ProjectType } from './input';\n\nexport type TemplateVersions = {\n bob: string;\n nitro: string | undefined;\n};\n\nexport type ModuleConfig =\n | 'native-modules'\n | 'turbo-modules'\n | 'nitro-modules'\n | null;\n\nexport type ViewConfig = 'paper-view' | 'fabric-view' | 'nitro-view' | null;\n\n// Please think at least 5 times before introducing a new config key\n// You can just reuse the existing ones most of the time\nexport type TemplateConfiguration = {\n versions: TemplateVersions;\n project: {\n slug: string;\n description: string;\n name: string;\n package: string;\n package_dir: string;\n package_cpp: string;\n identifier: string;\n native: boolean;\n swift: boolean;\n viewConfig: ViewConfig;\n moduleConfig: ModuleConfig;\n };\n author: {\n name: string;\n email: string;\n url: string;\n };\n /** Git repo URL */\n repo: string;\n example: ExampleApp;\n year: number;\n};\n\nconst BINARIES = [\n /(gradlew|\\.(jar|keystore|png|jpg|gif))$/,\n /\\$\\.yarn(?![a-z])/,\n];\n\nconst COMMON_FILES = path.resolve(__dirname, '../templates/common');\nconst COMMON_LOCAL_FILES = path.resolve(__dirname, '../templates/common-local');\nconst EXAMPLE_COMMON_FILES = path.resolve(\n __dirname,\n '../templates/example-common'\n);\nconst EXAMPLE_MODULE_NEW_FILES = path.resolve(\n __dirname,\n '../templates/example-module-new'\n);\nconst EXAMPLE_VIEW_FILES = path.resolve(__dirname, '../templates/example-view');\n\nconst JS_FILES = path.resolve(__dirname, '../templates/js-library');\nconst EXPO_FILES = path.resolve(__dirname, '../templates/expo-library');\nconst NATIVE_COMMON_FILES = path.resolve(\n __dirname,\n '../templates/native-common'\n);\nconst NATIVE_COMMON_EXAMPLE_FILES = path.resolve(\n __dirname,\n '../templates/native-common-example'\n);\n\nconst NATIVE_FILES = {\n module_new: path.resolve(__dirname, '../templates/native-library-new'),\n view_new: path.resolve(__dirname, '../templates/native-view-new'),\n module_nitro: path.resolve(__dirname, '../templates/nitro-module'),\n view_nitro: path.resolve(__dirname, '../templates/nitro-view'),\n} as const;\n\nconst OBJC_FILES = {\n module_common: path.resolve(__dirname, '../templates/objc-library'),\n view_new: path.resolve(__dirname, '../templates/objc-view-new'),\n} as const;\n\nconst KOTLIN_FILES = {\n module_new: path.resolve(__dirname, '../templates/kotlin-library-new'),\n view_new: path.resolve(__dirname, '../templates/kotlin-view-new'),\n} as const;\n\nexport function generateTemplateConfiguration({\n versions,\n basename,\n answers,\n}: {\n versions: TemplateVersions;\n basename: string;\n answers: Answers;\n}): TemplateConfiguration {\n const { slug, languages, type } = answers;\n\n const project = slug.replace(/^(react-native-|@[^/]+\\/)/, '');\n let namespace: string | undefined;\n\n if (slug.startsWith('@') && slug.includes('/')) {\n namespace = slug\n .split('/')[0]\n ?.replace(/[^a-z0-9]/g, '')\n .toLowerCase();\n }\n\n // Create a package identifier with specified namespace when possible\n const pack = `${namespace ? `${namespace}.` : ''}${project\n .replace(/[^a-z0-9]/g, '')\n .toLowerCase()}`;\n\n return {\n versions,\n project: {\n slug,\n description: answers.description,\n name:\n /^[A-Z]/.test(basename) && /^[a-z0-9]+$/i.test(basename)\n ? // If the project name is already in PascalCase, use it as-is\n basename\n : // Otherwise, convert it to PascalCase and remove any non-alphanumeric characters\n `${project.charAt(0).toUpperCase()}${project\n .replace(/[^a-z0-9](\\w)/g, (_, $1: string) => $1.toUpperCase())\n .slice(1)}`,\n package: pack,\n package_dir: pack.replace(/\\./g, path.sep),\n package_cpp: pack.replace(/\\./g, '_'),\n identifier: slug.replace(/[^a-z0-9]+/g, '-').replace(/^-/, ''),\n native: languages !== 'js',\n swift: languages === 'kotlin-swift',\n viewConfig: getViewConfig(type),\n moduleConfig: getModuleConfig(type),\n },\n author: {\n name: answers.authorName,\n email: answers.authorEmail,\n url: answers.authorUrl,\n },\n repo: answers.repoUrl,\n example: answers.example,\n year: new Date().getFullYear(),\n };\n}\n\nfunction getModuleConfig(projectType: ProjectType): ModuleConfig {\n switch (projectType) {\n case 'nitro-module':\n return 'nitro-modules';\n case 'turbo-module':\n return 'turbo-modules';\n case 'fabric-view':\n case 'library':\n case 'nitro-view':\n return null;\n }\n}\n\nfunction getViewConfig(projectType: ProjectType): ViewConfig {\n switch (projectType) {\n case 'fabric-view':\n return 'fabric-view';\n case 'nitro-view':\n return 'nitro-view';\n case 'nitro-module':\n case 'turbo-module':\n case 'library':\n default:\n return null;\n }\n}\n\nexport async function applyTemplates(\n answers: Answers,\n config: TemplateConfiguration,\n folder: string\n) {\n const { local } = answers;\n\n if (local) {\n await applyTemplate(config, COMMON_LOCAL_FILES, folder);\n } else {\n await applyTemplate(config, COMMON_FILES, folder);\n\n if (config.example !== 'none') {\n await applyTemplate(config, EXAMPLE_COMMON_FILES, folder);\n\n if (config.project.viewConfig !== null) {\n await applyTemplate(config, EXAMPLE_VIEW_FILES, folder);\n } else {\n await applyTemplate(config, EXAMPLE_MODULE_NEW_FILES, folder);\n }\n }\n }\n\n if (answers.languages === 'js') {\n await applyTemplate(config, JS_FILES, folder);\n await applyTemplate(config, EXPO_FILES, folder);\n } else {\n await applyTemplate(config, NATIVE_COMMON_FILES, folder);\n\n if (config.example !== 'none') {\n await applyTemplate(config, NATIVE_COMMON_EXAMPLE_FILES, folder);\n }\n\n if (config.project.moduleConfig === 'nitro-modules') {\n await applyTemplate(config, NATIVE_FILES['module_nitro'], folder);\n return;\n }\n\n if (config.project.viewConfig === 'nitro-view') {\n await applyTemplate(config, NATIVE_FILES['view_nitro'], folder);\n return;\n }\n\n if (config.project.moduleConfig !== null) {\n await applyTemplate(config, NATIVE_FILES[`module_new`], folder);\n } else {\n await applyTemplate(config, NATIVE_FILES[`view_new`], folder);\n }\n\n if (config.project.moduleConfig !== null) {\n await applyTemplate(config, OBJC_FILES[`module_common`], folder);\n } else {\n await applyTemplate(config, OBJC_FILES[`view_new`], folder);\n }\n\n const templateType = `${\n config.project.moduleConfig !== null ? 'module' : 'view'\n }_new` as const;\n\n await applyTemplate(config, KOTLIN_FILES[templateType], folder);\n }\n}\n\n/**\n * This copies the template files and renders them via ejs\n */\nasync function applyTemplate(\n config: TemplateConfiguration,\n source: string,\n destination: string\n) {\n await fs.mkdirp(destination);\n\n const files = await fs.readdir(source);\n\n for (const f of files) {\n let name;\n\n try {\n name = ejs.render(f.replace(/^\\$/, ''), config, {\n openDelimiter: '{',\n closeDelimiter: '}',\n });\n } catch (e) {\n throw new Error(`Failed to render template file name: ${f}`, {\n cause: e,\n });\n }\n\n const target = path.join(destination, name);\n\n const file = path.join(source, f);\n const stats = await fs.stat(file);\n\n if (stats.isDirectory()) {\n await applyTemplate(config, file, target);\n } else if (!BINARIES.some((r) => r.test(file))) {\n const content = await fs.readFile(file, 'utf8');\n\n let result;\n\n try {\n result = ejs\n .render(content, config)\n // Make sure that line endings are 'lf' (Unix style)\n .replace(/\\r\\n/g, '\\n');\n } catch (e) {\n throw new Error(`Failed to render template file content: ${f}`, {\n cause: e,\n });\n }\n\n await fs.writeFile(target, result);\n } else {\n await fs.copyFile(file, target);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-react-native-library",
3
- "version": "0.51.1",
3
+ "version": "0.52.1",
4
4
  "description": "CLI to scaffold React Native libraries",
5
5
  "keywords": [
6
6
  "react-native",
@@ -66,5 +66,5 @@
66
66
  "@types/validate-npm-package-name": "^3.0.3",
67
67
  "@types/yargs": "^17.0.10"
68
68
  },
69
- "gitHead": "6445bc65a77a57e2a760e6a92eeaeb727d40c574"
69
+ "gitHead": "b02d73a94101356296e545a6644c4c31d9dfc5de"
70
70
  }
@@ -1,3 +1,3 @@
1
1
  *.pbxproj -text
2
2
  # specific for windows script files
3
- *.bat text eol=crlf
3
+ *.bat text eol=crlf
@@ -5,13 +5,13 @@ runs:
5
5
  using: composite
6
6
  steps:
7
7
  - name: Setup Node.js
8
- uses: actions/setup-node@v4
8
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
9
9
  with:
10
10
  node-version-file: .nvmrc
11
11
 
12
12
  - name: Restore dependencies
13
13
  id: yarn-cache
14
- uses: actions/cache/restore@v4
14
+ uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
15
15
  with:
16
16
  path: |
17
17
  **/node_modules
@@ -28,7 +28,7 @@ runs:
28
28
 
29
29
  - name: Cache dependencies
30
30
  if: steps.yarn-cache.outputs.cache-hit != 'true'
31
- uses: actions/cache/save@v4
31
+ uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
32
32
  with:
33
33
  path: |
34
34
  **/node_modules
@@ -15,7 +15,7 @@ jobs:
15
15
  runs-on: ubuntu-latest
16
16
  steps:
17
17
  - name: Checkout
18
- uses: actions/checkout@v4
18
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
19
19
 
20
20
  - name: Setup
21
21
  uses: ./.github/actions/setup
@@ -30,7 +30,7 @@ jobs:
30
30
  runs-on: ubuntu-latest
31
31
  steps:
32
32
  - name: Checkout
33
- uses: actions/checkout@v4
33
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
34
34
 
35
35
  - name: Setup
36
36
  uses: ./.github/actions/setup
@@ -42,7 +42,7 @@ jobs:
42
42
  runs-on: ubuntu-latest
43
43
  steps:
44
44
  - name: Checkout
45
- uses: actions/checkout@v4
45
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
46
46
 
47
47
  - name: Setup
48
48
  uses: ./.github/actions/setup
@@ -57,18 +57,18 @@ jobs:
57
57
  TURBO_CACHE_DIR: .turbo/android
58
58
  steps:
59
59
  - name: Checkout
60
- uses: actions/checkout@v4
60
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
61
61
 
62
62
  - name: Setup
63
63
  uses: ./.github/actions/setup
64
- <% if (project.moduleConfig === 'nitro-modules') { -%>
64
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
65
65
 
66
66
  - name: Generate nitrogen code
67
67
  run: yarn nitrogen
68
68
  <% } -%>
69
69
 
70
70
  - name: Cache turborepo for Android
71
- uses: actions/cache@v4
71
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
72
72
  with:
73
73
  path: ${{ env.TURBO_CACHE_DIR }}
74
74
  key: ${{ runner.os }}-turborepo-android-${{ hashFiles('yarn.lock') }}
@@ -85,7 +85,7 @@ jobs:
85
85
 
86
86
  - name: Install JDK
87
87
  if: env.turbo_cache_hit != 1
88
- uses: actions/setup-java@v4
88
+ uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1
89
89
  with:
90
90
  distribution: 'zulu'
91
91
  java-version: '17'
@@ -97,7 +97,7 @@ jobs:
97
97
 
98
98
  - name: Cache Gradle
99
99
  if: env.turbo_cache_hit != 1
100
- uses: actions/cache@v4
100
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
101
101
  with:
102
102
  path: |
103
103
  ~/.gradle/wrapper
@@ -119,18 +119,18 @@ jobs:
119
119
  TURBO_CACHE_DIR: .turbo/ios
120
120
  steps:
121
121
  - name: Checkout
122
- uses: actions/checkout@v4
122
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
123
123
 
124
124
  - name: Setup
125
125
  uses: ./.github/actions/setup
126
- <% if (project.moduleConfig === 'nitro-modules') { -%>
126
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
127
127
 
128
128
  - name: Generate nitrogen code
129
129
  run: yarn nitrogen
130
130
  <% } -%>
131
131
 
132
132
  - name: Cache turborepo for iOS
133
- uses: actions/cache@v4
133
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
134
134
  with:
135
135
  path: ${{ env.TURBO_CACHE_DIR }}
136
136
  key: ${{ runner.os }}-turborepo-ios-${{ hashFiles('yarn.lock') }}
@@ -147,7 +147,7 @@ jobs:
147
147
 
148
148
  - name: Use appropriate Xcode version
149
149
  if: env.turbo_cache_hit != 1
150
- uses: maxim-lobanov/setup-xcode@v1
150
+ uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
151
151
  with:
152
152
  xcode-version: ${{ env.XCODE_VERSION }}
153
153
 
@@ -167,7 +167,7 @@ jobs:
167
167
  runs-on: ubuntu-latest
168
168
  steps:
169
169
  - name: Checkout
170
- uses: actions/checkout@v4
170
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
171
171
 
172
172
  - name: Setup
173
173
  uses: ./.github/actions/setup
@@ -48,7 +48,7 @@
48
48
  "clean": "del-cli lib",
49
49
  <% } -%>
50
50
  "prepare": "bob build",
51
- <% if (project.moduleConfig === 'nitro-modules') { -%>
51
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
52
52
  "nitrogen": "nitro-codegen",
53
53
  <% } -%>
54
54
  "release": "release-it --only-version"
@@ -91,14 +91,14 @@
91
91
  "eslint-config-prettier": "^10.1.1",
92
92
  "eslint-plugin-prettier": "^5.2.3",
93
93
  "jest": "^29.7.0",
94
- <% if (project.moduleConfig === 'nitro-modules') { -%>
94
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
95
95
  "nitro-codegen": "^<%- versions.nitro %>",
96
96
  <% } -%>
97
97
  "prettier": "^3.0.3",
98
98
  "react": "19.0.0",
99
99
  "react-native": "0.78.1",
100
100
  "react-native-builder-bob": "^<%- versions.bob %>",
101
- <% if (project.moduleConfig === 'nitro-modules') { -%>
101
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
102
102
  "react-native-nitro-modules": "^<%- versions.nitro %>",
103
103
  <% } -%>
104
104
  "release-it": "^17.10.0",
@@ -109,7 +109,7 @@
109
109
  },
110
110
  "peerDependencies": {
111
111
  "react": "*",
112
- <% if (project.moduleConfig === 'nitro-modules') { -%>
112
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
113
113
  "react-native": "*",
114
114
  "react-native-nitro-modules": "^<%- versions.nitro %>"
115
115
  <% } else { -%>
@@ -164,7 +164,7 @@
164
164
  "source": "src",
165
165
  "output": "lib",
166
166
  "targets": [
167
- <% if (project.moduleConfig === "nitro-modules") { -%>
167
+ <% if (project.moduleConfig === "nitro-modules" || project.viewConfig === "nitro-view") { -%>
168
168
  [
169
169
  "custom",
170
170
  {
@@ -11,15 +11,17 @@ This project is a monorepo managed using [Yarn workspaces](https://yarnpkg.com/f
11
11
  - The library package in the root directory.
12
12
  - An example app in the `example/` directory.
13
13
 
14
- To get started with the project, run `yarn` in the root directory to install the required dependencies for each package:
14
+ To get started with the project, make sure you have the correct version of [Node.js](https://nodejs.org/) installed. See the [`.nvmrc`](./.nvmrc) file for the version used in this project.
15
+
16
+ Run `yarn` in the root directory to install the required dependencies for each package:
15
17
 
16
18
  ```sh
17
19
  yarn
18
20
  ```
19
21
 
20
- > Since the project relies on Yarn workspaces, you cannot use [`npm`](https://github.com/npm/cli) for development.
22
+ > Since the project relies on Yarn workspaces, you cannot use [`npm`](https://github.com/npm/cli) for development without manually migrating.
21
23
 
22
- <% if (project.moduleConfig === 'nitro-modules') { -%>
24
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
23
25
  This project uses Nitro Modules. If you're not familiar with how Nitro works, make sure to check the [Nitro Modules Docs](https://nitro.margelo.com/).
24
26
 
25
27
  You need to run [Nitrogen](https://nitro.margelo.com/docs/nitrogen) to generate the boilerplate code required for this project. The example app will not build without this step.
@@ -4,16 +4,20 @@
4
4
 
5
5
  ## Installation
6
6
 
7
- <% if (project.moduleConfig === 'nitro-modules') { -%>
7
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
8
+
8
9
  ```sh
9
10
  npm install <%- project.slug %> react-native-nitro-modules
10
11
 
11
12
  > `react-native-nitro-modules` is required as this library relies on [Nitro Modules](https://nitro.margelo.com/).
12
13
  ```
14
+
13
15
  <% } else { -%>
16
+
14
17
  ```sh
15
18
  npm install <%- project.slug %>
16
19
  ```
20
+
17
21
  <% } -%>
18
22
 
19
23
  ## Usage
@@ -28,7 +32,7 @@ import { <%- project.name -%>View } from "<%- project.slug -%>";
28
32
  <<%- project.name -%>View color="tomato" />
29
33
  ```
30
34
 
31
- <% } else if (project.moduleConfig === 'nitro-modules' || project.moduleConfig === 'turbo-modules') { -%>
35
+ <% } else if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view' || project.moduleConfig === 'turbo-modules') { -%>
32
36
 
33
37
  ```js
34
38
  import { multiply } from '<%- project.slug -%>';
@@ -52,7 +56,9 @@ const result = await multiply(3, 7);
52
56
 
53
57
  ## Contributing
54
58
 
55
- See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.
59
+ - [Development workflow](CONTRIBUTING.md#development-workflow)
60
+ - [Sending a pull request](CONTRIBUTING.md#sending-a-pull-request)
61
+ - [Code of conduct](CODE_OF_CONDUCT.md)
56
62
 
57
63
  ## License
58
64
 
@@ -20,22 +20,10 @@ export default defineConfig([
20
20
  plugins: { prettier },
21
21
  rules: {
22
22
  'react/react-in-jsx-scope': 'off',
23
- 'prettier/prettier': [
24
- 'error',
25
- {
26
- quoteProps: 'consistent',
27
- singleQuote: true,
28
- tabWidth: 2,
29
- trailingComma: 'es5',
30
- useTabs: false,
31
- },
32
- ],
23
+ 'prettier/prettier': 'error',
33
24
  },
34
25
  },
35
26
  {
36
- ignores: [
37
- 'node_modules/',
38
- 'lib/'
39
- ],
27
+ ignores: ['node_modules/', 'lib/'],
40
28
  },
41
29
  ]);
@@ -15,7 +15,7 @@ buildscript {
15
15
  }
16
16
  }
17
17
 
18
- <% if (project.moduleConfig === 'nitro-modules') { -%>
18
+ <% if (project.cpp || project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
19
19
  def reactNativeArchitectures() {
20
20
  def value = rootProject.getProperties().get("reactNativeArchitectures")
21
21
  return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
@@ -24,7 +24,7 @@ def reactNativeArchitectures() {
24
24
 
25
25
  apply plugin: "com.android.library"
26
26
  apply plugin: "kotlin-android"
27
- <% if (project.moduleConfig === 'nitro-modules') { -%>
27
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
28
28
  apply from: '../nitrogen/generated/android/<%- project.package_cpp -%>+autolinking.gradle'
29
29
  <% } -%>
30
30
 
@@ -35,7 +35,7 @@ def getExtOrIntegerDefault(name) {
35
35
  }
36
36
 
37
37
  android {
38
- <% if (project.moduleConfig === 'nitro-modules') { -%>
38
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
39
39
  namespace "com.margelo.nitro.<%- project.package -%>"
40
40
  <% } else { -%>
41
41
  namespace "com.<%- project.package -%>"
@@ -46,7 +46,7 @@ android {
46
46
  defaultConfig {
47
47
  minSdkVersion getExtOrIntegerDefault("minSdkVersion")
48
48
  targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
49
- <% if (project.moduleConfig === 'nitro-modules') { -%>
49
+ <% if (project.cpp || project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
50
50
 
51
51
  externalNativeBuild {
52
52
  cmake {
@@ -66,7 +66,7 @@ android {
66
66
  }
67
67
  <% } -%>
68
68
  }
69
- <% if (project.moduleConfig === 'nitro-modules') { -%>
69
+ <% if (project.cpp || project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
70
70
 
71
71
  externalNativeBuild {
72
72
  cmake {
@@ -74,7 +74,7 @@ android {
74
74
  }
75
75
  }
76
76
  <% } -%>
77
- <% if (project.moduleConfig === 'nitro-modules') { -%>
77
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
78
78
 
79
79
  packagingOptions {
80
80
  excludes = [
@@ -100,7 +100,7 @@ android {
100
100
 
101
101
  buildFeatures {
102
102
  buildConfig true
103
- <% if (project.moduleConfig === 'nitro-modules') { -%>
103
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
104
104
  prefab true
105
105
  <% } -%>
106
106
  }
@@ -140,15 +140,7 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
140
140
  dependencies {
141
141
  implementation "com.facebook.react:react-android"
142
142
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
143
- <% if (project.moduleConfig === 'nitro-modules') { -%>
143
+ <% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>
144
144
  implementation project(":react-native-nitro-modules")
145
145
  <% } -%>
146
146
  }
147
-
148
- <% if (project.moduleConfig === "turbo-modules" || project.viewConfig === "fabric-view") { -%>
149
- react {
150
- jsRootDir = file("../src/")
151
- libraryName = "<%- project.viewConfig !== null ? project.name + 'View' : project.name -%>"
152
- codegenJavaPackageName = "com.<%- project.package -%>"
153
- }
154
- <% } -%>
@@ -13,7 +13,7 @@ Pod::Spec.new do |s|
13
13
  s.platforms = { :ios => min_ios_version_supported }
14
14
  s.source = { :git => "<%- repo -%>.git", :tag => "#{s.version}" }
15
15
 
16
- <% if (project.moduleConfig !== "nitro-modules") { -%>
16
+ <% if (project.moduleConfig !== "nitro-modules" || project.viewConfig === "nitro-view") { -%>
17
17
  <% if (project.swift) { -%>
18
18
  s.source_files = "ios/**/*.{h,m,mm,swift}"
19
19
  <% } else { -%>
@@ -22,18 +22,13 @@ Pod::Spec.new do |s|
22
22
  <% } -%>
23
23
  <% } -%>
24
24
 
25
- <% if (project.moduleConfig === "nitro-modules") { -%>
25
+ <% if (project.moduleConfig === "nitro-modules" || project.viewConfig === "nitro-view") { -%>
26
26
  s.source_files = [
27
27
  "ios/**/*.{swift}",
28
28
  "ios/**/*.{m,mm}",
29
29
  "cpp/**/*.{hpp,cpp}",
30
30
  ]
31
31
 
32
- s.pod_target_xcconfig = {
33
- # C++ compiler flags, mainly for folly.
34
- "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) FOLLY_NO_CONFIG FOLLY_CFG_NO_COROUTINES"
35
- }
36
-
37
32
  s.dependency 'React-jsi'
38
33
  s.dependency 'React-callinvoker'
39
34
 
@@ -1,4 +1,4 @@
1
- package com.<%- project.package %>
1
+ package com.margelo.nitro.<%- project.package %>
2
2
 
3
3
  import com.facebook.react.TurboReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
@@ -0,0 +1,24 @@
1
+ project(<%- project.package_cpp -%>)
2
+ cmake_minimum_required(VERSION 3.9.0)
3
+
4
+ set(PACKAGE_NAME <%- project.package_cpp -%>)
5
+ set(CMAKE_VERBOSE_MAKEFILE ON)
6
+ set(CMAKE_CXX_STANDARD 20)
7
+
8
+ # Define C++ library and add all sources
9
+ add_library(${PACKAGE_NAME} SHARED src/main/cpp/cpp-adapter.cpp)
10
+
11
+ # Add Nitrogen specs :)
12
+ include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/<%- project.package_cpp -%>+autolinking.cmake)
13
+
14
+ # Set up local includes
15
+ include_directories("src/main/cpp" "../cpp")
16
+
17
+ find_library(LOG_LIB log)
18
+
19
+ # Link all libraries together
20
+ target_link_libraries(
21
+ ${PACKAGE_NAME}
22
+ ${LOG_LIB}
23
+ android # <-- Android core
24
+ )
@@ -0,0 +1,6 @@
1
+ #include <jni.h>
2
+ #include "<%- project.package_cpp -%>OnLoad.hpp"
3
+
4
+ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
5
+ return margelo::nitro::<%- project.package_cpp -%>::initialize(vm);
6
+ }
@@ -0,0 +1,23 @@
1
+ package com.margelo.nitro.<%- project.package %>
2
+
3
+ import android.view.View
4
+ import com.facebook.proguard.annotations.DoNotStrip
5
+ import com.facebook.react.uimanager.ThemedReactContext
6
+ import androidx.core.graphics.toColorInt
7
+
8
+ @DoNotStrip
9
+ class Hybrid<%- project.name %>(val context: ThemedReactContext) : Hybrid<%- project.name %>Spec() {
10
+
11
+ // View
12
+ override val view: View = View(context)
13
+
14
+ // Props
15
+ private var _color = "#000"
16
+ override var color: String
17
+ get() = _color
18
+ set(value) {
19
+ _color = value
20
+ val color = value.toColorInt()
21
+ view.setBackgroundColor(color)
22
+ }
23
+ }
@@ -0,0 +1,29 @@
1
+ package com.margelo.nitro.<%- project.package %>
2
+
3
+ import com.facebook.react.TurboReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.model.ReactModuleInfoProvider
7
+ import com.facebook.react.uimanager.ViewManager
8
+
9
+ import <%- project.package_cpp -%>.views.Hybrid<%- project.name -%>Manager
10
+
11
+ class <%- project.name -%>Package : TurboReactPackage() {
12
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
13
+ return null
14
+ }
15
+
16
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
17
+ return ReactModuleInfoProvider { HashMap() }
18
+ }
19
+
20
+ override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
21
+ return listOf(Hybrid<%- project.name -%>Manager())
22
+ }
23
+
24
+ companion object {
25
+ init {
26
+ System.loadLibrary("<%- project.package_cpp -%>")
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,28 @@
1
+ class Hybrid<%- project.name -%> : Hybrid<%- project.name -%>Spec {
2
+
3
+ // UIView
4
+ var view: UIView = UIView()
5
+
6
+ // props
7
+ var color: String = "#000" {
8
+ didSet {
9
+ view.backgroundColor = hexStringToUIColor(hexColor: color)
10
+ }
11
+ }
12
+
13
+ func hexStringToUIColor(hexColor: String) -> UIColor {
14
+ let stringScanner = Scanner(string: hexColor)
15
+
16
+ if(hexColor.hasPrefix("#")) {
17
+ stringScanner.scanLocation = 1
18
+ }
19
+ var color: UInt32 = 0
20
+ stringScanner.scanHexInt32(&color)
21
+
22
+ let r = CGFloat(Int(color >> 16) & 0x000000FF)
23
+ let g = CGFloat(Int(color >> 8) & 0x000000FF)
24
+ let b = CGFloat(Int(color) & 0x000000FF)
25
+
26
+ return UIColor(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: 1)
27
+ }
28
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "cxxNamespace": ["<%- project.package_cpp -%>"],
3
+ "ios": {
4
+ "iosModuleName": "<%- project.name -%>"
5
+ },
6
+ "android": {
7
+ "androidNamespace": <%- JSON.stringify(project.package.split('.')) -%>,
8
+ "androidCxxLibName": "<%- project.package_cpp -%>"
9
+ },
10
+ "autolinking": {
11
+ "<%- project.name -%>": {
12
+ "swift": "Hybrid<%- project.name -%>",
13
+ "kotlin": "Hybrid<%- project.name -%>"
14
+ }
15
+ },
16
+ "ignorePaths": ["node_modules"]
17
+ }
@@ -0,0 +1,11 @@
1
+ import { getHostComponent } from 'react-native-nitro-modules';
2
+ const <%- project.name %>Config = require('../nitrogen/generated/shared/json/<%- project.name %>Config.json');
3
+ import type {
4
+ <%- project.name %>Methods,
5
+ <%- project.name %>Props,
6
+ } from './<%- project.name %>.nitro';
7
+
8
+ export const <%- project.name %>View = getHostComponent<
9
+ <%- project.name %>Props,
10
+ <%- project.name %>Methods
11
+ >('<%- project.name %>', () => <%- project.name %>Config);
@@ -0,0 +1,15 @@
1
+ import type {
2
+ HybridView,
3
+ HybridViewMethods,
4
+ HybridViewProps,
5
+ } from 'react-native-nitro-modules';
6
+
7
+ export interface <%- project.name %>Props extends HybridViewProps {
8
+ color: string;
9
+ }
10
+ export interface <%- project.name %>Methods extends HybridViewMethods {}
11
+
12
+ export type <%- project.name %> = HybridView<
13
+ <%- project.name %>Props,
14
+ <%- project.name %>Methods
15
+ >;