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.ts
files
└── 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 "";
.scope.ts
files└── 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.
Install ESLint and the export-scope
package. This package includes both an ESLint
plugin and a TS Language Server
plugin.
// tsconfig.json
"compilerOptions": {
"plugins": [{ "name": "eslint-plugin-export-scope" }],
},
"include": ["**/*", "**/.scope.ts"]
// "../../**/.scope.ts" for monorepos
Tell VSCode to Use Workspace Version
of TypeScript. Otherwise TS plugin won't work.
//
comments with jsDocs /** */
@scope default
with @scopeDefault
@..
file/folder prefixes with .scope.ts
files..eslintrc.js
and tsconfig.json
configs are updated@
above exports for automatic jsDoc generation..scope.ts
files..scope.ts
file (next to package.json) sets the default for the whole project. Having export default '*'
there will make all exports global by default if you prefer a less strict approach.⚠️ To re-lint an import in VSCode after updating a scope
declaration either touch
this import or restart the ESLint Server (ESLint limitation).