Author SHA1 Message Date
Dave Mc Nicoll 254ea744c3 - Merged with master done 2026-10-19 20:01:25 +00:00
Dave Mc Nicoll 5839041e4c - Fixed conflicts 2026-10-19 20:01:18 +00:00
mcndave c8f4e181be - Added createStream methods and fixed multiple errors views 2026-10-19 20:01:17 +00:00
mcndave 5ea4e70988 - Added MethodNotAllowed interface 2026-10-19 20:01:11 +00:00
mcndave 3281713534 - Added createStream methods and fixed multiple errors views 2026-10-19 20:01:10 +00:00
Dave Mc Nicoll e3b22335e1 - Merged with master done 2026-10-19 20:01:01 +00:00
Dave Mc Nicoll 6cb5e7bba8 - Rebased 2026-10-19 20:00:54 +00:00
Dave Mc Nicoll e6a41fbfab - WIP on ulmus-user mechanics updates 2026-10-19 20:00:45 +00:00
mcndave e0f2cbac92 - Added MethodNotAllowed interface 2026-10-19 20:00:27 +00:00
Dave Mc Nicoll e32b092749 - Merged with master done 2026-10-19 20:00:26 +00:00
Dave Mc Nicoll 538e0b9aec - Fixed conflicts 2026-10-19 19:59:54 +00:00
Dev 7bad9a69c9 - Fixed default view order to 1000 2026-10-19 19:59:44 +00:00
mcndave f1570d1c42 - Added createStream methods and fixed multiple errors views 2026-10-19 19:59:43 +00:00
mcndave 71b9ca68ec - Added MethodNotAllowed interface 2026-10-19 19:59:28 +00:00
Dave Mc Nicoll 020227abfe - Fixed email route argument pattern and added getenvonce() method 2026-10-19 19:58:55 +00:00
Dave Mc Nicoll 8090e493b5 -Rebasing 2026-10-19 19:58:21 +00:00
mcndave 75c480496a - WIP on skeleton 2026-10-19 19:56:06 +00:00
mcndave bbf8566fd2 - Added createStream methods and fixed multiple errors views 2026-10-19 19:56:06 +00:00
Dave Mc Nicoll 9c5e8c66ff - Merged with master done 2026-10-19 19:55:34 +00:00
Dave Mc Nicoll 50b17ec8b6 - WIP on ulmus-user mechanics updates 2026-10-19 19:55:28 +00:00
mcndave 064d94d32a - Fixed conflict 2026-10-19 19:54:02 +00:00
mcndave aa15850baa - Done working on package manager 2026-10-19 19:54:02 +00:00
mcndave c7469af952 - WIP on package manager 2026-10-19 19:54:02 +00:00
mcndave 3a60aaaf56 - Allowed next Ulmus version into lean 2026-10-19 19:54:02 +00:00
mcndave dce553d688 - WIP on integrating package manager 2026-10-19 19:54:02 +00:00
mcndave 1a5d4dd0b2 - Some bugfixes made in skeleton dir and fixed 'email' route pattern 2026-10-19 19:53:59 +00:00
mcndave 5769f600fe - Added PHP 8.5 supports
- Fixed some minor bugs
2026-10-19 19:53:02 +00:00
mcndave 7a292fe373 - Removed E_STRICT error type, added some more content to skeleton and removed 'methods' of route attributes (replaced with 'method') 2026-10-19 19:52:24 +00:00
mcndave 79287f28cc - Fixed a missing variable bug 2026-10-19 19:52:24 +00:00
mcndave 2a688935cc - Fixed errorLogPath default value if none is provided 2026-10-19 19:52:24 +00:00
mcndave a903153fe2 - Fix conflicts 2026-10-19 19:52:24 +00:00
Dave Mc Nicoll ec59a36afb - removed getenvonce, placed in env dir instead 2026-10-19 19:52:24 +00:00
mcndave 9556a2cba6 - Added createStream methods and fixed multiple errors views 2026-10-19 19:52:23 +00:00
mcndave 1c44342bbf - Added MethodNotAllowed interface 2026-10-19 19:51:33 +00:00
Dave Mc Nicoll 81e124b144 - Added getenvonce 2026-06-01 15:23:49 +00:00
Dave Mc Nicoll 9cd6f10d7e - Merged with master done 2026-06-01 15:23:48 +00:00
Dave Mc Nicoll a36dbeeef2 - Fixed conflicts 2026-06-01 15:23:42 +00:00
mcndave 7ed88ec89f - Added createStream methods and fixed multiple errors views 2026-06-01 15:23:11 +00:00
mcndave c6e9bb6a38 - Added MethodNotAllowed interface 2026-06-01 15:23:04 +00:00
Dave Mc Nicoll e934c1a92c -Rebasing 2026-06-01 15:23:04 +00:00
mcndave baf6fdf952 - Added createStream methods and fixed multiple errors views 2026-06-01 15:23:03 +00:00
Dave Mc Nicoll e0da7ae734 - Merged with master done 2026-06-01 15:22:54 +00:00
Dave Mc Nicoll 64f273e65c - Rebased 2026-06-01 15:22:54 +00:00
Dave Mc Nicoll 9031236930 - WIP on ulmus-user mechanics updates 2026-06-01 15:22:54 +00:00
mcndave 7ee4b2d8bb - Added createStream methods and fixed multiple errors views 2026-06-01 15:22:38 +00:00
mcndave 06c4f46486 - Added MethodNotAllowed interface 2026-06-01 15:21:56 +00:00
Dave Mc Nicoll 01d48463b3 - Merged with master done 2026-05-21 15:18:50 +00:00
Dave Mc Nicoll abe94e498f - Fixed conflicts 2026-05-21 15:18:49 +00:00
Dev adfd619c5f - Fixed default view order to 1000 2026-05-21 15:18:04 +00:00
mcndave 16ee06593c - Added createStream methods and fixed multiple errors views 2026-05-21 15:18:03 +00:00
mcndave 5bb5e8ce61 - Added MethodNotAllowed interface 2026-05-21 15:16:58 +00:00
29 changed files with 282 additions and 157 deletions

No files matched your search

