Add Hono app for the project.

This commit is contained in:
Dave Smith-Hayes 2024-03-02 11:48:37 -05:00
parent dda9cf2fe2
commit 91c2d7b9fd
62 changed files with 61 additions and 11067 deletions

3
app/.editorconfig Normal file
View File

@ -0,0 +1,3 @@
[*.{js,jsx,ts,tsx}]
indent_style = space
indent_size = 2

8
app/.gitignore vendored
View File

@ -1,7 +1 @@
/.phpcs-cache
/.psalm-cache
/.phpunit.cache
/clover.xml
/coveralls-upload.json
/phpunit.xml
/vendor/
node_modules

View File

@ -1,5 +0,0 @@
#!/bin/bash
# Due to the fact that we are disabling plugins when installing/updating/downgrading composer dependencies
# we have to manually enable the coding standard here.
composer enable-codestandard

View File

@ -1 +0,0 @@
Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. (https://getlaminas.org/)

View File

@ -1,26 +0,0 @@
Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
- Neither the name of Laminas Foundation nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,3 +1,11 @@
# Slovocast
To install dependencies:
```sh
bun install
```
A simple Podcast hosting application built on top of Laminas Mezzio framework.
To run:
```sh
bun run dev
```
open http://localhost:3000

View File

@ -1,39 +0,0 @@
<?php
declare(strict_types=1);
chdir(__DIR__ . '/../');
require 'vendor/autoload.php';
$config = include 'config/config.php';
if (! isset($config['config_cache_path'])) {
echo "No configuration cache path found" . PHP_EOL;
exit(0);
}
if (! file_exists($config['config_cache_path'])) {
printf(
"Configured config cache file '%s' not found%s",
$config['config_cache_path'],
PHP_EOL
);
exit(0);
}
if (false === unlink($config['config_cache_path'])) {
printf(
"Error removing config cache file '%s'%s",
$config['config_cache_path'],
PHP_EOL
);
exit(1);
}
printf(
"Removed configured config cache file '%s'%s",
$config['config_cache_path'],
PHP_EOL
);
exit(0);

BIN
app/bun.lockb Executable file

Binary file not shown.

View File

@ -1,115 +0,0 @@
{
"name": "mezzio/mezzio-skeleton",
"description": "Laminas mezzio skeleton. Begin developing PSR-15 middleware applications in seconds!",
"type": "project",
"license": "BSD-3-Clause",
"keywords": [
"laminas",
"mezzio",
"skeleton",
"middleware",
"psr",
"psr-7",
"psr-11",
"psr-15"
],
"homepage": "https://mezzio.dev",
"support": {
"docs": "https://docs.mezzio.dev/mezzio/",
"issues": "https://github.com/mezzio/mezzio-skeleton/issues",
"source": "https://github.com/mezzio/mezzio-skeleton",
"rss": "https://github.com/mezzio/mezzio-skeleton/releases.atom",
"chat": "https://laminas.dev/chat",
"forum": "https://discourse.laminas.dev"
},
"config": {
"sort-packages": true,
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true,
"composer/package-versions-deprecated": true,
"laminas/laminas-component-installer": true
},
"platform": {
"php": "8.1.99"
}
},
"extra": {
"laminas": {
"component-whitelist": [
"mezzio/mezzio",
"mezzio/mezzio-helpers",
"mezzio/mezzio-router",
"laminas/laminas-httphandlerrunner",
"mezzio/mezzio-fastroute",
"mezzio/mezzio-platesrenderer"
]
}
},
"require": {
"php": "~8.1.0 || ~8.2.0 || ~8.3.0",
"ext-pdo": "*",
"composer/package-versions-deprecated": "^1.10.99",
"elie29/zend-phpdi-config": "^9.0",
"laminas/laminas-component-installer": "^2.6 || ^3.0",
"laminas/laminas-config-aggregator": "^1.6",
"laminas/laminas-diactoros": "^3.0.0",
"laminas/laminas-stdlib": "^3.6",
"mezzio/mezzio": "^3.7",
"mezzio/mezzio-authentication-session": "^1.9",
"mezzio/mezzio-fastroute": "^3.11.0",
"mezzio/mezzio-helpers": "^5.7",
"mezzio/mezzio-platesrenderer": "^2.10"
},
"require-dev": {
"filp/whoops": "^2.15.4",
"laminas/laminas-coding-standard": "~2.5.0",
"laminas/laminas-development-mode": "^3.12.0",
"mezzio/mezzio-tooling": "^2.9",
"phpunit/phpunit": "^10.5.5",
"psalm/plugin-phpunit": "^0.18.4",
"roave/security-advisories": "dev-master",
"vimeo/psalm": "^5.18"
},
"autoload": {
"psr-4": {
"App\\": "src/App/src/"
}
},
"autoload-dev": {
"psr-4": {
"AppTest\\": "test/AppTest/"
}
},
"scripts": {
"post-create-project-cmd": [
"@development-enable"
],
"post-install-cmd": "@clear-config-cache",
"post-update-cmd": "@clear-config-cache",
"development-disable": "laminas-development-mode disable",
"development-enable": "laminas-development-mode enable",
"development-status": "laminas-development-mode status",
"mezzio": "laminas --ansi",
"check": [
"@cs-check",
"@test"
],
"clear-config-cache": "php bin/clear-config-cache.php",
"enable-codestandard": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run",
"cs-check": "phpcs",
"cs-fix": "phpcbf",
"serve": [
"Composer\\Config::disableProcessTimeout",
"php -S 0.0.0.0:8080 -t public/"
],
"static-analysis": "psalm --stats",
"static-analysis-update-baseline": "psalm --stats --update-baseline",
"test": "phpunit --colors=always",
"test-coverage": "phpunit --colors=always --coverage-clover clover.xml"
},
"scripts-descriptions": {
"clear-config-cache": "Clears merged config cache. Required for config changes to be applied.",
"static-analysis": "Run static analysis tool Psalm.",
"static-analysis-update-baseline": "Run static analysis tool Psalm and update baseline."
}
}

