├── .editorconfig
├── .eslintignore
├── .eslintrc.json
├── .gitattributes
├── .github
├── dependabot.yml
├── release-drafter.yml
└── workflows
│ ├── github-ci.yml
│ └── release-drafter.yml
├── .gitignore
├── .prettierignore
├── .prettierrc
├── LICENSE
├── NOTICE
├── README.md
├── generators
├── app
│ ├── generator-transforms.js
│ ├── index.js
│ ├── input-validation.js
│ └── templates
│ │ ├── .editorconfig
│ │ ├── .eslintignore
│ │ ├── .eslintrc.json
│ │ ├── .gitattributes
│ │ ├── .github
│ │ └── workflows
│ │ │ └── github-ci.yml.ejs
│ │ ├── .gitignore.ejs
│ │ ├── .prettierignore
│ │ ├── .prettierrc
│ │ ├── LICENSE_APACHE.ejs
│ │ ├── LICENSE_GPL.ejs
│ │ ├── LICENSE_MIT.ejs
│ │ ├── README.md.ejs
│ │ ├── generators
│ │ ├── app
│ │ │ ├── index.js.ejs
│ │ │ └── templates
│ │ │ │ └── dummy.txt.ejs
│ │ └── entity
│ │ │ ├── index.js.ejs
│ │ │ └── templates
│ │ │ └── dummy.txt.ejs
│ │ ├── package.json.ejs
│ │ └── test
│ │ ├── app.spec.js.ejs
│ │ └── templates
│ │ ├── gradle-react
│ │ └── .yo-rc.json
│ │ ├── maven-angularX
│ │ └── .yo-rc.json
│ │ └── maven-vue
│ │ └── .yo-rc.json
└── generator-constants.js
├── images
├── circleci.png
├── gitlabci.png
├── logo-jhipster.png
└── travis.png
├── package-lock.json
├── package.json
└── test
├── app.spec.js
└── input-validation.spec.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 4
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
14 | [{package,bower}.json]
15 | indent_style = space
16 | indent_size = 2
17 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | coverage
2 | generators/**/templates
3 | node_modules
4 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "node": true,
4 | "es6": true
5 | },
6 | "extends": ["airbnb-base", "plugin:prettier/recommended"],
7 | "rules": {
8 | "prettier/prettier": "error",
9 | "indent": [2, 4],
10 | "linebreak-style": 0,
11 | "eol-last": 2,
12 | "quotes": [2, "single", { "avoidEscape": true }],
13 | "semi": [2, "always"],
14 | "eqeqeq": [2, "smart"],
15 | "no-use-before-define": [2, "nofunc"],
16 | "no-unused-vars": [2, { "vars": "local", "args": "none" }],
17 | "no-multi-str": 2,
18 | "no-irregular-whitespace": 2,
19 | "comma-dangle": "off",
20 | "max-len": "off",
21 | "func-names": "off",
22 | "class-methods-use-this": "off",
23 | "no-underscore-dangle": "off",
24 | "no-plusplus": "off",
25 | "no-unused-expressions": [2, { "allowShortCircuit": true, "allowTernary": true }],
26 | "prefer-destructuring": "off",
27 | "no-multi-assign": "off",
28 | "no-param-reassign": "off",
29 | "no-shadow": "off"
30 | },
31 | "overrides": [
32 | {
33 | "files": ["test/**/*.js"],
34 | "env": { "mocha": true }
35 | }
36 | ]
37 | }
38 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # All text files should have the "lf" (Unix) line endings
2 | * text eol=lf
3 |
4 | # Explicitly declare text files you want to always be normalized and converted
5 | # to native line endings on checkout.
6 | *.java text
7 | *.js text
8 | *.css text
9 | *.html text
10 |
11 | # Denote all files that are truly binary and should not be modified.
12 | *.png binary
13 | *.jpg binary
14 | *.jar binary
15 | *.pdf binary
16 | *.eot binary
17 | *.ttf binary
18 | *.gzip binary
19 | *.gz binary
20 | *.ai binary
21 | *.eps binary
22 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: 'npm'
4 | directory: '/'
5 | schedule:
6 | interval: 'weekly'
7 | open-pull-requests-limit: 10
8 |
9 | - package-ecosystem: 'github-actions'
10 | directory: '/'
11 | schedule:
12 | interval: 'weekly'
13 | open-pull-requests-limit: 10
14 |
--------------------------------------------------------------------------------
/.github/release-drafter.yml:
--------------------------------------------------------------------------------
1 | template: |
2 | ## What’s Changed
3 |
4 | $CHANGES
5 |
--------------------------------------------------------------------------------
/.github/workflows/github-ci.yml:
--------------------------------------------------------------------------------
1 | name: Build
2 | on: [push, pull_request]
3 | jobs:
4 | unit-tests:
5 | name: unit tests
6 | runs-on: ubuntu-latest
7 | timeout-minutes: 10
8 | steps:
9 | - uses: actions/checkout@v3
10 | - uses: actions/setup-node@v3
11 | with:
12 | node-version: 14.16.0
13 | - name: Install node.js packages
14 | run: npm install
15 | - name: Check prettier formatting
16 | run: npm run prettier:check
17 | - name: Run generator tests
18 | run: npm test
19 |
--------------------------------------------------------------------------------
/.github/workflows/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name: Release Drafter
2 |
3 | on:
4 | push:
5 | # branches to consider in the event; optional, defaults to all
6 | branches:
7 | - main
8 |
9 | jobs:
10 | update_release_draft:
11 | if: github.repository == 'jhipster/generator-jhipster-module'
12 | runs-on: ubuntu-latest
13 | steps:
14 | # Drafts your next Release notes as Pull Requests are merged into "main"
15 | - uses: release-drafter/release-drafter@v5
16 | env:
17 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | coverage
3 | .idea
4 | *.iml
5 | *.ipr
6 | *.iws
7 | atlassian-ide-plugin.xml
8 | /.project
9 | test/temp/
10 | *debug.log*
11 | .vscode
12 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | **/templates/**/
3 | package-lock.json
4 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | # Prettier configuration
2 |
3 | printWidth: 140
4 | singleQuote: true
5 | tabWidth: 4
6 | useTabs: false
7 |
8 | # js and ts rules:
9 | arrowParens: avoid
10 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Copyright 2015-2022 the original author or authors from the JHipster project
3 |
4 | Apache License
5 | Version 2.0, January 2004
6 | http://www.apache.org/licenses/
7 |
8 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
9 |
10 | 1. Definitions.
11 |
12 | "License" shall mean the terms and conditions for use, reproduction,
13 | and distribution as defined by Sections 1 through 9 of this document.
14 |
15 | "Licensor" shall mean the copyright owner or entity authorized by
16 | the copyright owner that is granting the License.
17 |
18 | "Legal Entity" shall mean the union of the acting entity and all
19 | other entities that control, are controlled by, or are under common
20 | control with that entity. For the purposes of this definition,
21 | "control" means (i) the power, direct or indirect, to cause the
22 | direction or management of such entity, whether by contract or
23 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
24 | outstanding shares, or (iii) beneficial ownership of such entity.
25 |
26 | "You" (or "Your") shall mean an individual or Legal Entity
27 | exercising permissions granted by this License.
28 |
29 | "Source" form shall mean the preferred form for making modifications,
30 | including but not limited to software source code, documentation
31 | source, and configuration files.
32 |
33 | "Object" form shall mean any form resulting from mechanical
34 | transformation or translation of a Source form, including but
35 | not limited to compiled object code, generated documentation,
36 | and conversions to other media types.
37 |
38 | "Work" shall mean the work of authorship, whether in Source or
39 | Object form, made available under the License, as indicated by a
40 | copyright notice that is included in or attached to the work
41 | (an example is provided in the Appendix below).
42 |
43 | "Derivative Works" shall mean any work, whether in Source or Object
44 | form, that is based on (or derived from) the Work and for which the
45 | editorial revisions, annotations, elaborations, or other modifications
46 | represent, as a whole, an original work of authorship. For the purposes
47 | of this License, Derivative Works shall not include works that remain
48 | separable from, or merely link (or bind by name) to the interfaces of,
49 | the Work and Derivative Works thereof.
50 |
51 | "Contribution" shall mean any work of authorship, including
52 | the original version of the Work and any modifications or additions
53 | to that Work or Derivative Works thereof, that is intentionally
54 | submitted to Licensor for inclusion in the Work by the copyright owner
55 | or by an individual or Legal Entity authorized to submit on behalf of
56 | the copyright owner. For the purposes of this definition, "submitted"
57 | means any form of electronic, verbal, or written communication sent
58 | to the Licensor or its representatives, including but not limited to
59 | communication on electronic mailing lists, source code control systems,
60 | and issue tracking systems that are managed by, or on behalf of, the
61 | Licensor for the purpose of discussing and improving the Work, but
62 | excluding communication that is conspicuously marked or otherwise
63 | designated in writing by the copyright owner as "Not a Contribution."
64 |
65 | "Contributor" shall mean Licensor and any individual or Legal Entity
66 | on behalf of whom a Contribution has been received by Licensor and
67 | subsequently incorporated within the Work.
68 |
69 | 2. Grant of Copyright License. Subject to the terms and conditions of
70 | this License, each Contributor hereby grants to You a perpetual,
71 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
72 | copyright license to reproduce, prepare Derivative Works of,
73 | publicly display, publicly perform, sublicense, and distribute the
74 | Work and such Derivative Works in Source or Object form.
75 |
76 | 3. Grant of Patent License. Subject to the terms and conditions of
77 | this License, each Contributor hereby grants to You a perpetual,
78 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
79 | (except as stated in this section) patent license to make, have made,
80 | use, offer to sell, sell, import, and otherwise transfer the Work,
81 | where such license applies only to those patent claims licensable
82 | by such Contributor that are necessarily infringed by their
83 | Contribution(s) alone or by combination of their Contribution(s)
84 | with the Work to which such Contribution(s) was submitted. If You
85 | institute patent litigation against any entity (including a
86 | cross-claim or counterclaim in a lawsuit) alleging that the Work
87 | or a Contribution incorporated within the Work constitutes direct
88 | or contributory patent infringement, then any patent licenses
89 | granted to You under this License for that Work shall terminate
90 | as of the date such litigation is filed.
91 |
92 | 4. Redistribution. You may reproduce and distribute copies of the
93 | Work or Derivative Works thereof in any medium, with or without
94 | modifications, and in Source or Object form, provided that You
95 | meet the following conditions:
96 |
97 | (a) You must give any other recipients of the Work or
98 | Derivative Works a copy of this License; and
99 |
100 | (b) You must cause any modified files to carry prominent notices
101 | stating that You changed the files; and
102 |
103 | (c) You must retain, in the Source form of any Derivative Works
104 | that You distribute, all copyright, patent, trademark, and
105 | attribution notices from the Source form of the Work,
106 | excluding those notices that do not pertain to any part of
107 | the Derivative Works; and
108 |
109 | (d) If the Work includes a "NOTICE" text file as part of its
110 | distribution, then any Derivative Works that You distribute must
111 | include a readable copy of the attribution notices contained
112 | within such NOTICE file, excluding those notices that do not
113 | pertain to any part of the Derivative Works, in at least one
114 | of the following places: within a NOTICE text file distributed
115 | as part of the Derivative Works; within the Source form or
116 | documentation, if provided along with the Derivative Works; or,
117 | within a display generated by the Derivative Works, if and
118 | wherever such third-party notices normally appear. The contents
119 | of the NOTICE file are for informational purposes only and
120 | do not modify the License. You may add Your own attribution
121 | notices within Derivative Works that You distribute, alongside
122 | or as an addendum to the NOTICE text from the Work, provided
123 | that such additional attribution notices cannot be construed
124 | as modifying the License.
125 |
126 | You may add Your own copyright statement to Your modifications and
127 | may provide additional or different license terms and conditions
128 | for use, reproduction, or distribution of Your modifications, or
129 | for any such Derivative Works as a whole, provided Your use,
130 | reproduction, and distribution of the Work otherwise complies with
131 | the conditions stated in this License.
132 |
133 | 5. Submission of Contributions. Unless You explicitly state otherwise,
134 | any Contribution intentionally submitted for inclusion in the Work
135 | by You to the Licensor shall be under the terms and conditions of
136 | this License, without any additional terms or conditions.
137 | Notwithstanding the above, nothing herein shall supersede or modify
138 | the terms of any separate license agreement you may have executed
139 | with Licensor regarding such Contributions.
140 |
141 | 6. Trademarks. This License does not grant permission to use the trade
142 | names, trademarks, service marks, or product names of the Licensor,
143 | except as required for reasonable and customary use in describing the
144 | origin of the Work and reproducing the content of the NOTICE file.
145 |
146 | 7. Disclaimer of Warranty. Unless required by applicable law or
147 | agreed to in writing, Licensor provides the Work (and each
148 | Contributor provides its Contributions) on an "AS IS" BASIS,
149 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
150 | implied, including, without limitation, any warranties or conditions
151 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
152 | PARTICULAR PURPOSE. You are solely responsible for determining the
153 | appropriateness of using or redistributing the Work and assume any
154 | risks associated with Your exercise of permissions under this License.
155 |
156 | 8. Limitation of Liability. In no event and under no legal theory,
157 | whether in tort (including negligence), contract, or otherwise,
158 | unless required by applicable law (such as deliberate and grossly
159 | negligent acts) or agreed to in writing, shall any Contributor be
160 | liable to You for damages, including any direct, indirect, special,
161 | incidental, or consequential damages of any character arising as a
162 | result of this License or out of the use or inability to use the
163 | Work (including but not limited to damages for loss of goodwill,
164 | work stoppage, computer failure or malfunction, or any and all
165 | other commercial damages or losses), even if such Contributor
166 | has been advised of the possibility of such damages.
167 |
168 | 9. Accepting Warranty or Additional Liability. While redistributing
169 | the Work or Derivative Works thereof, You may choose to offer,
170 | and charge a fee for, acceptance of support, warranty, indemnity,
171 | or other liability obligations and/or rights consistent with this
172 | License. However, in accepting such obligations, You may act only
173 | on Your own behalf and on Your sole responsibility, not on behalf
174 | of any other Contributor, and only if You agree to indemnify,
175 | defend, and hold each Contributor harmless for any liability
176 | incurred by, or claims asserted against, such Contributor by reason
177 | of your accepting any such warranty or additional liability.
178 |
179 | END OF TERMS AND CONDITIONS
180 |
181 | APPENDIX: How to apply the Apache License to your work.
182 |
183 | To apply the Apache License to your work, attach the following
184 | boilerplate notice, with the fields enclosed by brackets "[]"
185 | replaced with your own identifying information. (Don't include
186 | the brackets!) The text should be enclosed in the appropriate
187 | comment syntax for the file format. We also recommend that a
188 | file or class name and description of purpose be included on the
189 | same "printed page" as the copyright notice for easier
190 | identification within third-party archives.
191 |
192 | Copyright [yyyy] [name of copyright owner]
193 |
194 | Licensed under the Apache License, Version 2.0 (the "License");
195 | you may not use this file except in compliance with the License.
196 | You may obtain a copy of the License at
197 |
198 | http://www.apache.org/licenses/LICENSE-2.0
199 |
200 | Unless required by applicable law or agreed to in writing, software
201 | distributed under the License is distributed on an "AS IS" BASIS,
202 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
203 | See the License for the specific language governing permissions and
204 | limitations under the License.
205 |
--------------------------------------------------------------------------------
/NOTICE:
--------------------------------------------------------------------------------
1 | JHipster
2 | Copyright 2015-2022 the original author or authors from the JHipster project.
3 |
4 | For more information on the JHipster project, see https://www.jhipster.tech/
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # generator-jhipster-module
2 |
3 | [![NPM version][npm-image]][npm-url] [![Build Status][github-actions-image]][github-actions-url] [![Dependency Status][daviddm-image]][daviddm-url]
4 |
5 | > Yeoman generator to create a JHipster module - "_One JHipster module to rule them all_"
6 |
7 |
12 |
13 | # Introduction
14 |
15 | This [Yeoman](https://yeoman.io/) generator will help you to kickstart a new [JHipster](https://www.jhipster.tech) module, if you want to develop a generator that will add new features to an existing JHipster application.
16 |
17 | # Prerequisites
18 |
19 | Reading this [JHipster module](https://www.jhipster.tech/modules/creating-a-module/)
20 |
21 | # Installation
22 |
23 | ## With NPM
24 |
25 | To install this module:
26 |
27 | ```bash
28 | npm install -g generator-jhipster-module
29 | ```
30 |
31 | To update this module:
32 |
33 | ```bash
34 | npm update -g generator-jhipster-module
35 | ```
36 |
37 | ## With Yarn
38 |
39 | To install this module:
40 |
41 | ```bash
42 | yarn global add generator-jhipster-module
43 | ```
44 |
45 | To update this module:
46 |
47 | ```bash
48 | yarn global upgrade generator-jhipster-module
49 | ```
50 |
51 | # Usage
52 |
53 | To run the module, follow these steps :
54 |
55 | - create a new directory
56 |
57 | ```bash
58 | mkdir generator-jhipster-
59 | ```
60 |
61 | - go into this directory
62 |
63 | ```bash
64 | cd generator-jhipster-
65 | ```
66 |
67 | - init the git repository
68 |
69 | ```bash
70 | git init
71 | ```
72 |
73 | - launch the jhipster-module
74 |
75 | ```bash
76 | yo jhipster-module
77 | ```
78 |
79 | - answer all questions
80 |
81 | # License
82 |
83 | Apache-2.0 © [Pascal Grimaud](https://twitter.com/pascalgrimaud) and the respective JHipster contributors
84 |
85 | [npm-image]: https://img.shields.io/npm/v/generator-jhipster-module.svg
86 | [npm-url]: https://npmjs.org/package/generator-jhipster-module
87 | [github-actions-image]: https://github.com/jhipster/generator-jhipster-module/workflows/Build/badge.svg
88 | [github-actions-url]: https://github.com/jhipster/generator-jhipster-module/actions
89 | [daviddm-image]: https://david-dm.org/jhipster/generator-jhipster-module.svg?theme=shields.io
90 | [daviddm-url]: https://david-dm.org/jhipster/generator-jhipster-module
91 |
--------------------------------------------------------------------------------
/generators/app/generator-transforms.js:
--------------------------------------------------------------------------------
1 | const through = require('through2');
2 | const prettier = require('prettier');
3 |
4 | const defaultPrettierOptions = {
5 | printWidth: 140,
6 | singleQuote: true,
7 | useTabs: false,
8 | tabWidth: 4,
9 | // js and ts rules:
10 | arrowParens: 'avoid',
11 | };
12 |
13 | const prettierTransform = function (defaultOptions = defaultPrettierOptions) {
14 | const transform = (file, encoding, callback) => {
15 | /* resolve from the projects config */
16 | prettier.resolveConfig(file.relative).then(options => {
17 | const str = file.contents.toString('utf8');
18 | if (!options || Object.keys(options).length === 0) {
19 | options = defaultOptions;
20 | }
21 | // for better errors
22 | options.filepath = file.relative;
23 | const data = prettier.format(str, options);
24 | file.contents = Buffer.from(data);
25 | callback(null, file);
26 | });
27 | };
28 | return through.obj(transform);
29 | };
30 |
31 | module.exports = {
32 | prettierTransform,
33 | };
34 |
--------------------------------------------------------------------------------
/generators/app/index.js:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk');
2 | const Generator = require('yeoman-generator');
3 | const filter = require('gulp-filter');
4 | const mkdirp = require('mkdirp');
5 | const packagejs = require('../../package.json');
6 | const { validateGitHubName, validateModuleName } = require('./input-validation');
7 | const prettierTransform = require('./generator-transforms').prettierTransform;
8 | const constants = require('../generator-constants');
9 |
10 | module.exports = class extends Generator {
11 | constructor(args, options) {
12 | super(args, options);
13 | // Register file transforms for generated files, using Prettier
14 | const prettierFilter = filter(['{,**/}{.,}*.{js,json,md,yml}'], { restore: true });
15 | // this pipe will pass through (restore) anything that doesn't match prettierFilter
16 | this.registerTransformStream([prettierFilter, prettierTransform(), prettierFilter.restore]);
17 | }
18 |
19 | get initializing() {
20 | return {
21 | displayLogo() {
22 | this.log(`
23 | ${chalk.red.bold(' Three::Modules')}
24 | ${chalk.red.bold(' for:::the::Elven-Kings')}
25 | ${chalk.red.bold(' under:the:sky,:Seven:for:the')}
26 | ${chalk.red.bold(' Dwarf-Lords::in::their::halls:of')}
27 | ${chalk.red.bold(' stone,:Nine for:Mortal')}
28 | ${chalk.red.bold(` :::Men:::${chalk.yellow(' ________')} doomed::to`)}
29 | ${chalk.red.bold(` die.:One${chalk.yellow(" _,-'...:... `-. ")}for:::the`)}
30 | ${chalk.red.bold(` ::Dark::${chalk.yellow(' ,- .:::::::::::. `. ')}Hipster::on`)}
31 | ${chalk.red.bold(` his:dark${chalk.yellow(" ,' .:::::::::::::. `. ")}:throne:`)}
32 | ${chalk.red.bold(`In:::the${chalk.yellow(' / :::: Java ::::: \\ ')}Land::of`)}
33 | ${chalk.red.bold(`JHipster${chalk.yellow(' \\ ::: Hipster ::: / ')}:where::`)}
34 | ${chalk.red.bold(` ::the:::${chalk.yellow(" '. ':::::::::::::' ,' ")}Shadows:`)}
35 | ${chalk.red.bold(` lie::One${chalk.yellow(" `. ``:::::::::'' ,' ")}Module::to`)}
36 | ${chalk.red.bold(` ::rule::${chalk.yellow(" `-._```:'''_,-' ")}::them::`)}
37 | ${chalk.red.bold(` all,::One${chalk.yellow(" `-----' ")}Module::to`)}
38 | ${chalk.red.bold(' ::find::: them,:One')}
39 | ${chalk.red.bold(' Module:::::to bring::them')}
40 | ${chalk.red.bold(' all::and::in:the:darkness:bind')}
41 | ${chalk.red.bold(' them:In:the:Land:of:JHipster')}
42 | ${chalk.red.bold(' where:::the::Shadows')}
43 | ${chalk.red.bold(' :::lie.:::')}\n`);
44 | this.log(chalk.white.bold(' http://www.jhipster.tech\n'));
45 | this.log(
46 | chalk.white(`Welcome to the ${chalk.bold('JHipster Module')} Generator! ${chalk.yellow(`v${packagejs.version}\n`)}`)
47 | );
48 | },
49 | initConstants() {
50 | this.NODE_VERSION = constants.NODE_VERSION;
51 | },
52 | };
53 | }
54 |
55 | prompting() {
56 | const done = this.async();
57 | const prompts = [
58 | {
59 | type: 'input',
60 | name: 'moduleName',
61 | validate: validateModuleName,
62 | message: 'What is the base name of your module?',
63 | default: 'helloworld',
64 | },
65 | {
66 | type: 'input',
67 | name: 'moduleDescription',
68 | message: 'Give a description of your module',
69 | },
70 | {
71 | type: 'list',
72 | name: 'hook',
73 | message: 'Do you want to enable hooks for your module from JHipster generator?',
74 | choices: [
75 | {
76 | name: 'No, This is a standalone module',
77 | value: 'none',
78 | },
79 | {
80 | name: 'Yes, Enable post entity hook',
81 | value: 'postEntity',
82 | },
83 | ],
84 | default: 'none',
85 | },
86 | {
87 | when: props => props.hook !== 'none',
88 | type: 'list',
89 | name: 'hookCallback',
90 | message: 'Do you want to add a subgenerator for this hook?',
91 | choices: [
92 | { name: 'Yes, Add a subgenerator', value: 'entity' },
93 | { name: 'No, Hook to default generator', value: 'app' },
94 | ],
95 | default: 'entity',
96 | },
97 | {
98 | type: 'input',
99 | name: 'githubName',
100 | validate: validateGitHubName,
101 | store: true,
102 | message: 'What is your GitHub username?',
103 | },
104 | {
105 | type: 'input',
106 | name: 'authorName',
107 | message: 'Who are you? Firstname Lastname',
108 | default: 'Firstname Lastname',
109 | store: true,
110 | },
111 | {
112 | type: 'input',
113 | name: 'authorEmail',
114 | message: 'Your email?',
115 | store: true,
116 | },
117 | {
118 | type: 'input',
119 | name: 'authorUrl',
120 | message: 'Your home page url?',
121 | store: true,
122 | },
123 | {
124 | type: 'list',
125 | name: 'license',
126 | message: 'Do you want to add a license?',
127 | choices: [
128 | { name: 'No license', value: 'no' },
129 | { name: 'Apache License 2.0', value: 'apache' },
130 | { name: 'GNU General Public License v3.0', value: 'gnu' },
131 | { name: 'MIT License', value: 'mit' },
132 | ],
133 | default: 'no',
134 | },
135 | ];
136 |
137 | this.prompt(prompts).then(props => {
138 | this.props = props;
139 | this.moduleName = props.moduleName;
140 | this.moduleDescription = props.moduleDescription;
141 | this.hook = props.hook;
142 | this.hookCallback = props.hookCallback;
143 | if (this.hook === 'postEntity') {
144 | this.hookType = 'post';
145 | this.hookFor = 'entity';
146 | }
147 | this.githubName = props.githubName;
148 | this.authorName = props.authorName;
149 | this.authorEmail = props.authorEmail;
150 | this.authorUrl = props.authorUrl;
151 | this.license = props.license;
152 | done();
153 | });
154 | }
155 |
156 | writing() {
157 | // function to use directly template
158 | this.template = function (source, destination) {
159 | this.fs.copyTpl(this.templatePath(source), this.destinationPath(destination), this);
160 | };
161 |
162 | // copy general files
163 | this.template('.github/workflows/github-ci.yml.ejs', '.github/workflows/github-ci.yml');
164 | this.template('.prettierrc', '.prettierrc');
165 | this.template('.prettierignore', '.prettierignore');
166 | this.template('.editorconfig', '.editorconfig');
167 | this.template('.eslintignore', '.eslintignore');
168 | this.template('.eslintrc.json', '.eslintrc.json');
169 | this.template('.gitattributes', '.gitattributes');
170 | this.template('.gitignore.ejs', '.gitignore');
171 | this.template('package.json.ejs', 'package.json');
172 | if (this.license === 'apache') {
173 | this.template('LICENSE_APACHE.ejs', 'LICENSE');
174 | } else if (this.license === 'gpl') {
175 | this.template('LICENSE_GPL.ejs', 'LICENSE');
176 | } else if (this.license === 'mit') {
177 | this.template('LICENSE_MIT.ejs', 'LICENSE');
178 | }
179 | this.template('README.md.ejs', 'README.md');
180 |
181 | // copy files for test
182 | mkdirp('test/templates/default');
183 | this.template('test/templates/gradle-react/.yo-rc.json', 'test/templates/gradle-react/.yo-rc.json');
184 | this.template('test/templates/maven-angularX/.yo-rc.json', 'test/templates/maven-angularX/.yo-rc.json');
185 | this.template('test/templates/maven-vue/.yo-rc.json', 'test/templates/maven-vue/.yo-rc.json');
186 | this.template('test/app.spec.js.ejs', 'test/app.spec.js');
187 |
188 | // copy files for the generator
189 | mkdirp('generators/app/templates');
190 | this.template('generators/app/index.js.ejs', 'generators/app/index.js');
191 | this.template('generators/app/templates/dummy.txt.ejs', 'generators/app/templates/dummy.txt');
192 |
193 | // copy files for the hook
194 | if (this.hook === 'none' || this.hookCallback === 'app') {
195 | return;
196 | }
197 | mkdirp('generators/entity/templates');
198 | this.template('generators/entity/index.js.ejs', 'generators/entity/index.js');
199 | this.template('generators/entity/templates/dummy.txt.ejs', 'generators/entity/templates/dummy.txt');
200 | }
201 |
202 | end() {
203 | this.log(`\n${chalk.bold.green('##### USAGE #####')}`);
204 | this.log('To begin to work:');
205 | this.log(`- launch: ${chalk.yellow.bold('npm install')} or ${chalk.yellow.bold('yarn install')}`);
206 | this.log(`- link: ${chalk.yellow.bold('npm link')} or ${chalk.yellow.bold('yarn link')}`);
207 | this.log('- test your module in a JHipster project: ');
208 | this.log(' - go into your JHipster project');
209 | this.log(
210 | ` - link to your module: ${chalk.yellow.bold(`npm link generator-jhipster-${this.moduleName}`)} or ${chalk.yellow.bold(
211 | `yarn link generator-jhipster-${this.moduleName}`
212 | )}`
213 | );
214 | this.log(` - launch your module: ${chalk.yellow.bold(`yo jhipster-${this.moduleName}`)}`);
215 | this.log('- then, come back here, and begin to code!\n');
216 | }
217 | };
218 |
--------------------------------------------------------------------------------
/generators/app/input-validation.js:
--------------------------------------------------------------------------------
1 | const validateGitHubName = input => {
2 | if (/^([a-zA-Z0-9]+)(-([a-zA-Z0-9])+)*$/.test(input) && input !== '') return true;
3 | return 'Your username is mandatory, cannot contain special characters or a blank space';
4 | };
5 |
6 | const validateModuleName = input =>
7 | /^[a-zA-Z0-9-]+$/.test(input)
8 | ? true
9 | : 'Your module name is mandatory, cannot contain special characters or a blank space, using the default name instead';
10 |
11 | module.exports = { validateGitHubName, validateModuleName };
12 |
--------------------------------------------------------------------------------
/generators/app/templates/.editorconfig:
--------------------------------------------------------------------------------
1 | # editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 4
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [*.md]
13 | trim_trailing_whitespace = false
14 |
15 | [package.json]
16 | indent_style = space
17 | indent_size = 2
18 |
--------------------------------------------------------------------------------
/generators/app/templates/.eslintignore:
--------------------------------------------------------------------------------
1 | coverage
2 | generators/**/templates
3 | node_modules
4 | travis
5 |
--------------------------------------------------------------------------------
/generators/app/templates/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "node": true,
4 | "es6": true
5 | },
6 | "extends": ["airbnb-base", "plugin:prettier/recommended"],
7 | "rules": {
8 | "prettier/prettier": "error",
9 | "indent": [2, 4],
10 | "linebreak-style": 0,
11 | "eol-last": 2,
12 | "quotes": [2, "single"],
13 | "semi": [2, "always"],
14 | "eqeqeq": [2, "smart"],
15 | "no-use-before-define": [2, "nofunc"],
16 | "no-unused-vars": [2, {"vars": "local", "args": "none"}],
17 | "no-multi-str": 2,
18 | "no-irregular-whitespace": 2,
19 | "comma-dangle": "off",
20 | "max-len": "off",
21 | "func-names": "off",
22 | "class-methods-use-this": "off",
23 | "no-underscore-dangle": "off",
24 | "no-plusplus": "off",
25 | "no-unused-expressions": [2, { "allowShortCircuit": true, "allowTernary": true } ],
26 | "prefer-destructuring": "off",
27 | "no-multi-assign": "off",
28 | "no-param-reassign": "off",
29 | "no-shadow": "off"
30 | },
31 | "overrides": [
32 | {
33 | "files": ["test/**/*.js"],
34 | "env": { "mocha": true }
35 | }
36 | ]
37 | }
38 |
--------------------------------------------------------------------------------
/generators/app/templates/.gitattributes:
--------------------------------------------------------------------------------
1 | # All text files should have the "lf" (Unix) line endings
2 | * text eol=lf
3 |
4 | # Explicitly declare text files you want to always be normalized and converted
5 | # to native line endings on checkout.
6 | *.java text
7 | *.js text
8 | *.css text
9 | *.html text
10 |
11 | # Denote all files that are truly binary and should not be modified.
12 | *.png binary
13 | *.jpg binary
14 | *.jar binary
15 | *.pdf binary
16 | *.eot binary
17 | *.ttf binary
18 | *.gzip binary
19 | *.gz binary
20 | *.ai binary
21 | *.eps binary
22 |
--------------------------------------------------------------------------------
/generators/app/templates/.github/workflows/github-ci.yml.ejs:
--------------------------------------------------------------------------------
1 | name: Build
2 | on: [push, pull_request]
3 | jobs:
4 | unit-tests:
5 | name: unit tests
6 | runs-on: ubuntu-latest
7 | timeout-minutes: 40
8 | steps:
9 | - uses: actions/checkout@v2
10 | - uses: actions/setup-node@v2
11 | with:
12 | node-version: <%= NODE_VERSION %>
13 | - name: Install node.js packages
14 | run: npm install
15 | - name: Run generator tests
16 | run: npm test
17 | integration-tests:
18 | name: integration tests
19 | runs-on: ubuntu-latest
20 | strategy:
21 | matrix:
22 | sample: [maven-angularX, gradle-react]
23 | timeout-minutes: 40
24 | defaults:
25 | run:
26 | working-directory: app
27 | steps:
28 | - uses: actions/checkout@v2
29 | with:
30 | path: generator-jhipster-<%= moduleName %>
31 | - uses: actions/setup-node@v2
32 | with:
33 | node-version: <%= NODE_VERSION %>
34 | - name: Install node.js packages
35 | run: npm install
36 | working-directory: generator-jhipster-<%= moduleName %>
37 | - name: Link module
38 | run: npm link
39 | working-directory: generator-jhipster-<%= moduleName %>
40 | - name: Create app dir
41 | run: mkdir app
42 | working-directory: ${{ github.workspace }}
43 | - name: Install tools
44 | run: npm install -g yo
45 | - name: Install JHipster
46 | run: npm install -g generator-jhipster
47 | - name: Prepare temporary directory
48 | run: |
49 | cp -r ./test-integration/samples/${{ matrix.sample }} ../app/
50 | cp -r ./test-integration/samples/.jhipster ../app/${{ matrix.sample }}
51 | working-directory: generator-jhipster-<%= moduleName %>
52 | - name: Generate project
53 | run: |
54 | jhipster --with-entities --no-insight
55 | yo jhipster-<%= moduleName %> default --force
56 | - name: Run backend tests
57 | run: npm run ci:backend:test
58 | - name: Run frontend tests
59 | run: npm run ci:frontend:test
60 |
--------------------------------------------------------------------------------
/generators/app/templates/.gitignore.ejs:
--------------------------------------------------------------------------------
1 | node_modules
2 | coverage
3 | .idea
4 | *.iml
5 | *.ipr
6 | *.iws
7 | atlassian-ide-plugin.xml
8 | /.project
9 | test/temp/
10 | *debug.log*
11 | .vscode
12 |
--------------------------------------------------------------------------------
/generators/app/templates/.prettierignore:
--------------------------------------------------------------------------------
1 | package-lock.json
2 | generators/**/templates/**
3 |
--------------------------------------------------------------------------------
/generators/app/templates/.prettierrc:
--------------------------------------------------------------------------------
1 | # Prettier configuration
2 | printWidth: 140
3 | singleQuote: true
4 | tabWidth: 2
5 | useTabs: false
6 |
7 | # js and ts rules:
8 | arrowParens: avoid
9 | overrides:
10 | - files: '*.js'
11 | options:
12 | tabWidth: 4
13 |
--------------------------------------------------------------------------------
/generators/app/templates/LICENSE_APACHE.ejs:
--------------------------------------------------------------------------------
1 |
2 | Copyright <%= new Date().getFullYear() %> <%= authorName %>
3 |
4 | Apache License
5 | Version 2.0, January 2004
6 | http://www.apache.org/licenses/
7 |
8 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
9 |
10 | 1. Definitions.
11 |
12 | "License" shall mean the terms and conditions for use, reproduction,
13 | and distribution as defined by Sections 1 through 9 of this document.
14 |
15 | "Licensor" shall mean the copyright owner or entity authorized by
16 | the copyright owner that is granting the License.
17 |
18 | "Legal Entity" shall mean the union of the acting entity and all
19 | other entities that control, are controlled by, or are under common
20 | control with that entity. For the purposes of this definition,
21 | "control" means (i) the power, direct or indirect, to cause the
22 | direction or management of such entity, whether by contract or
23 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
24 | outstanding shares, or (iii) beneficial ownership of such entity.
25 |
26 | "You" (or "Your") shall mean an individual or Legal Entity
27 | exercising permissions granted by this License.
28 |
29 | "Source" form shall mean the preferred form for making modifications,
30 | including but not limited to software source code, documentation
31 | source, and configuration files.
32 |
33 | "Object" form shall mean any form resulting from mechanical
34 | transformation or translation of a Source form, including but
35 | not limited to compiled object code, generated documentation,
36 | and conversions to other media types.
37 |
38 | "Work" shall mean the work of authorship, whether in Source or
39 | Object form, made available under the License, as indicated by a
40 | copyright notice that is included in or attached to the work
41 | (an example is provided in the Appendix below).
42 |
43 | "Derivative Works" shall mean any work, whether in Source or Object
44 | form, that is based on (or derived from) the Work and for which the
45 | editorial revisions, annotations, elaborations, or other modifications
46 | represent, as a whole, an original work of authorship. For the purposes
47 | of this License, Derivative Works shall not include works that remain
48 | separable from, or merely link (or bind by name) to the interfaces of,
49 | the Work and Derivative Works thereof.
50 |
51 | "Contribution" shall mean any work of authorship, including
52 | the original version of the Work and any modifications or additions
53 | to that Work or Derivative Works thereof, that is intentionally
54 | submitted to Licensor for inclusion in the Work by the copyright owner
55 | or by an individual or Legal Entity authorized to submit on behalf of
56 | the copyright owner. For the purposes of this definition, "submitted"
57 | means any form of electronic, verbal, or written communication sent
58 | to the Licensor or its representatives, including but not limited to
59 | communication on electronic mailing lists, source code control systems,
60 | and issue tracking systems that are managed by, or on behalf of, the
61 | Licensor for the purpose of discussing and improving the Work, but
62 | excluding communication that is conspicuously marked or otherwise
63 | designated in writing by the copyright owner as "Not a Contribution."
64 |
65 | "Contributor" shall mean Licensor and any individual or Legal Entity
66 | on behalf of whom a Contribution has been received by Licensor and
67 | subsequently incorporated within the Work.
68 |
69 | 2. Grant of Copyright License. Subject to the terms and conditions of
70 | this License, each Contributor hereby grants to You a perpetual,
71 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
72 | copyright license to reproduce, prepare Derivative Works of,
73 | publicly display, publicly perform, sublicense, and distribute the
74 | Work and such Derivative Works in Source or Object form.
75 |
76 | 3. Grant of Patent License. Subject to the terms and conditions of
77 | this License, each Contributor hereby grants to You a perpetual,
78 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
79 | (except as stated in this section) patent license to make, have made,
80 | use, offer to sell, sell, import, and otherwise transfer the Work,
81 | where such license applies only to those patent claims licensable
82 | by such Contributor that are necessarily infringed by their
83 | Contribution(s) alone or by combination of their Contribution(s)
84 | with the Work to which such Contribution(s) was submitted. If You
85 | institute patent litigation against any entity (including a
86 | cross-claim or counterclaim in a lawsuit) alleging that the Work
87 | or a Contribution incorporated within the Work constitutes direct
88 | or contributory patent infringement, then any patent licenses
89 | granted to You under this License for that Work shall terminate
90 | as of the date such litigation is filed.
91 |
92 | 4. Redistribution. You may reproduce and distribute copies of the
93 | Work or Derivative Works thereof in any medium, with or without
94 | modifications, and in Source or Object form, provided that You
95 | meet the following conditions:
96 |
97 | (a) You must give any other recipients of the Work or
98 | Derivative Works a copy of this License; and
99 |
100 | (b) You must cause any modified files to carry prominent notices
101 | stating that You changed the files; and
102 |
103 | (c) You must retain, in the Source form of any Derivative Works
104 | that You distribute, all copyright, patent, trademark, and
105 | attribution notices from the Source form of the Work,
106 | excluding those notices that do not pertain to any part of
107 | the Derivative Works; and
108 |
109 | (d) If the Work includes a "NOTICE" text file as part of its
110 | distribution, then any Derivative Works that You distribute must
111 | include a readable copy of the attribution notices contained
112 | within such NOTICE file, excluding those notices that do not
113 | pertain to any part of the Derivative Works, in at least one
114 | of the following places: within a NOTICE text file distributed
115 | as part of the Derivative Works; within the Source form or
116 | documentation, if provided along with the Derivative Works; or,
117 | within a display generated by the Derivative Works, if and
118 | wherever such third-party notices normally appear. The contents
119 | of the NOTICE file are for informational purposes only and
120 | do not modify the License. You may add Your own attribution
121 | notices within Derivative Works that You distribute, alongside
122 | or as an addendum to the NOTICE text from the Work, provided
123 | that such additional attribution notices cannot be construed
124 | as modifying the License.
125 |
126 | You may add Your own copyright statement to Your modifications and
127 | may provide additional or different license terms and conditions
128 | for use, reproduction, or distribution of Your modifications, or
129 | for any such Derivative Works as a whole, provided Your use,
130 | reproduction, and distribution of the Work otherwise complies with
131 | the conditions stated in this License.
132 |
133 | 5. Submission of Contributions. Unless You explicitly state otherwise,
134 | any Contribution intentionally submitted for inclusion in the Work
135 | by You to the Licensor shall be under the terms and conditions of
136 | this License, without any additional terms or conditions.
137 | Notwithstanding the above, nothing herein shall supersede or modify
138 | the terms of any separate license agreement you may have executed
139 | with Licensor regarding such Contributions.
140 |
141 | 6. Trademarks. This License does not grant permission to use the trade
142 | names, trademarks, service marks, or product names of the Licensor,
143 | except as required for reasonable and customary use in describing the
144 | origin of the Work and reproducing the content of the NOTICE file.
145 |
146 | 7. Disclaimer of Warranty. Unless required by applicable law or
147 | agreed to in writing, Licensor provides the Work (and each
148 | Contributor provides its Contributions) on an "AS IS" BASIS,
149 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
150 | implied, including, without limitation, any warranties or conditions
151 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
152 | PARTICULAR PURPOSE. You are solely responsible for determining the
153 | appropriateness of using or redistributing the Work and assume any
154 | risks associated with Your exercise of permissions under this License.
155 |
156 | 8. Limitation of Liability. In no event and under no legal theory,
157 | whether in tort (including negligence), contract, or otherwise,
158 | unless required by applicable law (such as deliberate and grossly
159 | negligent acts) or agreed to in writing, shall any Contributor be
160 | liable to You for damages, including any direct, indirect, special,
161 | incidental, or consequential damages of any character arising as a
162 | result of this License or out of the use or inability to use the
163 | Work (including but not limited to damages for loss of goodwill,
164 | work stoppage, computer failure or malfunction, or any and all
165 | other commercial damages or losses), even if such Contributor
166 | has been advised of the possibility of such damages.
167 |
168 | 9. Accepting Warranty or Additional Liability. While redistributing
169 | the Work or Derivative Works thereof, You may choose to offer,
170 | and charge a fee for, acceptance of support, warranty, indemnity,
171 | or other liability obligations and/or rights consistent with this
172 | License. However, in accepting such obligations, You may act only
173 | on Your own behalf and on Your sole responsibility, not on behalf
174 | of any other Contributor, and only if You agree to indemnify,
175 | defend, and hold each Contributor harmless for any liability
176 | incurred by, or claims asserted against, such Contributor by reason
177 | of your accepting any such warranty or additional liability.
178 |
179 | END OF TERMS AND CONDITIONS
180 |
181 | APPENDIX: How to apply the Apache License to your work.
182 |
183 | To apply the Apache License to your work, attach the following
184 | boilerplate notice, with the fields enclosed by brackets "[]"
185 | replaced with your own identifying information. (Don't include
186 | the brackets!) The text should be enclosed in the appropriate
187 | comment syntax for the file format. We also recommend that a
188 | file or class name and description of purpose be included on the
189 | same "printed page" as the copyright notice for easier
190 | identification within third-party archives.
191 |
192 | Copyright [yyyy] [name of copyright owner]
193 |
194 | Licensed under the Apache License, Version 2.0 (the "License");
195 | you may not use this file except in compliance with the License.
196 | You may obtain a copy of the License at
197 |
198 | http://www.apache.org/licenses/LICENSE-2.0
199 |
200 | Unless required by applicable law or agreed to in writing, software
201 | distributed under the License is distributed on an "AS IS" BASIS,
202 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
203 | See the License for the specific language governing permissions and
204 | limitations under the License.
205 |
--------------------------------------------------------------------------------
/generators/app/templates/LICENSE_GPL.ejs:
--------------------------------------------------------------------------------
1 |
2 | generator-jhipster-<%= moduleName %> Copyright (C) <%= new Date().getFullYear() %> <%= authorName %>
3 |
4 |
5 | GNU GENERAL PUBLIC LICENSE
6 | Version 3, 29 June 2007
7 |
8 | Copyright (C) 2007 Free Software Foundation, Inc.
9 | Everyone is permitted to copy and distribute verbatim copies
10 | of this license document, but changing it is not allowed.
11 |
12 | Preamble
13 |
14 | The GNU General Public License is a free, copyleft license for
15 | software and other kinds of works.
16 |
17 | The licenses for most software and other practical works are designed
18 | to take away your freedom to share and change the works. By contrast,
19 | the GNU General Public License is intended to guarantee your freedom to
20 | share and change all versions of a program--to make sure it remains free
21 | software for all its users. We, the Free Software Foundation, use the
22 | GNU General Public License for most of our software; it applies also to
23 | any other work released this way by its authors. You can apply it to
24 | your programs, too.
25 |
26 | When we speak of free software, we are referring to freedom, not
27 | price. Our General Public Licenses are designed to make sure that you
28 | have the freedom to distribute copies of free software (and charge for
29 | them if you wish), that you receive source code or can get it if you
30 | want it, that you can change the software or use pieces of it in new
31 | free programs, and that you know you can do these things.
32 |
33 | To protect your rights, we need to prevent others from denying you
34 | these rights or asking you to surrender the rights. Therefore, you have
35 | certain responsibilities if you distribute copies of the software, or if
36 | you modify it: responsibilities to respect the freedom of others.
37 |
38 | For example, if you distribute copies of such a program, whether
39 | gratis or for a fee, you must pass on to the recipients the same
40 | freedoms that you received. You must make sure that they, too, receive
41 | or can get the source code. And you must show them these terms so they
42 | know their rights.
43 |
44 | Developers that use the GNU GPL protect your rights with two steps:
45 | (1) assert copyright on the software, and (2) offer you this License
46 | giving you legal permission to copy, distribute and/or modify it.
47 |
48 | For the developers' and authors' protection, the GPL clearly explains
49 | that there is no warranty for this free software. For both users' and
50 | authors' sake, the GPL requires that modified versions be marked as
51 | changed, so that their problems will not be attributed erroneously to
52 | authors of previous versions.
53 |
54 | Some devices are designed to deny users access to install or run
55 | modified versions of the software inside them, although the manufacturer
56 | can do so. This is fundamentally incompatible with the aim of
57 | protecting users' freedom to change the software. The systematic
58 | pattern of such abuse occurs in the area of products for individuals to
59 | use, which is precisely where it is most unacceptable. Therefore, we
60 | have designed this version of the GPL to prohibit the practice for those
61 | products. If such problems arise substantially in other domains, we
62 | stand ready to extend this provision to those domains in future versions
63 | of the GPL, as needed to protect the freedom of users.
64 |
65 | Finally, every program is threatened constantly by software patents.
66 | States should not allow patents to restrict development and use of
67 | software on general-purpose computers, but in those that do, we wish to
68 | avoid the special danger that patents applied to a free program could
69 | make it effectively proprietary. To prevent this, the GPL assures that
70 | patents cannot be used to render the program non-free.
71 |
72 | The precise terms and conditions for copying, distribution and
73 | modification follow.
74 |
75 | TERMS AND CONDITIONS
76 |
77 | 0. Definitions.
78 |
79 | "This License" refers to version 3 of the GNU General Public License.
80 |
81 | "Copyright" also means copyright-like laws that apply to other kinds of
82 | works, such as semiconductor masks.
83 |
84 | "The Program" refers to any copyrightable work licensed under this
85 | License. Each licensee is addressed as "you". "Licensees" and
86 | "recipients" may be individuals or organizations.
87 |
88 | To "modify" a work means to copy from or adapt all or part of the work
89 | in a fashion requiring copyright permission, other than the making of an
90 | exact copy. The resulting work is called a "modified version" of the
91 | earlier work or a work "based on" the earlier work.
92 |
93 | A "covered work" means either the unmodified Program or a work based
94 | on the Program.
95 |
96 | To "propagate" a work means to do anything with it that, without
97 | permission, would make you directly or secondarily liable for
98 | infringement under applicable copyright law, except executing it on a
99 | computer or modifying a private copy. Propagation includes copying,
100 | distribution (with or without modification), making available to the
101 | public, and in some countries other activities as well.
102 |
103 | To "convey" a work means any kind of propagation that enables other
104 | parties to make or receive copies. Mere interaction with a user through
105 | a computer network, with no transfer of a copy, is not conveying.
106 |
107 | An interactive user interface displays "Appropriate Legal Notices"
108 | to the extent that it includes a convenient and prominently visible
109 | feature that (1) displays an appropriate copyright notice, and (2)
110 | tells the user that there is no warranty for the work (except to the
111 | extent that warranties are provided), that licensees may convey the
112 | work under this License, and how to view a copy of this License. If
113 | the interface presents a list of user commands or options, such as a
114 | menu, a prominent item in the list meets this criterion.
115 |
116 | 1. Source Code.
117 |
118 | The "source code" for a work means the preferred form of the work
119 | for making modifications to it. "Object code" means any non-source
120 | form of a work.
121 |
122 | A "Standard Interface" means an interface that either is an official
123 | standard defined by a recognized standards body, or, in the case of
124 | interfaces specified for a particular programming language, one that
125 | is widely used among developers working in that language.
126 |
127 | The "System Libraries" of an executable work include anything, other
128 | than the work as a whole, that (a) is included in the normal form of
129 | packaging a Major Component, but which is not part of that Major
130 | Component, and (b) serves only to enable use of the work with that
131 | Major Component, or to implement a Standard Interface for which an
132 | implementation is available to the public in source code form. A
133 | "Major Component", in this context, means a major essential component
134 | (kernel, window system, and so on) of the specific operating system
135 | (if any) on which the executable work runs, or a compiler used to
136 | produce the work, or an object code interpreter used to run it.
137 |
138 | The "Corresponding Source" for a work in object code form means all
139 | the source code needed to generate, install, and (for an executable
140 | work) run the object code and to modify the work, including scripts to
141 | control those activities. However, it does not include the work's
142 | System Libraries, or general-purpose tools or generally available free
143 | programs which are used unmodified in performing those activities but
144 | which are not part of the work. For example, Corresponding Source
145 | includes interface definition files associated with source files for
146 | the work, and the source code for shared libraries and dynamically
147 | linked subprograms that the work is specifically designed to require,
148 | such as by intimate data communication or control flow between those
149 | subprograms and other parts of the work.
150 |
151 | The Corresponding Source need not include anything that users
152 | can regenerate automatically from other parts of the Corresponding
153 | Source.
154 |
155 | The Corresponding Source for a work in source code form is that
156 | same work.
157 |
158 | 2. Basic Permissions.
159 |
160 | All rights granted under this License are granted for the term of
161 | copyright on the Program, and are irrevocable provided the stated
162 | conditions are met. This License explicitly affirms your unlimited
163 | permission to run the unmodified Program. The output from running a
164 | covered work is covered by this License only if the output, given its
165 | content, constitutes a covered work. This License acknowledges your
166 | rights of fair use or other equivalent, as provided by copyright law.
167 |
168 | You may make, run and propagate covered works that you do not
169 | convey, without conditions so long as your license otherwise remains
170 | in force. You may convey covered works to others for the sole purpose
171 | of having them make modifications exclusively for you, or provide you
172 | with facilities for running those works, provided that you comply with
173 | the terms of this License in conveying all material for which you do
174 | not control copyright. Those thus making or running the covered works
175 | for you must do so exclusively on your behalf, under your direction
176 | and control, on terms that prohibit them from making any copies of
177 | your copyrighted material outside their relationship with you.
178 |
179 | Conveying under any other circumstances is permitted solely under
180 | the conditions stated below. Sublicensing is not allowed; section 10
181 | makes it unnecessary.
182 |
183 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
184 |
185 | No covered work shall be deemed part of an effective technological
186 | measure under any applicable law fulfilling obligations under article
187 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
188 | similar laws prohibiting or restricting circumvention of such
189 | measures.
190 |
191 | When you convey a covered work, you waive any legal power to forbid
192 | circumvention of technological measures to the extent such circumvention
193 | is effected by exercising rights under this License with respect to
194 | the covered work, and you disclaim any intention to limit operation or
195 | modification of the work as a means of enforcing, against the work's
196 | users, your or third parties' legal rights to forbid circumvention of
197 | technological measures.
198 |
199 | 4. Conveying Verbatim Copies.
200 |
201 | You may convey verbatim copies of the Program's source code as you
202 | receive it, in any medium, provided that you conspicuously and
203 | appropriately publish on each copy an appropriate copyright notice;
204 | keep intact all notices stating that this License and any
205 | non-permissive terms added in accord with section 7 apply to the code;
206 | keep intact all notices of the absence of any warranty; and give all
207 | recipients a copy of this License along with the Program.
208 |
209 | You may charge any price or no price for each copy that you convey,
210 | and you may offer support or warranty protection for a fee.
211 |
212 | 5. Conveying Modified Source Versions.
213 |
214 | You may convey a work based on the Program, or the modifications to
215 | produce it from the Program, in the form of source code under the
216 | terms of section 4, provided that you also meet all of these conditions:
217 |
218 | a) The work must carry prominent notices stating that you modified
219 | it, and giving a relevant date.
220 |
221 | b) The work must carry prominent notices stating that it is
222 | released under this License and any conditions added under section
223 | 7. This requirement modifies the requirement in section 4 to
224 | "keep intact all notices".
225 |
226 | c) You must license the entire work, as a whole, under this
227 | License to anyone who comes into possession of a copy. This
228 | License will therefore apply, along with any applicable section 7
229 | additional terms, to the whole of the work, and all its parts,
230 | regardless of how they are packaged. This License gives no
231 | permission to license the work in any other way, but it does not
232 | invalidate such permission if you have separately received it.
233 |
234 | d) If the work has interactive user interfaces, each must display
235 | Appropriate Legal Notices; however, if the Program has interactive
236 | interfaces that do not display Appropriate Legal Notices, your
237 | work need not make them do so.
238 |
239 | A compilation of a covered work with other separate and independent
240 | works, which are not by their nature extensions of the covered work,
241 | and which are not combined with it such as to form a larger program,
242 | in or on a volume of a storage or distribution medium, is called an
243 | "aggregate" if the compilation and its resulting copyright are not
244 | used to limit the access or legal rights of the compilation's users
245 | beyond what the individual works permit. Inclusion of a covered work
246 | in an aggregate does not cause this License to apply to the other
247 | parts of the aggregate.
248 |
249 | 6. Conveying Non-Source Forms.
250 |
251 | You may convey a covered work in object code form under the terms
252 | of sections 4 and 5, provided that you also convey the
253 | machine-readable Corresponding Source under the terms of this License,
254 | in one of these ways:
255 |
256 | a) Convey the object code in, or embodied in, a physical product
257 | (including a physical distribution medium), accompanied by the
258 | Corresponding Source fixed on a durable physical medium
259 | customarily used for software interchange.
260 |
261 | b) Convey the object code in, or embodied in, a physical product
262 | (including a physical distribution medium), accompanied by a
263 | written offer, valid for at least three years and valid for as
264 | long as you offer spare parts or customer support for that product
265 | model, to give anyone who possesses the object code either (1) a
266 | copy of the Corresponding Source for all the software in the
267 | product that is covered by this License, on a durable physical
268 | medium customarily used for software interchange, for a price no
269 | more than your reasonable cost of physically performing this
270 | conveying of source, or (2) access to copy the
271 | Corresponding Source from a network server at no charge.
272 |
273 | c) Convey individual copies of the object code with a copy of the
274 | written offer to provide the Corresponding Source. This
275 | alternative is allowed only occasionally and noncommercially, and
276 | only if you received the object code with such an offer, in accord
277 | with subsection 6b.
278 |
279 | d) Convey the object code by offering access from a designated
280 | place (gratis or for a charge), and offer equivalent access to the
281 | Corresponding Source in the same way through the same place at no
282 | further charge. You need not require recipients to copy the
283 | Corresponding Source along with the object code. If the place to
284 | copy the object code is a network server, the Corresponding Source
285 | may be on a different server (operated by you or a third party)
286 | that supports equivalent copying facilities, provided you maintain
287 | clear directions next to the object code saying where to find the
288 | Corresponding Source. Regardless of what server hosts the
289 | Corresponding Source, you remain obligated to ensure that it is
290 | available for as long as needed to satisfy these requirements.
291 |
292 | e) Convey the object code using peer-to-peer transmission, provided
293 | you inform other peers where the object code and Corresponding
294 | Source of the work are being offered to the general public at no
295 | charge under subsection 6d.
296 |
297 | A separable portion of the object code, whose source code is excluded
298 | from the Corresponding Source as a System Library, need not be
299 | included in conveying the object code work.
300 |
301 | A "User Product" is either (1) a "consumer product", which means any
302 | tangible personal property which is normally used for personal, family,
303 | or household purposes, or (2) anything designed or sold for incorporation
304 | into a dwelling. In determining whether a product is a consumer product,
305 | doubtful cases shall be resolved in favor of coverage. For a particular
306 | product received by a particular user, "normally used" refers to a
307 | typical or common use of that class of product, regardless of the status
308 | of the particular user or of the way in which the particular user
309 | actually uses, or expects or is expected to use, the product. A product
310 | is a consumer product regardless of whether the product has substantial
311 | commercial, industrial or non-consumer uses, unless such uses represent
312 | the only significant mode of use of the product.
313 |
314 | "Installation Information" for a User Product means any methods,
315 | procedures, authorization keys, or other information required to install
316 | and execute modified versions of a covered work in that User Product from
317 | a modified version of its Corresponding Source. The information must
318 | suffice to ensure that the continued functioning of the modified object
319 | code is in no case prevented or interfered with solely because
320 | modification has been made.
321 |
322 | If you convey an object code work under this section in, or with, or
323 | specifically for use in, a User Product, and the conveying occurs as
324 | part of a transaction in which the right of possession and use of the
325 | User Product is transferred to the recipient in perpetuity or for a
326 | fixed term (regardless of how the transaction is characterized), the
327 | Corresponding Source conveyed under this section must be accompanied
328 | by the Installation Information. But this requirement does not apply
329 | if neither you nor any third party retains the ability to install
330 | modified object code on the User Product (for example, the work has
331 | been installed in ROM).
332 |
333 | The requirement to provide Installation Information does not include a
334 | requirement to continue to provide support service, warranty, or updates
335 | for a work that has been modified or installed by the recipient, or for
336 | the User Product in which it has been modified or installed. Access to a
337 | network may be denied when the modification itself materially and
338 | adversely affects the operation of the network or violates the rules and
339 | protocols for communication across the network.
340 |
341 | Corresponding Source conveyed, and Installation Information provided,
342 | in accord with this section must be in a format that is publicly
343 | documented (and with an implementation available to the public in
344 | source code form), and must require no special password or key for
345 | unpacking, reading or copying.
346 |
347 | 7. Additional Terms.
348 |
349 | "Additional permissions" are terms that supplement the terms of this
350 | License by making exceptions from one or more of its conditions.
351 | Additional permissions that are applicable to the entire Program shall
352 | be treated as though they were included in this License, to the extent
353 | that they are valid under applicable law. If additional permissions
354 | apply only to part of the Program, that part may be used separately
355 | under those permissions, but the entire Program remains governed by
356 | this License without regard to the additional permissions.
357 |
358 | When you convey a copy of a covered work, you may at your option
359 | remove any additional permissions from that copy, or from any part of
360 | it. (Additional permissions may be written to require their own
361 | removal in certain cases when you modify the work.) You may place
362 | additional permissions on material, added by you to a covered work,
363 | for which you have or can give appropriate copyright permission.
364 |
365 | Notwithstanding any other provision of this License, for material you
366 | add to a covered work, you may (if authorized by the copyright holders of
367 | that material) supplement the terms of this License with terms:
368 |
369 | a) Disclaiming warranty or limiting liability differently from the
370 | terms of sections 15 and 16 of this License; or
371 |
372 | b) Requiring preservation of specified reasonable legal notices or
373 | author attributions in that material or in the Appropriate Legal
374 | Notices displayed by works containing it; or
375 |
376 | c) Prohibiting misrepresentation of the origin of that material, or
377 | requiring that modified versions of such material be marked in
378 | reasonable ways as different from the original version; or
379 |
380 | d) Limiting the use for publicity purposes of names of licensors or
381 | authors of the material; or
382 |
383 | e) Declining to grant rights under trademark law for use of some
384 | trade names, trademarks, or service marks; or
385 |
386 | f) Requiring indemnification of licensors and authors of that
387 | material by anyone who conveys the material (or modified versions of
388 | it) with contractual assumptions of liability to the recipient, for
389 | any liability that these contractual assumptions directly impose on
390 | those licensors and authors.
391 |
392 | All other non-permissive additional terms are considered "further
393 | restrictions" within the meaning of section 10. If the Program as you
394 | received it, or any part of it, contains a notice stating that it is
395 | governed by this License along with a term that is a further
396 | restriction, you may remove that term. If a license document contains
397 | a further restriction but permits relicensing or conveying under this
398 | License, you may add to a covered work material governed by the terms
399 | of that license document, provided that the further restriction does
400 | not survive such relicensing or conveying.
401 |
402 | If you add terms to a covered work in accord with this section, you
403 | must place, in the relevant source files, a statement of the
404 | additional terms that apply to those files, or a notice indicating
405 | where to find the applicable terms.
406 |
407 | Additional terms, permissive or non-permissive, may be stated in the
408 | form of a separately written license, or stated as exceptions;
409 | the above requirements apply either way.
410 |
411 | 8. Termination.
412 |
413 | You may not propagate or modify a covered work except as expressly
414 | provided under this License. Any attempt otherwise to propagate or
415 | modify it is void, and will automatically terminate your rights under
416 | this License (including any patent licenses granted under the third
417 | paragraph of section 11).
418 |
419 | However, if you cease all violation of this License, then your
420 | license from a particular copyright holder is reinstated (a)
421 | provisionally, unless and until the copyright holder explicitly and
422 | finally terminates your license, and (b) permanently, if the copyright
423 | holder fails to notify you of the violation by some reasonable means
424 | prior to 60 days after the cessation.
425 |
426 | Moreover, your license from a particular copyright holder is
427 | reinstated permanently if the copyright holder notifies you of the
428 | violation by some reasonable means, this is the first time you have
429 | received notice of violation of this License (for any work) from that
430 | copyright holder, and you cure the violation prior to 30 days after
431 | your receipt of the notice.
432 |
433 | Termination of your rights under this section does not terminate the
434 | licenses of parties who have received copies or rights from you under
435 | this License. If your rights have been terminated and not permanently
436 | reinstated, you do not qualify to receive new licenses for the same
437 | material under section 10.
438 |
439 | 9. Acceptance Not Required for Having Copies.
440 |
441 | You are not required to accept this License in order to receive or
442 | run a copy of the Program. Ancillary propagation of a covered work
443 | occurring solely as a consequence of using peer-to-peer transmission
444 | to receive a copy likewise does not require acceptance. However,
445 | nothing other than this License grants you permission to propagate or
446 | modify any covered work. These actions infringe copyright if you do
447 | not accept this License. Therefore, by modifying or propagating a
448 | covered work, you indicate your acceptance of this License to do so.
449 |
450 | 10. Automatic Licensing of Downstream Recipients.
451 |
452 | Each time you convey a covered work, the recipient automatically
453 | receives a license from the original licensors, to run, modify and
454 | propagate that work, subject to this License. You are not responsible
455 | for enforcing compliance by third parties with this License.
456 |
457 | An "entity transaction" is a transaction transferring control of an
458 | organization, or substantially all assets of one, or subdividing an
459 | organization, or merging organizations. If propagation of a covered
460 | work results from an entity transaction, each party to that
461 | transaction who receives a copy of the work also receives whatever
462 | licenses to the work the party's predecessor in interest had or could
463 | give under the previous paragraph, plus a right to possession of the
464 | Corresponding Source of the work from the predecessor in interest, if
465 | the predecessor has it or can get it with reasonable efforts.
466 |
467 | You may not impose any further restrictions on the exercise of the
468 | rights granted or affirmed under this License. For example, you may
469 | not impose a license fee, royalty, or other charge for exercise of
470 | rights granted under this License, and you may not initiate litigation
471 | (including a cross-claim or counterclaim in a lawsuit) alleging that
472 | any patent claim is infringed by making, using, selling, offering for
473 | sale, or importing the Program or any portion of it.
474 |
475 | 11. Patents.
476 |
477 | A "contributor" is a copyright holder who authorizes use under this
478 | License of the Program or a work on which the Program is based. The
479 | work thus licensed is called the contributor's "contributor version".
480 |
481 | A contributor's "essential patent claims" are all patent claims
482 | owned or controlled by the contributor, whether already acquired or
483 | hereafter acquired, that would be infringed by some manner, permitted
484 | by this License, of making, using, or selling its contributor version,
485 | but do not include claims that would be infringed only as a
486 | consequence of further modification of the contributor version. For
487 | purposes of this definition, "control" includes the right to grant
488 | patent sublicenses in a manner consistent with the requirements of
489 | this License.
490 |
491 | Each contributor grants you a non-exclusive, worldwide, royalty-free
492 | patent license under the contributor's essential patent claims, to
493 | make, use, sell, offer for sale, import and otherwise run, modify and
494 | propagate the contents of its contributor version.
495 |
496 | In the following three paragraphs, a "patent license" is any express
497 | agreement or commitment, however denominated, not to enforce a patent
498 | (such as an express permission to practice a patent or covenant not to
499 | sue for patent infringement). To "grant" such a patent license to a
500 | party means to make such an agreement or commitment not to enforce a
501 | patent against the party.
502 |
503 | If you convey a covered work, knowingly relying on a patent license,
504 | and the Corresponding Source of the work is not available for anyone
505 | to copy, free of charge and under the terms of this License, through a
506 | publicly available network server or other readily accessible means,
507 | then you must either (1) cause the Corresponding Source to be so
508 | available, or (2) arrange to deprive yourself of the benefit of the
509 | patent license for this particular work, or (3) arrange, in a manner
510 | consistent with the requirements of this License, to extend the patent
511 | license to downstream recipients. "Knowingly relying" means you have
512 | actual knowledge that, but for the patent license, your conveying the
513 | covered work in a country, or your recipient's use of the covered work
514 | in a country, would infringe one or more identifiable patents in that
515 | country that you have reason to believe are valid.
516 |
517 | If, pursuant to or in connection with a single transaction or
518 | arrangement, you convey, or propagate by procuring conveyance of, a
519 | covered work, and grant a patent license to some of the parties
520 | receiving the covered work authorizing them to use, propagate, modify
521 | or convey a specific copy of the covered work, then the patent license
522 | you grant is automatically extended to all recipients of the covered
523 | work and works based on it.
524 |
525 | A patent license is "discriminatory" if it does not include within
526 | the scope of its coverage, prohibits the exercise of, or is
527 | conditioned on the non-exercise of one or more of the rights that are
528 | specifically granted under this License. You may not convey a covered
529 | work if you are a party to an arrangement with a third party that is
530 | in the business of distributing software, under which you make payment
531 | to the third party based on the extent of your activity of conveying
532 | the work, and under which the third party grants, to any of the
533 | parties who would receive the covered work from you, a discriminatory
534 | patent license (a) in connection with copies of the covered work
535 | conveyed by you (or copies made from those copies), or (b) primarily
536 | for and in connection with specific products or compilations that
537 | contain the covered work, unless you entered into that arrangement,
538 | or that patent license was granted, prior to 28 March 2007.
539 |
540 | Nothing in this License shall be construed as excluding or limiting
541 | any implied license or other defenses to infringement that may
542 | otherwise be available to you under applicable patent law.
543 |
544 | 12. No Surrender of Others' Freedom.
545 |
546 | If conditions are imposed on you (whether by court order, agreement or
547 | otherwise) that contradict the conditions of this License, they do not
548 | excuse you from the conditions of this License. If you cannot convey a
549 | covered work so as to satisfy simultaneously your obligations under this
550 | License and any other pertinent obligations, then as a consequence you may
551 | not convey it at all. For example, if you agree to terms that obligate you
552 | to collect a royalty for further conveying from those to whom you convey
553 | the Program, the only way you could satisfy both those terms and this
554 | License would be to refrain entirely from conveying the Program.
555 |
556 | 13. Use with the GNU Affero General Public License.
557 |
558 | Notwithstanding any other provision of this License, you have
559 | permission to link or combine any covered work with a work licensed
560 | under version 3 of the GNU Affero General Public License into a single
561 | combined work, and to convey the resulting work. The terms of this
562 | License will continue to apply to the part which is the covered work,
563 | but the special requirements of the GNU Affero General Public License,
564 | section 13, concerning interaction through a network will apply to the
565 | combination as such.
566 |
567 | 14. Revised Versions of this License.
568 |
569 | The Free Software Foundation may publish revised and/or new versions of
570 | the GNU General Public License from time to time. Such new versions will
571 | be similar in spirit to the present version, but may differ in detail to
572 | address new problems or concerns.
573 |
574 | Each version is given a distinguishing version number. If the
575 | Program specifies that a certain numbered version of the GNU General
576 | Public License "or any later version" applies to it, you have the
577 | option of following the terms and conditions either of that numbered
578 | version or of any later version published by the Free Software
579 | Foundation. If the Program does not specify a version number of the
580 | GNU General Public License, you may choose any version ever published
581 | by the Free Software Foundation.
582 |
583 | If the Program specifies that a proxy can decide which future
584 | versions of the GNU General Public License can be used, that proxy's
585 | public statement of acceptance of a version permanently authorizes you
586 | to choose that version for the Program.
587 |
588 | Later license versions may give you additional or different
589 | permissions. However, no additional obligations are imposed on any
590 | author or copyright holder as a result of your choosing to follow a
591 | later version.
592 |
593 | 15. Disclaimer of Warranty.
594 |
595 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
596 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
597 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
598 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
599 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
600 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
601 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
602 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
603 |
604 | 16. Limitation of Liability.
605 |
606 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
607 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
608 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
609 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
610 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
611 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
612 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
613 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
614 | SUCH DAMAGES.
615 |
616 | 17. Interpretation of Sections 15 and 16.
617 |
618 | If the disclaimer of warranty and limitation of liability provided
619 | above cannot be given local legal effect according to their terms,
620 | reviewing courts shall apply local law that most closely approximates
621 | an absolute waiver of all civil liability in connection with the
622 | Program, unless a warranty or assumption of liability accompanies a
623 | copy of the Program in return for a fee.
624 |
625 | END OF TERMS AND CONDITIONS
626 |
627 | How to Apply These Terms to Your New Programs
628 |
629 | If you develop a new program, and you want it to be of the greatest
630 | possible use to the public, the best way to achieve this is to make it
631 | free software which everyone can redistribute and change under these terms.
632 |
633 | To do so, attach the following notices to the program. It is safest
634 | to attach them to the start of each source file to most effectively
635 | state the exclusion of warranty; and each file should have at least
636 | the "copyright" line and a pointer to where the full notice is found.
637 |
638 | {one line to give the program's name and a brief idea of what it does.}
639 | Copyright (C) {year} {name of author}
640 |
641 | This program is free software: you can redistribute it and/or modify
642 | it under the terms of the GNU General Public License as published by
643 | the Free Software Foundation, either version 3 of the License, or
644 | (at your option) any later version.
645 |
646 | This program is distributed in the hope that it will be useful,
647 | but WITHOUT ANY WARRANTY; without even the implied warranty of
648 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
649 | GNU General Public License for more details.
650 |
651 | You should have received a copy of the GNU General Public License
652 | along with this program. If not, see .
653 |
654 | Also add information on how to contact you by electronic and paper mail.
655 |
656 | If the program does terminal interaction, make it output a short
657 | notice like this when it starts in an interactive mode:
658 |
659 | {project} Copyright (C) {year} {fullname}
660 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
661 | This is free software, and you are welcome to redistribute it
662 | under certain conditions; type `show c' for details.
663 |
664 | The hypothetical commands `show w' and `show c' should show the appropriate
665 | parts of the General Public License. Of course, your program's commands
666 | might be different; for a GUI interface, you would use an "about box".
667 |
668 | You should also get your employer (if you work as a programmer) or school,
669 | if any, to sign a "copyright disclaimer" for the program, if necessary.
670 | For more information on this, and how to apply and follow the GNU GPL, see
671 | .
672 |
673 | The GNU General Public License does not permit incorporating your program
674 | into proprietary programs. If your program is a subroutine library, you
675 | may consider it more useful to permit linking proprietary applications with
676 | the library. If this is what you want to do, use the GNU Lesser General
677 | Public License instead of this License. But first, please read
678 | .
679 |
--------------------------------------------------------------------------------
/generators/app/templates/LICENSE_MIT.ejs:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) <%= new Date().getFullYear() %> <%= authorName %>
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/generators/app/templates/README.md.ejs:
--------------------------------------------------------------------------------
1 | # generator-jhipster-<%= moduleName %>
2 | [![NPM version][npm-image]][npm-url] [![Build Status][github-actions-image]][github-actions-url] [![Dependency Status][daviddm-image]][daviddm-url]
3 | > JHipster module, <%= moduleDescription %>
4 |
5 | # Introduction
6 |
7 | This is a [JHipster](https://www.jhipster.tech/) module, that is meant to be used in a JHipster application.
8 |
9 | # Prerequisites
10 |
11 | As this is a [JHipster](https://www.jhipster.tech/) module, we expect you have JHipster and its related tools already installed:
12 |
13 | - [Installing JHipster](https://www.jhipster.tech/installation/)
14 |
15 | # Installation
16 |
17 | ## With NPM
18 |
19 | To install this module:
20 |
21 | ```bash
22 | npm install -g generator-jhipster-<%= moduleName %>
23 | ```
24 |
25 | To update this module:
26 |
27 | ```bash
28 | npm update -g generator-jhipster-<%= moduleName %>
29 | ```
30 |
31 | ## With Yarn
32 |
33 | To install this module:
34 |
35 | ```bash
36 | yarn global add generator-jhipster-<%= moduleName %>
37 | ```
38 |
39 | To update this module:
40 |
41 | ```bash
42 | yarn global upgrade generator-jhipster-<%= moduleName %>
43 | ```
44 |
45 | # Usage
46 |
47 | # License
48 |
49 | <%_ if (license === 'apache') { _%>
50 | Apache-2.0 © [<%= authorName %>](<%= authorUrl %>)
51 | <%_ } else if (license === 'gpl') { _%>
52 | GPL-3.0 © [<%= authorName %>](<%= authorUrl %>)
53 | <%_ } else if (license === 'mit') { _%>
54 | MIT © [<%= authorName %>](<%= authorUrl %>)
55 | <%_ } _%>
56 |
57 |
58 | [npm-image]: https://img.shields.io/npm/v/generator-jhipster-<%= moduleName %>.svg
59 | [npm-url]: https://npmjs.org/package/generator-jhipster-<%= moduleName %>
60 | [github-actions-image]: https://github.com/<%= githubName %>/generator-jhipster-<%= moduleName %>/workflows/Build/badge.svg
61 | [github-actions-url]: https://github.com/<%= githubName %>/generator-jhipster-<%= moduleName %>/actions
62 | [daviddm-image]: https://david-dm.org/<%= githubName %>/generator-jhipster-<%= moduleName %>.svg?theme=shields.io
63 | [daviddm-url]: https://david-dm.org/<%= githubName %>/generator-jhipster-<%= moduleName %>
64 |
--------------------------------------------------------------------------------
/generators/app/templates/generators/app/index.js.ejs:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk');
2 | const semver = require('semver');
3 | const BaseGenerator = require('generator-jhipster/generators/generator-base');
4 | const {
5 | SERVER_MAIN_SRC_DIR,
6 | SERVER_MAIN_RES_DIR,
7 | CLIENT_MAIN_SRC_DIR,
8 | SUPPORTED_CLIENT_FRAMEWORKS
9 | } = require('generator-jhipster/generators/generator-constants');
10 | const packagejs = require('../../package.json');
11 |
12 | module.exports = class extends BaseGenerator {
13 | get initializing() {
14 | return {
15 | init(args) {
16 | if (args === 'default') {
17 | // do something when argument is 'default'
18 | this.message = 'default message';
19 | }
20 | },
21 | readConfig() {
22 | this.jhipsterAppConfig = this.getJhipsterConfig('.yo-rc.json').createProxy();
23 | if (!this.jhipsterAppConfig) {
24 | this.error('Cannot read .yo-rc.json');
25 | }
26 | },
27 | displayLogo() {
28 | // it's here to show that you can use functions from generator-jhipster
29 | // this function is in: generator-jhipster/generators/generator-base.js
30 | this.printJHipsterLogo();
31 |
32 | // Have Yeoman greet the user.
33 | this.log(`\nWelcome to the ${chalk.bold.yellow('JHipster <%= moduleName %>')} generator! ${chalk.yellow(`v${packagejs.version}\n`)}`);
34 | },
35 | checkJhipster() {
36 | const currentJhipsterVersion = this.jhipsterAppConfig.jhipsterVersion;
37 | const minimumJhipsterVersion = packagejs.dependencies['generator-jhipster'];
38 | if (!semver.satisfies(currentJhipsterVersion, minimumJhipsterVersion)) {
39 | this.warning(`\nYour generated project used an old JHipster version (${currentJhipsterVersion})... you need at least (${minimumJhipsterVersion})\n`);
40 | }
41 | }
42 | };
43 | }
44 |
45 | async prompting() {
46 | const prompts = [
47 | {
48 | when: () => typeof this.message === 'undefined',
49 | type: 'input',
50 | name: 'message',
51 | message: 'Please put something',
52 | default: 'hello world!'
53 | }
54 | ];
55 |
56 | await this.prompt(prompts).then(answers => {
57 | this.promptAnswers = answers;
58 | // To access props answers use this.promptAnswers.someOption;
59 | });
60 | }
61 |
62 | writing() {
63 | // read config from .yo-rc.json
64 | this.baseName = this.jhipsterAppConfig.baseName;
65 | this.packageName = this.jhipsterAppConfig.packageName;
66 | this.packageFolder = this.jhipsterAppConfig.packageFolder;
67 | this.clientFramework = this.jhipsterAppConfig.clientFramework;
68 | this.clientPackageManager = this.jhipsterAppConfig.clientPackageManager;
69 | this.buildTool = this.jhipsterAppConfig.buildTool;
70 |
71 | // use function in generator-base.js from generator-jhipster
72 | this.frontendAppName = this.getFrontendAppName();
73 |
74 | // use constants from generator-constants.js
75 | const javaDir = `${SERVER_MAIN_SRC_DIR + this.packageFolder}/`;
76 | const resourceDir = SERVER_MAIN_RES_DIR;
77 | const webappDir = CLIENT_MAIN_SRC_DIR;
78 |
79 | // variable from questions
80 | if (typeof this.message === 'undefined') {
81 | this.message = this.promptAnswers.message;
82 | }
83 |
84 | // show all variables
85 | this.log('\n--- some config read from config ---');
86 | this.log(`baseName=${this.baseName}`);
87 | this.log(`packageName=${this.packageName}`);
88 | this.log(`clientFramework=${this.clientFramework}`);
89 | this.log(`clientPackageManager=${this.clientPackageManager}`);
90 | this.log(`buildTool=${this.buildTool}`);
91 |
92 | this.log('\n--- some function ---');
93 | this.log(`frontendAppName=${this.frontendAppName}`);
94 |
95 | this.log('\n--- some const ---');
96 | this.log(`javaDir=${javaDir}`);
97 | this.log(`resourceDir=${resourceDir}`);
98 | this.log(`webappDir=${webappDir}`);
99 |
100 | this.log('\n--- variables from questions ---');
101 | this.log(`message=${this.message}`);
102 | this.log('------\n');
103 |
104 | if (Object.values(SUPPORTED_CLIENT_FRAMEWORKS).includes(this.clientFramework)) {
105 | this.template('dummy.txt', `dummy-${this.clientFramework}.txt`);
106 | }
107 |
108 | if (this.buildTool === 'maven') {
109 | this.template('dummy.txt', 'dummy-maven.txt');
110 | } else if (this.buildTool === 'gradle') {
111 | this.template('dummy.txt', 'dummy-gradle.txt');
112 | }
113 | <%_ if (hook !== 'none') { _%>
114 |
115 | // Register this generator as a dev dependency
116 | this.addNpmDevDependency('generator-jhipster-<%= moduleName %>', packagejs.version);
117 | try {
118 | this.registerModule('generator-jhipster-<%= moduleName %>', '<%= hookFor %>', '<%= hookType %>', '<%= hookCallback %>', '<%= moduleDescription %>');
119 | } catch (err) {
120 | this.log(`${chalk.red.bold('WARN!')} Could not register as a jhipster <%= hookFor %> <%= hookType %> creation hook...\n`);
121 | }
122 | <%_ } _%>
123 | }
124 |
125 | install() {
126 | const logMsg = `To install your dependencies manually, run: ${chalk.yellow.bold(`${this.clientPackageManager} install`)}`;
127 |
128 | const injectDependenciesAndConstants = (err) => {
129 | if (err) {
130 | this.warning('Install of dependencies failed!');
131 | this.log(logMsg);
132 | }
133 | };
134 | const installConfig = {
135 | bower: false,
136 | npm: this.clientPackageManager !== 'yarn',
137 | yarn: this.clientPackageManager === 'yarn',
138 | callback: injectDependenciesAndConstants
139 | };
140 | if (this.options['skip-install']) {
141 | this.log(logMsg);
142 | } else {
143 | this.installDependencies(installConfig);
144 | }
145 | }
146 |
147 | end() {
148 | this.log('End of <%= moduleName %> generator');
149 | }
150 | };
151 |
--------------------------------------------------------------------------------
/generators/app/templates/generators/app/templates/dummy.txt.ejs:
--------------------------------------------------------------------------------
1 | hello <%= moduleName %>!
2 | It's dummy.txt
3 |
--------------------------------------------------------------------------------
/generators/app/templates/generators/entity/index.js.ejs:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk');
2 | const BaseGenerator = require('generator-jhipster/generators/generator-base');
3 | const {
4 | SERVER_MAIN_SRC_DIR,
5 | SERVER_MAIN_RES_DIR,
6 | CLIENT_MAIN_SRC_DIR
7 | } = require('generator-jhipster/generators/generator-constants');
8 | const packagejs = require('../../package.json');
9 |
10 | module.exports = class extends BaseGenerator {
11 | get initializing() {
12 | return {
13 | readConfig() {
14 | this.entityConfig = this.options.entityConfig;
15 | this.jhipsterAppConfig = this.getJhipsterConfig('.yo-rc.json').createProxy();
16 | if (!this.jhipsterAppConfig) {
17 | this.error('Cannot read .yo-rc.json');
18 | }
19 | },
20 | displayLogo() {
21 | this.log(chalk.white(`Running ${chalk.bold('JHipster <%= moduleName %>')} Generator! ${chalk.yellow(`v${packagejs.version}\n`)}`));
22 | },
23 | validate() {
24 | // this shouldn't be run directly
25 | if (!this.entityConfig) {
26 | this.env.error(`${chalk.red.bold('ERROR!')} This sub generator should be used only from JHipster and cannot be run directly...\n`);
27 | }
28 | }
29 | };
30 | }
31 |
32 | async prompting() {
33 | // don't prompt if data are imported from a file
34 | if (this.entityConfig.useConfigurationFile === true && typeof this.entityConfig.yourOptionKey !== 'undefined') {
35 | this.yourOptionKey = this.entityConfig.yourOptionKey;
36 | return;
37 | }
38 | const prompts = [
39 | {
40 | type: 'confirm',
41 | name: 'enableOption',
42 | message: 'Some option here?',
43 | default: false
44 | }
45 | ];
46 |
47 | await this.prompt(prompts).then(answers => {
48 | this.promptAnswers = answers;
49 | this.yourOptionKey = '';
50 | // To access props answers use this.promptAnswers.someOption;
51 | });
52 | }
53 |
54 | get writing() {
55 | return {
56 | updateFiles() {
57 | // read config from .yo-rc.json
58 | this.baseName = this.jhipsterAppConfig.baseName;
59 | this.packageName = this.jhipsterAppConfig.packageName;
60 | this.packageFolder = this.jhipsterAppConfig.packageFolder;
61 | this.clientFramework = this.jhipsterAppConfig.clientFramework;
62 | this.clientPackageManager = this.jhipsterAppConfig.clientPackageManager;
63 | this.buildTool = this.jhipsterAppConfig.buildTool;
64 |
65 | // use constants from generator-constants.js
66 | const javaDir = `${SERVER_MAIN_SRC_DIR + this.packageFolder}/`;
67 | const resourceDir = SERVER_MAIN_RES_DIR;
68 | const webappDir = CLIENT_MAIN_SRC_DIR;
69 |
70 | const entityName = this.entityConfig.entityClass;
71 |
72 | // show all variables
73 | this.log('\n--- some const ---');
74 | this.log(`javaDir=${javaDir}`);
75 | this.log(`resourceDir=${resourceDir}`);
76 | this.log(`webappDir=${webappDir}`);
77 |
78 | this.log('\n--- entityName ---');
79 | this.log(`entityName=${entityName}`);
80 |
81 | this.log('------\n');
82 |
83 | // do your stuff here
84 | },
85 |
86 | writeFiles() {
87 | this.template('dummy.txt', 'dummy.txt');
88 | },
89 |
90 | updateConfig() {
91 | this.updateEntityConfig(this.entityConfig.filename, 'yourOptionKey', this.yourOptionKey);
92 | }
93 | };
94 | }
95 |
96 | end() {
97 | if (this.yourOptionKey) {
98 | this.log(`\n${chalk.bold.green('<%= moduleName %> enabled')}`);
99 | }
100 | }
101 | };
102 |
--------------------------------------------------------------------------------
/generators/app/templates/generators/entity/templates/dummy.txt.ejs:
--------------------------------------------------------------------------------
1 | hello <%= moduleName %>:entity sub generator!
2 | It's dummy.txt
3 |
--------------------------------------------------------------------------------
/generators/app/templates/package.json.ejs:
--------------------------------------------------------------------------------
1 | {
2 | "name": "generator-jhipster-<%= moduleName %>",
3 | "version": "0.0.0",
4 | "description": "<%= moduleDescription %>",
5 | "keywords": [
6 | "yeoman-generator",
7 | "jhipster-module",
8 | "jhipster-7"
9 | ],
10 | "homepage": "https://github.com/<%= githubName %>/generator-jhipster-<%= moduleName %>",
11 | "bugs": {
12 | "url": "https://github.com/<%= githubName %>/generator-jhipster-<%= moduleName %>/issues"
13 | },
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/<%= githubName %>/generator-jhipster-<%= moduleName %>.git"
17 | },
18 | <%_ if (license === 'apache') { _%>
19 | "license": "Apache-2.0",
20 | <%_ } else if (license === 'gpl') { _%>
21 | "license": "GPL-3.0",
22 | <%_ } else if (license === 'mit') { _%>
23 | "license": "MIT",
24 | <%_ } _%>
25 | "author": {
26 | "name": "<%= authorName %>",
27 | "email": "<%= authorEmail %>",
28 | "url": "<%= authorUrl %>"
29 | },
30 | "main": "generators/app/index.js",
31 | "files": [
32 | "generators"
33 | ],
34 | "scripts": {
35 | "lint": "eslint .",
36 | "lint:fix": "eslint . --fix",
37 | "prettier:check": "prettier --check \"{,**/}*.{js,json,md,yml}\"",
38 | "prettier:format": "prettier --write \"{,**/}*.{js,json,md,yml}\"",
39 | "release": "git push && git push --tags && npm publish",
40 | "release:major": "npm version major -a -m \"Update to %s\" && npm run release",
41 | "release:minor": "npm version minor -a -m \"Update to %s\" && npm run release",
42 | "release:patch": "npm version patch -a -m \"Update to %s\" && npm run release",
43 | "pretest": "eslint .",
44 | "test": "mocha test"
45 | },
46 | "husky": {
47 | "hooks": {
48 | "pre-commit": "lint-staged"
49 | }
50 | },
51 | "lint-staged": {
52 | "*.{js,json,yml,md}": [
53 | "prettier --write",
54 | "git add"
55 | ]
56 | },
57 | "dependencies": {
58 | "chalk": "4.1.0",
59 | "generator-jhipster": ">=7.0.0",
60 | "semver": "7.1.1"
61 | },
62 | "devDependencies": {
63 | "eslint": "6.8.0",
64 | "eslint-config-airbnb-base": "14.2.0",
65 | "eslint-config-prettier": "6.13.0",
66 | "eslint-plugin-import": "2.22.1",
67 | "eslint-plugin-prettier": "3.1.4",
68 | "fs-extra": "9.1.0",
69 | "husky": "3.1.0",
70 | "lint-staged": "9.5.0",
71 | "mocha": "8.2.1",
72 | "prettier": "2.1.2",
73 | "yeoman-assert": "3.1.1",
74 | "yeoman-test": "5.0.0"
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/generators/app/templates/test/app.spec.js.ejs:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const fse = require('fs-extra');
3 | const assert = require('yeoman-assert');
4 | const helpers = require('yeoman-test');
5 |
6 | describe('JHipster generator <%= moduleName %>', () => {
7 | describe('Test with Maven and AngularX', () => {
8 | beforeEach(async () => {
9 | await helpers
10 | .run(path.join(__dirname, '../generators/app'))
11 | .inTmpDir((dir) => {
12 | fse.copySync(path.join(__dirname, '../test/templates/maven-angularX'), dir);
13 | })
14 | .withOptions({
15 | testmode: true
16 | })
17 | .withPrompts({
18 | message: 'simple message to say hello'
19 | });
20 | });
21 |
22 | it('generate dummy.txt file', () => {
23 | assert.file([
24 | 'dummy-maven.txt',
25 | 'dummy-angularX.txt',
26 | ]);
27 | });
28 | });
29 |
30 | describe('Test with Gradle and React', () => {
31 | beforeEach(async () => {
32 | await helpers
33 | .run(path.join(__dirname, '../generators/app'))
34 | .inTmpDir((dir) => {
35 | fse.copySync(path.join(__dirname, '../test/templates/gradle-react'), dir);
36 | })
37 | .withOptions({
38 | testmode: true
39 | })
40 | .withPrompts({
41 | message: 'simple message to say hello'
42 | });
43 | });
44 |
45 | it('generate dummy.txt file', () => {
46 | assert.file([
47 | 'dummy-gradle.txt',
48 | 'dummy-react.txt',
49 | ]);
50 | });
51 | });
52 |
53 | describe('Test with Maven and Vue', () => {
54 | beforeEach(async () => {
55 | await helpers
56 | .run(path.join(__dirname, '../generators/app'))
57 | .inTmpDir((dir) => {
58 | fse.copySync(path.join(__dirname, '../test/templates/maven-vue'), dir);
59 | })
60 | .withOptions({
61 | testmode: true
62 | })
63 | .withPrompts({
64 | message: 'simple message to say hello'
65 | });
66 | });
67 |
68 | it('generate dummy.txt file', () => {
69 | assert.file([
70 | 'dummy-maven.txt',
71 | 'dummy-vue.txt',
72 | ]);
73 | });
74 | });
75 | });
76 |
--------------------------------------------------------------------------------
/generators/app/templates/test/templates/gradle-react/.yo-rc.json:
--------------------------------------------------------------------------------
1 | {
2 | "generator-jhipster": {
3 | "promptValues": {
4 | "packageName": "com.mycompany.myapp",
5 | "nativeLanguage": "en"
6 | },
7 | "baseName": "sampleMysql",
8 | "packageName": "com.mycompany.myapp",
9 | "packageFolder": "com/mycompany/myapp",
10 | "serverPort": "8080",
11 | "authenticationType": "jwt",
12 | "cacheProvider": "ehcache",
13 | "enableHibernateCache": true,
14 | "websocket": false,
15 | "databaseType": "sql",
16 | "devDatabaseType": "h2Disk",
17 | "prodDatabaseType": "mysql",
18 | "searchEngine": false,
19 | "messageBroker": false,
20 | "serviceDiscoveryType": false,
21 | "buildTool": "gradle",
22 | "jwtSecretKey": "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8",
23 | "clientFramework": "react",
24 | "useSass": true,
25 | "clientPackageManager": "npm",
26 | "applicationType": "monolith",
27 | "testFrameworks": [],
28 | "jhiPrefix": "jhi",
29 | "enableTranslation": true,
30 | "nativeLanguage": "en",
31 | "languages": [
32 | "en"
33 | ]
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/generators/app/templates/test/templates/maven-angularX/.yo-rc.json:
--------------------------------------------------------------------------------
1 | {
2 | "generator-jhipster": {
3 | "promptValues": {
4 | "packageName": "com.mycompany.myapp",
5 | "nativeLanguage": "en"
6 | },
7 | "baseName": "sampleMysql",
8 | "packageName": "com.mycompany.myapp",
9 | "packageFolder": "com/mycompany/myapp",
10 | "serverPort": "8080",
11 | "authenticationType": "jwt",
12 | "cacheProvider": "ehcache",
13 | "enableHibernateCache": true,
14 | "websocket": false,
15 | "databaseType": "sql",
16 | "devDatabaseType": "h2Disk",
17 | "prodDatabaseType": "mysql",
18 | "searchEngine": false,
19 | "messageBroker": false,
20 | "serviceDiscoveryType": false,
21 | "buildTool": "maven",
22 | "jwtSecretKey": "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8",
23 | "clientFramework": "angularX",
24 | "useSass": true,
25 | "clientPackageManager": "npm",
26 | "applicationType": "monolith",
27 | "testFrameworks": [],
28 | "jhiPrefix": "jhi",
29 | "enableTranslation": true,
30 | "nativeLanguage": "en",
31 | "languages": [
32 | "en"
33 | ]
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/generators/app/templates/test/templates/maven-vue/.yo-rc.json:
--------------------------------------------------------------------------------
1 | {
2 | "generator-jhipster": {
3 | "promptValues": {
4 | "packageName": "com.mycompany.myapp",
5 | "nativeLanguage": "en"
6 | },
7 | "baseName": "sampleMysql",
8 | "packageName": "com.mycompany.myapp",
9 | "packageFolder": "com/mycompany/myapp",
10 | "serverPort": "8080",
11 | "authenticationType": "jwt",
12 | "cacheProvider": "ehcache",
13 | "enableHibernateCache": true,
14 | "websocket": false,
15 | "databaseType": "sql",
16 | "devDatabaseType": "h2Disk",
17 | "prodDatabaseType": "mysql",
18 | "searchEngine": false,
19 | "messageBroker": false,
20 | "serviceDiscoveryType": false,
21 | "buildTool": "maven",
22 | "jwtSecretKey": "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8",
23 | "clientFramework": "vue",
24 | "useSass": true,
25 | "clientPackageManager": "npm",
26 | "applicationType": "monolith",
27 | "testFrameworks": [],
28 | "jhiPrefix": "jhi",
29 | "enableTranslation": true,
30 | "nativeLanguage": "en",
31 | "languages": [
32 | "en"
33 | ]
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/generators/generator-constants.js:
--------------------------------------------------------------------------------
1 | // Version of Node
2 | const NODE_VERSION = '14.16.0';
3 |
4 | const constants = {
5 | NODE_VERSION,
6 | };
7 |
8 | module.exports = constants;
9 |
--------------------------------------------------------------------------------
/images/circleci.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jhipster/generator-jhipster-module/37161605942d44aba3555558b7a1d6b547793358/images/circleci.png
--------------------------------------------------------------------------------
/images/gitlabci.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jhipster/generator-jhipster-module/37161605942d44aba3555558b7a1d6b547793358/images/gitlabci.png
--------------------------------------------------------------------------------
/images/logo-jhipster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jhipster/generator-jhipster-module/37161605942d44aba3555558b7a1d6b547793358/images/logo-jhipster.png
--------------------------------------------------------------------------------
/images/travis.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jhipster/generator-jhipster-module/37161605942d44aba3555558b7a1d6b547793358/images/travis.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "generator-jhipster-module",
3 | "version": "2.6.1",
4 | "description": "Yeoman generator to create a JHipster module",
5 | "keywords": [
6 | "yeoman-generator",
7 | "jhipster"
8 | ],
9 | "homepage": "https://github.com/jhipster/generator-jhipster-module",
10 | "bugs": "https://github.com/jhipster/generator-jhipster-module/issues",
11 | "author": {
12 | "name": "Pascal Grimaud",
13 | "email": "",
14 | "url": "https://twitter.com/pascalgrimaud"
15 | },
16 | "files": [
17 | "generators"
18 | ],
19 | "main": "generators/app/index.js",
20 | "repository": {
21 | "type": "git",
22 | "url": "git+https://github.com/jhipster/generator-jhipster-module.git"
23 | },
24 | "dependencies": {
25 | "chalk": "4.1.2",
26 | "gulp-filter": "7.0.0",
27 | "mkdirp": "0.5.1",
28 | "prettier": "2.6.2",
29 | "through2": "4.0.2",
30 | "yeoman-generator": "4.13.0"
31 | },
32 | "devDependencies": {
33 | "eslint": "8.12.0",
34 | "eslint-config-airbnb-base": "15.0.0",
35 | "eslint-config-prettier": "8.5.0",
36 | "eslint-plugin-import": "2.25.4",
37 | "eslint-plugin-prettier": "4.0.0",
38 | "fs-extra": "10.0.1",
39 | "mocha": "9.2.2",
40 | "yeoman-assert": "3.1.1",
41 | "yeoman-test": "4.0.1"
42 | },
43 | "scripts": {
44 | "prettier:format": "prettier --write \"{,**/}*.{js,json,md,yml}\"",
45 | "prettier:check": "prettier --check \"{,**/}*.{js,json,md,yml}\"",
46 | "pretest": "eslint .",
47 | "lint": "eslint .",
48 | "lint:fix": "eslint . --fix",
49 | "release": "git push && git push --tags && npm publish",
50 | "release:patch": "npm version patch -a -m \"Update to %s\" && npm run release",
51 | "release:minor": "npm version minor -a -m \"Update to %s\" && npm run release",
52 | "release:major": "npm version major -a -m \"Update to %s\" && npm run release",
53 | "test": "mocha test/*.js --slow 0 --reporter spec"
54 | },
55 | "license": "Apache-2.0"
56 | }
57 |
--------------------------------------------------------------------------------
/test/app.spec.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const assert = require('yeoman-assert');
3 | const helpers = require('yeoman-test');
4 |
5 | const expectedFiles = {
6 | module: [
7 | '.github/workflows/github-ci.yml',
8 | '.prettierrc',
9 | '.prettierignore',
10 | '.editorconfig',
11 | '.eslintignore',
12 | '.eslintrc.json',
13 | '.gitattributes',
14 | '.gitignore',
15 | 'package.json',
16 | 'README.md',
17 | 'test/templates/maven-angularX/.yo-rc.json',
18 | 'test/templates/gradle-react/.yo-rc.json',
19 | 'test/app.spec.js',
20 | 'generators/app/index.js',
21 | 'generators/app/templates/dummy.txt',
22 | ],
23 | entity: ['generators/entity/index.js', 'generators/entity/templates/dummy.txt'],
24 | license: ['LICENSE'],
25 | };
26 |
27 | describe('JHipster generator module', () => {
28 | describe('default configuration no license', () => {
29 | beforeEach(done => {
30 | helpers
31 | .run(path.join(__dirname, '../generators/app'))
32 | .withPrompts({
33 | moduleName: 'hello-world',
34 | moduleDescription: 'hello world',
35 | hook: 'none',
36 | githubName: 'githubName',
37 | authorName: 'authorName',
38 | authorEmail: 'mail@mail',
39 | authorUrl: 'authorUrl',
40 | license: 'no',
41 | })
42 | .on('end', done);
43 | });
44 | it('generates default files', () => {
45 | assert.file(expectedFiles.module);
46 | });
47 | it("doesn't generate license", () => {
48 | assert.noFile(expectedFiles.license);
49 | });
50 | it("doesn't generate entity files", () => {
51 | assert.noFile(expectedFiles.entity);
52 | });
53 | });
54 |
55 | describe('default configuration license Apache', () => {
56 | beforeEach(done => {
57 | helpers
58 | .run(path.join(__dirname, '../generators/app'))
59 | .withPrompts({
60 | moduleName: 'hello-world',
61 | moduleDescription: 'hello world',
62 | hook: 'none',
63 | githubName: 'githubName',
64 | authorName: 'authorName',
65 | authorEmail: 'mail@mail',
66 | authorUrl: 'authorUrl',
67 | license: 'apache',
68 | })
69 | .on('end', done);
70 | });
71 | it('generates default files', () => {
72 | assert.file(expectedFiles.module);
73 | });
74 | it('generates license Apache', () => {
75 | assert.file(expectedFiles.license);
76 | assert.fileContent('README.md', 'Apache-2.0');
77 | assert.fileContent('package.json', 'Apache-2.0');
78 | });
79 | it("doesn't generate entity files", () => {
80 | assert.noFile(expectedFiles.entity);
81 | });
82 | });
83 |
84 | describe('default configuration license GNU GPLv3', () => {
85 | beforeEach(done => {
86 | helpers
87 | .run(path.join(__dirname, '../generators/app'))
88 | .withPrompts({
89 | moduleName: 'hello-world',
90 | moduleDescription: 'hello world',
91 | hook: 'none',
92 | githubName: 'githubName',
93 | authorName: 'authorName',
94 | authorEmail: 'mail@mail',
95 | authorUrl: 'authorUrl',
96 | license: 'gpl',
97 | })
98 | .on('end', done);
99 | });
100 | it('generates default files', () => {
101 | assert.file(expectedFiles.module);
102 | });
103 | it('generates license', () => {
104 | assert.file(expectedFiles.license);
105 | assert.fileContent('README.md', 'GPL-3.0');
106 | assert.fileContent('package.json', 'GPL-3.0');
107 | });
108 | it("doesn't generate entity files", () => {
109 | assert.noFile(expectedFiles.entity);
110 | });
111 | });
112 |
113 | describe('default configuration license MIT', () => {
114 | beforeEach(done => {
115 | helpers
116 | .run(path.join(__dirname, '../generators/app'))
117 | .withPrompts({
118 | moduleName: 'hello-world',
119 | moduleDescription: 'hello world',
120 | hook: 'none',
121 | githubName: 'githubName',
122 | authorName: 'authorName',
123 | authorEmail: 'mail@mail',
124 | authorUrl: 'authorUrl',
125 | license: 'mit',
126 | })
127 | .on('end', done);
128 | });
129 | it('generates default files', () => {
130 | assert.file(expectedFiles.module);
131 | });
132 | it('generates license', () => {
133 | assert.file(expectedFiles.license);
134 | assert.fileContent('README.md', 'MIT');
135 | assert.fileContent('package.json', 'MIT');
136 | });
137 | it("doesn't generate entity files", () => {
138 | assert.noFile(expectedFiles.entity);
139 | });
140 | });
141 |
142 | describe('hook postEntity on default generator', () => {
143 | beforeEach(done => {
144 | helpers
145 | .run(path.join(__dirname, '../generators/app'))
146 | .withPrompts({
147 | moduleName: 'hello-world',
148 | moduleDescription: 'hello world',
149 | hook: 'postEntity',
150 | hookCallback: 'app',
151 | githubName: 'githubName',
152 | authorName: 'authorName',
153 | authorEmail: 'mail@mail',
154 | authorUrl: 'authorUrl',
155 | license: 'no',
156 | })
157 | .on('end', done);
158 | });
159 |
160 | it('generates default files', () => {
161 | assert.file(expectedFiles.module);
162 | });
163 | it("doesn't generate entity files", () => {
164 | assert.noFile(expectedFiles.entity);
165 | });
166 | });
167 |
168 | describe('hook postEntity on entity', () => {
169 | beforeEach(done => {
170 | helpers
171 | .run(path.join(__dirname, '../generators/app'))
172 | .withPrompts({
173 | moduleName: 'hello-world',
174 | moduleDescription: 'hello world',
175 | hook: 'postEntity',
176 | hookCallback: 'entity',
177 | githubName: 'githubName',
178 | authorName: 'authorName',
179 | authorEmail: 'mail@mail',
180 | authorUrl: 'authorUrl',
181 | license: 'no',
182 | })
183 | .on('end', done);
184 | });
185 | it('generates default files', () => {
186 | assert.file(expectedFiles.module);
187 | });
188 | it('generates entity files', () => {
189 | assert.file(expectedFiles.entity);
190 | });
191 | });
192 | });
193 |
--------------------------------------------------------------------------------
/test/input-validation.spec.js:
--------------------------------------------------------------------------------
1 | const assert = require('yeoman-assert');
2 | const { validateGitHubName } = require('../generators/app/input-validation');
3 |
4 | describe('input validation', () => {
5 | describe('validateGitHubName', () => {
6 | it('for invalid syntax: Test_Person', () => {
7 | const result = validateGitHubName('Test_Person');
8 | assert(result === 'Your username is mandatory, cannot contain special characters or a blank space');
9 | });
10 |
11 | it('for invalid syntax: -Test_Person', () => {
12 | const result = validateGitHubName('-Test-Person');
13 | assert(result === 'Your username is mandatory, cannot contain special characters or a blank space');
14 | });
15 |
16 | it('for invalid syntax: Test-Person-', () => {
17 | const result = validateGitHubName('Test-Person-');
18 | assert(result === 'Your username is mandatory, cannot contain special characters or a blank space');
19 | });
20 |
21 | it('for invalid syntax: -Test-Person', () => {
22 | const result = validateGitHubName('-Test-Person-');
23 | assert(result === 'Your username is mandatory, cannot contain special characters or a blank space');
24 | });
25 |
26 | it('for invalid syntax: -TestPerson', () => {
27 | const result = validateGitHubName('-Test-Person');
28 | assert(result === 'Your username is mandatory, cannot contain special characters or a blank space');
29 | });
30 |
31 | it('for invalid syntax: TestPerson-', () => {
32 | const result = validateGitHubName('Test-Person-');
33 | assert(result === 'Your username is mandatory, cannot contain special characters or a blank space');
34 | });
35 |
36 | it('for invalid syntax: Test--Person', () => {
37 | const result = validateGitHubName('Test--Person');
38 | assert(result === 'Your username is mandatory, cannot contain special characters or a blank space');
39 | });
40 |
41 | it('for valid syntax: Test-Person', () => {
42 | const result = validateGitHubName('Test-Person');
43 | assert(result === true);
44 | });
45 |
46 | it('for valid syntax: Test-Person-Person', () => {
47 | const result = validateGitHubName('Test-Person-Person');
48 | assert(result === true);
49 | });
50 |
51 | it('for valid syntax: TestPerson', () => {
52 | const result = validateGitHubName('TestPerson');
53 | assert(result === true);
54 | });
55 |
56 | it('for valid syntax: TestPerson', () => {
57 | const result = validateGitHubName('Test1Person123');
58 | assert(result === true);
59 | });
60 |
61 | it('for valid syntax: TestPerson', () => {
62 | const result = validateGitHubName('Test1-Person123');
63 | assert(result === true);
64 | });
65 | });
66 | });
67 |
--------------------------------------------------------------------------------