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.
Files changed (151) hide show
  1. package/.plans/001-fcis-analyzer.md +832 -0
  2. package/.plans/002-fcis-analyzer-improvements.md +205 -0
  3. package/README.md +272 -0
  4. package/TECHNICAL.md +386 -0
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.js +1836 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/index.d.ts +709 -0
  9. package/dist/index.js +1845 -0
  10. package/dist/index.js.map +1 -0
  11. package/package.json +47 -0
  12. package/pnpm-workspace.yaml +0 -0
  13. package/src/analyzer.ts +266 -0
  14. package/src/classification/classifier.ts +156 -0
  15. package/src/classification/derive-status.ts +171 -0
  16. package/src/classification/quality-scorer.ts +481 -0
  17. package/src/cli.ts +286 -0
  18. package/src/detection/detect-markers.ts +480 -0
  19. package/src/detection/markers.ts +332 -0
  20. package/src/extraction/extract-functions.ts +570 -0
  21. package/src/extraction/extractor.ts +188 -0
  22. package/src/index.ts +111 -0
  23. package/src/reporting/report-console.ts +416 -0
  24. package/src/reporting/report-json.ts +232 -0
  25. package/src/scoring/scorer.ts +504 -0
  26. package/src/types.ts +248 -0
  27. package/tests/classifier.test.ts +480 -0
  28. package/tests/derive-status.test.ts +464 -0
  29. package/tests/detect-markers.test.ts +639 -0
  30. package/tests/extractor.test.ts +155 -0
  31. package/tests/integration.test.ts +706 -0
  32. package/tests/quality-scorer.test.ts +650 -0
  33. package/tests/scorer.test.ts +768 -0
  34. package/tsconfig.json +34 -0
  35. package/tsup.config.ts +17 -0
  36. package/vendor/ts-morph/.editorconfig +10 -0
  37. package/vendor/ts-morph/.gitattributes +11 -0
  38. package/vendor/ts-morph/.github/CODE_OF_CONDUCT.md +77 -0
  39. package/vendor/ts-morph/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  40. package/vendor/ts-morph/.github/ISSUE_TEMPLATE/custom.md +4 -0
  41. package/vendor/ts-morph/.github/ISSUE_TEMPLATE/feature_request.md +18 -0
  42. package/vendor/ts-morph/.github/workflows/ci.yml +50 -0
  43. package/vendor/ts-morph/.github/workflows/publish.yml +53 -0
  44. package/vendor/ts-morph/.vscode/settings.json +10 -0
  45. package/vendor/ts-morph/CONTRIBUTING.md +23 -0
  46. package/vendor/ts-morph/DEVELOPMENT.md +32 -0
  47. package/vendor/ts-morph/LICENSE +21 -0
  48. package/vendor/ts-morph/deno.json +8 -0
  49. package/vendor/ts-morph/deno.lock +1233 -0
  50. package/vendor/ts-morph/docs/CNAME +1 -0
  51. package/vendor/ts-morph/docs/Gemfile +2 -0
  52. package/vendor/ts-morph/docs/_config.yml +5 -0
  53. package/vendor/ts-morph/docs/_layouts/default.html +159 -0
  54. package/vendor/ts-morph/docs/_script-templates/main.ts +116 -0
  55. package/vendor/ts-morph/docs/assets/css/style.scss +212 -0
  56. package/vendor/ts-morph/docs/details/ambient.md +38 -0
  57. package/vendor/ts-morph/docs/details/async.md +31 -0
  58. package/vendor/ts-morph/docs/details/classes.md +314 -0
  59. package/vendor/ts-morph/docs/details/comment-ranges.md +7 -0
  60. package/vendor/ts-morph/docs/details/comments.md +122 -0
  61. package/vendor/ts-morph/docs/details/decorators.md +119 -0
  62. package/vendor/ts-morph/docs/details/documentation.md +73 -0
  63. package/vendor/ts-morph/docs/details/enums.md +117 -0
  64. package/vendor/ts-morph/docs/details/exports.md +308 -0
  65. package/vendor/ts-morph/docs/details/expressions.md +46 -0
  66. package/vendor/ts-morph/docs/details/functions.md +150 -0
  67. package/vendor/ts-morph/docs/details/generators.md +27 -0
  68. package/vendor/ts-morph/docs/details/identifiers.md +79 -0
  69. package/vendor/ts-morph/docs/details/imports.md +191 -0
  70. package/vendor/ts-morph/docs/details/index.md +52 -0
  71. package/vendor/ts-morph/docs/details/initializers.md +40 -0
  72. package/vendor/ts-morph/docs/details/interfaces.md +218 -0
  73. package/vendor/ts-morph/docs/details/literals.md +20 -0
  74. package/vendor/ts-morph/docs/details/modifiers.md +38 -0
  75. package/vendor/ts-morph/docs/details/modules.md +113 -0
  76. package/vendor/ts-morph/docs/details/namespaces.md +7 -0
  77. package/vendor/ts-morph/docs/details/object-literal-expressions.md +106 -0
  78. package/vendor/ts-morph/docs/details/parameters.md +64 -0
  79. package/vendor/ts-morph/docs/details/signatures.md +41 -0
  80. package/vendor/ts-morph/docs/details/source-files.md +292 -0
  81. package/vendor/ts-morph/docs/details/type-aliases.md +34 -0
  82. package/vendor/ts-morph/docs/details/type-parameters.md +72 -0
  83. package/vendor/ts-morph/docs/details/types.md +254 -0
  84. package/vendor/ts-morph/docs/details/variables.md +110 -0
  85. package/vendor/ts-morph/docs/emitting.md +151 -0
  86. package/vendor/ts-morph/docs/index.md +25 -0
  87. package/vendor/ts-morph/docs/manipulation/code-writer.md +20 -0
  88. package/vendor/ts-morph/docs/manipulation/formatting.md +76 -0
  89. package/vendor/ts-morph/docs/manipulation/index.md +136 -0
  90. package/vendor/ts-morph/docs/manipulation/order.md +14 -0
  91. package/vendor/ts-morph/docs/manipulation/performance.md +222 -0
  92. package/vendor/ts-morph/docs/manipulation/removing.md +31 -0
  93. package/vendor/ts-morph/docs/manipulation/renaming.md +106 -0
  94. package/vendor/ts-morph/docs/manipulation/settings.md +76 -0
  95. package/vendor/ts-morph/docs/manipulation/structures.md +117 -0
  96. package/vendor/ts-morph/docs/manipulation/transforms.md +84 -0
  97. package/vendor/ts-morph/docs/metrics/performance.json +4 -0
  98. package/vendor/ts-morph/docs/navigation/ambient-modules.md +22 -0
  99. package/vendor/ts-morph/docs/navigation/compiler-nodes.md +82 -0
  100. package/vendor/ts-morph/docs/navigation/directories.md +287 -0
  101. package/vendor/ts-morph/docs/navigation/example.md +50 -0
  102. package/vendor/ts-morph/docs/navigation/finding-references.md +53 -0
  103. package/vendor/ts-morph/docs/navigation/getting-source-files.md +59 -0
  104. package/vendor/ts-morph/docs/navigation/images/getChildrenVsForEachChild.gif +0 -0
  105. package/vendor/ts-morph/docs/navigation/index.md +94 -0
  106. package/vendor/ts-morph/docs/navigation/language-service.md +23 -0
  107. package/vendor/ts-morph/docs/navigation/program.md +25 -0
  108. package/vendor/ts-morph/docs/navigation/type-checker.md +33 -0
  109. package/vendor/ts-morph/docs/setup/adding-source-files.md +145 -0
  110. package/vendor/ts-morph/docs/setup/ast-viewers.md +46 -0
  111. package/vendor/ts-morph/docs/setup/diagnostics.md +109 -0
  112. package/vendor/ts-morph/docs/setup/file-system.md +106 -0
  113. package/vendor/ts-morph/docs/setup/images/atom-ast.png +0 -0
  114. package/vendor/ts-morph/docs/setup/images/atom-ast_small.png +0 -0
  115. package/vendor/ts-morph/docs/setup/images/atom-command-palette.png +0 -0
  116. package/vendor/ts-morph/docs/setup/images/atom-file.png +0 -0
  117. package/vendor/ts-morph/docs/setup/images/ts-ast-viewer.png +0 -0
  118. package/vendor/ts-morph/docs/setup/index.md +94 -0
  119. package/vendor/ts-morph/docs/utilities.md +55 -0
  120. package/vendor/ts-morph/dprint.json +23 -0
  121. package/vendor/ts-morph/package.json +30 -0
  122. package/vendor/ts-morph/packages/bootstrap/LICENSE +21 -0
  123. package/vendor/ts-morph/packages/bootstrap/lib/ts-morph-bootstrap.d.ts +397 -0
  124. package/vendor/ts-morph/packages/bootstrap/package.json +46 -0
  125. package/vendor/ts-morph/packages/bootstrap/readme.md +200 -0
  126. package/vendor/ts-morph/packages/common/LICENSE +21 -0
  127. package/vendor/ts-morph/packages/common/lib/ts-morph-common.d.ts +1082 -0
  128. package/vendor/ts-morph/packages/common/lib/typescript.d.ts +11439 -0
  129. package/vendor/ts-morph/packages/common/package.json +65 -0
  130. package/vendor/ts-morph/packages/common/readme.md +5 -0
  131. package/vendor/ts-morph/packages/scripts/changeTypeScriptVersion.ts +28 -0
  132. package/vendor/ts-morph/packages/scripts/createDeclarationProject.ts +47 -0
  133. package/vendor/ts-morph/packages/scripts/deps.ts +2 -0
  134. package/vendor/ts-morph/packages/scripts/execScript.ts +31 -0
  135. package/vendor/ts-morph/packages/scripts/folders.ts +11 -0
  136. package/vendor/ts-morph/packages/scripts/getDevCompilerVersions.ts +19 -0
  137. package/vendor/ts-morph/packages/scripts/mod.ts +7 -0
  138. package/vendor/ts-morph/packages/scripts/utils/Memoize.ts +36 -0
  139. package/vendor/ts-morph/packages/scripts/utils/forEachTypeText.ts +23 -0
  140. package/vendor/ts-morph/packages/scripts/utils/makeConstructorsPrivate.ts +26 -0
  141. package/vendor/ts-morph/packages/scripts/utils/mod.ts +4 -0
  142. package/vendor/ts-morph/packages/scripts/utils/printDiagnostics.ts +10 -0
  143. package/vendor/ts-morph/packages/ts-morph/LICENSE +21 -0
  144. package/vendor/ts-morph/packages/ts-morph/lib/ts-morph.d.ts +11198 -0
  145. package/vendor/ts-morph/packages/ts-morph/package.json +78 -0
  146. package/vendor/ts-morph/packages/ts-morph/readme.md +111 -0
  147. package/vendor/ts-morph/readme.md +14 -0
  148. package/vendor/ts-morph/rfcs/README.md +13 -0
  149. package/vendor/ts-morph/rfcs/RFC-0001 - Inserting Into Statements Handling Comments.md +181 -0
  150. package/vendor/ts-morph/tsconfig.common.json +17 -0
  151. 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
+ })