feat(react-native): add upgrade-native generator to upgrade native code (#9925)
This commit is contained in:
parent
4d17b3275e
commit
6e72dc6c12
@ -429,6 +429,47 @@
|
|||||||
"implementation": "/packages/react-native/src/generators/stories/stories#storiesGenerator.ts",
|
"implementation": "/packages/react-native/src/generators/stories/stories#storiesGenerator.ts",
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"path": "/packages/react-native/src/generators/stories/schema.json"
|
"path": "/packages/react-native/src/generators/stories/schema.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "upgrade-native",
|
||||||
|
"factory": "./src/generators/upgrade-native/upgrade-native#reactNativeUpgradeNativeGenerator",
|
||||||
|
"schema": {
|
||||||
|
"$schema": "http://json-schema.org/schema",
|
||||||
|
"cli": "nx",
|
||||||
|
"$id": "NxReactNativeUpgradeNativeConfigure",
|
||||||
|
"title": "React native upgrade native configuration",
|
||||||
|
"description": "Upgrade native iOS and Android code to latest.",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Project name.",
|
||||||
|
"$default": { "$source": "argv", "index": 0 }
|
||||||
|
},
|
||||||
|
"displayName": {
|
||||||
|
"description": "The display name to show in the application. Defaults to name.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"js": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Generate JavaScript files rather than TypeScript files",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"e2eTestRunner": {
|
||||||
|
"description": "Adds the specified e2e test runner.",
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["detox", "none"],
|
||||||
|
"default": "detox"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["name"],
|
||||||
|
"presets": []
|
||||||
|
},
|
||||||
|
"description": "Destructive command to upgrade native iOS and Android code to latest.",
|
||||||
|
"hidden": false,
|
||||||
|
"implementation": "/packages/react-native/src/generators/upgrade-native/upgrade-native#reactNativeUpgradeNativeGenerator.ts",
|
||||||
|
"aliases": [],
|
||||||
|
"path": "/packages/react-native/src/generators/upgrade-native/schema.json"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"executors": [
|
"executors": [
|
||||||
|
|||||||
@ -230,7 +230,8 @@
|
|||||||
"component",
|
"component",
|
||||||
"storybook-configuration",
|
"storybook-configuration",
|
||||||
"component-story",
|
"component-story",
|
||||||
"stories"
|
"stories",
|
||||||
|
"upgrade-native"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -46,6 +46,12 @@
|
|||||||
"schema": "./src/generators/stories/schema.json",
|
"schema": "./src/generators/stories/schema.json",
|
||||||
"description": "Create stories for all components declared in an application or library.",
|
"description": "Create stories for all components declared in an application or library.",
|
||||||
"hidden": false
|
"hidden": false
|
||||||
|
},
|
||||||
|
"upgrade-native": {
|
||||||
|
"factory": "./src/generators/upgrade-native/upgrade-native#reactNativeUpgradeNativeSchematic",
|
||||||
|
"schema": "./src/generators/upgrade-native/schema.json",
|
||||||
|
"description": "Destructive command to upgrade native iOS and Android code to latest.",
|
||||||
|
"hidden": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"generators": {
|
"generators": {
|
||||||
@ -92,6 +98,12 @@
|
|||||||
"schema": "./src/generators/stories/schema.json",
|
"schema": "./src/generators/stories/schema.json",
|
||||||
"description": "Create stories/specs for all components declared in an application or library.",
|
"description": "Create stories/specs for all components declared in an application or library.",
|
||||||
"hidden": false
|
"hidden": false
|
||||||
|
},
|
||||||
|
"upgrade-native": {
|
||||||
|
"factory": "./src/generators/upgrade-native/upgrade-native#reactNativeUpgradeNativeGenerator",
|
||||||
|
"schema": "./src/generators/upgrade-native/schema.json",
|
||||||
|
"description": "Destructive command to upgrade native iOS and Android code to latest.",
|
||||||
|
"hidden": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { names, Tree } from '@nrwl/devkit';
|
import { names } from '@nrwl/devkit';
|
||||||
import { join } from 'path';
|
import { join } from 'path';
|
||||||
import { Schema } from '../schema';
|
import { Schema } from '../schema';
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,30 @@
|
|||||||
|
import { generateFiles, joinPathFragments, Tree } from '@nrwl/devkit';
|
||||||
|
import { join } from 'path';
|
||||||
|
import { normalizeOptions } from './normalize-options';
|
||||||
|
|
||||||
|
import { UpgradeNativeConfigureSchema } from '../schema';
|
||||||
|
|
||||||
|
export function createNativeFiles(
|
||||||
|
host: Tree,
|
||||||
|
schema: UpgradeNativeConfigureSchema,
|
||||||
|
root: string
|
||||||
|
) {
|
||||||
|
const options = normalizeOptions(schema);
|
||||||
|
|
||||||
|
const iosProjectRoot = joinPathFragments(root, 'ios');
|
||||||
|
const androidProjectRoot = joinPathFragments(root, 'android');
|
||||||
|
|
||||||
|
generateFiles(
|
||||||
|
host,
|
||||||
|
join(__dirname, '../../application/files/app/ios'),
|
||||||
|
iosProjectRoot,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
|
||||||
|
generateFiles(
|
||||||
|
host,
|
||||||
|
join(__dirname, '../../application/files/app/android'),
|
||||||
|
androidProjectRoot,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
import { names } from '@nrwl/devkit';
|
||||||
|
import { UpgradeNativeConfigureSchema } from '../schema';
|
||||||
|
|
||||||
|
export interface NormalizedSchema {
|
||||||
|
name: string;
|
||||||
|
displayName: string;
|
||||||
|
className: string;
|
||||||
|
lowerCaseName: string;
|
||||||
|
entryFile: string;
|
||||||
|
entryFileIos: string;
|
||||||
|
e2eTestRunner: 'detox' | 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
export function normalizeOptions(
|
||||||
|
options: UpgradeNativeConfigureSchema
|
||||||
|
): NormalizedSchema {
|
||||||
|
const { fileName, className } = names(options.name);
|
||||||
|
|
||||||
|
const entryFileIos = 'src/main';
|
||||||
|
const entryFile = options.js ? 'src/main.js' : 'src/main.tsx';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* if options.name is "my-app"
|
||||||
|
* name: "my-app", className: 'MyApp', lowerCaseName: 'myapp', displayName: 'MyApp'
|
||||||
|
* if options.name is "myApp"
|
||||||
|
* name: "my-app", className: 'MyApp', lowerCaseName: 'myapp', displayName: 'MyApp'
|
||||||
|
*/
|
||||||
|
return {
|
||||||
|
name: fileName,
|
||||||
|
className,
|
||||||
|
lowerCaseName: className.toLowerCase(),
|
||||||
|
displayName: options.displayName || className,
|
||||||
|
entryFile,
|
||||||
|
entryFileIos,
|
||||||
|
e2eTestRunner: options.e2eTestRunner,
|
||||||
|
};
|
||||||
|
}
|
||||||
8
packages/react-native/src/generators/upgrade-native/schema.d.ts
vendored
Normal file
8
packages/react-native/src/generators/upgrade-native/schema.d.ts
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { Linter } from '@nrwl/linter';
|
||||||
|
|
||||||
|
export interface UpgradeNativeConfigureSchema {
|
||||||
|
name: string;
|
||||||
|
displayName?: string;
|
||||||
|
js: boolean; // default is false
|
||||||
|
e2eTestRunner: 'detox' | 'none'; // default is detox
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/schema",
|
||||||
|
"cli": "nx",
|
||||||
|
"$id": "NxReactNativeUpgradeNativeConfigure",
|
||||||
|
"title": "React native upgrade native configuration",
|
||||||
|
"description": "Upgrade native iOS and Android code to latest.",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Project name.",
|
||||||
|
"$default": {
|
||||||
|
"$source": "argv",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"displayName": {
|
||||||
|
"description": "The display name to show in the application. Defaults to name.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"js": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Generate JavaScript files rather than TypeScript files",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"e2eTestRunner": {
|
||||||
|
"description": "Adds the specified e2e test runner.",
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["detox", "none"],
|
||||||
|
"default": "detox"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["name"]
|
||||||
|
}
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
/**
|
||||||
|
* This function is a destructive command that replace React Native iOS and Android code with latest.
|
||||||
|
* It would replace the Android and iOS folder entirely.
|
||||||
|
*/
|
||||||
|
import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial';
|
||||||
|
import { UpgradeNativeConfigureSchema } from './schema';
|
||||||
|
import {
|
||||||
|
convertNxGenerator,
|
||||||
|
Tree,
|
||||||
|
joinPathFragments,
|
||||||
|
GeneratorCallback,
|
||||||
|
readProjectConfiguration,
|
||||||
|
} from '@nrwl/devkit';
|
||||||
|
import { join } from 'path';
|
||||||
|
import { createNativeFiles } from './lib/create-native-files';
|
||||||
|
import { existsSync, removeSync } from 'fs-extra';
|
||||||
|
|
||||||
|
import { runPodInstall } from '../../utils/pod-install-task';
|
||||||
|
import { runChmod } from '../../utils/chmod-task';
|
||||||
|
|
||||||
|
export async function reactNativeUpgradeNativeGenerator(
|
||||||
|
host: Tree,
|
||||||
|
schema: UpgradeNativeConfigureSchema
|
||||||
|
): Promise<GeneratorCallback> {
|
||||||
|
const { projectType, root } = readProjectConfiguration(host, schema.name);
|
||||||
|
const iosProjectRoot = joinPathFragments(host.root, root, 'ios');
|
||||||
|
const androidProjectRoot = joinPathFragments(host.root, root, 'android');
|
||||||
|
|
||||||
|
if (
|
||||||
|
projectType !== 'application' ||
|
||||||
|
!existsSync(iosProjectRoot) ||
|
||||||
|
!existsSync(androidProjectRoot)
|
||||||
|
) {
|
||||||
|
throw new Error(`Could not upgrade React Native code for ${schema.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
removeSync(iosProjectRoot);
|
||||||
|
removeSync(androidProjectRoot);
|
||||||
|
|
||||||
|
createNativeFiles(host, schema, root);
|
||||||
|
|
||||||
|
const podInstallTask = runPodInstall(iosProjectRoot);
|
||||||
|
const chmodTaskGradlew = runChmod(join(androidProjectRoot, 'gradlew'), 0o775);
|
||||||
|
const chmodTaskGradlewBat = runChmod(
|
||||||
|
join(androidProjectRoot, 'gradlew.bat'),
|
||||||
|
0o775
|
||||||
|
);
|
||||||
|
|
||||||
|
return runTasksInSerial(
|
||||||
|
podInstallTask,
|
||||||
|
chmodTaskGradlew,
|
||||||
|
chmodTaskGradlewBat
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default reactNativeUpgradeNativeGenerator;
|
||||||
|
export const reactNativeUpgradeNativeSchematic = convertNxGenerator(
|
||||||
|
reactNativeUpgradeNativeGenerator
|
||||||
|
);
|
||||||
Loading…
x
Reference in New Issue
Block a user