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.
- package/README.md +1 -1
- package/_tools/assistant.js +92 -88
- package/_tools/modules/constants.js +23 -0
- package/_tools/modules/pageComponents.js +77 -0
- package/_tools/modules/updateData.js +25 -44
- package/_tools/modules/updateOutputPath.js +59 -63
- package/_tools/modules/updatePage.js +131 -104
- package/_tools/modules/utils.js +16 -19
- package/_tools/modules/validation.js +20 -0
- package/bin/create.js +74 -12
- package/out/.htaccess +16 -0
- package/out/404.html +163 -0
- package/out/assets/brand/favicon.svg +37 -0
- package/out/assets/brand/logo.svg +37 -0
- package/out/backend/.htaccess +7 -0
- package/out/backend/_core/composer.json +5 -0
- package/out/backend/_core/composer.lock +492 -0
- package/out/backend/_core/index.php +148 -0
- package/out/backend/_core/init.php +34 -0
- package/out/backend/_core/modules/RateLimiter.php +31 -0
- package/out/backend/_core/modules/Response.php +49 -0
- package/{src → out}/backend/_core/vendor/composer/autoload_static.php +10 -10
- package/{src → out}/backend/_core/vendor/composer/installed.json +6 -6
- package/{src → out}/backend/_core/vendor/composer/installed.php +2 -2
- package/out/backend/_core/vendor/graham-campbell/result-type/CHANGELOG.md +53 -0
- package/{src → out}/backend/_core/vendor/graham-campbell/result-type/LICENSE +21 -21
- package/out/backend/_core/vendor/graham-campbell/result-type/README.md +42 -0
- package/{src → out}/backend/_core/vendor/graham-campbell/result-type/composer.json +33 -33
- package/out/backend/_core/vendor/graham-campbell/result-type/phpunit.xml.dist +13 -0
- package/{src → out}/backend/_core/vendor/graham-campbell/result-type/src/Error.php +121 -121
- package/{src → out}/backend/_core/vendor/graham-campbell/result-type/src/Result.php +69 -69
- package/{src → out}/backend/_core/vendor/graham-campbell/result-type/src/Success.php +120 -120
- package/out/backend/_core/vendor/graham-campbell/result-type/tests/ResultTest.php +95 -0
- package/{src → out}/backend/_core/vendor/phpoption/phpoption/LICENSE +200 -200
- package/out/backend/_core/vendor/phpoption/phpoption/Makefile +17 -0
- package/out/backend/_core/vendor/phpoption/phpoption/README.md +201 -0
- package/{src → out}/backend/_core/vendor/phpoption/phpoption/composer.json +50 -50
- package/out/backend/_core/vendor/phpoption/phpoption/phpstan-baseline.neon +44 -0
- package/out/backend/_core/vendor/phpoption/phpoption/phpstan.neon.dist +7 -0
- package/out/backend/_core/vendor/phpoption/phpoption/phpunit.xml.dist +13 -0
- package/{src → out}/backend/_core/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php +175 -175
- package/{src → out}/backend/_core/vendor/phpoption/phpoption/src/PhpOption/None.php +136 -136
- package/{src → out}/backend/_core/vendor/phpoption/phpoption/src/PhpOption/Option.php +434 -434
- package/{src → out}/backend/_core/vendor/phpoption/phpoption/src/PhpOption/Some.php +169 -169
- package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/EnsureTest.php +72 -0
- package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/LazyOptionTest.php +357 -0
- package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/NoneTest.php +153 -0
- package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/OptionTest.php +166 -0
- package/out/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/SomeTest.php +194 -0
- package/out/backend/_core/vendor/phpoption/phpoption/tests/bootstrap.php +8 -0
- package/out/backend/_core/vendor/phpoption/phpoption/vendor-bin/phpstan/composer.json +8 -0
- package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/Ctype.php +232 -232
- package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/LICENSE +19 -19
- package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/README.md +12 -12
- package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/bootstrap.php +50 -50
- package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/bootstrap80.php +46 -46
- package/{src → out}/backend/_core/vendor/symfony/polyfill-ctype/composer.json +38 -38
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/LICENSE +19 -19
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Mbstring.php +1077 -1077
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/README.md +13 -13
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php +119 -119
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +1397 -1397
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +5 -5
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +1489 -1489
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/bootstrap.php +171 -171
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/bootstrap80.php +167 -167
- package/{src → out}/backend/_core/vendor/symfony/polyfill-mbstring/composer.json +39 -39
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/LICENSE +19 -19
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Php80.php +115 -115
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/PhpToken.php +106 -106
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/README.md +25 -25
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php +31 -31
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php +16 -16
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +20 -20
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php +16 -16
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php +16 -16
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/bootstrap.php +42 -42
- package/{src → out}/backend/_core/vendor/symfony/polyfill-php80/composer.json +37 -37
- package/out/backend/_core/vendor/vlucas/phpdotenv/.editorconfig +15 -0
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/LICENSE +30 -30
- package/out/backend/_core/vendor/vlucas/phpdotenv/Makefile +17 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/README.md +370 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/UPGRADING.md +196 -0
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/composer.json +60 -60
- package/out/backend/_core/vendor/vlucas/phpdotenv/phpstan-baseline.neon +157 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/phpstan.neon.dist +7 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/phpunit.xml.dist +13 -0
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Dotenv.php +267 -267
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php +12 -12
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php +12 -12
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php +12 -12
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php +12 -12
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Exception/ValidationException.php +12 -12
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Loader/Loader.php +48 -48
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php +20 -20
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Loader/Resolver.php +65 -65
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Entry.php +59 -59
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php +299 -299
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Lexer.php +58 -58
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Lines.php +127 -127
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Parser.php +53 -53
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php +19 -19
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Value.php +88 -88
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php +15 -15
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php +89 -89
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php +80 -80
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php +88 -88
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php +85 -85
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php +110 -110
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php +48 -48
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php +64 -64
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php +91 -91
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php +17 -17
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php +104 -104
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php +88 -88
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php +27 -27
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php +107 -107
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php +272 -272
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php +51 -51
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/File/Paths.php +44 -44
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/File/Reader.php +81 -81
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/FileStore.php +72 -72
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php +141 -141
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php +17 -17
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Store/StringStore.php +37 -37
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Util/Regex.php +112 -112
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Util/Str.php +108 -108
- package/{src → out}/backend/_core/vendor/vlucas/phpdotenv/src/Validator.php +207 -207
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/DotenvTest.php +387 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Loader/LoaderTest.php +86 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/EntryParserTest.php +234 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/LexerTest.php +40 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/LinesTest.php +53 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/ParserTest.php +98 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/ArrayAdapterTest.php +57 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/EnvConstAdapterTest.php +75 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/PutenvAdapterTest.php +52 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/ServerConstAdapterTest.php +75 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/RepositoryTest.php +305 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Store/StoreTest.php +141 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/ValidatorTest.php +479 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/.env +5 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/assertions.env +18 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/booleans.env +33 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/commented.env +15 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/empty.env +1 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/example.env +1 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/exported.env +7 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/immutable.env +1 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/integers.env +17 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/large.env +2 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multibyte.env +3 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multiline.env +14 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multiple.env +4 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/mutable.env +1 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/nested.env +15 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/quoted.env +11 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/specialchars.env +8 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/unicodevarnames.env +2 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/utf8-with-bom-encoding.env +3 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/windows.env +1 -0
- package/out/backend/_core/vendor/vlucas/phpdotenv/vendor-bin/phpstan/composer.json +15 -0
- package/out/backend/api/protected/example-protected.php +17 -0
- package/out/backend/api/public/example-public.php +17 -0
- package/out/backend/database/Database.php +24 -0
- package/out/backend/database/migrations/create_example_db.sql +1 -0
- package/out/backend/web.config +17 -0
- package/out/css/fonts/bootstrap-icons.woff +0 -0
- package/out/css/fonts/bootstrap-icons.woff2 +0 -0
- package/out/css/github-markdown-dark.css +1124 -0
- package/out/css/github-markdown-light.css +1124 -0
- package/out/css/pages/404.css +21517 -0
- package/out/css/pages/homepage.css +21508 -0
- package/out/data/site.json +44 -0
- package/out/index.html +1147 -0
- package/out/js/bootstrap.bundle.min.js +7 -0
- package/out/js/pages/js/pages/404.js +6 -0
- package/out/js/pages/js/pages/homepage.js +6 -0
- package/out/js/pages/ts/pages/404.js +6 -0
- package/out/js/pages/ts/pages/homepage.js +6 -0
- package/out/llms.txt +14 -0
- package/out/robots.txt +4 -0
- package/out/sitemap.xml +15 -0
- package/out/web.config +27 -0
- package/package.json +14 -47
- package/src/frontend/data/site.json +1 -1
- package/.gitignore +0 -4
- package/_tools/modules/updateIncludes.js +0 -81
- package/src/backend/config.example.php +0 -28
- /package/{src → out}/backend/_core/vendor/autoload.php +0 -0
- /package/{src → out}/backend/_core/vendor/composer/ClassLoader.php +0 -0
- /package/{src → out}/backend/_core/vendor/composer/InstalledVersions.php +0 -0
- /package/{src → out}/backend/_core/vendor/composer/LICENSE +0 -0
- /package/{src → out}/backend/_core/vendor/composer/autoload_classmap.php +0 -0
- /package/{src → out}/backend/_core/vendor/composer/autoload_files.php +0 -0
- /package/{src → out}/backend/_core/vendor/composer/autoload_namespaces.php +0 -0
- /package/{src → out}/backend/_core/vendor/composer/autoload_psr4.php +0 -0
- /package/{src → out}/backend/_core/vendor/composer/autoload_real.php +0 -0
- /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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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' => '
|
|
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' => '
|
|
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
|
+

|
|
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>
|