create-berna-stencil 2.6.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +1 -1
  2. package/_tools/assistant.js +92 -88
  3. package/_tools/modules/constants.js +23 -0
  4. package/_tools/modules/pageComponents.js +77 -0
  5. package/_tools/modules/updateData.js +25 -44
  6. package/_tools/modules/updateOutputPath.js +59 -63
  7. package/_tools/modules/updatePage.js +131 -104
  8. package/_tools/modules/utils.js +16 -19
  9. package/_tools/modules/validation.js +20 -0
  10. package/bin/create.js +74 -12
  11. package/out/.htaccess +16 -0
  12. package/out/404.html +163 -0
  13. package/out/assets/brand/favicon.svg +37 -0
  14. package/out/assets/brand/logo.svg +37 -0
  15. package/out/backend/.htaccess +7 -0
  16. package/out/backend/_core/composer.json +5 -0
  17. package/out/backend/_core/composer.lock +492 -0
  18. package/out/backend/_core/index.php +148 -0
  19. package/out/backend/_core/init.php +34 -0
  20. package/out/backend/_core/modules/RateLimiter.php +31 -0
  21. package/out/backend/_core/modules/Response.php +49 -0
  22. package/{src → out}/backend/_core/vendor/composer/autoload_static.php +10 -10
  23. package/{src → out}/backend/_core/vendor/composer/installed.json +6 -6
  24. package/{src → out}/backend/_core/vendor/composer/installed.php +2 -2
  25. package/out/backend/_core/vendor/graham-campbell/result-type/CHANGELOG.md +53 -0
  26. package/{src → out}/backend/_core/vendor/graham-campbell/result-type/LICENSE +21 -21
  27. package/out/backend/_core/vendor/graham-campbell/result-type/README.md +42 -0
  28. package/{src → out}/backend/_core/vendor/graham-campbell/result-type/composer.json +33 -33
  29. package/out/backend/_core/vendor/graham-campbell/result-type/phpunit.xml.dist +13 -0
  30. package/{src → out}/backend/_core/vendor/graham-campbell/result-type/src/Error.php +121 -121
  31. package/{src → out}/backend/_core/vendor/graham-campbell/result-type/src/Result.php +69 -69
  32. package/{src → out}/backend/_core/vendor/graham-campbell/result-type/src/Success.php +120 -120
  33. package/out/backend/_core/vendor/graham-campbell/result-type/tests/ResultTest.php +95 -0
  34. package/{src → out}/backend/_core/vendor/phpoption/phpoption/LICENSE +200 -200
  35. package/out/backend/_core/vendor/phpoption/phpoption/Makefile +17 -0
  36. package/out/backend/_core/vendor/phpoption/phpoption/README.md +201 -0
  37. package/{src → out}/backend/_core/vendor/phpoption/phpoption/composer.json +50 -50
  38. package/out/backend/_core/vendor/phpoption/phpoption/phpstan-baseline.neon +44 -0
  39. package/out/backend/_core/vendor/phpoption/phpoption/phpstan.neon.dist +7 -0
  40. package/out/backend/_core/vendor/phpoption/phpoption/phpunit.xml.dist +13 -0
  41. package/{src → out}/backend/_core/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php +175 -175
  42. package/{src → out}/backend/_core/vendor/phpoption/phpoption/src/PhpOption/None.php +136 -136
  43. package/{src → out}/backend/_core/vendor/phpoption/phpoption/src/PhpOption/Option.php +434 -434
  44. package/{src → out}/backend/_core/vendor/phpoption/phpoption/src/PhpOption/Some.php +169 -169
  45. package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/EnsureTest.php +72 -0
  46. package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/LazyOptionTest.php +357 -0
  47. package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/NoneTest.php +153 -0
  48. package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/OptionTest.php +166 -0
  49. package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/SomeTest.php +194 -0
  50. package/out/backend/_core/vendor/phpoption/phpoption/tests/bootstrap.php +8 -0
  51. package/out/backend/_core/vendor/phpoption/phpoption/vendor-bin/phpstan/composer.json +8 -0
  52. package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/Ctype.php +232 -232
  53. package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/LICENSE +19 -19
  54. package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/README.md +12 -12
  55. package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/bootstrap.php +50 -50
  56. package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/bootstrap80.php +46 -46
  57. package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/composer.json +38 -38
  58. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/LICENSE +19 -19
  59. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Mbstring.php +1077 -1077
  60. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/README.md +13 -13
  61. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php +119 -119
  62. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +1397 -1397
  63. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +5 -5
  64. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +1489 -1489
  65. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/bootstrap.php +171 -171
  66. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/bootstrap80.php +167 -167
  67. package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/composer.json +39 -39
  68. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/LICENSE +19 -19
  69. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Php80.php +115 -115
  70. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/PhpToken.php +106 -106
  71. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/README.md +25 -25
  72. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php +31 -31
  73. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php +16 -16
  74. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +20 -20
  75. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php +16 -16
  76. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php +16 -16
  77. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/bootstrap.php +42 -42
  78. package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/composer.json +37 -37
  79. package/out/backend/_core/vendor/vlucas/phpdotenv/.editorconfig +15 -0
  80. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/LICENSE +30 -30
  81. package/out/backend/_core/vendor/vlucas/phpdotenv/Makefile +17 -0
  82. package/out/backend/_core/vendor/vlucas/phpdotenv/README.md +370 -0
  83. package/out/backend/_core/vendor/vlucas/phpdotenv/UPGRADING.md +196 -0
  84. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/composer.json +60 -60
  85. package/out/backend/_core/vendor/vlucas/phpdotenv/phpstan-baseline.neon +157 -0
  86. package/out/backend/_core/vendor/vlucas/phpdotenv/phpstan.neon.dist +7 -0
  87. package/out/backend/_core/vendor/vlucas/phpdotenv/phpunit.xml.dist +13 -0
  88. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Dotenv.php +267 -267
  89. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php +12 -12
  90. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php +12 -12
  91. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php +12 -12
  92. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php +12 -12
  93. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/ValidationException.php +12 -12
  94. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Loader/Loader.php +48 -48
  95. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php +20 -20
  96. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Loader/Resolver.php +65 -65
  97. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Entry.php +59 -59
  98. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php +299 -299
  99. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Lexer.php +58 -58
  100. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Lines.php +127 -127
  101. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Parser.php +53 -53
  102. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php +19 -19
  103. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Value.php +88 -88
  104. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php +15 -15
  105. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php +89 -89
  106. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php +80 -80
  107. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php +88 -88
  108. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php +85 -85
  109. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php +110 -110
  110. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php +48 -48
  111. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php +64 -64
  112. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php +91 -91
  113. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php +17 -17
  114. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php +104 -104
  115. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php +88 -88
  116. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php +27 -27
  117. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php +107 -107
  118. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php +272 -272
  119. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php +51 -51
  120. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/File/Paths.php +44 -44
  121. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/File/Reader.php +81 -81
  122. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/FileStore.php +72 -72
  123. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php +141 -141
  124. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php +17 -17
  125. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/StringStore.php +37 -37
  126. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Util/Regex.php +112 -112
  127. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Util/Str.php +108 -108
  128. package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Validator.php +207 -207
  129. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/DotenvTest.php +387 -0
  130. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Loader/LoaderTest.php +86 -0
  131. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/EntryParserTest.php +234 -0
  132. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/LexerTest.php +40 -0
  133. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/LinesTest.php +53 -0
  134. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/ParserTest.php +98 -0
  135. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/ArrayAdapterTest.php +57 -0
  136. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/EnvConstAdapterTest.php +75 -0
  137. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/PutenvAdapterTest.php +52 -0
  138. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/ServerConstAdapterTest.php +75 -0
  139. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/RepositoryTest.php +305 -0
  140. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Store/StoreTest.php +141 -0
  141. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/ValidatorTest.php +479 -0
  142. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/.env +5 -0
  143. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/assertions.env +18 -0
  144. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/booleans.env +33 -0
  145. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/commented.env +15 -0
  146. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/empty.env +1 -0
  147. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/example.env +1 -0
  148. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/exported.env +7 -0
  149. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/immutable.env +1 -0
  150. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/integers.env +17 -0
  151. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/large.env +2 -0
  152. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multibyte.env +3 -0
  153. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multiline.env +14 -0
  154. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multiple.env +4 -0
  155. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/mutable.env +1 -0
  156. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/nested.env +15 -0
  157. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/quoted.env +11 -0
  158. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/specialchars.env +8 -0
  159. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/unicodevarnames.env +2 -0
  160. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/utf8-with-bom-encoding.env +3 -0
  161. package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/windows.env +1 -0
  162. package/out/backend/_core/vendor/vlucas/phpdotenv/vendor-bin/phpstan/composer.json +15 -0
  163. package/out/backend/api/protected/example-protected.php +17 -0
  164. package/out/backend/api/public/example-public.php +17 -0
  165. package/out/backend/database/Database.php +24 -0
  166. package/out/backend/database/migrations/create_example_db.sql +1 -0
  167. package/out/backend/web.config +17 -0
  168. package/out/css/fonts/bootstrap-icons.woff +0 -0
  169. package/out/css/fonts/bootstrap-icons.woff2 +0 -0
  170. package/out/css/github-markdown-dark.css +1124 -0
  171. package/out/css/github-markdown-light.css +1124 -0
  172. package/out/css/pages/404.css +21517 -0
  173. package/out/css/pages/homepage.css +21508 -0
  174. package/out/data/site.json +44 -0
  175. package/out/index.html +1147 -0
  176. package/out/js/bootstrap.bundle.min.js +7 -0
  177. package/out/js/pages/js/pages/404.js +6 -0
  178. package/out/js/pages/js/pages/homepage.js +6 -0
  179. package/out/js/pages/ts/pages/404.js +6 -0
  180. package/out/js/pages/ts/pages/homepage.js +6 -0
  181. package/out/llms.txt +14 -0
  182. package/out/robots.txt +4 -0
  183. package/out/sitemap.xml +15 -0
  184. package/out/web.config +27 -0
  185. package/package.json +14 -47
  186. package/src/frontend/data/site.json +1 -1
  187. package/.gitignore +0 -4
  188. package/_tools/modules/updateIncludes.js +0 -81
  189. package/src/backend/config.example.php +0 -28
  190. /package/{src → out}/backend/_core/vendor/autoload.php +0 -0
  191. /package/{src → out}/backend/_core/vendor/composer/ClassLoader.php +0 -0
  192. /package/{src → out}/backend/_core/vendor/composer/InstalledVersions.php +0 -0
  193. /package/{src → out}/backend/_core/vendor/composer/LICENSE +0 -0
  194. /package/{src → out}/backend/_core/vendor/composer/autoload_classmap.php +0 -0
  195. /package/{src → out}/backend/_core/vendor/composer/autoload_files.php +0 -0
  196. /package/{src → out}/backend/_core/vendor/composer/autoload_namespaces.php +0 -0
  197. /package/{src → out}/backend/_core/vendor/composer/autoload_psr4.php +0 -0
  198. /package/{src → out}/backend/_core/vendor/composer/autoload_real.php +0 -0
  199. /package/{src → out}/backend/_core/vendor/composer/platform_check.php +0 -0