7427
app/composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
development.config.php

View File

@ -1,2 +0,0 @@
local.php
*.local.php

View File

@ -1,32 +0,0 @@
<?php
declare(strict_types=1);
use Mezzio\Authentication\AuthenticationInterface;
use Mezzio\Authentication\Session\PhpSession;
use Mezzio\Authentication\UserRepository\PdoDatabase;
use Mezzio\Authentication\UserRepositoryInterface;
return [
// Provides application-wide services.
// We recommend using fully-qualified class names whenever possible as
// service names.
'dependencies' => [
// Use 'aliases' to alias a service name to another service. The
// key is the alias name, the value is the service to which it points.
'aliases' => [
AuthenticationInterface::class => PhpSession::class,
UserRepositoryInterface::class => PdoDatabase::class,
],
// Use 'invokables' for constructor-less services, or services that do
// not require arguments to the constructor. Map a service name to the
// class name.
'invokables' => [
// Fully\Qualified\InterfaceName::class => Fully\Qualified\ClassName::class,
],
// Use 'factories' for services provided by callbacks/factory classes.
'factories' => [
// Fully\Qualified\ClassName::class => Fully\Qualified\FactoryName::class,
],
],
];

View File

@ -1,35 +0,0 @@
<?php
declare(strict_types=1);
// phpcs:disable PSR12.Files.FileHeader.IncorrectOrder
/**
* Development-only configuration.
*
* Put settings you want enabled when under development mode in this file, and
* check it into your repository.
*
* Developers on your team will then automatically enable them by calling on
* `composer development-enable`.
*/
use Mezzio\Container;
use Mezzio\Middleware\ErrorResponseGenerator;
return [
'dependencies' => [
'factories' => [
ErrorResponseGenerator::class => Container\WhoopsErrorResponseGeneratorFactory::class,
'Mezzio\Whoops' => Container\WhoopsFactory::class,
'Mezzio\WhoopsPageHandler' => Container\WhoopsPageHandlerFactory::class,
],
],
'whoops' => [
'json_exceptions' => [
'display' => true,
'show_trace' => true,
'ajax_only' => true,
],
],
];

View File

@ -1,13 +0,0 @@
<?php
/**
* Local configuration.
*
* Copy this file to `local.php` and change its settings as required.
* `local.php` is ignored by git and safe to use for local and sensitive data like usernames and passwords.
*/
declare(strict_types=1);
return [
];

View File

@ -1,19 +0,0 @@
<?php
/**
* This file generated by Mezzio\Tooling\Factory\ConfigInjector.
*
* Modifications should be kept at a minimum, and restricted to adding or
* removing factory definitions; other dependency types may be overwritten
* when regenerating this file via mezzio-tooling commands.
*/
declare(strict_types=1);
return [
'dependencies' => [
'factories' => [
App\Login\LoginHandler::class => App\Login\LoginHandlerFactory::class,
],
],
];

View File

@ -1,27 +0,0 @@
<?php
declare(strict_types=1);
use Laminas\ConfigAggregator\ConfigAggregator;
return [
// Toggle the configuration cache. Set this to boolean false, or remove the
// directive, to disable configuration caching. Toggling development mode
// will also disable it by default; clear the configuration cache using
// `composer clear-config-cache`.
ConfigAggregator::ENABLE_CACHE => true,
// Enable debugging; typically used to provide debugging information within templates.
'debug' => false,
'mezzio' => [
// Provide templates for the error handling middleware to use when
// generating responses.
'error_handler' => [
'template_404' => 'error::404',
'template_error' => 'error::error',
],
],
'authentication' => [
'redirect' => '/login',
],
];

View File

@ -1,54 +0,0 @@
<?php
declare(strict_types=1);
use Laminas\ConfigAggregator\ArrayProvider;
use Laminas\ConfigAggregator\ConfigAggregator;
use Laminas\ConfigAggregator\PhpFileProvider;
use Mezzio\Helper\ConfigProvider;
// To enable or disable caching, set the `ConfigAggregator::ENABLE_CACHE` boolean in
// `config/autoload/local.php`.
$cacheConfig = [
'config_cache_path' => 'data/cache/config-cache.php',
];
$aggregator = new ConfigAggregator([
\Mezzio\Authentication\Session\ConfigProvider::class,
\Mezzio\Authentication\ConfigProvider::class,
\Mezzio\Session\ConfigProvider::class,
\Mezzio\Tooling\ConfigProvider::class,
\Mezzio\Plates\ConfigProvider::class,
\Mezzio\Helper\ConfigProvider::class,
\Mezzio\Router\FastRouteRouter\ConfigProvider::class,
\Laminas\HttpHandlerRunner\ConfigProvider::class,
// Include cache configuration
new ArrayProvider($cacheConfig),
ConfigProvider::class,
\Mezzio\ConfigProvider::class,
\Mezzio\Router\ConfigProvider::class,
\Laminas\Diactoros\ConfigProvider::class,
// Swoole config to overwrite some services (if installed)
class_exists(\Mezzio\Swoole\ConfigProvider::class)
? \Mezzio\Swoole\ConfigProvider::class
: function (): array {
return [];
},
// Default App module config
App\ConfigProvider::class,
// Load application config in a pre-defined order in such a way that local settings
// overwrite global settings. (Loaded as first to last):
// - `global.php`
// - `*.global.php`
// - `local.php`
// - `*.local.php`
new PhpFileProvider(realpath(__DIR__) . '/autoload/{{,*.}global,{,*.}local}.php'),
// Load development config if it exists
new PhpFileProvider(realpath(__DIR__) . '/development.config.php'),
], $cacheConfig['config_cache_path']);
return $aggregator->getMergedConfig();

