diff --git a/docs/docs/configuration-nitro-json.md b/docs/docs/configuration-nitro-json.md index 11f64db46..b66c73c16 100644 --- a/docs/docs/configuration-nitro-json.md +++ b/docs/docs/configuration-nitro-json.md @@ -17,7 +17,8 @@ "androidCxxLibName": "$$androidCxxLibName$$" }, "autolinking": {}, - "ignorePaths": ["**/node_modules"] + "ignorePaths": ["**/node_modules"], + "createGitAttributes": true } ``` @@ -176,3 +177,7 @@ Here, the Hybrid Object "`Math`" is autolinked to create an instance of `HybridM Configures the TypeScript parser to ignore specific given paths when looking for `*.nitro.ts` specs. By default, this is empty (`[]`), but it can be set to ignore paths like `["node_modules", "lib"]`. + +## `createGitAttributes` + +Configures whether a `.gitattributes` file will be generated in the `nitrogen/generated/` directory to mark files as [`linguist-generated`](https://docs.github.com/en/repositories/working-with-files/managing-files/customizing-how-changed-files-appear-on-github) for GitHub. diff --git a/docs/static/nitro.schema.json b/docs/static/nitro.schema.json index f2554a284..afc6933ce 100644 --- a/docs/static/nitro.schema.json +++ b/docs/static/nitro.schema.json @@ -94,6 +94,11 @@ "type": "string" }, "description": "A list of paths relative to the project directory that should be ignored by nitrogen. Nitrogen will not look for `.nitro.ts` files in these directories." + }, + "createGitAttributes": { + "type": "boolean", + "default": true, + "description": "Configures whether a `.gitattributes` file will be generated in the `nitrogen/generated/` directory to mark files as `linguist-generated` for GitHub." } } } diff --git a/packages/nitrogen/src/config/NitroConfig.ts b/packages/nitrogen/src/config/NitroConfig.ts index 06602632e..a1c04c4cb 100644 --- a/packages/nitrogen/src/config/NitroConfig.ts +++ b/packages/nitrogen/src/config/NitroConfig.ts @@ -102,6 +102,14 @@ export const NitroConfig = { return [...ANDROID_BASE_NAMESPACE, ...userPackage, ...subPackage] }, + /** + * Get the autolinking configuration of all HybridObjects. + * Those will be generated and default-constructed. + */ + getAutolinkedHybridObjects(): NitroUserConfig['autolinking'] { + return getUserConfig().autolinking + }, + /** * Get the paths that will be ignored when loading the TypeScript project. * In most cases, this just contains `node_modules/`. @@ -110,11 +118,7 @@ export const NitroConfig = { return getUserConfig().ignorePaths ?? [] }, - /** - * Get the autolinking configuration of all HybridObjects. - * Those will be generated and default-constructed. - */ - getAutolinkedHybridObjects(): NitroUserConfig['autolinking'] { - return getUserConfig().autolinking + getCreateGitAttributes(): boolean { + return getUserConfig().createGitAttributes ?? false }, } diff --git a/packages/nitrogen/src/config/NitroUserConfig.ts b/packages/nitrogen/src/config/NitroUserConfig.ts index e0a793266..3d8051fb2 100644 --- a/packages/nitrogen/src/config/NitroUserConfig.ts +++ b/packages/nitrogen/src/config/NitroUserConfig.ts @@ -1,7 +1,4 @@ import { z } from 'zod' -import { capitalizeName } from '../utils.js' -import path from 'path' -import { promises as fs } from 'fs' // Namespaces and package names in C++/Java will be matched with a regex. const safeNamePattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/ @@ -93,28 +90,14 @@ export const NitroUserConfigSchema = z.object({ * Nitrogen will not look for `.nitro.ts` files in these directories. */ ignorePaths: z.array(z.string()).optional(), + /** + * Configures whether a `.gitattributes` file will be generated in + * the `nitrogen/generated/` directory to mark files as linguist-generated for GitHub. + */ + createGitAttributes: z.boolean().optional().default(true), }) /** * Represents the structure of a `nitro.json` config file. */ export type NitroUserConfig = z.infer - -export function writeUserConfigFile( - moduleName: string, - directory: string -): Promise { - const config: NitroUserConfig = { - android: { - androidCxxLibName: `Nitro${capitalizeName(moduleName)}`, - androidNamespace: [moduleName.toLowerCase()], - }, - cxxNamespace: [moduleName.toLowerCase()], - ios: { - iosModuleName: `Nitro${capitalizeName(moduleName)}`, - }, - autolinking: {}, - } - const dir = path.join(directory, 'nitro.json') - return fs.writeFile(dir, JSON.stringify(config, null, 2)) -} diff --git a/packages/nitrogen/src/createGitAttributes.ts b/packages/nitrogen/src/createGitAttributes.ts new file mode 100644 index 000000000..00d8ed3e3 --- /dev/null +++ b/packages/nitrogen/src/createGitAttributes.ts @@ -0,0 +1,8 @@ +import fs from 'fs/promises' +import path from 'path' + +export async function createGitAttributes(folder: string): Promise { + const file = path.join(folder, '.gitattributes') + // Marks all files in this current folder as "generated" + await fs.writeFile(file, `* linguist-generated`) +} diff --git a/packages/nitrogen/src/nitrogen.ts b/packages/nitrogen/src/nitrogen.ts index 021f5cb19..56299f9c1 100644 --- a/packages/nitrogen/src/nitrogen.ts +++ b/packages/nitrogen/src/nitrogen.ts @@ -17,6 +17,7 @@ import { NitroConfig } from './config/NitroConfig.js' import { createIOSAutolinking } from './autolinking/createIOSAutolinking.js' import { createAndroidAutolinking } from './autolinking/createAndroidAutolinking.js' import type { Autolinking } from './autolinking/Autolinking.js' +import { createGitAttributes } from './createGitAttributes.js' interface NitrogenOptions { baseDirectory: string @@ -159,7 +160,7 @@ export async function runNitrogen({ generatedSpecs++ } catch (error) { const message = indent(errorToString(error), ' ') - console.error( + Logger.error( chalk.redBright( ` ❌ Failed to generate spec for ${typeName}! ${message}` ) @@ -169,7 +170,7 @@ export async function runNitrogen({ } if (generatedSpecs === startedWithSpecs) { - console.error( + Logger.error( chalk.redBright( ` ❌ No specs found in ${sourceFile.getBaseName()}!` ) @@ -203,6 +204,15 @@ export async function runNitrogen({ } } + try { + if (NitroConfig.getCreateGitAttributes()) { + // write a .gitattributes file + await createGitAttributes(outputDirectory) + } + } catch { + Logger.error(`❌ Failed to write ${chalk.dim(`.gitattributes`)}!`) + } + return { generatedFiles: filesAfter, targetSpecsCount: targetSpecs, diff --git a/packages/react-native-nitro-image/nitro.json b/packages/react-native-nitro-image/nitro.json index 3e4aa4f56..bc88824b1 100644 --- a/packages/react-native-nitro-image/nitro.json +++ b/packages/react-native-nitro-image/nitro.json @@ -35,5 +35,6 @@ }, "ignorePaths": [ "**/node_modules" - ] + ], + "createGitAttributes": false }