@@ -0,0 +1,148 @@
1
+ <?php
2
+
3
+ declare(strict_types=1);
4
+
5
+ define('CORE_ACCESS', true);
6
+ define('CORE_PATH', __DIR__);
7
+
8
+ /**
9
+ * Load dependencies and initial configuration.
10
+ */
11
+ require_once __DIR__ . '/init.php';
12
+ require_once __DIR__ . '/modules/Response.php';
13
+
14
+ // =====================================================
15
+ // 1. REQUEST PARSING
16
+ // =====================================================
17
+
18
+ $method = $_SERVER['REQUEST_METHOD'];
19
+ $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
20
+
21
+ $uri = rtrim(preg_replace('#^/api#', '', $uri), '/') ?: '/';
22
+ $parts = array_values(array_filter(explode('/', $uri)));
23
+
24
+ foreach ($parts as $part) {
25
+ if ($part === '..' || $part === '.') {
26
+ Response::error('Bad Request', 400);
27
+ }
28
+ }
29
+
30
+ // =====================================================
31
+ // 2. ENDPOINT RESOLUTION (ROUTING WITH SUBDIRECTORIES)
32
+ // =====================================================
33
+
34
+ $basePublic = __DIR__ . '/../api/public/';
35
+ $baseProtected = __DIR__ . '/../api/protected/';
36
+
37
+ $endpointFile = null;
38
+ $isProtected = false;
39
+ $requestParams = [];
40
+
41
+ // Temporary variables for the lookup loop
42
+ $checkParts = $parts;
43
+ $params = [];
44
+
45
+ /**
46
+ * Dynamic routing logic: find the deepest matching endpoint file.
47
+ * At each iteration, the last URL segment is peeled off and stored
48
+ * as a route parameter until a matching file is found.
49
+ */
50
+ while (count($checkParts) > 0) {
51
+ $relativePath = implode('/', $checkParts) . '.php';
52
+
53
+ // Check first whether this is a public route
54
+ if (file_exists($basePublic . $relativePath)) {
55
+ $endpointFile = $basePublic . $relativePath;
56
+ $isProtected = false;
57
+ break;
58
+ }
59
+
60
+ // Then check whether this is a protected route
61
+ if (file_exists($baseProtected . $relativePath)) {
62
+ $endpointFile = $baseProtected . $relativePath;
63
+ $isProtected = true;
64
+ break;
65
+ }
66
+
67
+ // No file matched: treat the last segment as a route parameter and try again
68
+ array_unshift($params, array_pop($checkParts));
69
+ }
70
+
71
+ /**
72
+ * IF THE ENDPOINT DOES NOT EXIST, RETURN AN HTML 404 PAGE.
73
+ */
74
+ if (!$endpointFile) {
75
+ http_response_code(404);
76
+
77
+ // Look for the 404.html file generated by Eleventy in the server document root
78
+ $errorPage = $_SERVER['DOCUMENT_ROOT'] . '/404.html';
79
+
80
+ if (file_exists($errorPage)) {
81
+ header('Content-Type: text/html; charset=UTF-8');
82
+ echo file_get_contents($errorPage);
83
+ } else {
84
+ echo "<h1>404 Not Found</h1>";
85
+ echo "The requested URL was not found on this server.";
86
+ }
87
+ exit;
88
+ }
89
+
90
+ $base = $isProtected ? $baseProtected : $basePublic;
91
+ $base = str_replace('\\', '/', $base);
92
+ $endpointPath = str_replace('\\', '/', $endpointFile);
93
+ $endpointPath = preg_replace('#\.php$#', '', str_replace($base, '', $endpointPath));
94
+
95
+ // =====================================================
96
+ // 3. HEADERS AND CORS (Only if the endpoint exists)
97
+ // =====================================================
98
+
99
+ header('Content-Type: application/json; charset=UTF-8');
100
+ header('X-Content-Type-Options: nosniff');
101
+ header('X-Frame-Options: DENY');
102
+ header('Referrer-Policy: strict-origin-when-cross-origin');
103
+ header('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS');
104
+ header('Access-Control-Allow-Headers: Content-Type, X-Api-Key');
105
+
106
+ $originsForEndpoint = $config['CUSTOM_ENDPOINT_ORIGINS'][$endpointPath]
107
+ ?? $config['GENERAL_ALLOWED_ORIGINS']
108
+ ?? [];
109
+
110
+ $origin = $_SERVER['HTTP_ORIGIN'] ?? '';
111
+
112
+ if ($origin !== '' && in_array($origin, $originsForEndpoint, true)) {
113
+ header('Access-Control-Allow-Origin: ' . $origin);
114
+ header('Vary: Origin');
115
+ } elseif (in_array('*', $originsForEndpoint, true)) {
116
+ header('Access-Control-Allow-Origin: *');
117
+ }
118
+
119
+ if ($method === 'OPTIONS') {
120
+ http_response_code(204);
121
+ exit;
122
+ }
123
+
124
+ require_once __DIR__ . '/modules/RateLimiter.php';
125
+ RateLimiter::check($_SERVER['REMOTE_ADDR'] ?? '', 60, 60);
126
+
127
+ // =====================================================
128
+ // 4. AUTHENTICATION GUARD
129
+ // =====================================================
130
+
131
+ if ($isProtected) {
132
+ $validKey = $config['CUSTOM_ENDPOINT_KEYS'][$endpointPath] ?? $config['GENERAL_API_KEY'] ?? '';
133
+ $apiKey = $_SERVER['HTTP_X_API_KEY'] ?? '';
134
+
135
+ if ($validKey === '' || !hash_equals($validKey, $apiKey)) {
136
+ Response::error('Unauthorized. X_API_KEY is incorrect or missing', 401);
137
+ }
138
+ }
139
+
140
+ // =====================================================
141
+ // 5. DISPATCH
142
+ // =====================================================
143
+
144
+ // Parameters are the remaining URL segments not consumed during endpoint resolution
145
+ $requestParams = $params;
146
+
147
+ // Load and execute the matched endpoint file
148
+ require $endpointFile;
@@ -0,0 +1,34 @@
1
+ <?php
2
+
3
+ declare(strict_types=1);
4
+
5
+ require_once __DIR__ . '/vendor/autoload.php';
6
+ require_once __DIR__ . '/modules/Response.php';
7
+
8
+ // --- GESTORE GLOBALE ERRORI E ECCEZIONI ---
9
+ set_exception_handler(function ($exception) use (&$config) {
10
+ $isDebug = ($config['APP_ENV'] ?? 'production') !== 'production';
11
+ Response::error(
12
+ $isDebug ? $exception->getMessage() : 'Internal server error',
13
+ 500,
14
+ $isDebug ? ['file' => $exception->getFile(), 'line' => $exception->getLine()] : null
15
+ );
16
+ });
17
+
18
+ set_error_handler(function ($severity, $message, $file, $line) {
19
+ if (!(error_reporting() & $severity)) return;
20
+ throw new ErrorException($message, 0, $severity, $file, $line);
21
+ });
22
+
23
+ // --- CARICAMENTO CONFIGURAZIONE ---
24
+ // dirname(__DIR__) punta alla cartella /api/ dove ora si trova config.php
25
+ $config = require dirname(__DIR__) . '/config.php';
26
+
27
+ // --- CONFIGURAZIONE AMBIENTE ---
28
+ if (($config['APP_ENV'] ?? 'production') === 'production') {
29
+ ini_set('display_errors', '0');
30
+ error_reporting(0);
31
+ } else {
32
+ ini_set('display_errors', '1');
33
+ error_reporting(E_ALL);
34
+ }
@@ -0,0 +1,31 @@
1
+ <?php
2
+
3
+ declare(strict_types=1);
4
+
5
+ class RateLimiter {
6
+ public static function check(string $ip, int $maxRequests = 60, int $windowSeconds = 60): void {
7
+ $cacheDir = __DIR__ . '/../../cache';
8
+
9
+ if (!is_dir($cacheDir)) {
10
+ mkdir($cacheDir, 0755, true);
11
+ }
12
+
13
+ $cacheFile = $cacheDir . '/rl_' . md5($ip) . '.json';
14
+ $now = time();
15
+ $data = [];
16
+
17
+ if (file_exists($cacheFile)) {
18
+ $data = json_decode(file_get_contents($cacheFile), true) ?: [];
19
+ }
20
+
21
+ $data = array_filter($data, fn($ts) => $ts > ($now - $windowSeconds));
22
+ $data[] = $now;
23
+
24
+ file_put_contents($cacheFile, json_encode(array_values($data)), LOCK_EX);
25
+
26
+ if (count($data) > $maxRequests) {
27
+ header('Retry-After: ' . $windowSeconds);
28
+ Response::error('Too Many Requests', 429);
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,49 @@
1
+ <?php
2
+
3
+ declare(strict_types=1);
4
+
5
+ if (!defined('CORE_ACCESS')) {
6
+ $errorPage = $_SERVER['DOCUMENT_ROOT'] . '/404.html';
7
+ http_response_code(404);
8
+ if (file_exists($errorPage)) {
9
+ header('Content-Type: text/html; charset=UTF-8');
10
+ echo file_get_contents($errorPage);
11
+ } else {
12
+ echo "404 Not Found";
13
+ }
14
+ exit;
15
+ }
16
+
17
+ class Response
18
+ {
19
+ public static function success(mixed $data = null, int $code = 200): never
20
+ {
21
+ http_response_code($code);
22
+ echo json_encode([
23
+ 'status' => 'success',
24
+ 'data' => $data,
25
+ ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
26
+ exit;
27
+ }
28
+
29
+ public static function error(string $message, int $code = 400, mixed $details = null): never
30
+ {
31
+ http_response_code($code);
32
+ $body = [
33
+ 'status' => 'error',
34
+ 'message' => $message,
35
+ 'code' => $code,
36
+ ];
37
+ if ($details !== null) {
38
+ $body['details'] = $details;
39
+ }
40
+ echo json_encode($body, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
41
+ exit;
42
+ }
43
+
44
+ public static function noContent(): never
45
+ {
46
+ http_response_code(204);
47
+ exit;
48
+ }
49
+ }
@@ -13,48 +13,48 @@ class ComposerStaticInit108be68e4e2b97fed51d36a10eed0849
13
13
  );
14
14
 
15
15
  public static $prefixLengthsPsr4 = array (
16
- 'S' =>
16
+ 'S' =>
17
17
  array (
18
18
  'Symfony\\Polyfill\\Php80\\' => 23,
19
19
  'Symfony\\Polyfill\\Mbstring\\' => 26,
20
20
  'Symfony\\Polyfill\\Ctype\\' => 23,
21
21
  ),
22
- 'P' =>
22
+ 'P' =>
23
23
  array (
24
24
  'PhpOption\\' => 10,
25
25
  ),
26
- 'G' =>
26
+ 'G' =>
27
27
  array (
28
28
  'GrahamCampbell\\ResultType\\' => 26,
29
29
  ),
30
- 'D' =>
30
+ 'D' =>
31
31
  array (
32
32
  'Dotenv\\' => 7,
33
33
  ),
34
34
  );
35
35
 
36
36
  public static $prefixDirsPsr4 = array (
37
- 'Symfony\\Polyfill\\Php80\\' =>
37
+ 'Symfony\\Polyfill\\Php80\\' =>
38
38
  array (
39
39
  0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
40
40
  ),
41
- 'Symfony\\Polyfill\\Mbstring\\' =>
41
+ 'Symfony\\Polyfill\\Mbstring\\' =>
42
42
  array (
43
43
  0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
44
44
  ),
45
- 'Symfony\\Polyfill\\Ctype\\' =>
45
+ 'Symfony\\Polyfill\\Ctype\\' =>
46
46
  array (
47
47
  0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
48
48
  ),
49
- 'PhpOption\\' =>
49
+ 'PhpOption\\' =>
50
50
  array (
51
51
  0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption',
52
52
  ),
53
- 'GrahamCampbell\\ResultType\\' =>
53
+ 'GrahamCampbell\\ResultType\\' =>
54
54
  array (
55
55
  0 => __DIR__ . '/..' . '/graham-campbell/result-type/src',
56
56
  ),
57
- 'Dotenv\\' =>
57
+ 'Dotenv\\' =>
58
58
  array (
59
59
  0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src',
60
60
  ),
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "time": "2025-12-27T19:43:20+00:00",
26
26
  "type": "library",
27
- "installation-source": "dist",
27
+ "installation-source": "source",
28
28
  "autoload": {
29
29
  "psr-4": {
30
30
  "GrahamCampbell\\ResultType\\": "src/"
@@ -98,7 +98,7 @@
98
98
  "dev-master": "1.9-dev"
99
99
  }
100
100
  },
101
- "installation-source": "dist",
101
+ "installation-source": "source",
102
102
  "autoload": {
103
103
  "psr-4": {
104
104
  "PhpOption\\": "src/PhpOption/"
@@ -175,7 +175,7 @@
175
175
  "name": "symfony/polyfill"
176
176
  }
177
177
  },
178
- "installation-source": "dist",
178
+ "installation-source": "source",
179
179
  "autoload": {
180
180
  "files": [
181
181
  "bootstrap.php"
@@ -262,7 +262,7 @@
262
262
  "name": "symfony/polyfill"
263
263
  }
264
264
  },
265
- "installation-source": "dist",
265
+ "installation-source": "source",
266
266
  "autoload": {
267
267
  "files": [
268
268
  "bootstrap.php"
@@ -343,7 +343,7 @@
343
343
  "name": "symfony/polyfill"
344
344
  }
345
345
  },
346
- "installation-source": "dist",
346
+ "installation-source": "source",
347
347
  "autoload": {
348
348
  "files": [
349
349
  "bootstrap.php"
@@ -447,7 +447,7 @@
447
447
  "dev-master": "5.6-dev"
448
448
  }
449
449
  },
450
- "installation-source": "dist",
450
+ "installation-source": "source",
451
451
  "autoload": {
452
452
  "psr-4": {
453
453
  "Dotenv\\": "src/"
@@ -3,7 +3,7 @@
3
3
  'name' => '__root__',
4
4
  'pretty_version' => 'dev-main',
5
5
  'version' => 'dev-main',
6
- 'reference' => '9bbb36794fc27d6938523db2d4076661ad9ddab9',
6
+ 'reference' => 'c0fb608d2f28aa6977fa76538d55db9be6530ce4',
7
7
  'type' => 'library',
8
8
  'install_path' => __DIR__ . '/../../',
9
9
  'aliases' => array(),
@@ -13,7 +13,7 @@
13
13
  '__root__' => array(
14
14
  'pretty_version' => 'dev-main',
15
15
  'version' => 'dev-main',
16
- 'reference' => '9bbb36794fc27d6938523db2d4076661ad9ddab9',
16
+ 'reference' => 'c0fb608d2f28aa6977fa76538d55db9be6530ce4',
17
17
  'type' => 'library',
18
18
  'install_path' => __DIR__ . '/../../',
19
19
  'aliases' => array(),
@@ -0,0 +1,53 @@
1
+ CHANGE LOG
2
+ ==========
3
+
4
+
5
+ ## V1.1.4 (27/12/2025)
6
+
7
+ * Added support for PHP 8.5
8
+
9
+
10
+ ## V1.1.3 (20/07/2024)
11
+
12
+ * Added support for PHP 8.4
13
+
14
+
15
+ ## V1.1.2 (12/11/2023)
16
+
17
+ * Added support for PHP 8.3
18
+
19
+
20
+ ## V1.1.1 (25/02/2023)
21
+
22
+ * Cleaned up tests
23
+
24
+
25
+ ## V1.1 (30/07/2022)
26
+
27
+ * Added support for PHP 8.2
28
+ * Dropped support for PHP <7.2.5
29
+
30
+
31
+ ## V1.0.4 (21/11/2021)
32
+
33
+ * Updated package metadata
34
+
35
+
36
+ ## V1.0.3 (17/10/2021)
37
+
38
+ * Corrected docs
39
+
40
+
41
+ ## V1.0.2 (28/08/2021)
42
+
43
+ * Added support for PHP 8.1
44
+
45
+
46
+ ## V1.0.1 (13/04/2020)
47
+
48
+ * Updated funding information
49
+
50
+
51
+ ## V1.0 (21/03/2020)
52
+
53
+ * Initial release
@@ -1,21 +1,21 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2020-2024 Graham Campbell <hello@gjcampbell.co.uk>
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020-2024 Graham Campbell <hello@gjcampbell.co.uk>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,42 @@
1
+ Result Type
2
+ ===========
3
+
4
+ Result Type was created by, and is maintained by [Graham Campbell](https://github.com/GrahamCampbell), and is an implementation of the result type. Feel free to check out the [change log](CHANGELOG.md), [releases](https://github.com/GrahamCampbell/Result-Type/releases), [security policy](https://github.com/GrahamCampbell/Result-Type/security/policy), [license](LICENSE), [code of conduct](.github/CODE_OF_CONDUCT.md), and [contribution guidelines](.github/CONTRIBUTING.md).
5
+
6
+ ![Banner](https://user-images.githubusercontent.com/2829600/77233209-f86aae80-6b9d-11ea-9cef-81501c9e858d.png)
7
+
8
+ <p align="center">
9
+ <a href="https://github.com/GrahamCampbell/Result-Type/actions?query=workflow%3ATests"><img src="https://img.shields.io/github/actions/workflow/status/GrahamCampbell/Result-Type/tests.yml?label=Tests&style=flat-square" alt="Build Status"></img></a>
10
+ <a href="https://github.styleci.io/repos/249026522"><img src="https://github.styleci.io/repos/249026522/shield" alt="StyleCI Status"></img></a>
11
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-brightgreen?style=flat-square" alt="Software License"></img></a>
12
+ <a href="https://packagist.org/packages/graham-campbell/result-type"><img src="https://img.shields.io/packagist/dt/graham-campbell/result-type?style=flat-square" alt="Packagist Downloads"></img></a>
13
+ <a href="https://github.com/GrahamCampbell/Result-Type/releases"><img src="https://img.shields.io/github/release/GrahamCampbell/Result-Type?style=flat-square" alt="Latest Version"></img></a>
14
+ </p>
15
+
16
+
17
+ ## Installation
18
+
19
+ This version requires [PHP](https://www.php.net/) 7.2.5-8.5.
20
+
21
+ To get the latest version, simply require the project using [Composer](https://getcomposer.org/):
22
+
23
+ ```bash
24
+ $ composer require "graham-campbell/result-type:^1.1"
25
+ ```
26
+
27
+
28
+ ## Security
29
+
30
+ If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. You may view our full security policy [here](https://github.com/GrahamCampbell/Result-Type/security/policy).
31
+
32
+
33
+ ## License
34
+
35
+ Result Type is licensed under [The MIT License (MIT)](LICENSE).
36
+
37
+
38
+ ## For Enterprise
39
+
40
+ Available as part of the Tidelift Subscription
41
+
42
+ The maintainers of `graham-campbell/result-type` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-graham-campbell-result-type?utm_source=packagist-graham-campbell-result-type&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
@@ -1,33 +1,33 @@
1
- {
2
- "name": "graham-campbell/result-type",
3
- "description": "An Implementation Of The Result Type",
4
- "keywords": ["result", "result-type", "Result", "Result Type", "Result-Type", "Graham Campbell", "GrahamCampbell"],
5
- "license": "MIT",
6
- "authors": [
7
- {
8
- "name": "Graham Campbell",
9
- "email": "hello@gjcampbell.co.uk",
10
- "homepage": "https://github.com/GrahamCampbell"
11
- }
12
- ],
13
- "require": {
14
- "php": "^7.2.5 || ^8.0",
15
- "phpoption/phpoption": "^1.9.5"
16
- },
17
- "require-dev": {
18
- "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7"
19
- },
20
- "autoload": {
21
- "psr-4": {
22
- "GrahamCampbell\\ResultType\\": "src/"
23
- }
24
- },
25
- "autoload-dev": {
26
- "psr-4": {
27
- "GrahamCampbell\\Tests\\ResultType\\": "tests/"
28
- }
29
- },
30
- "config": {
31
- "preferred-install": "dist"
32
- }
33
- }
1
+ {
2
+ "name": "graham-campbell/result-type",
3
+ "description": "An Implementation Of The Result Type",
4
+ "keywords": ["result", "result-type", "Result", "Result Type", "Result-Type", "Graham Campbell", "GrahamCampbell"],
5
+ "license": "MIT",
6
+ "authors": [
7
+ {
8
+ "name": "Graham Campbell",
9
+ "email": "hello@gjcampbell.co.uk",
10
+ "homepage": "https://github.com/GrahamCampbell"
11
+ }
12
+ ],
13
+ "require": {
14
+ "php": "^7.2.5 || ^8.0",
15
+ "phpoption/phpoption": "^1.9.5"
16
+ },
17
+ "require-dev": {
18
+ "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7"
19
+ },
20
+ "autoload": {
21
+ "psr-4": {
22
+ "GrahamCampbell\\ResultType\\": "src/"
23
+ }
24
+ },
25
+ "autoload-dev": {
26
+ "psr-4": {
27
+ "GrahamCampbell\\Tests\\ResultType\\": "tests/"
28
+ }
29
+ },
30
+ "config": {
31
+ "preferred-install": "dist"
32
+ }
33
+ }
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" backupGlobals="false" beStrictAboutTestsThatDoNotTestAnything="true" beStrictAboutOutputDuringTests="true" bootstrap="vendor/autoload.php" colors="true" failOnRisky="true" failOnWarning="true" processIsolation="false" stopOnError="false" stopOnFailure="false" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.4/phpunit.xsd">
3
+ <testsuites>
4
+ <testsuite name="Result Type Test Suite">
5
+ <directory suffix="Test.php">./tests</directory>
6
+ </testsuite>
7
+ </testsuites>
8
+ <source>
9
+ <include>
10
+ <directory suffix=".php">./src</directory>
11
+ </include>
12
+ </source>
13
+ </phpunit>