├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml ├── release.yml └── workflows │ ├── cgl.yaml │ └── release.yaml ├── LICENSE.md ├── README.md ├── composer.json ├── composer.lock ├── config.yaml ├── docs └── assets │ ├── header.png │ └── header.svg └── templates ├── next-steps.html.twig └── src ├── .ddev └── config.yaml.twig ├── .deployment └── hosts.yaml.twig ├── .editorconfig.twig ├── .gitignore.twig ├── .php-cs-fixer.dist.php ├── composer.json.twig ├── config └── sites │ └── main │ └── config.yaml.twig ├── deploy.php.twig ├── packages └── .gitkeep ├── phpstan.neon ├── phpunit.xml ├── public └── FIRST_INSTALL ├── rector.php.twig └── typoscript-lint.yml.twig /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug report 2 | description: Create a report to help improve this package. 3 | title: "[BUG]" 4 | labels: 5 | - bug 6 | body: 7 | - type: input 8 | id: php-version 9 | attributes: 10 | label: PHP version 11 | description: What PHP version are you using? 12 | placeholder: 'e.g. 8.1.5' 13 | validations: 14 | required: true 15 | - type: input 16 | id: composer-version 17 | attributes: 18 | label: Composer version 19 | description: What Composer version are you using? 20 | placeholder: 'e.g. 2.3.5' 21 | validations: 22 | required: true 23 | - type: input 24 | id: package-version 25 | attributes: 26 | label: Package version 27 | description: What version of this package are you using? 28 | placeholder: 'e.g. 0.1.0' 29 | validations: 30 | required: true 31 | - type: input 32 | id: project-builder-version 33 | attributes: 34 | label: Project Builder version 35 | description: What version of the CPS Project Builder are you using? 36 | placeholder: 'e.g. 0.1.0' 37 | validations: 38 | required: true 39 | - type: input 40 | id: operating-system 41 | attributes: 42 | label: Operating system 43 | description: What operating system are you using? 44 | placeholder: 'e.g. macOS 11.4' 45 | validations: 46 | required: true 47 | - type: textarea 48 | attributes: 49 | label: Current behavior 50 | description: A clear and concise description of what the bug is. 51 | - type: textarea 52 | attributes: 53 | label: Expected behavior 54 | description: A clear and concise description of what you expected to happen. 55 | - type: textarea 56 | attributes: 57 | label: Steps to reproduce 58 | description: If possible, describe steps to reproduce the behavior. 59 | placeholder: | 60 | 1. Go to '...' 61 | 2. Click on '....' 62 | 3. Scroll down to '....' 63 | 4. See error 64 | - type: textarea 65 | attributes: 66 | label: Additional context 67 | description: Add any other context about the problem here. 68 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature request 2 | description: Suggest an idea for this project. 3 | title: "[FEATURE]" 4 | labels: 5 | - enhancement 6 | body: 7 | - type: textarea 8 | attributes: 9 | label: Is your feature request related to a problem? 10 | description: A clear and concise description of what the problem is. 11 | placeholder: I'm always frustrated when [...] 12 | validations: 13 | required: true 14 | - type: textarea 15 | attributes: 16 | label: Describe the solution you'd like 17 | description: A clear and concise description of what you want to happen. 18 | validations: 19 | required: true 20 | - type: textarea 21 | attributes: 22 | label: Describe alternatives you've considered 23 | description: > 24 | A clear and concise description of any alternative solutions or features 25 | you've considered. 26 | - type: textarea 27 | attributes: 28 | label: Additional context 29 | description: Add any other context or screenshots about the feature request here. 30 | -------------------------------------------------------------------------------- /.github/release.yml: -------------------------------------------------------------------------------- 1 | changelog: 2 | exclude: 3 | labels: 4 | - duplicate 5 | - 'good first issue' 6 | - 'help wanted' 7 | - invalid 8 | - question 9 | - wontfix 10 | categories: 11 | - title: ⚡ Breaking 12 | labels: 13 | - breaking 14 | - title: 🚀 Improved 15 | labels: 16 | - enhancement 17 | - title: 🚑 Fixed 18 | labels: 19 | - bug 20 | - title: 👷 Changed 21 | labels: 22 | - maintenance 23 | - title: 📖 Documentation 24 | labels: 25 | - documentation 26 | - title: ⚙️ Dependencies 27 | labels: 28 | - dependencies 29 | - title: Other changes 30 | labels: 31 | - "*" 32 | -------------------------------------------------------------------------------- /.github/workflows/cgl.yaml: -------------------------------------------------------------------------------- 1 | name: CGL 2 | on: 3 | push: 4 | branches: 5 | - main 6 | pull_request: 7 | branches: 8 | - main 9 | 10 | jobs: 11 | cgl: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v5 15 | with: 16 | fetch-depth: 0 17 | 18 | # Prepare environment 19 | - name: Setup PHP 20 | uses: shivammathur/setup-php@v2 21 | with: 22 | php-version: 8.2 23 | tools: composer:v2, composer-unused 24 | coverage: none 25 | 26 | # Validation 27 | - name: Validate composer.json 28 | run: composer validate 29 | 30 | # Install dependencies 31 | - name: Install Composer dependencies 32 | uses: ramsey/composer-install@v3 33 | 34 | # Check Composer dependencies 35 | - name: Check for unused dependencies 36 | run: composer-unused --excludePackage=cpsit/project-builder 37 | 38 | # Linting 39 | - name: Lint composer.json 40 | run: composer lint:composer 41 | - name: Lint .editorconfig 42 | run: composer lint:editorconfig 43 | - name: Lint Twig templates 44 | run: composer lint:twig 45 | 46 | # Schema 47 | - name: Validate config.yaml against JSON schema 48 | run: composer validate-schema 49 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - '*' 6 | 7 | jobs: 8 | # Job: Create release 9 | release: 10 | if: startsWith(github.ref, 'refs/tags/') 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v5 14 | with: 15 | fetch-depth: 0 16 | 17 | # Check if tag is valid 18 | - name: Check tag 19 | run: | 20 | if ! [[ ${{ github.ref }} =~ ^refs/tags/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then 21 | exit 1 22 | fi 23 | 24 | # Create release 25 | - name: Create release 26 | uses: ncipollo/release-action@v1 27 | with: 28 | token: ${{ secrets.RELEASE_TOKEN }} 29 | generateReleaseNotes: true 30 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | ## GNU GENERAL PUBLIC LICENSE 2 | 3 | Version 3, 29 June 2007 4 | 5 | Copyright (C) 2007 Free Software Foundation, Inc. 6 | 7 | 8 | Everyone is permitted to copy and distribute verbatim copies of this 9 | license document, but changing it is not allowed. 10 | 11 | ### Preamble 12 | 13 | The GNU General Public License is a free, copyleft license for 14 | software and other kinds of works. 15 | 16 | The licenses for most software and other practical works are designed 17 | to take away your freedom to share and change the works. By contrast, 18 | the GNU General Public License is intended to guarantee your freedom 19 | to share and change all versions of a program--to make sure it remains 20 | free software for all its users. We, the Free Software Foundation, use 21 | the GNU General Public License for most of our software; it applies 22 | also to any other work released this way by its authors. You can apply 23 | it to your programs, too. 24 | 25 | When we speak of free software, we are referring to freedom, not 26 | price. Our General Public Licenses are designed to make sure that you 27 | have the freedom to distribute copies of free software (and charge for 28 | them if you wish), that you receive source code or can get it if you 29 | want it, that you can change the software or use pieces of it in new 30 | free programs, and that you know you can do these things. 31 | 32 | To protect your rights, we need to prevent others from denying you 33 | these rights or asking you to surrender the rights. Therefore, you 34 | have certain responsibilities if you distribute copies of the 35 | software, or if you modify it: responsibilities to respect the freedom 36 | 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 56 | manufacturer can do so. This is fundamentally incompatible with the 57 | aim of protecting users' freedom to change the software. The 58 | systematic pattern of such abuse occurs in the area of products for 59 | individuals to use, which is precisely where it is most unacceptable. 60 | Therefore, we have designed this version of the GPL to prohibit the 61 | practice for those products. If such problems arise substantially in 62 | other domains, we stand ready to extend this provision to those 63 | domains in future versions of the GPL, as needed to protect the 64 | freedom of users. 65 | 66 | Finally, every program is threatened constantly by software patents. 67 | States should not allow patents to restrict development and use of 68 | software on general-purpose computers, but in those that do, we wish 69 | to avoid the special danger that patents applied to a free program 70 | could make it effectively proprietary. To prevent this, the GPL 71 | assures that patents cannot be used to render the program non-free. 72 | 73 | The precise terms and conditions for copying, distribution and 74 | modification follow. 75 | 76 | ### TERMS AND CONDITIONS 77 | 78 | #### 0. Definitions. 79 | 80 | "This License" refers to version 3 of the GNU General Public License. 81 | 82 | "Copyright" also means copyright-like laws that apply to other kinds 83 | of works, such as semiconductor masks. 84 | 85 | "The Program" refers to any copyrightable work licensed under this 86 | License. Each licensee is addressed as "you". "Licensees" and 87 | "recipients" may be individuals or organizations. 88 | 89 | To "modify" a work means to copy from or adapt all or part of the work 90 | in a fashion requiring copyright permission, other than the making of 91 | an exact copy. The resulting work is called a "modified version" of 92 | the earlier work or a work "based on" the earlier work. 93 | 94 | A "covered work" means either the unmodified Program or a work based 95 | on the Program. 96 | 97 | To "propagate" a work means to do anything with it that, without 98 | permission, would make you directly or secondarily liable for 99 | infringement under applicable copyright law, except executing it on a 100 | computer or modifying a private copy. Propagation includes copying, 101 | distribution (with or without modification), making available to the 102 | public, and in some countries other activities as well. 103 | 104 | To "convey" a work means any kind of propagation that enables other 105 | parties to make or receive copies. Mere interaction with a user 106 | through a computer network, with no transfer of a copy, is not 107 | conveying. 108 | 109 | An interactive user interface displays "Appropriate Legal Notices" to 110 | the extent that it includes a convenient and prominently visible 111 | feature that (1) displays an appropriate copyright notice, and (2) 112 | tells the user that there is no warranty for the work (except to the 113 | extent that warranties are provided), that licensees may convey the 114 | work under this License, and how to view a copy of this License. If 115 | the interface presents a list of user commands or options, such as a 116 | menu, a prominent item in the list meets this criterion. 117 | 118 | #### 1. Source Code. 119 | 120 | The "source code" for a work means the preferred form of the work for 121 | making modifications to it. "Object code" means any non-source form of 122 | a work. 123 | 124 | A "Standard Interface" means an interface that either is an official 125 | standard defined by a recognized standards body, or, in the case of 126 | interfaces specified for a particular programming language, one that 127 | is widely used among developers working in that language. 128 | 129 | The "System Libraries" of an executable work include anything, other 130 | than the work as a whole, that (a) is included in the normal form of 131 | packaging a Major Component, but which is not part of that Major 132 | Component, and (b) serves only to enable use of the work with that 133 | Major Component, or to implement a Standard Interface for which an 134 | implementation is available to the public in source code form. A 135 | "Major Component", in this context, means a major essential component 136 | (kernel, window system, and so on) of the specific operating system 137 | (if any) on which the executable work runs, or a compiler used to 138 | produce the work, or an object code interpreter used to run it. 139 | 140 | The "Corresponding Source" for a work in object code form means all 141 | the source code needed to generate, install, and (for an executable 142 | work) run the object code and to modify the work, including scripts to 143 | control those activities. However, it does not include the work's 144 | System Libraries, or general-purpose tools or generally available free 145 | programs which are used unmodified in performing those activities but 146 | which are not part of the work. For example, Corresponding Source 147 | includes interface definition files associated with source files for 148 | the work, and the source code for shared libraries and dynamically 149 | linked subprograms that the work is specifically designed to require, 150 | such as by intimate data communication or control flow between those 151 | subprograms and other parts of the work. 152 | 153 | The Corresponding Source need not include anything that users can 154 | regenerate automatically from other parts of the Corresponding Source. 155 | 156 | The Corresponding Source for a work in source code form is that same 157 | work. 158 | 159 | #### 2. Basic Permissions. 160 | 161 | All rights granted under this License are granted for the term of 162 | copyright on the Program, and are irrevocable provided the stated 163 | conditions are met. This License explicitly affirms your unlimited 164 | permission to run the unmodified Program. The output from running a 165 | covered work is covered by this License only if the output, given its 166 | content, constitutes a covered work. This License acknowledges your 167 | rights of fair use or other equivalent, as provided by copyright law. 168 | 169 | You may make, run and propagate covered works that you do not convey, 170 | without conditions so long as your license otherwise remains in force. 171 | You may convey covered works to others for the sole purpose of having 172 | them make modifications exclusively for you, or provide you with 173 | facilities for running those works, provided that you comply with the 174 | terms of this License in conveying all material for which you do not 175 | control copyright. Those thus making or running the covered works for 176 | you must do so exclusively on your behalf, under your direction and 177 | control, on terms that prohibit them from making any copies of your 178 | copyrighted material outside their relationship with you. 179 | 180 | Conveying under any other circumstances is permitted solely under the 181 | conditions stated below. Sublicensing is not allowed; section 10 makes 182 | it unnecessary. 183 | 184 | #### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 185 | 186 | No covered work shall be deemed part of an effective technological 187 | measure under any applicable law fulfilling obligations under article 188 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 189 | similar laws prohibiting or restricting circumvention of such 190 | measures. 191 | 192 | When you convey a covered work, you waive any legal power to forbid 193 | circumvention of technological measures to the extent such 194 | circumvention is effected by exercising rights under this License with 195 | respect to the covered work, and you disclaim any intention to limit 196 | operation or modification of the work as a means of enforcing, against 197 | the work's users, your or third parties' legal rights to forbid 198 | circumvention of technological measures. 199 | 200 | #### 4. Conveying Verbatim Copies. 201 | 202 | You may convey verbatim copies of the Program's source code as you 203 | receive it, in any medium, provided that you conspicuously and 204 | appropriately publish on each copy an appropriate copyright notice; 205 | keep intact all notices stating that this License and any 206 | non-permissive terms added in accord with section 7 apply to the code; 207 | keep intact all notices of the absence of any warranty; and give all 208 | recipients a copy of this License along with the Program. 209 | 210 | You may charge any price or no price for each copy that you convey, 211 | and you may offer support or warranty protection for a fee. 212 | 213 | #### 5. Conveying Modified Source Versions. 214 | 215 | You may convey a work based on the Program, or the modifications to 216 | produce it from the Program, in the form of source code under the 217 | terms of section 4, provided that you also meet all of these 218 | conditions: 219 | 220 | - a) The work must carry prominent notices stating that you modified 221 | it, and giving a relevant date. 222 | - b) The work must carry prominent notices stating that it is 223 | released under this License and any conditions added under 224 | section 7. This requirement modifies the requirement in section 4 225 | to "keep intact all notices". 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 | - d) If the work has interactive user interfaces, each must display 234 | Appropriate Legal Notices; however, if the Program has interactive 235 | interfaces that do not display Appropriate Legal Notices, your 236 | work need not make them do so. 237 | 238 | A compilation of a covered work with other separate and independent 239 | works, which are not by their nature extensions of the covered work, 240 | and which are not combined with it such as to form a larger program, 241 | in or on a volume of a storage or distribution medium, is called an 242 | "aggregate" if the compilation and its resulting copyright are not 243 | used to limit the access or legal rights of the compilation's users 244 | beyond what the individual works permit. Inclusion of a covered work 245 | in an aggregate does not cause this License to apply to the other 246 | parts of the aggregate. 247 | 248 | #### 6. Conveying Non-Source Forms. 249 | 250 | You may convey a covered work in object code form under the terms of 251 | sections 4 and 5, provided that you also convey the machine-readable 252 | Corresponding Source under the terms of this License, in one of these 253 | ways: 254 | 255 | - a) Convey the object code in, or embodied in, a physical product 256 | (including a physical distribution medium), accompanied by the 257 | Corresponding Source fixed on a durable physical medium 258 | customarily used for software interchange. 259 | - b) Convey the object code in, or embodied in, a physical product 260 | (including a physical distribution medium), accompanied by a 261 | written offer, valid for at least three years and valid for as 262 | long as you offer spare parts or customer support for that product 263 | model, to give anyone who possesses the object code either (1) a 264 | copy of the Corresponding Source for all the software in the 265 | product that is covered by this License, on a durable physical 266 | medium customarily used for software interchange, for a price no 267 | more than your reasonable cost of physically performing this 268 | conveying of source, or (2) access to copy the Corresponding 269 | Source from a network server at no charge. 270 | - c) Convey individual copies of the object code with a copy of the 271 | written offer to provide the Corresponding Source. This 272 | alternative is allowed only occasionally and noncommercially, and 273 | only if you received the object code with such an offer, in accord 274 | with subsection 6b. 275 | - d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | - e) Convey the object code using peer-to-peer transmission, 288 | provided you inform other peers where the object code and 289 | Corresponding Source of the work are being offered to the general 290 | public at no charge under subsection 6d. 291 | 292 | A separable portion of the object code, whose source code is excluded 293 | from the Corresponding Source as a System Library, need not be 294 | included in conveying the object code work. 295 | 296 | A "User Product" is either (1) a "consumer product", which means any 297 | tangible personal property which is normally used for personal, 298 | family, or household purposes, or (2) anything designed or sold for 299 | incorporation into a dwelling. In determining whether a product is a 300 | consumer product, doubtful cases shall be resolved in favor of 301 | coverage. For a particular product received by a particular user, 302 | "normally used" refers to a typical or common use of that class of 303 | product, regardless of the status of the particular user or of the way 304 | in which the particular user actually uses, or expects or is expected 305 | to use, the product. A product is a consumer product regardless of 306 | whether the product has substantial commercial, industrial or 307 | non-consumer uses, unless such uses represent the only significant 308 | mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to 312 | install and execute modified versions of a covered work in that User 313 | Product from a modified version of its Corresponding Source. The 314 | information must suffice to ensure that the continued functioning of 315 | the modified object code is in no case prevented or interfered with 316 | solely because modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or 331 | updates for a work that has been modified or installed by the 332 | recipient, or for the User Product in which it has been modified or 333 | installed. Access to a network may be denied when the modification 334 | itself materially and adversely affects the operation of the network 335 | or violates the rules and protocols for communication across the 336 | network. 337 | 338 | Corresponding Source conveyed, and Installation Information provided, 339 | in accord with this section must be in a format that is publicly 340 | documented (and with an implementation available to the public in 341 | source code form), and must require no special password or key for 342 | unpacking, reading or copying. 343 | 344 | #### 7. Additional Terms. 345 | 346 | "Additional permissions" are terms that supplement the terms of this 347 | License by making exceptions from one or more of its conditions. 348 | Additional permissions that are applicable to the entire Program shall 349 | be treated as though they were included in this License, to the extent 350 | that they are valid under applicable law. If additional permissions 351 | apply only to part of the Program, that part may be used separately 352 | under those permissions, but the entire Program remains governed by 353 | this License without regard to the additional permissions. 354 | 355 | When you convey a copy of a covered work, you may at your option 356 | remove any additional permissions from that copy, or from any part of 357 | it. (Additional permissions may be written to require their own 358 | removal in certain cases when you modify the work.) You may place 359 | additional permissions on material, added by you to a covered work, 360 | for which you have or can give appropriate copyright permission. 361 | 362 | Notwithstanding any other provision of this License, for material you 363 | add to a covered work, you may (if authorized by the copyright holders 364 | of that material) supplement the terms of this License with terms: 365 | 366 | - a) Disclaiming warranty or limiting liability differently from the 367 | terms of sections 15 and 16 of this License; or 368 | - b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | - c) Prohibiting misrepresentation of the origin of that material, 372 | or requiring that modified versions of such material be marked in 373 | reasonable ways as different from the original version; or 374 | - d) Limiting the use for publicity purposes of names of licensors 375 | or authors of the material; or 376 | - e) Declining to grant rights under trademark law for use of some 377 | trade names, trademarks, or service marks; or 378 | - f) Requiring indemnification of licensors and authors of that 379 | material by anyone who conveys the material (or modified versions 380 | of it) with contractual assumptions of liability to the recipient, 381 | for any liability that these contractual assumptions directly 382 | impose on those licensors and authors. 383 | 384 | All other non-permissive additional terms are considered "further 385 | restrictions" within the meaning of section 10. If the Program as you 386 | received it, or any part of it, contains a notice stating that it is 387 | governed by this License along with a term that is a further 388 | restriction, you may remove that term. If a license document contains 389 | a further restriction but permits relicensing or conveying under this 390 | License, you may add to a covered work material governed by the terms 391 | of that license document, provided that the further restriction does 392 | not survive such relicensing or conveying. 393 | 394 | If you add terms to a covered work in accord with this section, you 395 | must place, in the relevant source files, a statement of the 396 | additional terms that apply to those files, or a notice indicating 397 | where to find the applicable terms. 398 | 399 | Additional terms, permissive or non-permissive, may be stated in the 400 | form of a separately written license, or stated as exceptions; the 401 | above requirements apply either way. 402 | 403 | #### 8. Termination. 404 | 405 | You may not propagate or modify a covered work except as expressly 406 | provided under this License. Any attempt otherwise to propagate or 407 | modify it is void, and will automatically terminate your rights under 408 | this License (including any patent licenses granted under the third 409 | paragraph of section 11). 410 | 411 | However, if you cease all violation of this License, then your license 412 | from a particular copyright holder is reinstated (a) provisionally, 413 | unless and until the copyright holder explicitly and finally 414 | terminates your license, and (b) permanently, if the copyright holder 415 | fails to notify you of the violation by some reasonable means prior to 416 | 60 days after the cessation. 417 | 418 | Moreover, your license from a particular copyright holder is 419 | reinstated permanently if the copyright holder notifies you of the 420 | violation by some reasonable means, this is the first time you have 421 | received notice of violation of this License (for any work) from that 422 | copyright holder, and you cure the violation prior to 30 days after 423 | your receipt of the notice. 424 | 425 | Termination of your rights under this section does not terminate the 426 | licenses of parties who have received copies or rights from you under 427 | this License. If your rights have been terminated and not permanently 428 | reinstated, you do not qualify to receive new licenses for the same 429 | material under section 10. 430 | 431 | #### 9. Acceptance Not Required for Having Copies. 432 | 433 | You are not required to accept this License in order to receive or run 434 | a copy of the Program. Ancillary propagation of a covered work 435 | occurring solely as a consequence of using peer-to-peer transmission 436 | to receive a copy likewise does not require acceptance. However, 437 | nothing other than this License grants you permission to propagate or 438 | modify any covered work. These actions infringe copyright if you do 439 | not accept this License. Therefore, by modifying or propagating a 440 | covered work, you indicate your acceptance of this License to do so. 441 | 442 | #### 10. Automatic Licensing of Downstream Recipients. 443 | 444 | Each time you convey a covered work, the recipient automatically 445 | receives a license from the original licensors, to run, modify and 446 | propagate that work, subject to this License. You are not responsible 447 | for enforcing compliance by third parties with this License. 448 | 449 | An "entity transaction" is a transaction transferring control of an 450 | organization, or substantially all assets of one, or subdividing an 451 | organization, or merging organizations. If propagation of a covered 452 | work results from an entity transaction, each party to that 453 | transaction who receives a copy of the work also receives whatever 454 | licenses to the work the party's predecessor in interest had or could 455 | give under the previous paragraph, plus a right to possession of the 456 | Corresponding Source of the work from the predecessor in interest, if 457 | the predecessor has it or can get it with reasonable efforts. 458 | 459 | You may not impose any further restrictions on the exercise of the 460 | rights granted or affirmed under this License. For example, you may 461 | not impose a license fee, royalty, or other charge for exercise of 462 | rights granted under this License, and you may not initiate litigation 463 | (including a cross-claim or counterclaim in a lawsuit) alleging that 464 | any patent claim is infringed by making, using, selling, offering for 465 | sale, or importing the Program or any portion of it. 466 | 467 | #### 11. Patents. 468 | 469 | A "contributor" is a copyright holder who authorizes use under this 470 | License of the Program or a work on which the Program is based. The 471 | work thus licensed is called the contributor's "contributor version". 472 | 473 | A contributor's "essential patent claims" are all patent claims owned 474 | or controlled by the contributor, whether already acquired or 475 | hereafter acquired, that would be infringed by some manner, permitted 476 | by this License, of making, using, or selling its contributor version, 477 | but do not include claims that would be infringed only as a 478 | consequence of further modification of the contributor version. For 479 | purposes of this definition, "control" includes the right to grant 480 | patent sublicenses in a manner consistent with the requirements of 481 | this License. 482 | 483 | Each contributor grants you a non-exclusive, worldwide, royalty-free 484 | patent license under the contributor's essential patent claims, to 485 | make, use, sell, offer for sale, import and otherwise run, modify and 486 | propagate the contents of its contributor version. 487 | 488 | In the following three paragraphs, a "patent license" is any express 489 | agreement or commitment, however denominated, not to enforce a patent 490 | (such as an express permission to practice a patent or covenant not to 491 | sue for patent infringement). To "grant" such a patent license to a 492 | party means to make such an agreement or commitment not to enforce a 493 | patent against the party. 494 | 495 | If you convey a covered work, knowingly relying on a patent license, 496 | and the Corresponding Source of the work is not available for anyone 497 | to copy, free of charge and under the terms of this License, through a 498 | publicly available network server or other readily accessible means, 499 | then you must either (1) cause the Corresponding Source to be so 500 | available, or (2) arrange to deprive yourself of the benefit of the 501 | patent license for this particular work, or (3) arrange, in a manner 502 | consistent with the requirements of this License, to extend the patent 503 | license to downstream recipients. "Knowingly relying" means you have 504 | actual knowledge that, but for the patent license, your conveying the 505 | covered work in a country, or your recipient's use of the covered work 506 | in a country, would infringe one or more identifiable patents in that 507 | country that you have reason to believe are valid. 508 | 509 | If, pursuant to or in connection with a single transaction or 510 | arrangement, you convey, or propagate by procuring conveyance of, a 511 | covered work, and grant a patent license to some of the parties 512 | receiving the covered work authorizing them to use, propagate, modify 513 | or convey a specific copy of the covered work, then the patent license 514 | you grant is automatically extended to all recipients of the covered 515 | work and works based on it. 516 | 517 | A patent license is "discriminatory" if it does not include within the 518 | scope of its coverage, prohibits the exercise of, or is conditioned on 519 | the non-exercise of one or more of the rights that are specifically 520 | granted under this License. You may not convey a covered work if you 521 | are a party to an arrangement with a third party that is in the 522 | business of distributing software, under which you make payment to the 523 | third party based on the extent of your activity of conveying the 524 | work, and under which the third party grants, to any of the parties 525 | who would receive the covered work from you, a discriminatory patent 526 | license (a) in connection with copies of the covered work conveyed by 527 | you (or copies made from those copies), or (b) primarily for and in 528 | connection with specific products or compilations that contain the 529 | covered work, unless you entered into that arrangement, or that patent 530 | license was granted, prior to 28 March 2007. 531 | 532 | Nothing in this License shall be construed as excluding or limiting 533 | any implied license or other defenses to infringement that may 534 | otherwise be available to you under applicable patent law. 535 | 536 | #### 12. No Surrender of Others' Freedom. 537 | 538 | If conditions are imposed on you (whether by court order, agreement or 539 | otherwise) that contradict the conditions of this License, they do not 540 | excuse you from the conditions of this License. If you cannot convey a 541 | covered work so as to satisfy simultaneously your obligations under 542 | this License and any other pertinent obligations, then as a 543 | consequence you may not convey it at all. For example, if you agree to 544 | terms that obligate you to collect a royalty for further conveying 545 | from those to whom you convey the Program, the only way you could 546 | satisfy both those terms and this License would be to refrain entirely 547 | from conveying the Program. 548 | 549 | #### 13. Use with the GNU Affero General Public License. 550 | 551 | Notwithstanding any other provision of this License, you have 552 | permission to link or combine any covered work with a work licensed 553 | under version 3 of the GNU Affero General Public License into a single 554 | combined work, and to convey the resulting work. The terms of this 555 | License will continue to apply to the part which is the covered work, 556 | but the special requirements of the GNU Affero General Public License, 557 | section 13, concerning interaction through a network will apply to the 558 | combination as such. 559 | 560 | #### 14. Revised Versions of this License. 561 | 562 | The Free Software Foundation may publish revised and/or new versions 563 | of the GNU General Public License from time to time. Such new versions 564 | will be similar in spirit to the present version, but may differ in 565 | detail to address new problems or concerns. 566 | 567 | Each version is given a distinguishing version number. If the Program 568 | specifies that a certain numbered version of the GNU General Public 569 | License "or any later version" applies to it, you have the option of 570 | following the terms and conditions either of that numbered version or 571 | of any later version published by the Free Software Foundation. If the 572 | Program does not specify a version number of the GNU General Public 573 | License, you may choose any version ever published by the Free 574 | Software Foundation. 575 | 576 | If the Program specifies that a proxy can decide which future versions 577 | of the GNU General Public License can be used, that proxy's public 578 | statement of acceptance of a version permanently authorizes you to 579 | choose that version for the Program. 580 | 581 | Later license versions may give you additional or different 582 | permissions. However, no additional obligations are imposed on any 583 | author or copyright holder as a result of your choosing to follow a 584 | later version. 585 | 586 | #### 15. Disclaimer of Warranty. 587 | 588 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 589 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 590 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT 591 | WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT 592 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 593 | A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND 594 | PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE 595 | DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR 596 | CORRECTION. 597 | 598 | #### 16. Limitation of Liability. 599 | 600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR 602 | CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 603 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES 604 | ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT 605 | NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR 606 | LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM 607 | TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER 608 | PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 609 | 610 | #### 17. Interpretation of Sections 15 and 16. 611 | 612 | If the disclaimer of warranty and limitation of liability provided 613 | above cannot be given local legal effect according to their terms, 614 | reviewing courts shall apply local law that most closely approximates 615 | an absolute waiver of all civil liability in connection with the 616 | Program, unless a warranty or assumption of liability accompanies a 617 | copy of the Program in return for a fee. 618 | 619 | END OF TERMS AND CONDITIONS 620 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | ![Terminal window](docs/assets/header.svg) 4 | 5 | # TYPO3 CMS project builder template 6 | 7 | [![CGL](https://img.shields.io/github/actions/workflow/status/CPS-IT/typo3-project-template/cgl.yaml?label=cgl)](https://github.com/CPS-IT/typo3-project-template/actions/workflows/cgl.yaml) 8 | [![Latest Stable Version](https://img.shields.io/packagist/v/cpsit/typo3-project-template?label=version)](https://packagist.org/packages/cpsit/typo3-project-template) 9 | [![Total Downloads](https://img.shields.io/packagist/dt/cpsit/typo3-project-template?color=brightgreen)](https://packagist.org/packages/cpsit/typo3-project-template) 10 | ![License](https://img.shields.io/packagist/l/cpsit/typo3-project-template) 11 | 12 | 📦 [Packagist](https://packagist.org/packages/cpsit/typo3-project-template) | 13 | 💾 [Repository](https://github.com/CPS-IT/typo3-project-template) | 14 | 🐛 [Issue tracker](https://github.com/CPS-IT/typo3-project-template/issues) 15 | 16 |
17 | 18 | This is a template repository for the [CPS Project Builder](https://github.com/CPS-IT/project-builder). 19 | It provides a complete template for new [TYPO3 CMS](https://typo3.org) projects, including a 20 | ready-to-use DDEV configuration and basic configuration for deployment with Deployer. 21 | 22 | ## 🚀 Features 23 | 24 | ### Core features 25 | 26 | * Composer-based [TYPO3 CMS](https://typo3.org) project template 27 | * Ready-to-use [DDEV](https://ddev.readthedocs.io) configuration 28 | * Compatible with TYPO3 11.5 LTS, 12.4 LTS and 13.4 LTS 29 | * Support of current stable PHP versions, starting from PHP 8.1 30 | 31 | ### Optional features 32 | 33 | * Static code analysis template with [PHPStan](https://phpstan.org/) 34 | * Automatic code migration with [TYPO3 Rector](https://www.typo3-rector.com/) 35 | * Basic [Deployer](https://deployer.org/) deployment configuration 36 | 37 | ## 🔥 Getting started 38 | 39 | 1. [Create](https://project-builder.cps-it.de/usage/composer.html) a new project: 40 | 41 | ```bash 42 | composer create-project cpsit/project-builder 43 | ``` 44 | 45 | 2. Select the package `cpsit/typo3-project-template`. 46 | 3. Answer all questions and you're ready to go. 47 | 48 | ## 🧑‍💻 Development 49 | 50 | Please have a look at [`CONTRIBUTING.md`](CONTRIBUTING.md). 51 | 52 | ## ⭐ License 53 | 54 | This project is licensed under [GNU General Public License 3.0 (or later)](LICENSE.md). 55 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cpsit/typo3-project-template", 3 | "description": "TYPO3 CMS project template", 4 | "license": "GPL-3.0-or-later", 5 | "type": "project-builder-template", 6 | "authors": [ 7 | { 8 | "name": "Elias Häußler", 9 | "email": "e.haeussler@familie-redlich.de", 10 | "homepage": "https://www.familie-redlich.de", 11 | "role": "Maintainer" 12 | } 13 | ], 14 | "require": { 15 | "cpsit/project-builder": "^1.6 || ^2.0" 16 | }, 17 | "require-dev": { 18 | "armin/editorconfig-cli": "^2.0", 19 | "ergebnis/composer-normalize": "^2.28", 20 | "friendsoftwig/twigcs": "^6.0" 21 | }, 22 | "config": { 23 | "allow-plugins": { 24 | "ergebnis/composer-normalize": true 25 | }, 26 | "sort-packages": true 27 | }, 28 | "scripts": { 29 | "fix": [ 30 | "@fix:composer", 31 | "@fix:editorconfig" 32 | ], 33 | "fix:composer": "@composer normalize", 34 | "fix:editorconfig": "ec --fix", 35 | "lint": [ 36 | "@lint:composer", 37 | "@lint:editorconfig", 38 | "@lint:twig" 39 | ], 40 | "lint:composer": "@composer normalize --dry-run", 41 | "lint:editorconfig": "ec", 42 | "lint:twig": "twigcs templates", 43 | "validate-schema": "docker run --rm -v \"$(pwd)\":/code swaggest/json-cli json-cli validate-schema config.yaml vendor/cpsit/project-builder/resources/config.schema.json" 44 | }, 45 | "scripts-descriptions": { 46 | "fix": "Fix all code quality issues reported by the registered linters", 47 | "fix:composer": "Fix all issues in `composer.json`", 48 | "fix:editorconfig": "Fix all styling issues violating the `.editorconfig` rules", 49 | "lint": "Run all registered linters to detect code quality issues", 50 | "lint:composer": "Lint `composer.json` to detect unnormalized styles", 51 | "lint:editorconfig": "Lint all project files to detect violations of the `.editorconfig` rules", 52 | "lint:twig": "Lint all Twig templates to detect coding style violations", 53 | "validate-schema": "Validate the `config.yaml` file for possible schema violations" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /config.yaml: -------------------------------------------------------------------------------- 1 | name: TYPO3 CMS project 2 | 3 | steps: 4 | - type: collectBuildInstructions 5 | - type: processSourceFiles 6 | options: 7 | fileConditions: 8 | # Deployer 9 | - path: '.deployment/*' 10 | if: 'features["deployer"]' 11 | - path: 'deploy.php.twig' 12 | if: 'features["deployer"]' 13 | # PHPStan 14 | - path: 'phpstan.neon' 15 | if: 'features["phpstan"]' 16 | # Rector 17 | - path: 'rector.php.twig' 18 | if: 'features["rector"]' 19 | - type: generateBuildArtifact 20 | - type: mirrorProcessedFiles 21 | - type: showNextSteps 22 | options: 23 | templateFile: templates/next-steps.html.twig 24 | 25 | properties: 26 | # Project 27 | - identifier: project 28 | name: Project 29 | properties: 30 | - identifier: name 31 | name: Project name 32 | type: staticValue 33 | validators: 34 | - type: notEmpty 35 | - identifier: vendor 36 | name: Vendor name 37 | type: staticValue 38 | validators: 39 | - type: notEmpty 40 | - identifier: package_name 41 | name: Composer package name 42 | type: staticValue 43 | defaultValue: "{{ project.vendor|slugify }}/{{ project.name|slugify }}" 44 | validators: 45 | - type: notEmpty 46 | - identifier: url 47 | name: Website URL 48 | type: staticValue 49 | validators: 50 | - type: notEmpty 51 | - type: url 52 | 53 | # Packages 54 | - identifier: packages 55 | name: Packages 56 | properties: 57 | - identifier: typo3_cms 58 | name: TYPO3 version 59 | type: select 60 | options: 61 | - value: 13.4 62 | - value: 12.4 63 | - value: 11.5 64 | validators: 65 | - type: notEmpty 66 | - identifier: typo3_testing_framework 67 | name: TYPO3 testing framework version 68 | type: dynamicSelect 69 | options: 70 | - value: '^9.0' # renovate: datasource=packagist depName=typo3/testing-framework 71 | if: 'packages["typo3_cms"] == "13.4"' 72 | - value: '^8.0' 73 | if: 'packages["typo3_cms"] == "12.4"' 74 | - value: '^7.0' 75 | if: 'packages["typo3_cms"] == "11.5"' 76 | - identifier: typo3_console 77 | name: TYPO3 console version 78 | type: dynamicSelect 79 | options: 80 | - value: '^8.2.1' # renovate: datasource=packagist depName=helhum/typo3-console 81 | if: 'packages["typo3_cms"] != "11.5"' 82 | - value: '^7.0.3' 83 | if: 'packages["typo3_cms"] == "11.5"' 84 | - identifier: typo3_console_binary 85 | name: TYPO3 console binary 86 | type: dynamicSelect 87 | options: 88 | - value: 'typo3' 89 | if: 'packages["typo3_cms"] != "11.5"' 90 | - value: 'typo3cms' 91 | if: 'packages["typo3_cms"] == "11.5"' 92 | - identifier: php 93 | name: PHP version 94 | type: select 95 | options: 96 | - value: '8.4' 97 | - value: '8.3' 98 | - value: '8.2' 99 | - value: '8.1' 100 | if: 'packages["typo3_cms"] != "13.4"' 101 | validators: 102 | - type: notEmpty 103 | - identifier: editorconfig_cli 104 | name: Editorconfig CLI version 105 | type: dynamicSelect 106 | options: 107 | - value: '^2.0' # renovate: datasource=packagist depName=armin/editorconfig-cli 108 | if: 'packages["php"] != "8.1"' 109 | - value: '^1.5' 110 | if: 'packages["php"] == "8.1"' 111 | - identifier: typo3_system_extensions 112 | name: Do you need additional TYPO3 system extensions? 113 | type: select 114 | multiple: true 115 | options: 116 | - value: 'typo3/cms-felogin' 117 | - value: 'typo3/cms-filemetadata' 118 | - value: 'typo3/cms-indexed-search' 119 | - value: 'typo3/cms-linkvalidator' 120 | - value: 'typo3/cms-reactions' 121 | if: 'packages["typo3_cms"] != "11.5"' 122 | - value: 'typo3/cms-sys-note' 123 | - value: 'typo3/cms-t3editor' 124 | if: 'packages["typo3_cms"] != "13.4"' 125 | - value: 'typo3/cms-webhooks' 126 | if: 'packages["typo3_cms"] != "11.5"' 127 | - value: 'typo3/cms-workspaces' 128 | 129 | # Features 130 | - identifier: features 131 | name: Additional features 132 | properties: 133 | - identifier: phpstan 134 | name: Should PHPStan be integrated? 135 | type: question 136 | options: 137 | - value: '^2.0' # renovate: datasource=packagist depName=saschaegerer/phpstan-typo3 138 | if: 'selected && packages["typo3_cms"] == "13.4"' 139 | - value: '^1.8' 140 | if: 'selected && packages["typo3_cms"] != "13.4"' 141 | - identifier: rector 142 | name: Should Rector be integrated? 143 | type: question 144 | options: 145 | - value: '^3.0' # renovate: datasource=packagist depName=ssch/typo3-rector 146 | if: 'selected && packages["typo3_cms"] == "13.4"' 147 | - value: '^2.0' 148 | if: 'selected && packages["typo3_cms"] != "13.4"' 149 | - identifier: deployer 150 | name: Do you want a basic Deployer deployment configuration? 151 | type: question 152 | 153 | # Deployer 154 | - identifier: deployer 155 | name: Deployer configuration 156 | if: 'features["deployer"]' 157 | properties: 158 | - identifier: hosts.production.hostname 159 | name: 'Production: Hostname or IP address' 160 | type: staticValue 161 | defaultValue: "{{ resolve_ip(project.url) }}" 162 | validators: 163 | - type: notEmpty 164 | - identifier: hosts.production.remote_user 165 | name: 'Production: Remote user' 166 | type: staticValue 167 | validators: 168 | - type: notEmpty 169 | - identifier: hosts.staging.confirmation 170 | name: Do you want to add a staging server? 171 | type: question 172 | defaultValue: true 173 | - identifier: hosts.staging.hostname 174 | name: 'Staging: Hostname or IP address' 175 | if: 'deployer["hosts"]["staging"]["confirmation"]' 176 | type: staticValue 177 | validators: 178 | - type: notEmpty 179 | - identifier: hosts.staging.remote_user 180 | name: 'Staging: Remote user' 181 | if: 'deployer["hosts"]["staging"]["confirmation"]' 182 | type: staticValue 183 | defaultValue: "{{ deployer.hosts.production.remote_user }}" 184 | validators: 185 | - type: notEmpty 186 | - identifier: hosts.dev.confirmation 187 | name: Do you want to add a dev server? 188 | type: question 189 | defaultValue: true 190 | - identifier: hosts.dev.hostname 191 | name: 'Dev: Hostname or IP address' 192 | if: 'deployer["hosts"]["dev"]["confirmation"]' 193 | type: staticValue 194 | validators: 195 | - type: notEmpty 196 | - identifier: hosts.dev.remote_user 197 | name: 'Dev: Remote user' 198 | if: 'deployer["hosts"]["dev"]["confirmation"]' 199 | type: staticValue 200 | defaultValue: "{{ deployer.hosts.production.remote_user }}" 201 | validators: 202 | - type: notEmpty 203 | 204 | # DDEV 205 | - identifier: ddev 206 | name: DDEV configuration 207 | properties: 208 | - identifier: name 209 | name: Name 210 | type: staticValue 211 | defaultValue: "{{ project.name|slugify }}" 212 | validators: 213 | - type: notEmpty 214 | - identifier: webserver_type 215 | name: Webserver type 216 | type: select 217 | options: 218 | - value: Apache 219 | - value: Nginx 220 | validators: 221 | - type: notEmpty 222 | - identifier: db_driver 223 | name: Database driver 224 | type: select 225 | options: 226 | - value: MySQL 227 | - value: MariaDB 228 | validators: 229 | - type: notEmpty 230 | - identifier: db_version 231 | name: Database version 232 | type: staticValue 233 | defaultValue: "{% if ddev.db_driver == \"MySQL\" %}8.0{% else %}10.4{% endif %}" 234 | validators: 235 | - type: notEmpty 236 | 237 | # Author 238 | - identifier: author 239 | name: About you 240 | properties: 241 | - identifier: name 242 | name: Your name 243 | type: staticValue 244 | defaultValue: '{{ get_default_author_name() }}' 245 | validators: 246 | - type: notEmpty 247 | - identifier: email 248 | name: Your e-mail address 249 | type: staticValue 250 | defaultValue: '{{ get_default_author_email() }}' 251 | validators: 252 | - type: notEmpty 253 | - type: email 254 | -------------------------------------------------------------------------------- /docs/assets/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CPS-IT/typo3-project-template/5ca1375ae5cb1d733eba7d11238050c262b4342a/docs/assets/header.png -------------------------------------------------------------------------------- /templates/next-steps.html.twig: -------------------------------------------------------------------------------- 1 | Initialize the project 2 | ====================== 3 | 4 | Switch to the new project and run ddev start. 5 | Now install all Composer packages by running ddev composer update. 6 | Run ddev config --auto to create the final DDEV configuration. 7 | 8 | Install TYPO3 9 | ============= 10 | 11 | You can now launch your installed project with ddev launch. 12 | Follow all installation instructions to finalize the TYPO3 installation. 13 | {% if packages.typo3_cms != "11.5" %} 14 | You can also run ddev typo3 setup to complete the installation process. 15 | {% endif %} 16 | 17 | Add project packages 18 | ==================== 19 | 20 | Additional project packages and TYPO3 extensions should be added within the packages directory. 21 | When requiring them via Composer, they get automatically linked to the target destinations. 22 | -------------------------------------------------------------------------------- /templates/src/.ddev/config.yaml.twig: -------------------------------------------------------------------------------- 1 | name: {{ ddev.name }} 2 | type: typo3 3 | docroot: public 4 | php_version: "{{ packages.php }}" 5 | webserver_type: {{ ddev.webserver_type|convert_case('lower') }}-fpm 6 | xdebug_enabled: false 7 | additional_hostnames: [] 8 | additional_fqdns: [] 9 | database: 10 | type: {{ ddev.db_driver|convert_case('lower') }} 11 | version: "{{ ddev.db_version }}" 12 | use_dns_when_possible: true 13 | composer_version: "2" 14 | web_environment: 15 | - TYPO3_CONTEXT=Development/DDEV 16 | corepack_enable: false 17 | 18 | # Key features of DDEV's config.yaml: 19 | 20 | # name: # Name of the project, automatically provides 21 | # http://projectname.ddev.site and https://projectname.ddev.site 22 | 23 | # type: # backdrop, cakephp, craftcms, drupal, drupal6, drupal7, drupal8, drupal9, drupal10, drupal11, laravel, magento, magento2, php, shopware6, silverstripe, symfony, typo3, wordpress 24 | # See https://ddev.readthedocs.io/en/stable/users/quickstart/ for more 25 | # information on the different project types 26 | 27 | # docroot: # Relative path to the directory containing index.php. 28 | 29 | # php_version: "8.3" # PHP version to use, "5.6" through "8.4" 30 | 31 | # You can explicitly specify the webimage but this 32 | # is not recommended, as the images are often closely tied to DDEV's' behavior, 33 | # so this can break upgrades. 34 | 35 | # webimage: # nginx/php docker image. 36 | 37 | # database: 38 | # type: # mysql, mariadb, postgres 39 | # version: # database version, like "10.11" or "8.0" 40 | # MariaDB versions can be 5.5-10.8, 10.11, and 11.4. 41 | # MySQL versions can be 5.5-8.0. 42 | # PostgreSQL versions can be 9-17. 43 | 44 | # router_http_port: # Port to be used for http (defaults to global configuration, usually 80) 45 | # router_https_port: # Port for https (defaults to global configuration, usually 443) 46 | 47 | # xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart" 48 | # Note that for most people the commands 49 | # "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better, 50 | # as leaving Xdebug enabled all the time is a big performance hit. 51 | 52 | # xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart" 53 | # Note that for most people the commands 54 | # "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better, 55 | # as leaving Xhprof enabled all the time is a big performance hit. 56 | 57 | # webserver_type: nginx-fpm or apache-fpm 58 | 59 | # timezone: Europe/Berlin 60 | # If timezone is unset, DDEV will attempt to derive it from the host system timezone 61 | # using the $TZ environment variable or the /etc/localtime symlink. 62 | # This is the timezone used in the containers and by PHP; 63 | # it can be set to any valid timezone, 64 | # see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 65 | # For example Europe/Dublin or MST7MDT 66 | 67 | # composer_root: 68 | # Relative path to the Composer root directory from the project root. This is 69 | # the directory which contains the composer.json and where all Composer related 70 | # commands are executed. 71 | 72 | # composer_version: "2" 73 | # You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 74 | # to use the latest major version available at the time your container is built. 75 | # It is also possible to use each other Composer version channel. This includes: 76 | # - 2.2 (latest Composer LTS version) 77 | # - stable 78 | # - preview 79 | # - snapshot 80 | # Alternatively, an explicit Composer version may be specified, for example "2.2.18". 81 | # To reinstall Composer after the image was built, run "ddev debug rebuild". 82 | 83 | # nodejs_version: "22" 84 | # change from the default system Node.js version to any other version. 85 | # See https://ddev.readthedocs.io/en/stable/users/configuration/config/#nodejs_version for more information 86 | # and https://www.npmjs.com/package/n#specifying-nodejs-versions for the full documentation, 87 | # Note that using of 'ddev nvm' is discouraged because "nodejs_version" is much easier to use, 88 | # can specify any version, and is more robust than using 'nvm'. 89 | 90 | # corepack_enable: false 91 | # Change to 'true' to 'corepack enable' and gain access to latest versions of yarn/pnpm 92 | 93 | # additional_hostnames: 94 | # - somename 95 | # - someothername 96 | # would provide http and https URLs for "somename.ddev.site" 97 | # and "someothername.ddev.site". 98 | 99 | # additional_fqdns: 100 | # - example.com 101 | # - sub1.example.com 102 | # would provide http and https URLs for "example.com" and "sub1.example.com" 103 | # Please take care with this because it can cause great confusion. 104 | 105 | # upload_dirs: "custom/upload/dir" 106 | # 107 | # upload_dirs: 108 | # - custom/upload/dir 109 | # - ../private 110 | # 111 | # would set the destination paths for ddev import-files to /custom/upload/dir 112 | # When Mutagen is enabled this path is bind-mounted so that all the files 113 | # in the upload_dirs don't have to be synced into Mutagen. 114 | 115 | # disable_upload_dirs_warning: false 116 | # If true, turns off the normal warning that says 117 | # "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" 118 | 119 | # ddev_version_constraint: "" 120 | # Example: 121 | # ddev_version_constraint: ">= 1.22.4" 122 | # This will enforce that the running ddev version is within this constraint. 123 | # See https://github.com/Masterminds/semver#checking-version-constraints for 124 | # supported constraint formats 125 | 126 | # working_dir: 127 | # web: /var/www/html 128 | # db: /home 129 | # would set the default working directory for the web and db services. 130 | # These values specify the destination directory for ddev ssh and the 131 | # directory in which commands passed into ddev exec are run. 132 | 133 | # omit_containers: [db, ddev-ssh-agent] 134 | # Currently only these containers are supported. Some containers can also be 135 | # omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit 136 | # the "db" container, several standard features of DDEV that access the 137 | # database container will be unusable. In the global configuration it is also 138 | # possible to omit ddev-router, but not here. 139 | 140 | # performance_mode: "global" 141 | # DDEV offers performance optimization strategies to improve the filesystem 142 | # performance depending on your host system. Should be configured globally. 143 | # 144 | # If set, will override the global config. Possible values are: 145 | # - "global": uses the value from the global config. 146 | # - "none": disables performance optimization for this project. 147 | # - "mutagen": enables Mutagen for this project. 148 | # - "nfs": enables NFS for this project. 149 | # 150 | # See https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs 151 | # See https://ddev.readthedocs.io/en/stable/users/install/performance/#mutagen 152 | 153 | # fail_on_hook_fail: False 154 | # Decide whether 'ddev start' should be interrupted by a failing hook 155 | 156 | # host_https_port: "59002" 157 | # The host port binding for https can be explicitly specified. It is 158 | # dynamic unless otherwise specified. 159 | # This is not used by most people, most people use the *router* instead 160 | # of the localhost port. 161 | 162 | # host_webserver_port: "59001" 163 | # The host port binding for the ddev-webserver can be explicitly specified. It is 164 | # dynamic unless otherwise specified. 165 | # This is not used by most people, most people use the *router* instead 166 | # of the localhost port. 167 | 168 | # host_db_port: "59002" 169 | # The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic 170 | # unless explicitly specified. 171 | 172 | # mailpit_http_port: "8025" 173 | # mailpit_https_port: "8026" 174 | # The Mailpit ports can be changed from the default 8025 and 8026 175 | 176 | # host_mailpit_port: "8025" 177 | # The mailpit port is not normally bound on the host at all, instead being routed 178 | # through ddev-router, but it can be bound directly to localhost if specified here. 179 | 180 | # webimage_extra_packages: [php7.4-tidy, php-bcmath] 181 | # Extra Debian packages that are needed in the webimage can be added here 182 | 183 | # dbimage_extra_packages: [telnet,netcat] 184 | # Extra Debian packages that are needed in the dbimage can be added here 185 | 186 | # use_dns_when_possible: true 187 | # If the host has internet access and the domain configured can 188 | # successfully be looked up, DNS will be used for hostname resolution 189 | # instead of editing /etc/hosts 190 | # Defaults to true 191 | 192 | # project_tld: ddev.site 193 | # The top-level domain used for project URLs 194 | # The default "ddev.site" allows DNS lookup via a wildcard 195 | # If you prefer you can change this to "ddev.local" to preserve 196 | # pre-v1.9 behavior. 197 | 198 | # ngrok_args: --basic-auth username:pass1234 199 | # Provide extra flags to the "ngrok http" command, see 200 | # https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" 201 | 202 | # disable_settings_management: false 203 | # If true, DDEV will not create CMS-specific settings files like 204 | # Drupal's settings.php/settings.ddev.php or TYPO3's additional.php 205 | # In this case the user must provide all such settings. 206 | 207 | # You can inject environment variables into the web container with: 208 | # web_environment: 209 | # - SOMEENV=somevalue 210 | # - SOMEOTHERENV=someothervalue 211 | 212 | # no_project_mount: false 213 | # (Experimental) If true, DDEV will not mount the project into the web container; 214 | # the user is responsible for mounting it manually or via a script. 215 | # This is to enable experimentation with alternate file mounting strategies. 216 | # For advanced users only! 217 | 218 | # bind_all_interfaces: false 219 | # If true, host ports will be bound on all network interfaces, 220 | # not the localhost interface only. This means that ports 221 | # will be available on the local network if the host firewall 222 | # allows it. 223 | 224 | # default_container_timeout: 120 225 | # The default time that DDEV waits for all containers to become ready can be increased from 226 | # the default 120. This helps in importing huge databases, for example. 227 | 228 | #web_extra_exposed_ports: 229 | #- name: nodejs 230 | # container_port: 3000 231 | # http_port: 2999 232 | # https_port: 3000 233 | #- name: something 234 | # container_port: 4000 235 | # https_port: 4000 236 | # http_port: 3999 237 | # Allows a set of extra ports to be exposed via ddev-router 238 | # Fill in all three fields even if you don’t intend to use the https_port! 239 | # If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. 240 | # 241 | # The port behavior on the ddev-webserver must be arranged separately, for example 242 | # using web_extra_daemons. 243 | # For example, with a web app on port 3000 inside the container, this config would 244 | # expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 245 | # web_extra_exposed_ports: 246 | # - name: myapp 247 | # container_port: 3000 248 | # http_port: 9998 249 | # https_port: 9999 250 | 251 | #web_extra_daemons: 252 | #- name: "http-1" 253 | # command: "/var/www/html/node_modules/.bin/http-server -p 3000" 254 | # directory: /var/www/html 255 | #- name: "http-2" 256 | # command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" 257 | # directory: /var/www/html 258 | 259 | # override_config: false 260 | # By default, config.*.yaml files are *merged* into the configuration 261 | # But this means that some things can't be overridden 262 | # For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge 263 | # and you can't erase existing hooks or all environment variables. 264 | # However, with "override_config: true" in a particular config.*.yaml file, 265 | # 'use_dns_when_possible: false' can override the existing values, and 266 | # hooks: 267 | # post-start: [] 268 | # or 269 | # web_environment: [] 270 | # or 271 | # additional_hostnames: [] 272 | # can have their intended affect. 'override_config' affects only behavior of the 273 | # config.*.yaml file it exists in. 274 | 275 | # Many DDEV commands can be extended to run tasks before or after the 276 | # DDEV command is executed, for example "post-start", "post-import-db", 277 | # "pre-composer", "post-composer" 278 | # See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more 279 | # information on the commands that can be extended and the tasks you can define 280 | # for them. Example: 281 | #hooks: 282 | -------------------------------------------------------------------------------- /templates/src/.deployment/hosts.yaml.twig: -------------------------------------------------------------------------------- 1 | hosts: 2 | {% for stage, config in deployer.hosts|filter(host => host.confirmation is not defined or host.confirmation) %} 3 | {{ stage }}: 4 | hostname: '{{ config.hostname }}' 5 | remote_user: '{{ config.remote_user }}' 6 | port: 22 7 | deploy_path: '/var/www/html' 8 | 9 | {% endfor %} 10 | -------------------------------------------------------------------------------- /templates/src/.editorconfig.twig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | charset = utf-8 9 | end_of_line = lf 10 | indent_style = space 11 | indent_size = 4 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | 15 | # TS/JS-Files 16 | [*.{ts,js}] 17 | indent_size = 2 18 | 19 | # JSON-Files 20 | [*.json] 21 | indent_style = tab 22 | 23 | # ReST-Files 24 | [*.{rst,rst.txt}] 25 | indent_size = 4 26 | max_line_length = 80 27 | 28 | # Markdown-Files 29 | [*.md] 30 | max_line_length = 80 31 | 32 | # YAML-Files 33 | [*.{yaml,yml}] 34 | indent_size = 2 35 | 36 | # NEON-Files 37 | [*.neon] 38 | indent_size = 2 39 | indent_style = tab 40 | 41 | # package.json 42 | [package.json] 43 | indent_size = 2 44 | 45 | # TypoScript 46 | [*.{typoscript,tsconfig}] 47 | indent_size = 2 48 | 49 | # XLF-Files 50 | [*.xlf] 51 | indent_style = tab 52 | 53 | # SQL-Files 54 | [*.sql] 55 | indent_style = tab 56 | indent_size = 2 57 | 58 | # .htaccess 59 | [{_.htaccess,.htaccess}] 60 | indent_style = tab 61 | -------------------------------------------------------------------------------- /templates/src/.gitignore.twig: -------------------------------------------------------------------------------- 1 | # Local build files 2 | /.build/* 3 | !/.build/build-artifact.json 4 | 5 | # TYPO3-related files 6 | !/public/ 7 | /public/* 8 | !/public/.htaccess 9 | !/public/robots.txt 10 | {% if packages.typo3_cms == "11.5" %} 11 | !/public/typo3conf/ 12 | /public/typo3conf/* 13 | !/public/typo3conf/LocalConfiguration.php 14 | !/public/typo3conf/AdditionalConfiguration.php 15 | {% endif %} 16 | 17 | # Temporary files 18 | /var/ 19 | 20 | # Test files 21 | /.php-cs-fixer.cache 22 | /.phpunit.result.cache 23 | 24 | # Composer-related files 25 | /vendor/ 26 | -------------------------------------------------------------------------------- /templates/src/.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | setParallelConfig(\PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect()); 7 | $config->getFinder()->in(__DIR__ . '/packages'); 8 | 9 | return $config; 10 | -------------------------------------------------------------------------------- /templates/src/composer.json.twig: -------------------------------------------------------------------------------- 1 | { 2 | "name": "{{ project.package_name }}", 3 | "description": "Project bundle for the {{ project.name }} TYPO3 {{ packages.typo3_cms }} project", 4 | "license": "GPL-2.0-or-later", 5 | "type": "project", 6 | "authors": [ 7 | { 8 | "name": "{{ author.name }}", 9 | "email": "{{ author.email }}" 10 | } 11 | ], 12 | "homepage": "{{ project.url }}", 13 | "require": { 14 | "helhum/typo3-console": "{{ packages.typo3_console }}", 15 | {% for additional_package in packages.typo3_system_extensions %} 16 | "{{ additional_package }}": "^{{ packages.typo3_cms }}", 17 | {% endfor %} 18 | "typo3/cms-adminpanel": "^{{ packages.typo3_cms }}", 19 | "typo3/cms-backend": "^{{ packages.typo3_cms }}", 20 | "typo3/cms-belog": "^{{ packages.typo3_cms }}", 21 | "typo3/cms-beuser": "^{{ packages.typo3_cms }}", 22 | "typo3/cms-core": "^{{ packages.typo3_cms }}", 23 | "typo3/cms-dashboard": "^{{ packages.typo3_cms }}", 24 | "typo3/cms-extbase": "^{{ packages.typo3_cms }}", 25 | "typo3/cms-extensionmanager": "^{{ packages.typo3_cms }}", 26 | "typo3/cms-filelist": "^{{ packages.typo3_cms }}", 27 | "typo3/cms-fluid": "^{{ packages.typo3_cms }}", 28 | "typo3/cms-fluid-styled-content": "^{{ packages.typo3_cms }}", 29 | "typo3/cms-form": "^{{ packages.typo3_cms }}", 30 | "typo3/cms-frontend": "^{{ packages.typo3_cms }}", 31 | "typo3/cms-impexp": "^{{ packages.typo3_cms }}", 32 | "typo3/cms-info": "^{{ packages.typo3_cms }}", 33 | "typo3/cms-install": "^{{ packages.typo3_cms }}", 34 | "typo3/cms-lowlevel": "^{{ packages.typo3_cms }}", 35 | "typo3/cms-opendocs": "^{{ packages.typo3_cms }}", 36 | {% if packages.typo3_cms == "11.5" %} 37 | "typo3/cms-recordlist": "^{{ packages.typo3_cms }}", 38 | {% endif %} 39 | "typo3/cms-recycler": "^{{ packages.typo3_cms }}", 40 | "typo3/cms-redirects": "^{{ packages.typo3_cms }}", 41 | "typo3/cms-reports": "^{{ packages.typo3_cms }}", 42 | "typo3/cms-rte-ckeditor": "^{{ packages.typo3_cms }}", 43 | "typo3/cms-scheduler": "^{{ packages.typo3_cms }}", 44 | "typo3/cms-seo": "^{{ packages.typo3_cms }}", 45 | "typo3/cms-setup": "^{{ packages.typo3_cms }}", 46 | "typo3/cms-tstemplate": "^{{ packages.typo3_cms }}", 47 | "typo3/cms-viewpage": "^{{ packages.typo3_cms }}" 48 | }, 49 | "require-dev": { 50 | "armin/editorconfig-cli": "{{ packages.editorconfig_cli }}", 51 | {% if features.deployer %} 52 | "deployer/deployer": "^7.0", 53 | {% endif %} 54 | "ergebnis/composer-normalize": "^2.28", 55 | "friendsofphp/php-cs-fixer": "^3.57", 56 | "helmich/typo3-typoscript-lint": "^3.0", 57 | {% if features.phpstan %} 58 | "phpstan/extension-installer": "^1.2", 59 | {% endif %} 60 | "roave/security-advisories": "dev-latest", 61 | {% if features.phpstan %} 62 | "saschaegerer/phpstan-typo3": "{{ features.phpstan }}", 63 | {% endif %} 64 | {% if features.rector %} 65 | "ssch/typo3-rector": "{{ features.rector }}", 66 | {% endif %} 67 | "typo3/coding-standards": "^0.8.0", 68 | "typo3/testing-framework": "{{ packages.typo3_testing_framework }}" 69 | }, 70 | "repositories": [ 71 | { 72 | "type": "path", 73 | "url": "./packages/*" 74 | } 75 | ], 76 | "config": { 77 | "allow-plugins": { 78 | "ergebnis/composer-normalize": true, 79 | {% if features.phpstan %} 80 | "phpstan/extension-installer": true, 81 | {% endif %} 82 | "typo3/class-alias-loader": true, 83 | "typo3/cms-composer-installers": true 84 | }, 85 | "audit": { 86 | "abandoned": "report" 87 | }, 88 | "platform": { 89 | "php": "{{ get_latest_stable_php_version(packages.php) }}" 90 | }, 91 | "sort-packages": true 92 | }, 93 | "scripts": { 94 | "post-autoload-dump": [ 95 | "@typo3-cms-scripts" 96 | ], 97 | "fix": [ 98 | "@fix:composer", 99 | "@fix:editorconfig", 100 | "@fix:php" 101 | ], 102 | "fix:composer": "@composer normalize", 103 | "fix:editorconfig": "ec --fix", 104 | "fix:php": "php-cs-fixer fix", 105 | "lint": [ 106 | "@lint:composer", 107 | "@lint:editorconfig", 108 | "@lint:php", 109 | "@lint:typoscript" 110 | ], 111 | "lint:composer": "@composer normalize --dry-run", 112 | "lint:editorconfig": "ec", 113 | "lint:php": "php-cs-fixer fix --dry-run", 114 | "lint:typoscript": "typoscript-lint", 115 | {% if features.rector %} 116 | "migration": [ 117 | "@migration:rector" 118 | ], 119 | "migration:rector": [ 120 | "Composer\\Config::disableProcessTimeout", 121 | "rector process" 122 | ], 123 | {% endif %} 124 | {% if features.phpstan %} 125 | "sca": [ 126 | "@sca:php" 127 | ], 128 | "sca:php": "phpstan analyse -c phpstan.neon --memory-limit=2G $(find packages -mindepth 2 -maxdepth 2 -type d -name 'Classes' -o -name 'Configuration' -o -name 'Tests')", 129 | {% endif %} 130 | "test": [ 131 | "@test:unit" 132 | ], 133 | "test:unit": "phpunit -c phpunit.xml", 134 | "typo3-cms-scripts": [ 135 | "{{ packages.typo3_console_binary }} install:fixfolderstructure" 136 | ] 137 | }, 138 | "scripts-descriptions": { 139 | "fix": "Fix all code quality issues reported by the registered linters", 140 | "fix:composer": "Fix all issues in `composer.json`", 141 | "fix:editorconfig": "Fix all styling issues violating the `.editorconfig` rules", 142 | "fix:php": "Fix all styling issues violating the configured PHP-CS-Fixer rules", 143 | "lint": "Run all registered linters to detect code quality issues", 144 | "lint:composer": "Lint `composer.json` to detect unnormalized styles", 145 | "lint:editorconfig": "Lint all project files to detect violations of the `.editorconfig` rules", 146 | "lint:php": "Lint all PHP files to detect coding style violations", 147 | "lint:typoscript": "Lint all TypoScript and TSconfig files to detect coding style violations", 148 | {% if features.rector %} 149 | "migration": "Run all registered automatic code migrations", 150 | "migration:rector": "Perform automatic code migration with TYPO3 Rector, based on the registered rules", 151 | {% endif %} 152 | {% if features.phpstan %} 153 | "sca": "Run all registered static code analyzers to detect issues in the codebase", 154 | "sca:php": "Analyze all PHP files by using PHPStan, based on the configured level", 155 | {% endif %} 156 | "test": "Run all configured test suites", 157 | "test:unit": "Run unit tests for all local packages", 158 | "typo3-cms-scripts": "Perform TYPO3-related initialization scripts (this normally happens automatically)" 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /templates/src/config/sites/main/config.yaml.twig: -------------------------------------------------------------------------------- 1 | base: '{{ project.url|trim('/', 'right') }}/' 2 | baseVariants: 3 | - 4 | base: 'https://{{ ddev.name }}.ddev.site/' 5 | condition: 'applicationContext == "Development/DDEV"' 6 | languages: 7 | - 8 | title: English 9 | enabled: true 10 | languageId: 0 11 | base: / 12 | typo3Language: default 13 | locale: en_US.UTF-8 14 | iso-639-1: en 15 | navigationTitle: English 16 | hreflang: en-us 17 | direction: ltr 18 | flag: us 19 | websiteTitle: '' 20 | rootPageId: 1 21 | websiteTitle: '' 22 | -------------------------------------------------------------------------------- /templates/src/deploy.php.twig: -------------------------------------------------------------------------------- 1 | run('echo $(date "+%Y-%m-%dT%H-%M-%S")')); 24 | 25 | // Set TYPO3 docroot 26 | set('typo3_webroot', 'public'); 27 | 28 | // Set shared directories 29 | $sharedDirectories = [ 30 | '{{typo3_webroot}}/fileadmin', 31 | '{{typo3_webroot}}/typo3temp', 32 | ]; 33 | set('shared_dirs', $sharedDirectories); 34 | 35 | // Set shared files 36 | $sharedFiles = [ 37 | '.env', 38 | ]; 39 | set('shared_files', $sharedFiles); 40 | 41 | // Set writable directories 42 | set('writable_dirs', [ 43 | 'config', 44 | 'var', 45 | '{{typo3_webroot}}/fileadmin', 46 | '{{typo3_webroot}}/typo3conf', 47 | '{{typo3_webroot}}/typo3temp', 48 | ]); 49 | 50 | // Define all rsync excludes 51 | $exclude = [ 52 | // OS specific files 53 | '.DS_Store', 54 | 'Thumbs.db', 55 | // Project specific files and directories 56 | '.ddev', 57 | '.editorconfig', 58 | '.fleet', 59 | '.git*', 60 | '.idea', 61 | '.php-cs-fixer.dist.php', 62 | '.vscode', 63 | 'auth.json', 64 | 'deploy.php', 65 | 'phpstan.neon', 66 | 'phpunit.xml', 67 | 'README*', 68 | 'rector.php', 69 | 'typoscript-lint.yml', 70 | '/.build', 71 | '/.deployment', 72 | '/var', 73 | '/**/Tests/*', 74 | ]; 75 | 76 | // Define rsync options 77 | set('rsync', [ 78 | 'exclude' => array_merge($sharedDirectories, $sharedFiles, $exclude), 79 | 'exclude-file' => false, 80 | 'include' => [], 81 | 'include-file' => false, 82 | 'filter' => [], 83 | 'filter-file' => false, 84 | 'filter-perdir' => false, 85 | 'flags' => 'az', 86 | 'options' => ['delete'], 87 | 'timeout' => 300, 88 | ]); 89 | set('rsync_src', './'); 90 | 91 | // Use rsync to update code during deployment 92 | task('deploy:update_code', function () { 93 | invoke('rsync:warmup'); 94 | invoke('rsync'); 95 | }); 96 | 97 | // TYPO3 tasks 98 | desc('Flush all caches'); 99 | task('typo3:cache_flush', function () { 100 | run('{{bin/typo3_console}} cache:flush'); 101 | }); 102 | 103 | desc('Warm up caches'); 104 | task('typo3:cache_warmup', function () { 105 | run('{{bin/typo3_console}} cache:warmup'); 106 | }); 107 | 108 | desc('Set up all installed extensions'); 109 | task('typo3:extension_setup', function () { 110 | run('{{bin/typo3_console}} extension:setup'); 111 | }); 112 | 113 | desc('Fix folder structure'); 114 | task('typo3:fix_folder_structure', function () { 115 | run('{{bin/typo3_console}} install:fixfolderstructure'); 116 | }); 117 | 118 | desc('Update language files'); 119 | task('typo3:language_update', function () { 120 | run('{{bin/typo3_console}} language:update'); 121 | }); 122 | 123 | desc('Execute upgrade wizards'); 124 | task('typo3:upgrade_all', function () { 125 | {% if packages.typo3_cms == "11.5" %} 126 | run('{{bin/typo3_console}} upgrade:prepare'); 127 | run('{{bin/typo3_console}} upgrade:run all --confirm all'); 128 | {% else %} 129 | run('{{bin/typo3_console}} upgrade:run'); 130 | {% endif %} 131 | %}); 132 | 133 | // Register TYPO3 tasks 134 | before('deploy:symlink', function () { 135 | invoke('typo3:fix_folder_structure'); 136 | invoke('typo3:language_update'); 137 | }); 138 | after('deploy:symlink', function () { 139 | invoke('typo3:extension_setup'); 140 | invoke('typo3:upgrade_all'); 141 | invoke('typo3:cache_flush'); 142 | invoke('cachetool:clear:opcache'); 143 | invoke('typo3:cache_warmup'); 144 | }); 145 | 146 | // Main deployment task 147 | desc('Deploy TYPO3 project'); 148 | task('deploy', [ 149 | 'deploy:prepare', 150 | 'deploy:publish', 151 | ]); 152 | 153 | // Unlock on failed deployment 154 | after('deploy:failed', 'deploy:unlock'); 155 | {% endverbatim %} 156 | -------------------------------------------------------------------------------- /templates/src/packages/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CPS-IT/typo3-project-template/5ca1375ae5cb1d733eba7d11238050c262b4342a/templates/src/packages/.gitkeep -------------------------------------------------------------------------------- /templates/src/phpstan.neon: -------------------------------------------------------------------------------- 1 | parameters: 2 | level: max 3 | -------------------------------------------------------------------------------- /templates/src/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | packages/*/Tests/Unit 10 | 11 | 12 | 13 | 14 | packages/*/Classes 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /templates/src/public/FIRST_INSTALL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CPS-IT/typo3-project-template/5ca1375ae5cb1d733eba7d11238050c262b4342a/templates/src/public/FIRST_INSTALL -------------------------------------------------------------------------------- /templates/src/rector.php.twig: -------------------------------------------------------------------------------- 1 | withConfiguredRule(ExtEmConfRector::class, [ 16 | ExtEmConfRector::ADDITIONAL_VALUES_TO_BE_REMOVED => [], 17 | ]) 18 | ->withPaths([ 19 | __DIR__ . '/packages/*', 20 | ]) 21 | ->withPhpSets(php{{ packages.php|replace({'.': ''}) }}: true) 22 | ->withSets([ 23 | Typo3LevelSetList::UP_TO_TYPO3_{{ packages.typo3_cms|split('.')|first }}, 24 | ]) 25 | ->withPHPStanConfigs([ 26 | Typo3Option::PHPSTAN_FOR_RECTOR_PATH, 27 | ]) 28 | ->withPhpVersion(PhpVersion::PHP_{{ packages.php|replace({'.': ''}) }}) 29 | ->withImportNames(importShortClasses: false) 30 | ->withRules([ 31 | ConvertImplicitVariablesToExplicitGlobalsRector::class, 32 | ]) 33 | ->withSkip([ 34 | // @see https://github.com/sabbelasichon/typo3-rector/issues/2536 35 | __DIR__ . '/**/Configuration/ExtensionBuilder/*', 36 | 37 | NameImportingPostRector::class => [ 38 | 'ext_localconf.php', 39 | 'ext_tables.php', 40 | 'ClassAliasMap.php', 41 | __DIR__ . '/**/Configuration/*.php', 42 | __DIR__ . '/**/Configuration/**/*.php', 43 | ], 44 | 45 | // We skip this rector rule as it interferes with TYPO3 coding standards 46 | AddLiteralSeparatorToNumberRector::class, 47 | ]) 48 | ->withoutParallel() 49 | ; 50 | -------------------------------------------------------------------------------- /templates/src/typoscript-lint.yml.twig: -------------------------------------------------------------------------------- 1 | paths: 2 | - packages/* 3 | filePatterns: 4 | - "*.typoscript" 5 | - "*.tsconfig" 6 | sniffs: 7 | - class: Indentation 8 | parameters: 9 | useSpaces: true 10 | indentPerLevel: 2 11 | indentConditions: false 12 | - class: DeadCode 13 | - class: OperatorWhitespace 14 | - class: RepeatingRValue 15 | parameters: 16 | allowedRightValues: 17 | - "TYPO3\\CMS\\Frontend\\DataProcessing\\DatabaseQueryProcessor" 18 | - class: DuplicateAssignment 19 | - class: EmptySection 20 | - class: NestingConsistency 21 | parameters: 22 | commonPathPrefixThreshold: 1 23 | - class: ConfigNoCache 24 | --------------------------------------------------------------------------------