Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 39 additions & 87 deletions packages/create-react-native-library/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,33 +16,31 @@ import {
createMetadata,
createQuestions,
type Answers,
type Args,
} from './input';
import { applyTemplates, generateTemplateConfiguration } from './template';
import { assertNpxExists, assertUserInput } from './utils/assert';
import { assertNpxExists } from './utils/assert';
import { createInitialGitCommit } from './utils/initialCommit';
import { prompt } from './utils/prompt';
import { resolveNpmPackageVersion } from './utils/resolveNpmPackageVersion';
import {
addNitroDependencyToLocalLibrary,
linkLocalLibrary,
promptLocalLibrary,
} from './utils/local';
import { determinePackageManager } from './utils/packageManager';

const FALLBACK_BOB_VERSION = '0.40.5';
const FALLBACK_NITRO_MODULES_VERSION = '0.22.1';
const SUPPORTED_REACT_NATIVE_VERSION = '0.78.2';

type Args = Partial<Answers> & {
name?: string;
$0: string;
[key: string]: unknown;
};

// eslint-disable-next-line @typescript-eslint/no-unused-expressions
yargs
.command(
'$0 [name]',
'create a react native library',
acceptedArgs,
// @ts-expect-error Some types are still incompatible
create
)
.command('$0 [name]', 'create a react native library', acceptedArgs, create)
.demandCommand()
.recommendCommands()
.fail(printErrorHelp)
Expand All @@ -52,7 +50,7 @@ yargs
})
.strict().argv;

async function create(_argv: yargs.Arguments<Args>) {
async function create(_argv: Args) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { _, $0, ...argv } = _argv;

Expand All @@ -66,27 +64,20 @@ async function create(_argv: yargs.Arguments<Args>) {
FALLBACK_NITRO_MODULES_VERSION
);

const local = await promptLocalLibrary(argv);
const folder = await promptPath(argv, local);

await assertNpxExists();

const basename = path.basename(folder);
const questions = await createQuestions(argv);

const questions = await createQuestions({ basename, local });

assertUserInput(questions, argv);
const promptAnswers = await prompt<Answers, typeof argv>(questions, argv, {
interactive: argv.interactive,
});

const promptAnswers = await prompt(questions, argv);
const answers: Answers = {
const answers = {
...promptAnswers,
reactNativeVersion:
promptAnswers.reactNativeVersion ?? SUPPORTED_REACT_NATIVE_VERSION,
local,
};

assertUserInput(questions, answers);

const bobVersion = await bobVersionPromise;

const nitroModulesVersion =
Expand All @@ -101,10 +92,12 @@ async function create(_argv: yargs.Arguments<Args>) {
// Nitro codegen's version is always the same as nitro modules version.
nitroCodegen: nitroModulesVersion,
},
basename,
basename: path.basename(answers.name ?? answers.directory),
answers,
});

const folder = path.resolve(process.cwd(), answers.directory);

await fs.mkdirp(folder);

if (answers.reactNativeVersion !== SUPPORTED_REACT_NATIVE_VERSION) {
Expand Down Expand Up @@ -148,76 +141,35 @@ async function create(_argv: yargs.Arguments<Args>) {
)}!\n`
);

if (!local) {
await createInitialGitCommit(folder);

printSuccessMessage();

printNonLocalLibNextSteps(config);
return;
}

const packageManager = await determinePackageManager();

let addedNitro = false;
if (config.project.moduleConfig === 'nitro-modules') {
addedNitro = await addNitroDependencyToLocalLibrary(config);
}
if (answers.local) {
const packageManager = await determinePackageManager();

const linkedLocalLibrary = await linkLocalLibrary(
config,
folder,
packageManager
);
let addedNitro = false;

printSuccessMessage();
if (config.project.moduleConfig === 'nitro-modules') {
addedNitro = await addNitroDependencyToLocalLibrary(config);
}

printLocalLibNextSteps({
config,
packageManager,
linkedLocalLibrary,
addedNitro,
folder,
});
}
const linkedLocalLibrary = await linkLocalLibrary(
config,
folder,
packageManager
);

async function promptPath(argv: Args, local: boolean) {
let folder: string;
printSuccessMessage();

if (argv.name && !local) {
folder = path.join(process.cwd(), argv.name);
} else {
const answers = await prompt({
type: 'text',
name: 'folder',
message: `Where do you want to create the library?`,
initial:
local && argv.name && !argv.name.includes('/')
? `modules/${argv.name}`
: argv.name,
validate: (input) => {
if (!input) {
return 'Cannot be empty';
}

if (fs.pathExistsSync(path.join(process.cwd(), input))) {
return 'Folder already exists';
}

return true;
},
printLocalLibNextSteps({
config,
packageManager,
linkedLocalLibrary,
addedNitro,
folder,
});
} else {
await createInitialGitCommit(folder);

folder = path.join(process.cwd(), answers.folder);
}
printSuccessMessage();

if (await fs.pathExists(folder)) {
throw new Error(
`A folder already exists at ${kleur.blue(
folder
)}! Please specify another folder name or delete the existing one.`
);
printNonLocalLibNextSteps(config);
}

return folder;
}
15 changes: 7 additions & 8 deletions packages/create-react-native-library/src/inform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,20 +88,19 @@ export function printLocalLibNextSteps({
export function printErrorHelp(message: string, error: Error) {
console.log('\n');

if (error) {
console.log(kleur.red(error.message));
throw error;
}

if (message) {
console.log(kleur.red(message));
console.log(message);
} else {
console.log(
kleur.red(`An unknown error occurred. See '--help' for usage guide.`)
`An unknown error occurred. See ${kleur.blue('--help')} for usage guide.`
);
}

process.exit(1);
if (error) {
console.log('\n');

throw error;
}
}

export function printUsedRNVersion(
Expand Down
Loading
Loading