Skip to content

Commit 699e39a

Browse files
authored
refactor: clean up templates (#963)
1 parent 2a8f2f7 commit 699e39a

37 files changed

Lines changed: 211 additions & 276 deletions

File tree

‎packages/create-react-native-library/src/exampleApp/generateExampleApp.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ export default async function generateExampleApp({
406406
const app = await fs.readJSON(path.join(directory, 'app.json'));
407407

408408
app.expo.name = `${config.project.name} Example`;
409-
app.expo.slug = `${config.project.slug}-example`;
409+
app.expo.slug = `${config.project.identifier}-example`;
410410
app.expo.android = app.expo.android ?? {};
411411
app.expo.android.package = `${config.project.package}.example`;
412412
app.expo.ios = app.expo.ios ?? {};

‎packages/create-react-native-library/src/index.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,10 @@ async function create() {
133133

134134
let addedNitro = false;
135135

136-
if (config.project.moduleConfig === 'nitro-modules') {
136+
if (
137+
config.project.moduleConfig === 'nitro-modules' ||
138+
config.project.viewConfig === 'nitro-view'
139+
) {
137140
addedNitro = await addNitroDependencyToLocalLibrary(config);
138141
}
139142

‎packages/create-react-native-library/src/inform.ts‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ export function printLocalLibNextSteps({
5050
addedNitro: boolean;
5151
packageManager: string;
5252
}) {
53+
const isNitro =
54+
config.project.moduleConfig === 'nitro-modules' ||
55+
config.project.viewConfig === 'nitro-view';
56+
5357
console.log(
5458
dedent(`
5559
${kleur.magenta(
@@ -64,11 +68,18 @@ export function printLocalLibNextSteps({
6468
: `- Link the library at ${kleur.blue(
6569
path.relative(process.cwd(), folder)
6670
)} based on your project setup\n`) +
67-
(config.project.moduleConfig === 'nitro-modules' && !addedNitro
71+
(isNitro && !addedNitro
6872
? `- Run ${kleur.blue(
6973
`${packageManager} add react-native-nitro-modules`
74+
)} and ${kleur.blue(
75+
`${packageManager} add --dev nitrogen`
7076
)} to install nitro modules \n`
7177
: '') +
78+
(isNitro
79+
? `- Run ${kleur.blue(
80+
`cd ${path.relative(process.cwd(), folder)} && npx nitrogen`
81+
)} to generate the nitro code \n`
82+
: '') +
7283
`- Run ${kleur.blue(
7384
'pod install --project-directory=ios'
7485
)} to install dependencies with CocoaPods\n` +

‎packages/create-react-native-library/src/prompt.ts‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,17 @@ export const prompt = create(['[name]'], {
240240

241241
return undefined;
242242
},
243-
validate: (input) =>
244-
validateNpmPackage(input).validForNewPackages ||
245-
'Must be a valid npm package name',
243+
validate: (input) => {
244+
if (!validateNpmPackage(input).validForNewPackages) {
245+
return 'Must be a valid npm package name';
246+
}
247+
248+
if (!/^[a-z]/.test(input.replace(/^(react-native-|@[^/]+\/)/, ''))) {
249+
return 'Must start with a letter after the scope or the react-native- prefix';
250+
}
251+
252+
return true;
253+
},
246254
required: true,
247255
},
248256
description: {

‎packages/create-react-native-library/src/template.ts‎

Lines changed: 36 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ export type TemplateVersions = {
88
nitro: string | undefined;
99
};
1010

11-
export type ModuleConfig =
12-
'native-modules' | 'turbo-modules' | 'nitro-modules' | null;
11+
export type ModuleConfig = 'turbo-modules' | 'nitro-modules' | null;
1312

14-
export type ViewConfig = 'paper-view' | 'fabric-view' | 'nitro-view' | null;
13+
export type ViewConfig = 'fabric-view' | 'nitro-view' | null;
1514

1615
// Please think at least 5 times before introducing a new config key
1716
// You can just reuse the existing ones most of the time
@@ -201,9 +200,10 @@ export function generateTemplateConfiguration({
201200
? // If the project name is already in PascalCase, use it as-is
202201
basename
203202
: // Otherwise, convert it to PascalCase and remove any non-alphanumeric characters
204-
`${project.charAt(0).toUpperCase()}${project
205-
.replace(/[^a-z0-9](\w)/g, (_, $1: string) => $1.toUpperCase())
206-
.slice(1)}`,
203+
project
204+
.split(/[^a-z0-9]+/)
205+
.map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)
206+
.join(''),
207207
package: pack,
208208
package_dir: pack.replace(/\./g, path.sep),
209209
package_cpp: pack.replace(/\./g, '_'),
@@ -277,104 +277,52 @@ export async function applyTemplates(
277277
}
278278
}
279279

280-
if (answers.languages === 'js') {
281-
await applyTemplate(config, JS_FILES, folder);
282-
283-
if (config.example != null) {
284-
if (config.example === 'expo') {
285-
await applyTemplate(config, EXAMPLE_EXPO_FILES, folder);
286-
} else {
287-
await applyTemplate(config, EXAMPLE_BARE_FILES, folder);
288-
}
280+
if (config.example != null) {
281+
if (config.example === 'expo') {
282+
await applyTemplate(config, EXAMPLE_EXPO_FILES, folder);
283+
} else {
284+
await applyTemplate(config, EXAMPLE_BARE_FILES, folder);
289285
}
290-
} else {
291-
if (answers.languages === 'cpp') {
292-
if (config.example === 'expo') {
293-
await applyTemplate(config, EXAMPLE_EXPO_FILES, folder);
294-
295-
if (config.project.native) {
296-
await applyTemplate(config, EXAMPLE_NATIVE_COMMON_FILES, folder);
297-
}
298-
} else if (config.example != null) {
299-
await applyTemplate(config, EXAMPLE_BARE_FILES, folder);
300-
301-
if (config.project.native) {
302-
await applyTemplate(config, EXAMPLE_NATIVE_COMMON_FILES, folder);
303-
}
304-
}
305286

306-
await applyTemplate(config, NATIVE_FILES['module_new'], folder);
307-
await applyTemplate(config, CPP_FILES, folder);
308-
309-
if (config.example === 'expo' || config.tools.includes('vite')) {
310-
await applyTemplate(config, JS_FILES, folder);
311-
}
312-
313-
return;
287+
if (config.project.native) {
288+
await applyTemplate(config, EXAMPLE_NATIVE_COMMON_FILES, folder);
314289
}
290+
}
315291

316-
await applyTemplate(config, NATIVE_COMMON_FILES, folder);
317-
318-
if (config.example === 'expo') {
319-
await applyTemplate(config, EXAMPLE_EXPO_FILES, folder);
292+
if (answers.languages === 'js') {
293+
await applyTemplate(config, JS_FILES, folder);
320294

321-
if (config.project.native) {
322-
await applyTemplate(config, EXAMPLE_NATIVE_COMMON_FILES, folder);
323-
}
324-
} else if (config.example != null) {
325-
await applyTemplate(config, EXAMPLE_BARE_FILES, folder);
295+
return;
296+
}
326297

327-
if (config.project.native) {
328-
await applyTemplate(config, EXAMPLE_NATIVE_COMMON_FILES, folder);
329-
}
330-
}
298+
if (answers.languages === 'cpp') {
299+
await applyTemplate(config, NATIVE_FILES['module_new'], folder);
300+
await applyTemplate(config, CPP_FILES, folder);
301+
} else {
302+
await applyTemplate(config, NATIVE_COMMON_FILES, folder);
331303

332304
if (config.project.moduleConfig === 'nitro-modules') {
333305
await applyTemplate(config, NITRO_COMMON_FILES, folder);
334306
await applyTemplate(config, NATIVE_FILES['module_nitro'], folder);
335-
336-
if (config.example === 'expo' || config.tools.includes('vite')) {
337-
await applyTemplate(config, JS_FILES, folder);
338-
}
339-
340-
return;
341-
}
342-
343-
if (config.project.viewConfig === 'nitro-view') {
307+
} else if (config.project.viewConfig === 'nitro-view') {
344308
await applyTemplate(config, NITRO_COMMON_FILES, folder);
345309
await applyTemplate(config, NATIVE_FILES['view_nitro'], folder);
346-
347-
if (config.example === 'expo' || config.tools.includes('vite')) {
348-
await applyTemplate(config, JS_VIEW_FILES, folder);
349-
}
350-
351-
return;
352-
}
353-
354-
if (config.project.moduleConfig !== null) {
355-
await applyTemplate(config, NATIVE_FILES[`module_new`], folder);
310+
} else if (config.project.moduleConfig !== null) {
311+
await applyTemplate(config, NATIVE_FILES['module_new'], folder);
312+
await applyTemplate(config, OBJC_FILES['module_common'], folder);
313+
await applyTemplate(config, KOTLIN_FILES['module_new'], folder);
356314
} else {
357-
await applyTemplate(config, NATIVE_FILES[`view_new`], folder);
315+
await applyTemplate(config, NATIVE_FILES['view_new'], folder);
316+
await applyTemplate(config, OBJC_FILES['view_new'], folder);
317+
await applyTemplate(config, KOTLIN_FILES['view_new'], folder);
358318
}
319+
}
359320

360-
if (config.project.moduleConfig !== null) {
361-
await applyTemplate(config, OBJC_FILES[`module_common`], folder);
321+
if (config.example === 'expo' || config.tools.includes('vite')) {
322+
if (config.project.viewConfig !== null) {
323+
await applyTemplate(config, JS_VIEW_FILES, folder);
362324
} else {
363-
await applyTemplate(config, OBJC_FILES[`view_new`], folder);
364-
}
365-
366-
const templateType = `${
367-
config.project.moduleConfig !== null ? 'module' : 'view'
368-
}_new` as const;
369-
370-
await applyTemplate(config, KOTLIN_FILES[templateType], folder);
371-
372-
if (config.example === 'expo' || config.tools.includes('vite')) {
373-
if (config.project.viewConfig !== null) {
374-
await applyTemplate(config, JS_VIEW_FILES, folder);
375-
} else {
376-
await applyTemplate(config, JS_FILES, folder);
377-
}
325+
await applyTemplate(config, JS_FILES, folder);
378326
}
379327
}
380328
}

‎packages/create-react-native-library/src/utils/local.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { TemplateConfiguration } from '../template.ts';
44

55
type PackageJson = {
66
dependencies?: Record<string, string>;
7+
devDependencies?: Record<string, string>;
78
};
89

910
/** @returns `true` if successfull */
@@ -21,10 +22,13 @@ export async function addNitroDependencyToLocalLibrary(
2122

2223
const appPackageJson: PackageJson = await fs.readJson(appPackageJsonPath);
2324
const dependencies = appPackageJson['dependencies'] ?? {};
25+
const devDependencies = appPackageJson['devDependencies'] ?? {};
2426

2527
dependencies['react-native-nitro-modules'] = config.versions.nitro;
28+
devDependencies['nitrogen'] = config.versions.nitro;
2629

2730
appPackageJson['dependencies'] = dependencies;
31+
appPackageJson['devDependencies'] = devDependencies;
2832
await fs.writeJson(appPackageJsonPath, appPackageJson, {
2933
spaces: 2,
3034
});

‎packages/create-react-native-library/src/utils/resolveNpmPackageVersion.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { spawn } from './spawn.ts';
33
export async function resolveNpmPackageVersion(
44
name: string,
55
fallback: string,
6-
timeout: number = 1000
6+
timeout: number = 5000
77
): Promise<string> {
88
let result: string;
99

@@ -14,7 +14,7 @@ export async function resolveNpmPackageVersion(
1414
new Promise<string>((resolve) => {
1515
setTimeout(() => {
1616
resolve(fallback);
17-
}, timeout);
17+
}, timeout).unref();
1818
}),
1919
promise,
2020
]);

‎packages/create-react-native-library/templates/common-local/$package.json‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
{
22
"name": "<%- project.slug -%>",
33
"version": "0.0.0",
4-
"description": "<%- project.description %>",
4+
"description": <%- JSON.stringify(project.description) %>,
55
"main": "src/index",
6+
<% if (project.moduleConfig === 'turbo-modules' || project.viewConfig === 'fabric-view') { -%>
67
"codegenConfig": {
78
"name": "<%- project.name -%><%- project.viewConfig !== null ? 'View': '' -%>Spec",
89
"type": <%- project.viewConfig !== null ? '"all"': '"modules"' %>,
@@ -20,6 +21,7 @@
2021
<% } -%>
2122
}
2223
},
24+
<% } -%>
2325
"author": "<%- author.name -%> <<%- author.email -%>> (<%- author.url -%>)",
2426
"license": "UNLICENSED",
2527
"homepage": "<%- repo -%>#readme"

‎packages/create-react-native-library/templates/common/$.github/actions/setup/action.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ runs:
55
using: composite
66
steps:
77
- name: Setup Node.js
8-
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
8+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
99
with:
1010
node-version-file: .nvmrc
1111

1212
- name: Restore dependencies
1313
id: yarn-cache
14-
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
14+
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
1515
with:
1616
path: |
1717
**/node_modules
@@ -28,7 +28,7 @@ runs:
2828

2929
- name: Cache dependencies
3030
if: steps.yarn-cache.outputs.cache-hit != 'true'
31-
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
31+
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
3232
with:
3333
path: |
3434
**/node_modules

0 commit comments

Comments
 (0)