View File

@ -1,15 +0,0 @@
<?php
declare(strict_types=1);
use Elie\PHPDI\Config\Config;
use Elie\PHPDI\Config\ContainerFactory;
use Psr\Container\ContainerInterface;
// Protect variables from global scope
return (static function (): ContainerInterface {
$config = require __DIR__ . '/config.php';
$factory = new ContainerFactory();
return $factory(new Config($config));
})();

View File

@ -1,31 +0,0 @@
<?php
/**
* File required to allow enablement of development mode.
*
* For use with the laminas-development-mode tool.
*
* Usage:
* $ composer development-disable
* $ composer development-enable
* $ composer development-status
*
* DO NOT MODIFY THIS FILE.
*
* Provide your own development-mode settings by editing the file
* `config/autoload/development.local.php.dist`.
*
* Because this file is aggregated last, it simply ensures:
*
* - The `debug` flag is _enabled_.
* - Configuration caching is _disabled_.
*/
declare(strict_types=1);
use Laminas\ConfigAggregator\ConfigAggregator;
return [
'debug' => true,
ConfigAggregator::ENABLE_CACHE => false,
];

View File

@ -1,77 +0,0 @@
<?php
declare(strict_types=1);
use Laminas\Stratigility\Middleware\ErrorHandler;
use Mezzio\Application;
use Mezzio\Handler\NotFoundHandler;
use Mezzio\Helper\ServerUrlMiddleware;
use Mezzio\Helper\UrlHelperMiddleware;
use Mezzio\MiddlewareFactory;
use Mezzio\Router\Middleware\DispatchMiddleware;
use Mezzio\Router\Middleware\ImplicitHeadMiddleware;
use Mezzio\Router\Middleware\ImplicitOptionsMiddleware;
use Mezzio\Router\Middleware\MethodNotAllowedMiddleware;
use Mezzio\Router\Middleware\RouteMiddleware;
use Psr\Container\ContainerInterface;
/**
* Setup middleware pipeline:
*/
return function (Application $app, MiddlewareFactory $factory, ContainerInterface $container): void {
// The error handler should be the first (most outer) middleware to catch
// all Exceptions.
$app->pipe(ErrorHandler::class);
$app->pipe(ServerUrlMiddleware::class);
// Pipe more middleware here that you want to execute on every request:
// - bootstrapping
// - pre-conditions
// - modifications to outgoing responses
//
// Piped Middleware may be either callables or service names. Middleware may
// also be passed as an array; each item in the array must resolve to
// middleware eventually (i.e., callable or service name).
//
// Middleware can be attached to specific paths, allowing you to mix and match
// applications under a common domain. The handlers in each middleware
// attached this way will see a URI with the matched path segment removed.
//
// i.e., path of "/api/member/profile" only passes "/member/profile" to $apiMiddleware
// - $app->pipe('/api', $apiMiddleware);
// - $app->pipe('/docs', $apiDocMiddleware);
// - $app->pipe('/files', $filesMiddleware);
// Register the routing middleware in the middleware pipeline.
// This middleware registers the Mezzio\Router\RouteResult request attribute.
$app->pipe(RouteMiddleware::class);
// The following handle routing failures for common conditions:
// - HEAD request but no routes answer that method
// - OPTIONS request but no routes answer that method
// - method not allowed
// Order here matters; the MethodNotAllowedMiddleware should be placed
// after the Implicit*Middleware.
$app->pipe(ImplicitHeadMiddleware::class);
$app->pipe(ImplicitOptionsMiddleware::class);
$app->pipe(MethodNotAllowedMiddleware::class);
// Seed the UrlHelper with the routing results:
$app->pipe(UrlHelperMiddleware::class);
// Add more middleware here that needs to introspect the routing results; this
// might include:
//
// - route-based authentication
// - route-based validation
// - etc.
// Register the dispatch middleware in the middleware pipeline
$app->pipe(DispatchMiddleware::class);
// At this point, if no Response is returned by any middleware, the
// NotFoundHandler kicks in; alternately, you can provide other fallback
// middleware to execute.
$app->pipe(NotFoundHandler::class);
};

View File

@ -1,43 +0,0 @@
<?php
declare(strict_types=1);
use Mezzio\Application;
use Mezzio\MiddlewareFactory;
use Psr\Container\ContainerInterface;
/**
* FastRoute route configuration
*
* @see https://github.com/nikic/FastRoute
*
* Setup routes with a single request method:
*
* $app->get('/', App\Handler\HomePageHandler::class, 'home');
* $app->post('/album', App\Handler\AlbumCreateHandler::class, 'album.create');
* $app->put('/album/{id:\d+}', App\Handler\AlbumUpdateHandler::class, 'album.put');
* $app->patch('/album/{id:\d+}', App\Handler\AlbumUpdateHandler::class, 'album.patch');
* $app->delete('/album/{id:\d+}', App\Handler\AlbumDeleteHandler::class, 'album.delete');
*
* Or with multiple request methods:
*
* $app->route('/contact', App\Handler\ContactHandler::class, ['GET', 'POST', ...], 'contact');
*
* Or handling all request methods:
*
* $app->route('/contact', App\Handler\ContactHandler::class)->setName('contact');
*
* or:
*
* $app->route(
* '/contact',
* App\Handler\ContactHandler::class,
* Mezzio\Router\Route::HTTP_METHOD_ANY,
* 'contact'
* );
*/
return static function (Application $app, MiddlewareFactory $factory, ContainerInterface $container): void {
$app->get('/', App\Handler\HomePageHandler::class, 'home');
$app->get('/api/ping', App\Handler\PingHandler::class, 'api.ping');
};

