-
Notifications
You must be signed in to change notification settings - Fork 39
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(workspace-builders): create a script to extract deprecated items
feat: split workspace helpers and build helpers
- Loading branch information
Showing
21 changed files
with
282 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
/* eslint-disable @typescript-eslint/naming-convention */ | ||
/* eslint-disable quote-props */ | ||
|
||
module.exports = { | ||
'root': true, | ||
'parserOptions': { | ||
'tsconfigRootDir': __dirname, | ||
'sourceType': 'module', | ||
'project': [ | ||
'tsconfig.eslint.json' | ||
], | ||
}, | ||
'extends': [ | ||
'../../../.eslintrc.js' | ||
] | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
/index.* | ||
.tsbuildinfo |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
{ | ||
"name": "@o3r/workspace-helpers", | ||
"version": "0.0.0-placeholder", | ||
"description": "Build helpers", | ||
"type": "module", | ||
"private": true, | ||
"keywords": [ | ||
"otter", | ||
"amadeus", | ||
"typescript" | ||
], | ||
"files": [ | ||
"scripts/*.mjs" | ||
], | ||
"bin": { | ||
"create-monorepo-scope": "./scripts/create-monorepo-scope.mjs", | ||
"doc-links": "./scripts/doc-links.mjs", | ||
"pr-labels": "./scripts/pr-labels.mjs", | ||
"prepare-doc-root-menu-template": "./scripts/prepare-doc-root-menu-template.mjs", | ||
"report-deprecates": "./scripts/report-deprecates.mjs", | ||
"update-doc-summary": "./scripts/update-doc-summary.mjs" | ||
}, | ||
"dependencies": { | ||
"globby": "^14.0.0", | ||
"minimist": "^1.2.6" | ||
}, | ||
"peerDependencies": { | ||
"typescript": "~5.5.4" | ||
}, | ||
"devDependencies": { | ||
"@angular-eslint/eslint-plugin": "~18.3.0", | ||
"@nx/eslint-plugin": "~19.5.0", | ||
"@o3r/eslint-plugin": "workspace:^", | ||
"@stylistic/eslint-plugin-ts": "~2.4.0", | ||
"@types/node": "^20.0.0", | ||
"@typescript-eslint/eslint-plugin": "^7.14.1", | ||
"@typescript-eslint/parser": "^7.14.1", | ||
"@typescript-eslint/utils": "^7.14.1", | ||
"eslint": "^8.57.0", | ||
"eslint-import-resolver-node": "^0.3.9", | ||
"eslint-plugin-jest": "~28.8.0", | ||
"eslint-plugin-jsdoc": "~48.11.0", | ||
"eslint-plugin-prefer-arrow": "~1.2.3", | ||
"eslint-plugin-unicorn": "^54.0.0", | ||
"nx": "~19.5.0", | ||
"typescript": "~5.5.4" | ||
}, | ||
"otter": { | ||
"versionHarmonize": { | ||
"ignore": [ | ||
"globby" | ||
] | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"name": "workspace-helpers", | ||
"$schema": "https://raw.githubusercontent.com/nrwl/nx/master/packages/nx/schemas/project-schema.json", | ||
"projectType": "library", | ||
"sourceRoot": "packages/@o3r/workspace-helpers/scripts", | ||
"tags": [] | ||
} |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
146 changes: 146 additions & 0 deletions
146
tools/@o3r/workspace-helpers/scripts/report-deprecates.mjs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
/* | ||
* The purpose of this script is to generate a report of the deprecated items in the repository code | ||
* @param root Root folder from which executing the script | ||
* @param output Path the outputted JSON file | ||
* @param ignore List of ignore file patterns (comma separated) | ||
* @param versionPattern RegExp to find the version in the deprecated message | ||
*/ | ||
|
||
import { readFile, writeFile } from 'node:fs/promises'; | ||
import { globby as glob } from 'globby'; | ||
import { resolve, relative } from 'node:path'; | ||
import minimist from 'minimist'; | ||
import { createSourceFile, ScriptTarget, isJSDoc, isIdentifier } from 'typescript'; | ||
|
||
const argv = minimist(process.argv.slice(2)); | ||
const root = argv.root ? resolve(process.cwd(), argv.root) : process.cwd(); | ||
const output = resolve(process.cwd(), argv.output || argv.o || 'deprecate-report.json'); | ||
const ignore = argv.ignore ? argv.ignore.split(',') : [ | ||
'**/dist/**' | ||
]; | ||
const versionPattern = argv.versionPattern ? new RegExp(argv.versionPattern) : /[vV]([0-9]+(?:[.][0-9]+)?)/; | ||
|
||
/** | ||
* Work through the TS Node to find the deprecated node | ||
* @param {import("typescript").SourceFile} sourceFile | ||
* @param {import("typescript").Node} node | ||
* @returns {import("typescript").Node} | ||
*/ | ||
const workThroughTypescript = (sourceFile, node, index) => { | ||
const children = node.getChildren(sourceFile) | ||
.filter((n) => !isJSDoc(n) && n.getStart(sourceFile, true) <= index && n.getEnd() > index) | ||
|
||
return children.reduce((acc, n) => workThroughTypescript(sourceFile, n, index) || acc, node) | ||
}; | ||
|
||
/** Get deprecated items in TS files */ | ||
const getTypescriptDeprecations = async () => { | ||
const deprecateRegExp = /@deprecated/g; | ||
const deprecateLineRegExp = /@deprecated(.*)$/mg; | ||
const files = await glob('**/*.{c,m,}ts', {cwd: root, ignore}); | ||
const reports = []; | ||
for (let file of files) { | ||
file = resolve(root, file); | ||
const content = await readFile(file, { encoding: 'utf8' }); | ||
const match = [...content.matchAll(deprecateRegExp)]; | ||
if (!match.length) { | ||
continue; | ||
} | ||
|
||
const sourceFile = createSourceFile( | ||
file, | ||
content, | ||
ScriptTarget.ES2022, | ||
true | ||
); | ||
reports.push(...match | ||
.map(({ index }) => workThroughTypescript(sourceFile, sourceFile, index)) | ||
.map((node) => { | ||
const deprecationInfo = [ | ||
...node | ||
.getFullText(sourceFile) | ||
.matchAll(deprecateLineRegExp) | ||
].map(([, description]) => description.trim()).join('\n') | ||
return { | ||
file, | ||
report: { | ||
node: typeof node.name !== 'undefined' && isIdentifier(node.name) | ||
? node.name.getText() | ||
: node.getText(sourceFile), | ||
deprecationInfo, | ||
version: deprecationInfo.match(versionPattern)?.[1] | ||
} | ||
}; | ||
}) | ||
); | ||
} | ||
return reports; | ||
}; | ||
|
||
/** | ||
* Work through the JSON fields do find the deprecated item | ||
* @param {Object} json | ||
* @param {RegExp} nodeNameToDetect | ||
*/ | ||
const workThroughJson = (json, nodeNameToDetect) => { | ||
const memory = []; | ||
const rec = (node, ancestors, mem) => { | ||
if (Array.isArray(node)) { | ||
return node.reduce((acc, n) => rec(n, ancestors, acc), mem); | ||
} else if (node === null || typeof node !== 'object') { | ||
return mem; | ||
} | ||
|
||
const entries = Object.entries(node); | ||
entries | ||
.map(([key]) => key) | ||
.filter((key) => nodeNameToDetect.test(key)) | ||
.forEach((key) => { | ||
const deprecationInfo = node[key]; | ||
mem.push({ | ||
node: ancestors, | ||
deprecationInfo, | ||
version: deprecationInfo.match(versionPattern)?.[1] | ||
}); | ||
}); | ||
|
||
return entries.reduce((acc, [key, value]) => rec(value, `${ancestors}.${key}`, acc), mem); | ||
} | ||
|
||
return rec(json, '', memory); | ||
} | ||
|
||
/** Get deprecated items in JSON files */ | ||
const getJsonDeprecations = async () => { | ||
const deprecateNodeRegExp = /"[$]?deprecated"/; | ||
const files = await glob('**/*.json', { cwd: root, ignore }); | ||
const contents = await Promise.all(files | ||
.map((file) => resolve(root, file)) | ||
.map(async (file) => ({ file, content: await readFile(file, { encoding: 'utf8' }) })) | ||
); | ||
|
||
return contents | ||
.filter(({ content }) => !!content.match(deprecateNodeRegExp)) | ||
.map(({ file, content }) => ({ | ||
file, | ||
content: JSON.parse(content) | ||
})) | ||
.map(({ file, content }) => ({ | ||
file, | ||
report: workThroughJson(content, deprecateNodeRegExp) | ||
})) | ||
.filter(({report}) => !!report.length); | ||
}; | ||
|
||
// Executed at CLI call | ||
void (async() => { | ||
const displayReport = (await Promise.all([ | ||
getJsonDeprecations(), | ||
getTypescriptDeprecations() | ||
])).flat().reduce((acc, {file, report}) => { | ||
(acc[relative(root, file)] ||= []).push(report); | ||
return acc; | ||
},{}); | ||
|
||
writeFile(output, JSON.stringify(displayReport, null, 2)); | ||
})(); |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
{ | ||
"extends": "../../../tsconfig.build.json", | ||
"compilerOptions": { | ||
"allowJs": true | ||
}, | ||
"include": [ | ||
"./scripts/*.mjs" | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters