├── .babelrc.js
├── .eslintrc.js
├── .github
└── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── feature_request.md
│ └── new-format-request.md
├── .gitignore
├── .travis.yml
├── CHANGELOG.md
├── COPYING
├── Makefile
├── README.md
├── appinfo
├── app.php
└── info.xml
├── composer.json
├── composer.lock
├── img
└── app.svg
├── lib
├── AppInfo
│ └── Application.php
├── Listener
│ ├── CSPListener.php
│ └── LoadFiles3dScript.php
└── Migration
│ └── AddMimetypeToFilecache.php
├── package-lock.json
├── package.json
├── phpunit.integration.xml
├── phpunit.xml
├── screenshots
└── screenshot1.png
├── src
├── components
│ └── Files3d.vue
└── main.js
├── templates
├── content
│ └── index.php
├── index.php
├── navigation
│ └── index.php
└── settings
│ └── index.php
├── tests
├── Integration
│ └── AppTest.php
├── Unit
│ └── Controller
│ │ └── PageControllerTest.php
└── bootstrap.php
├── webpack.common.js
├── webpack.dev.js
└── webpack.prod.js
/.babelrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: [
3 | '@babel/plugin-syntax-dynamic-import',
4 | [
5 | '@babel/plugin-proposal-class-properties',
6 | { loose: true }
7 | ]
8 | ],
9 | }
10 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: [
3 | '@nextcloud',
4 | ],
5 | parserOptions: {
6 | requireConfigFile: false,
7 | }
8 | }
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: "[BUG] "
5 | labels: bug
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: "[FEAT]"
5 | labels: enhancement
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/new-format-request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: New Format request
3 | about: Suggest a new 3D format for this plugin
4 | title: "[FRMT] "
5 | labels: enhancement, good first issue, new format
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the format you'd like to have added**
11 | What is it good for, where is it used, is there an alternative (e.g. export in another format)?
12 |
13 | **This plugin is based on three.js, so there has to be some kind of plugin for three.js for that format**
14 | Please provide a link to either [three.js examples page](https://threejs.org/examples/) with the desired loader or any other platform (e.g. npm or github page)
15 |
16 | **Additional context**
17 | Add any other context or screenshots about the feature request here.
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | vendor/
3 | js/
4 | build/
5 | .idea/
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: false
2 | dist: trusty
3 | language: php
4 | php:
5 | - 5.6
6 | - 7
7 | - 7.1
8 | env:
9 | global:
10 | - CORE_BRANCH=stable14
11 | matrix:
12 | - DB=pgsql
13 |
14 | matrix:
15 | allow_failures:
16 | - env: DB=pgsql CORE_BRANCH=master
17 | include:
18 | - php: 5.6
19 | env: DB=sqlite
20 | - php: 5.6
21 | env: DB=mysql
22 | - php: 5.6
23 | env: DB=pgsql CORE_BRANCH=master
24 | fast_finish: true
25 |
26 |
27 | before_install:
28 | # enable a display for running JavaScript tests
29 | - export DISPLAY=:99.0
30 | - sh -e /etc/init.d/xvfb start
31 | - nvm install 8
32 | - npm install -g npm@latest
33 | - make
34 | - make appstore
35 | # install core
36 | - cd ../
37 | - git clone https://github.com/nextcloud/server.git --recursive --depth 1 -b $CORE_BRANCH nextcloud
38 | - mv "$TRAVIS_BUILD_DIR" nextcloud/apps/filesthree
39 |
40 | before_script:
41 | - if [[ "$DB" == 'pgsql' ]]; then createuser -U travis -s oc_autotest; fi
42 | - if [[ "$DB" == 'mysql' ]]; then mysql -u root -e 'create database oc_autotest;'; fi
43 | - if [[ "$DB" == 'mysql' ]]; then mysql -u root -e "CREATE USER 'oc_autotest'@'localhost' IDENTIFIED BY '';"; fi
44 | - if [[ "$DB" == 'mysql' ]]; then mysql -u root -e "grant all on oc_autotest.* to 'oc_autotest'@'localhost';"; fi
45 | - cd nextcloud
46 | - mkdir data
47 | - ./occ maintenance:install --database-name oc_autotest --database-user oc_autotest --admin-user admin --admin-pass admin --database $DB --database-pass=''
48 | - ./occ app:enable filesthree
49 | - php -S localhost:8080 &
50 | - cd apps/filesthree
51 |
52 | script:
53 | - make test
54 |
55 | after_failure:
56 | - cat ../../data/nextcloud.log
57 |
58 | addons:
59 | firefox: 'latest'
60 | mariadb: '10.1'
61 |
62 | services:
63 | - postgresql
64 | - mariadb
65 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 | All notable changes to this project will be documented in this file.
3 |
4 | ## 0.5.0
5 | ### Added
6 | ### Fixed
7 | ### Changed
8 | - Updated Dependencies
9 | - Bump supported NC versions to 21-23
10 |
11 | ## 0.4.0
12 | ### Added
13 | - Support latest NC release (Version 21)
14 | - Support for GCode (`.gcode`) files (thanks to @csicar !)
15 | ### Fixed
16 | - Support for GLB (`.glb`) and GLTF files
17 | ### Changed
18 | - Set initial viewing angle (thanks to @csicar !)
19 | - Updated Dependencies
20 |
21 | ## 0.3.3
22 | ### Added
23 | - Support latest NC release (Version 20)
24 | - Support for PLY (`.ply`) files
25 | ### Changed
26 | - Updated Dependencies
27 |
28 | ## 0.3.2
29 | ### Fixed
30 | - Fix black screen after file is loaded
31 |
32 | ## 0.3.1
33 | ### Changed
34 | - Update dependencies
35 |
36 | ## 0.3.0
37 | ### Added
38 | ### Fixed
39 | - Build process
40 | - App can now be build using `make` command (see [Makefile](https://github.com/v1r0x/files_3d/blob/master/Makefile))
41 | ### Changed
42 | - Dependency update
43 | - WebGL2 is now used by default
44 |
45 | ## 0.2.0
46 | ### Added
47 | - support for STL (`.stl`) files
48 | ### Fixed
49 | - Working support for different file types (thanks to @awesome-manuel)
50 | ### Changed
51 | - Bump required NC version to 19
52 | - Re-implement as viewer plugin (thanks to @skjnldsv)
53 |
54 | ## 0.1.0
55 | ### Added
56 | - Support for FBX, GLTF and OBJ files (`.fbx`, `.gltf`, `.obj`)
57 | ### Fixed
58 | ### Changed
59 |
60 | ## 0.0.1 - Initial release
61 | ### Added
62 | - Initial release
63 | - Support for Collada (`.dae`) files
64 | ### Fixed
65 | ### Changed
66 |
--------------------------------------------------------------------------------
/COPYING:
--------------------------------------------------------------------------------
1 | GNU AFFERO GENERAL PUBLIC LICENSE
2 | Version 3, 19 November 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU Affero General Public License is a free, copyleft license for
11 | software and other kinds of works, specifically designed to ensure
12 | cooperation with the community in the case of network server software.
13 |
14 | The licenses for most software and other practical works are designed
15 | to take away your freedom to share and change the works. By contrast,
16 | our General Public Licenses are intended to guarantee your freedom to
17 | share and change all versions of a program--to make sure it remains free
18 | software for all its users.
19 |
20 | When we speak of free software, we are referring to freedom, not
21 | price. Our General Public Licenses are designed to make sure that you
22 | have the freedom to distribute copies of free software (and charge for
23 | them if you wish), that you receive source code or can get it if you
24 | want it, that you can change the software or use pieces of it in new
25 | free programs, and that you know you can do these things.
26 |
27 | Developers that use our General Public Licenses protect your rights
28 | with two steps: (1) assert copyright on the software, and (2) offer
29 | you this License which gives you legal permission to copy, distribute
30 | and/or modify the software.
31 |
32 | A secondary benefit of defending all users' freedom is that
33 | improvements made in alternate versions of the program, if they
34 | receive widespread use, become available for other developers to
35 | incorporate. Many developers of free software are heartened and
36 | encouraged by the resulting cooperation. However, in the case of
37 | software used on network servers, this result may fail to come about.
38 | The GNU General Public License permits making a modified version and
39 | letting the public access it on a server without ever releasing its
40 | source code to the public.
41 |
42 | The GNU Affero General Public License is designed specifically to
43 | ensure that, in such cases, the modified source code becomes available
44 | to the community. It requires the operator of a network server to
45 | provide the source code of the modified version running there to the
46 | users of that server. Therefore, public use of a modified version, on
47 | a publicly accessible server, gives the public access to the source
48 | code of the modified version.
49 |
50 | An older license, called the Affero General Public License and
51 | published by Affero, was designed to accomplish similar goals. This is
52 | a different license, not a version of the Affero GPL, but Affero has
53 | released a new version of the Affero GPL which permits relicensing under
54 | this license.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | TERMS AND CONDITIONS
60 |
61 | 0. Definitions.
62 |
63 | "This License" refers to version 3 of the GNU Affero General Public License.
64 |
65 | "Copyright" also means copyright-like laws that apply to other kinds of
66 | works, such as semiconductor masks.
67 |
68 | "The Program" refers to any copyrightable work licensed under this
69 | License. Each licensee is addressed as "you". "Licensees" and
70 | "recipients" may be individuals or organizations.
71 |
72 | To "modify" a work means to copy from or adapt all or part of the work
73 | in a fashion requiring copyright permission, other than the making of an
74 | exact copy. The resulting work is called a "modified version" of the
75 | earlier work or a work "based on" the earlier work.
76 |
77 | A "covered work" means either the unmodified Program or a work based
78 | on the Program.
79 |
80 | To "propagate" a work means to do anything with it that, without
81 | permission, would make you directly or secondarily liable for
82 | infringement under applicable copyright law, except executing it on a
83 | computer or modifying a private copy. Propagation includes copying,
84 | distribution (with or without modification), making available to the
85 | public, and in some countries other activities as well.
86 |
87 | To "convey" a work means any kind of propagation that enables other
88 | parties to make or receive copies. Mere interaction with a user through
89 | a computer network, with no transfer of a copy, is not conveying.
90 |
91 | An interactive user interface displays "Appropriate Legal Notices"
92 | to the extent that it includes a convenient and prominently visible
93 | feature that (1) displays an appropriate copyright notice, and (2)
94 | tells the user that there is no warranty for the work (except to the
95 | extent that warranties are provided), that licensees may convey the
96 | work under this License, and how to view a copy of this License. If
97 | the interface presents a list of user commands or options, such as a
98 | menu, a prominent item in the list meets this criterion.
99 |
100 | 1. Source Code.
101 |
102 | The "source code" for a work means the preferred form of the work
103 | for making modifications to it. "Object code" means any non-source
104 | form of a work.
105 |
106 | A "Standard Interface" means an interface that either is an official
107 | standard defined by a recognized standards body, or, in the case of
108 | interfaces specified for a particular programming language, one that
109 | is widely used among developers working in that language.
110 |
111 | The "System Libraries" of an executable work include anything, other
112 | than the work as a whole, that (a) is included in the normal form of
113 | packaging a Major Component, but which is not part of that Major
114 | Component, and (b) serves only to enable use of the work with that
115 | Major Component, or to implement a Standard Interface for which an
116 | implementation is available to the public in source code form. A
117 | "Major Component", in this context, means a major essential component
118 | (kernel, window system, and so on) of the specific operating system
119 | (if any) on which the executable work runs, or a compiler used to
120 | produce the work, or an object code interpreter used to run it.
121 |
122 | The "Corresponding Source" for a work in object code form means all
123 | the source code needed to generate, install, and (for an executable
124 | work) run the object code and to modify the work, including scripts to
125 | control those activities. However, it does not include the work's
126 | System Libraries, or general-purpose tools or generally available free
127 | programs which are used unmodified in performing those activities but
128 | which are not part of the work. For example, Corresponding Source
129 | includes interface definition files associated with source files for
130 | the work, and the source code for shared libraries and dynamically
131 | linked subprograms that the work is specifically designed to require,
132 | such as by intimate data communication or control flow between those
133 | subprograms and other parts of the work.
134 |
135 | The Corresponding Source need not include anything that users
136 | can regenerate automatically from other parts of the Corresponding
137 | Source.
138 |
139 | The Corresponding Source for a work in source code form is that
140 | same work.
141 |
142 | 2. Basic Permissions.
143 |
144 | All rights granted under this License are granted for the term of
145 | copyright on the Program, and are irrevocable provided the stated
146 | conditions are met. This License explicitly affirms your unlimited
147 | permission to run the unmodified Program. The output from running a
148 | covered work is covered by this License only if the output, given its
149 | content, constitutes a covered work. This License acknowledges your
150 | rights of fair use or other equivalent, as provided by copyright law.
151 |
152 | You may make, run and propagate covered works that you do not
153 | convey, without conditions so long as your license otherwise remains
154 | in force. You may convey covered works to others for the sole purpose
155 | of having them make modifications exclusively for you, or provide you
156 | with facilities for running those works, provided that you comply with
157 | the terms of this License in conveying all material for which you do
158 | not control copyright. Those thus making or running the covered works
159 | for you must do so exclusively on your behalf, under your direction
160 | and control, on terms that prohibit them from making any copies of
161 | your copyrighted material outside their relationship with you.
162 |
163 | Conveying under any other circumstances is permitted solely under
164 | the conditions stated below. Sublicensing is not allowed; section 10
165 | makes it unnecessary.
166 |
167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
168 |
169 | No covered work shall be deemed part of an effective technological
170 | measure under any applicable law fulfilling obligations under article
171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
172 | similar laws prohibiting or restricting circumvention of such
173 | measures.
174 |
175 | When you convey a covered work, you waive any legal power to forbid
176 | circumvention of technological measures to the extent such circumvention
177 | is effected by exercising rights under this License with respect to
178 | the covered work, and you disclaim any intention to limit operation or
179 | modification of the work as a means of enforcing, against the work's
180 | users, your or third parties' legal rights to forbid circumvention of
181 | technological measures.
182 |
183 | 4. Conveying Verbatim Copies.
184 |
185 | You may convey verbatim copies of the Program's source code as you
186 | receive it, in any medium, provided that you conspicuously and
187 | appropriately publish on each copy an appropriate copyright notice;
188 | keep intact all notices stating that this License and any
189 | non-permissive terms added in accord with section 7 apply to the code;
190 | keep intact all notices of the absence of any warranty; and give all
191 | recipients a copy of this License along with the Program.
192 |
193 | You may charge any price or no price for each copy that you convey,
194 | and you may offer support or warranty protection for a fee.
195 |
196 | 5. Conveying Modified Source Versions.
197 |
198 | You may convey a work based on the Program, or the modifications to
199 | produce it from the Program, in the form of source code under the
200 | terms of section 4, provided that you also meet all of these conditions:
201 |
202 | a) The work must carry prominent notices stating that you modified
203 | it, and giving a relevant date.
204 |
205 | b) The work must carry prominent notices stating that it is
206 | released under this License and any conditions added under section
207 | 7. This requirement modifies the requirement in section 4 to
208 | "keep intact all notices".
209 |
210 | c) You must license the entire work, as a whole, under this
211 | License to anyone who comes into possession of a copy. This
212 | License will therefore apply, along with any applicable section 7
213 | additional terms, to the whole of the work, and all its parts,
214 | regardless of how they are packaged. This License gives no
215 | permission to license the work in any other way, but it does not
216 | invalidate such permission if you have separately received it.
217 |
218 | d) If the work has interactive user interfaces, each must display
219 | Appropriate Legal Notices; however, if the Program has interactive
220 | interfaces that do not display Appropriate Legal Notices, your
221 | work need not make them do so.
222 |
223 | A compilation of a covered work with other separate and independent
224 | works, which are not by their nature extensions of the covered work,
225 | and which are not combined with it such as to form a larger program,
226 | in or on a volume of a storage or distribution medium, is called an
227 | "aggregate" if the compilation and its resulting copyright are not
228 | used to limit the access or legal rights of the compilation's users
229 | beyond what the individual works permit. Inclusion of a covered work
230 | in an aggregate does not cause this License to apply to the other
231 | parts of the aggregate.
232 |
233 | 6. Conveying Non-Source Forms.
234 |
235 | You may convey a covered work in object code form under the terms
236 | of sections 4 and 5, provided that you also convey the
237 | machine-readable Corresponding Source under the terms of this License,
238 | in one of these ways:
239 |
240 | a) Convey the object code in, or embodied in, a physical product
241 | (including a physical distribution medium), accompanied by the
242 | Corresponding Source fixed on a durable physical medium
243 | customarily used for software interchange.
244 |
245 | b) Convey the object code in, or embodied in, a physical product
246 | (including a physical distribution medium), accompanied by a
247 | written offer, valid for at least three years and valid for as
248 | long as you offer spare parts or customer support for that product
249 | model, to give anyone who possesses the object code either (1) a
250 | copy of the Corresponding Source for all the software in the
251 | product that is covered by this License, on a durable physical
252 | medium customarily used for software interchange, for a price no
253 | more than your reasonable cost of physically performing this
254 | conveying of source, or (2) access to copy the
255 | Corresponding Source from a network server at no charge.
256 |
257 | c) Convey individual copies of the object code with a copy of the
258 | written offer to provide the Corresponding Source. This
259 | alternative is allowed only occasionally and noncommercially, and
260 | only if you received the object code with such an offer, in accord
261 | with subsection 6b.
262 |
263 | d) Convey the object code by offering access from a designated
264 | place (gratis or for a charge), and offer equivalent access to the
265 | Corresponding Source in the same way through the same place at no
266 | further charge. You need not require recipients to copy the
267 | Corresponding Source along with the object code. If the place to
268 | copy the object code is a network server, the Corresponding Source
269 | may be on a different server (operated by you or a third party)
270 | that supports equivalent copying facilities, provided you maintain
271 | clear directions next to the object code saying where to find the
272 | Corresponding Source. Regardless of what server hosts the
273 | Corresponding Source, you remain obligated to ensure that it is
274 | available for as long as needed to satisfy these requirements.
275 |
276 | e) Convey the object code using peer-to-peer transmission, provided
277 | you inform other peers where the object code and Corresponding
278 | Source of the work are being offered to the general public at no
279 | charge under subsection 6d.
280 |
281 | A separable portion of the object code, whose source code is excluded
282 | from the Corresponding Source as a System Library, need not be
283 | included in conveying the object code work.
284 |
285 | A "User Product" is either (1) a "consumer product", which means any
286 | tangible personal property which is normally used for personal, family,
287 | or household purposes, or (2) anything designed or sold for incorporation
288 | into a dwelling. In determining whether a product is a consumer product,
289 | doubtful cases shall be resolved in favor of coverage. For a particular
290 | product received by a particular user, "normally used" refers to a
291 | typical or common use of that class of product, regardless of the status
292 | of the particular user or of the way in which the particular user
293 | actually uses, or expects or is expected to use, the product. A product
294 | is a consumer product regardless of whether the product has substantial
295 | commercial, industrial or non-consumer uses, unless such uses represent
296 | the only significant mode of use of the product.
297 |
298 | "Installation Information" for a User Product means any methods,
299 | procedures, authorization keys, or other information required to install
300 | and execute modified versions of a covered work in that User Product from
301 | a modified version of its Corresponding Source. The information must
302 | suffice to ensure that the continued functioning of the modified object
303 | code is in no case prevented or interfered with solely because
304 | modification has been made.
305 |
306 | If you convey an object code work under this section in, or with, or
307 | specifically for use in, a User Product, and the conveying occurs as
308 | part of a transaction in which the right of possession and use of the
309 | User Product is transferred to the recipient in perpetuity or for a
310 | fixed term (regardless of how the transaction is characterized), the
311 | Corresponding Source conveyed under this section must be accompanied
312 | by the Installation Information. But this requirement does not apply
313 | if neither you nor any third party retains the ability to install
314 | modified object code on the User Product (for example, the work has
315 | been installed in ROM).
316 |
317 | The requirement to provide Installation Information does not include a
318 | requirement to continue to provide support service, warranty, or updates
319 | for a work that has been modified or installed by the recipient, or for
320 | the User Product in which it has been modified or installed. Access to a
321 | network may be denied when the modification itself materially and
322 | adversely affects the operation of the network or violates the rules and
323 | protocols for communication across the network.
324 |
325 | Corresponding Source conveyed, and Installation Information provided,
326 | in accord with this section must be in a format that is publicly
327 | documented (and with an implementation available to the public in
328 | source code form), and must require no special password or key for
329 | unpacking, reading or copying.
330 |
331 | 7. Additional Terms.
332 |
333 | "Additional permissions" are terms that supplement the terms of this
334 | License by making exceptions from one or more of its conditions.
335 | Additional permissions that are applicable to the entire Program shall
336 | be treated as though they were included in this License, to the extent
337 | that they are valid under applicable law. If additional permissions
338 | apply only to part of the Program, that part may be used separately
339 | under those permissions, but the entire Program remains governed by
340 | this License without regard to the additional permissions.
341 |
342 | When you convey a copy of a covered work, you may at your option
343 | remove any additional permissions from that copy, or from any part of
344 | it. (Additional permissions may be written to require their own
345 | removal in certain cases when you modify the work.) You may place
346 | additional permissions on material, added by you to a covered work,
347 | for which you have or can give appropriate copyright permission.
348 |
349 | Notwithstanding any other provision of this License, for material you
350 | add to a covered work, you may (if authorized by the copyright holders of
351 | that material) supplement the terms of this License with terms:
352 |
353 | a) Disclaiming warranty or limiting liability differently from the
354 | terms of sections 15 and 16 of this License; or
355 |
356 | b) Requiring preservation of specified reasonable legal notices or
357 | author attributions in that material or in the Appropriate Legal
358 | Notices displayed by works containing it; or
359 |
360 | c) Prohibiting misrepresentation of the origin of that material, or
361 | requiring that modified versions of such material be marked in
362 | reasonable ways as different from the original version; or
363 |
364 | d) Limiting the use for publicity purposes of names of licensors or
365 | authors of the material; or
366 |
367 | e) Declining to grant rights under trademark law for use of some
368 | trade names, trademarks, or service marks; or
369 |
370 | f) Requiring indemnification of licensors and authors of that
371 | material by anyone who conveys the material (or modified versions of
372 | it) with contractual assumptions of liability to the recipient, for
373 | any liability that these contractual assumptions directly impose on
374 | those licensors and authors.
375 |
376 | All other non-permissive additional terms are considered "further
377 | restrictions" within the meaning of section 10. If the Program as you
378 | received it, or any part of it, contains a notice stating that it is
379 | governed by this License along with a term that is a further
380 | restriction, you may remove that term. If a license document contains
381 | a further restriction but permits relicensing or conveying under this
382 | License, you may add to a covered work material governed by the terms
383 | of that license document, provided that the further restriction does
384 | not survive such relicensing or conveying.
385 |
386 | If you add terms to a covered work in accord with this section, you
387 | must place, in the relevant source files, a statement of the
388 | additional terms that apply to those files, or a notice indicating
389 | where to find the applicable terms.
390 |
391 | Additional terms, permissive or non-permissive, may be stated in the
392 | form of a separately written license, or stated as exceptions;
393 | the above requirements apply either way.
394 |
395 | 8. Termination.
396 |
397 | You may not propagate or modify a covered work except as expressly
398 | provided under this License. Any attempt otherwise to propagate or
399 | modify it is void, and will automatically terminate your rights under
400 | this License (including any patent licenses granted under the third
401 | paragraph of section 11).
402 |
403 | However, if you cease all violation of this License, then your
404 | license from a particular copyright holder is reinstated (a)
405 | provisionally, unless and until the copyright holder explicitly and
406 | finally terminates your license, and (b) permanently, if the copyright
407 | holder fails to notify you of the violation by some reasonable means
408 | prior to 60 days after the cessation.
409 |
410 | Moreover, your license from a particular copyright holder is
411 | reinstated permanently if the copyright holder notifies you of the
412 | violation by some reasonable means, this is the first time you have
413 | received notice of violation of this License (for any work) from that
414 | copyright holder, and you cure the violation prior to 30 days after
415 | your receipt of the notice.
416 |
417 | Termination of your rights under this section does not terminate the
418 | licenses of parties who have received copies or rights from you under
419 | this License. If your rights have been terminated and not permanently
420 | reinstated, you do not qualify to receive new licenses for the same
421 | material under section 10.
422 |
423 | 9. Acceptance Not Required for Having Copies.
424 |
425 | You are not required to accept this License in order to receive or
426 | run a copy of the Program. Ancillary propagation of a covered work
427 | occurring solely as a consequence of using peer-to-peer transmission
428 | to receive a copy likewise does not require acceptance. However,
429 | nothing other than this License grants you permission to propagate or
430 | modify any covered work. These actions infringe copyright if you do
431 | not accept this License. Therefore, by modifying or propagating a
432 | covered work, you indicate your acceptance of this License to do so.
433 |
434 | 10. Automatic Licensing of Downstream Recipients.
435 |
436 | Each time you convey a covered work, the recipient automatically
437 | receives a license from the original licensors, to run, modify and
438 | propagate that work, subject to this License. You are not responsible
439 | for enforcing compliance by third parties with this License.
440 |
441 | An "entity transaction" is a transaction transferring control of an
442 | organization, or substantially all assets of one, or subdividing an
443 | organization, or merging organizations. If propagation of a covered
444 | work results from an entity transaction, each party to that
445 | transaction who receives a copy of the work also receives whatever
446 | licenses to the work the party's predecessor in interest had or could
447 | give under the previous paragraph, plus a right to possession of the
448 | Corresponding Source of the work from the predecessor in interest, if
449 | the predecessor has it or can get it with reasonable efforts.
450 |
451 | You may not impose any further restrictions on the exercise of the
452 | rights granted or affirmed under this License. For example, you may
453 | not impose a license fee, royalty, or other charge for exercise of
454 | rights granted under this License, and you may not initiate litigation
455 | (including a cross-claim or counterclaim in a lawsuit) alleging that
456 | any patent claim is infringed by making, using, selling, offering for
457 | sale, or importing the Program or any portion of it.
458 |
459 | 11. Patents.
460 |
461 | A "contributor" is a copyright holder who authorizes use under this
462 | License of the Program or a work on which the Program is based. The
463 | work thus licensed is called the contributor's "contributor version".
464 |
465 | A contributor's "essential patent claims" are all patent claims
466 | owned or controlled by the contributor, whether already acquired or
467 | hereafter acquired, that would be infringed by some manner, permitted
468 | by this License, of making, using, or selling its contributor version,
469 | but do not include claims that would be infringed only as a
470 | consequence of further modification of the contributor version. For
471 | purposes of this definition, "control" includes the right to grant
472 | patent sublicenses in a manner consistent with the requirements of
473 | this License.
474 |
475 | Each contributor grants you a non-exclusive, worldwide, royalty-free
476 | patent license under the contributor's essential patent claims, to
477 | make, use, sell, offer for sale, import and otherwise run, modify and
478 | propagate the contents of its contributor version.
479 |
480 | In the following three paragraphs, a "patent license" is any express
481 | agreement or commitment, however denominated, not to enforce a patent
482 | (such as an express permission to practice a patent or covenant not to
483 | sue for patent infringement). To "grant" such a patent license to a
484 | party means to make such an agreement or commitment not to enforce a
485 | patent against the party.
486 |
487 | If you convey a covered work, knowingly relying on a patent license,
488 | and the Corresponding Source of the work is not available for anyone
489 | to copy, free of charge and under the terms of this License, through a
490 | publicly available network server or other readily accessible means,
491 | then you must either (1) cause the Corresponding Source to be so
492 | available, or (2) arrange to deprive yourself of the benefit of the
493 | patent license for this particular work, or (3) arrange, in a manner
494 | consistent with the requirements of this License, to extend the patent
495 | license to downstream recipients. "Knowingly relying" means you have
496 | actual knowledge that, but for the patent license, your conveying the
497 | covered work in a country, or your recipient's use of the covered work
498 | in a country, would infringe one or more identifiable patents in that
499 | country that you have reason to believe are valid.
500 |
501 | If, pursuant to or in connection with a single transaction or
502 | arrangement, you convey, or propagate by procuring conveyance of, a
503 | covered work, and grant a patent license to some of the parties
504 | receiving the covered work authorizing them to use, propagate, modify
505 | or convey a specific copy of the covered work, then the patent license
506 | you grant is automatically extended to all recipients of the covered
507 | work and works based on it.
508 |
509 | A patent license is "discriminatory" if it does not include within
510 | the scope of its coverage, prohibits the exercise of, or is
511 | conditioned on the non-exercise of one or more of the rights that are
512 | specifically granted under this License. You may not convey a covered
513 | work if you are a party to an arrangement with a third party that is
514 | in the business of distributing software, under which you make payment
515 | to the third party based on the extent of your activity of conveying
516 | the work, and under which the third party grants, to any of the
517 | parties who would receive the covered work from you, a discriminatory
518 | patent license (a) in connection with copies of the covered work
519 | conveyed by you (or copies made from those copies), or (b) primarily
520 | for and in connection with specific products or compilations that
521 | contain the covered work, unless you entered into that arrangement,
522 | or that patent license was granted, prior to 28 March 2007.
523 |
524 | Nothing in this License shall be construed as excluding or limiting
525 | any implied license or other defenses to infringement that may
526 | otherwise be available to you under applicable patent law.
527 |
528 | 12. No Surrender of Others' Freedom.
529 |
530 | If conditions are imposed on you (whether by court order, agreement or
531 | otherwise) that contradict the conditions of this License, they do not
532 | excuse you from the conditions of this License. If you cannot convey a
533 | covered work so as to satisfy simultaneously your obligations under this
534 | License and any other pertinent obligations, then as a consequence you may
535 | not convey it at all. For example, if you agree to terms that obligate you
536 | to collect a royalty for further conveying from those to whom you convey
537 | the Program, the only way you could satisfy both those terms and this
538 | License would be to refrain entirely from conveying the Program.
539 |
540 | 13. Remote Network Interaction; Use with the GNU General Public License.
541 |
542 | Notwithstanding any other provision of this License, if you modify the
543 | Program, your modified version must prominently offer all users
544 | interacting with it remotely through a computer network (if your version
545 | supports such interaction) an opportunity to receive the Corresponding
546 | Source of your version by providing access to the Corresponding Source
547 | from a network server at no charge, through some standard or customary
548 | means of facilitating copying of software. This Corresponding Source
549 | shall include the Corresponding Source for any work covered by version 3
550 | of the GNU General Public License that is incorporated pursuant to the
551 | following paragraph.
552 |
553 | Notwithstanding any other provision of this License, you have
554 | permission to link or combine any covered work with a work licensed
555 | under version 3 of the GNU General Public License into a single
556 | combined work, and to convey the resulting work. The terms of this
557 | License will continue to apply to the part which is the covered work,
558 | but the work with which it is combined will remain governed by version
559 | 3 of the GNU General Public License.
560 |
561 | 14. Revised Versions of this License.
562 |
563 | The Free Software Foundation may publish revised and/or new versions of
564 | the GNU Affero General Public License from time to time. Such new versions
565 | will be similar in spirit to the present version, but may differ in detail to
566 | address new problems or concerns.
567 |
568 | Each version is given a distinguishing version number. If the
569 | Program specifies that a certain numbered version of the GNU Affero General
570 | Public License "or any later version" applies to it, you have the
571 | option of following the terms and conditions either of that numbered
572 | version or of any later version published by the Free Software
573 | Foundation. If the Program does not specify a version number of the
574 | GNU Affero General Public License, you may choose any version ever published
575 | by the Free Software Foundation.
576 |
577 | If the Program specifies that a proxy can decide which future
578 | versions of the GNU Affero General Public License can be used, that proxy's
579 | public statement of acceptance of a version permanently authorizes you
580 | to choose that version for the Program.
581 |
582 | Later license versions may give you additional or different
583 | permissions. However, no additional obligations are imposed on any
584 | author or copyright holder as a result of your choosing to follow a
585 | later version.
586 |
587 | 15. Disclaimer of Warranty.
588 |
589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
596 | ALL NECESSARY SERVICING, REPAIR OR 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 CONVEYS
602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
608 | 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 |
621 | How to Apply These Terms to Your New Programs
622 |
623 | If you develop a new program, and you want it to be of the greatest
624 | possible use to the public, the best way to achieve this is to make it
625 | free software which everyone can redistribute and change under these terms.
626 |
627 | To do so, attach the following notices to the program. It is safest
628 | to attach them to the start of each source file to most effectively
629 | state the exclusion of warranty; and each file should have at least
630 | the "copyright" line and a pointer to where the full notice is found.
631 |
632 |
633 | Copyright (C)
634 |
635 | This program is free software: you can redistribute it and/or modify
636 | it under the terms of the GNU Affero General Public License as published by
637 | the Free Software Foundation, either version 3 of the License, or
638 | (at your option) any later version.
639 |
640 | This program is distributed in the hope that it will be useful,
641 | but WITHOUT ANY WARRANTY; without even the implied warranty of
642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
643 | GNU Affero General Public License for more details.
644 |
645 | You should have received a copy of the GNU Affero General Public License
646 | along with this program. If not, see .
647 |
648 | Also add information on how to contact you by electronic and paper mail.
649 |
650 | If your software can interact with users remotely through a computer
651 | network, you should also make sure that it provides a way for users to
652 | get its source. For example, if your program is a web application, its
653 | interface could display a "Source" link that leads users to an archive
654 | of the code. There are many ways you could offer source, and different
655 | solutions will be better for different programs; see section 13 for the
656 | specific requirements.
657 |
658 | You should also get your employer (if you work as a programmer) or school,
659 | if any, to sign a "copyright disclaimer" for the program, if necessary.
660 | For more information on this, and how to apply and follow the GNU AGPL, see
661 | .
662 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | # This file is licensed under the Affero General Public License version 3 or
2 | # later. See the COPYING file.
3 | # @author Bernhard Posselt
4 | # @copyright Bernhard Posselt 2016
5 |
6 | # Generic Makefile for building and packaging a Nextcloud app which uses npm and
7 | # Composer.
8 | #
9 | # Dependencies:
10 | # * make
11 | # * which
12 | # * curl: used if phpunit and composer are not installed to fetch them from the web
13 | # * tar: for building the archive
14 | # * npm: for building and testing everything JS
15 |
16 | app_name=$(notdir $(CURDIR))
17 | build_tools_directory=$(CURDIR)/build/tools
18 | source_build_directory=$(CURDIR)/build/artifacts/source
19 | source_package_name=$(source_build_directory)/$(app_name)
20 | appstore_build_directory=$(CURDIR)/build/artifacts/appstore
21 | appstore_package_name=$(appstore_build_directory)/$(app_name)
22 | nc_cert_directory=$(HOME)/.nextcloud/certificates
23 | npm=$(shell which npm 2> /dev/null)
24 | composer=$(shell which composer 2> /dev/null)
25 |
26 | # Fetches the PHP and JS dependencies and compiles the JS. If no composer.json
27 | # is present, the composer step is skipped, if no package.json or js/package.json
28 | # is present, the npm step is skipped
29 | .PHONY: build
30 | build:
31 | ifneq (,$(wildcard $(CURDIR)/composer.json))
32 | make composer
33 | endif
34 | ifneq (,$(wildcard $(CURDIR)/package.json))
35 | make npm
36 | endif
37 | ifneq (,$(wildcard $(CURDIR)/js/package.json))
38 | make npm
39 | endif
40 |
41 | # Installs and updates the composer dependencies. If composer is not installed
42 | # a copy is fetched from the web
43 | .PHONY: composer
44 | composer:
45 | ifeq (, $(composer))
46 | @echo "No composer command available, downloading a copy from the web"
47 | mkdir -p $(build_tools_directory)
48 | curl -sS https://getcomposer.org/installer | php
49 | mv composer.phar $(build_tools_directory)
50 | php $(build_tools_directory)/composer.phar install --prefer-dist
51 | php $(build_tools_directory)/composer.phar update --prefer-dist
52 | else
53 | composer install --prefer-dist
54 | composer update --prefer-dist
55 | endif
56 |
57 |
58 | all: dev-setup appstore
59 |
60 | # Dev environment setup
61 | dev-setup: distclean npm-init composer
62 |
63 | # Update npm
64 | .PHONY: npm-init
65 | npm-init:
66 | npm install
67 |
68 | # Installs npm dependencies
69 | .PHONY: npm
70 | npm:
71 | ifeq (,$(wildcard $(CURDIR)/package.json))
72 | cd js && $(npm) run build
73 | else
74 | npm run build
75 | endif
76 |
77 | # Removes the appstore build
78 | .PHONY: clean
79 | clean:
80 | rm -rf $(build_dir)
81 | rm -rf js/*
82 | mkdir -p js
83 |
84 | # Same as clean but also removes dependencies installed by composer, bower and
85 | # npm
86 | .PHONY: distclean
87 | distclean: clean
88 | rm -rf node_modules
89 | rm -rf ./vendor
90 |
91 |
92 | # Builds the source package for the app store, ignores php and js tests
93 | .PHONY: appstore
94 | appstore: distclean npm-init build
95 | rm -rf $(appstore_build_directory)
96 | mkdir -p $(appstore_build_directory)
97 | tar cvzf $(appstore_package_name).tar.gz \
98 | --exclude-vcs \
99 | --exclude="../$(app_name)/build" \
100 | --exclude="../$(app_name)/tests" \
101 | --exclude="../$(app_name)/Makefile" \
102 | --exclude="../$(app_name)/*.log" \
103 | --exclude="../$(app_name)/phpunit*xml" \
104 | --exclude="../$(app_name)/composer.*" \
105 | --exclude="../$(app_name)/package.json" \
106 | --exclude="../$(app_name)/package-lock.json" \
107 | --exclude="../$(app_name)/bower.json" \
108 | --exclude="../$(app_name)/karma.*" \
109 | --exclude="../$(app_name)/protractor\.*" \
110 | --exclude="../$(app_name)/.*" \
111 | --exclude="../$(app_name)/js/.*" \
112 | --exclude="../$(app_name)/screenshots" \
113 | --exclude="../$(app_name)/src" \
114 | --exclude="../$(app_name)/tests" \
115 | --exclude="../$(app_name)/node_modules" \
116 | --exclude="../$(app_name)/vendor" \
117 | --exclude="../$(app_name)/webpack.*" \
118 | ../$(app_name) \
119 |
120 | @if [ -f $(nc_cert_directory)/$(app_name).key ]; then \
121 | echo "Signing package..."; \
122 | openssl dgst -sha512 -sign $(nc_cert_directory)/$(app_name).key $(appstore_build_directory)/$(app_name).tar.gz | openssl base64; \
123 | fi
124 |
125 | .PHONY: test
126 | test: composer
127 | $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.xml
128 | $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.integration.xml
129 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # files_3d
2 | Place this app in **nextcloud/apps/**
3 |
4 | ## Building the app
5 |
6 | **Please note**: Currently, all required files are bundled, no need to build. But this is for testing stage only. In a later stage I plan to support the `make` build process below.
7 |
8 | The app can be built by using the provided Makefile by running:
9 |
10 | make
11 |
12 | This requires the following things to be present:
13 | * make
14 | * which
15 | * tar: for building the archive
16 | * curl: used if phpunit and composer are not installed to fetch them from the web
17 | * npm: for building and testing everything JS, only required if a package.json is placed inside the **js/** folder
18 |
19 | The make command will install or update Composer dependencies if a composer.json is present and also **npm run build** if a package.json is present in the **js/** folder. The npm **build** script should use local paths for build systems and package managers, so people that simply want to build the app won't need to install npm libraries globally, e.g.:
20 |
21 | **package.json**:
22 | ```json
23 | "scripts": {
24 | "test": "node node_modules/gulp-cli/bin/gulp.js karma",
25 | "prebuild": "npm install && node_modules/bower/bin/bower install && node_modules/bower/bin/bower update",
26 | "build": "node node_modules/gulp-cli/bin/gulp.js"
27 | }
28 | ```
29 |
30 | ## Publish to App Store
31 |
32 | First get an account for the [App Store](http://apps.nextcloud.com/) then run:
33 |
34 | make && make appstore
35 |
36 | The archive is located in build/artifacts/appstore and can then be uploaded to the App Store.
37 |
38 | ## Running tests
39 | You can use the provided Makefile to run all tests by using:
40 |
41 | make test
42 |
43 | This will run the PHP unit and integration tests and if a package.json is present in the **js/** folder will execute **npm run test**
44 |
45 | Of course you can also install [PHPUnit](http://phpunit.de/getting-started.html) and use the configurations directly:
46 |
47 | phpunit -c phpunit.xml
48 |
49 | or:
50 |
51 | phpunit -c phpunit.integration.xml
52 |
53 | for integration tests
54 |
--------------------------------------------------------------------------------
/appinfo/app.php:
--------------------------------------------------------------------------------
1 |
4 | *
5 | * @author Vinzenz Rosenkranz
6 | *
7 | * @license GNU AGPL version 3 or any later version
8 | *
9 | * This program is free software: you can redistribute it and/or modify
10 | * it under the terms of the GNU Affero General Public License as
11 | * published by the Free Software Foundation, either version 3 of the
12 | * License, or (at your option) any later version.
13 | *
14 | * This program is distributed in the hope that it will be useful,
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 | * GNU Affero General Public License for more details.
18 | *
19 | * You should have received a copy of the GNU Affero General Public License
20 | * along with this program. If not, see .
21 | *
22 | */
23 |
24 | use OCA\Files3d\AppInfo\Application;
25 |
26 | $app = \OC::$server->query(Application::class);
27 | $app->register();
28 |
--------------------------------------------------------------------------------
/appinfo/info.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | files_3d
5 | Files 3d
6 | 3D viewer for nextcloud
7 | Adds support for different 3D file formats (.dae, .fbx, .gltf, .obj) to Nextcloud. Based on three.js.
8 | 0.6.0
9 | agpl
10 | Vinzenz Rosenkranz
11 | Files3d
12 |
13 |
14 |
15 | tools
16 |
17 | https://github.com/v1r0x/files_3d
18 | https://github.com/v1r0x/files_3d
19 | https://github.com/v1r0x/files_3d
20 |
21 | https://github.com/v1r0x/files_3d
22 | https://github.com/v1r0x/files_3d/issues
23 | https://raw.githubusercontent.com/v1r0x/files_3d/master/screenshots/screenshot1.png
24 |
25 |
26 |
27 |
28 |
29 | OCA\Files3d\Migration\AddMimetypeToFilecache
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "v1r0x/files_3d",
3 | "description": "3D viewer for nextcloud",
4 | "type": "project",
5 | "license": "AGPL",
6 | "authors": [
7 | {
8 | "name": "Vinzenz Rosenkranz"
9 | }
10 | ],
11 | "require": {},
12 | "require-dev": {
13 | "phpunit/phpunit": "~7.0"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/composer.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_readme": [
3 | "This file locks the dependencies of your project to a known state",
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 | "This file is @generated automatically"
6 | ],
7 | "content-hash": "ebb3cfde9cd2283d5bae2ac2e198c012",
8 | "packages": [],
9 | "packages-dev": [
10 | {
11 | "name": "doctrine/instantiator",
12 | "version": "1.4.1",
13 | "source": {
14 | "type": "git",
15 | "url": "https://github.com/doctrine/instantiator.git",
16 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
17 | },
18 | "dist": {
19 | "type": "zip",
20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
21 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
22 | "shasum": ""
23 | },
24 | "require": {
25 | "php": "^7.1 || ^8.0"
26 | },
27 | "require-dev": {
28 | "doctrine/coding-standard": "^9",
29 | "ext-pdo": "*",
30 | "ext-phar": "*",
31 | "phpbench/phpbench": "^0.16 || ^1",
32 | "phpstan/phpstan": "^1.4",
33 | "phpstan/phpstan-phpunit": "^1",
34 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
35 | "vimeo/psalm": "^4.22"
36 | },
37 | "type": "library",
38 | "autoload": {
39 | "psr-4": {
40 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
41 | }
42 | },
43 | "notification-url": "https://packagist.org/downloads/",
44 | "license": [
45 | "MIT"
46 | ],
47 | "authors": [
48 | {
49 | "name": "Marco Pivetta",
50 | "email": "ocramius@gmail.com",
51 | "homepage": "https://ocramius.github.io/"
52 | }
53 | ],
54 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
55 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
56 | "keywords": [
57 | "constructor",
58 | "instantiate"
59 | ],
60 | "support": {
61 | "issues": "https://github.com/doctrine/instantiator/issues",
62 | "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
63 | },
64 | "funding": [
65 | {
66 | "url": "https://www.doctrine-project.org/sponsorship.html",
67 | "type": "custom"
68 | },
69 | {
70 | "url": "https://www.patreon.com/phpdoctrine",
71 | "type": "patreon"
72 | },
73 | {
74 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
75 | "type": "tidelift"
76 | }
77 | ],
78 | "time": "2022-03-03T08:28:38+00:00"
79 | },
80 | {
81 | "name": "myclabs/deep-copy",
82 | "version": "1.11.0",
83 | "source": {
84 | "type": "git",
85 | "url": "https://github.com/myclabs/DeepCopy.git",
86 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
87 | },
88 | "dist": {
89 | "type": "zip",
90 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
91 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
92 | "shasum": ""
93 | },
94 | "require": {
95 | "php": "^7.1 || ^8.0"
96 | },
97 | "conflict": {
98 | "doctrine/collections": "<1.6.8",
99 | "doctrine/common": "<2.13.3 || >=3,<3.2.2"
100 | },
101 | "require-dev": {
102 | "doctrine/collections": "^1.6.8",
103 | "doctrine/common": "^2.13.3 || ^3.2.2",
104 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
105 | },
106 | "type": "library",
107 | "autoload": {
108 | "files": [
109 | "src/DeepCopy/deep_copy.php"
110 | ],
111 | "psr-4": {
112 | "DeepCopy\\": "src/DeepCopy/"
113 | }
114 | },
115 | "notification-url": "https://packagist.org/downloads/",
116 | "license": [
117 | "MIT"
118 | ],
119 | "description": "Create deep copies (clones) of your objects",
120 | "keywords": [
121 | "clone",
122 | "copy",
123 | "duplicate",
124 | "object",
125 | "object graph"
126 | ],
127 | "support": {
128 | "issues": "https://github.com/myclabs/DeepCopy/issues",
129 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
130 | },
131 | "funding": [
132 | {
133 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
134 | "type": "tidelift"
135 | }
136 | ],
137 | "time": "2022-03-03T13:19:32+00:00"
138 | },
139 | {
140 | "name": "phar-io/manifest",
141 | "version": "1.0.3",
142 | "source": {
143 | "type": "git",
144 | "url": "https://github.com/phar-io/manifest.git",
145 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
146 | },
147 | "dist": {
148 | "type": "zip",
149 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
150 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
151 | "shasum": ""
152 | },
153 | "require": {
154 | "ext-dom": "*",
155 | "ext-phar": "*",
156 | "phar-io/version": "^2.0",
157 | "php": "^5.6 || ^7.0"
158 | },
159 | "type": "library",
160 | "extra": {
161 | "branch-alias": {
162 | "dev-master": "1.0.x-dev"
163 | }
164 | },
165 | "autoload": {
166 | "classmap": [
167 | "src/"
168 | ]
169 | },
170 | "notification-url": "https://packagist.org/downloads/",
171 | "license": [
172 | "BSD-3-Clause"
173 | ],
174 | "authors": [
175 | {
176 | "name": "Arne Blankerts",
177 | "email": "arne@blankerts.de",
178 | "role": "Developer"
179 | },
180 | {
181 | "name": "Sebastian Heuer",
182 | "email": "sebastian@phpeople.de",
183 | "role": "Developer"
184 | },
185 | {
186 | "name": "Sebastian Bergmann",
187 | "email": "sebastian@phpunit.de",
188 | "role": "Developer"
189 | }
190 | ],
191 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
192 | "support": {
193 | "issues": "https://github.com/phar-io/manifest/issues",
194 | "source": "https://github.com/phar-io/manifest/tree/master"
195 | },
196 | "time": "2018-07-08T19:23:20+00:00"
197 | },
198 | {
199 | "name": "phar-io/version",
200 | "version": "2.0.1",
201 | "source": {
202 | "type": "git",
203 | "url": "https://github.com/phar-io/version.git",
204 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
205 | },
206 | "dist": {
207 | "type": "zip",
208 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
209 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
210 | "shasum": ""
211 | },
212 | "require": {
213 | "php": "^5.6 || ^7.0"
214 | },
215 | "type": "library",
216 | "autoload": {
217 | "classmap": [
218 | "src/"
219 | ]
220 | },
221 | "notification-url": "https://packagist.org/downloads/",
222 | "license": [
223 | "BSD-3-Clause"
224 | ],
225 | "authors": [
226 | {
227 | "name": "Arne Blankerts",
228 | "email": "arne@blankerts.de",
229 | "role": "Developer"
230 | },
231 | {
232 | "name": "Sebastian Heuer",
233 | "email": "sebastian@phpeople.de",
234 | "role": "Developer"
235 | },
236 | {
237 | "name": "Sebastian Bergmann",
238 | "email": "sebastian@phpunit.de",
239 | "role": "Developer"
240 | }
241 | ],
242 | "description": "Library for handling version information and constraints",
243 | "support": {
244 | "issues": "https://github.com/phar-io/version/issues",
245 | "source": "https://github.com/phar-io/version/tree/master"
246 | },
247 | "time": "2018-07-08T19:19:57+00:00"
248 | },
249 | {
250 | "name": "phpdocumentor/reflection-common",
251 | "version": "2.2.0",
252 | "source": {
253 | "type": "git",
254 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
255 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
256 | },
257 | "dist": {
258 | "type": "zip",
259 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
260 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
261 | "shasum": ""
262 | },
263 | "require": {
264 | "php": "^7.2 || ^8.0"
265 | },
266 | "type": "library",
267 | "extra": {
268 | "branch-alias": {
269 | "dev-2.x": "2.x-dev"
270 | }
271 | },
272 | "autoload": {
273 | "psr-4": {
274 | "phpDocumentor\\Reflection\\": "src/"
275 | }
276 | },
277 | "notification-url": "https://packagist.org/downloads/",
278 | "license": [
279 | "MIT"
280 | ],
281 | "authors": [
282 | {
283 | "name": "Jaap van Otterdijk",
284 | "email": "opensource@ijaap.nl"
285 | }
286 | ],
287 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
288 | "homepage": "http://www.phpdoc.org",
289 | "keywords": [
290 | "FQSEN",
291 | "phpDocumentor",
292 | "phpdoc",
293 | "reflection",
294 | "static analysis"
295 | ],
296 | "support": {
297 | "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
298 | "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
299 | },
300 | "time": "2020-06-27T09:03:43+00:00"
301 | },
302 | {
303 | "name": "phpdocumentor/reflection-docblock",
304 | "version": "5.3.0",
305 | "source": {
306 | "type": "git",
307 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
308 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
309 | },
310 | "dist": {
311 | "type": "zip",
312 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
313 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
314 | "shasum": ""
315 | },
316 | "require": {
317 | "ext-filter": "*",
318 | "php": "^7.2 || ^8.0",
319 | "phpdocumentor/reflection-common": "^2.2",
320 | "phpdocumentor/type-resolver": "^1.3",
321 | "webmozart/assert": "^1.9.1"
322 | },
323 | "require-dev": {
324 | "mockery/mockery": "~1.3.2",
325 | "psalm/phar": "^4.8"
326 | },
327 | "type": "library",
328 | "extra": {
329 | "branch-alias": {
330 | "dev-master": "5.x-dev"
331 | }
332 | },
333 | "autoload": {
334 | "psr-4": {
335 | "phpDocumentor\\Reflection\\": "src"
336 | }
337 | },
338 | "notification-url": "https://packagist.org/downloads/",
339 | "license": [
340 | "MIT"
341 | ],
342 | "authors": [
343 | {
344 | "name": "Mike van Riel",
345 | "email": "me@mikevanriel.com"
346 | },
347 | {
348 | "name": "Jaap van Otterdijk",
349 | "email": "account@ijaap.nl"
350 | }
351 | ],
352 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
353 | "support": {
354 | "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
355 | "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
356 | },
357 | "time": "2021-10-19T17:43:47+00:00"
358 | },
359 | {
360 | "name": "phpdocumentor/type-resolver",
361 | "version": "1.6.0",
362 | "source": {
363 | "type": "git",
364 | "url": "https://github.com/phpDocumentor/TypeResolver.git",
365 | "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706"
366 | },
367 | "dist": {
368 | "type": "zip",
369 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706",
370 | "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706",
371 | "shasum": ""
372 | },
373 | "require": {
374 | "php": "^7.2 || ^8.0",
375 | "phpdocumentor/reflection-common": "^2.0"
376 | },
377 | "require-dev": {
378 | "ext-tokenizer": "*",
379 | "psalm/phar": "^4.8"
380 | },
381 | "type": "library",
382 | "extra": {
383 | "branch-alias": {
384 | "dev-1.x": "1.x-dev"
385 | }
386 | },
387 | "autoload": {
388 | "psr-4": {
389 | "phpDocumentor\\Reflection\\": "src"
390 | }
391 | },
392 | "notification-url": "https://packagist.org/downloads/",
393 | "license": [
394 | "MIT"
395 | ],
396 | "authors": [
397 | {
398 | "name": "Mike van Riel",
399 | "email": "me@mikevanriel.com"
400 | }
401 | ],
402 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
403 | "support": {
404 | "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
405 | "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0"
406 | },
407 | "time": "2022-01-04T19:58:01+00:00"
408 | },
409 | {
410 | "name": "phpspec/prophecy",
411 | "version": "v1.15.0",
412 | "source": {
413 | "type": "git",
414 | "url": "https://github.com/phpspec/prophecy.git",
415 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
416 | },
417 | "dist": {
418 | "type": "zip",
419 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
420 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
421 | "shasum": ""
422 | },
423 | "require": {
424 | "doctrine/instantiator": "^1.2",
425 | "php": "^7.2 || ~8.0, <8.2",
426 | "phpdocumentor/reflection-docblock": "^5.2",
427 | "sebastian/comparator": "^3.0 || ^4.0",
428 | "sebastian/recursion-context": "^3.0 || ^4.0"
429 | },
430 | "require-dev": {
431 | "phpspec/phpspec": "^6.0 || ^7.0",
432 | "phpunit/phpunit": "^8.0 || ^9.0"
433 | },
434 | "type": "library",
435 | "extra": {
436 | "branch-alias": {
437 | "dev-master": "1.x-dev"
438 | }
439 | },
440 | "autoload": {
441 | "psr-4": {
442 | "Prophecy\\": "src/Prophecy"
443 | }
444 | },
445 | "notification-url": "https://packagist.org/downloads/",
446 | "license": [
447 | "MIT"
448 | ],
449 | "authors": [
450 | {
451 | "name": "Konstantin Kudryashov",
452 | "email": "ever.zet@gmail.com",
453 | "homepage": "http://everzet.com"
454 | },
455 | {
456 | "name": "Marcello Duarte",
457 | "email": "marcello.duarte@gmail.com"
458 | }
459 | ],
460 | "description": "Highly opinionated mocking framework for PHP 5.3+",
461 | "homepage": "https://github.com/phpspec/prophecy",
462 | "keywords": [
463 | "Double",
464 | "Dummy",
465 | "fake",
466 | "mock",
467 | "spy",
468 | "stub"
469 | ],
470 | "support": {
471 | "issues": "https://github.com/phpspec/prophecy/issues",
472 | "source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
473 | },
474 | "time": "2021-12-08T12:19:24+00:00"
475 | },
476 | {
477 | "name": "phpunit/php-code-coverage",
478 | "version": "6.1.4",
479 | "source": {
480 | "type": "git",
481 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
482 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d"
483 | },
484 | "dist": {
485 | "type": "zip",
486 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
487 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
488 | "shasum": ""
489 | },
490 | "require": {
491 | "ext-dom": "*",
492 | "ext-xmlwriter": "*",
493 | "php": "^7.1",
494 | "phpunit/php-file-iterator": "^2.0",
495 | "phpunit/php-text-template": "^1.2.1",
496 | "phpunit/php-token-stream": "^3.0",
497 | "sebastian/code-unit-reverse-lookup": "^1.0.1",
498 | "sebastian/environment": "^3.1 || ^4.0",
499 | "sebastian/version": "^2.0.1",
500 | "theseer/tokenizer": "^1.1"
501 | },
502 | "require-dev": {
503 | "phpunit/phpunit": "^7.0"
504 | },
505 | "suggest": {
506 | "ext-xdebug": "^2.6.0"
507 | },
508 | "type": "library",
509 | "extra": {
510 | "branch-alias": {
511 | "dev-master": "6.1-dev"
512 | }
513 | },
514 | "autoload": {
515 | "classmap": [
516 | "src/"
517 | ]
518 | },
519 | "notification-url": "https://packagist.org/downloads/",
520 | "license": [
521 | "BSD-3-Clause"
522 | ],
523 | "authors": [
524 | {
525 | "name": "Sebastian Bergmann",
526 | "email": "sebastian@phpunit.de",
527 | "role": "lead"
528 | }
529 | ],
530 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
531 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
532 | "keywords": [
533 | "coverage",
534 | "testing",
535 | "xunit"
536 | ],
537 | "support": {
538 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
539 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/master"
540 | },
541 | "time": "2018-10-31T16:06:48+00:00"
542 | },
543 | {
544 | "name": "phpunit/php-file-iterator",
545 | "version": "2.0.5",
546 | "source": {
547 | "type": "git",
548 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
549 | "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5"
550 | },
551 | "dist": {
552 | "type": "zip",
553 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5",
554 | "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5",
555 | "shasum": ""
556 | },
557 | "require": {
558 | "php": ">=7.1"
559 | },
560 | "require-dev": {
561 | "phpunit/phpunit": "^8.5"
562 | },
563 | "type": "library",
564 | "extra": {
565 | "branch-alias": {
566 | "dev-master": "2.0.x-dev"
567 | }
568 | },
569 | "autoload": {
570 | "classmap": [
571 | "src/"
572 | ]
573 | },
574 | "notification-url": "https://packagist.org/downloads/",
575 | "license": [
576 | "BSD-3-Clause"
577 | ],
578 | "authors": [
579 | {
580 | "name": "Sebastian Bergmann",
581 | "email": "sebastian@phpunit.de",
582 | "role": "lead"
583 | }
584 | ],
585 | "description": "FilterIterator implementation that filters files based on a list of suffixes.",
586 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
587 | "keywords": [
588 | "filesystem",
589 | "iterator"
590 | ],
591 | "support": {
592 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
593 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5"
594 | },
595 | "funding": [
596 | {
597 | "url": "https://github.com/sebastianbergmann",
598 | "type": "github"
599 | }
600 | ],
601 | "time": "2021-12-02T12:42:26+00:00"
602 | },
603 | {
604 | "name": "phpunit/php-text-template",
605 | "version": "1.2.1",
606 | "source": {
607 | "type": "git",
608 | "url": "https://github.com/sebastianbergmann/php-text-template.git",
609 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
610 | },
611 | "dist": {
612 | "type": "zip",
613 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
614 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
615 | "shasum": ""
616 | },
617 | "require": {
618 | "php": ">=5.3.3"
619 | },
620 | "type": "library",
621 | "autoload": {
622 | "classmap": [
623 | "src/"
624 | ]
625 | },
626 | "notification-url": "https://packagist.org/downloads/",
627 | "license": [
628 | "BSD-3-Clause"
629 | ],
630 | "authors": [
631 | {
632 | "name": "Sebastian Bergmann",
633 | "email": "sebastian@phpunit.de",
634 | "role": "lead"
635 | }
636 | ],
637 | "description": "Simple template engine.",
638 | "homepage": "https://github.com/sebastianbergmann/php-text-template/",
639 | "keywords": [
640 | "template"
641 | ],
642 | "support": {
643 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
644 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
645 | },
646 | "time": "2015-06-21T13:50:34+00:00"
647 | },
648 | {
649 | "name": "phpunit/php-timer",
650 | "version": "2.1.3",
651 | "source": {
652 | "type": "git",
653 | "url": "https://github.com/sebastianbergmann/php-timer.git",
654 | "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662"
655 | },
656 | "dist": {
657 | "type": "zip",
658 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662",
659 | "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662",
660 | "shasum": ""
661 | },
662 | "require": {
663 | "php": ">=7.1"
664 | },
665 | "require-dev": {
666 | "phpunit/phpunit": "^8.5"
667 | },
668 | "type": "library",
669 | "extra": {
670 | "branch-alias": {
671 | "dev-master": "2.1-dev"
672 | }
673 | },
674 | "autoload": {
675 | "classmap": [
676 | "src/"
677 | ]
678 | },
679 | "notification-url": "https://packagist.org/downloads/",
680 | "license": [
681 | "BSD-3-Clause"
682 | ],
683 | "authors": [
684 | {
685 | "name": "Sebastian Bergmann",
686 | "email": "sebastian@phpunit.de",
687 | "role": "lead"
688 | }
689 | ],
690 | "description": "Utility class for timing",
691 | "homepage": "https://github.com/sebastianbergmann/php-timer/",
692 | "keywords": [
693 | "timer"
694 | ],
695 | "support": {
696 | "issues": "https://github.com/sebastianbergmann/php-timer/issues",
697 | "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3"
698 | },
699 | "funding": [
700 | {
701 | "url": "https://github.com/sebastianbergmann",
702 | "type": "github"
703 | }
704 | ],
705 | "time": "2020-11-30T08:20:02+00:00"
706 | },
707 | {
708 | "name": "phpunit/php-token-stream",
709 | "version": "3.1.3",
710 | "source": {
711 | "type": "git",
712 | "url": "https://github.com/sebastianbergmann/php-token-stream.git",
713 | "reference": "9c1da83261628cb24b6a6df371b6e312b3954768"
714 | },
715 | "dist": {
716 | "type": "zip",
717 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768",
718 | "reference": "9c1da83261628cb24b6a6df371b6e312b3954768",
719 | "shasum": ""
720 | },
721 | "require": {
722 | "ext-tokenizer": "*",
723 | "php": ">=7.1"
724 | },
725 | "require-dev": {
726 | "phpunit/phpunit": "^7.0"
727 | },
728 | "type": "library",
729 | "extra": {
730 | "branch-alias": {
731 | "dev-master": "3.1-dev"
732 | }
733 | },
734 | "autoload": {
735 | "classmap": [
736 | "src/"
737 | ]
738 | },
739 | "notification-url": "https://packagist.org/downloads/",
740 | "license": [
741 | "BSD-3-Clause"
742 | ],
743 | "authors": [
744 | {
745 | "name": "Sebastian Bergmann",
746 | "email": "sebastian@phpunit.de"
747 | }
748 | ],
749 | "description": "Wrapper around PHP's tokenizer extension.",
750 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
751 | "keywords": [
752 | "tokenizer"
753 | ],
754 | "support": {
755 | "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
756 | "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3"
757 | },
758 | "funding": [
759 | {
760 | "url": "https://github.com/sebastianbergmann",
761 | "type": "github"
762 | }
763 | ],
764 | "abandoned": true,
765 | "time": "2021-07-26T12:15:06+00:00"
766 | },
767 | {
768 | "name": "phpunit/phpunit",
769 | "version": "7.5.20",
770 | "source": {
771 | "type": "git",
772 | "url": "https://github.com/sebastianbergmann/phpunit.git",
773 | "reference": "9467db479d1b0487c99733bb1e7944d32deded2c"
774 | },
775 | "dist": {
776 | "type": "zip",
777 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c",
778 | "reference": "9467db479d1b0487c99733bb1e7944d32deded2c",
779 | "shasum": ""
780 | },
781 | "require": {
782 | "doctrine/instantiator": "^1.1",
783 | "ext-dom": "*",
784 | "ext-json": "*",
785 | "ext-libxml": "*",
786 | "ext-mbstring": "*",
787 | "ext-xml": "*",
788 | "myclabs/deep-copy": "^1.7",
789 | "phar-io/manifest": "^1.0.2",
790 | "phar-io/version": "^2.0",
791 | "php": "^7.1",
792 | "phpspec/prophecy": "^1.7",
793 | "phpunit/php-code-coverage": "^6.0.7",
794 | "phpunit/php-file-iterator": "^2.0.1",
795 | "phpunit/php-text-template": "^1.2.1",
796 | "phpunit/php-timer": "^2.1",
797 | "sebastian/comparator": "^3.0",
798 | "sebastian/diff": "^3.0",
799 | "sebastian/environment": "^4.0",
800 | "sebastian/exporter": "^3.1",
801 | "sebastian/global-state": "^2.0",
802 | "sebastian/object-enumerator": "^3.0.3",
803 | "sebastian/resource-operations": "^2.0",
804 | "sebastian/version": "^2.0.1"
805 | },
806 | "conflict": {
807 | "phpunit/phpunit-mock-objects": "*"
808 | },
809 | "require-dev": {
810 | "ext-pdo": "*"
811 | },
812 | "suggest": {
813 | "ext-soap": "*",
814 | "ext-xdebug": "*",
815 | "phpunit/php-invoker": "^2.0"
816 | },
817 | "bin": [
818 | "phpunit"
819 | ],
820 | "type": "library",
821 | "extra": {
822 | "branch-alias": {
823 | "dev-master": "7.5-dev"
824 | }
825 | },
826 | "autoload": {
827 | "classmap": [
828 | "src/"
829 | ]
830 | },
831 | "notification-url": "https://packagist.org/downloads/",
832 | "license": [
833 | "BSD-3-Clause"
834 | ],
835 | "authors": [
836 | {
837 | "name": "Sebastian Bergmann",
838 | "email": "sebastian@phpunit.de",
839 | "role": "lead"
840 | }
841 | ],
842 | "description": "The PHP Unit Testing framework.",
843 | "homepage": "https://phpunit.de/",
844 | "keywords": [
845 | "phpunit",
846 | "testing",
847 | "xunit"
848 | ],
849 | "support": {
850 | "issues": "https://github.com/sebastianbergmann/phpunit/issues",
851 | "source": "https://github.com/sebastianbergmann/phpunit/tree/7.5.20"
852 | },
853 | "time": "2020-01-08T08:45:45+00:00"
854 | },
855 | {
856 | "name": "sebastian/code-unit-reverse-lookup",
857 | "version": "1.0.2",
858 | "source": {
859 | "type": "git",
860 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
861 | "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619"
862 | },
863 | "dist": {
864 | "type": "zip",
865 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619",
866 | "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619",
867 | "shasum": ""
868 | },
869 | "require": {
870 | "php": ">=5.6"
871 | },
872 | "require-dev": {
873 | "phpunit/phpunit": "^8.5"
874 | },
875 | "type": "library",
876 | "extra": {
877 | "branch-alias": {
878 | "dev-master": "1.0.x-dev"
879 | }
880 | },
881 | "autoload": {
882 | "classmap": [
883 | "src/"
884 | ]
885 | },
886 | "notification-url": "https://packagist.org/downloads/",
887 | "license": [
888 | "BSD-3-Clause"
889 | ],
890 | "authors": [
891 | {
892 | "name": "Sebastian Bergmann",
893 | "email": "sebastian@phpunit.de"
894 | }
895 | ],
896 | "description": "Looks up which function or method a line of code belongs to",
897 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
898 | "support": {
899 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
900 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2"
901 | },
902 | "funding": [
903 | {
904 | "url": "https://github.com/sebastianbergmann",
905 | "type": "github"
906 | }
907 | ],
908 | "time": "2020-11-30T08:15:22+00:00"
909 | },
910 | {
911 | "name": "sebastian/comparator",
912 | "version": "3.0.3",
913 | "source": {
914 | "type": "git",
915 | "url": "https://github.com/sebastianbergmann/comparator.git",
916 | "reference": "1071dfcef776a57013124ff35e1fc41ccd294758"
917 | },
918 | "dist": {
919 | "type": "zip",
920 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758",
921 | "reference": "1071dfcef776a57013124ff35e1fc41ccd294758",
922 | "shasum": ""
923 | },
924 | "require": {
925 | "php": ">=7.1",
926 | "sebastian/diff": "^3.0",
927 | "sebastian/exporter": "^3.1"
928 | },
929 | "require-dev": {
930 | "phpunit/phpunit": "^8.5"
931 | },
932 | "type": "library",
933 | "extra": {
934 | "branch-alias": {
935 | "dev-master": "3.0-dev"
936 | }
937 | },
938 | "autoload": {
939 | "classmap": [
940 | "src/"
941 | ]
942 | },
943 | "notification-url": "https://packagist.org/downloads/",
944 | "license": [
945 | "BSD-3-Clause"
946 | ],
947 | "authors": [
948 | {
949 | "name": "Sebastian Bergmann",
950 | "email": "sebastian@phpunit.de"
951 | },
952 | {
953 | "name": "Jeff Welch",
954 | "email": "whatthejeff@gmail.com"
955 | },
956 | {
957 | "name": "Volker Dusch",
958 | "email": "github@wallbash.com"
959 | },
960 | {
961 | "name": "Bernhard Schussek",
962 | "email": "bschussek@2bepublished.at"
963 | }
964 | ],
965 | "description": "Provides the functionality to compare PHP values for equality",
966 | "homepage": "https://github.com/sebastianbergmann/comparator",
967 | "keywords": [
968 | "comparator",
969 | "compare",
970 | "equality"
971 | ],
972 | "support": {
973 | "issues": "https://github.com/sebastianbergmann/comparator/issues",
974 | "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3"
975 | },
976 | "funding": [
977 | {
978 | "url": "https://github.com/sebastianbergmann",
979 | "type": "github"
980 | }
981 | ],
982 | "time": "2020-11-30T08:04:30+00:00"
983 | },
984 | {
985 | "name": "sebastian/diff",
986 | "version": "3.0.3",
987 | "source": {
988 | "type": "git",
989 | "url": "https://github.com/sebastianbergmann/diff.git",
990 | "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211"
991 | },
992 | "dist": {
993 | "type": "zip",
994 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211",
995 | "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211",
996 | "shasum": ""
997 | },
998 | "require": {
999 | "php": ">=7.1"
1000 | },
1001 | "require-dev": {
1002 | "phpunit/phpunit": "^7.5 || ^8.0",
1003 | "symfony/process": "^2 || ^3.3 || ^4"
1004 | },
1005 | "type": "library",
1006 | "extra": {
1007 | "branch-alias": {
1008 | "dev-master": "3.0-dev"
1009 | }
1010 | },
1011 | "autoload": {
1012 | "classmap": [
1013 | "src/"
1014 | ]
1015 | },
1016 | "notification-url": "https://packagist.org/downloads/",
1017 | "license": [
1018 | "BSD-3-Clause"
1019 | ],
1020 | "authors": [
1021 | {
1022 | "name": "Sebastian Bergmann",
1023 | "email": "sebastian@phpunit.de"
1024 | },
1025 | {
1026 | "name": "Kore Nordmann",
1027 | "email": "mail@kore-nordmann.de"
1028 | }
1029 | ],
1030 | "description": "Diff implementation",
1031 | "homepage": "https://github.com/sebastianbergmann/diff",
1032 | "keywords": [
1033 | "diff",
1034 | "udiff",
1035 | "unidiff",
1036 | "unified diff"
1037 | ],
1038 | "support": {
1039 | "issues": "https://github.com/sebastianbergmann/diff/issues",
1040 | "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3"
1041 | },
1042 | "funding": [
1043 | {
1044 | "url": "https://github.com/sebastianbergmann",
1045 | "type": "github"
1046 | }
1047 | ],
1048 | "time": "2020-11-30T07:59:04+00:00"
1049 | },
1050 | {
1051 | "name": "sebastian/environment",
1052 | "version": "4.2.4",
1053 | "source": {
1054 | "type": "git",
1055 | "url": "https://github.com/sebastianbergmann/environment.git",
1056 | "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0"
1057 | },
1058 | "dist": {
1059 | "type": "zip",
1060 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0",
1061 | "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0",
1062 | "shasum": ""
1063 | },
1064 | "require": {
1065 | "php": ">=7.1"
1066 | },
1067 | "require-dev": {
1068 | "phpunit/phpunit": "^7.5"
1069 | },
1070 | "suggest": {
1071 | "ext-posix": "*"
1072 | },
1073 | "type": "library",
1074 | "extra": {
1075 | "branch-alias": {
1076 | "dev-master": "4.2-dev"
1077 | }
1078 | },
1079 | "autoload": {
1080 | "classmap": [
1081 | "src/"
1082 | ]
1083 | },
1084 | "notification-url": "https://packagist.org/downloads/",
1085 | "license": [
1086 | "BSD-3-Clause"
1087 | ],
1088 | "authors": [
1089 | {
1090 | "name": "Sebastian Bergmann",
1091 | "email": "sebastian@phpunit.de"
1092 | }
1093 | ],
1094 | "description": "Provides functionality to handle HHVM/PHP environments",
1095 | "homepage": "http://www.github.com/sebastianbergmann/environment",
1096 | "keywords": [
1097 | "Xdebug",
1098 | "environment",
1099 | "hhvm"
1100 | ],
1101 | "support": {
1102 | "issues": "https://github.com/sebastianbergmann/environment/issues",
1103 | "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4"
1104 | },
1105 | "funding": [
1106 | {
1107 | "url": "https://github.com/sebastianbergmann",
1108 | "type": "github"
1109 | }
1110 | ],
1111 | "time": "2020-11-30T07:53:42+00:00"
1112 | },
1113 | {
1114 | "name": "sebastian/exporter",
1115 | "version": "3.1.4",
1116 | "source": {
1117 | "type": "git",
1118 | "url": "https://github.com/sebastianbergmann/exporter.git",
1119 | "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db"
1120 | },
1121 | "dist": {
1122 | "type": "zip",
1123 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db",
1124 | "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db",
1125 | "shasum": ""
1126 | },
1127 | "require": {
1128 | "php": ">=7.0",
1129 | "sebastian/recursion-context": "^3.0"
1130 | },
1131 | "require-dev": {
1132 | "ext-mbstring": "*",
1133 | "phpunit/phpunit": "^8.5"
1134 | },
1135 | "type": "library",
1136 | "extra": {
1137 | "branch-alias": {
1138 | "dev-master": "3.1.x-dev"
1139 | }
1140 | },
1141 | "autoload": {
1142 | "classmap": [
1143 | "src/"
1144 | ]
1145 | },
1146 | "notification-url": "https://packagist.org/downloads/",
1147 | "license": [
1148 | "BSD-3-Clause"
1149 | ],
1150 | "authors": [
1151 | {
1152 | "name": "Sebastian Bergmann",
1153 | "email": "sebastian@phpunit.de"
1154 | },
1155 | {
1156 | "name": "Jeff Welch",
1157 | "email": "whatthejeff@gmail.com"
1158 | },
1159 | {
1160 | "name": "Volker Dusch",
1161 | "email": "github@wallbash.com"
1162 | },
1163 | {
1164 | "name": "Adam Harvey",
1165 | "email": "aharvey@php.net"
1166 | },
1167 | {
1168 | "name": "Bernhard Schussek",
1169 | "email": "bschussek@gmail.com"
1170 | }
1171 | ],
1172 | "description": "Provides the functionality to export PHP variables for visualization",
1173 | "homepage": "http://www.github.com/sebastianbergmann/exporter",
1174 | "keywords": [
1175 | "export",
1176 | "exporter"
1177 | ],
1178 | "support": {
1179 | "issues": "https://github.com/sebastianbergmann/exporter/issues",
1180 | "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4"
1181 | },
1182 | "funding": [
1183 | {
1184 | "url": "https://github.com/sebastianbergmann",
1185 | "type": "github"
1186 | }
1187 | ],
1188 | "time": "2021-11-11T13:51:24+00:00"
1189 | },
1190 | {
1191 | "name": "sebastian/global-state",
1192 | "version": "2.0.0",
1193 | "source": {
1194 | "type": "git",
1195 | "url": "https://github.com/sebastianbergmann/global-state.git",
1196 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
1197 | },
1198 | "dist": {
1199 | "type": "zip",
1200 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
1201 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
1202 | "shasum": ""
1203 | },
1204 | "require": {
1205 | "php": "^7.0"
1206 | },
1207 | "require-dev": {
1208 | "phpunit/phpunit": "^6.0"
1209 | },
1210 | "suggest": {
1211 | "ext-uopz": "*"
1212 | },
1213 | "type": "library",
1214 | "extra": {
1215 | "branch-alias": {
1216 | "dev-master": "2.0-dev"
1217 | }
1218 | },
1219 | "autoload": {
1220 | "classmap": [
1221 | "src/"
1222 | ]
1223 | },
1224 | "notification-url": "https://packagist.org/downloads/",
1225 | "license": [
1226 | "BSD-3-Clause"
1227 | ],
1228 | "authors": [
1229 | {
1230 | "name": "Sebastian Bergmann",
1231 | "email": "sebastian@phpunit.de"
1232 | }
1233 | ],
1234 | "description": "Snapshotting of global state",
1235 | "homepage": "http://www.github.com/sebastianbergmann/global-state",
1236 | "keywords": [
1237 | "global state"
1238 | ],
1239 | "support": {
1240 | "issues": "https://github.com/sebastianbergmann/global-state/issues",
1241 | "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0"
1242 | },
1243 | "time": "2017-04-27T15:39:26+00:00"
1244 | },
1245 | {
1246 | "name": "sebastian/object-enumerator",
1247 | "version": "3.0.4",
1248 | "source": {
1249 | "type": "git",
1250 | "url": "https://github.com/sebastianbergmann/object-enumerator.git",
1251 | "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2"
1252 | },
1253 | "dist": {
1254 | "type": "zip",
1255 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
1256 | "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
1257 | "shasum": ""
1258 | },
1259 | "require": {
1260 | "php": ">=7.0",
1261 | "sebastian/object-reflector": "^1.1.1",
1262 | "sebastian/recursion-context": "^3.0"
1263 | },
1264 | "require-dev": {
1265 | "phpunit/phpunit": "^6.0"
1266 | },
1267 | "type": "library",
1268 | "extra": {
1269 | "branch-alias": {
1270 | "dev-master": "3.0.x-dev"
1271 | }
1272 | },
1273 | "autoload": {
1274 | "classmap": [
1275 | "src/"
1276 | ]
1277 | },
1278 | "notification-url": "https://packagist.org/downloads/",
1279 | "license": [
1280 | "BSD-3-Clause"
1281 | ],
1282 | "authors": [
1283 | {
1284 | "name": "Sebastian Bergmann",
1285 | "email": "sebastian@phpunit.de"
1286 | }
1287 | ],
1288 | "description": "Traverses array structures and object graphs to enumerate all referenced objects",
1289 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
1290 | "support": {
1291 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
1292 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4"
1293 | },
1294 | "funding": [
1295 | {
1296 | "url": "https://github.com/sebastianbergmann",
1297 | "type": "github"
1298 | }
1299 | ],
1300 | "time": "2020-11-30T07:40:27+00:00"
1301 | },
1302 | {
1303 | "name": "sebastian/object-reflector",
1304 | "version": "1.1.2",
1305 | "source": {
1306 | "type": "git",
1307 | "url": "https://github.com/sebastianbergmann/object-reflector.git",
1308 | "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d"
1309 | },
1310 | "dist": {
1311 | "type": "zip",
1312 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
1313 | "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
1314 | "shasum": ""
1315 | },
1316 | "require": {
1317 | "php": ">=7.0"
1318 | },
1319 | "require-dev": {
1320 | "phpunit/phpunit": "^6.0"
1321 | },
1322 | "type": "library",
1323 | "extra": {
1324 | "branch-alias": {
1325 | "dev-master": "1.1-dev"
1326 | }
1327 | },
1328 | "autoload": {
1329 | "classmap": [
1330 | "src/"
1331 | ]
1332 | },
1333 | "notification-url": "https://packagist.org/downloads/",
1334 | "license": [
1335 | "BSD-3-Clause"
1336 | ],
1337 | "authors": [
1338 | {
1339 | "name": "Sebastian Bergmann",
1340 | "email": "sebastian@phpunit.de"
1341 | }
1342 | ],
1343 | "description": "Allows reflection of object attributes, including inherited and non-public ones",
1344 | "homepage": "https://github.com/sebastianbergmann/object-reflector/",
1345 | "support": {
1346 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
1347 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2"
1348 | },
1349 | "funding": [
1350 | {
1351 | "url": "https://github.com/sebastianbergmann",
1352 | "type": "github"
1353 | }
1354 | ],
1355 | "time": "2020-11-30T07:37:18+00:00"
1356 | },
1357 | {
1358 | "name": "sebastian/recursion-context",
1359 | "version": "3.0.1",
1360 | "source": {
1361 | "type": "git",
1362 | "url": "https://github.com/sebastianbergmann/recursion-context.git",
1363 | "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb"
1364 | },
1365 | "dist": {
1366 | "type": "zip",
1367 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb",
1368 | "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb",
1369 | "shasum": ""
1370 | },
1371 | "require": {
1372 | "php": ">=7.0"
1373 | },
1374 | "require-dev": {
1375 | "phpunit/phpunit": "^6.0"
1376 | },
1377 | "type": "library",
1378 | "extra": {
1379 | "branch-alias": {
1380 | "dev-master": "3.0.x-dev"
1381 | }
1382 | },
1383 | "autoload": {
1384 | "classmap": [
1385 | "src/"
1386 | ]
1387 | },
1388 | "notification-url": "https://packagist.org/downloads/",
1389 | "license": [
1390 | "BSD-3-Clause"
1391 | ],
1392 | "authors": [
1393 | {
1394 | "name": "Sebastian Bergmann",
1395 | "email": "sebastian@phpunit.de"
1396 | },
1397 | {
1398 | "name": "Jeff Welch",
1399 | "email": "whatthejeff@gmail.com"
1400 | },
1401 | {
1402 | "name": "Adam Harvey",
1403 | "email": "aharvey@php.net"
1404 | }
1405 | ],
1406 | "description": "Provides functionality to recursively process PHP variables",
1407 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
1408 | "support": {
1409 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
1410 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1"
1411 | },
1412 | "funding": [
1413 | {
1414 | "url": "https://github.com/sebastianbergmann",
1415 | "type": "github"
1416 | }
1417 | ],
1418 | "time": "2020-11-30T07:34:24+00:00"
1419 | },
1420 | {
1421 | "name": "sebastian/resource-operations",
1422 | "version": "2.0.2",
1423 | "source": {
1424 | "type": "git",
1425 | "url": "https://github.com/sebastianbergmann/resource-operations.git",
1426 | "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3"
1427 | },
1428 | "dist": {
1429 | "type": "zip",
1430 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3",
1431 | "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3",
1432 | "shasum": ""
1433 | },
1434 | "require": {
1435 | "php": ">=7.1"
1436 | },
1437 | "type": "library",
1438 | "extra": {
1439 | "branch-alias": {
1440 | "dev-master": "2.0-dev"
1441 | }
1442 | },
1443 | "autoload": {
1444 | "classmap": [
1445 | "src/"
1446 | ]
1447 | },
1448 | "notification-url": "https://packagist.org/downloads/",
1449 | "license": [
1450 | "BSD-3-Clause"
1451 | ],
1452 | "authors": [
1453 | {
1454 | "name": "Sebastian Bergmann",
1455 | "email": "sebastian@phpunit.de"
1456 | }
1457 | ],
1458 | "description": "Provides a list of PHP built-in functions that operate on resources",
1459 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
1460 | "support": {
1461 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
1462 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2"
1463 | },
1464 | "funding": [
1465 | {
1466 | "url": "https://github.com/sebastianbergmann",
1467 | "type": "github"
1468 | }
1469 | ],
1470 | "time": "2020-11-30T07:30:19+00:00"
1471 | },
1472 | {
1473 | "name": "sebastian/version",
1474 | "version": "2.0.1",
1475 | "source": {
1476 | "type": "git",
1477 | "url": "https://github.com/sebastianbergmann/version.git",
1478 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
1479 | },
1480 | "dist": {
1481 | "type": "zip",
1482 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
1483 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
1484 | "shasum": ""
1485 | },
1486 | "require": {
1487 | "php": ">=5.6"
1488 | },
1489 | "type": "library",
1490 | "extra": {
1491 | "branch-alias": {
1492 | "dev-master": "2.0.x-dev"
1493 | }
1494 | },
1495 | "autoload": {
1496 | "classmap": [
1497 | "src/"
1498 | ]
1499 | },
1500 | "notification-url": "https://packagist.org/downloads/",
1501 | "license": [
1502 | "BSD-3-Clause"
1503 | ],
1504 | "authors": [
1505 | {
1506 | "name": "Sebastian Bergmann",
1507 | "email": "sebastian@phpunit.de",
1508 | "role": "lead"
1509 | }
1510 | ],
1511 | "description": "Library that helps with managing the version number of Git-hosted PHP projects",
1512 | "homepage": "https://github.com/sebastianbergmann/version",
1513 | "support": {
1514 | "issues": "https://github.com/sebastianbergmann/version/issues",
1515 | "source": "https://github.com/sebastianbergmann/version/tree/master"
1516 | },
1517 | "time": "2016-10-03T07:35:21+00:00"
1518 | },
1519 | {
1520 | "name": "symfony/polyfill-ctype",
1521 | "version": "v1.25.0",
1522 | "source": {
1523 | "type": "git",
1524 | "url": "https://github.com/symfony/polyfill-ctype.git",
1525 | "reference": "30885182c981ab175d4d034db0f6f469898070ab"
1526 | },
1527 | "dist": {
1528 | "type": "zip",
1529 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
1530 | "reference": "30885182c981ab175d4d034db0f6f469898070ab",
1531 | "shasum": ""
1532 | },
1533 | "require": {
1534 | "php": ">=7.1"
1535 | },
1536 | "provide": {
1537 | "ext-ctype": "*"
1538 | },
1539 | "suggest": {
1540 | "ext-ctype": "For best performance"
1541 | },
1542 | "type": "library",
1543 | "extra": {
1544 | "branch-alias": {
1545 | "dev-main": "1.23-dev"
1546 | },
1547 | "thanks": {
1548 | "name": "symfony/polyfill",
1549 | "url": "https://github.com/symfony/polyfill"
1550 | }
1551 | },
1552 | "autoload": {
1553 | "files": [
1554 | "bootstrap.php"
1555 | ],
1556 | "psr-4": {
1557 | "Symfony\\Polyfill\\Ctype\\": ""
1558 | }
1559 | },
1560 | "notification-url": "https://packagist.org/downloads/",
1561 | "license": [
1562 | "MIT"
1563 | ],
1564 | "authors": [
1565 | {
1566 | "name": "Gert de Pagter",
1567 | "email": "BackEndTea@gmail.com"
1568 | },
1569 | {
1570 | "name": "Symfony Community",
1571 | "homepage": "https://symfony.com/contributors"
1572 | }
1573 | ],
1574 | "description": "Symfony polyfill for ctype functions",
1575 | "homepage": "https://symfony.com",
1576 | "keywords": [
1577 | "compatibility",
1578 | "ctype",
1579 | "polyfill",
1580 | "portable"
1581 | ],
1582 | "support": {
1583 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
1584 | },
1585 | "funding": [
1586 | {
1587 | "url": "https://symfony.com/sponsor",
1588 | "type": "custom"
1589 | },
1590 | {
1591 | "url": "https://github.com/fabpot",
1592 | "type": "github"
1593 | },
1594 | {
1595 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1596 | "type": "tidelift"
1597 | }
1598 | ],
1599 | "time": "2021-10-20T20:35:02+00:00"
1600 | },
1601 | {
1602 | "name": "theseer/tokenizer",
1603 | "version": "1.2.1",
1604 | "source": {
1605 | "type": "git",
1606 | "url": "https://github.com/theseer/tokenizer.git",
1607 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
1608 | },
1609 | "dist": {
1610 | "type": "zip",
1611 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
1612 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
1613 | "shasum": ""
1614 | },
1615 | "require": {
1616 | "ext-dom": "*",
1617 | "ext-tokenizer": "*",
1618 | "ext-xmlwriter": "*",
1619 | "php": "^7.2 || ^8.0"
1620 | },
1621 | "type": "library",
1622 | "autoload": {
1623 | "classmap": [
1624 | "src/"
1625 | ]
1626 | },
1627 | "notification-url": "https://packagist.org/downloads/",
1628 | "license": [
1629 | "BSD-3-Clause"
1630 | ],
1631 | "authors": [
1632 | {
1633 | "name": "Arne Blankerts",
1634 | "email": "arne@blankerts.de",
1635 | "role": "Developer"
1636 | }
1637 | ],
1638 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
1639 | "support": {
1640 | "issues": "https://github.com/theseer/tokenizer/issues",
1641 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
1642 | },
1643 | "funding": [
1644 | {
1645 | "url": "https://github.com/theseer",
1646 | "type": "github"
1647 | }
1648 | ],
1649 | "time": "2021-07-28T10:34:58+00:00"
1650 | },
1651 | {
1652 | "name": "webmozart/assert",
1653 | "version": "1.10.0",
1654 | "source": {
1655 | "type": "git",
1656 | "url": "https://github.com/webmozarts/assert.git",
1657 | "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
1658 | },
1659 | "dist": {
1660 | "type": "zip",
1661 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
1662 | "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
1663 | "shasum": ""
1664 | },
1665 | "require": {
1666 | "php": "^7.2 || ^8.0",
1667 | "symfony/polyfill-ctype": "^1.8"
1668 | },
1669 | "conflict": {
1670 | "phpstan/phpstan": "<0.12.20",
1671 | "vimeo/psalm": "<4.6.1 || 4.6.2"
1672 | },
1673 | "require-dev": {
1674 | "phpunit/phpunit": "^8.5.13"
1675 | },
1676 | "type": "library",
1677 | "extra": {
1678 | "branch-alias": {
1679 | "dev-master": "1.10-dev"
1680 | }
1681 | },
1682 | "autoload": {
1683 | "psr-4": {
1684 | "Webmozart\\Assert\\": "src/"
1685 | }
1686 | },
1687 | "notification-url": "https://packagist.org/downloads/",
1688 | "license": [
1689 | "MIT"
1690 | ],
1691 | "authors": [
1692 | {
1693 | "name": "Bernhard Schussek",
1694 | "email": "bschussek@gmail.com"
1695 | }
1696 | ],
1697 | "description": "Assertions to validate method input/output with nice error messages.",
1698 | "keywords": [
1699 | "assert",
1700 | "check",
1701 | "validate"
1702 | ],
1703 | "support": {
1704 | "issues": "https://github.com/webmozarts/assert/issues",
1705 | "source": "https://github.com/webmozarts/assert/tree/1.10.0"
1706 | },
1707 | "time": "2021-03-09T10:59:23+00:00"
1708 | }
1709 | ],
1710 | "aliases": [],
1711 | "minimum-stability": "stable",
1712 | "stability-flags": [],
1713 | "prefer-stable": false,
1714 | "prefer-lowest": false,
1715 | "platform": [],
1716 | "platform-dev": [],
1717 | "plugin-api-version": "2.0.0"
1718 | }
1719 |
--------------------------------------------------------------------------------
/img/app.svg:
--------------------------------------------------------------------------------
1 |
2 |
57 |
--------------------------------------------------------------------------------
/lib/AppInfo/Application.php:
--------------------------------------------------------------------------------
1 |
5 | *
6 | * @author Vinzenz Rosenkranz
7 | *
8 | * @license GNU AGPL version 3 or any later version
9 | *
10 | * This program is free software: you can redistribute it and/or modify
11 | * it under the terms of the GNU Affero General Public License as
12 | * published by the Free Software Foundation, either version 3 of the
13 | * License, or (at your option) any later version.
14 | *
15 | * This program is distributed in the hope that it will be useful,
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 | * GNU Affero General Public License for more details.
19 | *
20 | * You should have received a copy of the GNU Affero General Public License
21 | * along with this program. If not, see .
22 | *
23 | */
24 |
25 | namespace OCA\Files3d\AppInfo;
26 |
27 | use OCA\Files3d\Listener\CSPListener;
28 | use OCA\Files3d\Listener\LoadFiles3dScript;
29 | use OCA\Viewer\Event\LoadViewer;
30 |
31 | use OCP\AppFramework\App;
32 | use OCP\EventDispatcher\IEventDispatcher;
33 | use OCP\Files\IMimeTypeDetector;
34 | use OCP\Security\CSP\AddContentSecurityPolicyEvent;
35 |
36 | class Application extends App {
37 |
38 | const APP_ID = 'files_3d';
39 |
40 | public function __construct() {
41 | parent::__construct(self::APP_ID);
42 | }
43 |
44 | public function register() {
45 | $server = $this->getContainer()->getServer();
46 |
47 | /** @var IMimeTypeDetector $mimeTypeDetector */
48 | $mimeTypeDetector = $server->query(IMimeTypeDetector::class);
49 |
50 | /** @var IEventDispatcher $eventDispatcher */
51 | $eventDispatcher = $server->query(IEventDispatcher::class);
52 |
53 | // registerType without getAllMappings will prevent loading nextcloud's default mappings.
54 | $mimeTypeDetector->getAllMappings();
55 | $mimeTypeDetector->registerType('dae', 'model/vnd.collada+xml', null);
56 | $mimeTypeDetector->registerType('fbx', 'model/fbx-dummy', null);
57 | $mimeTypeDetector->registerType('glb', 'model/gltf-binary', null);
58 | $mimeTypeDetector->registerType('gltf', 'model/gltf+json', null);
59 | $mimeTypeDetector->registerType('obj', 'model/obj-dummy', null);
60 | $mimeTypeDetector->registerType('stl', 'application/sla', null);
61 | // There is no standard type for gcode, therefore we use cura's mimetype for gcode
62 | $mimeTypeDetector->registerType('gcode', 'text/x-gcode', null);
63 |
64 | // Watch Viewer load event
65 | $eventDispatcher->addServiceListener(LoadViewer::class, LoadFiles3dScript::class);
66 |
67 | $eventDispatcher->addServiceListener(AddContentSecurityPolicyEvent::class, CSPListener::class);
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/lib/Listener/CSPListener.php:
--------------------------------------------------------------------------------
1 |
6 | *
7 | * @author Vincent Petry
8 | *
9 | * @license GNU AGPL version 3 or any later version
10 | *
11 | * This program is free software: you can redistribute it and/or modify
12 | * it under the terms of the GNU Affero General Public License as
13 | * published by the Free Software Foundation, either version 3 of the
14 | * License, or (at your option) any later version.
15 | *
16 | * This program is distributed in the hope that it will be useful,
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 | * GNU Affero General Public License for more details.
20 | *
21 | * You should have received a copy of the GNU Affero General Public License
22 | * along with this program. If not, see .
23 | *
24 | */
25 |
26 | namespace OCA\Files3d\Listener;
27 |
28 | use OCP\AppFramework\Http\ContentSecurityPolicy;
29 | use OCP\EventDispatcher\Event;
30 | use OCP\EventDispatcher\IEventListener;
31 | use OCP\Security\CSP\AddContentSecurityPolicyEvent;
32 |
33 | class CSPListener implements IEventListener {
34 |
35 | public function handle(Event $event): void {
36 | if (!($event instanceof AddContentSecurityPolicyEvent)) {
37 | return;
38 | }
39 |
40 | $csp = new ContentSecurityPolicy();
41 | $csp->addAllowedConnectDomain('data:');
42 |
43 | $event->addPolicy($csp);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/lib/Listener/LoadFiles3dScript.php:
--------------------------------------------------------------------------------
1 |
5 | *
6 | * @author Vinzenz Rosenkranz
7 | *
8 | * @license GNU AGPL version 3 or any later version
9 | *
10 | * This program is free software: you can redistribute it and/or modify
11 | * it under the terms of the GNU Affero General Public License as
12 | * published by the Free Software Foundation, either version 3 of the
13 | * License, or (at your option) any later version.
14 | *
15 | * This program is distributed in the hope that it will be useful,
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 | * GNU Affero General Public License for more details.
19 | *
20 | * You should have received a copy of the GNU Affero General Public License
21 | * along with this program. If not, see .
22 | *
23 | */
24 |
25 | namespace OCA\Files3d\Listener;
26 |
27 | use OCA\Files3d\AppInfo\Application;
28 | use OCA\Viewer\Event\LoadViewer;
29 | use OCP\EventDispatcher\Event;
30 | use OCP\EventDispatcher\IEventListener;
31 | use OCP\Util;
32 |
33 | class LoadFiles3dScript implements IEventListener {
34 | public function handle(Event $event): void {
35 | if (!($event instanceof LoadViewer)) {
36 | return;
37 | }
38 |
39 | Util::addScript(Application::APP_ID, 'files3d');
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/lib/Migration/AddMimetypeToFilecache.php:
--------------------------------------------------------------------------------
1 | mimeTypeLoader = $mimeTypeLoader;
15 | }
16 |
17 | public function getName() {
18 | return 'Add custom mimetype to filecache';
19 | }
20 |
21 | public function run(IOutput $output) {
22 | // And update the filecache for it.
23 | $mimes = [
24 | 'dae' => 'model/vnd.collada+xml',
25 | 'fbx' => 'model/fbx-dummy',
26 | 'glb' => 'model/gltf-binary',
27 | 'gltf' => 'model/gltf+json',
28 | 'obj' => 'model/obj-dummy',
29 | 'stl' => 'application/sla',
30 | 'ply' => 'model/vnd.ply',
31 | 'gcode' => 'text/x-gcode',
32 | ];
33 | foreach($mimes as $ext => $mime) {
34 | $mimetypeId = $this->mimeTypeLoader->getId($mime);
35 | $this->mimeTypeLoader->updateFilecache($ext, $mimetypeId);
36 | $output->info("Added custom $ext => $mime mimetype to filecache.");
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "files_3d",
3 | "version": "0.6.0",
4 | "description": "Adds support for different 3D file formats (e.g. .dae, .fbx, .gltf, .obj) to Nextcloud. Based on three.js.",
5 | "main": "index.js",
6 | "private": true,
7 | "directories": {
8 | "lib": "lib",
9 | "test": "tests"
10 | },
11 | "browserslist": [
12 | "extends @nextcloud/browserslist-config"
13 | ],
14 | "scripts": {
15 | "dev": "NODE_ENV=development webpack --config webpack.dev.js",
16 | "watch": "NODE_ENV=development webpack --progress --watch --config webpack.dev.js",
17 | "build": "NODE_ENV=production webpack --progress --config webpack.prod.js",
18 | "test": "echo \"Error: no test specified\" && exit 1"
19 | },
20 | "repository": {
21 | "type": "git",
22 | "url": "git+https://github.com/v1r0x/files_3d.git"
23 | },
24 | "author": "Vinzenz Rosenkranz",
25 | "license": "AGPL-3.0",
26 | "bugs": {
27 | "url": "https://github.com/v1r0x/files_3d/issues"
28 | },
29 | "homepage": "https://github.com/v1r0x/files_3d#readme",
30 | "dependencies": {
31 | "lil-gui": "^0.16.0",
32 | "three": "^0.138",
33 | "vue": "^2.6.14"
34 | },
35 | "devDependencies": {
36 | "@babel/core": "^7.16.12",
37 | "@babel/eslint-parser": "^7.16.5",
38 | "@babel/plugin-proposal-class-properties": "^7.16.7",
39 | "@babel/plugin-syntax-dynamic-import": "^7.8.3",
40 | "@babel/preset-env": "^7.16.11",
41 | "@nextcloud/browserslist-config": "^2.2.0",
42 | "@nextcloud/eslint-config": "^7.0.2",
43 | "@nextcloud/eslint-plugin": "^2.0.0",
44 | "@typescript-eslint/eslint-plugin": "^5.10.2",
45 | "@typescript-eslint/parser": "^5.10.2",
46 | "babel-eslint": "^10.1.0",
47 | "babel-loader": "^8.2.3",
48 | "css-loader": "^6.5.1",
49 | "eslint": "^8.8.0",
50 | "eslint-config-mdcs": "^5.0.0",
51 | "eslint-config-standard": "^17.0.0-1",
52 | "eslint-plugin-html": "^6.2.0",
53 | "eslint-plugin-import": "^2.25.4",
54 | "eslint-plugin-node": "^11.1.0",
55 | "eslint-plugin-promise": "^6.0.0",
56 | "eslint-plugin-standard": "^5.0.0",
57 | "eslint-plugin-vue": "^8.4.0",
58 | "eslint-webpack-plugin": "^3.1.1",
59 | "node-sass": "^7.0.1",
60 | "sass-loader": "^12.4.0",
61 | "stylelint": "^14.3.0",
62 | "stylelint-webpack-plugin": "^3.1.1",
63 | "typescript": "^4.5.5",
64 | "vue-eslint-parser": "^8.2.0",
65 | "vue-loader": "^15.9.8",
66 | "vue-style-loader": "^4.1.3",
67 | "vue-template-compiler": "^2.6.14",
68 | "webpack": "^5.68.0",
69 | "webpack-cli": "^4.9.2",
70 | "webpack-merge": "^5.8.0"
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/phpunit.integration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | ./tests/Integration
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | ./tests/Unit
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/screenshots/screenshot1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/v1r0x/files_3d/ad23308f6a914280ae5a4f461a85382a8616fd4e/screenshots/screenshot1.png
--------------------------------------------------------------------------------
/src/components/Files3d.vue:
--------------------------------------------------------------------------------
1 |
22 |
23 |
24 |
25 |
26 |
27 |
487 |
488 |
496 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (c) 2019, 2020, 2021, 2022 Vinzenz Rosenkranz
3 | *
4 | * @author Vinzenz Rosenkranz
5 | *
6 | * @license AGPL-3.0-or-later
7 | *
8 | * This program is free software: you can redistribute it and/or modify
9 | * it under the terms of the GNU Affero General Public License as
10 | * published by the Free Software Foundation, either version 3 of the
11 | * License, or (at your option) any later version.
12 | *
13 | * This program is distributed in the hope that it will be useful,
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 | * GNU Affero General Public License for more details.
17 | *
18 | * You should have received a copy of the GNU Affero General Public License
19 | * along with this program. If not, see .
20 | *
21 | */
22 |
23 | import Files3d from './components/Files3d.vue'
24 |
25 | if (OCA.Viewer) {
26 | OCA.Viewer.registerHandler({
27 | // unique id
28 | id: 'files_3d',
29 |
30 | // optional, it will group every view of this group and
31 | // use the proper view when building the file list
32 | // of the slideshow.
33 | // e.g. you open an image/jpeg that have the `media` group
34 | // you will be able to see the video/mpeg from the `video` handler
35 | // files that also have the `media` group set.
36 | group: '3d',
37 |
38 | // the list of mimes your component is able to display
39 | mimes: [
40 | 'model/vnd.collada+xml',
41 | 'model/gltf-binary',
42 | 'model/gltf+json',
43 | // OBJ has no mime
44 | 'model/obj-dummy',
45 | // FBX has no mime
46 | 'model/fbx-dummy',
47 | 'application/sla',
48 | // PLY has no mime
49 | 'model/vnd.ply',
50 | 'text/x-gcode',
51 | ],
52 |
53 | // your vue component view
54 | component: Files3d,
55 | })
56 | }
57 |
--------------------------------------------------------------------------------
/templates/content/index.php:
--------------------------------------------------------------------------------
1 |