4
app/data/.gitignore vendored
View File

@ -1,4 +0,0 @@
*
!cache
!cache/.gitkeep
!.gitignore

View File

11
app/package.json Normal file
View File

@ -0,0 +1,11 @@
{
"scripts": {
"dev": "bun run --hot src/index.ts"
},
"dependencies": {
"hono": "^4.0.8"
},
"devDependencies": {
"@types/bun": "latest"
}
}

View File

@ -1,32 +0,0 @@
<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/squizlabs/php_codesniffer/phpcs.xsd">
<arg name="basepath" value="."/>
<arg name="cache" value=".phpcs-cache"/>
<arg name="colors"/>
<arg name="extensions" value="php"/>
<arg name="parallel" value="80"/>
<!-- Show progress -->
<arg value="p"/>
<!-- Paths to check -->
<file>config</file>
<file>src</file>
<file>test</file>
<exclude-pattern>config/config.php</exclude-pattern>
<exclude-pattern>config/routes.php</exclude-pattern>
<!-- Include all rules from the Laminas Coding Standard -->
<rule ref="LaminasCodingStandard"/>
<rule ref="Squiz.Classes.ClassFileName.NoMatch">
<exclude-pattern>src/ConfigProvider.*.php</exclude-pattern>
</rule>
<rule ref="PSR12.Files.FileHeader.IncorrectOrder">
<exclude-pattern>config/pipeline.php</exclude-pattern>
<exclude-pattern>src/MezzioInstaller/Resources/config/routes-*.php</exclude-pattern>
</rule>
</ruleset>

View File

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
cacheDirectory=".phpunit.cache"
displayDetailsOnIncompleteTests="true"
displayDetailsOnSkippedTests="true"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerErrors="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
colors="true"
>
<testsuites>
<testsuite name="default">
<directory>./test</directory>
</testsuite>
</testsuites>
<source>
<include>
<directory suffix=".php">src</directory>
</include>
</source>
</phpunit>

View File

