fcis 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.plans/001-fcis-analyzer.md +832 -0
- package/.plans/002-fcis-analyzer-improvements.md +205 -0
- package/README.md +272 -0
- package/TECHNICAL.md +386 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1836 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +709 -0
- package/dist/index.js +1845 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
- package/pnpm-workspace.yaml +0 -0
- package/src/analyzer.ts +266 -0
- package/src/classification/classifier.ts +156 -0
- package/src/classification/derive-status.ts +171 -0
- package/src/classification/quality-scorer.ts +481 -0
- package/src/cli.ts +286 -0
- package/src/detection/detect-markers.ts +480 -0
- package/src/detection/markers.ts +332 -0
- package/src/extraction/extract-functions.ts +570 -0
- package/src/extraction/extractor.ts +188 -0
- package/src/index.ts +111 -0
- package/src/reporting/report-console.ts +416 -0
- package/src/reporting/report-json.ts +232 -0
- package/src/scoring/scorer.ts +504 -0
- package/src/types.ts +248 -0
- package/tests/classifier.test.ts +480 -0
- package/tests/derive-status.test.ts +464 -0
- package/tests/detect-markers.test.ts +639 -0
- package/tests/extractor.test.ts +155 -0
- package/tests/integration.test.ts +706 -0
- package/tests/quality-scorer.test.ts +650 -0
- package/tests/scorer.test.ts +768 -0
- package/tsconfig.json +34 -0
- package/tsup.config.ts +17 -0
- package/vendor/ts-morph/.editorconfig +10 -0
- package/vendor/ts-morph/.gitattributes +11 -0
- package/vendor/ts-morph/.github/CODE_OF_CONDUCT.md +77 -0
- package/vendor/ts-morph/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
- package/vendor/ts-morph/.github/ISSUE_TEMPLATE/custom.md +4 -0
- package/vendor/ts-morph/.github/ISSUE_TEMPLATE/feature_request.md +18 -0
- package/vendor/ts-morph/.github/workflows/ci.yml +50 -0
- package/vendor/ts-morph/.github/workflows/publish.yml +53 -0
- package/vendor/ts-morph/.vscode/settings.json +10 -0
- package/vendor/ts-morph/CONTRIBUTING.md +23 -0
- package/vendor/ts-morph/DEVELOPMENT.md +32 -0
- package/vendor/ts-morph/LICENSE +21 -0
- package/vendor/ts-morph/deno.json +8 -0
- package/vendor/ts-morph/deno.lock +1233 -0
- package/vendor/ts-morph/docs/CNAME +1 -0
- package/vendor/ts-morph/docs/Gemfile +2 -0
- package/vendor/ts-morph/docs/_config.yml +5 -0
- package/vendor/ts-morph/docs/_layouts/default.html +159 -0
- package/vendor/ts-morph/docs/_script-templates/main.ts +116 -0
- package/vendor/ts-morph/docs/assets/css/style.scss +212 -0
- package/vendor/ts-morph/docs/details/ambient.md +38 -0
- package/vendor/ts-morph/docs/details/async.md +31 -0
- package/vendor/ts-morph/docs/details/classes.md +314 -0
- package/vendor/ts-morph/docs/details/comment-ranges.md +7 -0
- package/vendor/ts-morph/docs/details/comments.md +122 -0
- package/vendor/ts-morph/docs/details/decorators.md +119 -0
- package/vendor/ts-morph/docs/details/documentation.md +73 -0
- package/vendor/ts-morph/docs/details/enums.md +117 -0
- package/vendor/ts-morph/docs/details/exports.md +308 -0
- package/vendor/ts-morph/docs/details/expressions.md +46 -0
- package/vendor/ts-morph/docs/details/functions.md +150 -0
- package/vendor/ts-morph/docs/details/generators.md +27 -0
- package/vendor/ts-morph/docs/details/identifiers.md +79 -0
- package/vendor/ts-morph/docs/details/imports.md +191 -0
- package/vendor/ts-morph/docs/details/index.md +52 -0
- package/vendor/ts-morph/docs/details/initializers.md +40 -0
- package/vendor/ts-morph/docs/details/interfaces.md +218 -0
- package/vendor/ts-morph/docs/details/literals.md +20 -0
- package/vendor/ts-morph/docs/details/modifiers.md +38 -0
- package/vendor/ts-morph/docs/details/modules.md +113 -0
- package/vendor/ts-morph/docs/details/namespaces.md +7 -0
- package/vendor/ts-morph/docs/details/object-literal-expressions.md +106 -0
- package/vendor/ts-morph/docs/details/parameters.md +64 -0
- package/vendor/ts-morph/docs/details/signatures.md +41 -0
- package/vendor/ts-morph/docs/details/source-files.md +292 -0
- package/vendor/ts-morph/docs/details/type-aliases.md +34 -0
- package/vendor/ts-morph/docs/details/type-parameters.md +72 -0
- package/vendor/ts-morph/docs/details/types.md +254 -0
- package/vendor/ts-morph/docs/details/variables.md +110 -0
- package/vendor/ts-morph/docs/emitting.md +151 -0
- package/vendor/ts-morph/docs/index.md +25 -0
- package/vendor/ts-morph/docs/manipulation/code-writer.md +20 -0
- package/vendor/ts-morph/docs/manipulation/formatting.md +76 -0
- package/vendor/ts-morph/docs/manipulation/index.md +136 -0
- package/vendor/ts-morph/docs/manipulation/order.md +14 -0
- package/vendor/ts-morph/docs/manipulation/performance.md +222 -0
- package/vendor/ts-morph/docs/manipulation/removing.md +31 -0
- package/vendor/ts-morph/docs/manipulation/renaming.md +106 -0
- package/vendor/ts-morph/docs/manipulation/settings.md +76 -0
- package/vendor/ts-morph/docs/manipulation/structures.md +117 -0
- package/vendor/ts-morph/docs/manipulation/transforms.md +84 -0
- package/vendor/ts-morph/docs/metrics/performance.json +4 -0
- package/vendor/ts-morph/docs/navigation/ambient-modules.md +22 -0
- package/vendor/ts-morph/docs/navigation/compiler-nodes.md +82 -0
- package/vendor/ts-morph/docs/navigation/directories.md +287 -0
- package/vendor/ts-morph/docs/navigation/example.md +50 -0
- package/vendor/ts-morph/docs/navigation/finding-references.md +53 -0
- package/vendor/ts-morph/docs/navigation/getting-source-files.md +59 -0
- package/vendor/ts-morph/docs/navigation/images/getChildrenVsForEachChild.gif +0 -0
- package/vendor/ts-morph/docs/navigation/index.md +94 -0
- package/vendor/ts-morph/docs/navigation/language-service.md +23 -0
- package/vendor/ts-morph/docs/navigation/program.md +25 -0
- package/vendor/ts-morph/docs/navigation/type-checker.md +33 -0
- package/vendor/ts-morph/docs/setup/adding-source-files.md +145 -0
- package/vendor/ts-morph/docs/setup/ast-viewers.md +46 -0
- package/vendor/ts-morph/docs/setup/diagnostics.md +109 -0
- package/vendor/ts-morph/docs/setup/file-system.md +106 -0
- package/vendor/ts-morph/docs/setup/images/atom-ast.png +0 -0
- package/vendor/ts-morph/docs/setup/images/atom-ast_small.png +0 -0
- package/vendor/ts-morph/docs/setup/images/atom-command-palette.png +0 -0
- package/vendor/ts-morph/docs/setup/images/atom-file.png +0 -0
- package/vendor/ts-morph/docs/setup/images/ts-ast-viewer.png +0 -0
- package/vendor/ts-morph/docs/setup/index.md +94 -0
- package/vendor/ts-morph/docs/utilities.md +55 -0
- package/vendor/ts-morph/dprint.json +23 -0
- package/vendor/ts-morph/package.json +30 -0
- package/vendor/ts-morph/packages/bootstrap/LICENSE +21 -0
- package/vendor/ts-morph/packages/bootstrap/lib/ts-morph-bootstrap.d.ts +397 -0
- package/vendor/ts-morph/packages/bootstrap/package.json +46 -0
- package/vendor/ts-morph/packages/bootstrap/readme.md +200 -0
- package/vendor/ts-morph/packages/common/LICENSE +21 -0
- package/vendor/ts-morph/packages/common/lib/ts-morph-common.d.ts +1082 -0
- package/vendor/ts-morph/packages/common/lib/typescript.d.ts +11439 -0
- package/vendor/ts-morph/packages/common/package.json +65 -0
- package/vendor/ts-morph/packages/common/readme.md +5 -0
- package/vendor/ts-morph/packages/scripts/changeTypeScriptVersion.ts +28 -0
- package/vendor/ts-morph/packages/scripts/createDeclarationProject.ts +47 -0
- package/vendor/ts-morph/packages/scripts/deps.ts +2 -0
- package/vendor/ts-morph/packages/scripts/execScript.ts +31 -0
- package/vendor/ts-morph/packages/scripts/folders.ts +11 -0
- package/vendor/ts-morph/packages/scripts/getDevCompilerVersions.ts +19 -0
- package/vendor/ts-morph/packages/scripts/mod.ts +7 -0
- package/vendor/ts-morph/packages/scripts/utils/Memoize.ts +36 -0
- package/vendor/ts-morph/packages/scripts/utils/forEachTypeText.ts +23 -0
- package/vendor/ts-morph/packages/scripts/utils/makeConstructorsPrivate.ts +26 -0
- package/vendor/ts-morph/packages/scripts/utils/mod.ts +4 -0
- package/vendor/ts-morph/packages/scripts/utils/printDiagnostics.ts +10 -0
- package/vendor/ts-morph/packages/ts-morph/LICENSE +21 -0
- package/vendor/ts-morph/packages/ts-morph/lib/ts-morph.d.ts +11198 -0
- package/vendor/ts-morph/packages/ts-morph/package.json +78 -0
- package/vendor/ts-morph/packages/ts-morph/readme.md +111 -0
- package/vendor/ts-morph/readme.md +14 -0
- package/vendor/ts-morph/rfcs/README.md +13 -0
- package/vendor/ts-morph/rfcs/RFC-0001 - Inserting Into Statements Handling Comments.md +181 -0
- package/vendor/ts-morph/tsconfig.common.json +17 -0
- package/vitest.config.ts +16 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extractor Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the extractor module, specifically testing tsconfig.json parsing
|
|
5
|
+
* with comments and other edge cases.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
9
|
+
import * as fs from 'node:fs'
|
|
10
|
+
import * as path from 'node:path'
|
|
11
|
+
import * as os from 'node:os'
|
|
12
|
+
|
|
13
|
+
import { loadProject } from '../src/extraction/extractor.js'
|
|
14
|
+
|
|
15
|
+
describe('loadProject', () => {
|
|
16
|
+
let tempDir: string
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
// Create a temporary directory for test files
|
|
20
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'fcis-test-'))
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
// Clean up temporary directory
|
|
25
|
+
fs.rmSync(tempDir, { recursive: true, force: true })
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
describe('tsconfig.json with comments', () => {
|
|
29
|
+
it('should parse tsconfig with line comments', () => {
|
|
30
|
+
const tsconfigContent = `{
|
|
31
|
+
// This is a line comment
|
|
32
|
+
"compilerOptions": {
|
|
33
|
+
"target": "es2022", // inline comment
|
|
34
|
+
"module": "esnext"
|
|
35
|
+
}
|
|
36
|
+
}`
|
|
37
|
+
|
|
38
|
+
const tsconfigPath = path.join(tempDir, 'tsconfig.json')
|
|
39
|
+
fs.writeFileSync(tsconfigPath, tsconfigContent)
|
|
40
|
+
|
|
41
|
+
// Create a simple source file
|
|
42
|
+
fs.writeFileSync(path.join(tempDir, 'index.ts'), 'export const foo = 1;')
|
|
43
|
+
|
|
44
|
+
expect(() => loadProject({ tsconfigPath })).not.toThrow()
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('should parse tsconfig with block comments', () => {
|
|
48
|
+
const tsconfigContent = `{
|
|
49
|
+
/* This is a block comment */
|
|
50
|
+
"compilerOptions": {
|
|
51
|
+
"target": "es2022",
|
|
52
|
+
/* Another block comment
|
|
53
|
+
spanning multiple lines */
|
|
54
|
+
"module": "esnext"
|
|
55
|
+
}
|
|
56
|
+
}`
|
|
57
|
+
|
|
58
|
+
const tsconfigPath = path.join(tempDir, 'tsconfig.json')
|
|
59
|
+
fs.writeFileSync(tsconfigPath, tsconfigContent)
|
|
60
|
+
|
|
61
|
+
// Create a simple source file
|
|
62
|
+
fs.writeFileSync(path.join(tempDir, 'index.ts'), 'export const foo = 1;')
|
|
63
|
+
|
|
64
|
+
expect(() => loadProject({ tsconfigPath })).not.toThrow()
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('should parse tsconfig with mixed comments', () => {
|
|
68
|
+
const tsconfigContent = `{
|
|
69
|
+
// Line comment at the top
|
|
70
|
+
"compilerOptions": {
|
|
71
|
+
"target": "es2022", // inline line comment
|
|
72
|
+
/* block */ "module": "esnext",
|
|
73
|
+
"strict": true
|
|
74
|
+
},
|
|
75
|
+
/*
|
|
76
|
+
Multi-line block comment
|
|
77
|
+
with various content
|
|
78
|
+
*/
|
|
79
|
+
"include": ["src/**/*"]
|
|
80
|
+
}`
|
|
81
|
+
|
|
82
|
+
const tsconfigPath = path.join(tempDir, 'tsconfig.json')
|
|
83
|
+
fs.writeFileSync(tsconfigPath, tsconfigContent)
|
|
84
|
+
|
|
85
|
+
// Create a simple source file
|
|
86
|
+
fs.writeFileSync(path.join(tempDir, 'index.ts'), 'export const foo = 1;')
|
|
87
|
+
|
|
88
|
+
expect(() => loadProject({ tsconfigPath })).not.toThrow()
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('should NOT strip comment-like strings inside JSON strings', () => {
|
|
92
|
+
const tsconfigContent = `{
|
|
93
|
+
"compilerOptions": {
|
|
94
|
+
"target": "es2022",
|
|
95
|
+
"baseUrl": "./src", // this is a comment
|
|
96
|
+
"paths": {
|
|
97
|
+
"@/*": ["*"]
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"include": ["src/**/*.ts"]
|
|
101
|
+
}`
|
|
102
|
+
|
|
103
|
+
const tsconfigPath = path.join(tempDir, 'tsconfig.json')
|
|
104
|
+
fs.writeFileSync(tsconfigPath, tsconfigContent)
|
|
105
|
+
|
|
106
|
+
// Create a simple source file
|
|
107
|
+
fs.writeFileSync(path.join(tempDir, 'index.ts'), 'export const foo = 1;')
|
|
108
|
+
|
|
109
|
+
expect(() => loadProject({ tsconfigPath })).not.toThrow()
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it('should handle URLs with slashes in strings', () => {
|
|
113
|
+
const tsconfigContent = `{
|
|
114
|
+
// Config with URL-like strings
|
|
115
|
+
"compilerOptions": {
|
|
116
|
+
"target": "es2022",
|
|
117
|
+
"typeRoots": ["./node_modules/@types", "https://example.com/types"]
|
|
118
|
+
}
|
|
119
|
+
}`
|
|
120
|
+
|
|
121
|
+
const tsconfigPath = path.join(tempDir, 'tsconfig.json')
|
|
122
|
+
fs.writeFileSync(tsconfigPath, tsconfigContent)
|
|
123
|
+
|
|
124
|
+
// Create a simple source file
|
|
125
|
+
fs.writeFileSync(path.join(tempDir, 'index.ts'), 'export const foo = 1;')
|
|
126
|
+
|
|
127
|
+
expect(() => loadProject({ tsconfigPath })).not.toThrow()
|
|
128
|
+
})
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
describe('error handling', () => {
|
|
132
|
+
it('should throw for non-existent tsconfig', () => {
|
|
133
|
+
const nonExistentPath = path.join(tempDir, 'nonexistent', 'tsconfig.json')
|
|
134
|
+
|
|
135
|
+
expect(() => loadProject({ tsconfigPath: nonExistentPath })).toThrow(
|
|
136
|
+
/tsconfig.json not found/,
|
|
137
|
+
)
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
it('should throw for invalid JSON', () => {
|
|
141
|
+
const tsconfigContent = `{
|
|
142
|
+
"compilerOptions": {
|
|
143
|
+
"target": "es2022"
|
|
144
|
+
// missing comma - this is invalid JSON even after comment stripping
|
|
145
|
+
"module": "esnext"
|
|
146
|
+
}
|
|
147
|
+
}`
|
|
148
|
+
|
|
149
|
+
const tsconfigPath = path.join(tempDir, 'tsconfig.json')
|
|
150
|
+
fs.writeFileSync(tsconfigPath, tsconfigContent)
|
|
151
|
+
|
|
152
|
+
expect(() => loadProject({ tsconfigPath })).toThrow(/Invalid tsconfig/)
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
})
|