@bemedev/codebase 1.4.0 → 1.6.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/README.md +2 -2
- package/lib/functions/add.cjs +2 -2
- package/lib/functions/add.cjs.map +1 -1
- package/lib/functions/add.d.ts.map +1 -1
- package/lib/functions/add.js +2 -2
- package/lib/functions/add.js.map +1 -1
- package/lib/functions/lift.cjs +15 -1
- package/lib/functions/lift.cjs.map +1 -1
- package/lib/functions/lift.d.ts +6 -1
- package/lib/functions/lift.d.ts.map +1 -1
- package/lib/functions/lift.js +13 -1
- package/lib/functions/lift.js.map +1 -1
- package/lib/functions/remove.cjs +1 -1
- package/lib/functions/remove.cjs.map +1 -1
- package/lib/functions/remove.js +1 -1
- package/lib/functions/remove.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -128,8 +128,8 @@ folders that become empty.
|
|
|
128
128
|
```typescript
|
|
129
129
|
import { lift } from '@bemedev/codebase';
|
|
130
130
|
|
|
131
|
-
// Prune unused code and perform tree shaking
|
|
132
|
-
lift('
|
|
131
|
+
// Prune unused code and perform tree shaking using the codebase configuration path
|
|
132
|
+
lift('.project-codebase.json');
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
## 📊 Output format
|
package/lib/functions/add.cjs
CHANGED
|
@@ -13,7 +13,7 @@ const processFileAnalysis = (analysis, cwd, additionals, pathsEntries, files, CO
|
|
|
13
13
|
const _path = (0, path.relative)(cwd, (0, path.resolve)((0, path.dirname)(relativePath), moduleSpecifier));
|
|
14
14
|
const all = additionals.concat(pathsEntries).map(([key]) => key).concat(files);
|
|
15
15
|
if (!all.every((p) => p !== _path)) return;
|
|
16
|
-
const toAdd = CODEBASE_ANALYSIS[_path] ?? CODEBASE_ANALYSIS[`${_path}
|
|
16
|
+
const toAdd = CODEBASE_ANALYSIS[_path] ?? CODEBASE_ANALYSIS[`${_path}/index`];
|
|
17
17
|
if (!toAdd) return;
|
|
18
18
|
additionals.push([_path, toAdd]);
|
|
19
19
|
all.push(_path);
|
|
@@ -23,7 +23,7 @@ const processFileAnalysis = (analysis, cwd, additionals, pathsEntries, files, CO
|
|
|
23
23
|
relativePath: toAdd.relativePath,
|
|
24
24
|
moduleSpecifier
|
|
25
25
|
});
|
|
26
|
-
const array = [_path, `${_path}
|
|
26
|
+
const array = [_path, `${_path}/index`].filter((p) => keys.includes(p));
|
|
27
27
|
if (array.length < 1) return false;
|
|
28
28
|
return array.every((p) => !all.includes(p));
|
|
29
29
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.cjs","names":["transformModule","FILES_PROPERTY","getFolderPath","PATH_PROPERTY","writeFileAnalysis"],"sources":["../../src/functions/add.ts"],"sourcesContent":["import edit, { JsonEditor } from 'edit-json-file';\nimport { dirname, join, relative, resolve } from 'path';\nimport { FILES_PROPERTY, PATH_PROPERTY } from '../constants';\nimport {\n consoleStars,\n getFolderPath,\n transformModule,\n writeFileAnalysis,\n} from '../helpers';\nimport { CodebaseAnalysis, type FileAnalysis } from '../schemas';\nimport type { NOmit } from '../types';\n\nconst processFileAnalysis = (\n analysis: NOmit<FileAnalysis, 'exports'>,\n cwd: string,\n additionals: [string, NOmit<FileAnalysis, 'exports'>][],\n pathsEntries: [string, NOmit<FileAnalysis, 'exports'>][],\n files: string[],\n CODEBASE_ANALYSIS: CodebaseAnalysis,\n) => {\n const relativePath = analysis.relativePath;\n\n const keys = Object.keys(CODEBASE_ANALYSIS);\n analysis.imports.forEach(({ moduleSpecifier }) => {\n const _path = relative(\n cwd,\n resolve(dirname(relativePath), moduleSpecifier),\n );\n\n const all = additionals\n .concat(pathsEntries)\n .map(([key]) => key)\n .concat(files);\n\n const canAdd = all.every(p => p !== _path);\n if (!canAdd) return;\n\n const toAdd =\n CODEBASE_ANALYSIS[_path] ?? CODEBASE_ANALYSIS[`${_path}
|
|
1
|
+
{"version":3,"file":"add.cjs","names":["transformModule","FILES_PROPERTY","getFolderPath","PATH_PROPERTY","writeFileAnalysis"],"sources":["../../src/functions/add.ts"],"sourcesContent":["import edit, { type JsonEditor } from 'edit-json-file';\nimport { dirname, join, relative, resolve } from 'path';\nimport { FILES_PROPERTY, PATH_PROPERTY } from '../constants';\nimport {\n consoleStars,\n getFolderPath,\n transformModule,\n writeFileAnalysis,\n} from '../helpers';\nimport { CodebaseAnalysis, type FileAnalysis } from '../schemas';\nimport type { NOmit } from '../types';\n\nconst processFileAnalysis = (\n analysis: NOmit<FileAnalysis, 'exports'>,\n cwd: string,\n additionals: [string, NOmit<FileAnalysis, 'exports'>][],\n pathsEntries: [string, NOmit<FileAnalysis, 'exports'>][],\n files: string[],\n CODEBASE_ANALYSIS: CodebaseAnalysis,\n) => {\n const relativePath = analysis.relativePath;\n\n const keys = Object.keys(CODEBASE_ANALYSIS);\n analysis.imports.forEach(({ moduleSpecifier }) => {\n const _path = relative(\n cwd,\n resolve(dirname(relativePath), moduleSpecifier),\n );\n\n const all = additionals\n .concat(pathsEntries)\n .map(([key]) => key)\n .concat(files);\n\n const canAdd = all.every(p => p !== _path);\n if (!canAdd) return;\n\n const toAdd =\n CODEBASE_ANALYSIS[_path] ?? CODEBASE_ANALYSIS[`${_path}/index`];\n if (!toAdd) return;\n\n additionals.push([_path, toAdd]);\n all.push(_path);\n\n const imports = toAdd.imports.filter(({ moduleSpecifier }) => {\n const _path = transformModule({\n cwd,\n relativePath: toAdd.relativePath,\n moduleSpecifier,\n });\n\n const array = [_path, `${_path}/index`].filter(p =>\n keys.includes(p),\n );\n\n if (array.length < 1) return false;\n return array.every(p => !all.includes(p));\n });\n\n const toAdd2 = { ...toAdd, imports };\n const canRecurse = toAdd2.imports.length > 0;\n\n if (canRecurse) {\n processFileAnalysis(\n toAdd2,\n cwd,\n additionals,\n pathsEntries,\n files,\n CODEBASE_ANALYSIS,\n );\n }\n });\n};\n\nexport const add = (\n CODEBASE_ANALYSIS: CodebaseAnalysis,\n jsonConfigPath: string,\n ...paths: string[]\n) => {\n const isEmpty = paths.length === 0;\n if (isEmpty) return console.warn('No files specified for addition.');\n try {\n const cwd = process.cwd();\n const json = join(cwd, jsonConfigPath);\n let file: JsonEditor | undefined = edit(json);\n\n if (!file) return;\n\n const files = file.get(FILES_PROPERTY) as string[];\n const root = getFolderPath(file.get(PATH_PROPERTY) as string);\n\n // Release resources\n\n const additionals: [string, NOmit<FileAnalysis, 'exports'>][] = [];\n\n const pathsEntries = Object.entries(CODEBASE_ANALYSIS)\n .filter(([key]) => paths.some(p => key.startsWith(p)))\n .filter(([key]) => !files.includes(key));\n\n pathsEntries.forEach(([, analysis]) => {\n processFileAnalysis(\n analysis,\n cwd,\n additionals,\n pathsEntries,\n files,\n CODEBASE_ANALYSIS,\n );\n });\n\n const entries = new Set(\n pathsEntries.concat(additionals).filter(([, val]) => !!val),\n );\n\n consoleStars();\n console.log(`🔧 Creation of files (${entries.size} files)...`);\n\n let success = 0;\n const length = entries.size;\n\n entries.forEach(([, fileAnalysis]) => {\n const _path = writeFileAnalysis(fileAnalysis, root);\n if (_path) {\n files.push(_path);\n success++;\n }\n });\n\n file.set(FILES_PROPERTY, files);\n file.save();\n console.log(`✅ Files created! (${success}/${length})`);\n file = undefined;\n } catch {\n console.error(`❌ Error during file creation`);\n return false;\n }\n\n consoleStars();\n return true;\n};\n"],"mappings":";;;;;;;;AAYA,MAAM,uBACJ,UACA,KACA,aACA,cACA,OACA,sBACG;CACH,MAAM,eAAe,SAAS;CAE9B,MAAM,OAAO,OAAO,KAAK,iBAAiB;CAC1C,SAAS,QAAQ,SAAS,EAAE,sBAAsB;EAChD,MAAM,SAAA,GAAA,KAAA,SAAA,CACJ,MAAA,GAAA,KAAA,QAAA,EAAA,GAAA,KAAA,QAAA,CACgB,YAAY,GAAG,eAAe,CAChD;EAEA,MAAM,MAAM,YACT,OAAO,YAAY,CAAC,CACpB,KAAK,CAAC,SAAS,GAAG,CAAC,CACnB,OAAO,KAAK;EAGf,IAAI,CADW,IAAI,OAAM,MAAK,MAAM,KAC1B,GAAG;EAEb,MAAM,QACJ,kBAAkB,UAAU,kBAAkB,GAAG,MAAM;EACzD,IAAI,CAAC,OAAO;EAEZ,YAAY,KAAK,CAAC,OAAO,KAAK,CAAC;EAC/B,IAAI,KAAK,KAAK;EAEd,MAAM,UAAU,MAAM,QAAQ,QAAQ,EAAE,sBAAsB;GAC5D,MAAM,QAAQA,gBAAAA,gBAAgB;IAC5B;IACA,cAAc,MAAM;IACpB;GACF,CAAC;GAED,MAAM,QAAQ,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,QAAO,MAC7C,KAAK,SAAS,CAAC,CACjB;GAEA,IAAI,MAAM,SAAS,GAAG,OAAO;GAC7B,OAAO,MAAM,OAAM,MAAK,CAAC,IAAI,SAAS,CAAC,CAAC;EAC1C,CAAC;EAED,MAAM,SAAS;GAAE,GAAG;GAAO;EAAQ;EAGnC,IAFmB,OAAO,QAAQ,SAAS,GAGzC,oBACE,QACA,KACA,aACA,cACA,OACA,iBACF;CAEJ,CAAC;AACH;AAEA,MAAa,OACX,mBACA,gBACA,GAAG,UACA;CAEH,IADgB,MAAM,WAAW,GACpB,OAAO,QAAQ,KAAK,kCAAkC;CACnE,IAAI;EACF,MAAM,MAAM,QAAQ,IAAI;EAExB,IAAI,QAAA,GAAA,eAAA,QAAA,EAAA,GAAA,KAAA,KAAA,CADc,KAAK,cACoB,CAAC;EAE5C,IAAI,CAAC,MAAM;EAEX,MAAM,QAAQ,KAAK,IAAIC,kBAAAA,cAAc;EACrC,MAAM,OAAOC,gBAAAA,cAAc,KAAK,IAAIC,kBAAAA,aAAa,CAAW;EAI5D,MAAM,cAA0D,CAAC;EAEjE,MAAM,eAAe,OAAO,QAAQ,iBAAiB,CAAC,CACnD,QAAQ,CAAC,SAAS,MAAM,MAAK,MAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CACrD,QAAQ,CAAC,SAAS,CAAC,MAAM,SAAS,GAAG,CAAC;EAEzC,aAAa,SAAS,GAAG,cAAc;GACrC,oBACE,UACA,KACA,aACA,cACA,OACA,iBACF;EACF,CAAC;EAED,MAAM,UAAU,IAAI,IAClB,aAAa,OAAO,WAAW,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,GAAG,CAC5D;EAEA,gBAAA,aAAa;EACb,QAAQ,IAAI,yBAAyB,QAAQ,KAAK,WAAW;EAE7D,IAAI,UAAU;EACd,MAAM,SAAS,QAAQ;EAEvB,QAAQ,SAAS,GAAG,kBAAkB;GACpC,MAAM,QAAQC,gBAAAA,kBAAkB,cAAc,IAAI;GAClD,IAAI,OAAO;IACT,MAAM,KAAK,KAAK;IAChB;GACF;EACF,CAAC;EAED,KAAK,IAAIH,kBAAAA,gBAAgB,KAAK;EAC9B,KAAK,KAAK;EACV,QAAQ,IAAI,qBAAqB,QAAQ,GAAG,OAAO,EAAE;EACrD,OAAO,KAAA;CACT,QAAQ;EACN,QAAQ,MAAM,8BAA8B;EAC5C,OAAO;CACT;CAEA,gBAAA,aAAa;CACb,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/functions/add.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/functions/add.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,YAAY,CAAC;AAkEjE,eAAO,MAAM,GAAG,GACd,mBAAmB,gBAAgB,EACnC,gBAAgB,MAAM,EACtB,GAAG,OAAO,MAAM,EAAE,mBA8DnB,CAAC"}
|
package/lib/functions/add.js
CHANGED
|
@@ -10,7 +10,7 @@ const processFileAnalysis = (analysis, cwd, additionals, pathsEntries, files, CO
|
|
|
10
10
|
const _path = relative(cwd, resolve(dirname(relativePath), moduleSpecifier));
|
|
11
11
|
const all = additionals.concat(pathsEntries).map(([key]) => key).concat(files);
|
|
12
12
|
if (!all.every((p) => p !== _path)) return;
|
|
13
|
-
const toAdd = CODEBASE_ANALYSIS[_path] ?? CODEBASE_ANALYSIS[`${_path}
|
|
13
|
+
const toAdd = CODEBASE_ANALYSIS[_path] ?? CODEBASE_ANALYSIS[`${_path}/index`];
|
|
14
14
|
if (!toAdd) return;
|
|
15
15
|
additionals.push([_path, toAdd]);
|
|
16
16
|
all.push(_path);
|
|
@@ -20,7 +20,7 @@ const processFileAnalysis = (analysis, cwd, additionals, pathsEntries, files, CO
|
|
|
20
20
|
relativePath: toAdd.relativePath,
|
|
21
21
|
moduleSpecifier
|
|
22
22
|
});
|
|
23
|
-
const array = [_path, `${_path}
|
|
23
|
+
const array = [_path, `${_path}/index`].filter((p) => keys.includes(p));
|
|
24
24
|
if (array.length < 1) return false;
|
|
25
25
|
return array.every((p) => !all.includes(p));
|
|
26
26
|
});
|
package/lib/functions/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","names":[],"sources":["../../src/functions/add.ts"],"sourcesContent":["import edit, { JsonEditor } from 'edit-json-file';\nimport { dirname, join, relative, resolve } from 'path';\nimport { FILES_PROPERTY, PATH_PROPERTY } from '../constants';\nimport {\n consoleStars,\n getFolderPath,\n transformModule,\n writeFileAnalysis,\n} from '../helpers';\nimport { CodebaseAnalysis, type FileAnalysis } from '../schemas';\nimport type { NOmit } from '../types';\n\nconst processFileAnalysis = (\n analysis: NOmit<FileAnalysis, 'exports'>,\n cwd: string,\n additionals: [string, NOmit<FileAnalysis, 'exports'>][],\n pathsEntries: [string, NOmit<FileAnalysis, 'exports'>][],\n files: string[],\n CODEBASE_ANALYSIS: CodebaseAnalysis,\n) => {\n const relativePath = analysis.relativePath;\n\n const keys = Object.keys(CODEBASE_ANALYSIS);\n analysis.imports.forEach(({ moduleSpecifier }) => {\n const _path = relative(\n cwd,\n resolve(dirname(relativePath), moduleSpecifier),\n );\n\n const all = additionals\n .concat(pathsEntries)\n .map(([key]) => key)\n .concat(files);\n\n const canAdd = all.every(p => p !== _path);\n if (!canAdd) return;\n\n const toAdd =\n CODEBASE_ANALYSIS[_path] ?? CODEBASE_ANALYSIS[`${_path}
|
|
1
|
+
{"version":3,"file":"add.js","names":[],"sources":["../../src/functions/add.ts"],"sourcesContent":["import edit, { type JsonEditor } from 'edit-json-file';\nimport { dirname, join, relative, resolve } from 'path';\nimport { FILES_PROPERTY, PATH_PROPERTY } from '../constants';\nimport {\n consoleStars,\n getFolderPath,\n transformModule,\n writeFileAnalysis,\n} from '../helpers';\nimport { CodebaseAnalysis, type FileAnalysis } from '../schemas';\nimport type { NOmit } from '../types';\n\nconst processFileAnalysis = (\n analysis: NOmit<FileAnalysis, 'exports'>,\n cwd: string,\n additionals: [string, NOmit<FileAnalysis, 'exports'>][],\n pathsEntries: [string, NOmit<FileAnalysis, 'exports'>][],\n files: string[],\n CODEBASE_ANALYSIS: CodebaseAnalysis,\n) => {\n const relativePath = analysis.relativePath;\n\n const keys = Object.keys(CODEBASE_ANALYSIS);\n analysis.imports.forEach(({ moduleSpecifier }) => {\n const _path = relative(\n cwd,\n resolve(dirname(relativePath), moduleSpecifier),\n );\n\n const all = additionals\n .concat(pathsEntries)\n .map(([key]) => key)\n .concat(files);\n\n const canAdd = all.every(p => p !== _path);\n if (!canAdd) return;\n\n const toAdd =\n CODEBASE_ANALYSIS[_path] ?? CODEBASE_ANALYSIS[`${_path}/index`];\n if (!toAdd) return;\n\n additionals.push([_path, toAdd]);\n all.push(_path);\n\n const imports = toAdd.imports.filter(({ moduleSpecifier }) => {\n const _path = transformModule({\n cwd,\n relativePath: toAdd.relativePath,\n moduleSpecifier,\n });\n\n const array = [_path, `${_path}/index`].filter(p =>\n keys.includes(p),\n );\n\n if (array.length < 1) return false;\n return array.every(p => !all.includes(p));\n });\n\n const toAdd2 = { ...toAdd, imports };\n const canRecurse = toAdd2.imports.length > 0;\n\n if (canRecurse) {\n processFileAnalysis(\n toAdd2,\n cwd,\n additionals,\n pathsEntries,\n files,\n CODEBASE_ANALYSIS,\n );\n }\n });\n};\n\nexport const add = (\n CODEBASE_ANALYSIS: CodebaseAnalysis,\n jsonConfigPath: string,\n ...paths: string[]\n) => {\n const isEmpty = paths.length === 0;\n if (isEmpty) return console.warn('No files specified for addition.');\n try {\n const cwd = process.cwd();\n const json = join(cwd, jsonConfigPath);\n let file: JsonEditor | undefined = edit(json);\n\n if (!file) return;\n\n const files = file.get(FILES_PROPERTY) as string[];\n const root = getFolderPath(file.get(PATH_PROPERTY) as string);\n\n // Release resources\n\n const additionals: [string, NOmit<FileAnalysis, 'exports'>][] = [];\n\n const pathsEntries = Object.entries(CODEBASE_ANALYSIS)\n .filter(([key]) => paths.some(p => key.startsWith(p)))\n .filter(([key]) => !files.includes(key));\n\n pathsEntries.forEach(([, analysis]) => {\n processFileAnalysis(\n analysis,\n cwd,\n additionals,\n pathsEntries,\n files,\n CODEBASE_ANALYSIS,\n );\n });\n\n const entries = new Set(\n pathsEntries.concat(additionals).filter(([, val]) => !!val),\n );\n\n consoleStars();\n console.log(`🔧 Creation of files (${entries.size} files)...`);\n\n let success = 0;\n const length = entries.size;\n\n entries.forEach(([, fileAnalysis]) => {\n const _path = writeFileAnalysis(fileAnalysis, root);\n if (_path) {\n files.push(_path);\n success++;\n }\n });\n\n file.set(FILES_PROPERTY, files);\n file.save();\n console.log(`✅ Files created! (${success}/${length})`);\n file = undefined;\n } catch {\n console.error(`❌ Error during file creation`);\n return false;\n }\n\n consoleStars();\n return true;\n};\n"],"mappings":";;;;;AAYA,MAAM,uBACJ,UACA,KACA,aACA,cACA,OACA,sBACG;CACH,MAAM,eAAe,SAAS;CAE9B,MAAM,OAAO,OAAO,KAAK,iBAAiB;CAC1C,SAAS,QAAQ,SAAS,EAAE,sBAAsB;EAChD,MAAM,QAAQ,SACZ,KACA,QAAQ,QAAQ,YAAY,GAAG,eAAe,CAChD;EAEA,MAAM,MAAM,YACT,OAAO,YAAY,CAAC,CACpB,KAAK,CAAC,SAAS,GAAG,CAAC,CACnB,OAAO,KAAK;EAGf,IAAI,CADW,IAAI,OAAM,MAAK,MAAM,KAC1B,GAAG;EAEb,MAAM,QACJ,kBAAkB,UAAU,kBAAkB,GAAG,MAAM;EACzD,IAAI,CAAC,OAAO;EAEZ,YAAY,KAAK,CAAC,OAAO,KAAK,CAAC;EAC/B,IAAI,KAAK,KAAK;EAEd,MAAM,UAAU,MAAM,QAAQ,QAAQ,EAAE,sBAAsB;GAC5D,MAAM,QAAQ,gBAAgB;IAC5B;IACA,cAAc,MAAM;IACpB;GACF,CAAC;GAED,MAAM,QAAQ,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,QAAO,MAC7C,KAAK,SAAS,CAAC,CACjB;GAEA,IAAI,MAAM,SAAS,GAAG,OAAO;GAC7B,OAAO,MAAM,OAAM,MAAK,CAAC,IAAI,SAAS,CAAC,CAAC;EAC1C,CAAC;EAED,MAAM,SAAS;GAAE,GAAG;GAAO;EAAQ;EAGnC,IAFmB,OAAO,QAAQ,SAAS,GAGzC,oBACE,QACA,KACA,aACA,cACA,OACA,iBACF;CAEJ,CAAC;AACH;AAEA,MAAa,OACX,mBACA,gBACA,GAAG,UACA;CAEH,IADgB,MAAM,WAAW,GACpB,OAAO,QAAQ,KAAK,kCAAkC;CACnE,IAAI;EACF,MAAM,MAAM,QAAQ,IAAI;EAExB,IAAI,OAA+B,KADtB,KAAK,KAAK,cACoB,CAAC;EAE5C,IAAI,CAAC,MAAM;EAEX,MAAM,QAAQ,KAAK,IAAI,cAAc;EACrC,MAAM,OAAO,cAAc,KAAK,IAAI,aAAa,CAAW;EAI5D,MAAM,cAA0D,CAAC;EAEjE,MAAM,eAAe,OAAO,QAAQ,iBAAiB,CAAC,CACnD,QAAQ,CAAC,SAAS,MAAM,MAAK,MAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CACrD,QAAQ,CAAC,SAAS,CAAC,MAAM,SAAS,GAAG,CAAC;EAEzC,aAAa,SAAS,GAAG,cAAc;GACrC,oBACE,UACA,KACA,aACA,cACA,OACA,iBACF;EACF,CAAC;EAED,MAAM,UAAU,IAAI,IAClB,aAAa,OAAO,WAAW,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,GAAG,CAC5D;EAEA,aAAa;EACb,QAAQ,IAAI,yBAAyB,QAAQ,KAAK,WAAW;EAE7D,IAAI,UAAU;EACd,MAAM,SAAS,QAAQ;EAEvB,QAAQ,SAAS,GAAG,kBAAkB;GACpC,MAAM,QAAQ,kBAAkB,cAAc,IAAI;GAClD,IAAI,OAAO;IACT,MAAM,KAAK,KAAK;IAChB;GACF;EACF,CAAC;EAED,KAAK,IAAI,gBAAgB,KAAK;EAC9B,KAAK,KAAK;EACV,QAAQ,IAAI,qBAAqB,QAAQ,GAAG,OAAO,EAAE;EACrD,OAAO,KAAA;CACT,QAAQ;EACN,QAAQ,MAAM,8BAA8B;EAC5C,OAAO;CACT;CAEA,aAAa;CACb,OAAO;AACT"}
|
package/lib/functions/lift.cjs
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
3
|
+
const require_constants = require("../constants.cjs");
|
|
2
4
|
const require_helpers = require("../helpers.cjs");
|
|
3
5
|
let path = require("path");
|
|
4
6
|
let ts_morph = require("ts-morph");
|
|
5
7
|
let fs = require("fs");
|
|
8
|
+
let edit_json_file = require("edit-json-file");
|
|
9
|
+
edit_json_file = require_runtime.__toESM(edit_json_file, 1);
|
|
6
10
|
//#region src/functions/lift.ts
|
|
7
|
-
const
|
|
11
|
+
const _lift = (root) => {
|
|
8
12
|
const folderPath = require_helpers.getFolderPath(root);
|
|
9
13
|
if (!(0, fs.existsSync)(folderPath)) {
|
|
10
14
|
console.warn(`Folder not found: ${folderPath}`);
|
|
@@ -119,6 +123,16 @@ const lift = (root) => {
|
|
|
119
123
|
cleanEmptyDirs(folderPath);
|
|
120
124
|
return true;
|
|
121
125
|
};
|
|
126
|
+
/**
|
|
127
|
+
*
|
|
128
|
+
* @param jsonConfigPath
|
|
129
|
+
* @returns
|
|
130
|
+
*/
|
|
131
|
+
const lift = (jsonConfigPath) => {
|
|
132
|
+
const root = (0, edit_json_file.default)((0, path.join)(process.cwd(), jsonConfigPath)).get(require_constants.PATH_PROPERTY);
|
|
133
|
+
if (!root || typeof root !== "string") throw new Error("Root path not found in codebase configuration.");
|
|
134
|
+
return _lift(root);
|
|
135
|
+
};
|
|
122
136
|
//#endregion
|
|
123
137
|
exports.lift = lift;
|
|
124
138
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lift.cjs","names":["getFolderPath","Project","Node"],"sources":["../../src/functions/lift.ts"],"sourcesContent":["import {\n existsSync,\n readdirSync,\n rmdirSync,\n statSync,\n unlinkSync,\n} from 'fs';\nimport { join } from 'path';\nimport { Project, Node } from 'ts-morph';\nimport { getFolderPath } from '../helpers';\n\nexport const lift = (root: string) => {\n const folderPath = getFolderPath(root);\n if (!existsSync(folderPath)) {\n console.warn(`Folder not found: ${folderPath}`);\n return false;\n }\n\n const tsconfigPath = join(process.cwd(), 'tsconfig.json');\n const project = existsSync(tsconfigPath)\n ? new Project({ tsConfigFilePath: tsconfigPath })\n : new Project();\n\n // Add all source files recursively\n project.addSourceFilesAtPaths(join(folderPath, '**/*.ts'));\n project.addSourceFilesAtPaths(join(folderPath, '**/*.tsx'));\n\n const isInsideFolder = (filePath: string) => {\n return filePath.startsWith(folderPath);\n };\n\n let changed = true;\n while (changed) {\n changed = false;\n\n // A: Declarations inside the target folder\n const declarations = project\n .getSourceFiles()\n .filter(sf => isInsideFolder(sf.getFilePath()))\n .flatMap(sf => [\n ...sf.getTypeAliases(),\n ...sf.getInterfaces(),\n ...sf.getVariableDeclarations(),\n ...sf.getFunctions(),\n ...sf.getClasses(),\n ...sf.getEnums(),\n ]);\n\n for (const decl of declarations) {\n if (decl.wasForgotten()) continue;\n\n const nameNode = decl.getNameNode();\n if (!nameNode || !Node.isIdentifier(nameNode)) continue;\n\n const referencedSymbols = nameNode.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (ref.getNode() !== nameNode) {\n refCount++;\n }\n }\n }\n\n if (refCount === 0) {\n decl.remove();\n changed = true;\n break;\n }\n }\n\n if (changed) continue;\n\n // B: Imports inside the target folder\n const importDeclarations = project\n .getSourceFiles()\n .filter(sf => isInsideFolder(sf.getFilePath()))\n .flatMap(sf => sf.getImportDeclarations());\n\n for (const imp of importDeclarations) {\n if (imp.wasForgotten()) continue;\n const sf = imp.getSourceFile();\n\n // 1. Named imports\n const namedImports = imp.getNamedImports();\n for (const spec of namedImports) {\n if (spec.wasForgotten()) continue;\n const nameNode = spec.getNameNode();\n if (!Node.isIdentifier(nameNode)) continue;\n\n const referencedSymbols = nameNode.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== nameNode\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n spec.remove();\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 2. Default import\n const defaultImport = imp.getDefaultImport();\n if (\n defaultImport &&\n !defaultImport.wasForgotten() &&\n Node.isIdentifier(defaultImport)\n ) {\n const referencedSymbols = defaultImport.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== defaultImport\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n const hasNamed = imp.getNamedImports().length > 0;\n const hasNamespace = !!imp.getNamespaceImport();\n if (!hasNamed && !hasNamespace) {\n imp.remove();\n } else {\n imp.removeDefaultImport();\n }\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 3. Namespace import\n const namespaceImport = imp.getNamespaceImport();\n if (\n namespaceImport &&\n !namespaceImport.wasForgotten() &&\n Node.isIdentifier(namespaceImport)\n ) {\n const referencedSymbols = namespaceImport.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== namespaceImport\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n imp.remove();\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 4. Empty import declarations\n const hasNamed = imp.getNamedImports().length > 0;\n const hasDefault = !!imp.getDefaultImport();\n const hasNamespace = !!imp.getNamespaceImport();\n if (!hasNamed && !hasDefault && !hasNamespace) {\n imp.remove();\n changed = true;\n break;\n }\n }\n }\n\n // Save changes\n project.saveSync();\n\n // Delete files that are empty (after trimming whitespace) and inside the target folder\n const sourceFiles = project.getSourceFiles();\n for (const sf of sourceFiles) {\n const filePath = sf.getFilePath();\n if (isInsideFolder(filePath) && sf.getFullText().trim() === '') {\n project.removeSourceFile(sf);\n if (existsSync(filePath)) {\n unlinkSync(filePath);\n }\n }\n }\n\n // Helper to recursively clean empty directories\n const cleanEmptyDirs = (dir: string) => {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return;\n\n const files = readdirSync(dir);\n for (const file of files) {\n const fullPath = join(dir, file);\n if (statSync(fullPath).isDirectory()) {\n cleanEmptyDirs(fullPath);\n }\n }\n\n const remaining = readdirSync(dir);\n if (remaining.length === 0) {\n rmdirSync(dir);\n }\n };\n\n cleanEmptyDirs(folderPath);\n\n return true;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lift.cjs","names":["getFolderPath","Project","Node","PATH_PROPERTY"],"sources":["../../src/functions/lift.ts"],"sourcesContent":["import edit from 'edit-json-file';\nimport {\n existsSync,\n readdirSync,\n rmdirSync,\n statSync,\n unlinkSync,\n} from 'fs';\nimport { join } from 'path';\nimport { Node, Project } from 'ts-morph';\nimport { PATH_PROPERTY } from '../constants';\nimport { getFolderPath } from '../helpers';\n\nconst _lift = (root: string) => {\n const folderPath = getFolderPath(root);\n if (!existsSync(folderPath)) {\n console.warn(`Folder not found: ${folderPath}`);\n return false;\n }\n\n const tsconfigPath = join(process.cwd(), 'tsconfig.json');\n const project = existsSync(tsconfigPath)\n ? new Project({ tsConfigFilePath: tsconfigPath })\n : new Project();\n\n // Add all source files recursively\n project.addSourceFilesAtPaths(join(folderPath, '**/*.ts'));\n project.addSourceFilesAtPaths(join(folderPath, '**/*.tsx'));\n\n const isInsideFolder = (filePath: string) => {\n return filePath.startsWith(folderPath);\n };\n\n let changed = true;\n while (changed) {\n changed = false;\n\n // A: Declarations inside the target folder\n const declarations = project\n .getSourceFiles()\n .filter(sf => isInsideFolder(sf.getFilePath()))\n .flatMap(sf => [\n ...sf.getTypeAliases(),\n ...sf.getInterfaces(),\n ...sf.getVariableDeclarations(),\n ...sf.getFunctions(),\n ...sf.getClasses(),\n ...sf.getEnums(),\n ]);\n\n for (const decl of declarations) {\n if (decl.wasForgotten()) continue;\n\n const nameNode = decl.getNameNode();\n if (!nameNode || !Node.isIdentifier(nameNode)) continue;\n\n const referencedSymbols = nameNode.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (ref.getNode() !== nameNode) {\n refCount++;\n }\n }\n }\n\n if (refCount === 0) {\n decl.remove();\n changed = true;\n break;\n }\n }\n\n if (changed) continue;\n\n // B: Imports inside the target folder\n const importDeclarations = project\n .getSourceFiles()\n .filter(sf => isInsideFolder(sf.getFilePath()))\n .flatMap(sf => sf.getImportDeclarations());\n\n for (const imp of importDeclarations) {\n if (imp.wasForgotten()) continue;\n const sf = imp.getSourceFile();\n\n // 1. Named imports\n const namedImports = imp.getNamedImports();\n for (const spec of namedImports) {\n if (spec.wasForgotten()) continue;\n const nameNode = spec.getNameNode();\n if (!Node.isIdentifier(nameNode)) continue;\n\n const referencedSymbols = nameNode.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== nameNode\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n spec.remove();\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 2. Default import\n const defaultImport = imp.getDefaultImport();\n if (\n defaultImport &&\n !defaultImport.wasForgotten() &&\n Node.isIdentifier(defaultImport)\n ) {\n const referencedSymbols = defaultImport.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== defaultImport\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n const hasNamed = imp.getNamedImports().length > 0;\n const hasNamespace = !!imp.getNamespaceImport();\n if (!hasNamed && !hasNamespace) {\n imp.remove();\n } else {\n imp.removeDefaultImport();\n }\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 3. Namespace import\n const namespaceImport = imp.getNamespaceImport();\n if (\n namespaceImport &&\n !namespaceImport.wasForgotten() &&\n Node.isIdentifier(namespaceImport)\n ) {\n const referencedSymbols = namespaceImport.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== namespaceImport\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n imp.remove();\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 4. Empty import declarations\n const hasNamed = imp.getNamedImports().length > 0;\n const hasDefault = !!imp.getDefaultImport();\n const hasNamespace = !!imp.getNamespaceImport();\n if (!hasNamed && !hasDefault && !hasNamespace) {\n imp.remove();\n changed = true;\n break;\n }\n }\n }\n\n // Save changes\n project.saveSync();\n\n // Delete files that are empty (after trimming whitespace) and inside the target folder\n const sourceFiles = project.getSourceFiles();\n for (const sf of sourceFiles) {\n const filePath = sf.getFilePath();\n if (isInsideFolder(filePath) && sf.getFullText().trim() === '') {\n project.removeSourceFile(sf);\n if (existsSync(filePath)) {\n unlinkSync(filePath);\n }\n }\n }\n\n // Helper to recursively clean empty directories\n const cleanEmptyDirs = (dir: string) => {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return;\n\n const files = readdirSync(dir);\n for (const file of files) {\n const fullPath = join(dir, file);\n if (statSync(fullPath).isDirectory()) {\n cleanEmptyDirs(fullPath);\n }\n }\n\n const remaining = readdirSync(dir);\n if (remaining.length === 0) {\n rmdirSync(dir);\n }\n };\n\n cleanEmptyDirs(folderPath);\n\n return true;\n};\n\n/**\n *\n * @param jsonConfigPath\n * @returns\n */\nexport const lift = (jsonConfigPath: string) => {\n const json = join(process.cwd(), jsonConfigPath);\n const file = edit(json);\n const root = file.get(PATH_PROPERTY);\n\n if (!root || typeof root !== 'string') {\n throw new Error('Root path not found in codebase configuration.');\n }\n\n return _lift(root);\n};\n"],"mappings":"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"}
|
package/lib/functions/lift.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lift.d.ts","sourceRoot":"","sources":["../../src/functions/lift.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lift.d.ts","sourceRoot":"","sources":["../../src/functions/lift.ts"],"names":[],"mappings":"AA8NA;;;;GAIG;AACH,eAAO,MAAM,IAAI,GAAI,gBAAgB,MAAM,YAU1C,CAAC"}
|
package/lib/functions/lift.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { PATH_PROPERTY } from "../constants.js";
|
|
1
2
|
import { getFolderPath } from "../helpers.js";
|
|
2
3
|
import { join } from "path";
|
|
3
4
|
import { Node, Project } from "ts-morph";
|
|
4
5
|
import { existsSync, readdirSync, rmdirSync, statSync, unlinkSync } from "fs";
|
|
6
|
+
import edit from "edit-json-file";
|
|
5
7
|
//#region src/functions/lift.ts
|
|
6
|
-
const
|
|
8
|
+
const _lift = (root) => {
|
|
7
9
|
const folderPath = getFolderPath(root);
|
|
8
10
|
if (!existsSync(folderPath)) {
|
|
9
11
|
console.warn(`Folder not found: ${folderPath}`);
|
|
@@ -118,6 +120,16 @@ const lift = (root) => {
|
|
|
118
120
|
cleanEmptyDirs(folderPath);
|
|
119
121
|
return true;
|
|
120
122
|
};
|
|
123
|
+
/**
|
|
124
|
+
*
|
|
125
|
+
* @param jsonConfigPath
|
|
126
|
+
* @returns
|
|
127
|
+
*/
|
|
128
|
+
const lift = (jsonConfigPath) => {
|
|
129
|
+
const root = edit(join(process.cwd(), jsonConfigPath)).get(PATH_PROPERTY);
|
|
130
|
+
if (!root || typeof root !== "string") throw new Error("Root path not found in codebase configuration.");
|
|
131
|
+
return _lift(root);
|
|
132
|
+
};
|
|
121
133
|
//#endregion
|
|
122
134
|
export { lift };
|
|
123
135
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lift.js","names":[],"sources":["../../src/functions/lift.ts"],"sourcesContent":["import {\n existsSync,\n readdirSync,\n rmdirSync,\n statSync,\n unlinkSync,\n} from 'fs';\nimport { join } from 'path';\nimport { Project, Node } from 'ts-morph';\nimport { getFolderPath } from '../helpers';\n\nexport const lift = (root: string) => {\n const folderPath = getFolderPath(root);\n if (!existsSync(folderPath)) {\n console.warn(`Folder not found: ${folderPath}`);\n return false;\n }\n\n const tsconfigPath = join(process.cwd(), 'tsconfig.json');\n const project = existsSync(tsconfigPath)\n ? new Project({ tsConfigFilePath: tsconfigPath })\n : new Project();\n\n // Add all source files recursively\n project.addSourceFilesAtPaths(join(folderPath, '**/*.ts'));\n project.addSourceFilesAtPaths(join(folderPath, '**/*.tsx'));\n\n const isInsideFolder = (filePath: string) => {\n return filePath.startsWith(folderPath);\n };\n\n let changed = true;\n while (changed) {\n changed = false;\n\n // A: Declarations inside the target folder\n const declarations = project\n .getSourceFiles()\n .filter(sf => isInsideFolder(sf.getFilePath()))\n .flatMap(sf => [\n ...sf.getTypeAliases(),\n ...sf.getInterfaces(),\n ...sf.getVariableDeclarations(),\n ...sf.getFunctions(),\n ...sf.getClasses(),\n ...sf.getEnums(),\n ]);\n\n for (const decl of declarations) {\n if (decl.wasForgotten()) continue;\n\n const nameNode = decl.getNameNode();\n if (!nameNode || !Node.isIdentifier(nameNode)) continue;\n\n const referencedSymbols = nameNode.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (ref.getNode() !== nameNode) {\n refCount++;\n }\n }\n }\n\n if (refCount === 0) {\n decl.remove();\n changed = true;\n break;\n }\n }\n\n if (changed) continue;\n\n // B: Imports inside the target folder\n const importDeclarations = project\n .getSourceFiles()\n .filter(sf => isInsideFolder(sf.getFilePath()))\n .flatMap(sf => sf.getImportDeclarations());\n\n for (const imp of importDeclarations) {\n if (imp.wasForgotten()) continue;\n const sf = imp.getSourceFile();\n\n // 1. Named imports\n const namedImports = imp.getNamedImports();\n for (const spec of namedImports) {\n if (spec.wasForgotten()) continue;\n const nameNode = spec.getNameNode();\n if (!Node.isIdentifier(nameNode)) continue;\n\n const referencedSymbols = nameNode.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== nameNode\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n spec.remove();\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 2. Default import\n const defaultImport = imp.getDefaultImport();\n if (\n defaultImport &&\n !defaultImport.wasForgotten() &&\n Node.isIdentifier(defaultImport)\n ) {\n const referencedSymbols = defaultImport.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== defaultImport\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n const hasNamed = imp.getNamedImports().length > 0;\n const hasNamespace = !!imp.getNamespaceImport();\n if (!hasNamed && !hasNamespace) {\n imp.remove();\n } else {\n imp.removeDefaultImport();\n }\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 3. Namespace import\n const namespaceImport = imp.getNamespaceImport();\n if (\n namespaceImport &&\n !namespaceImport.wasForgotten() &&\n Node.isIdentifier(namespaceImport)\n ) {\n const referencedSymbols = namespaceImport.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== namespaceImport\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n imp.remove();\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 4. Empty import declarations\n const hasNamed = imp.getNamedImports().length > 0;\n const hasDefault = !!imp.getDefaultImport();\n const hasNamespace = !!imp.getNamespaceImport();\n if (!hasNamed && !hasDefault && !hasNamespace) {\n imp.remove();\n changed = true;\n break;\n }\n }\n }\n\n // Save changes\n project.saveSync();\n\n // Delete files that are empty (after trimming whitespace) and inside the target folder\n const sourceFiles = project.getSourceFiles();\n for (const sf of sourceFiles) {\n const filePath = sf.getFilePath();\n if (isInsideFolder(filePath) && sf.getFullText().trim() === '') {\n project.removeSourceFile(sf);\n if (existsSync(filePath)) {\n unlinkSync(filePath);\n }\n }\n }\n\n // Helper to recursively clean empty directories\n const cleanEmptyDirs = (dir: string) => {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return;\n\n const files = readdirSync(dir);\n for (const file of files) {\n const fullPath = join(dir, file);\n if (statSync(fullPath).isDirectory()) {\n cleanEmptyDirs(fullPath);\n }\n }\n\n const remaining = readdirSync(dir);\n if (remaining.length === 0) {\n rmdirSync(dir);\n }\n };\n\n cleanEmptyDirs(folderPath);\n\n return true;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lift.js","names":[],"sources":["../../src/functions/lift.ts"],"sourcesContent":["import edit from 'edit-json-file';\nimport {\n existsSync,\n readdirSync,\n rmdirSync,\n statSync,\n unlinkSync,\n} from 'fs';\nimport { join } from 'path';\nimport { Node, Project } from 'ts-morph';\nimport { PATH_PROPERTY } from '../constants';\nimport { getFolderPath } from '../helpers';\n\nconst _lift = (root: string) => {\n const folderPath = getFolderPath(root);\n if (!existsSync(folderPath)) {\n console.warn(`Folder not found: ${folderPath}`);\n return false;\n }\n\n const tsconfigPath = join(process.cwd(), 'tsconfig.json');\n const project = existsSync(tsconfigPath)\n ? new Project({ tsConfigFilePath: tsconfigPath })\n : new Project();\n\n // Add all source files recursively\n project.addSourceFilesAtPaths(join(folderPath, '**/*.ts'));\n project.addSourceFilesAtPaths(join(folderPath, '**/*.tsx'));\n\n const isInsideFolder = (filePath: string) => {\n return filePath.startsWith(folderPath);\n };\n\n let changed = true;\n while (changed) {\n changed = false;\n\n // A: Declarations inside the target folder\n const declarations = project\n .getSourceFiles()\n .filter(sf => isInsideFolder(sf.getFilePath()))\n .flatMap(sf => [\n ...sf.getTypeAliases(),\n ...sf.getInterfaces(),\n ...sf.getVariableDeclarations(),\n ...sf.getFunctions(),\n ...sf.getClasses(),\n ...sf.getEnums(),\n ]);\n\n for (const decl of declarations) {\n if (decl.wasForgotten()) continue;\n\n const nameNode = decl.getNameNode();\n if (!nameNode || !Node.isIdentifier(nameNode)) continue;\n\n const referencedSymbols = nameNode.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (ref.getNode() !== nameNode) {\n refCount++;\n }\n }\n }\n\n if (refCount === 0) {\n decl.remove();\n changed = true;\n break;\n }\n }\n\n if (changed) continue;\n\n // B: Imports inside the target folder\n const importDeclarations = project\n .getSourceFiles()\n .filter(sf => isInsideFolder(sf.getFilePath()))\n .flatMap(sf => sf.getImportDeclarations());\n\n for (const imp of importDeclarations) {\n if (imp.wasForgotten()) continue;\n const sf = imp.getSourceFile();\n\n // 1. Named imports\n const namedImports = imp.getNamedImports();\n for (const spec of namedImports) {\n if (spec.wasForgotten()) continue;\n const nameNode = spec.getNameNode();\n if (!Node.isIdentifier(nameNode)) continue;\n\n const referencedSymbols = nameNode.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== nameNode\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n spec.remove();\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 2. Default import\n const defaultImport = imp.getDefaultImport();\n if (\n defaultImport &&\n !defaultImport.wasForgotten() &&\n Node.isIdentifier(defaultImport)\n ) {\n const referencedSymbols = defaultImport.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== defaultImport\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n const hasNamed = imp.getNamedImports().length > 0;\n const hasNamespace = !!imp.getNamespaceImport();\n if (!hasNamed && !hasNamespace) {\n imp.remove();\n } else {\n imp.removeDefaultImport();\n }\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 3. Namespace import\n const namespaceImport = imp.getNamespaceImport();\n if (\n namespaceImport &&\n !namespaceImport.wasForgotten() &&\n Node.isIdentifier(namespaceImport)\n ) {\n const referencedSymbols = namespaceImport.findReferences();\n let refCount = 0;\n for (const refSymbol of referencedSymbols) {\n for (const ref of refSymbol.getReferences()) {\n if (\n ref.getSourceFile() === sf &&\n ref.getNode() !== namespaceImport\n ) {\n refCount++;\n }\n }\n }\n if (refCount === 0) {\n imp.remove();\n changed = true;\n break;\n }\n }\n if (changed) break;\n\n // 4. Empty import declarations\n const hasNamed = imp.getNamedImports().length > 0;\n const hasDefault = !!imp.getDefaultImport();\n const hasNamespace = !!imp.getNamespaceImport();\n if (!hasNamed && !hasDefault && !hasNamespace) {\n imp.remove();\n changed = true;\n break;\n }\n }\n }\n\n // Save changes\n project.saveSync();\n\n // Delete files that are empty (after trimming whitespace) and inside the target folder\n const sourceFiles = project.getSourceFiles();\n for (const sf of sourceFiles) {\n const filePath = sf.getFilePath();\n if (isInsideFolder(filePath) && sf.getFullText().trim() === '') {\n project.removeSourceFile(sf);\n if (existsSync(filePath)) {\n unlinkSync(filePath);\n }\n }\n }\n\n // Helper to recursively clean empty directories\n const cleanEmptyDirs = (dir: string) => {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return;\n\n const files = readdirSync(dir);\n for (const file of files) {\n const fullPath = join(dir, file);\n if (statSync(fullPath).isDirectory()) {\n cleanEmptyDirs(fullPath);\n }\n }\n\n const remaining = readdirSync(dir);\n if (remaining.length === 0) {\n rmdirSync(dir);\n }\n };\n\n cleanEmptyDirs(folderPath);\n\n return true;\n};\n\n/**\n *\n * @param jsonConfigPath\n * @returns\n */\nexport const lift = (jsonConfigPath: string) => {\n const json = join(process.cwd(), jsonConfigPath);\n const file = edit(json);\n const root = file.get(PATH_PROPERTY);\n\n if (!root || typeof root !== 'string') {\n throw new Error('Root path not found in codebase configuration.');\n }\n\n return _lift(root);\n};\n"],"mappings":"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"}
|
package/lib/functions/remove.cjs
CHANGED
|
@@ -20,7 +20,7 @@ const transformModules = (entries, ...files) => {
|
|
|
20
20
|
relativePath,
|
|
21
21
|
moduleSpecifier
|
|
22
22
|
});
|
|
23
|
-
}).map((_path) => [_path, `${_path}
|
|
23
|
+
}).map((_path) => [_path, `${_path}/index`]).flat().filter((s) => files.includes(s));
|
|
24
24
|
return [key, Array.from(new Set(specifiers))];
|
|
25
25
|
});
|
|
26
26
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.cjs","names":["transformModule","getFolderPath","PATH_PROPERTY","FILES_PROPERTY","consoleStars","path"],"sources":["../../src/functions/remove.ts"],"sourcesContent":["import edit, { JsonEditor } from 'edit-json-file';\nimport { unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { FILES_PROPERTY, PATH_PROPERTY } from '../constants';\nimport { consoleStars, getFolderPath, transformModule } from '#helpers';\nimport { CodebaseAnalysis, FileAnalysis } from '../schemas';\n\nconst transformModules = (\n entries: [string, FileAnalysis][],\n ...files: string[]\n) => {\n const cwd = process.cwd();\n const out = entries\n .map(\n ([key, { imports, relativePath }]) =>\n [key, relativePath, imports] as const,\n )\n .map(([key, relativePath, imports]) => {\n const specifiers = imports\n .map(({ moduleSpecifier }) => {\n return transformModule({\n cwd,\n relativePath,\n moduleSpecifier,\n });\n })\n .map(_path => [_path, `${_path}
|
|
1
|
+
{"version":3,"file":"remove.cjs","names":["transformModule","getFolderPath","PATH_PROPERTY","FILES_PROPERTY","consoleStars","path"],"sources":["../../src/functions/remove.ts"],"sourcesContent":["import edit, { JsonEditor } from 'edit-json-file';\nimport { unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { FILES_PROPERTY, PATH_PROPERTY } from '../constants';\nimport { consoleStars, getFolderPath, transformModule } from '#helpers';\nimport { CodebaseAnalysis, FileAnalysis } from '../schemas';\n\nconst transformModules = (\n entries: [string, FileAnalysis][],\n ...files: string[]\n) => {\n const cwd = process.cwd();\n const out = entries\n .map(\n ([key, { imports, relativePath }]) =>\n [key, relativePath, imports] as const,\n )\n .map(([key, relativePath, imports]) => {\n const specifiers = imports\n .map(({ moduleSpecifier }) => {\n return transformModule({\n cwd,\n relativePath,\n moduleSpecifier,\n });\n })\n .map(_path => [_path, `${_path}/index`]) // Add */index variants\n .flat()\n .filter(s => files.includes(s));\n\n return [key, Array.from(new Set(specifiers))] as const;\n });\n\n return out;\n};\n\nexport const remove = (\n CODEBASE_ANALYSIS: CodebaseAnalysis,\n jsonConfigPath: string,\n ...paths: string[]\n) => {\n const isEmpty = paths.length === 0;\n if (isEmpty) return console.warn('No files specified for removal.');\n try {\n const cwd = process.cwd();\n const json = join(cwd, jsonConfigPath);\n let file: JsonEditor | undefined = edit(json);\n\n if (!file) return;\n\n const root = getFolderPath(file.get(PATH_PROPERTY) as string);\n const files = file.get(FILES_PROPERTY) as string[];\n\n const entries2 = Object.entries(CODEBASE_ANALYSIS).filter(([key]) =>\n files.includes(key),\n );\n\n const entries = entries2.filter(([key]) =>\n paths.some(p => key.startsWith(p)),\n );\n\n // Check dependencies before deletion\n const safesToRemove: string[] = [];\n const cannotsRemove: [string, string[]][] = [];\n\n entries.forEach(([key]) => {\n const modules = transformModules(entries2, ...files);\n const importedFroms = modules\n .filter(([, specifiers]) => specifiers.includes(key))\n .map(([k]) => k);\n\n const check = importedFroms.length > 0;\n\n console.log('modules', '=>', importedFroms);\n console.log('key', '=>', key);\n\n if (check) return cannotsRemove.push([key, importedFroms]);\n return safesToRemove.push(key);\n });\n\n consoleStars();\n console.log(`🔧 Deletion of files (${entries.length} files)...`);\n\n // Display files that cannot be deleted\n if (cannotsRemove.length > 0) {\n const len = cannotsRemove.length;\n const one = 'file cannot be deleted (imported in other files)';\n const many = 'files cannot be deleted (imported in other files)';\n\n console.warn(`⚠️ ${len} ${len === 1 ? one : many} :`);\n cannotsRemove.forEach(([key, modules]) => {\n console.warn(` - ⚠️ ${key} imported by:`);\n modules.forEach(m => console.warn(` -> 📌 ${m}`));\n });\n }\n\n if (safesToRemove.length === 0) {\n console.warn('❌ No files can be deleted.');\n return consoleStars();\n }\n\n const formatteds = safesToRemove.map(key => {\n const _path = CODEBASE_ANALYSIS[key].relativePath;\n const absolute = join(root, _path);\n return [key, absolute] as const;\n });\n\n console.log(`🗑️ Deleting files (${safesToRemove.length} files)...`);\n\n let success = 0;\n const length = formatteds.length;\n\n formatteds.forEach(([key, path]) => {\n try {\n unlinkSync(path);\n console.log(` - 🗑️ ${key}`);\n file?.set(\n FILES_PROPERTY,\n files.filter(key1 => key1 !== key),\n );\n success++;\n } catch {\n console.error(` - ❌ Error, ${key} :`);\n }\n });\n\n file.save();\n console.log(`🗑️ Files deleted! (${success}/${length})`);\n file = undefined;\n } catch {\n console.error(`❌ Error while deleting files`);\n consoleStars();\n return false;\n }\n consoleStars();\n return true;\n};\n"],"mappings":"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"}
|
package/lib/functions/remove.js
CHANGED
|
@@ -17,7 +17,7 @@ const transformModules = (entries, ...files) => {
|
|
|
17
17
|
relativePath,
|
|
18
18
|
moduleSpecifier
|
|
19
19
|
});
|
|
20
|
-
}).map((_path) => [_path, `${_path}
|
|
20
|
+
}).map((_path) => [_path, `${_path}/index`]).flat().filter((s) => files.includes(s));
|
|
21
21
|
return [key, Array.from(new Set(specifiers))];
|
|
22
22
|
});
|
|
23
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.js","names":[],"sources":["../../src/functions/remove.ts"],"sourcesContent":["import edit, { JsonEditor } from 'edit-json-file';\nimport { unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { FILES_PROPERTY, PATH_PROPERTY } from '../constants';\nimport { consoleStars, getFolderPath, transformModule } from '#helpers';\nimport { CodebaseAnalysis, FileAnalysis } from '../schemas';\n\nconst transformModules = (\n entries: [string, FileAnalysis][],\n ...files: string[]\n) => {\n const cwd = process.cwd();\n const out = entries\n .map(\n ([key, { imports, relativePath }]) =>\n [key, relativePath, imports] as const,\n )\n .map(([key, relativePath, imports]) => {\n const specifiers = imports\n .map(({ moduleSpecifier }) => {\n return transformModule({\n cwd,\n relativePath,\n moduleSpecifier,\n });\n })\n .map(_path => [_path, `${_path}
|
|
1
|
+
{"version":3,"file":"remove.js","names":[],"sources":["../../src/functions/remove.ts"],"sourcesContent":["import edit, { JsonEditor } from 'edit-json-file';\nimport { unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { FILES_PROPERTY, PATH_PROPERTY } from '../constants';\nimport { consoleStars, getFolderPath, transformModule } from '#helpers';\nimport { CodebaseAnalysis, FileAnalysis } from '../schemas';\n\nconst transformModules = (\n entries: [string, FileAnalysis][],\n ...files: string[]\n) => {\n const cwd = process.cwd();\n const out = entries\n .map(\n ([key, { imports, relativePath }]) =>\n [key, relativePath, imports] as const,\n )\n .map(([key, relativePath, imports]) => {\n const specifiers = imports\n .map(({ moduleSpecifier }) => {\n return transformModule({\n cwd,\n relativePath,\n moduleSpecifier,\n });\n })\n .map(_path => [_path, `${_path}/index`]) // Add */index variants\n .flat()\n .filter(s => files.includes(s));\n\n return [key, Array.from(new Set(specifiers))] as const;\n });\n\n return out;\n};\n\nexport const remove = (\n CODEBASE_ANALYSIS: CodebaseAnalysis,\n jsonConfigPath: string,\n ...paths: string[]\n) => {\n const isEmpty = paths.length === 0;\n if (isEmpty) return console.warn('No files specified for removal.');\n try {\n const cwd = process.cwd();\n const json = join(cwd, jsonConfigPath);\n let file: JsonEditor | undefined = edit(json);\n\n if (!file) return;\n\n const root = getFolderPath(file.get(PATH_PROPERTY) as string);\n const files = file.get(FILES_PROPERTY) as string[];\n\n const entries2 = Object.entries(CODEBASE_ANALYSIS).filter(([key]) =>\n files.includes(key),\n );\n\n const entries = entries2.filter(([key]) =>\n paths.some(p => key.startsWith(p)),\n );\n\n // Check dependencies before deletion\n const safesToRemove: string[] = [];\n const cannotsRemove: [string, string[]][] = [];\n\n entries.forEach(([key]) => {\n const modules = transformModules(entries2, ...files);\n const importedFroms = modules\n .filter(([, specifiers]) => specifiers.includes(key))\n .map(([k]) => k);\n\n const check = importedFroms.length > 0;\n\n console.log('modules', '=>', importedFroms);\n console.log('key', '=>', key);\n\n if (check) return cannotsRemove.push([key, importedFroms]);\n return safesToRemove.push(key);\n });\n\n consoleStars();\n console.log(`🔧 Deletion of files (${entries.length} files)...`);\n\n // Display files that cannot be deleted\n if (cannotsRemove.length > 0) {\n const len = cannotsRemove.length;\n const one = 'file cannot be deleted (imported in other files)';\n const many = 'files cannot be deleted (imported in other files)';\n\n console.warn(`⚠️ ${len} ${len === 1 ? one : many} :`);\n cannotsRemove.forEach(([key, modules]) => {\n console.warn(` - ⚠️ ${key} imported by:`);\n modules.forEach(m => console.warn(` -> 📌 ${m}`));\n });\n }\n\n if (safesToRemove.length === 0) {\n console.warn('❌ No files can be deleted.');\n return consoleStars();\n }\n\n const formatteds = safesToRemove.map(key => {\n const _path = CODEBASE_ANALYSIS[key].relativePath;\n const absolute = join(root, _path);\n return [key, absolute] as const;\n });\n\n console.log(`🗑️ Deleting files (${safesToRemove.length} files)...`);\n\n let success = 0;\n const length = formatteds.length;\n\n formatteds.forEach(([key, path]) => {\n try {\n unlinkSync(path);\n console.log(` - 🗑️ ${key}`);\n file?.set(\n FILES_PROPERTY,\n files.filter(key1 => key1 !== key),\n );\n success++;\n } catch {\n console.error(` - ❌ Error, ${key} :`);\n }\n });\n\n file.save();\n console.log(`🗑️ Files deleted! (${success}/${length})`);\n file = undefined;\n } catch {\n console.error(`❌ Error while deleting files`);\n consoleStars();\n return false;\n }\n consoleStars();\n return true;\n};\n"],"mappings":"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"}
|