@ -1,295 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="5.18.0@b113f3ed0259fd6e212d87c3df80eec95a6abf19">
<file src="src/MezzioInstaller/OptionalPackages.php">
<ArgumentTypeCoercion>
<code><![CDATA[$this->stabilityFlags]]></code>
</ArgumentTypeCoercion>
<MixedArgument>
<code>$answer</code>
<code>$constraint</code>
<code>$filename</code>
<code>$filename</code>
<code>$package</code>
<code>$target</code>
<code><![CDATA[$this->composerDefinition['autoload']]]></code>
<code><![CDATA[$this->composerDefinition['autoload-dev']]]></code>
<code>$word</code>
</MixedArgument>
<MixedArgumentTypeCoercion>
<code>$package</code>
</MixedArgumentTypeCoercion>
<MixedArrayAccess>
<code><![CDATA[$this->composerDefinition['autoload']['psr-4']]]></code>
<code><![CDATA[$this->composerDefinition['autoload']['psr-4']['MezzioInstaller\\']]]></code>
<code><![CDATA[$this->composerDefinition['autoload-dev']['psr-4']]]></code>
<code><![CDATA[$this->composerDefinition['autoload-dev']['psr-4']['MezzioInstallerTest\\']]]></code>
<code><![CDATA[$this->composerDefinition['scripts']['pre-install-cmd']]]></code>
<code><![CDATA[$this->composerDefinition['scripts']['pre-update-cmd']]]></code>
</MixedArrayAccess>
<MixedArrayAssignment>
<code><![CDATA[$this->composerDefinition['autoload']['psr-4']]]></code>
<code><![CDATA[$this->composerDefinition['autoload']['psr-4']['App\\']]]></code>
<code><![CDATA[$this->composerDefinition['require'][$packageName]]]></code>
<code><![CDATA[$this->composerDefinition['require-dev'][$packageName]]]></code>
<code><![CDATA[$this->composerDefinition['scripts']['cs-check']]]></code>
<code><![CDATA[$this->composerDefinition['scripts']['cs-fix']]]></code>
</MixedArrayAssignment>
<MixedAssignment>
<code>$answer</code>
<code>$answer</code>
<code>$constraint</code>
<code>$fileInfo</code>
<code>$filename</code>
<code>$package</code>
<code>$target</code>
<code><![CDATA[$this->composerDefinition]]></code>
</MixedAssignment>
<MixedMethodCall>
<code>isDir</code>
</MixedMethodCall>
<MixedPropertyTypeCoercion>
<code><![CDATA[$this->composerDefinition]]></code>
<code><![CDATA[$this->composerDefinition]]></code>
<code><![CDATA[$this->composerDefinition]]></code>
</MixedPropertyTypeCoercion>
<NoValue>
<code><![CDATA[$this->installType]]></code>
</NoValue>
<PossiblyInvalidArgument>
<code>$resource</code>
</PossiblyInvalidArgument>
<PossiblyInvalidIterator>
<code><![CDATA[$question['options'][$answer][$this->installType]]]></code>
</PossiblyInvalidIterator>
<PossiblyNullArgument>
<code>$content</code>
</PossiblyNullArgument>
<PossiblyUnusedMethod>
<code>install</code>
</PossiblyUnusedMethod>
<PropertyTypeCoercion>
<code><![CDATA[require __DIR__ . '/config.php']]></code>
</PropertyTypeCoercion>
</file>
<file src="test/AppTest/Handler/PingHandlerTest.php">
<MixedArgument>
<code>$json</code>
</MixedArgument>
<MixedAssignment>
<code>$json</code>
</MixedAssignment>
<MixedPropertyFetch>
<code><![CDATA[$json->ack]]></code>
</MixedPropertyFetch>
</file>
<file src="test/MezzioInstallerTest/AddPackageTest.php">
<MixedArgument>
<code>$stabilityFlags</code>
</MixedArgument>
<MixedAssignment>
<code>$stabilityFlags</code>
</MixedAssignment>
<MixedInferredReturnType>
<code>array</code>
</MixedInferredReturnType>
</file>
<file src="test/MezzioInstallerTest/ContainersTest.php">
<MixedArgument>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
</MixedArrayAccess>
</file>
<file src="test/MezzioInstallerTest/ErrorHandlerTest.php">
<MixedArgument>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['error-handler']]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$config['dependencies']]]></code>
<code><![CDATA[$config['dependencies']['factories']]]></code>
<code><![CDATA[$config['dependencies']['factories'][ErrorResponseGenerator::class]]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['error-handler']]]></code>
</MixedArrayAccess>
<MixedAssignment>
<code>$config</code>
</MixedAssignment>
<MixedInferredReturnType>
<code>array</code>
</MixedInferredReturnType>
</file>
<file src="test/MezzioInstallerTest/HomePageResponseTest.php">
<MixedArgument>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
<code><![CDATA[$config['questions']['template-engine']]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
<code><![CDATA[$config['questions']['template-engine']]]></code>
</MixedArrayAccess>
<MoreSpecificReturnType>
<code><![CDATA[Generator<string, array{
* 0: OptionalPackages::INSTALL_*,
* 1: int,
* 2: int,
* 3: class-string<TemplateRendererInterface>,
* 4: string,
* 5: string
* }>]]></code>
<code><![CDATA[Generator<string, array{
* 0: OptionalPackages::INSTALL_*,
* 1: int,
* 2: string,
* 3: string,
* 4: int,
* 5: class-string<RouterInterface>,
* 6: string,
* 7: string
* }>]]></code>
</MoreSpecificReturnType>
<PossiblyInvalidArrayOffset>
<code>self::$expectedContainerAttributes[$containerClass]</code>
<code>self::$expectedContainerAttributes[$containerClass]</code>
<code>self::$expectedRouterAttributes[$routerClass]</code>
<code>self::$rendererConfigProviders[$rendererClass]</code>
<code>self::$routerConfigProviders[$routerClass]</code>
</PossiblyInvalidArrayOffset>
</file>
<file src="test/MezzioInstallerTest/OptionalPackagesTestCase.php">
<MixedArgument>
<code><![CDATA[$properties['devDependencies']]]></code>
<code><![CDATA[$r->getValue($installer)]]></code>
<code><![CDATA[$r->getValue($installer)]]></code>
<code>$whitelist</code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$composerJson['require']]]></code>
<code><![CDATA[$composerJson['require-dev']]]></code>
<code><![CDATA[$r->getValue($installer)['extra']]]></code>
</MixedArrayAccess>
<MixedAssignment>
<code>$composerJson</code>
<code>$whitelist</code>
</MixedAssignment>
<MixedInferredReturnType>
<code>array</code>
<code>array</code>
</MixedInferredReturnType>
<MixedReturnStatement>
<code><![CDATA[$this->getInstallerProperty($installer, 'composerDefinition')]]></code>
<code><![CDATA[$this->getInstallerProperty($installer, 'config')]]></code>
</MixedReturnStatement>
<PossiblyUnusedProperty>
<code>$composerData</code>
</PossiblyUnusedProperty>
</file>
<file src="test/MezzioInstallerTest/ProcessAnswersTest.php">
<MixedArgument>
<code>$question</code>
<code>$question</code>
<code>$question</code>
<code>$question</code>
<code>$question</code>
<code>$question</code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['template-engine']]]></code>
</MixedArrayAccess>
<MixedAssignment>
<code>$question</code>
<code>$question</code>
<code>$question</code>
<code>$question</code>
<code>$question</code>
<code>$question</code>
</MixedAssignment>
</file>
<file src="test/MezzioInstallerTest/ProjectSandboxTrait.php">
<MixedArgumentTypeCoercion>
<code><![CDATA[$this->autoloader]]></code>
</MixedArgumentTypeCoercion>
<MixedAssignment>
<code><![CDATA[$this->container]]></code>
</MixedAssignment>
<MixedInferredReturnType>
<code>ContainerInterface</code>
</MixedInferredReturnType>
<UnresolvableInclude>
<code>require $path</code>
</UnresolvableInclude>
</file>
<file src="test/MezzioInstallerTest/RemoveDevDependenciesTest.php">
<MixedAssignment>
<code><![CDATA[$this->devDependencies]]></code>
</MixedAssignment>
</file>
<file src="test/MezzioInstallerTest/RequestInstallTypeTest.php">
<MixedInferredReturnType>
<code>array</code>
</MixedInferredReturnType>
</file>
<file src="test/MezzioInstallerTest/RoutersTest.php">
<MixedArgument>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$config['dependencies']]]></code>
<code><![CDATA[$config['dependencies'][$dependencyKey]]]></code>
<code><![CDATA[$config['dependencies'][$dependencyKey][RouterInterface::class]]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
</MixedArrayAccess>
<MixedAssignment>
<code>$config</code>
</MixedAssignment>
<MixedInferredReturnType>
<code>array</code>
</MixedInferredReturnType>
</file>
<file src="test/MezzioInstallerTest/SetupDataAndCacheDirTest.php">
<UnusedProperty>
<code>$project</code>
</UnusedProperty>
</file>
<file src="test/MezzioInstallerTest/TemplateRenderersTest.php">
<MixedArgument>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
<code><![CDATA[$config['questions']['template-engine']]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$config['dependencies']]]></code>
<code><![CDATA[$config['dependencies']['factories']]]></code>
<code><![CDATA[$config['dependencies']['factories'][ErrorHandler::class]]]></code>
<code><![CDATA[$config['questions']['container']]]></code>
<code><![CDATA[$config['questions']['router']]]></code>
<code><![CDATA[$config['questions']['template-engine']]]></code>
</MixedArrayAccess>
<MixedAssignment>
<code>$config</code>
</MixedAssignment>
</file>
<file src="test/MezzioInstallerTest/UpdateRootPackageTest.php">
<MixedArgumentTypeCoercion>
<code>$property</code>
</MixedArgumentTypeCoercion>
</file>
</files>

