Compare commits
8 Commits
feature/re
...
v0.2.0
Author | SHA1 | Date | |
---|---|---|---|
9660d77e0c | |||
dce76a5fb3 | |||
23e6248299 | |||
d8fb82943f | |||
2942e15fcf | |||
1d94b33542 | |||
08d58b2d41 | |||
19f7be1e3d |
36
.github/workflows/CreateRelease.yml
vendored
36
.github/workflows/CreateRelease.yml
vendored
@@ -4,6 +4,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- 'dev/*'
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
workflow_dispatch: # Allows manual execution of the workflow.
|
workflow_dispatch: # Allows manual execution of the workflow.
|
||||||
@@ -22,14 +23,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: '20.8.0'
|
node-version: '20.8.0'
|
||||||
|
|
||||||
- name: Install Dependencies
|
- name: Install dependencies, run tests and build
|
||||||
run: npm install
|
run: npm run prepare:deploy
|
||||||
|
|
||||||
- name: Run Tests
|
|
||||||
run: npm run test:verbose
|
|
||||||
|
|
||||||
- name: Build the Project
|
|
||||||
run: npm run build:tsc
|
|
||||||
|
|
||||||
- name: Get the version
|
- name: Get the version
|
||||||
id: get_version
|
id: get_version
|
||||||
@@ -77,8 +72,9 @@ jobs:
|
|||||||
echo "Generating release notes from ${{ env.PREVIOUS_TAG }} to HEAD..."
|
echo "Generating release notes from ${{ env.PREVIOUS_TAG }} to HEAD..."
|
||||||
repo_url=$(git config --get remote.origin.url)
|
repo_url=$(git config --get remote.origin.url)
|
||||||
notes=$(git log ${{ env.PREVIOUS_TAG }}..HEAD --pretty=format:"- [\`%h\`]($repo_url/commit/%H): %s%n")
|
notes=$(git log ${{ env.PREVIOUS_TAG }}..HEAD --pretty=format:"- [\`%h\`]($repo_url/commit/%H): %s%n")
|
||||||
echo "Release notes:"
|
echo "See [CHANGELOG.md](./CHANGELOG.md) for more details."
|
||||||
echo "$notes"
|
echo "$notes"
|
||||||
|
echo ""
|
||||||
echo "### Changes in this release" > release_notes.md
|
echo "### Changes in this release" > release_notes.md
|
||||||
echo "$notes" >> release_notes.md
|
echo "$notes" >> release_notes.md
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -90,17 +86,6 @@ jobs:
|
|||||||
git config --local user.email "actions@github.com"
|
git config --local user.email "actions@github.com"
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
# - name: Create temporary branch
|
|
||||||
# id: create_temp_branch
|
|
||||||
# if: steps.check_version.outputs.skip_release == 'false'
|
|
||||||
# run: |
|
|
||||||
# git checkout --orphan release/v${{ env.VERSION }}
|
|
||||||
# git reset
|
|
||||||
# rm -f .gitignore
|
|
||||||
# git add README.md package.json LICENSE dist/ src/ tsconfig.json
|
|
||||||
# git commit -m "Prepare files for release ${{ env.VERSION }}"
|
|
||||||
# shell: bash
|
|
||||||
|
|
||||||
- name: Create and push tag
|
- name: Create and push tag
|
||||||
id: create_tag
|
id: create_tag
|
||||||
if: steps.check_version.outputs.skip_release == 'false'
|
if: steps.check_version.outputs.skip_release == 'false'
|
||||||
@@ -111,6 +96,15 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
|
- name: Set Release Prerelease Flag
|
||||||
|
id: set_prerelease_flag
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
|
||||||
|
echo "PRE_RELEASE=false" >> $GITHUB_ENV
|
||||||
|
elif [[ "${{ github.ref }}" == refs/heads/dev/* ]]; then
|
||||||
|
echo "PRE_RELEASE=true" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
if: steps.check_version.outputs.skip_release == 'false'
|
if: steps.check_version.outputs.skip_release == 'false'
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
@@ -118,6 +112,6 @@ jobs:
|
|||||||
tag_name: ${{ env.VERSION }}
|
tag_name: ${{ env.VERSION }}
|
||||||
name: Release ${{ env.VERSION }}
|
name: Release ${{ env.VERSION }}
|
||||||
body_path: release_notes.md
|
body_path: release_notes.md
|
||||||
prerelease: true
|
prerelease: ${{ env.PRE_RELEASE }}
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
2
.github/workflows/ValidateBranchName.yml
vendored
2
.github/workflows/ValidateBranchName.yml
vendored
@@ -3,7 +3,7 @@ name: Validate Branch Name on Pull Request
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- UNDEFINED
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate-branch-name-on-pull-request:
|
validate-branch-name-on-pull-request:
|
||||||
|
25
CHANGELOG.md
25
CHANGELOG.md
@@ -22,6 +22,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Security
|
### Security
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.0]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add pre release building to release workflow on dev/* branches an version changes.
|
||||||
|
- feat: Introduced a new CLI command `tsinjex-generate` to automate the generation of import statements for registered dependencies.
|
||||||
|
The command scans `.ts` files for `@Register` and `@RegisterInstance` decorators and generates an `auto-imports.ts` file.
|
||||||
|
This ensures that all registered dependencies are automatically included without requiring manual imports.
|
||||||
|
The CLI can be executed via `npx tsinjex-generate` or added as a script in `package.json` for easier integration.
|
||||||
|
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
## [0.0.14]
|
## [0.0.14]
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@@ -53,4 +75,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
---
|
---
|
||||||
|
|
||||||
[unreleased]: https://github.com/PxaMMaxP/TSinjex/compare/0.0.14...HEAD
|
[unreleased]: https://github.com/PxaMMaxP/TSinjex/compare/0.0.14...HEAD
|
||||||
[0.0.14]: https://github.com/PxaMMaxP/TSinjex/compare/0.0.13...v0.0.14
|
[0.0.14]: https://github.com/PxaMMaxP/TSinjex/compare/0.0.13...v0.0.14
|
||||||
|
[0.2.00]: https://github.com/PxaMMaxP/TSinjex/compare/0.0.14...v0.2.0
|
111
bin/generate-imports.cjs
Normal file
111
bin/generate-imports.cjs
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const yargs = require('yargs');
|
||||||
|
|
||||||
|
// CLI argument parsing
|
||||||
|
const argv = yargs
|
||||||
|
.option('src', {
|
||||||
|
alias: 's',
|
||||||
|
type: 'string',
|
||||||
|
description: 'Directory to search for files',
|
||||||
|
default: 'src',
|
||||||
|
})
|
||||||
|
.option('output', {
|
||||||
|
alias: 'o',
|
||||||
|
type: 'string',
|
||||||
|
description: 'Path to the output file',
|
||||||
|
default: 'src/auto-imports.ts',
|
||||||
|
})
|
||||||
|
.option('pattern', {
|
||||||
|
alias: 'p',
|
||||||
|
type: 'string',
|
||||||
|
description: 'File pattern to search for (e.g., .ts, .js)',
|
||||||
|
default: '.ts',
|
||||||
|
})
|
||||||
|
.help()
|
||||||
|
.argv;
|
||||||
|
|
||||||
|
// Fixed RegEx patterns for decorator detection
|
||||||
|
const SEARCH_PATTERNS = [
|
||||||
|
/^@Register(?:<(.+)?>)?\(\s*["']{1}(.+)?["']{1}\s*,?\s*(true|false)?\s*\)/m, // Matches @Register(...)
|
||||||
|
/^@RegisterInstance(?:<(.+)?>)?\(\s*["']{1}(.+)?["']{1}\s*,?\s*(.+)?\s*\)/m, // Matches @RegisterInstance(...)
|
||||||
|
];
|
||||||
|
|
||||||
|
const FILE_PATTERN = argv.pattern.startsWith('.') ? argv.pattern : `.${argv.pattern}`; // Ensure the pattern starts with a dot
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively searches for all files in a directory matching the specified pattern.
|
||||||
|
* @param {string} dirPath - The directory to search.
|
||||||
|
* @returns {string[]} - List of matching files.
|
||||||
|
*/
|
||||||
|
function getAllFiles(dirPath) {
|
||||||
|
let files = fs.readdirSync(dirPath);
|
||||||
|
let arrayOfFiles = [];
|
||||||
|
|
||||||
|
files.forEach((file) => {
|
||||||
|
const fullPath = path.join(dirPath, file);
|
||||||
|
if (fs.statSync(fullPath).isDirectory()) {
|
||||||
|
arrayOfFiles = arrayOfFiles.concat(getAllFiles(fullPath));
|
||||||
|
} else if (file.endsWith(FILE_PATTERN)) {
|
||||||
|
arrayOfFiles.push(fullPath);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return arrayOfFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters files that contain at least one of the specified regex patterns.
|
||||||
|
* @param {string[]} files - List of files to check.
|
||||||
|
* @returns {string[]} - Files that contain at least one of the specified patterns.
|
||||||
|
*/
|
||||||
|
function findFilesWithPattern(files) {
|
||||||
|
return files.filter((file) => {
|
||||||
|
const content = fs.readFileSync(file, 'utf8');
|
||||||
|
return SEARCH_PATTERNS.some((pattern) => pattern.test(content));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates an import file containing imports for all found files.
|
||||||
|
* @param {string[]} files - List of relevant files.
|
||||||
|
* @returns {string} - Generated import code.
|
||||||
|
*/
|
||||||
|
function generateImports(files) {
|
||||||
|
return files.map((file) => `import '${file.replace(/\\/g, '/')}';`).join('\n') + '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main function that executes the script.
|
||||||
|
*/
|
||||||
|
function main() {
|
||||||
|
try {
|
||||||
|
const srcDir = path.resolve(process.cwd(), argv.src);
|
||||||
|
const outputFile = path.resolve(process.cwd(), argv.output);
|
||||||
|
|
||||||
|
if (!fs.existsSync(srcDir)) {
|
||||||
|
console.error(`❌ Error: The directory '${srcDir}' does not exist.`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const allFiles = getAllFiles(srcDir);
|
||||||
|
const filesWithPattern = findFilesWithPattern(allFiles);
|
||||||
|
|
||||||
|
if (filesWithPattern.length === 0) {
|
||||||
|
console.log(`ℹ️ No ${FILE_PATTERN} files found matching the specified decorator patterns.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const importContent = generateImports(filesWithPattern);
|
||||||
|
fs.writeFileSync(outputFile, importContent);
|
||||||
|
|
||||||
|
console.log(`✅ Imports successfully generated: ${outputFile}`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ An error occurred:', error.message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
10
package.json
10
package.json
@@ -1,10 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "ts-injex",
|
"name": "ts-injex",
|
||||||
"version": "0.1.0",
|
"version": "0.2.0",
|
||||||
"description": "Simple boilerplate code free dependency injection system for TypeScript.",
|
"description": "Simple boilerplate code free dependency injection system for TypeScript.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
|
"bin": {
|
||||||
|
"tsinjex-generate": "./bin/generate-imports.cjs"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "npm run build",
|
"prepare": "npm run build",
|
||||||
"build": "npm run build:tsc",
|
"build": "npm run build:tsc",
|
||||||
@@ -22,7 +25,8 @@
|
|||||||
"docs:fix:coverage": "node scripts/fix-coverage-paths.cjs",
|
"docs:fix:coverage": "node scripts/fix-coverage-paths.cjs",
|
||||||
"docs:generate:badge": "node scripts/generate-badge.cjs",
|
"docs:generate:badge": "node scripts/generate-badge.cjs",
|
||||||
"docs:fix:escape": "node scripts/replace-doc-escaping.cjs",
|
"docs:fix:escape": "node scripts/replace-doc-escaping.cjs",
|
||||||
"version:show": "node -e \"console.log(require('./package.json').version)\""
|
"version:show": "node -e \"console.log(require('./package.json').version)\"",
|
||||||
|
"prepare:deploy": "npm install && npm run test:verbose && npm run build:tsc"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -59,4 +63,4 @@
|
|||||||
"LICENSE",
|
"LICENSE",
|
||||||
"package.json"
|
"package.json"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user