# shared/selectors/specifier.selector.ts

> 30 lines of code and 6 definitions.

Tree: Governance tree
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/governance#file-governance-shared-selectors-specifier-selector-ts
Source text: https://banes-lab.com/source/governance/shared/selectors/specifier.selector.ts.txt

Listed in [shared/selectors](https://banes-lab.com/api/source/governance/shared/selectors.md), after [shared/selectors/sink.selector.ts](https://banes-lab.com/source/governance/shared/selectors/sink.selector.ts.md) and before [shared/selectors/syntax.selector.ts](https://banes-lab.com/source/governance/shared/selectors/syntax.selector.ts.md).

## Definitions

- `specifierNodes` (lexical_declaration, line 3, exported)
- `visit` (lexical_declaration, line 5, exported)
- `specifiersOf` (lexical_declaration, line 29, exported)
- `out` (lexical_declaration, line 4, exported)
- `[first]` (lexical_declaration, line 18, exported)
- `source` (lexical_declaration, line 30, exported)

## Used by

- [codemods/analyzers/specifier.analyzer.ts](https://banes-lab.com/source/governance/codemods/analyzers/specifier.analyzer.ts.md)
- [codemods/analyzers/specifier.target.analyzer.ts](https://banes-lab.com/source/governance/codemods/analyzers/specifier.target.analyzer.ts.md)

## Source

```typescript
import ts from "typescript";

export const specifierNodes = function specifierNodes(source: ts.SourceFile): ts.StringLiteral[] {
    const out: ts.StringLiteral[] = [];
    const visit = function visit(node: ts.Node): void {
        if (
            (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) &&
            node.moduleSpecifier !== undefined &&
            ts.isStringLiteral(node.moduleSpecifier)
        ) {
            out.push(node.moduleSpecifier);
        }
        if (
            ts.isCallExpression(node) &&
            node.expression.kind === ts.SyntaxKind.ImportKeyword &&
            node.arguments.length > 0
        ) {
            const [first] = node.arguments;
            if (first !== undefined && ts.isStringLiteral(first)) {
                out.push(first);
            }
        }
        ts.forEachChild(node, visit);
    };
    visit(source);
    return out;
};

export const specifiersOf = function specifiersOf(fileName: string, text: string): readonly string[] {
    const source = ts.createSourceFile(fileName, text, ts.ScriptTarget.Latest, true);
    return specifierNodes(source).map((literal) => literal.text);
};
```