View File

@ -1,23 +0,0 @@
<?xml version="1.0"?>
<psalm
cacheDirectory="./.psalm-cache"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
errorLevel="1"
findUnusedPsalmSuppress="true"
findUnusedCode="true"
findUnusedBaselineEntry="true"
errorBaseline="psalm-baseline.xml"
>
<projectFiles>
<directory name="src"/>
<directory name="test"/>
<ignoreFiles>
<directory name="vendor"/>
</ignoreFiles>
</projectFiles>
<plugins>
<pluginClass class="Psalm\PhpUnitPlugin\Plugin"/>
</plugins>
</psalm>

View File

@ -1,19 +0,0 @@
RewriteEngine On
# The following rule allows authentication to work with fast-cgi
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [NC,L]
# The following rewrites all other queries to index.php. The
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting, the base path will be prepended to
# allow proper resolution of the index.php file; it will work
# in non-aliased environments as well, providing a safe, one-size
# fits all solution.
RewriteCond $0::%{REQUEST_URI} ^([^:]*+(?::[^:]*+)*?)::(/.+?)\1$
RewriteRule .+ - [E=BASE:%2]
RewriteRule .* %{ENV:BASE}index.php [NC,L]

View File

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
// Delegate static file requests back to the PHP built-in webserver
if (PHP_SAPI === 'cli-server' && $_SERVER['SCRIPT_FILENAME'] !== __FILE__) {
return false;
}
chdir(dirname(__DIR__));
require 'vendor/autoload.php';
/**
* Self-called anonymous function that creates its own scope and keeps the global namespace clean.
*/
(function () {
/** @var \Psr\Container\ContainerInterface $container */
$container = require 'config/container.php';
/** @var \Mezzio\Application $app */
$app = $container->get(\Mezzio\Application::class);
$factory = $container->get(\Mezzio\MiddlewareFactory::class);
// Execute programmatic/declarative middleware pipeline and routing
// configuration statements
(require 'config/pipeline.php')($app, $factory, $container);
(require 'config/routes.php')($app, $factory, $container);
$app->run();
})();

View File

@ -1,56 +0,0 @@
<?php
declare(strict_types=1);
namespace App;
/**
* The configuration provider for the App module
*
* @see https://docs.laminas.dev/laminas-component-installer/
*/
class ConfigProvider
{
/**
* Returns the configuration array
*
* To add a bit of a structure, each section is defined in a separate
* method which returns an array with its configuration.
*/
public function __invoke(): array
{
return [
'dependencies' => $this->getDependencies(),
'templates' => $this->getTemplates(),
];
}
/**
* Returns the container dependencies
*/
public function getDependencies(): array
{
return [
'invokables' => [
Handler\PingHandler::class => Handler\PingHandler::class,
],
'factories' => [
Handler\HomePageHandler::class => Handler\HomePageHandlerFactory::class,
],
];
}
/**
* Returns the templates configuration
*/
public function getTemplates(): array
{
return [
'paths' => [
'app' => [__DIR__ . '/../templates/app'],
'error' => [__DIR__ . '/../templates/error'],
'layout' => [__DIR__ . '/../templates/layout'],
],
];
}
}

View File

@ -1,37 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Handler;
use Chubbyphp\Container\MinimalContainer;
use DI\Container as PHPDIContainer;
use Laminas\Diactoros\Response\HtmlResponse;
use Laminas\Diactoros\Response\JsonResponse;
use Laminas\ServiceManager\ServiceManager;
use Mezzio\LaminasView\LaminasViewRenderer;
use Mezzio\Plates\PlatesRenderer;
use Mezzio\Router\FastRouteRouter;
use Mezzio\Router\LaminasRouter;
use Mezzio\Router\RouterInterface;
use Mezzio\Template\TemplateRendererInterface;
use Mezzio\Twig\TwigRenderer;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class HomePageHandler implements RequestHandlerInterface
{
public function __construct(
private RouterInterface $router,
private ?TemplateRendererInterface $template = null
) {
}
public function handle(ServerRequestInterface $request): ResponseInterface
{
$data = [];
return new HtmlResponse($this->template->render('app::home-page', $data));
}
}

