@cbs-consulting/generator-btp 1.0.0 → 1.0.2
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 +105 -105
- package/generators/cap/dependencies.json +1 -1
- package/generators/cap/templates/_.devcontainer/post-create.sh +15 -15
- package/generators/cap/templates/_.gitconfig.aliases +16 -16
- package/generators/cap/templates/_.gitignore +47 -47
- package/generators/cap/templates/eslint.config.mjs +1 -1
- package/generators/cap/templates/prettier.config.mjs +1 -1
- package/generators/ui5/templates/eslint.config.mjs +2 -2
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
# CAP/UI5 Foundation Generator
|
|
2
|
-
|
|
3
|
-
A Yeoman generator for creating the foundation of CAP/UI5 projects with TypeScript, ESLint, Prettier, and other essential development configurations.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
This generator sets up a solid foundation for your CAP/UI5 projects with:
|
|
8
|
-
|
|
9
|
-
- ✅ **TypeScript** - Full TypeScript configuration with strict settings
|
|
10
|
-
- ✅ **ESLint** - Code quality and linting rules optimized for TypeScript
|
|
11
|
-
- ✅ **Prettier** - Consistent code formatting
|
|
12
|
-
- ✅ **Husky** - Git hooks for pre-commit quality checks
|
|
13
|
-
- ✅ **Jest** - Testing framework with TypeScript support
|
|
14
|
-
- ✅ **GitHub Actions** - CI/CD pipeline for automated testing and building
|
|
15
|
-
- ✅ **VS Code** - Optimized settings and recommended extensions
|
|
16
|
-
- ✅ **Docker** - Container configuration for deployment (optional)
|
|
17
|
-
|
|
18
|
-
## Installation
|
|
19
|
-
|
|
20
|
-
First, install Yeoman and this generator globally:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npm install -g yo
|
|
24
|
-
npm install -g @cbs-consulting/generator-btp
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
Or install locally in your project:
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
npm install --save-dev @cbs-consulting/generator-btp
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Usage
|
|
34
|
-
|
|
35
|
-
This generator is split into two sub-generators.
|
|
36
|
-
|
|
37
|
-
1. CAP flow
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
mkdir my-cap
|
|
41
|
-
cd my-cap
|
|
42
|
-
yo @cbs-consulting/btp:cap
|
|
43
|
-
# read and execute the printed steps shown in the terminal
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
2. UI5 flow
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
mkdir my-ui5
|
|
50
|
-
cd my-ui5
|
|
51
|
-
# ensure you have a UI5 project skeleton (or after cds init)
|
|
52
|
-
yo @cbs-consulting/btp:ui5
|
|
53
|
-
# read and execute the printed steps in the terminal
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
The CAP sub-generator copies all templates from generators/app/templatesCAP into your project and merges additions from generators/app/additionsCAP into existing files. The scripting.txt is shown but not executed automatically.
|
|
57
|
-
|
|
58
|
-
## Generated Project Structure
|
|
59
|
-
|
|
60
|
-
```
|
|
61
|
-
my-project/
|
|
62
|
-
├── src/ # Source TypeScript files
|
|
63
|
-
├── tests/ # Test files (if Jest is selected)
|
|
64
|
-
├── dist/ # Compiled output (after build)
|
|
65
|
-
├── .github/workflows/ # GitHub Actions CI/CD (if selected)
|
|
66
|
-
├── .vscode/ # VS Code settings (if selected)
|
|
67
|
-
├── .eslintrc.js # ESLint configuration
|
|
68
|
-
├── .prettierrc # Prettier configuration
|
|
69
|
-
├── .gitignore # Git ignore rules
|
|
70
|
-
├── tsconfig.json # TypeScript configuration
|
|
71
|
-
├── jest.config.js # Jest configuration (if selected)
|
|
72
|
-
├── package.json # Project dependencies and scripts
|
|
73
|
-
└── README.md # Project documentation
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## Available Scripts
|
|
77
|
-
|
|
78
|
-
The generated project includes these npm scripts:
|
|
79
|
-
|
|
80
|
-
- `npm run build` - Compile TypeScript to JavaScript
|
|
81
|
-
- `npm run build:watch` - Watch mode compilation
|
|
82
|
-
- `npm run lint` - Run ESLint on your code
|
|
83
|
-
- `npm run lint:fix` - Fix auto-fixable ESLint issues
|
|
84
|
-
- `npm run format` - Format code with Prettier
|
|
85
|
-
- `npm run format:check` - Check if code is properly formatted
|
|
86
|
-
- `npm test` - Run Jest tests (if enabled)
|
|
87
|
-
- `npm run test:watch` - Run tests in watch mode
|
|
88
|
-
- `npm run test:coverage` - Generate test coverage report
|
|
89
|
-
|
|
90
|
-
## Development
|
|
91
|
-
|
|
92
|
-
To develop this generator locally:
|
|
93
|
-
|
|
94
|
-
1. Clone this repository
|
|
95
|
-
2. Install dependencies: `npm install`
|
|
96
|
-
3. Link the generator: `npm link`
|
|
97
|
-
4. Test in a new directory: `yo @cbs-consulting/btp`
|
|
98
|
-
|
|
99
|
-
## Contributing
|
|
100
|
-
|
|
101
|
-
1. Fork the repository
|
|
102
|
-
2. Create a feature branch
|
|
103
|
-
3. Make your changes
|
|
104
|
-
4. Add tests if applicable
|
|
105
|
-
5. Submit a pull request
|
|
1
|
+
# CAP/UI5 Foundation Generator
|
|
2
|
+
|
|
3
|
+
A Yeoman generator for creating the foundation of CAP/UI5 projects with TypeScript, ESLint, Prettier, and other essential development configurations.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
This generator sets up a solid foundation for your CAP/UI5 projects with:
|
|
8
|
+
|
|
9
|
+
- ✅ **TypeScript** - Full TypeScript configuration with strict settings
|
|
10
|
+
- ✅ **ESLint** - Code quality and linting rules optimized for TypeScript
|
|
11
|
+
- ✅ **Prettier** - Consistent code formatting
|
|
12
|
+
- ✅ **Husky** - Git hooks for pre-commit quality checks
|
|
13
|
+
- ✅ **Jest** - Testing framework with TypeScript support
|
|
14
|
+
- ✅ **GitHub Actions** - CI/CD pipeline for automated testing and building
|
|
15
|
+
- ✅ **VS Code** - Optimized settings and recommended extensions
|
|
16
|
+
- ✅ **Docker** - Container configuration for deployment (optional)
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
First, install Yeoman and this generator globally:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install -g yo
|
|
24
|
+
npm install -g @cbs-consulting/generator-btp
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or install locally in your project:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install --save-dev @cbs-consulting/generator-btp
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
This generator is split into two sub-generators.
|
|
36
|
+
|
|
37
|
+
1. CAP flow
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
mkdir my-cap
|
|
41
|
+
cd my-cap
|
|
42
|
+
yo @cbs-consulting/btp:cap
|
|
43
|
+
# read and execute the printed steps shown in the terminal
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
2. UI5 flow
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
mkdir my-ui5
|
|
50
|
+
cd my-ui5
|
|
51
|
+
# ensure you have a UI5 project skeleton (or after cds init)
|
|
52
|
+
yo @cbs-consulting/btp:ui5
|
|
53
|
+
# read and execute the printed steps in the terminal
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The CAP sub-generator copies all templates from generators/app/templatesCAP into your project and merges additions from generators/app/additionsCAP into existing files. The scripting.txt is shown but not executed automatically.
|
|
57
|
+
|
|
58
|
+
## Generated Project Structure
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
my-project/
|
|
62
|
+
├── src/ # Source TypeScript files
|
|
63
|
+
├── tests/ # Test files (if Jest is selected)
|
|
64
|
+
├── dist/ # Compiled output (after build)
|
|
65
|
+
├── .github/workflows/ # GitHub Actions CI/CD (if selected)
|
|
66
|
+
├── .vscode/ # VS Code settings (if selected)
|
|
67
|
+
├── .eslintrc.js # ESLint configuration
|
|
68
|
+
├── .prettierrc # Prettier configuration
|
|
69
|
+
├── .gitignore # Git ignore rules
|
|
70
|
+
├── tsconfig.json # TypeScript configuration
|
|
71
|
+
├── jest.config.js # Jest configuration (if selected)
|
|
72
|
+
├── package.json # Project dependencies and scripts
|
|
73
|
+
└── README.md # Project documentation
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Available Scripts
|
|
77
|
+
|
|
78
|
+
The generated project includes these npm scripts:
|
|
79
|
+
|
|
80
|
+
- `npm run build` - Compile TypeScript to JavaScript
|
|
81
|
+
- `npm run build:watch` - Watch mode compilation
|
|
82
|
+
- `npm run lint` - Run ESLint on your code
|
|
83
|
+
- `npm run lint:fix` - Fix auto-fixable ESLint issues
|
|
84
|
+
- `npm run format` - Format code with Prettier
|
|
85
|
+
- `npm run format:check` - Check if code is properly formatted
|
|
86
|
+
- `npm test` - Run Jest tests (if enabled)
|
|
87
|
+
- `npm run test:watch` - Run tests in watch mode
|
|
88
|
+
- `npm run test:coverage` - Generate test coverage report
|
|
89
|
+
|
|
90
|
+
## Development
|
|
91
|
+
|
|
92
|
+
To develop this generator locally:
|
|
93
|
+
|
|
94
|
+
1. Clone this repository
|
|
95
|
+
2. Install dependencies: `npm install`
|
|
96
|
+
3. Link the generator: `npm link`
|
|
97
|
+
4. Test in a new directory: `yo @cbs-consulting/btp`
|
|
98
|
+
|
|
99
|
+
## Contributing
|
|
100
|
+
|
|
101
|
+
1. Fork the repository
|
|
102
|
+
2. Create a feature branch
|
|
103
|
+
3. Make your changes
|
|
104
|
+
4. Add tests if applicable
|
|
105
|
+
5. Submit a pull request
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Install CF multiapps plugin for deploy and dmol
|
|
4
|
-
echo "Adding CF-Community plugin repository..."
|
|
5
|
-
cf add-plugin-repo CF-Community https://plugins.cloudfoundry.org > /dev/null 2>&1
|
|
6
|
-
echo "✓ Added CF-Community plugin successfully!"
|
|
7
|
-
|
|
8
|
-
echo "Installing multiapps plugin..."
|
|
9
|
-
# Install silently to avoid unnecessary output
|
|
10
|
-
cf install-plugin multiapps -f > /dev/null 2>&1
|
|
11
|
-
echo "✓ CF multiapps plugin installed successfully!"
|
|
12
|
-
|
|
13
|
-
# Install required azure extensions
|
|
14
|
-
echo "Installing azure extensions..."
|
|
15
|
-
az extension add --name azure-devops
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Install CF multiapps plugin for deploy and dmol
|
|
4
|
+
echo "Adding CF-Community plugin repository..."
|
|
5
|
+
cf add-plugin-repo CF-Community https://plugins.cloudfoundry.org > /dev/null 2>&1
|
|
6
|
+
echo "✓ Added CF-Community plugin successfully!"
|
|
7
|
+
|
|
8
|
+
echo "Installing multiapps plugin..."
|
|
9
|
+
# Install silently to avoid unnecessary output
|
|
10
|
+
cf install-plugin multiapps -f > /dev/null 2>&1
|
|
11
|
+
echo "✓ CF multiapps plugin installed successfully!"
|
|
12
|
+
|
|
13
|
+
# Install required azure extensions
|
|
14
|
+
echo "Installing azure extensions..."
|
|
15
|
+
az extension add --name azure-devops
|
|
16
16
|
echo "✓ Azure extensions installed successfully!"
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
[alias]
|
|
2
|
-
# Helper aliases for ticket workflow
|
|
3
|
-
extract-branch-parts = "!f() { current_branch=$(git branch --show-current); case \"$current_branch\" in */*) prefix=\"${current_branch%%/*}\"; ticketRef=\"${current_branch#*/}\"; echo \"$prefix|$ticketRef\" ;; *) echo \"Error: Branch name must contain a prefix (e.g., feature/ABC-123)\" >&2; return 1 ;; esac; }; f"
|
|
4
|
-
capitalize-prefix = "!f() { first_char=$(printf '%s' \"$1\" | cut -c1 | tr '[:lower:]' '[:upper:]'); rest_chars=$(printf '%s' \"$1\" | cut -c2-); echo \"$first_char$rest_chars\"; }; f"
|
|
5
|
-
format-pr-url = "!f() { pr_id=\"$1\"; remote_url=$(git config --get remote.origin.url | sed 's|https://[^@]*@|https://|'); base_url=$(echo \"$remote_url\" | sed 's|\\.git$||'); echo \"${base_url}/pullrequest/${pr_id}\"; }; f"
|
|
6
|
-
get-commit-message = "!f() { provided_message=\"$1\"; default_branch=\"$2\"; current_branch=$(git branch --show-current); commit_count=$(git rev-list --count $default_branch..$current_branch 2>/dev/null || echo \"0\"); if [ \"$commit_count\" -eq 1 ]; then if [ -z \"$provided_message\" ]; then git log -1 --pretty%=s; else echo \"$provided_message\"; fi; elif [ \"$commit_count\" -gt 1 ]; then if [ -z \"$provided_message\" ]; then echo \"Error: Multiple commits found. Please provide a message with -m <message>\" >&2; return 1; fi; echo \"$provided_message\"; else echo \"Error: No commits found on this branch\" >&2; return 1; fi; }; f"
|
|
7
|
-
stash-if-dirty = "!f() { if ! git diff-index --quiet HEAD -- 2>/dev/null; then echo 'Stashing...'; git stash >/dev/null 2>&1 && echo 'stashed'; fi; }; f"
|
|
8
|
-
unstash-if-needed = "!f() { if [ \"$1\" = \"stashed\" ]; then echo 'Restoring stash...'; git stash pop >/dev/null 2>&1; fi; }; f"
|
|
9
|
-
revert-stash-if-needed = "!f() { if [ \"$1\" = \"stashed\" ]; then echo 'Reverting stash...'; git stash pop >/dev/null 2>&1; fi; }; f"
|
|
10
|
-
open-ticket-help = "!f() { default_branch=$(git default-branch); echo ''; echo '----------------------------------------'; echo ''; echo 'Usage: git open-ticket [prefix] <ticketRef>'; echo ''; echo \"Creates a new feature branch from the default branch.\"; echo \"The default branch of this project is: $default_branch.\"; echo ''; echo 'Arguments:'; echo ' ticketRef Ticket reference (e.g., ABC-123)'; echo ' prefix Optional branch prefix (default: feature)'; echo ''; echo 'Options:'; echo ' -h Show this help message'; echo ''; echo 'Examples:'; echo ' git open-ticket ABC-123 # Creates feature/ABC-123'; echo ' git open-ticket bugfix ABC-123 # Creates bugfix/ABC-123'; echo ' git open-ticket hotfix XYZ-456 # Creates hotfix/XYZ-456'; }; f"
|
|
11
|
-
close-ticket-help = "!f() { default_branch=$(git default-branch); echo ''; echo '----------------------------------------'; echo ''; echo 'Usage: git close-ticket [OPTIONS]'; echo ''; echo \"Creates a pull request from the current branch to the default branch.\"; echo \"The default branch of this project is: $default_branch.\"; echo ''; echo \"The message is prefixed based on the branch name.\"; echo \"Example: feature/ABC-123 -> Feature ABC-123: <message>\"; echo ''; echo 'Options:'; echo ' --auto-complete Enable auto-complete and delete source branch after merge'; echo ' -m <message> Custom PR message (required if multiple commits exist)'; echo ' -h Show this help message'; echo ''; echo 'Examples:'; echo ' git close-ticket'; echo ' git close-ticket --auto-complete'; echo ' git close-ticket -m \"Add new feature\"'; echo ' git close-ticket --auto-complete -m \"Fix bug\"'; }; f"
|
|
12
|
-
|
|
13
|
-
# Main ticket workflow aliases
|
|
14
|
-
close-ticket = "!f() { message=\"\"; auto_complete=\"\"; while [ $# -gt 0 ]; do case \"$1\" in -h) git close-ticket-help; return 0 ;; -m) if [ -z \"$2\" ]; then echo \"Error: -m requires a message\" >&2; return 1; fi; message=\"$2\"; shift 2 ;; --auto-complete) auto_complete=\"--auto-complete true --delete-source-branch true\"; shift ;; *) echo \"Error: Unknown parameter '$1'. Usage: git close-ticket [--auto-complete] [-m <message>]\" >&2; return 1 ;; esac; done; parts=$(git extract-branch-parts) || return 1; prefix=$(echo \"$parts\" | cut -d'|' -f1); ticketRef=$(echo \"$parts\" | cut -d'|' -f2); git push || return 1; default_branch=$(git default-branch); message=$(git get-commit-message \"$message\" \"$default_branch\") || return 1; prefix_cap=$(git capitalize-prefix \"$prefix\"); pr_title=\"$prefix_cap $ticketRef: $message\"; echo \"Creating PR: $pr_title\"; pr_id=$(az repos pr create --title \"$pr_title\" --target-branch \"$default_branch\" --source-branch \"$(git branch --show-current)\" $auto_complete -o tsv --query \"pullRequestId\") || return 1; pr_url=$(git format-pr-url \"$pr_id\"); echo \"PR created: $pr_url\"; git switch $(git default-branch) && git pull && git cleanup-branches; }; f"
|
|
15
|
-
open-ticket = "!f() { if [ \"$1\" = \"-h\" ]; then git open-ticket-help; return 0; fi; if [ -z \"$1\" ]; then echo \"Error: Please provide a ticket name. Usage: git open-ticket [prefix] <ticketRef>\" >&2; return 1; fi; if [ -n \"$2\" ]; then prefix=\"$1/\"; ticket=\"$2\"; else prefix=\"feature/\"; ticket=\"$1\"; fi; case \"$ticket\" in */*) echo \"Error: Ticket name cannot contain '/'. Use separate prefix parameter instead. Example: git open-ticket feature ABC-123\" >&2; return 1 ;; esac; stash_status=$(git stash-if-dirty); if ! git switch $(git default-branch); then git revert-stash-if-needed \"$stash_status\"; return 1; fi; if ! git pull; then git revert-stash-if-needed \"$stash_status\"; return 1; fi; if ! git switch -c \"$prefix$ticket\"; then git revert-stash-if-needed \"$stash_status\"; return 1; fi; git unstash-if-needed \"$stash_status\"; }; f"
|
|
16
|
-
default-branch = "!f() { \n if ! az extension list --query \"[?name=='azure-devops'].name\" -o tsv 2>/dev/null | grep -q 'azure-devops'; then \n echo \"Error: azure-devops extension is not installed. Install it with: az extension add --name azure-devops\" >&2; \n return 1; \n fi; \n if ! az account show >/dev/null 2>&1; then \n echo \"Error: Not logged in to Azure. Login with: az login --allow-no-subscriptions\" >&2; \n return 1; \n fi; \n repoName=$(basename -s .git \"$(git config --get remote.origin.url)\"); \n remoteBranch=$(az repos show --query defaultBranch -o tsv -r \"$repoName\"); \n localBranch=$(git rev-parse --abbrev-ref \"$remoteBranch\"); \n echo \"$localBranch\"; \n}; f"
|
|
1
|
+
[alias]
|
|
2
|
+
# Helper aliases for ticket workflow
|
|
3
|
+
extract-branch-parts = "!f() { current_branch=$(git branch --show-current); case \"$current_branch\" in */*) prefix=\"${current_branch%%/*}\"; ticketRef=\"${current_branch#*/}\"; echo \"$prefix|$ticketRef\" ;; *) echo \"Error: Branch name must contain a prefix (e.g., feature/ABC-123)\" >&2; return 1 ;; esac; }; f"
|
|
4
|
+
capitalize-prefix = "!f() { first_char=$(printf '%s' \"$1\" | cut -c1 | tr '[:lower:]' '[:upper:]'); rest_chars=$(printf '%s' \"$1\" | cut -c2-); echo \"$first_char$rest_chars\"; }; f"
|
|
5
|
+
format-pr-url = "!f() { pr_id=\"$1\"; remote_url=$(git config --get remote.origin.url | sed 's|https://[^@]*@|https://|'); base_url=$(echo \"$remote_url\" | sed 's|\\.git$||'); echo \"${base_url}/pullrequest/${pr_id}\"; }; f"
|
|
6
|
+
get-commit-message = "!f() { provided_message=\"$1\"; default_branch=\"$2\"; current_branch=$(git branch --show-current); commit_count=$(git rev-list --count $default_branch..$current_branch 2>/dev/null || echo \"0\"); if [ \"$commit_count\" -eq 1 ]; then if [ -z \"$provided_message\" ]; then git log -1 --pretty%=s; else echo \"$provided_message\"; fi; elif [ \"$commit_count\" -gt 1 ]; then if [ -z \"$provided_message\" ]; then echo \"Error: Multiple commits found. Please provide a message with -m <message>\" >&2; return 1; fi; echo \"$provided_message\"; else echo \"Error: No commits found on this branch\" >&2; return 1; fi; }; f"
|
|
7
|
+
stash-if-dirty = "!f() { if ! git diff-index --quiet HEAD -- 2>/dev/null; then echo 'Stashing...'; git stash >/dev/null 2>&1 && echo 'stashed'; fi; }; f"
|
|
8
|
+
unstash-if-needed = "!f() { if [ \"$1\" = \"stashed\" ]; then echo 'Restoring stash...'; git stash pop >/dev/null 2>&1; fi; }; f"
|
|
9
|
+
revert-stash-if-needed = "!f() { if [ \"$1\" = \"stashed\" ]; then echo 'Reverting stash...'; git stash pop >/dev/null 2>&1; fi; }; f"
|
|
10
|
+
open-ticket-help = "!f() { default_branch=$(git default-branch); echo ''; echo '----------------------------------------'; echo ''; echo 'Usage: git open-ticket [prefix] <ticketRef>'; echo ''; echo \"Creates a new feature branch from the default branch.\"; echo \"The default branch of this project is: $default_branch.\"; echo ''; echo 'Arguments:'; echo ' ticketRef Ticket reference (e.g., ABC-123)'; echo ' prefix Optional branch prefix (default: feature)'; echo ''; echo 'Options:'; echo ' -h Show this help message'; echo ''; echo 'Examples:'; echo ' git open-ticket ABC-123 # Creates feature/ABC-123'; echo ' git open-ticket bugfix ABC-123 # Creates bugfix/ABC-123'; echo ' git open-ticket hotfix XYZ-456 # Creates hotfix/XYZ-456'; }; f"
|
|
11
|
+
close-ticket-help = "!f() { default_branch=$(git default-branch); echo ''; echo '----------------------------------------'; echo ''; echo 'Usage: git close-ticket [OPTIONS]'; echo ''; echo \"Creates a pull request from the current branch to the default branch.\"; echo \"The default branch of this project is: $default_branch.\"; echo ''; echo \"The message is prefixed based on the branch name.\"; echo \"Example: feature/ABC-123 -> Feature ABC-123: <message>\"; echo ''; echo 'Options:'; echo ' --auto-complete Enable auto-complete and delete source branch after merge'; echo ' -m <message> Custom PR message (required if multiple commits exist)'; echo ' -h Show this help message'; echo ''; echo 'Examples:'; echo ' git close-ticket'; echo ' git close-ticket --auto-complete'; echo ' git close-ticket -m \"Add new feature\"'; echo ' git close-ticket --auto-complete -m \"Fix bug\"'; }; f"
|
|
12
|
+
|
|
13
|
+
# Main ticket workflow aliases
|
|
14
|
+
close-ticket = "!f() { message=\"\"; auto_complete=\"\"; while [ $# -gt 0 ]; do case \"$1\" in -h) git close-ticket-help; return 0 ;; -m) if [ -z \"$2\" ]; then echo \"Error: -m requires a message\" >&2; return 1; fi; message=\"$2\"; shift 2 ;; --auto-complete) auto_complete=\"--auto-complete true --delete-source-branch true\"; shift ;; *) echo \"Error: Unknown parameter '$1'. Usage: git close-ticket [--auto-complete] [-m <message>]\" >&2; return 1 ;; esac; done; parts=$(git extract-branch-parts) || return 1; prefix=$(echo \"$parts\" | cut -d'|' -f1); ticketRef=$(echo \"$parts\" | cut -d'|' -f2); git push || return 1; default_branch=$(git default-branch); message=$(git get-commit-message \"$message\" \"$default_branch\") || return 1; prefix_cap=$(git capitalize-prefix \"$prefix\"); pr_title=\"$prefix_cap $ticketRef: $message\"; echo \"Creating PR: $pr_title\"; pr_id=$(az repos pr create --title \"$pr_title\" --target-branch \"$default_branch\" --source-branch \"$(git branch --show-current)\" $auto_complete -o tsv --query \"pullRequestId\") || return 1; pr_url=$(git format-pr-url \"$pr_id\"); echo \"PR created: $pr_url\"; git switch $(git default-branch) && git pull && git cleanup-branches; }; f"
|
|
15
|
+
open-ticket = "!f() { if [ \"$1\" = \"-h\" ]; then git open-ticket-help; return 0; fi; if [ -z \"$1\" ]; then echo \"Error: Please provide a ticket name. Usage: git open-ticket [prefix] <ticketRef>\" >&2; return 1; fi; if [ -n \"$2\" ]; then prefix=\"$1/\"; ticket=\"$2\"; else prefix=\"feature/\"; ticket=\"$1\"; fi; case \"$ticket\" in */*) echo \"Error: Ticket name cannot contain '/'. Use separate prefix parameter instead. Example: git open-ticket feature ABC-123\" >&2; return 1 ;; esac; stash_status=$(git stash-if-dirty); if ! git switch $(git default-branch); then git revert-stash-if-needed \"$stash_status\"; return 1; fi; if ! git pull; then git revert-stash-if-needed \"$stash_status\"; return 1; fi; if ! git switch -c \"$prefix$ticket\"; then git revert-stash-if-needed \"$stash_status\"; return 1; fi; git unstash-if-needed \"$stash_status\"; }; f"
|
|
16
|
+
default-branch = "!f() { \n if ! az extension list --query \"[?name=='azure-devops'].name\" -o tsv 2>/dev/null | grep -q 'azure-devops'; then \n echo \"Error: azure-devops extension is not installed. Install it with: az extension add --name azure-devops\" >&2; \n return 1; \n fi; \n if ! az account show >/dev/null 2>&1; then \n echo \"Error: Not logged in to Azure. Login with: az login --allow-no-subscriptions\" >&2; \n return 1; \n fi; \n repoName=$(basename -s .git \"$(git config --get remote.origin.url)\"); \n remoteBranch=$(az repos show --query defaultBranch -o tsv -r \"$repoName\"); \n localBranch=$(git rev-parse --abbrev-ref \"$remoteBranch\"); \n echo \"$localBranch\"; \n}; f"
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
# CAP smart-core
|
|
2
|
-
_out
|
|
3
|
-
*.db
|
|
4
|
-
*.sqlite*
|
|
5
|
-
connection.properties
|
|
6
|
-
default-*.json
|
|
7
|
-
.cdsrc-private.json
|
|
8
|
-
gen/
|
|
9
|
-
node_modules/
|
|
10
|
-
target/
|
|
11
|
-
|
|
12
|
-
# Web IDE, App Studio
|
|
13
|
-
.che/
|
|
14
|
-
.gen/
|
|
15
|
-
|
|
16
|
-
# MTA
|
|
17
|
-
*_mta_build_tmp
|
|
18
|
-
*.mtar
|
|
19
|
-
mta_archives/
|
|
20
|
-
|
|
21
|
-
# Other
|
|
22
|
-
.DS_Store
|
|
23
|
-
*.orig
|
|
24
|
-
*.log
|
|
25
|
-
|
|
26
|
-
*.iml
|
|
27
|
-
*.flattened-pom.xml
|
|
28
|
-
|
|
29
|
-
# @cap-js/cds-typer
|
|
30
|
-
@cds-models
|
|
31
|
-
|
|
32
|
-
# ignore all dist folders in UI5 apps
|
|
33
|
-
**/dist/
|
|
34
|
-
|
|
35
|
-
resources/
|
|
36
|
-
# auto generated wildcard
|
|
37
|
-
db/.env
|
|
38
|
-
|
|
39
|
-
gen.zip
|
|
40
|
-
|
|
41
|
-
# LLM
|
|
42
|
-
/.github/
|
|
43
|
-
|
|
44
|
-
# Generated test data
|
|
45
|
-
test/data/
|
|
46
|
-
|
|
47
|
-
# Generated SQLite service files
|
|
1
|
+
# CAP smart-core
|
|
2
|
+
_out
|
|
3
|
+
*.db
|
|
4
|
+
*.sqlite*
|
|
5
|
+
connection.properties
|
|
6
|
+
default-*.json
|
|
7
|
+
.cdsrc-private.json
|
|
8
|
+
gen/
|
|
9
|
+
node_modules/
|
|
10
|
+
target/
|
|
11
|
+
|
|
12
|
+
# Web IDE, App Studio
|
|
13
|
+
.che/
|
|
14
|
+
.gen/
|
|
15
|
+
|
|
16
|
+
# MTA
|
|
17
|
+
*_mta_build_tmp
|
|
18
|
+
*.mtar
|
|
19
|
+
mta_archives/
|
|
20
|
+
|
|
21
|
+
# Other
|
|
22
|
+
.DS_Store
|
|
23
|
+
*.orig
|
|
24
|
+
*.log
|
|
25
|
+
|
|
26
|
+
*.iml
|
|
27
|
+
*.flattened-pom.xml
|
|
28
|
+
|
|
29
|
+
# @cap-js/cds-typer
|
|
30
|
+
@cds-models
|
|
31
|
+
|
|
32
|
+
# ignore all dist folders in UI5 apps
|
|
33
|
+
**/dist/
|
|
34
|
+
|
|
35
|
+
resources/
|
|
36
|
+
# auto generated wildcard
|
|
37
|
+
db/.env
|
|
38
|
+
|
|
39
|
+
gen.zip
|
|
40
|
+
|
|
41
|
+
# LLM
|
|
42
|
+
/.github/
|
|
43
|
+
|
|
44
|
+
# Generated test data
|
|
45
|
+
test/data/
|
|
46
|
+
|
|
47
|
+
# Generated SQLite service files
|
|
48
48
|
srv/sqlite/
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import prettierConfig from "cbs-tools/prettier/prettier.config.mjs"
|
|
1
|
+
import prettierConfig from "@cbs-consulting/tools/prettier/prettier.config.mjs"
|
|
2
2
|
export default prettierConfig
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import ui5TsConfig from "cbs-tools/eslint/ui5/ts/eslint.config.mjs"
|
|
2
|
-
export default ui5TsConfig
|
|
1
|
+
import ui5TsConfig from "@cbs-consulting/tools/eslint/ui5/ts/eslint.config.mjs";
|
|
2
|
+
export default ui5TsConfig;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cbs-consulting/generator-btp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Yeoman generator for bootstrapping CAP/UI5 projects with TypeScript, ESLint, and other essential configurations",
|
|
5
5
|
"main": "generators/app/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -36,7 +36,10 @@
|
|
|
36
36
|
"yeoman-assert": "3.1.1",
|
|
37
37
|
"yeoman-test": "7.4.0"
|
|
38
38
|
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
39
42
|
"engines": {
|
|
40
|
-
"node": ">=
|
|
43
|
+
"node": ">=20.0.0"
|
|
41
44
|
}
|
|
42
45
|
}
|