{"id":31574490,"url":"https://github.com/gftf2011/arch-unit-js","last_synced_at":"2025-10-05T16:05:36.339Z","repository":{"id":309058650,"uuid":"1021056257","full_name":"gftf2011/arch-unit-js","owner":"gftf2011","description":"ArchUnit clone tool for javascript Projects","archived":false,"fork":false,"pushed_at":"2025-09-16T03:04:44.000Z","size":1463,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-16T03:30:22.207Z","etag":null,"topics":["architecture","babel","javascript-library","testing"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/arch-unit-js","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gftf2011.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-16T20:09:15.000Z","updated_at":"2025-09-12T10:40:48.000Z","dependencies_parsed_at":"2025-08-09T16:23:57.340Z","dependency_job_id":"c92f4c01-fca1-4a03-8495-10b9e7bf9861","html_url":"https://github.com/gftf2011/arch-unit-js","commit_stats":null,"previous_names":["gftf2011/arch-unit-js"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gftf2011/arch-unit-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Farch-unit-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Farch-unit-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Farch-unit-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Farch-unit-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gftf2011","download_url":"https://codeload.github.com/gftf2011/arch-unit-js/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Farch-unit-js/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278477867,"owners_count":25993550,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["architecture","babel","javascript-library","testing"],"created_at":"2025-10-05T16:05:32.641Z","updated_at":"2025-10-05T16:05:36.332Z","avatar_url":"https://github.com/gftf2011.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1 style=\"font-size:4.5rem;\"\u003e ArchUnit JS\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"#page_facing_up-about\"\u003eAbout\u003c/a\u003e •\n  \u003ca href=\"#hammer_and_wrench-supported-os\"\u003eSupported OS\u003c/a\u003e • \n  \u003ca href=\"#ledger-features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#racing_car-getting-started\"\u003eGetting Started\u003c/a\u003e •\n  \u003ca href=\"#notebook-api-documentation\"\u003eAPI Documentation\u003c/a\u003e •\n  \u003ca href=\"#memo-license\"\u003eLicense\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/gftf2011/clean-node-todolist/blob/main/.github/images/background.png\" alt=\"Banner\" style=\"max-width: 100%; height: auto;\" /\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/node-%3E%3D16.0.0-brightgreen?logo=node.js\u0026logoColor=white\"/\u003e\n  \u003ca href='https://coveralls.io/github/gftf2011/arch-unit-js?branch=dev'\u003e\u003cimg src='https://coveralls.io/repos/github/gftf2011/arch-unit-js/badge.svg?branch=dev' alt='Coverage Status' /\u003e\u003c/a\u003e\n  \u003cimg src='https://sonarcloud.io/api/project_badges/measure?project=gftf2011_arch-unit-js\u0026metric=alert_status' alt='Quality Gate Status' /\u003e\n  \u003ca href=\"https://github.com/gftf2011/arch-unit-js/actions\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n    \u003cimg src=\"https://github.com/gftf2011/arch-unit-js/actions/workflows/merge-main.yml/badge.svg\" alt=\"CI Status\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://eslint.org/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/ESLint-configured-blue?logo=eslint\" alt=\"ESLint\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://prettier.io/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Prettier-configured-ff69b4?logo=prettier\" alt=\"Prettier\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/arch-unit-js\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/v/arch-unit-js.svg\" alt=\"npm version\" /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n## :page_facing_up: About\n\nA JavaScript/TypeScript library for enforcing architectural rules and constraints in your codebase. Inspired by ArchUnit for Java, this tool provides a fluent API to define and validate architectural boundaries, naming conventions, and dependency rules. It is agnostic about the testing framework \u0026 OS systems ! Also provides support for both _ESModules_ and _CommonJS_ projects !\n\n\u003e **Note**: Backend-focused (frontend support coming soon).\n\n\u003cbr/\u003e\n\n## :hammer_and_wrench: Supported OS\n\n- [x] Mac OS\n- [x] Linux\n- [x] Windows\n\n\u003cbr/\u003e\n\n## :ledger: Features\n\n- **Dependency Rules**: Control which modules can depend on others (`dependsOn`, `onlyDependsOn`)\n- **Naming Conventions**: Enforce consistent file naming patterns (`haveName`, `onlyHaveName`)\n- **Code Metrics**: Validate lines of code thresholds (`haveLocLessThan`, `haveLocGreaterThan`)\n- **Project Metrics**: Validate code project percentage thresholds (`haveTotalProjectCodeLessThan`, `haveTotalProjectCodeLessOrEqualThan`)\n- **Cycle Detection**: Prevent circular dependencies (`shouldNot.haveCycles`)\n- **Fluent API**: Intuitive, readable syntax for defining architectural rules\n\n\u003cbr/\u003e\n\n## :racing_car: Getting Started\n\n\u003e ### Installation\n\nInstall using **npm**\n\n```bash\nnpm install --save-dev arch-unit-js\n```\n\n\u003e ### JavaScript - (Basic Scenario)\n\nLet's get started by writing a simple function that generates a **UUID** using the lib _uuid_. First, create a `uuid.js` file, inside a `utils` directory:\n\n```javascript\n// file path: ./utils/uuid.js\nconst { v4 as uuidv4 } = require('uuid');\n\nexport function generateUUID() {\n  return uuidv4();\n}\n```\n\nThen create a test file `utils-arch.spec.js` in a `tests` directory, where we are going to test that all files inside the `utils` directory should have the _uuid_ lib inside:\n\n```javascript\n// file path: ./tests/utils-arch.spec.js\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'], // Positive Glob pattern, where you specify all extension types your application has\n  includeMatcher: ['\u003crootDir\u003e/**'], // Positive Glob pattern, where you specify all files and directories based on the project \u003crootDir\u003e\n  ignoreMatcher: ['!**/node_modules/**'], // (Optional) - Negative Glob pattern, where you specify all files and directories you do NOT want to check\n};\n\n// We are using Jest, but you can use any other testing library\ndescribe('Architecture Test', () =\u003e {\n  it('\"./utils/uuid.js\" file should depend on \"uuid\" lib', async () =\u003e {\n    await app(options).projectFiles().inDirectory('**/utils/**').should().dependsOn('uuid').check(); // No need to expect, if the dependency is not found it throws an error\n  });\n});\n```\n\nNow run the test and congrats 🥳, you just tested your application topology !\n\n\u003e #### `module-alias`\n\u003e\n\u003e `arch-unit-js` also provides support for applications which still use `module-alias@2.x.x` !\n\nCreate a file `register.js` , in the root of your project, function which calls the `module-alias` first:\n\n```javascript\n// file path: ./register.js\n'use strict';\n\nconst path = require('path');\nconst moduleAlias = require('module-alias');\nconst baseDir = __dirname;\n\nmoduleAlias.addAliases({\n  '#domain': path.join(baseDir, 'domain'),\n  '#usecases': path.join(baseDir, 'use-cases'),\n});\n```\n\nNow let's create a simple `domain` layer in a directory with a file `user.js`:\n\n```javascript\n// file path: ./domain/user.js\nexport class User {\n  constructor(id, name) {}\n}\n```\n\nTo use the `domain` layer, create the `use-cases` layer within a directory with the same name, with a file called `create-user.js`:\n\n```javascript\n// file path: ./use-cases/create-user.js\nconst { User } = require('#domain/user');\n\nconst createUserUseCase = () =\u003e new User(1, 'Roko');\n```\n\nNow, let's test if `create-user.js` does depends on the `#domain` layer, create a `tests` directory and inside create a `arch-use-case.test.js` file.\n\n```javascript\n// file path: ./tests/arch-use-case.test.js\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'], // Positive Glob pattern, where you specify all extension types your application has\n  includeMatcher: ['\u003crootDir\u003e/**'], // Positive Glob pattern, where you specify all files and directories based on the project \u003crootDir\u003e\n  ignoreMatcher: ['!**/node_modules/**'], // (Optional) - Negative Glob pattern, where you specify all files and directories you do NOT want to check\n};\n\n// We are using Jest, but you can use any other testing library\ndescribe('Architecture Test', () =\u003e {\n  beforeAll(() =\u003e {\n    require('../register'); // calls the `module-alias` and stores the alias in the node Modules package\n  });\n\n  it('\"./createUserUseCase.js\" file should depend on \"#domain\"', async () =\u003e {\n    await app(options)\n      .projectFiles()\n      .inFile('**/usecases/create-user.js')\n      .should()\n      .dependsOn('**/domain/**')\n      .check(); // No need to expect, if the dependency is not found it throws an error\n  });\n});\n```\n\nAnd there you have it congrats again 🥳 , you successfully tested your project dependencies which uses `module-alias` !\n\n\u003e #### `webpack`\n\u003e\n\u003e `arch-unit-js` also provides support for applications which use `webpack@2.2.x` !\n\nIn this section we are going to explore some scenarios using `webpack`. In the first example let's use a single build `webpack.config.js` file given in the example below.\n\n```javascript\nconst path = require('path');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\n\n// single - webpack.config.js\nmodule.exports = {\n  entry: './main/index.js',\n  output: {\n    path: path.resolve(__dirname, 'dist'),\n    filename: 'bundle.js',\n    clean: true,\n  },\n  resolve: {\n    extensions: ['.js'],\n    alias: {\n      '@domain': path.resolve(__dirname, 'domain'),\n      '@use-cases': path.resolve(__dirname, 'use-cases'),\n      '@infra': path.resolve(__dirname, 'infra'),\n      '@main': path.resolve(__dirname, 'main'),\n    },\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.js$/,\n        exclude: /node_modules/,\n        use: {\n          loader: 'babel-loader',\n        },\n      },\n      { test: /\\.css$/, use: ['style-loader', 'css-loader'] },\n    ],\n  },\n  plugins: [new HtmlWebpackPlugin({ template: './index.html' })],\n  devServer: {\n    static: path.resolve(__dirname, 'public'),\n    port: 5173,\n    historyApiFallback: true,\n  },\n};\n```\n\nIn this example we wanna test if the files within the directory `**/use-cases/**` are using the files within `**/domain/**` to assert usage according to the 'clean architecture' standards. Since webpack is being used, we need to use let explicit within the `path(options)` using the following !\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'], // Positive Glob pattern, where you specify all extension types your application has\n  includeMatcher: ['\u003crootDir\u003e/**'], // Positive Glob pattern, where you specify all files and directories based on the project \u003crootDir\u003e\n  ignoreMatcher: ['!**/node_modules/**'], // (Optional) - Negative Glob pattern, where you specify all files and directories you do NOT want to check\n  webpack: {\n    path: '\u003crootDir\u003e/webpack.config.js', // Path to project 'webpack.config.js' - (using \u003crootDir\u003e as wildcard)\n  },\n};\n\n// We are using Jest, but you can use any other testing library\ndescribe('Architecture Test', () =\u003e {\n  it('\"**/use-cases/**\" files should depends on \"@domain\"', async () =\u003e {\n    await app(options)\n      .projectFiles()\n      .inDirectory('**/usecases/**')\n      .should()\n      .dependsOn('**/domain/**')\n      .check(); // No need to expect, if the dependency is not found it throws an error\n  });\n});\n```\n\nSee, it is pretty easy !\n\nIn the next example let's explore a `webpack.config.js` file which has muiltiple builds down below.\n\n```javascript\nconst path = require('path');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\n\n// single - webpack.config.js\nmodule.exports = [\n  {\n    name: 'client'\n    entry: './main/client.js',\n    output: {\n      path: path.resolve(__dirname, 'dist', 'client'),\n      filename: 'bundle.client.js',\n      clean: true,\n    },\n    resolve: {\n      extensions: ['.js'],\n      alias: {\n        '@domain': path.resolve(__dirname, 'domain'),\n        '@use-cases': path.resolve(__dirname, 'use-cases'),\n        '@infra': path.resolve(__dirname, 'infra'),\n        '@main': path.resolve(__dirname, 'main'),\n      },\n    },\n    module: {\n      rules: [\n        {\n          test: /\\.js$/,\n          exclude: /node_modules/,\n          use: {\n            loader: 'babel-loader',\n          },\n        },\n        { test: /\\.css$/, use: ['style-loader', 'css-loader'] },\n      ],\n    },\n    plugins: [new HtmlWebpackPlugin({ template: './index.html' })],\n    devServer: {\n      static: path.resolve(__dirname, 'public'),\n      port: 5173,\n      historyApiFallback: true,\n    },\n  },\n  {\n    name: 'server'\n    entry: './main/server.js',\n    target: 'node',\n    output: {\n      path: path.resolve(__dirname, 'dist', 'server'),\n      filename: 'bundle.server.js',\n      clean: true,\n    },\n    resolve: {\n      extensions: ['.js'],\n      alias: {\n        '@domain': path.resolve(__dirname, 'domain'),\n        '@use-cases': path.resolve(__dirname, 'use-cases'),\n        '@infra': path.resolve(__dirname, 'infra'),\n        '@main': path.resolve(__dirname, 'main'),\n      },\n    },\n    module: {\n      rules: [\n        {\n          test: /\\.js$/,\n          exclude: /node_modules/,\n          use: {\n            loader: 'babel-loader',\n          },\n        },\n      ],\n    },\n    devServer: {\n      port: 5174,\n      historyApiFallback: true,\n    },\n  }\n]\n```\n\nThe `webpack.config.js` now uses a multi configuration set for the application building. To run `arch-unit-js` using a specific configuration from the webpack file use the `webpack.names` which is a way to tell `arch-unit-js` which configurations are going to be used in the aliases resolution during the test. To ilustrate let's use the same example where we want the files inside the `**/use-cases/**` to depend on the `**/domain/**` files !\n\n\u003e **Important**: To use this feature, the `webpack.names` from `app(options)` must match the key `name` from the `webpack.config.js` file !\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'], // Positive Glob pattern, where you specify all extension types your application has\n  includeMatcher: ['\u003crootDir\u003e/**'], // Positive Glob pattern, where you specify all files and directories based on the project \u003crootDir\u003e\n  ignoreMatcher: ['!**/node_modules/**'], // (Optional) - Negative Glob pattern, where you specify all files and directories you do NOT want to check\n  webpack: {\n    path: '\u003crootDir\u003e/webpack.config.js', // Path to project 'webpack.config.js' - (using \u003crootDir\u003e as wildcard)\n    names: ['server'], // Array of webpack config names from a 'webpack.config.js' file with multiple configurations\n  },\n};\n\n// We are using Jest, but you can use any other testing library\ndescribe('Architecture Test', () =\u003e {\n  it('\"**/use-cases/**\" files should depends on \"@domain\"', async () =\u003e {\n    await app(options)\n      .projectFiles()\n      .inDirectory('**/usecases/**')\n      .should()\n      .dependsOn('**/domain/**')\n      .check(); // No need to expect, if the dependency is not found it throws an error\n  });\n});\n```\n\nAgain, you successfully tested you application topology 🥳 , you getting the hang of it !\n\n\u003cbr/\u003e\n\n\u003e ### TypeScript - (Basic Scenario)\n\n`arch-unit-js` also provides support for `typescript`. To include `typescript` support just provide the path to your **tsconfig.json** using the \"_typescriptPath_\"\n\n```typescript\nimport { Options } from 'arch-unit-js';\n\nconst options: Options = {\n  extensionTypes: ['**/*.ts'], // Positive Glob pattern, where you specify all extension types your application has\n  includeMatcher: ['\u003crootDir\u003e/**'], // Positive Glob pattern, where you specify all files and directories based on the project \u003crootDir\u003e\n  typescriptPath: '\u003crootDir\u003e/tsconfig.json', // Path to project 'tsconfig.json' - (using \u003crootDir\u003e as wildcard)\n};\n```\n\n\u003cbr/\u003e\n\n\u003e ### workspaces\n\n\u003e **Important:** Ensure to install `arch-unit-js` in the root `package.json` file to ensure the dependency is hoisted for your _monorepo_ project. If you're sure the dependency will not be hoisted and will be installed in the local project within the _monorepo_ then you can skip the following steps and use the tool _as is_ !\n\n`arch-unit-js` also provides support for `workspaces` ! Given you're working in a _workspace monorepo_ project ilustrated below:\n\n```\nproject/\n├── node_modules/\n│   └ arch-unit-js/\n├── packages/\n│   ├── a/\n│   │   ├── src/\n│   │   └── package.json\n│   ├── b/\n│   │   ├── src/\n│   │   ├── package.json\n│   │   └── tsconfig.json\n│   └── c/\n│       ├── src/\n│       └── package.json\n└── package.json\n```\n\nSuppose you're testing the topology from _package_ `b` ! To include support for the workspace you can use the following configuration:\n\n```typescript\nimport { Options } from 'arch-unit-js';\n\nconst options: Options = {\n  workspaceDir: '\u003crootDir\u003e/packages/b',\n  extensionTypes: ['**/*.ts'],\n  includeMatcher: ['\u003crootDir\u003e/packages/b/**'],\n  typescriptPath: '\u003crootDir\u003e/packages/b/tsconfig.json',\n};\n```\n\nOr alternatively, you can also use the following configuration:\n\n```typescript\nimport { Options } from 'arch-unit-js';\n\nconst options: Options = {\n  workspaceDir: '\u003crootDir\u003e/packages/b',\n  extensionTypes: ['**/*.ts'],\n  includeMatcher: ['\u003cworkspaceDir\u003e/**'],\n  typescriptPath: '\u003cworkspaceDir\u003e/tsconfig.json',\n};\n```\n\n\u003e **Note**: The annotation `\u003cworkspaceDir\u003e` works as an alias towards the path described in the `Options.workspaceDir` !\n\n## :notebook: API Documentation\n\n## `app(options)`\n\nWhen checking your architecture you need to test against your application and some of them have different folder structures. And here's where `app` comes to play.\n\nThe initial `app` API is the representation of your application and to define which files compose your application, you can use as parameter the 'options' to compose your application.\n\n```javascript\nconst { app } = require('arch-unit-js');\n\napp({\n  workspaceDir: '\u003crootDir\u003e/packages/a', // Optional,\n  extensionTypes: ['**/*.js'], // Required\n  includeMatcher: ['\u003crootDir\u003e/**'], // Required\n  ignoreMatcher: ['!**/node_modules/**'], // Optional\n  typescriptPath: '\u003crootDir\u003e/tsconfig.json', // Optional\n  webpack: {\n    path: '\u003crootDir\u003e/webpack.config.js', // Optional\n    names: ['client', 'server'], // Optional\n  },\n});\n```\n\nThe 'options' parameter is an object which has:\n\n- The `workspaceDir` which is a path like `string`, representing the path to your `workspace` you're working on\n- The `extensionTypes` which is a `string[]` of glob patterns, representing the allowed extensions which compose your project files\n- The `includeMatcher` which is a `string[]` of glob patterns, representing the source directories of your application\n- The `ignoreMatcher` which is a `string[]` of glob patterns, representing the resources you want to ignore\n- The `typescriptPath` which is a path like `string`, representing the path to your `typescript` config file\n- The `webpack.path` which is a path like `string`, representing the path to your `webpack` config file\n- The `webpack.names` which is an array telling which `webpack` configs to use in a multi config file\n\n\u003e **Note**: All the patterns passed to the `ignoreMatcher` must have a `!` , which indicates the given pattern must be ignored from the application !\n\n## Globals\n\n### `projectFiles()`\n\n`projectFiles()` is the function used every time you want to make a broad test against your project structure. You will use it alongside with a \"selector\" to choose the files location which will be checked by a \"matcher\" !\n\nTo understand better, let's use an example, where you want to test to check if a file `stringUtils.js` has less than 50 L.O.C. - (Lines Of Code). Here's how to start.\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/stringUtils.js\" file should have less than 50 - L.O.C.', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inFile('**/stringUtils.js')\n    .should()\n    .haveLocLessThan(50)\n    .check();\n});\n```\n\nIn this case we have the `inFile` as the \"selector\" which selects the files which will be tested by the \"matcher\" , in this case we are only targeting `stringUtils.js`. Then we have the `should` which is a \"modifier\" which indicates it is a positive test done by the \"matcher\". And finally there is the `haveLocLessThan` which is the \"matcher\" whose going to test if the selected files match the criteria !\n\n## Selectors\n\n### `inDirectories(pattern: string[], excludePattern?: string[])`\n\nUse the `inDirectories` to select different files from multiple directories within your project. The \"selectors\" chains with the \"modifiers\" to indicate which will be the \"matcher\" behavior.\n\nLet's say we have an application and we have the directories `**/infra/repositories/**` \u0026 `**/infra/providers/**`. We want to enforce the files inside this folders contains only very specific dependencies which are the `mysql2` \u0026 `crypto`.\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/infra/repositories/**\" \u0026 \"**/infra/providers/**\" should only depends on \"mysql2\" \u0026 \"crypto\"', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inDirectories(['**/infra/repositories/**', '**/infra/providers/**'])\n    .should()\n    .onlyDependsOn(['mysql2', 'crypto'])\n    .check();\n});\n```\n\nNow, let's imagine the structure from the selected directories changed, and now they use _barrel exports_ which means both have now an `index.js` file exporting all the files.\n\nBut the `index.js` does not comply with the checking \"matcher\" rule. For this scenario the `inDirectories` has a second parameter which is used to exclude files and folders you don't want to be checked by the \"matcher\".\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/infra/repositories/**\" \u0026 \"**/infra/providers/**\" should only depends on \"mysql2\" \u0026 \"crypto\" , excluding \"**/infra/**/index.js\"', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inDirectories(['**/infra/repositories/**', '**/infra/providers/**'], ['!**/infra/**/index.js'])\n    .should()\n    .onlyDependsOn(['mysql2', 'crypto'])\n    .check();\n});\n```\n\n\u003e **Note**: All the patterns passed to the `excludePattern` must have a `!` , which indicates the given pattern must be excluded from the \"matcher\" check !\n\n### `inDirectory(pattern: string, excludePattern?: string[])`\n\nUse the `inDirectory` to select different files from a single directory within your project. It's behavior is the same as the one described for the `inDirectories` selector, with the exception the `pattern` parameter is a single `string`.\n\nTo ilustrate it's behavior let's use an example where we are going to have again a directory `**/infra/repositories/**` and we want to test it it's files use the `mysql2`, but to make interesting the files implementation are using `mysql2/promise` now.\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/infra/repositories/**\" should depends on \"mysql2/**\"', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inDirectory('**/infra/repositories/**')\n    .should()\n    .dependsOn('mysql2/**')\n    .check();\n});\n```\n\nJust like the previous example, let's imagine the structure from the selected directory changed, and now uses _barrel exports_ which means it has an `index.js` file exporting all the other files. Given this scenario let's exclude the index.ts file from the \"selectors\" !\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/infra/repositories/**\" should depends on \"mysql2/*\" , excluding \"**/infra/repositories/**/index.js\"', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inDirectory('**/infra/repositories/**', ['!**/infra/repositories/**/index.js'])\n    .should()\n    .dependsOn('mysql2/**')\n    .check();\n});\n```\n\n### `inFiles(pattern: string[])`\n\nUse the `inFiles` to select different files from different parts of your project. It's behavior is similar than the one described by `inDirectories`, with the exception that it is not possible to exclude a given pattern with this \"selector\" !\n\nTo ilustrate it's behavior let's use an example where we wanna check if the files `**/domain/entities/user.entity.js` \u0026 `**/domain/entities/address.entity.js` depends on `uuid` \u0026 `lodash`.\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/domain/entities/user.entity.js\" \u0026 \"**/domain/entities/address.entity.js\" should depends on \"uuid\", async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inFiles(['**/domain/entities/user.entity.js', '**/domain/entities/address.entity.js'])\n    .should()\n    .dependsOn(['uuid', 'lodash'])\n    .check();\n});\n```\n\n### `inFile(pattern: string)`\n\nUse the `inFile` to select different files OR a single file within your project. This selector is focused in selecting specific files or single file which match the pattern only, providing better semantics towards the test itself.\n\nTo ilustrate it's behavior let's use an example where we want to check if a file `**/domain/entities/address.entity.js` has more than 80 - L.O.C. - (Lines Of Code).\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/domain/entities/address.entity.js\" should have more than 80 - L.O.C.', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inFile('**/domain/entities/address.entity.js')\n    .should()\n    .haveLocGreaterThan(80)\n    .check();\n});\n```\n\n## Modifiers\n\n### `should()`\n\nUse the `should` modifier to indicate to \"arch-unit-js\" what the \"matcher\" should test. It chains with the \"matcher\" to indicate how the selected files will be checked !\n\nWe can use the another example, where we want all the files in a directory \"utils\" should match the name _`*.utils.js`_.\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"utils\" directory should have all files matching the name \"*.utils.js\"', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inDirectory('**/utils/**')\n    .should()\n    .haveName('*.utils.js')\n    .check();\n});\n```\n\n### `shouldNot()`\n\nThe `shouldNot` modifier indicates the opposite of `should` , so it is a negative test modifier which tells the \"matcher\" the selected files should not match the checked pattern.\n\nThe code below test if a file `numberUtils.js` has 50 L.O.C. or more.\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/numberUtils.js\" file should have less than 50 - L.O.C.', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inFile('**/numberUtils.js')\n    .shouldNot()\n    .haveLocLessThan(50)\n    .check();\n});\n```\n\nBy using the `shouldNot` \"modifier\" the \"matcher\" behave was modified to check if the selected files had a L.O.C. greater or equal than the specified value !\n\n## Aggregators\n\n### `and()`\n\nThe `and` is an \"aggregator\". An \"aggregator\" gives the ability to chain \"selectors\" with other \"selectors\" \u0026 chain \"matchers\" with other \"matchers\" creating more complex architecture rules to be validated !\n\nIn the example below we wanna check if files inside the `**/domain/entities/**` \u0026 `**/services/contracts/**` directories \u0026 `**/shared/utils.js` file have more than 30 - L.O.C. - (Lines Of Code) \u0026 less than 120 - L.O.C. - (Lines Of Code).\n\n```javascript\nconst { app } = require('arch-unit-js');\n\nconst options = {\n  extensionTypes: ['**/*.js'],\n  includeMatcher: ['\u003crootDir\u003e/**'],\n};\n\nit('\"**/domain/entities/**\" \u0026 \"**/services/contracts/**\" \u0026 \"**/shared/utils.js\" files and directories have more than 30 L.O.C. \u0026 ;ess than 120 L.O.C.', async () =\u003e {\n  await app(options)\n    .projectFiles()\n    .inDirectories(['**/domain/entities/**', '**/services/contracts/**'])\n    .and()\n    .inFile('**/shared/utils.js')\n    .should()\n    .haveLocGreaterThan(30)\n    .and()\n    .haveLocLessThan(120)\n    .check();\n});\n```\n\nAs demonstrated in the example \"aggregators\" are a powerful tool to create stronger architecture rules by combinig different \"selectors\" and \"matchers\" in more meaningful setences !\n\n## Matchers\n\n### `dependsOn`\n\n\u003e #### should\n\n- [Project Files in Directories Should Depends On Specified Patterns](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_dependsOn_check.md)\n- [Project Files in Directory Should Depends On Specified Patterns](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_dependsOn_check.md)\n- [Project Files in Files Should Depends On Specified Patterns](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_dependsOn_check.md)\n- [Project Files in File Should Depends On Specified Patterns](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_dependsOn_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Depends On Specified Patterns](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_dependsOn_check.md)\n- [Project Files in Directory Should NOT Depends On Specified Patterns](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_dependsOn_check.md)\n- [Project Files in Files Should NOT Depends On Specified Patterns](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_dependsOn_check.md)\n- [Project Files in File Should NOT Depends On Specified Patterns](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_dependsOn_check.md)\n\n### `onlyDependsOn`\n\n\u003e #### should\n\n- [Project Files in Directories Should Only Depends On Specified Patterns](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_onlyDependsOn_check.md)\n- [Project Files in Directory Should Only Depends On Specified Patterns](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_onlyDependsOn_check.md)\n- [Project Files in Files Should Only Depends On Specified Patterns](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_onlyDependsOn_check.md)\n- [Project Files in File Should Only Depends On Specified Patterns](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_onlyDependsOn_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Only Depends On Specified Patterns](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_onlyDependsOn_check.md)\n- [Project Files in Directory Should NOT Only Depends On Specific Patterns](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_onlyDependsOn_check.md)\n- [Project Files in Files Should NOT Only Depends On Specified Patterns](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_onlyDependsOn_check.md)\n- [Project Files in File Should NOT Only Depends On Specified Patterns](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_onlyDependsOn_check.md)\n\n### `haveCycles`\n\n\u003e #### should\n\n- [Project Files in Directories Should Have Cycles](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_haveCycles_check.md)\n- [Project Files in Directory Should Have Cycles](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_haveCycles_check.md)\n- [Project Files in Files Should Have Cycles](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_haveCycles_check.md)\n- [Project Files in File Should Have Cycles](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_haveCycles_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Have Cycles](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_haveCycles_check.md)\n- [Project Files in Directory Should NOT Have Cycles](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_haveCycles_check.md)\n- [Project Files in Files Should NOT Have Cycles](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_haveCycles_check.md)\n- [Project Files in File Should NOT Have Cycles](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_haveCycles_check.md)\n\n### `haveName`\n\n\u003e #### should\n\n- [Project Files in Directories Should Have Name with Specified Pattern](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_haveName_check.md)\n- [Project Files in Directory Should Have Name with Specified Pattern](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_haveName_check.md)\n- [Project Files in Files Should Have Name with Specified Pattern](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_haveName_check.md)\n- [Project Files in File Should Have Name with Specified Pattern](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_haveName_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Have Name with Specified Pattern](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_haveName_check.md)\n- [Project Files in Directory Should Not Have Name with Specified Pattern](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_haveName_check.md)\n- [Project Files in Files Should NOT Have Name with Specified Pattern](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_haveName_check.md)\n- [Project Files in File Should NOT Have Name with Specified Pattern](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_haveName_check.md)\n\n### `onlyHaveName`\n\n\u003e #### should\n\n- [Project Files in Directories Should Only Have Name with Specified Pattern](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_onlyHaveName_check.md)\n- [Project Files in Directory Should Only Have Name with Specified Pattern](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_onlyHaveName_check.md)\n- [Project Files in Files Should Only Have Name with Specified Pattern](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_onlyHaveName_check.md)\n- [Project Files in File Should Only Have Name with Specified Pattern](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_onlyHaveName_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Only Have Name with Specified Pattern](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_onlyHaveName_check.md)\n- [Project Files in Directory Should NOT Only Have Name with Specified Pattern](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_onlyHaveName_check.md)\n- [Project Files in Files Should NOT Only Have Name with Specified Pattern](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_onlyHaveName_check.md)\n- [Project Files in File Should NOT Only Have Name with Specified Pattern](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_onlyHaveName_check.md)\n\n### `haveLocLessThan`\n\n\u003e #### should\n\n- [Project Files in Directories Should Have Less L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_haveLocLessThan_check.md)\n- [Project Files in Directory Should Have Less L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_haveLocLessThan_check.md)\n- [Project Files in Files Should Have Less L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_haveLocLessThan_check.md)\n- [Project Files in File Should Have Less L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_haveLocLessThan_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Have Less L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_haveLocLessThan_check.md)\n- [Project Files in Directory Should NOT Have Less L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_haveLocLessThan_check.md)\n- [Project Files in Files Should NOT Have Less L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_haveLocLessThan_check.md)\n- [Project Files in File Should NOT Have Less L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_haveLocLessThan_check.md)\n\n### `haveLocLessOrEqualThan`\n\n\u003e #### should\n\n- [Project Files in Directories Should Have Less Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_haveLocLessOrEqualThan_check.md)\n- [Project Files in Directory Should Have Less Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_haveLocLessOrEqualThan_check.md)\n- [Project Files in Files Should Have Less Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_haveLocLessOrEqualThan_check.md)\n- [Project Files in File Should Have Less Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_haveLocLessOrEqualThan_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Have Less Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_haveLocLessOrEqualThan_check.md)\n- [Project Files in Directory Should NOT Have Less Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_haveLocLessOrEqualThan_check.md)\n- [Project Files in Files Should NOT Have Less Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_haveLocLessOrEqualThan_check.md)\n- [Project Files in File Should NOT Have Less Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_haveLocLessOrEqualThan_check.md)\n\n### `haveLocGreaterThan`\n\n\u003e #### should\n\n- [Project Files in Directories Should Have Greater L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_haveLocGreaterThan_check.md)\n- [Project Files in Directory Should Have Greater L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_haveLocGreaterThan_check.md)\n- [Project Files in Files Should Have Greater L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_haveLocGreaterThan_check.md)\n- [Project Files in File Should Have Greater L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_haveLocGreaterThan_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Have Greater L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_haveLocGreaterThan_check.md)\n- [Project Files in Directory Should NOT Have Greater L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_haveLocGreaterThan_check.md)\n- [Project Files in Files Should NOT Have Greater L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_haveLocGreaterThan_check.md)\n- [Project Files in File Should NOT Have Greater L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_haveLocGreaterThan_check.md)\n\n### `haveLocGreaterOrEqualThan`\n\n\u003e #### should\n\n- [Project Files in Directories Should Have Greater Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_haveLocGreaterOrEqualThan_check.md)\n- [Project Files in Directory Should Have Greater Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_haveLocGreaterOrEqualThan_check.md)\n- [Project Files in Files Should Have Greater Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_haveLocGreaterOrEqualThan_check.md)\n- [Project Files in File Should Have Greater Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_haveLocGreaterOrEqualThan_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Have Greater Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_haveLocGreaterOrEqualThan_check.md)\n- [Project Files in Directory Should NOT Have Greater Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_haveLocGreaterOrEqualThan_check.md)\n- [Project Files in Files Should NOT Have Greater Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_haveLocGreaterOrEqualThan_check.md)\n- [Project Files in File Should NOT Have Greater Or Equal L.O.C. (Lines Of Code) Than Specified Value](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_haveLocGreaterOrEqualThan_check.md)\n\n### `haveTotalProjectCodeLessThan`\n\n\u003e #### should\n\n- [Project Files in Directories Should Have Total Project Code Less Than a Percentage Value](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_haveTotalProjectCodeLessThan_check.md)\n- [Project Files in Directory Should Have Total Project Code Less Than a Percentage Value](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_haveTotalProjectCodeLessThan_check.md)\n- [Project Files in Files Should Have Total Project Code Less Than a Percentage Value](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_haveTotalProjectCodeLessThan_check.md)\n- [Project Files in File Should Have Total Project Code Less Than a Percentage Value](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_haveTotalProjectCodeLessThan_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Have Total Project Code Less Than a Percentage Value](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_haveTotalProjectCodeLessThan_check.md)\n- [Project Files in Directory Should NOT Have Total Project Code Less Than a Percentage Value](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_haveTotalProjectCodeLessThan_check.md)\n- [Project Files in Files Should NOT Have Total Project Code Less Than a Percentage Value](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_haveTotalProjectCodeLessThan_check.md)\n- [Project Files in File Should NOT Have Total Project Code Less Than a Percentage Value](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_haveTotalProjectCodeLessThan_check.md)\n\n### `haveTotalProjectCodeLessOrEqualThan`\n\n\u003e #### should\n\n- [Project Files in Directories Should Have Total Project Code Less Or Equal Than a Percentage Value](docs/business/projectFiles/inDirectories/should/projectFiles_inDirectories_should_haveTotalProjectCodeLessOrEqualThan_check.md)\n- [Project Files in Directory Should Have Total Project Code Less Or Equal Than a Percentage Value](docs/business/projectFiles/inDirectory/should/projectFiles_inDirectory_should_haveTotalProjectCodeLessOrEqualThan_check.md)\n- [Project Files in Files Should Have Total Project Code Less Or Equal Than a Percentage Value](docs/business/projectFiles/inFiles/should/projectFiles_inFiles_should_haveTotalProjectCodeLessOrEqualThan_check.md)\n- [Project Files in File Should Have Total Project Code Less Or Equal Than a Percentage Value](docs/business/projectFiles/inFile/should/projectFiles_inFile_should_haveTotalProjectCodeLessOrEqualThan_check.md)\n\n\u003e #### shouldNot\n\n- [Project Files in Directories Should NOT Have Total Project Code Less Or Equal Than a Percentage Value](docs/business/projectFiles/inDirectories/shouldNot/projectFiles_inDirectories_shouldNot_haveTotalProjectCodeLessOrEqualThan_check.md)\n- [Project Files in Directory Should NOT Have Total Project Code Less Or Equal Than a Percentage Value](docs/business/projectFiles/inDirectory/shouldNot/projectFiles_inDirectory_shouldNot_haveTotalProjectCodeLessOrEqualThan_check.md)\n- [Project Files in Files Should NOT Have Total Project Code Less Or Equal Than a Percentage Value](docs/business/projectFiles/inFiles/shouldNot/projectFiles_inFiles_shouldNot_haveTotalProjectCodeLessOrEqualThan_check.md)\n- [Project Files in File Should NOT Have Total Project Code Less Or Equal Than a Percentage Value](docs/business/projectFiles/inFile/shouldNot/projectFiles_inFile_shouldNot_haveTotalProjectCodeLessOrEqualThan_check.md)\n\n---\n\n## :memo: License\n\nThis project is under MIT license. See the [LICENSE](LICENSE) file for more details.\n\n---\n\nMade with lots of 🔥🔥🔥 by [Gabriel Ferrari Tarallo Ferraz](https://www.linkedin.com/in/gabriel-ferrari-tarallo-ferraz/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgftf2011%2Farch-unit-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgftf2011%2Farch-unit-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgftf2011%2Farch-unit-js/lists"}