View File

@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Handler;
use Mezzio\Router\RouterInterface;
use Mezzio\Template\TemplateRendererInterface;
use Psr\Container\ContainerInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function assert;
class HomePageHandlerFactory
{
public function __invoke(ContainerInterface $container): RequestHandlerInterface
{
$router = $container->get(RouterInterface::class);
assert($router instanceof RouterInterface);
$template = $container->has(TemplateRendererInterface::class)
? $container->get(TemplateRendererInterface::class)
: null;
assert($template instanceof TemplateRendererInterface || null === $template);
return new HomePageHandler($router, $template);
}
}

View File

@ -1,20 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Handler;
use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function time;
class PingHandler implements RequestHandlerInterface
{
public function handle(ServerRequestInterface $request): ResponseInterface
{
return new JsonResponse(['ack' => time()]);
}
}

View File

@ -1,34 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Login;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Laminas\Diactoros\Response\HtmlResponse;
use Mezzio\Template\TemplateRendererInterface;
class LoginHandler implements RequestHandlerInterface
{
/**
* @var TemplateRendererInterface
*/
private $renderer;
public function __construct(TemplateRendererInterface $renderer)
{
$this->renderer = $renderer;
}
public function handle(ServerRequestInterface $request) : ResponseInterface
{
// Do some work...
// Render and return a response:
return new HtmlResponse($this->renderer->render(
'app::login',
[] // parameters to pass to template
));
}
}

View File

@ -1,16 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Login;
use Mezzio\Template\TemplateRendererInterface;
use Psr\Container\ContainerInterface;
class LoginHandlerFactory
{
public function __invoke(ContainerInterface $container) : LoginHandler
{
return new LoginHandler($container->get(TemplateRendererInterface::class));
}
}

View File

@ -1,4 +0,0 @@
<?php $this->layout('layout::default', ['title' => 'Home']) ?>
<div>
<h1>Slovocast</h1>
</div>

View File

@ -1 +0,0 @@
Template for App\Login\LoginHandler

View File

@ -1,9 +0,0 @@
<?php $this->layout('layout::default', ['title' => '404 Not Found']) ?>
<h1>Oops!</h1>
<h2>This is awkward.</h2>
<p>We encountered a 404 Not Found error.</p>
<p>
You are looking for something that doesn't exist or may have moved. Check out one of the links on this page
or head back to <a href="/">Home</a>.
</p>

View File

@ -1,11 +0,0 @@
<?php $this->layout('layout::default', ['title' => sprintf('%d %s', $status, $reason)]) ?>
<h1>Oops!</h1>
<h2>This is awkward.</h2>
<p>We encountered a <?=$this->e($status)?> <?=$this->e($reason)?> error.</p>
<?php if ($status == 404) : ?>
<p>
You are looking for something that doesn't exist or may have moved. Check out one of the links on this page
or head back to <a href="/">Home</a>.
</p>
<?php endif; ?>

View File

@ -1,19 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title><?=$this->e($title)?> - Slovocast</title>
<?=$this->section('stylesheets')?>
</head>
<body>
<header>
<div>Slovocast</div>
</header>
<main>
<?= $this->section('content'); ?>
</main>
<?=$this->section('javascript')?>
</body>
</html>

View File

@ -0,0 +1,16 @@
import { FC } from 'hono/jsx';
const Layout: FC = (props) => {
return (
<html>
<head>
<title>{props.siteData.title}</title>
</head>
<body>
{props.children}
</body>
</html>
)
}
export default Layout;

9
app/src/index.ts Normal file
View File

@ -0,0 +1,9 @@
import { Hono } from 'hono';
const app = new Hono();
app.get('/', (c) => {
return c.text('Hello Hono!');
});
export default app;

View File

@ -0,0 +1,4 @@
export default interface SiteData {
title: string,
description: string,
};

View File

@ -1,38 +0,0 @@
<?php
declare(strict_types=1);
namespace AppTest\Handler;
use App\Handler\HomePageHandler;
use App\Handler\HomePageHandlerFactory;
use AppTest\InMemoryContainer;
use Mezzio\Router\RouterInterface;
use Mezzio\Template\TemplateRendererInterface;
use PHPUnit\Framework\TestCase;
class HomePageHandlerFactoryTest extends TestCase
{
public function testFactoryWithoutTemplate(): void
{
$container = new InMemoryContainer();
$container->setService(RouterInterface::class, $this->createMock(RouterInterface::class));
$factory = new HomePageHandlerFactory();
$homePage = $factory($container);
self::assertInstanceOf(HomePageHandler::class, $homePage);
}
public function testFactoryWithTemplate(): void
{
$container = new InMemoryContainer();
$container->setService(RouterInterface::class, $this->createMock(RouterInterface::class));
$container->setService(TemplateRendererInterface::class, $this->createMock(TemplateRendererInterface::class));
$factory = new HomePageHandlerFactory();
$homePage = $factory($container);
self::assertInstanceOf(HomePageHandler::class, $homePage);
}
}

View File

