sdsetup 0.0.0-stage → 0.1.0
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.
- package/README.md +66 -2
- package/dist/babel.d.ts +25 -0
- package/dist/babel.d.ts.map +1 -0
- package/dist/babel.js +246 -0
- package/dist/babel.js.map +1 -0
- package/dist/config/android.d.ts +15 -0
- package/dist/config/android.d.ts.map +1 -0
- package/dist/config/android.js +133 -0
- package/dist/config/android.js.map +1 -0
- package/dist/config/pods.d.ts +11 -0
- package/dist/config/pods.d.ts.map +1 -0
- package/dist/config/pods.js +28 -0
- package/dist/config/pods.js.map +1 -0
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +27 -0
- package/dist/constants.js.map +1 -0
- package/dist/detect.d.ts +19 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +78 -0
- package/dist/detect.js.map +1 -0
- package/dist/files.d.ts +19 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +48 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +189 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +11 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +37 -0
- package/dist/install.js.map +1 -0
- package/dist/pm.d.ts +14 -0
- package/dist/pm.d.ts.map +1 -0
- package/dist/pm.js +52 -0
- package/dist/pm.js.map +1 -0
- package/dist/setup/cli.d.ts +20 -0
- package/dist/setup/cli.d.ts.map +1 -0
- package/dist/setup/cli.js +133 -0
- package/dist/setup/cli.js.map +1 -0
- package/dist/setup/expo.d.ts +20 -0
- package/dist/setup/expo.d.ts.map +1 -0
- package/dist/setup/expo.js +52 -0
- package/dist/setup/expo.js.map +1 -0
- package/package.json +44 -4
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.setupBareCli = setupBareCli;
|
|
7
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const babel_js_1 = require("../babel.js");
|
|
11
|
+
const android_js_1 = require("../config/android.js");
|
|
12
|
+
const pods_js_1 = require("../config/pods.js");
|
|
13
|
+
function installedReanimatedVersion(info) {
|
|
14
|
+
return info.dependencies['react-native-reanimated'] ?? info.devDependencies['react-native-reanimated'] ?? null;
|
|
15
|
+
}
|
|
16
|
+
function newArchitectureEnabled(cwd) {
|
|
17
|
+
// Best-effort: check android/gradle.properties for newArchEnabled=true.
|
|
18
|
+
const gp = (0, node_path_1.join)(cwd, 'android', 'gradle.properties');
|
|
19
|
+
if (!(0, node_fs_1.existsSync)(gp))
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
const content = (0, node_fs_1.readFileSync)(gp, 'utf8');
|
|
23
|
+
const m = content.match(/^\s*newArchEnabled\s*=\s*(true|false)\s*$/m);
|
|
24
|
+
if (!m)
|
|
25
|
+
return null;
|
|
26
|
+
return m[1] === 'true';
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function setupBareCli(info, opts = {}) {
|
|
33
|
+
const warnings = [];
|
|
34
|
+
const manualSteps = [];
|
|
35
|
+
const version = installedReanimatedVersion(info);
|
|
36
|
+
const plugin = (0, babel_js_1.chooseReanimatedPlugin)(version);
|
|
37
|
+
const major = version?.match(/(\d+)/)?.[1];
|
|
38
|
+
// 1) babel plugin (AST-safe, idempotent, last position)
|
|
39
|
+
const babel = (0, babel_js_1.upsertBabelConfig)(info.cwd, plugin, { dryRun: opts.dryRun });
|
|
40
|
+
if (babel.unparseable) {
|
|
41
|
+
warnings.push(`babel.config.js could not be parsed — left untouched. Manually add '${plugin}' as the LAST babel plugin (see Reanimated getting-started docs).`);
|
|
42
|
+
}
|
|
43
|
+
else if (babel.changed) {
|
|
44
|
+
console.log(picocolors_1.default.dim(` babel.config.js ${babel.created ? 'created' : 'updated'}: '${plugin}' is now the last plugin${opts.dryRun ? ' (planned)' : ''}.`));
|
|
45
|
+
if (babel.backup)
|
|
46
|
+
console.log(picocolors_1.default.dim(` backup: ${babel.backup}`));
|
|
47
|
+
manualSteps.push('Clear the Metro cache after babel changes: `npm start -- --reset-cache` (or `yarn start --reset-cache`).');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.log(picocolors_1.default.dim(` babel.config.js already has '${plugin}' last — no change.`));
|
|
51
|
+
}
|
|
52
|
+
// 2) New Architecture warning for Reanimated 4+
|
|
53
|
+
const isV4 = major != null && Number.parseInt(major, 10) >= 4;
|
|
54
|
+
if (isV4 || version == null) {
|
|
55
|
+
const na = newArchitectureEnabled(info.cwd);
|
|
56
|
+
if (na === false) {
|
|
57
|
+
warnings.push('Reanimated 4.x requires the React Native New Architecture (Fabric), but android/gradle.properties has newArchEnabled=false. Enable the New Architecture or use Reanimated 3.x (no longer actively maintained).');
|
|
58
|
+
}
|
|
59
|
+
else if (na === null && info.hasAndroidDir) {
|
|
60
|
+
warnings.push('Reanimated 4.x requires the React Native New Architecture (Fabric). Could not confirm newArchEnabled=true in android/gradle.properties — verify the New Architecture is enabled.');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// 3) Android MainActivity for react-native-screens
|
|
64
|
+
let androidFile = null;
|
|
65
|
+
let androidChanged = false;
|
|
66
|
+
let androidWouldChange = false;
|
|
67
|
+
let androidBackup = null;
|
|
68
|
+
if (info.hasAndroidDir) {
|
|
69
|
+
const res = (0, android_js_1.ensureMainActivityScreens)(info.cwd, { dryRun: opts.dryRun });
|
|
70
|
+
androidFile = res.file;
|
|
71
|
+
androidChanged = res.applied;
|
|
72
|
+
androidWouldChange = res.wouldChange;
|
|
73
|
+
androidBackup = res.backup;
|
|
74
|
+
if (res.file && (res.applied || res.wouldChange)) {
|
|
75
|
+
console.log(picocolors_1.default.dim(` ${res.file}: RNScreensFragmentFactory wired into MainActivity onCreate${opts.dryRun ? ' (planned)' : ''}.`));
|
|
76
|
+
}
|
|
77
|
+
else if (!res.file) {
|
|
78
|
+
warnings.push('Android: no MainActivity.kt/java found — manually apply the react-native-screens MainActivity change from the React Navigation docs.');
|
|
79
|
+
}
|
|
80
|
+
else if (res.needsManualEdit) {
|
|
81
|
+
warnings.push(res.reason);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.log(picocolors_1.default.dim(` MainActivity already configures RNScreensFragmentFactory — no change.`));
|
|
85
|
+
}
|
|
86
|
+
const predictive = (0, android_js_1.checkPredictiveBackOptOut)(info.cwd);
|
|
87
|
+
if (predictive)
|
|
88
|
+
warnings.push(predictive);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
warnings.push('Android: no android/ directory — if you add Android later, apply the react-native-screens MainActivity change from the React Navigation docs.');
|
|
92
|
+
}
|
|
93
|
+
// 4) iOS pods (covers reanimated + screens + safe-area-context)
|
|
94
|
+
let podCommand = null;
|
|
95
|
+
if (info.hasIosDir) {
|
|
96
|
+
const pods = await (0, pods_js_1.runPodInstall)(info.cwd, { dryRun: opts.dryRun, skipPods: opts.skipPods });
|
|
97
|
+
podCommand = pods.commandStr;
|
|
98
|
+
if (pods.skippedReason && !pods.attempted) {
|
|
99
|
+
if (opts.skipPods) {
|
|
100
|
+
manualSteps.push(`iOS pods skipped via --skip-pods — run \`${pods.commandStr ?? 'npx pod-install ios'}\` on macOS if needed.`);
|
|
101
|
+
}
|
|
102
|
+
else if (opts.dryRun) {
|
|
103
|
+
manualSteps.push(`iOS: run \`${pods.commandStr ?? 'npx pod-install ios'}\` on macOS after applying.`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
warnings.push(`iOS pods: ${pods.skippedReason}`);
|
|
107
|
+
if (pods.commandStr)
|
|
108
|
+
manualSteps.push(`iOS: run \`${pods.commandStr}\` on macOS.`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (pods.attempted && !pods.ok) {
|
|
112
|
+
warnings.push(`iOS pods: ${pods.skippedReason}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
manualSteps.push('iOS: no ios/ directory — nothing to pod-install. If you add iOS later, run `npx pod-install ios` on macOS.');
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
plugin,
|
|
120
|
+
babelChanged: babel.changed,
|
|
121
|
+
babelFile: babel.file,
|
|
122
|
+
babelBackup: babel.backup,
|
|
123
|
+
babelCreated: babel.created,
|
|
124
|
+
androidFile,
|
|
125
|
+
androidChanged,
|
|
126
|
+
androidWouldChange,
|
|
127
|
+
androidBackup,
|
|
128
|
+
warnings,
|
|
129
|
+
manualSteps,
|
|
130
|
+
podCommand,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/setup/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ProjectInfo } from '../detect.js';
|
|
2
|
+
export interface ExpoSetupResult {
|
|
3
|
+
babelAction: string;
|
|
4
|
+
babelChanged: boolean;
|
|
5
|
+
babelFile: string;
|
|
6
|
+
babelBackup: string | null;
|
|
7
|
+
presetHandlesPlugin: boolean;
|
|
8
|
+
warnings: string[];
|
|
9
|
+
manualSteps: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Expo setup per current Reanimated docs:
|
|
13
|
+
* - SDK >= 50 template includes the worklets babel plugin via babel-preset-expo -> do NOT edit babel.config.js.
|
|
14
|
+
* - Older SDKs may need `react-native-worklets/plugin` appended last manually.
|
|
15
|
+
* React Navigation on Expo needs no native config beyond install.
|
|
16
|
+
*/
|
|
17
|
+
export declare function setupExpo(info: ProjectInfo, opts?: {
|
|
18
|
+
dryRun?: boolean;
|
|
19
|
+
}): ExpoSetupResult;
|
|
20
|
+
//# sourceMappingURL=expo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expo.d.ts","sourceRoot":"","sources":["../../src/setup/expo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,eAAe,CAqC7F"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.setupExpo = setupExpo;
|
|
7
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
8
|
+
const babel_js_1 = require("../babel.js");
|
|
9
|
+
const constants_js_1 = require("../constants.js");
|
|
10
|
+
/**
|
|
11
|
+
* Expo setup per current Reanimated docs:
|
|
12
|
+
* - SDK >= 50 template includes the worklets babel plugin via babel-preset-expo -> do NOT edit babel.config.js.
|
|
13
|
+
* - Older SDKs may need `react-native-worklets/plugin` appended last manually.
|
|
14
|
+
* React Navigation on Expo needs no native config beyond install.
|
|
15
|
+
*/
|
|
16
|
+
function setupExpo(info, opts = {}) {
|
|
17
|
+
const warnings = [];
|
|
18
|
+
const manualSteps = [];
|
|
19
|
+
const sdk = info.expoSdkMajor;
|
|
20
|
+
const reanimatedVersion = info.dependencies['react-native-reanimated'] ?? info.devDependencies['react-native-reanimated'] ?? null;
|
|
21
|
+
const plugin = (0, babel_js_1.chooseReanimatedPlugin)(reanimatedVersion);
|
|
22
|
+
// babel-preset-expo ships the worklets plugin since SDK 50 (Reanimated 4 only).
|
|
23
|
+
const presetHandlesPlugin = plugin === constants_js_1.WORKLETS_PLUGIN && sdk != null && sdk >= 50;
|
|
24
|
+
if (presetHandlesPlugin) {
|
|
25
|
+
return {
|
|
26
|
+
babelAction: `Expo SDK ${sdk}: babel-preset-expo already includes the worklets plugin — babel.config.js left untouched.`,
|
|
27
|
+
babelChanged: false,
|
|
28
|
+
babelFile: `${info.cwd}/babel.config.js`,
|
|
29
|
+
babelBackup: null,
|
|
30
|
+
presetHandlesPlugin: true,
|
|
31
|
+
warnings,
|
|
32
|
+
manualSteps,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const res = (0, babel_js_1.upsertBabelConfig)(info.cwd, plugin, { dryRun: opts.dryRun });
|
|
36
|
+
const label = sdk != null ? `Expo SDK ${sdk}` : 'Expo SDK version unknown';
|
|
37
|
+
const action = res.changed
|
|
38
|
+
? `${label}: ensured '${plugin}' is the last babel plugin in babel.config.js${opts.dryRun ? ' (planned)' : ''}.`
|
|
39
|
+
: `${label}: babel.config.js already has '${plugin}' last — no change.`;
|
|
40
|
+
if (res.unparseable) {
|
|
41
|
+
warnings.push(`babel.config.js could not be parsed as JS/TS — left untouched. Manually ensure '${plugin}' is the last plugin (see Reanimated getting-started docs).`);
|
|
42
|
+
}
|
|
43
|
+
if (res.changed && !opts.dryRun) {
|
|
44
|
+
manualSteps.push('Clear the Metro cache after babel changes: `npx expo start -c`.');
|
|
45
|
+
}
|
|
46
|
+
else if (res.changed && opts.dryRun) {
|
|
47
|
+
manualSteps.push('After applying: clear Metro cache with `npx expo start -c`.');
|
|
48
|
+
}
|
|
49
|
+
console.log(picocolors_1.default.dim(` ${action}`));
|
|
50
|
+
return { babelAction: action, babelChanged: res.changed, babelFile: res.file, babelBackup: res.backup, presetHandlesPlugin: false, warnings, manualSteps };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=expo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expo.js","sourceRoot":"","sources":["../../src/setup/expo.ts"],"names":[],"mappings":";;;;;AAqBA,8BAqCC;AA1DD,4DAA4B;AAE5B,0CAAwE;AACxE,kDAAkD;AAYlD;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,IAAiB,EAAE,OAA6B,EAAE;IAC1E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;IAC9B,MAAM,iBAAiB,GACrB,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;IAC1G,MAAM,MAAM,GAAG,IAAA,iCAAsB,EAAC,iBAAiB,CAAC,CAAC;IACzD,gFAAgF;IAChF,MAAM,mBAAmB,GAAG,MAAM,KAAK,8BAAe,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;IACnF,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO;YACL,WAAW,EAAE,YAAY,GAAG,4FAA4F;YACxH,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,kBAAkB;YACxC,WAAW,EAAE,IAAI;YACjB,mBAAmB,EAAE,IAAI;YACzB,QAAQ;YACR,WAAW;SACZ,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,4BAAiB,EAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,0BAA0B,CAAC;IAC3E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO;QACxB,CAAC,CAAC,GAAG,KAAK,cAAc,MAAM,gDAAgD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG;QAChH,CAAC,CAAC,GAAG,KAAK,kCAAkC,MAAM,qBAAqB,CAAC;IAC1E,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CACX,mFAAmF,MAAM,6DAA6D,CACvJ,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,WAAW,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IACtF,CAAC;SAAM,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,WAAW,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,oBAAE,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC7J,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sdsetup",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Setup React Native (Expo or bare CLI) projects with Redux Toolkit, Reanimated, Formik, Yup, React Query and React Navigation — installs + auto-config.",
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"bin": {
|
|
7
|
+
"sdsetup": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "ts-node src/index.ts",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"lint": "tsc --noEmit",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@babel/parser": "^7.26.4",
|
|
23
|
+
"execa": "^9.5.2",
|
|
24
|
+
"picocolors": "^1.1.1",
|
|
25
|
+
"prompts": "^2.4.2",
|
|
26
|
+
"recast": "^0.23.9"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.10.2",
|
|
30
|
+
"@types/prompts": "^2.4.9",
|
|
31
|
+
"typescript": "^5.7.2",
|
|
32
|
+
"vitest": "^2.1.8"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18"
|
|
36
|
+
},
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"keywords": [
|
|
39
|
+
"react-native",
|
|
40
|
+
"expo",
|
|
41
|
+
"cli",
|
|
42
|
+
"setup",
|
|
43
|
+
"reanimated",
|
|
44
|
+
"react-navigation"
|
|
45
|
+
]
|
|
46
|
+
}
|