Files
react-native/private/eslint-plugin-monorepo/rules/react-native-manifest.js
Tim Yung d17f7d0a29 RN: Private Package for Monorepo ESLint Rules (#51858)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/51858

Creates a new private package for the ESLint rules that are defined in the `facebook/react-native` repository for linting the monorepo itself: `react-native/eslint-plugin-monorepo`

It resides in a new `private/` directory that will be used for all private packages. I plan to move private packages over from `packages/` and `tools/`.

This also eliminates the need for the `eslint-plugin-lint` dependency in open source.

Changelog:
[Internal]

Reviewed By: cortinico

Differential Revision: D76088698

fbshipit-source-id: 697d5d91421cda4ef3f96d0497a96954cd047296
2025-06-09 20:30:32 -07:00

86 lines
2.2 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @noflow
*/
'use strict';
/**
* React Native's monorepo requires that "devDependencies" be declared at the
* root package.json and "dependencies" in the `react-native` package.json to
* permit the ability to segment dependent workspaces into 1) a development
* workspace root (which depends on the monorepo) and 2) a production workspace
* (which depends on the `react-native` package).
*/
const PACKAGE_CONSTRAINTS = {
'@react-native/monorepo': {
disallowed: [
{
property: 'dependencies',
describe:
"Declare 'dependencies' in `packages/react-native/package.json`.",
},
],
},
'react-native': {
disallowed: [
{
property: 'devDependencies',
describe: "Declare 'devDependencies' in `<root>/package.json`.",
},
],
},
};
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Enforce react-native manifest constraints',
},
messages: {
propertyDisallowed:
"'{{property}}' is disallowed in this file. {{describe}}",
},
schema: [],
},
create(context) {
// @see https://www.npmjs.com/package/jsonc-eslint-parser
if (!context.parserServices.isJSON) {
return {};
}
return {
'JSONExpressionStatement > JSONObjectExpression'(node) {
const propertyNodes = {};
for (const propertyNode of node.properties) {
propertyNodes[propertyNode.key.value] = propertyNode;
}
const name = propertyNodes.name?.value?.value;
const constraints = PACKAGE_CONSTRAINTS[name];
if (constraints == null) {
return;
}
for (const {property, describe} of constraints.disallowed) {
const propertyNode = propertyNodes[property];
if (propertyNode == null) {
continue;
}
context.report({
node: propertyNode,
messageId: 'propertyDisallowed',
data: {property, describe},
});
}
},
};
},
};