@ -1,66 +0,0 @@
<?php
declare(strict_types=1);
namespace AppTest\Handler;
use App\Handler\HomePageHandler;
use Laminas\Diactoros\Response\HtmlResponse;
use Laminas\Diactoros\Response\JsonResponse;
use Mezzio\Router\RouterInterface;
use Mezzio\Template\TemplateRendererInterface;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
class HomePageHandlerTest extends TestCase
{
/** @var ContainerInterface&MockObject */
protected $container;
/** @var RouterInterface&MockObject */
protected $router;
protected function setUp(): void
{
$this->container = $this->createMock(ContainerInterface::class);
$this->router = $this->createMock(RouterInterface::class);
}
public function testReturnsJsonResponseWhenNoTemplateRendererProvided(): void
{
$homePage = new HomePageHandler(
$this->container::class,
$this->router,
null
);
$response = $homePage->handle(
$this->createMock(ServerRequestInterface::class)
);
self::assertInstanceOf(JsonResponse::class, $response);
}
public function testReturnsHtmlResponseWhenTemplateRendererProvided(): void
{
$renderer = $this->createMock(TemplateRendererInterface::class);
$renderer
->expects($this->once())
->method('render')
->with('app::home-page', $this->isType('array'))
->willReturn('');
$homePage = new HomePageHandler(
$this->container::class,
$this->router,
$renderer
);
$response = $homePage->handle(
$this->createMock(ServerRequestInterface::class)
);
self::assertInstanceOf(HtmlResponse::class, $response);
}
}

View File

@ -1,31 +0,0 @@
<?php
declare(strict_types=1);
namespace AppTest\Handler;
use App\Handler\PingHandler;
use Laminas\Diactoros\Response\JsonResponse;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\ServerRequestInterface;
use function json_decode;
use function property_exists;
use const JSON_THROW_ON_ERROR;
class PingHandlerTest extends TestCase
{
public function testResponse(): void
{
$pingHandler = new PingHandler();
$response = $pingHandler->handle(
$this->createMock(ServerRequestInterface::class)
);
$json = json_decode((string) $response->getBody(), null, 512, JSON_THROW_ON_ERROR);
self::assertInstanceOf(JsonResponse::class, $response);
self::assertTrue(property_exists($json, 'ack') && $json->ack !== null);
}
}

View File

@ -1,47 +0,0 @@
<?php
declare(strict_types=1);
namespace AppTest;
use Psr\Container\ContainerInterface;
use RuntimeException;
use function array_key_exists;
use function sprintf;
/**
* A PSR Container stub. Useful for testing factories without excessive mocking
*/
class InMemoryContainer implements ContainerInterface
{
/** @var array<string, mixed> */
public array $services = [];
public function setService(string $name, mixed $service): void
{
$this->services[$name] = $service;
}
/**
* @param string $id
* @return mixed
*/
public function get($id)
{
if (! $this->has($id)) {
throw new RuntimeException(sprintf('Service not found "%s"', $id));
}
return $this->services[$id];
}
/**
* @param string $id
* @return bool
*/
public function has($id)
{
return array_key_exists($id, $this->services);
}
}

7
app/tsconfig.json Normal file
View File

@ -0,0 +1,7 @@
{
"compilerOptions": {
"strict": true,
"jsx": "react-jsx",
"jsxImportSource": "hono/jsx"
}
}

View File

@ -1,3 +0,0 @@
[*.{html,js,jsx,ts,tsx}]
indent_type = space
indent_size = 2

175
frontend/.gitignore vendored
View File

@ -1,175 +0,0 @@
# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore
# Logs
logs
_.log
npm-debug.log_
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Caches
.cache
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
# Runtime data
pids
_.pid
_.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# IntelliJ based IDEs
.idea
# Finder (MacOS) folder config
.DS_Store

View File

@ -1,15 +0,0 @@
# slovocast-frontend
To install dependencies:
```bash
bun install
```
To run:
```bash
bun run index.ts
```
This project was created using `bun init` in bun v1.0.24. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.

View File

@ -1,4 +0,0 @@
await Bun.build({
entrypoints: [ './src/index.ts' ],
outdir: './public/js'
});

Binary file not shown.

View File

@ -1,16 +0,0 @@
{
"name": "slovocast-frontend",
"module": "index.ts",
"type": "module",
"devDependencies": {
"@types/bun": "latest",
"@types/mithril": "^2.2.6"
},
"peerDependencies": {
"typescript": "^5.0.0"
},
"dependencies": {
"bun": "^1.0.29",
"mithril": "^2.2.2"
}
}

View File

@ -1,9 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Slovocast</title>
</head>
<body>
<script src="js/index.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +0,0 @@
import m from 'mithril';
import User from '../models/User';
const users: User[] = [
new User('U1'),
new User('U2'),
new User('U3')
];
const oninit = function () {
// get the users value
};
const view = function () {
return m('.UserList',
m('ul', users.map(u => m('li', u.getUsername())))
);
}
const UserList = { oninit, view };
export default UserList;

View File

@ -1,11 +0,0 @@
import m from 'mithril';
import UserList from './components/UserList';
const App = {
view: function() {
return m('body', [ UserList ]);
}
}
//@ts-ignore This will be rendered and run on the DOM of a web page
m.mount(document.body, App);

View File

@ -1,12 +0,0 @@
export default class User {
private username: string;
public constructor(username: string) {
this.username = username;
}
public getUsername(): string {
return this.username;
}
}

View File

@ -1,22 +0,0 @@
{
"compilerOptions": {
"lib": ["ESNext"],
"target": "ESNext",
"module": "ESNext",
"moduleDetection": "force",
"jsx": "react-jsx",
"allowJs": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"noEmit": true,
/* Linting */
"skipLibCheck": true,
"strict": true,
"noFallthroughCasesInSwitch": true,
"forceConsistentCasingInFileNames": true
}
}