+14 -42
View File
@@ -16,54 +16,26 @@
"ext-posix": "*", "ext-posix": "*",
"ext-xmlreader": "*", "ext-xmlreader": "*",
"ext-fileinfo": "*", "ext-fileinfo": "*",
"league/route": "^5.0.0-dev", "league/route": "^7.0.0-dev",
"laminas/laminas-diactoros": "2.24.x-dev", "laminas/laminas-diactoros": "3.9.x-dev",
"laminas/laminas-httphandlerrunner": "2.5.x-dev", "laminas/laminas-httphandlerrunner": "2.14.x-dev",
"vlucas/phpdotenv": "^3.4@dev", "vlucas/phpdotenv": "^3.4@dev",
"middlewares/whoops": "dev-master", "middlewares/whoops": "dev-master",
"mcnd/storage": "dev-master", "mcnd/dump": "~1.0.0",
"mcnd/lean-console": "dev-master", "mcnd/storage": "~1.0.0",
"mcnd/ulmus": "dev-master", "mcnd/event": "~1.0.0",
"mcnd/tell": "dev-master", "mcnd/tell": "~1.0.0",
"mcnd/dump": "dev-master", "mcnd/ulmus": "^1.0 || ^2.0",
"mcnd/event": "dev-master", "mcnd/kash": "~1.0.0",
"mcnd/thebugs": "dev-master", "mcnd/taxus": "1.1.0",
"mcnd/taxus": "dev-master", "mcnd/notes": "^2.1.1",
"mcnd/notes": "dev-master", "mcnd/thebugs": "^1.0.0",
"psr/simple-cache": "*" "psr/simple-cache": "*"
}, },
"repositories": [ "repositories": [
{ {
"type": "vcs", "type": "composer",
"url": "https://git.mcnd.ca/mcndave/event.git" "url": "https://git.mcnd.ca/api/packages/mcndave/composer"
},
{
"type": "vcs",
"url": "https://git.mcnd.ca/mcndave/the-bugs.git"
},
{
"type": "vcs",
"url": "https://git.mcnd.ca/mcndave/storage.git"
},
{
"type": "vcs",
"url": "https://git.mcnd.ca/mcndave/ulmus.git"
},
{
"type": "vcs",
"url": "https://git.mcnd.ca/mcndave/notes.git"
},
{
"type": "vcs",
"url": "https://git.mcnd.ca/mcndave/tell.git"
},
{
"type": "vcs",
"url": "https://git.mcnd.ca/mcndave/lean-console.git"
},
{
"type": "vcs",
"url": "https://git.mcnd.ca/mcndave/dump.git"
} }
], ],
"autoload": { "autoload": {
+21 -9
View File
@@ -3,16 +3,23 @@
use Lean\Factory\HttpFactoryInterface; use Lean\Factory\HttpFactoryInterface;
use Ulmus\User\{ use Ulmus\User\{
Authorize\HeaderAuthentication, Authorize\PostRequestAuthentication, Authorize\CookieAuthentication,
Authorize\HeaderAuthentication,
Entity, Entity,
Lib\Authenticate, Lib\Authorize,
Middleware\AuthenticationMiddleware, Middleware\HeaderAuthenticationMiddleware, Middleware\PostRequestAuthenticationMiddleware, Lib\Authenticate,
}; Lib\Authorize,
Middleware\AuthenticationMiddleware,
Middleware\HeaderAuthenticationMiddleware,
Middleware\CookieAuthenticationMiddleware,
Middleware\PostRequestAuthenticationMiddleware,
Authorize\PostRequestAuthentication};
use Picea\Picea; use Picea\Picea;
use Storage\{ Cookie, Session };
use Psr\Container\ContainerInterface;
use Storage\{ Cookie, Session };
use Psr\Container\ContainerInterface;
use function DI\{get, autowire, create}; use function DI\{get, autowire, create};
return [ return [
@@ -26,6 +33,10 @@ return [
HeaderAuthenticationMiddleware::class => create(HeaderAuthenticationMiddleware::class)->constructor(get(HeaderAuthentication::class)), HeaderAuthenticationMiddleware::class => create(HeaderAuthenticationMiddleware::class)->constructor(get(HeaderAuthentication::class)),
CookieAuthentication::class => autowire(CookieAuthentication::class),
CookieAuthenticationMiddleware::class => create(CookieAuthenticationMiddleware::class)->constructor(get(CookieAuthentication::class), get(Cookie::class)),
PostRequestAuthentication::class => create(PostRequestAuthentication::class)->constructor("email", "email", "password"), PostRequestAuthentication::class => create(PostRequestAuthentication::class)->constructor("email", "email", "password"),
PostRequestAuthenticationMiddleware::class => create(PostRequestAuthenticationMiddleware::class)->constructor(get(PostRequestAuthentication::class)), PostRequestAuthenticationMiddleware::class => create(PostRequestAuthenticationMiddleware::class)->constructor(get(PostRequestAuthentication::class)),
@@ -35,15 +46,16 @@ return [
'authorize.error' => function(ContainerInterface $c) { 'authorize.error' => function(ContainerInterface $c) {
return function(array $errorData) use ($c) { return function(array $errorData) use ($c) {
return $c->get(HttpFactoryInterface::class)::createJsonResponse($errorData + [ return $c->get(HttpFactoryInterface::class)::createJsonResponse($errorData + [
'api.error' => "Authorization failed", 'api.error' => "Authorization failed",
'api.datetime' => (new \DateTime)->format(\DateTime::ATOM), 'api.datetime' => (new \DateTime)->format(\DateTime::ATOM),
], 403); ], 403);
}; };
}, },
'authentication.error' => function($c, Picea $picea) { 'authentication.error' => function($c, Picea $picea) {
return function($message) use ($c, $picea) { return function($message) use ($c, $picea) {
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml('lean/error/500', [ return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml('lean/error/500', [
'title' => "Authentication failed", 'title' => "Authentication failed",
'subtitle' => "", 'subtitle' => "",
'message' => $message, 'message' => $message,
+1 -2
View File
@@ -37,7 +37,7 @@ return [
public function execute(Routing $routing, Route $attribute) : void public function execute(Routing $routing, Route $attribute) : void
{ {
if (null !== ($name = $attribute->name ?? null)) { if (null !== ($name = $attribute->name ?? null)) {
$this->extension->registerRoute($name, $attribute->getRoute(), $attribute->class, $attribute->classMethod, (array) ( $attribute->method ?? $attribute->methods )); $this->extension->registerRoute($name, $attribute->getRoute(), $attribute->class, $attribute->classMethod, (array) ( $attribute->method ));
} }
} }
}, },
@@ -52,7 +52,6 @@ return [
{ {
$class = $attribute->class; $class = $attribute->class;
$method = $attribute->classMethod; $method = $attribute->classMethod;
$object = $container->get($class);
$request = $request->withAttribute('lean.route', $attribute); $request = $request->withAttribute('lean.route', $attribute);
+25 -7
View File
@@ -1,15 +1,17 @@
<?php <?php
use Psr\Container\ContainerInterface;
use Lean\ApplicationStrategy\{ ThrowableHandler, ThrowableHandlerInterface, NotFoundDecoratorInterface, NotFoundDecorator, MethodNotAllowedInterface, }; use Lean\ApplicationStrategy\{ ThrowableHandler, ThrowableHandlerInterface, NotFoundDecoratorInterface, NotFoundDecorator, MethodNotAllowedInterface, };
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Laminas\{ Diactoros\ServerRequestFactory, HttpHandlerRunner\Emitter\EmitterInterface, HttpHandlerRunner\Emitter\SapiEmitter }; use Laminas\{ Diactoros\ServerRequestFactory, HttpHandlerRunner\Emitter\EmitterInterface, HttpHandlerRunner\Emitter\SapiEmitter };
use Lean\Factory\{ HttpFactory, HttpFactoryInterface }; use Lean\Factory\{ HttpFactory, HttpFactoryInterface };
use Picea\Picea; use Picea\Picea;
use Storage\Cookie,
Storage\Session,
Storage\SessionMiddleware;
use function DI\autowire, DI\create, DI\get; use function DI\{ autowire, create, get };
return [ return [
ServerRequestInterface::class => function ($c) { ServerRequestInterface::class => function ($c) {
@@ -20,8 +22,28 @@ return [
EmitterInterface::class => create(SapiEmitter::class), EmitterInterface::class => create(SapiEmitter::class),
ThrowableHandlerInterface::class => autowire(ThrowableHandler::class),
NotFoundDecoratorInterface::class => autowire(NotFoundDecorator::class),
# MethodNotAllowedInterface::class => autowire(MethodNotAllowedDecorator::class),
HttpFactoryInterface::class => create(HttpFactory::class), HttpFactoryInterface::class => create(HttpFactory::class),
Cookie::class => create(Cookie::class)->constructor([
'secure' => true,
'path' => getenv('URL_BASE') ?: '/',
'httponly' => true,
'samesite'=> "Lax",
], getenv("LEAN_RANDOM")),
Session::class => create(Session::class)->constructor(get(Cookie::class), [ 'path' => getenv('URL_BASE') ?: '/', ]),
SessionMiddleware::class => create(SessionMiddleware::class)->constructor(get(Cookie::class), [
'name' => "lean_sess_" . substr(md5(getenv("LEAN_RANDOM")), 0, 12),
'path' => getenv('URL_BASE') ?: '/',
'samesite' => getenv("LEAN_COOKIE_SAMESITE") ?? "Lax",
'secure' => (bool) getenv('LEAN_COOKIE_SECURE') ?? false
]),
'error.401' => function(ContainerInterface $c, Picea $picea) { 'error.401' => function(ContainerInterface $c, Picea $picea) {
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml("lean/error/401", []), 401); return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml("lean/error/401", []), 401);
}, },
@@ -33,8 +55,4 @@ return [
'error.500' => function(ContainerInterface $c, Picea $picea) { 'error.500' => function(ContainerInterface $c, Picea $picea) {
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml("lean/error/500", []), 500); return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml("lean/error/500", []), 500);
}, },
ThrowableHandlerInterface::class => autowire(ThrowableHandler::class),
NotFoundDecoratorInterface::class => autowire(NotFoundDecorator::class),
# MethodNotAllowedInterface::class => autowire(MethodNotAllowedDecorator::class),
]; ];
-1
View File
@@ -2,7 +2,6 @@
use Tell\I18n; use Tell\I18n;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Notes\Tell\LanguageHandler;
use function DI\autowire, DI\create, DI\get, DI\add; use function DI\autowire, DI\create, DI\get, DI\add;
+1 -1
View File
@@ -68,7 +68,7 @@ return [
} }
} }
$router->addPatternMatcher('email', '[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n/]+'); $router->addPatternMatcher('email', '[^@ \t\r\n/]+@[^@ \t\r\n/]+\.[^@ \t\r\n/]+');
$router->addPatternMatcher('ids', '\b\d[\d,]*\b'); $router->addPatternMatcher('ids', '\b\d[\d,]*\b');
$routing = $container->get(Lean\Routing::class); $routing = $container->get(Lean\Routing::class);
-9
View File
@@ -6,9 +6,6 @@ use TheBugs\JavascriptMiddleware;
use Lean\Lean; use Lean\Lean;
use Storage\Cookie,
Storage\Session,
Storage\SessionMiddleware;
use function DI\autowire, DI\create, DI\get, DI\add; use function DI\autowire, DI\create, DI\get, DI\add;
@@ -78,12 +75,6 @@ return [
JavascriptMiddleware::class => create(JavascriptMiddleware::class), JavascriptMiddleware::class => create(JavascriptMiddleware::class),
Cookie::class => create(Cookie::class)->constructor([ 'secure' => true, 'path' => getenv('URL_BASE') ?: '/', ], getenv("LEAN_RANDOM")),
Session::class => create(Session::class)->constructor(get(Cookie::class), [ 'path' => getenv('URL_BASE') ?: '/', ]),
SessionMiddleware::class => create(SessionMiddleware::class)->constructor(get(Cookie::class), [ 'name' => "lean_sess_" . substr(md5(getenv("LEAN_RANDOM")), 0, 12), 'path' => getenv('URL_BASE') ?: '/' ]),
'git.commit' => function($c) { 'git.commit' => function($c) {
if ( getenv("DEBUG") ) { if ( getenv("DEBUG") ) {
return uniqid("debug_"); return uniqid("debug_");
+14 -14
View File
@@ -5,7 +5,8 @@ CRON_KEY = dev
# Route # Route
URL_BASE = "" URL_BASE = ""
APP_URL = "dev.mcnd.ca" APP_URL = "myapp.ca"
ASSET_PATH = "static/"
# Path # Path
CACHE_DIR = "var/cache" CACHE_DIR = "var/cache"
@@ -23,19 +24,18 @@ DEFAULT_TIME = "fr.UTF-8"
DEFAULT_TIME_FALLBACK = "french.UTF-8" DEFAULT_TIME_FALLBACK = "french.UTF-8"
# Database # Database
#SQLITE_PATH = "var/home.sqlite3" SQLITE_PATH = "var/myapp.sqlite3"
#SQLITE_ADAPTER = "SQLite" SQLITE_ADAPTER = "SQLite"
#SQLITE_PRAGMA_BEGIN = "foreign_keys=ON,synchronous=NORMAL" SQLITE_PRAGMA_BEGIN = "foreign_keys=ON,synchronous=NORMAL"
#SQLITE_PRAGMA_DEBUG_BEGIN = "journal_mode=WAL" SQLITE_PRAGMA_DEBUG_BEGIN = "journal_mode=WAL"
#SQLITE_PRAGMA_CLOSE = "analysis_limit=500,optimize" SQLITE_PRAGMA_CLOSE = "analysis_limit=500,optimize"
DATABASE_PORT = "" #DATABASE_PORT = ""
DATABASE_HOST = "" #DATABASE_HOST = ""
DATABASE_NAME = "" #DATABASE_NAME = ""
DATABASE_USERNAME = "" #DATABASE_USERNAME = ""
DATABASE_PASSWORD = "" #DATABASE_PASSWORD = ""
DATABASE_CHARSET = "utf8" #DATABASE_CHARSET = "utf8"
DATABASE_ADAPTER = "MariaDB" #DATABASE_ADAPTER = "MariaDB"
LEAN_RANDOM = "%RAND64%" LEAN_RANDOM = "%RAND64%"
+12 -8
View File
@@ -25,20 +25,20 @@
"league/oauth2-client": "dev-master", "league/oauth2-client": "dev-master",
"php-di/php-di": "dev-master", "php-di/php-di": "dev-master",
"league/commonmark": "^2.7@dev", "league/commonmark": "^2.7@dev",
"assets-package/ace": "dev-master", "assets-package/ace": "1.0.0",
"mcnd/dump": "dev-master", "mcnd/dump": "dev-master",
"mcnd/storage": "dev-master", "mcnd/storage": "dev-master",
"mcnd/cli": "dev-master", "mcnd/cli": "dev-master",
"mcnd/event": "dev-master", "mcnd/event": "dev-master",
"mcnd/ulmus": "dev-master", "mcnd/ulmus": "^1.0 || ^2.0",
"mcnd/ulmus-api": "dev-master", "mcnd/ulmus-api": "^1.3.0",
"mcnd/ulmus-user": "dev-master", "mcnd/ulmus-user": "~1.1.2",
"mcnd/picea": "dev-master", "mcnd/picea": "dev-master",
"mcnd/picea-ui": "dev-master", "mcnd/picea-ui": "dev-master",
"mcnd/picea-asset": "dev-master", "mcnd/picea-asset": "~1.0.2",
"mcnd/cronard": "dev-master", "mcnd/cronard": "dev-master",
"mcnd/lean-api": "dev-master", "mcnd/lean-api": "dev-master",
"mcnd/lean-console": "dev-master", "mcnd/lean-console": "~1.3.2",
"mcnd/kash": "dev-master", "mcnd/kash": "dev-master",
"mcnd/taxus": "dev-master", "mcnd/taxus": "dev-master",
"mcnd/notes": "dev-master", "mcnd/notes": "dev-master",
@@ -47,8 +47,12 @@
}, },
"repositories": [ "repositories": [
{ {
"type": "vcs", "type": "composer",
"url": "https://git.mcnd.ca/mcndave/cronard.git" "url": "https://git.mcnd.ca/api/packages/mcndave/composer"
},
{
"type": "composer",
"url": "https://git.mcnd.ca/api/packages/assets-package/composer"
}, },
{ {
"type": "vcs", "type": "vcs",
+8 -8
View File
@@ -19,7 +19,7 @@ return [
'ulmus' => [ 'ulmus' => [
'connections' => [ 'connections' => [
'default' => [ /*'default' => [
'adapter' => getenv("DATABASE_ADAPTER"), 'adapter' => getenv("DATABASE_ADAPTER"),
'host' => getenv("DATABASE_HOST"), 'host' => getenv("DATABASE_HOST"),
'port' => getenv("DATABASE_PORT"), 'port' => getenv("DATABASE_PORT"),
@@ -29,18 +29,18 @@ return [
'settings' => [ 'settings' => [
'charset' => getenv("DATABASE_CHARSET"), 'charset' => getenv("DATABASE_CHARSET"),
], ],
], ],*/
'sqlite' => [ 'default' => [
'adapter' => getenv("SQLITE_ADAPTER"), 'adapter' => getenv("SQLITE_ADAPTER"),
'path' => getenv('PROJECT_PATH') . DIRECTORY_SEPARATOR . getenv("SQLITE_PATH"), 'path' => getenv('PROJECT_PATH') . DIRECTORY_SEPARATOR . getenv("SQLITE_PATH"),
'pragma' => explode(',', getenv("SQLITE_PRAGMA")), 'pragma' => explode(',', getenv("SQLITE_PRAGMA")),
'pragma_begin' => array_merge( 'pragma_begin' => array_merge(
explode(',', getenv("SQLITE_PRAGMA_BEGIN")), explode(',', getenv('DEBUG') ? getenv("SQLITE_PRAGMA_DEBUG_BEGIN") : "") explode(',', getenv("SQLITE_PRAGMA_BEGIN")), explode(',', getenv('DEBUG') ? getenv("SQLITE_PRAGMA_DEBUG_BEGIN") : "")
), ),
'pragma_close' => array_merge( 'pragma_close' => array_merge(
explode(',', getenv("SQLITE_PRAGMA_CLOSE")), explode(',', getenv('DEBUG') ? getenv("SQLITE_PRAGMA_DEBUG_CLOSE") : "") explode(',', getenv("SQLITE_PRAGMA_CLOSE")), explode(',', getenv('DEBUG') ? getenv("SQLITE_PRAGMA_DEBUG_CLOSE") : "")
), ),
], ],
] ]
] ]
+1 -1
View File
@@ -43,7 +43,7 @@ return [
EmailConfiguration::class => function($c) { EmailConfiguration::class => function($c) {
$email = new EmailConfiguration( EmailConfiguration::AUTH_TYPE_SMTP ); $email = new EmailConfiguration( EmailConfiguration::AUTH_TYPE_SMTP );
$email->smtpHost = getenv('SMTP_HOSTNAME'); $email->smtpHost = getenv('SMTP_HOST');
$email->smtpPort = getenv('SMTP_PORT'); $email->smtpPort = getenv('SMTP_PORT');
$email->smtpUsername = getenv('SMTP_USERNAME'); $email->smtpUsername = getenv('SMTP_USERNAME');
$email->smtpPassword = getenv('SMTP_PASSWORD'); $email->smtpPassword = getenv('SMTP_PASSWORD');
+10
View File
@@ -1,3 +1,13 @@
<?php <?php
if (! function_exists('getenvonce')) {
function getenvonce(string $name) : array|string|false
{
$value = getenv($name);
unset($_ENV[$name], $_SERVER[$name]);
putenv($name . "=");
return $value;
}
}
return require("env/" . ( getenv('APP_ENV') ?? 'prod' ) . ".php"); return require("env/" . ( getenv('APP_ENV') ?? 'prod' ) . ".php");
+1 -1
View File
@@ -13,7 +13,7 @@ use Psr\Http\Server\MiddlewareInterface,
use function DI\{ create, get, autowire }; use function DI\{ create, get, autowire };
error_reporting(getenv('ERROR_REPORTING') ?: ( E_ALL & ~E_USER_DEPRECATED & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE )); error_reporting(getenv('ERROR_REPORTING') ?: ( E_ALL & ~E_USER_DEPRECATED & ~E_DEPRECATED & ~E_NOTICE ));
return [ return [
/* do nothing in production !*/ /* do nothing in production !*/
+8 -2
View File
@@ -1,8 +1,14 @@
<?php <?php
try { try {
require_once(dirname(__DIR__)."/src/Kernel.php"); $projectPath = dirname(__DIR__);
require_once $projectPath . '/vendor/autoload.php';
new class($projectPath) extends %NAMESPACE%\Kernel {};
} }
catch(\Throwable $t) { catch(\Throwable $t) {
echo sprintf("%s in <strong>%s</strong> <pre>%s</pre>", $t->getMessage(), $t->getFile() . ":" . $t->getLine(), $t->getTraceAsString()); echo sprintf("%s<hr><small>%s:%d</small><br><pre>%s</pre>", $t->getMessage(), $t->getFile(), $t->getLine(), getenv('DEBUG') ? var_export($t->getTrace(), true) : "");
error_log($t->getMessage());
header("HTTP/1.1 500 Internal Server Error");
} }
+3 -2
View File
@@ -7,6 +7,7 @@ use Storage\Session;
use Ulmus\User\Entity\User; use Ulmus\User\Entity\User;
use Notes\Route\Attribute\Object\Route; use Notes\Route\Attribute\Object\Route;
use Notes\Security\Attribute\Security; use Notes\Security\Attribute\Security;
use DI\Attribute\Inject;
use %NAMESPACE%\{ Entity, Lib, Form }; use %NAMESPACE%\{ Entity, Lib, Form };
@@ -18,9 +19,9 @@ use Notes\Attribute\Ignore;use Ulmus\User\Entity\UserInterface;
trait ControllerTrait { trait ControllerTrait {
use \Lean\ControllerTrait; use \Lean\ControllerTrait;
#[Ignore] #[Inject]
public ? UserInterface $user; public ? UserInterface $user;
#[Ignore] #[Inject]
protected EventManager $eventManager; protected EventManager $eventManager;
} }
+33 -1
View File
@@ -32,11 +32,43 @@ class ApplicationStrategy extends Strategy\ApplicationStrategy {
public function getThrowableHandler(): MiddlewareInterface public function getThrowableHandler(): MiddlewareInterface
{ {
return $this->getContainer()->get(ThrowableHandlerInterface::class); return $this->getContainer()->get(ThrowableHandlerInterface::class);
} }
public function getMethodNotAllowedDecorator(MethodNotAllowedException $exception): MiddlewareInterface public function getMethodNotAllowedDecorator(MethodNotAllowedException $exception): MiddlewareInterface
{ {
return $this->getContainer()->has(MethodNotAllowedInterface::class) ? $this->getContainer()->get(MethodNotAllowedInterface::class) : parent::getMethodNotAllowedDecorator($exception); return $this->getContainer()->has(MethodNotAllowedInterface::class) ? $this->getContainer()->get(MethodNotAllowedInterface::class) : parent::getMethodNotAllowedDecorator($exception);
} }
/*<<<<<<< HEAD
/*=======
public function getMethodNotAllowedDecorator(MethodNotAllowedException $exception): MiddlewareInterface
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if (php_sapi_name() !== 'cli' and ! defined('STDIN')) {
return $this->throw404($request);
}
return $handler->handle($request);;
}
public function throw404(ServerRequestInterface $request) : ResponseInterface
{
if ( getenv('DEBUG') && $this->di->has(\Picea\Asset\Asset::class) ) {
$params = $request->getServerParams();
$scpName = basename(explode('?', $params['REQUEST_URI'] ?? "", 2)[0]);
list(, $ext) = array_pad(explode('.', $scpName), 2, null);
if ($ext && in_array($ext, ApplicationStrategy::ASSET_TRIGGER_UPDATE)) {
$this->di->get(\Picea\Asset\Asset::class)->launchInstall();
}
}
return $this->di->get('error.404');
}
};
<<<<<<< HEAD
}
>>>>>>> af8b686 (- WIP on ulmus-user mechanics updates)*/
} }
+2 -1
View File
@@ -27,7 +27,8 @@ class Composer
$source = static::createPath('vendor', 'mcnd', 'lean', 'skeleton'); $source = static::createPath('vendor', 'mcnd', 'lean', 'skeleton');
$dest = static::createPath('skeleton'); $dest = static::createPath('skeleton');
`cp -a $source $dest`; shell_exec("cp -a $source $dest");
#`cp -a $source $dest`;
$iterator = new \RecursiveDirectoryIterator($dest); $iterator = new \RecursiveDirectoryIterator($dest);
$iterator->setFlags(\RecursiveDirectoryIterator::SKIP_DOTS); $iterator->setFlags(\RecursiveDirectoryIterator::SKIP_DOTS);
+18
View File
@@ -9,6 +9,7 @@ use Notes\Route\Attribute\Object\Route;
use Notes\Security\Attribute\Security; use Notes\Security\Attribute\Security;
use Picea, Picea\Ui\Method\FormContext; use Picea, Picea\Ui\Method\FormContext;
use Picea\Ui\Method\FormContextInterface; use Picea\Ui\Method\FormContextInterface;
use Picea\Ui\Method\FormInterface;
use TheBugs\Email\MailerInterface; use TheBugs\Email\MailerInterface;
use Storage\{ Cookie, Session }; use Storage\{ Cookie, Session };
use League\CommonMark\CommonMarkConverter; use League\CommonMark\CommonMarkConverter;
@@ -82,6 +83,13 @@ trait ControllerTrait {
return HttpFactory::createRedirectResponse($url, $code, $headers); return HttpFactory::createRedirectResponse($url, $code, $headers);
} }
#[Ignore]
protected function refresh(int $code = 204, array $headers = []) {
return static::renderNothing($code, [
'Refresh' => 0
] + $headers);
}
#[Ignore] #[Ignore]
public static function renderNothing(int $code = 204, array $headers = []) : ResponseInterface public static function renderNothing(int $code = 204, array $headers = []) : ResponseInterface
{ {
@@ -203,6 +211,16 @@ trait ControllerTrait {
return $this->picea->compiler->getExtensionFromToken('route')->buildRouteUrl($name, $parameters); return $this->picea->compiler->getExtensionFromToken('route')->buildRouteUrl($name, $parameters);
} }
#[Ignore]
public function form(FormInterface $form, ? FormContextInterface $formContext = null) : Picea\Ui\Method\FormHandler
{
if (! $this->picea ) {
throw new \Exception("A picea object must be provided on class initialization to use this method.");
}
return $this->picea->compiler->getExtensionInstanceOf(Picea\Ui\Method\Form::class)->formClass($form, $formContext);
}
#[Ignore] #[Ignore]
public function json($data, int $flags = 0) : string public function json($data, int $flags = 0) : string
{ {
+3 -3
View File
@@ -11,9 +11,9 @@ use Psr\Http\Message\StreamInterface;
class HttpFactory implements HttpFactoryInterface class HttpFactory implements HttpFactoryInterface
{ {
public static function createResponse(string $url, int $code = 302, array $headers = []) : ResponseInterface public static function createResponse(mixed $body = 'php://memory', int $code = 200, array $headers = []) : ResponseInterface
{ {
return new Response($url, $code, $headers); return new Response($body, $code, $headers);
} }
public static function createRedirectResponse(string $url, int $code = 302, array $headers = []) : ResponseInterface public static function createRedirectResponse(string $url, int $code = 302, array $headers = []) : ResponseInterface
@@ -63,6 +63,6 @@ class HttpFactory implements HttpFactoryInterface
public static function createStream(string $content): StreamInterface public static function createStream(string $content): StreamInterface
{ {
return (new StreamFactory())->createStream($content); return new StreamFactory()->createStream($content);
} }
} }
+37 -5
View File
@@ -14,20 +14,20 @@ class File
$beginning = false; $beginning = false;
$text = array(); $text = array();
while ($counter && ! $beginning) { while ($counter && !$beginning) {
$t = ""; $t = "";
while ($t !== PHP_EOL) { while ($t !== PHP_EOL) {
if(fseek($handle, $pos, SEEK_END) == -1) { if (fseek($handle, $pos, SEEK_END) == -1) {
$beginning = true; $beginning = true;
break; break;
} }
$t = fgetc($handle); $t = fgetc($handle);
$pos --; $pos--;
} }
$counter --; $counter--;
if ($beginning) { if ($beginning) {
rewind($handle); rewind($handle);
@@ -36,8 +36,40 @@ class File
$text[$lines - $counter - 1] = fgets($handle); $text[$lines - $counter - 1] = fgets($handle);
} }
fclose ($handle); fclose($handle);
return array_reverse($text); return array_reverse($text);
} }
public static function sanitizeFilePath($path) : string
{
// Remove null bytes
$path = str_replace("\0", "", $path);
$path = str_replace([ "\\", "/" ], DIRECTORY_SEPARATOR, $path);
$path = preg_replace('#' . DIRECTORY_SEPARATOR . '+#', DIRECTORY_SEPARATOR, $path);
// Remove . and .. directory traversal attempts
$path = preg_replace('#\.{1,2}/#', '', $path);
$path = trim($path, '/\\');
return $path;
}
public static function assertFileExists(string $filepath) : void
{
if (! is_file($filepath)) {
throw new \InvalidArgumentException("File does not exist: {$filepath}");
}
}
public static function assertFolderExists(string $path) : void
{
if (! is_dir($path)) {
throw new \InvalidArgumentException("Folder does not exist: {$path}");
}
}
} }
+40 -23
View File
@@ -11,23 +11,22 @@ use League\Route\Strategy\ApplicationStrategy;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Tell\I18n;
use Ulmus\Container\AdapterProxy;
use Laminas\Diactoros\ServerRequestFactory, use Laminas\Diactoros\ServerRequestFactory,
Laminas\HttpHandlerRunner\Emitter\EmitterInterface; Laminas\HttpHandlerRunner\Emitter\EmitterInterface;
use Ulmus\Ulmus; use Ulmus\Ulmus;
class Kernel { class Kernel
{
protected Container $container; protected Container $container;
protected string $locale; protected string $locale;
public array $paths = []; public array $paths = [];
public int $errorReporting = E_ALL & ~E_USER_DEPRECATED & ~E_DEPRECATED & ~E_NOTICE; public int $errorReportingDev = -1 & ~E_USER_DEPRECATED & ~E_DEPRECATED ;
public int $errorReportingProd = E_ALL & ~E_USER_DEPRECATED & ~E_DEPRECATED /*& ~E_NOTICE*/;
public array $definitionFilePaths; public array $definitionFilePaths;
@@ -36,6 +35,11 @@ class Kernel {
public function __construct( public function __construct(
public string $projectPath public string $projectPath
) { ) {
# Still not sure about adding a folder check each call just to add a basic project setup error ...
# File::assertFolderExists($this->projectPath);
define('IS_CLI', php_sapi_name() === 'cli' OR defined('STDIN'));
$this->setEnvironment(); $this->setEnvironment();
$this->initializeEngine(); $this->initializeEngine();
$this->setupContainer(); $this->setupContainer();
@@ -43,21 +47,27 @@ class Kernel {
$this->handleRequest(); $this->handleRequest();
} }
public static function putenv($var, $value) public static function putenv($var, $value) : void
{ {
putenv("$var=$value"); putenv("$var=$value");
$_ENV[$var] = $value; $_ENV[$var] = $value;
} }
protected function setEnvironment() { protected function setEnvironment() : void
{
static::putenv('PROJECT_PATH', $this->projectPath); static::putenv('PROJECT_PATH', $this->projectPath);
// Environment vars (accessible from \DI\env(), getenv(), $_ENV and $_SERVER) // Environment vars (accessible from \DI\env(), getenv(), $_ENV and $_SERVER)
Dotenv::create(getenv("PROJECT_PATH"))->load(); Dotenv::create(getenv("PROJECT_PATH"))->load();
// Override using headers // Override using headers
if ( ( $keys = getenv('KEYS') ) && ( $auth = $_SERVER["HTTP_X_DEV_AUTH"] ?? null ) && in_array($auth, explode(',', $keys)) ) { if (($keys = getenv('KEYS')) && ($auth = $_SERVER["HTTP_X_DEV_AUTH"] ?? null) && in_array($auth, explode(',', $keys))) {
foreach (['APP_ENV', 'DEBUG',] as $env) { unset($_SERVER["HTTP_X_DEV_AUTH"]);
unset($_ENV['KEYS'], $_SERVER['KEYS']);
putenv("KEYS=");
foreach(['APP_ENV', 'DEBUG',] as $env) {
if (null !== $value = $_SERVER["HTTP_X_$env"] ?? null) { if (null !== $value = $_SERVER["HTTP_X_$env"] ?? null) {
static::putenv($env, $value); static::putenv($env, $value);
} }
@@ -66,12 +76,14 @@ class Kernel {
// Paths and directories // Paths and directories
foreach($this->paths as $name => $envkey) { foreach($this->paths as $name => $envkey) {
if ( ! getenv($name) ) { if (!getenv($name)) {
$path = getenv("PROJECT_PATH") . DIRECTORY_SEPARATOR . getenv($envkey); $path = getenv("PROJECT_PATH") . DIRECTORY_SEPARATOR . getenv($envkey);
if (getenv('DEBUG') && ! file_exists($path)) { if (getenv('DEBUG') && ! file_exists($path)) {
if (false === mkdir($path, 0755, true)) { if (false === @mkdir($path, 0755, true)) {
throw new \Exception(sprintf("Folder '%s' could not be created", $path)); if (! IS_CLI) {
throw new \Exception(sprintf("Folder '%s' could not be created", $path));
}
} }
} }
@@ -88,15 +100,20 @@ class Kernel {
setlocale(LC_ALL, $this->locale = getenv("DEFAULT_LOCAL")); setlocale(LC_ALL, $this->locale = getenv("DEFAULT_LOCAL"));
setlocale(LC_TIME, getenv("DEFAULT_TIME"), getenv("DEFAULT_TIME_FALLBACK")); setlocale(LC_TIME, getenv("DEFAULT_TIME"), getenv("DEFAULT_TIME_FALLBACK"));
if ( class_exists('Locale') ) { if (class_exists('Locale')) {
\Locale::setDefault($this->locale); \Locale::setDefault($this->locale);
} }
ini_set("log_errors", "1"); ini_set("error_log", $this->errorLogPath ?? getenv("LOGS_PATH") . DIRECTORY_SEPARATOR. date("Y-m").".log");
ini_set("error_log", $this->errorLogPath); ini_set("log_errors", true);
ini_set('display_errors', getenv("DEBUG") ? 'on' : 'on'); ini_set('display_errors', getenv("DEBUG") ? 'on' : 'off');
error_reporting($this->errorReporting); if (getenv("DEBUG")) {
error_reporting(getenv('ERROR_REPORTING_DEV') ?: $this->errorReportingDev);
}
else {
error_reporting(getenv('ERROR_REPORTING_PROD') ?: $this->errorReportingProd);
}
return $this; return $this;
} }
@@ -109,7 +126,8 @@ class Kernel {
if (getenv("APP_ENV") === "prod") { if (getenv("APP_ENV") === "prod") {
if (getenv("CACHE_PATH")) { if (getenv("CACHE_PATH")) {
# check if ACPU is there first, $containerBuilder->enableDefinitionCache(); # check if ACPU is there first,
# $containerBuilder->enableDefinitionCache(); # Do not work .. ?
$containerBuilder->enableCompilation(getenv("CACHE_PATH") . "/di/"); $containerBuilder->enableCompilation(getenv("CACHE_PATH") . "/di/");
# No proxies yet... $containerBuilder->writeProxiesToFile(true, getenv("CACHE_PATH") . "/di/"); # No proxies yet... $containerBuilder->writeProxiesToFile(true, getenv("CACHE_PATH") . "/di/");
@@ -118,7 +136,7 @@ class Kernel {
else { else {
$compiled = getenv("CACHE_PATH") . "/di/CompiledContainer.php"; $compiled = getenv("CACHE_PATH") . "/di/CompiledContainer.php";
if ( file_exists($compiled) ) { if (file_exists($compiled)) {
unlink($compiled); unlink($compiled);
} }
} }
@@ -153,8 +171,7 @@ class Kernel {
} }
# Must be removed from KERNEL ! # Must be removed from KERNEL !
$this->container->has('ulmus.caching') and ( Ulmus::$cache = $this->container->get('ulmus.caching') ); $this->container->has('ulmus.caching') and (Ulmus::$cache = $this->container->get('ulmus.caching'));
# $this->container->has(AdapterProxy::class) and ( $ )
return $this; return $this;
} }
@@ -177,4 +194,4 @@ class Kernel {
return $this; return $this;
} }
}; }
+11
View File
@@ -244,4 +244,15 @@ class Lean
return call_user_func($func); return call_user_func($func);
} }
public static function path(...$parts) : string
{
return implode(DIRECTORY_SEPARATOR, $parts);
}
public static function rawPath(...$parts) : string
{
return implode(DIRECTORY_SEPARATOR, $parts);
}
} }
-1
View File
@@ -43,7 +43,6 @@ class FileDownloadResponse extends Response
else { else {
$finfo = finfo_open(FILEINFO_MIME_TYPE); $finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $filepath); $mime = finfo_file($finfo, $filepath);
finfo_close($finfo);
} }
parent::__construct( parent::__construct(
+5
View File
@@ -44,6 +44,11 @@ class Routing {
$container->set(ServerRequestInterface::class, $request); $container->set(ServerRequestInterface::class, $request);
# Decoding arguments received from the router
foreach($arguments as &$arg) {
$arg = urldecode($arg);
}
return $this->response ?? $object->$method($request, $arguments); return $this->response ?? $object->$method($request, $arguments);
}); });
} }
+11
View File
@@ -0,0 +1,11 @@
{% arguments array $contextList %}
{% if $contextList %}
<div class="message-wrapper">{% php
foreach($contextList as $name => $context) {
foreach($context->formContextMessages ?? [] as $message) {
echo $message->render();
}
}
%}</div>
{% endif %}
+1
View File
@@ -2,6 +2,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; "> <meta http-equiv="Content-Type" content="text/html; ">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<title>{{ title() }}</title> <title>{{ title() }}</title>
-4
View File
@@ -1,5 +1 @@
<<<<<<< HEAD
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1022.7" height="785.81" viewBox="0 0 1022.7 785.81" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/"><defs><linearGradient id="af83dc26-9572-4816-b7a1-1af4f72ff554-63" x1="678.2" y1="821.79" x2="678.2" y2="493.4" gradientTransform="translate(-20.24 29.65) rotate(-2.31)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="gray" stop-opacity="0.25"/><stop offset="0.54" stop-color="gray" stop-opacity="0.12"/><stop offset="1" stop-color="gray" stop-opacity="0.1"/></linearGradient></defs><title>bug fixing</title><ellipse cx="468.63" cy="660.88" rx="425" ry="33" fill="#6c63ff" opacity="0.1"/><g opacity="0.1"><path d="M933.7,529.93c-2.54-7.71-12.84-11.26-23-7.92a24.76,24.76,0,0,0-4.23,1.83c-.65-.18-1.32-.34-2-.46a22.42,22.42,0,0,0,.63-6.79A24.6,24.6,0,0,0,916,495.12a24.63,24.63,0,0,0,10.86-21.47,23.76,23.76,0,0,0,8.23-9.32c4.9-9.7,2.87-20.6-4.54-24.35s-17.4,1.08-22.3,10.78a23.69,23.69,0,0,0-2.63,12.15,24.63,24.63,0,0,0-10.86,21.47,24.63,24.63,0,0,0-10.86,21.47A24.64,24.64,0,0,0,873,527.33a23.76,23.76,0,0,0-8.23,9.32,25.46,25.46,0,0,0-2.08,5.74,21.18,21.18,0,0,0-4.44-4.73,25.38,25.38,0,0,0-1-4.5c-3.34-10.17-12.3-16.37-20-13.83s-11.26,12.83-7.92,23a23.07,23.07,0,0,0,7.56,11.08,25.38,25.38,0,0,0,1,4.5c1.94,5.9,5.77,10.46,10.15,12.75a23.23,23.23,0,0,0-.83,3.9,25.29,25.29,0,0,0-7.54,14.91,25.27,25.27,0,0,0-7.54,14.92,24.63,24.63,0,0,0-5,6.81c-4.91,9.7-2.88,20.61,4.53,24.35s17.4-1.07,22.31-10.78a24.62,24.62,0,0,0,2.5-8.09,25.29,25.29,0,0,0,7.54-14.91,25.27,25.27,0,0,0,7.54-14.92A25.21,25.21,0,0,0,879,571.94,25.21,25.21,0,0,0,886.56,557a24.11,24.11,0,0,0,3.39-4,23.46,23.46,0,0,0,12.27-.77,24.76,24.76,0,0,0,4.23-1.83,23.2,23.2,0,0,0,13.42-.48C930,546.61,936.23,537.65,933.7,529.93Z" transform="translate(-88.65 -57.09)" fill="#3f3d56"/><g opacity="0.1"><path d="M915.77,499.53a21.5,21.5,0,0,1-3.44,2.75,23,23,0,0,1-1.11,8.43,26.18,26.18,0,0,0,2.1-3.43A24.64,24.64,0,0,0,915.77,499.53Z" transform="translate(-88.65 -57.09)"/><path d="M926.63,478.06a21.5,21.5,0,0,1-3.44,2.75,23,23,0,0,1-1.11,8.43,25.65,25.65,0,0,0,2.1-3.44A24.85,24.85,0,0,0,926.63,478.06Z" transform="translate(-88.65 -57.09)"/><path d="M902,470.07a21.91,21.91,0,0,1,.17-4.41,24.93,24.93,0,0,0-4.78,6.57,25.63,25.63,0,0,0-1.52,3.73A22.75,22.75,0,0,1,902,470.07Z" transform="translate(-88.65 -57.09)"/><path d="M833.07,600a23.59,23.59,0,0,1,2.95-3.38,22.92,22.92,0,0,1,.87-4,25.09,25.09,0,0,0-2.29,3.71A25.59,25.59,0,0,0,833.07,600Z" transform="translate(-88.65 -57.09)"/><path d="M840.61,585.1a23.59,23.59,0,0,1,2.95-3.38,23,23,0,0,1,.83-3.9l0,0a25.68,25.68,0,0,0-2.2,3.59A26.76,26.76,0,0,0,840.61,585.1Z" transform="translate(-88.65 -57.09)"/><path d="M904.9,521a20.82,20.82,0,0,1-3.43,2.74,22.45,22.45,0,0,1-.63,6.79,18.75,18.75,0,0,1,2,.46,24.76,24.76,0,0,1,4.23-1.83c10.18-3.34,20.47.21,23,7.92a11.68,11.68,0,0,1,.32,6c3.35-3.94,4.74-8.74,3.3-13.14-2.54-7.71-12.84-11.26-23-7.92a24.76,24.76,0,0,0-4.23,1.83c-.65-.18-1.32-.34-2-.46C904.65,522.59,904.79,521.8,904.9,521Z" transform="translate(-88.65 -57.09)"/><path d="M829.35,607.49a25.09,25.09,0,0,0-2.29,3.71,26.56,26.56,0,0,0-1.54,3.74,24.48,24.48,0,0,1,3-3.4A22.92,22.92,0,0,1,829.35,607.49Z" transform="translate(-88.65 -57.09)"/><path d="M891.09,491.54a22,22,0,0,1,.17-4.41,24.93,24.93,0,0,0-4.78,6.57,25.63,25.63,0,0,0-1.52,3.73A22.75,22.75,0,0,1,891.09,491.54Z" transform="translate(-88.65 -57.09)"/><path d="M875.4,579.1a24.29,24.29,0,0,1-1,4.38,26.67,26.67,0,0,0,2.09-3.44,25.49,25.49,0,0,0,1.63-4A24.23,24.23,0,0,1,875.4,579.1Z" transform="translate(-88.65 -57.09)"/><path d="M860.32,608.92a24.15,24.15,0,0,1-1,4.38,25.65,25.65,0,0,0,2.1-3.44,26.47,26.47,0,0,0,1.63-4A23.57,23.57,0,0,1,860.32,608.92Z" transform="translate(-88.65 -57.09)"/><path d="M867.86,594a24.11,24.11,0,0,1-1,4.38A26.67,26.67,0,0,0,869,595a25.49,25.49,0,0,0,1.63-4A24.23,24.23,0,0,1,867.86,594Z" transform="translate(-88.65 -57.09)"/><path d="M882.94,564.19a24,24,0,0,1-1,4.37,25.89,25.89,0,0,0,2.09-3.43,25.48,25.48,0,0,0,1.64-4.07A23.22,23.22,0,0,1,882.94,564.19Z" transform="translate(-88.65 -57.09)"/><path d="M833.57,526.48c7.72-2.53,16.68,3.66,20,13.83a25.68,25.68,0,0,1,1,4.51,21.18,21.18,0,0,1,4.44,4.73,25.53,25.53,0,0,1,2.08-5.75c.35-.68.73-1.33,1.12-2a21.07,21.07,0,0,0-4-4.18,25.38,25.38,0,0,0-1-4.5c-3.34-10.17-12.3-16.37-20-13.83-4.4,1.44-7.44,5.41-8.62,10.43A11.69,11.69,0,0,1,833.57,526.48Z" transform="translate(-88.65 -57.09)"/><path d="M869.37,534.48a21.85,21.85,0,0,1,.18-4.4,24.73,24.73,0,0,0-4.79,6.57,25.07,25.07,0,0,0-1.52,3.72A23,23,0,0,1,869.37,534.48Z" transform="translate(-88.65 -57.09)"/><path d="M880.23,513a21.85,21.85,0,0,1,.18-4.4,24.52,24.52,0,0,0-4.79,6.56,25.63,25.63,0,0,0-1.52,3.73A22.75,22.75,0,0,1,880.23,513Z" transform="translate(-88.65 -57.09)"/><path d="M852.78,623.83a24.25,24.25,0,0,1-1,4.39,25.73,25.73,0,0,0,3.73-7.49A23.57,23.57,0,0,1,852.78,623.83Z" transform="translate(-88.65 -57.09)"/></g><path d="M948.52,430.7Line truncated <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1022.7" height="785.81" viewBox="0 0 1022.7 785.81" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/"><defs><linearGradient id="af83dc26-9572-4816-b7a1-1af4f72ff554-63" x1="678.2" y1="821.79" x2="678.2" y2="493.4" gradientTransform="translate(-20.24 29.65) rotate(-2.31)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="gray" stop-opacity="0.25"/><stop offset="0.54" stop-color="gray" stop-opacity="0.12"/><stop offset="1" stop-color="gray" stop-opacity="0.1"/></linearGradient></defs><title>bug fixing</title><ellipse cx="468.63" cy="660.88" rx="425" ry="33" fill="#6c63ff" opacity="0.1"/><g opacity="0.1"><path d="M933.7,529.93c-2.54-7.71-12.84-11.26-23-7.92a24.76,24.76,0,0,0-4.23,1.83c-.65-.18-1.32-.34-2-.46a22.42,22.42,0,0,0,.63-6.79A24.6,24.6,0,0,0,916,495.12a24.63,24.63,0,0,0,10.86-21.47,23.76,23.76,0,0,0,8.23-9.32c4.9-9.7,2.87-20.6-4.54-24.35s-17.4,1.08-22.3,10.78a23.69,23.69,0,0,0-2.63,12.15,24.63,24.63,0,0,0-10.86,21.47,24.63,24.63,0,0,0-10.86,21.47A24.64,24.64,0,0,0,873,527.33a23.76,23.76,0,0,0-8.23,9.32,25.46,25.46,0,0,0-2.08,5.74,21.18,21.18,0,0,0-4.44-4.73,25.38,25.38,0,0,0-1-4.5c-3.34-10.17-12.3-16.37-20-13.83s-11.26,12.83-7.92,23a23.07,23.07,0,0,0,7.56,11.08,25.38,25.38,0,0,0,1,4.5c1.94,5.9,5.77,10.46,10.15,12.75a23.23,23.23,0,0,0-.83,3.9,25.29,25.29,0,0,0-7.54,14.91,25.27,25.27,0,0,0-7.54,14.92,24.63,24.63,0,0,0-5,6.81c-4.91,9.7-2.88,20.61,4.53,24.35s17.4-1.07,22.31-10.78a24.62,24.62,0,0,0,2.5-8.09,25.29,25.29,0,0,0,7.54-14.91,25.27,25.27,0,0,0,7.54-14.92A25.21,25.21,0,0,0,879,571.94,25.21,25.21,0,0,0,886.56,557a24.11,24.11,0,0,0,3.39-4,23.46,23.46,0,0,0,12.27-.77,24.76,24.76,0,0,0,4.23-1.83,23.2,23.2,0,0,0,13.42-.48C930,546.61,936.23,537.65,933.7,529.93Z" transform="translate(-88.65 -57.09)" fill="#3f3d56"/><g opacity="0.1"><path d="M915.77,499.53a21.5,21.5,0,0,1-3.44,2.75,23,23,0,0,1-1.11,8.43,26.18,26.18,0,0,0,2.1-3.43A24.64,24.64,0,0,0,915.77,499.53Z" transform="translate(-88.65 -57.09)"/><path d="M926.63,478.06a21.5,21.5,0,0,1-3.44,2.75,23,23,0,0,1-1.11,8.43,25.65,25.65,0,0,0,2.1-3.44A24.85,24.85,0,0,0,926.63,478.06Z" transform="translate(-88.65 -57.09)"/><path d="M902,470.07a21.91,21.91,0,0,1,.17-4.41,24.93,24.93,0,0,0-4.78,6.57,25.63,25.63,0,0,0-1.52,3.73A22.75,22.75,0,0,1,902,470.07Z" transform="translate(-88.65 -57.09)"/><path d="M833.07,600a23.59,23.59,0,0,1,2.95-3.38,22.92,22.92,0,0,1,.87-4,25.09,25.09,0,0,0-2.29,3.71A25.59,25.59,0,0,0,833.07,600Z" transform="translate(-88.65 -57.09)"/><path d="M840.61,585.1a23.59,23.59,0,0,1,2.95-3.38,23,23,0,0,1,.83-3.9l0,0a25.68,25.68,0,0,0-2.2,3.59A26.76,26.76,0,0,0,840.61,585.1Z" transform="translate(-88.65 -57.09)"/><path d="M904.9,521a20.82,20.82,0,0,1-3.43,2.74,22.45,22.45,0,0,1-.63,6.79,18.75,18.75,0,0,1,2,.46,24.76,24.76,0,0,1,4.23-1.83c10.18-3.34,20.47.21,23,7.92a11.68,11.68,0,0,1,.32,6c3.35-3.94,4.74-8.74,3.3-13.14-2.54-7.71-12.84-11.26-23-7.92a24.76,24.76,0,0,0-4.23,1.83c-.65-.18-1.32-.34-2-.46C904.65,522.59,904.79,521.8,904.9,521Z" transform="translate(-88.65 -57.09)"/><path d="M829.35,607.49a25.09,25.09,0,0,0-2.29,3.71,26.56,26.56,0,0,0-1.54,3.74,24.48,24.48,0,0,1,3-3.4A22.92,22.92,0,0,1,829.35,607.49Z" transform="translate(-88.65 -57.09)"/><path d="M891.09,491.54a22,22,0,0,1,.17-4.41,24.93,24.93,0,0,0-4.78,6.57,25.63,25.63,0,0,0-1.52,3.73A22.75,22.75,0,0,1,891.09,491.54Z" transform="translate(-88.65 -57.09)"/><path d="M875.4,579.1a24.29,24.29,0,0,1-1,4.38,26.67,26.67,0,0,0,2.09-3.44,25.49,25.49,0,0,0,1.63-4A24.23,24.23,0,0,1,875.4,579.1Z" transform="translate(-88.65 -57.09)"/><path d="M860.32,608.92a24.15,24.15,0,0,1-1,4.38,25.65,25.65,0,0,0,2.1-3.44,26.47,26.47,0,0,0,1.63-4A23.57,23.57,0,0,1,860.32,608.92Z" transform="translate(-88.65 -57.09)"/><path d="M867.86,594a24.11,24.11,0,0,1-1,4.38A26.67,26.67,0,0,0,869,595a25.49,25.49,0,0,0,1.63-4A24.23,24.23,0,0,1,867.86,594Z" transform="translate(-88.65 -57.09)"/><path d="M882.94,564.19a24,24,0,0,1-1,4.37,25.89,25.89,0,0,0,2.09-3.43,25.48,25.48,0,0,0,1.64-4.07A23.22,23.22,0,0,1,882.94,564.19Z" transform="translate(-88.65 -57.09)"/><path d="M833.57,526.48c7.72-2.53,16.68,3.66,20,13.83a25.68,25.68,0,0,1,1,4.51,21.18,21.18,0,0,1,4.44,4.73,25.53,25.53,0,0,1,2.08-5.75c.35-.68.73-1.33,1.12-2a21.07,21.07,0,0,0-4-4.18,25.38,25.38,0,0,0-1-4.5c-3.34-10.17-12.3-16.37-20-13.83-4.4,1.44-7.44,5.41-8.62,10.43A11.69,11.69,0,0,1,833.57,526.48Z" transform="translate(-88.65 -57.09)"/><path d="M869.37,534.48a21.85,21.85,0,0,1,.18-4.4,24.73,24.73,0,0,0-4.79,6.57,25.07,25.07,0,0,0-1.52,3.72A23,23,0,0,1,869.37,534.48Z" transform="translate(-88.65 -57.09)"/><path d="M880.23,513a21.85,21.85,0,0,1,.18-4.4,24.52,24.52,0,0,0-4.79,6.56,25.63,25.63,0,0,0-1.52,3.73A22.75,22.75,0,0,1,880.23,513Z" transform="translate(-88.65 -57.09)"/><path d="M852.78,623.83a24.25,24.25,0,0,1-1,4.39,25.73,25.73,0,0,0,3.73-7.49A23.57,23.57,0,0,1,852.78,623.83Z" transform="translate(-88.65 -57.09)"/></g><path d="M948.52,430.7Line truncated
=======
<svg xmlns="http://www.w3.org/2000/svg" width="799.031" height="618.112" viewBox="0 0 799.031 618.112" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/"><g transform="translate(-893 -197)"><path d="M15.18,488.763c0,.872.478,1.573,1.073,1.573h535.1c.6,0,1.073-.7,1.073-1.573s-.478-1.573-1.073-1.573H16.253C15.658,487.191,15.18,487.891,15.18,488.763Z" transform="translate(1007.711 324.776)" fill="#ccc"/><rect width="19.105" height="3.371" transform="translate(1198.162 808.354)" fill="#b6b3c5"/><rect width="19.105" height="3.371" transform="translate(1367.295 808.917)" fill="#b6b3c5"/><path d="M352.955,370.945a27.529,27.529,0,0,1-54.321,0H229.146V521.536h193.3V370.945Z" transform="translate(966.721 287.378)" fill="#d6d6e3"/><rect width="193.296" height="5.242" transform="translate(1196.43 796.983)" fill="#090814"/><path d="M788.255,487.17H10.776A10.788,10.788,0,0,1,0,476.394V32.688A10.788,10.788,0,0,1,10.776,21.911H788.255a10.789,10.789,0,0,1,10.776,10.776V476.394a10.789,10.789,0,0,1-10.776,10.776Z" transform="translate(893 175.089)" fill="#090814"/><rect width="760.822" height="429.297" transform="translate(911.104 213.968)" fill="#fff"/><g transform="translate(20.477 16.308)"><path d="M604.463,379.271H317.442a8.655,8.655,0,0,1-8.645-8.645V273.8a8.655,8.655,0,0,1,8.645-8.645H604.463a8.655,8.655,0,0,1,8.645,8.645v96.826a8.655,8.655,0,0,1-8.645,8.645Z" transform="translate(811.648 85.826)" fill="#6c63ff"/><rect width="76.078" height="8.645" rx="2" transform="translate(1165.4 380.374)" fill="#fff"/><ellipse cx="5.187" cy="5.187" rx="5.187" ry="5.187" transform="translate(1336.576 380.374)" fill="#090814"/><ellipse cx="5.187" cy="5.187" rx="5.187" ry="5.187" transform="translate(1353.865 380.374)" fill="#090814"/><ellipse cx="5.187" cy="5.187" rx="5.187" ry="5.187" transform="translate(1371.156 380.374)" fill="#090814"/></g><ellipse cx="40.952" cy="40.952" rx="40.952" ry="40.952" transform="translate(1404.281 440.452)" fill="#090814"/><path d="M10.863-57.7l-.524-29.6h8.246l-.554,29.6Zm3.613,14.307a4.7,4.7,0,0,1-3.409-1.3,4.368,4.368,0,0,1-1.34-3.278,4.39,4.39,0,0,1,1.34-3.322,4.732,4.732,0,0,1,3.409-1.282,4.732,4.732,0,0,1,3.409,1.282,4.39,4.39,0,0,1,1.34,3.322,4.368,4.368,0,0,1-1.34,3.278A4.7,4.7,0,0,1,14.476-43.394Z" transform="translate(1430.76 546.754)" fill="#fff"/></g></svg>
>>>>>>> fdca37a (- Added createStream methods and fixed multiple errors views)

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 40 KiB

+1 -1
View File
@@ -22,7 +22,7 @@
{% slot "week.heading", $day, $month, $year %} {% slot "week.heading", $day, $month, $year %}
<div class="day-box"> <div class="day-box">
{# Random calendar date that starts on a sunday #} {# Random calendar date that starts on a sunday #}
{{ substr(( new Date("2019-12-$day") )->formatLocale("%A"), 0, 3) }} {{ new Date("2019-12-$day")->formatLocaleIntl(\IntlDateFormatter::SHORT, \IntlDateFormatter::NONE, 'EEE') }}
</div> </div>
{% endslot %} {% endslot %}
{% endforeach %} {% endforeach %}
+1 -11
View File
@@ -5,14 +5,4 @@
if ($context && ! in_array($context, $messageList)) { if ($context && ! in_array($context, $messageList)) {
$messageList[] = $context; $messageList[] = $context;
} }
%} %}{% block "lean/block/message", $messageList %}{% endblock %}
{% if $messageList %}
<div class="message-wrapper">{% php
foreach($messageList as $name => $context) {
foreach($context->messages ?? [] as $message) {
echo $message->render();
}
}
%}</div>
{% endif %}