Don't leak LOCAL utils, states, contexts, components into the global scope.
| scope | importable from | |
|---|---|---|
| . | current directory and children | default for all exports |
| .. | parent directory and children | default for index files |
| ../.. | two directories above and children | |
| src/consumer | within specified directory and children | |
| src/consumer.ts | within specified file | |
| * | anywhere |
/** @scopeDefault ../.. */
/** โ Applies to all exports in the file unless overriden with a local `@scope` */
/** @scope * */
export const helper1 = ""; // ๐ Available everywhere
export const helper2 = ""; // ๐ inherits scope `../..` from `@scopeDefault`
/** @scope src/components */
export default "";/** @scope .. */
const helper3 = "";
export { helper3 }; // ๐ inherits the scope from the variable declarationโโโ src
โโโ `common`
โโโ utils.ts
โโโ context.ts
โโโ `.scope.ts`
โ
โ
โญโโโโโโโโโโโโโโโโโโโโโฎ
โ export default '*' โ
โฐโโโโโโโโโโโโโโโโโโโโโฏ
// โฌ this will make all exports within `common`
// importable from anywhere unless a
// specific export is overriden on a lower level// schema.ts
/**
* @scope ..
* @scopeException src/schemaConsumer ๐ whole folder has access
* @scopeException src/schemaConsumer/index.ts ๐ whole file has access
*/
export default "";โโโ src
โโโ `generated`
โโโ schema.ts
โโโ `.scope.ts`
โ
โ
โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ export default '.'; โ
โ โ
โ export const exceptions = [ โ
โ 'src/schemaConsumer', โ
โ 'src/scripts/schemaParser.ts', โ
โ ] โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
// โฌ by default exports are only importable
// within `generated` folder, but
// folders/files in `exceptions` are exempt..scope.tssets a default scope for all exports from the current directory.scope.default.tssets a default scope for the current directory AND all subdirectories
Install ESLint and the export-scope package. This package includes both an ESLint plugin (validates imports) and a TS Language Server plugin (manages autocompletion).
npm i -D eslint typescript-eslint eslint-plugin-export-scope// package.json
{
"type": "module"
}// eslint.config.js
import tseslint from "typescript-eslint";
import exportScope from "eslint-plugin-export-scope";
export default tseslint.config(
// other configs,
exportScope.configs.flatConfigRecommended,
);Custom parser (Optional)
// This plugin already comes with a parser. If you want a local one:
{
files: ['**/*.{ts,tsx,js,jsx,mts,mjs,cts,cjs}'],
languageOptions: { parser: /* local parser */ },
},Instructions
npm i -D eslint eslint-plugin-export-scope// .eslintrc.js
module.exports = {
extends: ["plugin:export-scope/recommended"],
parserOptions: { project: true, tsconfigRootDir: __dirname },
};
// This plugin already comes with a parser. If you want a local one:
parser: /* local parser */,// tsconfig.json
"compilerOptions": {
"plugins": [{ "name": "eslint-plugin-export-scope" }],
},Use Workspace Version of TypeScript. Otherwise TS plugin won't work.
tsconfig.json with compilerOptions.allowJs set to true is required
v2 => v3 (Optional)
- Including
"**/.scope.*"intsconfig.jsis no longer required - Eslint config could be simplified by following the updated instructions
v1 => v2
- Replace all
//comments with jsDocs/** */ - Replace
@scope defaultwith@scopeDefault - Relace
@..file/folder prefixes with.scope.tsfiles. - Make sure
.eslintrc.jsandtsconfig.jsonconfigs are updated
- Type
@above exports for automatic jsDoc generation. - Use autocompletion provided within jsDocs and
.scope.tsfiles. - Root
.scope.default.tscould be used to set the default for the whole project. Havingexport default '*'there would make all exports global by default in case you prefer a less strict approach.
scope declaration either touch this import or restart the ESLint Server (ESLint limitation).




