├── .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 | 
4 |
5 | # TYPO3 CMS project builder template
6 |
7 | [](https://github.com/CPS-IT/typo3-project-template/actions/workflows/cgl.yaml)
8 | [](https://packagist.org/packages/cpsit/typo3-project-template)
9 | [](https://packagist.org/packages/cpsit/typo3-project-template)
10 | 
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 |
--------------------------------------------------------------------------------