diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..11abea6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,127 @@
+#-------------------------
+# Operating Specific Junk Files
+#-------------------------
+
+# OS X
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# OS X Thumbnails
+._*
+
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+# Linux
+*~
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+#-------------------------
+# Environment Files
+#-------------------------
+# These should never be under version control,
+# as it poses a security risk.
+.env
+.vagrant
+Vagrantfile
+
+#-------------------------
+# Temporary Files
+#-------------------------
+writable/cache/*
+!writable/cache/index.html
+
+writable/logs/*
+!writable/logs/index.html
+
+writable/session/*
+!writable/session/index.html
+
+writable/uploads/*
+!writable/uploads/index.html
+
+writable/debugbar/*
+
+php_errors.log
+
+#-------------------------
+# User Guide Temp Files
+#-------------------------
+user_guide_src/build/*
+user_guide_src/cilexer/build/*
+user_guide_src/cilexer/dist/*
+user_guide_src/cilexer/pycilexer.egg-info/*
+
+#-------------------------
+# Test Files
+#-------------------------
+tests/coverage*
+
+# Don't save phpunit under version control.
+phpunit
+
+#-------------------------
+# Composer
+#-------------------------
+vendor/
+
+#-------------------------
+# IDE / Development Files
+#-------------------------
+
+# Modules Testing
+_modules/*
+
+# phpenv local config
+.php-version
+
+# Jetbrains editors (PHPStorm, etc)
+.idea/
+*.iml
+
+# Netbeans
+nbproject/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+.nb-gradle/
+
+# Sublime Text
+*.tmlanguage.cache
+*.tmPreferences.cache
+*.stTheme.cache
+*.sublime-workspace
+*.sublime-project
+.phpintel
+/api/
+
+# Visual Studio Code
+.vscode/
+
+/results/
+/phpunit*.xml
+/.phpunit.*.cache
+
diff --git a/.htaccess b/.htaccess
new file mode 100644
index 0000000..f24db0a
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,6 @@
+
+ Require all denied
+
+
+ Deny from all
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..fd00a52
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+# codeigniter-ajax
+How to fetch user records in Codeigniter 4 application from MySQL database using AJAX web development technique.
+
+[Codeigniter 4 AJAX Tutorial – Fetch Data from Database](https://www.positronx.io/codeigniter-ajax-tutorial-fetch-data-from-database/)
+
+
diff --git a/app/Common.php b/app/Common.php
new file mode 100644
index 0000000..780ba3f
--- /dev/null
+++ b/app/Common.php
@@ -0,0 +1,15 @@
+ SYSTEMPATH,
+ * 'App' => APPPATH
+ * ];
+ *
+ * @var array
+ */
+ public $psr4 = [
+ APP_NAMESPACE => APPPATH, // For custom app namespace
+ 'Config' => APPPATH . 'Config',
+ ];
+
+ /**
+ * -------------------------------------------------------------------
+ * Class Map
+ * -------------------------------------------------------------------
+ * The class map provides a map of class names and their exact
+ * location on the drive. Classes loaded in this manner will have
+ * slightly faster performance because they will not have to be
+ * searched for within one or more directories as they would if they
+ * were being autoloaded through a namespace.
+ *
+ * Prototype:
+ *
+ * $classmap = [
+ * 'MyClass' => '/path/to/class/file.php'
+ * ];
+ *
+ * @var array
+ */
+ public $classmap = [];
+}
diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php
new file mode 100644
index 0000000..63fdd88
--- /dev/null
+++ b/app/Config/Boot/development.php
@@ -0,0 +1,32 @@
+ '127.0.0.1',
+ 'port' => 11211,
+ 'weight' => 1,
+ 'raw' => false,
+ ];
+
+ /*
+ | -------------------------------------------------------------------------
+ | Redis settings
+ | -------------------------------------------------------------------------
+ | Your Redis server can be specified below, if you are using
+ | the Redis or Predis drivers.
+ |
+ */
+ public $redis = [
+ 'host' => '127.0.0.1',
+ 'password' => null,
+ 'port' => 6379,
+ 'timeout' => 0,
+ 'database' => 0,
+ ];
+
+ /*
+ |--------------------------------------------------------------------------
+ | Available Cache Handlers
+ |--------------------------------------------------------------------------
+ |
+ | This is an array of cache engine alias' and class names. Only engines
+ | that are listed here are allowed to be used.
+ |
+ */
+ public $validHandlers = [
+ 'dummy' => \CodeIgniter\Cache\Handlers\DummyHandler::class,
+ 'file' => \CodeIgniter\Cache\Handlers\FileHandler::class,
+ 'memcached' => \CodeIgniter\Cache\Handlers\MemcachedHandler::class,
+ 'predis' => \CodeIgniter\Cache\Handlers\PredisHandler::class,
+ 'redis' => \CodeIgniter\Cache\Handlers\RedisHandler::class,
+ 'wincache' => \CodeIgniter\Cache\Handlers\WincacheHandler::class,
+ ];
+}
diff --git a/app/Config/Constants.php b/app/Config/Constants.php
new file mode 100644
index 0000000..b25f71c
--- /dev/null
+++ b/app/Config/Constants.php
@@ -0,0 +1,77 @@
+ '',
+ 'hostname' => '/Applications/MAMP/tmp/mysql/mysql.sock',
+ 'username' => 'test',
+ 'password' => '4Mu99BhzK8dr4vF1',
+ 'database' => 'demo',
+ 'DBDriver' => 'MySQLi',
+ 'DBPrefix' => '',
+ 'pConnect' => false,
+ 'DBDebug' => (ENVIRONMENT !== 'development'),
+ 'cacheOn' => false,
+ 'cacheDir' => '',
+ 'charset' => 'utf8',
+ 'DBCollat' => 'utf8_general_ci',
+ 'swapPre' => '',
+ 'encrypt' => false,
+ 'compress' => false,
+ 'strictOn' => false,
+ 'failover' => [],
+ 'port' => 3306,
+ ];
+
+ /**
+ * This database connection is used when
+ * running PHPUnit database tests.
+ *
+ * @var array
+ */
+ public $tests = [
+ 'DSN' => '',
+ 'hostname' => '127.0.0.1',
+ 'username' => '',
+ 'password' => '',
+ 'database' => ':memory:',
+ 'DBDriver' => 'SQLite3',
+ 'DBPrefix' => 'db_', // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS
+ 'pConnect' => false,
+ 'DBDebug' => (ENVIRONMENT !== 'production'),
+ 'cacheOn' => false,
+ 'cacheDir' => '',
+ 'charset' => 'utf8',
+ 'DBCollat' => 'utf8_general_ci',
+ 'swapPre' => '',
+ 'encrypt' => false,
+ 'compress' => false,
+ 'strictOn' => false,
+ 'failover' => [],
+ 'port' => 3306,
+ ];
+
+ //--------------------------------------------------------------------
+
+ public function __construct()
+ {
+ parent::__construct();
+
+ // Ensure that we always set the database group to 'tests' if
+ // we are currently running an automated test suite, so that
+ // we don't overwrite live data on accident.
+ if (ENVIRONMENT === 'testing')
+ {
+ $this->defaultGroup = 'tests';
+
+ // Under Travis-CI, we can set an ENV var named 'DB_GROUP'
+ // so that we can test against multiple databases.
+ if ($group = getenv('DB'))
+ {
+ if (is_file(TESTPATH . 'travis/Database.php'))
+ {
+ require TESTPATH . 'travis/Database.php';
+
+ if (! empty($dbconfig) && array_key_exists($group, $dbconfig))
+ {
+ $this->tests = $dbconfig[$group];
+ }
+ }
+ }
+ }
+ }
+
+ //--------------------------------------------------------------------
+
+}
diff --git a/app/Config/DocTypes.php b/app/Config/DocTypes.php
new file mode 100755
index 0000000..67d5dd2
--- /dev/null
+++ b/app/Config/DocTypes.php
@@ -0,0 +1,33 @@
+ '',
+ 'xhtml1-strict' => '',
+ 'xhtml1-trans' => '',
+ 'xhtml1-frame' => '',
+ 'xhtml-basic11' => '',
+ 'html5' => '',
+ 'html4-strict' => '',
+ 'html4-trans' => '',
+ 'html4-frame' => '',
+ 'mathml1' => '',
+ 'mathml2' => '',
+ 'svg10' => '',
+ 'svg11' => '',
+ 'svg11-basic' => '',
+ 'svg11-tiny' => '',
+ 'xhtml-math-svg-xh' => '',
+ 'xhtml-math-svg-sh' => '',
+ 'xhtml-rdfa-1' => '',
+ 'xhtml-rdfa-2' => '',
+ ];
+}
diff --git a/app/Config/Email.php b/app/Config/Email.php
new file mode 100644
index 0000000..d9ca142
--- /dev/null
+++ b/app/Config/Email.php
@@ -0,0 +1,171 @@
+ 0)
+ {
+ ob_end_flush();
+ }
+
+ ob_start(function ($buffer) {
+ return $buffer;
+ });
+ }
+
+ /*
+ * --------------------------------------------------------------------
+ * Debug Toolbar Listeners.
+ * --------------------------------------------------------------------
+ * If you delete, they will no longer be collected.
+ */
+ if (ENVIRONMENT !== 'production')
+ {
+ Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect');
+ Services::toolbar()->respond();
+ }
+});
diff --git a/app/Config/Exceptions.php b/app/Config/Exceptions.php
new file mode 100644
index 0000000..5fe33d3
--- /dev/null
+++ b/app/Config/Exceptions.php
@@ -0,0 +1,42 @@
+ \CodeIgniter\Filters\CSRF::class,
+ 'toolbar' => \CodeIgniter\Filters\DebugToolbar::class,
+ 'honeypot' => \CodeIgniter\Filters\Honeypot::class,
+ ];
+
+ // Always applied before every request
+ public $globals = [
+ 'before' => [
+ //'honeypot'
+ // 'csrf',
+ ],
+ 'after' => [
+ 'toolbar',
+ //'honeypot'
+ ],
+ ];
+
+ // Works on all of a particular HTTP method
+ // (GET, POST, etc) as BEFORE filters only
+ // like: 'post' => ['CSRF', 'throttle'],
+ public $methods = [];
+
+ // List filter aliases and any before/after uri patterns
+ // that they should run on, like:
+ // 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']],
+ public $filters = [];
+}
diff --git a/app/Config/ForeignCharacters.php b/app/Config/ForeignCharacters.php
new file mode 100644
index 0000000..8ee6f11
--- /dev/null
+++ b/app/Config/ForeignCharacters.php
@@ -0,0 +1,6 @@
+ \CodeIgniter\Format\JSONFormatter::class,
+ 'application/xml' => \CodeIgniter\Format\XMLFormatter::class,
+ 'text/xml' => \CodeIgniter\Format\XMLFormatter::class,
+ ];
+
+ /*
+ |--------------------------------------------------------------------------
+ | Formatters Options
+ |--------------------------------------------------------------------------
+ |
+ | Additional Options to adjust default formatters behaviour.
+ | For each mime type, list the additional options that should be used.
+ |
+ */
+ public $formatterOptions = [
+ 'application/json' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,
+ 'application/xml' => 0,
+ 'text/xml' => 0,
+ ];
+ //--------------------------------------------------------------------
+
+ /**
+ * A Factory method to return the appropriate formatter for the given mime type.
+ *
+ * @param string $mime
+ *
+ * @return \CodeIgniter\Format\FormatterInterface
+ */
+ public function getFormatter(string $mime)
+ {
+ if (! array_key_exists($mime, $this->formatters))
+ {
+ throw new \InvalidArgumentException('No Formatter defined for mime type: ' . $mime);
+ }
+
+ $class = $this->formatters[$mime];
+
+ if (! class_exists($class))
+ {
+ throw new \BadMethodCallException($class . ' is not a valid Formatter.');
+ }
+
+ return new $class();
+ }
+
+ //--------------------------------------------------------------------
+
+}
diff --git a/app/Config/Honeypot.php b/app/Config/Honeypot.php
new file mode 100644
index 0000000..3d9e372
--- /dev/null
+++ b/app/Config/Honeypot.php
@@ -0,0 +1,42 @@
+{label} ';
+
+ /**
+ * Honeypot container
+ *
+ * @var string
+ */
+ public $container = '
{template}
';
+}
diff --git a/app/Config/Images.php b/app/Config/Images.php
new file mode 100644
index 0000000..a416b8b
--- /dev/null
+++ b/app/Config/Images.php
@@ -0,0 +1,31 @@
+ \CodeIgniter\Images\Handlers\GDHandler::class,
+ 'imagick' => \CodeIgniter\Images\Handlers\ImageMagickHandler::class,
+ ];
+}
diff --git a/app/Config/Kint.php b/app/Config/Kint.php
new file mode 100644
index 0000000..09db83d
--- /dev/null
+++ b/app/Config/Kint.php
@@ -0,0 +1,62 @@
+ [
+
+ /*
+ * The log levels that this handler will handle.
+ */
+ 'handles' => [
+ 'critical',
+ 'alert',
+ 'emergency',
+ 'debug',
+ 'error',
+ 'info',
+ 'notice',
+ 'warning',
+ ],
+
+ /*
+ * The default filename extension for log files.
+ * An extension of 'php' allows for protecting the log files via basic
+ * scripting, when they are to be stored under a publicly accessible directory.
+ *
+ * Note: Leaving it blank will default to 'log'.
+ */
+ 'fileExtension' => '',
+
+ /*
+ * The file system permissions to be applied on newly created log files.
+ *
+ * IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal
+ * integer notation (i.e. 0700, 0644, etc.)
+ */
+ 'filePermissions' => 0644,
+
+ /*
+ * Logging Directory Path
+ *
+ * By default, logs are written to WRITEPATH . 'logs/'
+ * Specify a different destination here, if desired.
+ */
+ 'path' => '',
+ ],
+
+ /**
+ * The ChromeLoggerHandler requires the use of the Chrome web browser
+ * and the ChromeLogger extension. Uncomment this block to use it.
+ */
+ // 'CodeIgniter\Log\Handlers\ChromeLoggerHandler' => [
+ // /*
+ // * The log levels that this handler will handle.
+ // */
+ // 'handles' => ['critical', 'alert', 'emergency', 'debug',
+ // 'error', 'info', 'notice', 'warning'],
+ // ]
+ ];
+}
diff --git a/app/Config/Migrations.php b/app/Config/Migrations.php
new file mode 100644
index 0000000..b83fe90
--- /dev/null
+++ b/app/Config/Migrations.php
@@ -0,0 +1,50 @@
+ php spark migrate:create
+ |
+ | Typical formats:
+ | YmdHis_
+ | Y-m-d-His_
+ | Y_m_d_His_
+ |
+ */
+ public $timestampFormat = 'Y-m-d-His_';
+
+}
diff --git a/app/Config/Mimes.php b/app/Config/Mimes.php
new file mode 100644
index 0000000..41014d4
--- /dev/null
+++ b/app/Config/Mimes.php
@@ -0,0 +1,530 @@
+ [
+ 'application/mac-binhex40',
+ 'application/mac-binhex',
+ 'application/x-binhex40',
+ 'application/x-mac-binhex40',
+ ],
+ 'cpt' => 'application/mac-compactpro',
+ 'csv' => [
+ 'text/csv',
+ 'text/x-comma-separated-values',
+ 'text/comma-separated-values',
+ 'application/octet-stream',
+ 'application/vnd.ms-excel',
+ 'application/x-csv',
+ 'text/x-csv',
+ 'application/csv',
+ 'application/excel',
+ 'application/vnd.msexcel',
+ 'text/plain',
+ ],
+ 'bin' => [
+ 'application/macbinary',
+ 'application/mac-binary',
+ 'application/octet-stream',
+ 'application/x-binary',
+ 'application/x-macbinary',
+ ],
+ 'dms' => 'application/octet-stream',
+ 'lha' => 'application/octet-stream',
+ 'lzh' => 'application/octet-stream',
+ 'exe' => [
+ 'application/octet-stream',
+ 'application/x-msdownload',
+ ],
+ 'class' => 'application/octet-stream',
+ 'psd' => [
+ 'application/x-photoshop',
+ 'image/vnd.adobe.photoshop',
+ ],
+ 'so' => 'application/octet-stream',
+ 'sea' => 'application/octet-stream',
+ 'dll' => 'application/octet-stream',
+ 'oda' => 'application/oda',
+ 'pdf' => [
+ 'application/pdf',
+ 'application/force-download',
+ 'application/x-download',
+ 'binary/octet-stream',
+ ],
+ 'ai' => [
+ 'application/pdf',
+ 'application/postscript',
+ ],
+ 'eps' => 'application/postscript',
+ 'ps' => 'application/postscript',
+ 'smi' => 'application/smil',
+ 'smil' => 'application/smil',
+ 'mif' => 'application/vnd.mif',
+ 'xls' => [
+ 'application/vnd.ms-excel',
+ 'application/msexcel',
+ 'application/x-msexcel',
+ 'application/x-ms-excel',
+ 'application/x-excel',
+ 'application/x-dos_ms_excel',
+ 'application/xls',
+ 'application/x-xls',
+ 'application/excel',
+ 'application/download',
+ 'application/vnd.ms-office',
+ 'application/msword',
+ ],
+ 'ppt' => [
+ 'application/vnd.ms-powerpoint',
+ 'application/powerpoint',
+ 'application/vnd.ms-office',
+ 'application/msword',
+ ],
+ 'pptx' => [
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ 'application/x-zip',
+ 'application/zip',
+ ],
+ 'wbxml' => 'application/wbxml',
+ 'wmlc' => 'application/wmlc',
+ 'dcr' => 'application/x-director',
+ 'dir' => 'application/x-director',
+ 'dxr' => 'application/x-director',
+ 'dvi' => 'application/x-dvi',
+ 'gtar' => 'application/x-gtar',
+ 'gz' => 'application/x-gzip',
+ 'gzip' => 'application/x-gzip',
+ 'php' => [
+ 'application/x-php',
+ 'application/x-httpd-php',
+ 'application/php',
+ 'text/php',
+ 'text/x-php',
+ 'application/x-httpd-php-source',
+ ],
+ 'php4' => 'application/x-httpd-php',
+ 'php3' => 'application/x-httpd-php',
+ 'phtml' => 'application/x-httpd-php',
+ 'phps' => 'application/x-httpd-php-source',
+ 'js' => [
+ 'application/x-javascript',
+ 'text/plain',
+ ],
+ 'swf' => 'application/x-shockwave-flash',
+ 'sit' => 'application/x-stuffit',
+ 'tar' => 'application/x-tar',
+ 'tgz' => [
+ 'application/x-tar',
+ 'application/x-gzip-compressed',
+ ],
+ 'z' => 'application/x-compress',
+ 'xhtml' => 'application/xhtml+xml',
+ 'xht' => 'application/xhtml+xml',
+ 'zip' => [
+ 'application/x-zip',
+ 'application/zip',
+ 'application/x-zip-compressed',
+ 'application/s-compressed',
+ 'multipart/x-zip',
+ ],
+ 'rar' => [
+ 'application/x-rar',
+ 'application/rar',
+ 'application/x-rar-compressed',
+ ],
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mpga' => 'audio/mpeg',
+ 'mp2' => 'audio/mpeg',
+ 'mp3' => [
+ 'audio/mpeg',
+ 'audio/mpg',
+ 'audio/mpeg3',
+ 'audio/mp3',
+ ],
+ 'aif' => [
+ 'audio/x-aiff',
+ 'audio/aiff',
+ ],
+ 'aiff' => [
+ 'audio/x-aiff',
+ 'audio/aiff',
+ ],
+ 'aifc' => 'audio/x-aiff',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'rm' => 'audio/x-pn-realaudio',
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
+ 'ra' => 'audio/x-realaudio',
+ 'rv' => 'video/vnd.rn-realvideo',
+ 'wav' => [
+ 'audio/x-wav',
+ 'audio/wave',
+ 'audio/wav',
+ ],
+ 'bmp' => [
+ 'image/bmp',
+ 'image/x-bmp',
+ 'image/x-bitmap',
+ 'image/x-xbitmap',
+ 'image/x-win-bitmap',
+ 'image/x-windows-bmp',
+ 'image/ms-bmp',
+ 'image/x-ms-bmp',
+ 'application/bmp',
+ 'application/x-bmp',
+ 'application/x-win-bitmap',
+ ],
+ 'gif' => 'image/gif',
+ 'jpg' => [
+ 'image/jpeg',
+ 'image/pjpeg',
+ ],
+ 'jpeg' => [
+ 'image/jpeg',
+ 'image/pjpeg',
+ ],
+ 'jpe' => [
+ 'image/jpeg',
+ 'image/pjpeg',
+ ],
+ 'jp2' => [
+ 'image/jp2',
+ 'video/mj2',
+ 'image/jpx',
+ 'image/jpm',
+ ],
+ 'j2k' => [
+ 'image/jp2',
+ 'video/mj2',
+ 'image/jpx',
+ 'image/jpm',
+ ],
+ 'jpf' => [
+ 'image/jp2',
+ 'video/mj2',
+ 'image/jpx',
+ 'image/jpm',
+ ],
+ 'jpg2' => [
+ 'image/jp2',
+ 'video/mj2',
+ 'image/jpx',
+ 'image/jpm',
+ ],
+ 'jpx' => [
+ 'image/jp2',
+ 'video/mj2',
+ 'image/jpx',
+ 'image/jpm',
+ ],
+ 'jpm' => [
+ 'image/jp2',
+ 'video/mj2',
+ 'image/jpx',
+ 'image/jpm',
+ ],
+ 'mj2' => [
+ 'image/jp2',
+ 'video/mj2',
+ 'image/jpx',
+ 'image/jpm',
+ ],
+ 'mjp2' => [
+ 'image/jp2',
+ 'video/mj2',
+ 'image/jpx',
+ 'image/jpm',
+ ],
+ 'png' => [
+ 'image/png',
+ 'image/x-png',
+ ],
+ 'tif' => 'image/tiff',
+ 'tiff' => 'image/tiff',
+ 'css' => [
+ 'text/css',
+ 'text/plain',
+ ],
+ 'html' => [
+ 'text/html',
+ 'text/plain',
+ ],
+ 'htm' => [
+ 'text/html',
+ 'text/plain',
+ ],
+ 'shtml' => [
+ 'text/html',
+ 'text/plain',
+ ],
+ 'txt' => 'text/plain',
+ 'text' => 'text/plain',
+ 'log' => [
+ 'text/plain',
+ 'text/x-log',
+ ],
+ 'rtx' => 'text/richtext',
+ 'rtf' => 'text/rtf',
+ 'xml' => [
+ 'application/xml',
+ 'text/xml',
+ 'text/plain',
+ ],
+ 'xsl' => [
+ 'application/xml',
+ 'text/xsl',
+ 'text/xml',
+ ],
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpe' => 'video/mpeg',
+ 'qt' => 'video/quicktime',
+ 'mov' => 'video/quicktime',
+ 'avi' => [
+ 'video/x-msvideo',
+ 'video/msvideo',
+ 'video/avi',
+ 'application/x-troff-msvideo',
+ ],
+ 'movie' => 'video/x-sgi-movie',
+ 'doc' => [
+ 'application/msword',
+ 'application/vnd.ms-office',
+ ],
+ 'docx' => [
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'application/zip',
+ 'application/msword',
+ 'application/x-zip',
+ ],
+ 'dot' => [
+ 'application/msword',
+ 'application/vnd.ms-office',
+ ],
+ 'dotx' => [
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'application/zip',
+ 'application/msword',
+ ],
+ 'xlsx' => [
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'application/zip',
+ 'application/vnd.ms-excel',
+ 'application/msword',
+ 'application/x-zip',
+ ],
+ 'word' => [
+ 'application/msword',
+ 'application/octet-stream',
+ ],
+ 'xl' => 'application/excel',
+ 'eml' => 'message/rfc822',
+ 'json' => [
+ 'application/json',
+ 'text/json',
+ ],
+ 'pem' => [
+ 'application/x-x509-user-cert',
+ 'application/x-pem-file',
+ 'application/octet-stream',
+ ],
+ 'p10' => [
+ 'application/x-pkcs10',
+ 'application/pkcs10',
+ ],
+ 'p12' => 'application/x-pkcs12',
+ 'p7a' => 'application/x-pkcs7-signature',
+ 'p7c' => [
+ 'application/pkcs7-mime',
+ 'application/x-pkcs7-mime',
+ ],
+ 'p7m' => [
+ 'application/pkcs7-mime',
+ 'application/x-pkcs7-mime',
+ ],
+ 'p7r' => 'application/x-pkcs7-certreqresp',
+ 'p7s' => 'application/pkcs7-signature',
+ 'crt' => [
+ 'application/x-x509-ca-cert',
+ 'application/x-x509-user-cert',
+ 'application/pkix-cert',
+ ],
+ 'crl' => [
+ 'application/pkix-crl',
+ 'application/pkcs-crl',
+ ],
+ 'der' => 'application/x-x509-ca-cert',
+ 'kdb' => 'application/octet-stream',
+ 'pgp' => 'application/pgp',
+ 'gpg' => 'application/gpg-keys',
+ 'sst' => 'application/octet-stream',
+ 'csr' => 'application/octet-stream',
+ 'rsa' => 'application/x-pkcs7',
+ 'cer' => [
+ 'application/pkix-cert',
+ 'application/x-x509-ca-cert',
+ ],
+ '3g2' => 'video/3gpp2',
+ '3gp' => [
+ 'video/3gp',
+ 'video/3gpp',
+ ],
+ 'mp4' => 'video/mp4',
+ 'm4a' => 'audio/x-m4a',
+ 'f4v' => [
+ 'video/mp4',
+ 'video/x-f4v',
+ ],
+ 'flv' => 'video/x-flv',
+ 'webm' => 'video/webm',
+ 'aac' => 'audio/x-acc',
+ 'm4u' => 'application/vnd.mpegurl',
+ 'm3u' => 'text/plain',
+ 'xspf' => 'application/xspf+xml',
+ 'vlc' => 'application/videolan',
+ 'wmv' => [
+ 'video/x-ms-wmv',
+ 'video/x-ms-asf',
+ ],
+ 'au' => 'audio/x-au',
+ 'ac3' => 'audio/ac3',
+ 'flac' => 'audio/x-flac',
+ 'ogg' => [
+ 'audio/ogg',
+ 'video/ogg',
+ 'application/ogg',
+ ],
+ 'kmz' => [
+ 'application/vnd.google-earth.kmz',
+ 'application/zip',
+ 'application/x-zip',
+ ],
+ 'kml' => [
+ 'application/vnd.google-earth.kml+xml',
+ 'application/xml',
+ 'text/xml',
+ ],
+ 'ics' => 'text/calendar',
+ 'ical' => 'text/calendar',
+ 'zsh' => 'text/x-scriptzsh',
+ '7zip' => [
+ 'application/x-compressed',
+ 'application/x-zip-compressed',
+ 'application/zip',
+ 'multipart/x-zip',
+ ],
+ 'cdr' => [
+ 'application/cdr',
+ 'application/coreldraw',
+ 'application/x-cdr',
+ 'application/x-coreldraw',
+ 'image/cdr',
+ 'image/x-cdr',
+ 'zz-application/zz-winassoc-cdr',
+ ],
+ 'wma' => [
+ 'audio/x-ms-wma',
+ 'video/x-ms-asf',
+ ],
+ 'jar' => [
+ 'application/java-archive',
+ 'application/x-java-application',
+ 'application/x-jar',
+ 'application/x-compressed',
+ ],
+ 'svg' => [
+ 'image/svg+xml',
+ 'application/xml',
+ 'text/xml',
+ ],
+ 'vcf' => 'text/x-vcard',
+ 'srt' => [
+ 'text/srt',
+ 'text/plain',
+ ],
+ 'vtt' => [
+ 'text/vtt',
+ 'text/plain',
+ ],
+ 'ico' => [
+ 'image/x-icon',
+ 'image/x-ico',
+ 'image/vnd.microsoft.icon',
+ ],
+ ];
+
+ //--------------------------------------------------------------------
+
+ /**
+ * Attempts to determine the best mime type for the given file extension.
+ *
+ * @param string $extension
+ *
+ * @return string|null The mime type found, or none if unable to determine.
+ */
+ public static function guessTypeFromExtension(string $extension)
+ {
+ $extension = trim(strtolower($extension), '. ');
+
+ if (! array_key_exists($extension, static::$mimes))
+ {
+ return null;
+ }
+
+ return is_array(static::$mimes[$extension]) ? static::$mimes[$extension][0] : static::$mimes[$extension];
+ }
+
+ //--------------------------------------------------------------------
+
+ /**
+ * Attempts to determine the best file extension for a given mime type.
+ *
+ * @param string $type
+ * @param string $proposed_extension - default extension (in case there is more than one with the same mime type)
+ *
+ * @return string|null The extension determined, or null if unable to match.
+ */
+ public static function guessExtensionFromType(string $type, ?string $proposed_extension = null)
+ {
+ $type = trim(strtolower($type), '. ');
+
+ $proposed_extension = trim(strtolower($proposed_extension));
+
+ if (! is_null($proposed_extension) && array_key_exists($proposed_extension, static::$mimes) && in_array($type, is_string(static::$mimes[$proposed_extension]) ? [static::$mimes[$proposed_extension]] : static::$mimes[$proposed_extension]))
+ {
+ return $proposed_extension;
+ }
+
+ foreach (static::$mimes as $ext => $types)
+ {
+ if ((is_string($types) && $types === $type) || (is_array($types) && in_array($type, $types)))
+ {
+ return $ext;
+ }
+ }
+
+ return null;
+ }
+
+ //--------------------------------------------------------------------
+
+}
diff --git a/app/Config/Modules.php b/app/Config/Modules.php
new file mode 100644
index 0000000..40cb987
--- /dev/null
+++ b/app/Config/Modules.php
@@ -0,0 +1,45 @@
+ 'CodeIgniter\Pager\Views\default_full',
+ 'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
+ 'default_head' => 'CodeIgniter\Pager\Views\default_head',
+ ];
+
+ /*
+ |--------------------------------------------------------------------------
+ | Items Per Page
+ |--------------------------------------------------------------------------
+ |
+ | The default number of results shown in a single page.
+ |
+ */
+ public $perPage = 20;
+}
diff --git a/app/Config/Paths.php b/app/Config/Paths.php
new file mode 100644
index 0000000..6251124
--- /dev/null
+++ b/app/Config/Paths.php
@@ -0,0 +1,77 @@
+setDefaultNamespace('App\Controllers');
+$routes->setDefaultController('Home');
+$routes->setDefaultMethod('index');
+$routes->setTranslateURIDashes(false);
+$routes->set404Override();
+$routes->setAutoRoute(true);
+
+/**
+ * --------------------------------------------------------------------
+ * Route Definitions
+ * --------------------------------------------------------------------
+ */
+
+// We get a performance increase by specifying the default
+// Route since we don't have to scan directories.
+$routes->get('/', 'CrudController::index');
+
+/**
+ * --------------------------------------------------------------------
+ * Additional Routing
+ * --------------------------------------------------------------------
+ *
+ * There will often be times that you need additional routing and you
+ * need it to be able to override any defaults in this file. Environment
+ * based routes is one such time. require() additional route files here
+ * to make that happen.
+ *
+ * You will have access to the $routes object within that file without
+ * needing to reload it.
+ */
+if (file_exists(APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php'))
+{
+ require APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php';
+}
diff --git a/app/Config/Services.php b/app/Config/Services.php
new file mode 100644
index 0000000..c58da70
--- /dev/null
+++ b/app/Config/Services.php
@@ -0,0 +1,30 @@
+ 'Windows 10',
+ 'windows nt 6.3' => 'Windows 8.1',
+ 'windows nt 6.2' => 'Windows 8',
+ 'windows nt 6.1' => 'Windows 7',
+ 'windows nt 6.0' => 'Windows Vista',
+ 'windows nt 5.2' => 'Windows 2003',
+ 'windows nt 5.1' => 'Windows XP',
+ 'windows nt 5.0' => 'Windows 2000',
+ 'windows nt 4.0' => 'Windows NT 4.0',
+ 'winnt4.0' => 'Windows NT 4.0',
+ 'winnt 4.0' => 'Windows NT',
+ 'winnt' => 'Windows NT',
+ 'windows 98' => 'Windows 98',
+ 'win98' => 'Windows 98',
+ 'windows 95' => 'Windows 95',
+ 'win95' => 'Windows 95',
+ 'windows phone' => 'Windows Phone',
+ 'windows' => 'Unknown Windows OS',
+ 'android' => 'Android',
+ 'blackberry' => 'BlackBerry',
+ 'iphone' => 'iOS',
+ 'ipad' => 'iOS',
+ 'ipod' => 'iOS',
+ 'os x' => 'Mac OS X',
+ 'ppc mac' => 'Power PC Mac',
+ 'freebsd' => 'FreeBSD',
+ 'ppc' => 'Macintosh',
+ 'linux' => 'Linux',
+ 'debian' => 'Debian',
+ 'sunos' => 'Sun Solaris',
+ 'beos' => 'BeOS',
+ 'apachebench' => 'ApacheBench',
+ 'aix' => 'AIX',
+ 'irix' => 'Irix',
+ 'osf' => 'DEC OSF',
+ 'hp-ux' => 'HP-UX',
+ 'netbsd' => 'NetBSD',
+ 'bsdi' => 'BSDi',
+ 'openbsd' => 'OpenBSD',
+ 'gnu' => 'GNU/Linux',
+ 'unix' => 'Unknown Unix OS',
+ 'symbian' => 'Symbian OS',
+ ];
+
+ // The order of this array should NOT be changed. Many browsers return
+ // multiple browser types so we want to identify the sub-type first.
+ public $browsers = [
+ 'OPR' => 'Opera',
+ 'Flock' => 'Flock',
+ 'Edge' => 'Spartan',
+ 'Chrome' => 'Chrome',
+ // Opera 10+ always reports Opera/9.80 and appends Version/ to the user agent string
+ 'Opera.*?Version' => 'Opera',
+ 'Opera' => 'Opera',
+ 'MSIE' => 'Internet Explorer',
+ 'Internet Explorer' => 'Internet Explorer',
+ 'Trident.* rv' => 'Internet Explorer',
+ 'Shiira' => 'Shiira',
+ 'Firefox' => 'Firefox',
+ 'Chimera' => 'Chimera',
+ 'Phoenix' => 'Phoenix',
+ 'Firebird' => 'Firebird',
+ 'Camino' => 'Camino',
+ 'Netscape' => 'Netscape',
+ 'OmniWeb' => 'OmniWeb',
+ 'Safari' => 'Safari',
+ 'Mozilla' => 'Mozilla',
+ 'Konqueror' => 'Konqueror',
+ 'icab' => 'iCab',
+ 'Lynx' => 'Lynx',
+ 'Links' => 'Links',
+ 'hotjava' => 'HotJava',
+ 'amaya' => 'Amaya',
+ 'IBrowse' => 'IBrowse',
+ 'Maxthon' => 'Maxthon',
+ 'Ubuntu' => 'Ubuntu Web Browser',
+ 'Vivaldi' => 'Vivaldi',
+ ];
+
+ public $mobiles = [
+ // legacy array, old values commented out
+ 'mobileexplorer' => 'Mobile Explorer',
+ // 'openwave' => 'Open Wave',
+ // 'opera mini' => 'Opera Mini',
+ // 'operamini' => 'Opera Mini',
+ // 'elaine' => 'Palm',
+ 'palmsource' => 'Palm',
+ // 'digital paths' => 'Palm',
+ // 'avantgo' => 'Avantgo',
+ // 'xiino' => 'Xiino',
+ 'palmscape' => 'Palmscape',
+ // 'nokia' => 'Nokia',
+ // 'ericsson' => 'Ericsson',
+ // 'blackberry' => 'BlackBerry',
+ // 'motorola' => 'Motorola'
+
+ // Phones and Manufacturers
+ 'motorola' => 'Motorola',
+ 'nokia' => 'Nokia',
+ 'palm' => 'Palm',
+ 'iphone' => 'Apple iPhone',
+ 'ipad' => 'iPad',
+ 'ipod' => 'Apple iPod Touch',
+ 'sony' => 'Sony Ericsson',
+ 'ericsson' => 'Sony Ericsson',
+ 'blackberry' => 'BlackBerry',
+ 'cocoon' => 'O2 Cocoon',
+ 'blazer' => 'Treo',
+ 'lg' => 'LG',
+ 'amoi' => 'Amoi',
+ 'xda' => 'XDA',
+ 'mda' => 'MDA',
+ 'vario' => 'Vario',
+ 'htc' => 'HTC',
+ 'samsung' => 'Samsung',
+ 'sharp' => 'Sharp',
+ 'sie-' => 'Siemens',
+ 'alcatel' => 'Alcatel',
+ 'benq' => 'BenQ',
+ 'ipaq' => 'HP iPaq',
+ 'mot-' => 'Motorola',
+ 'playstation portable' => 'PlayStation Portable',
+ 'playstation 3' => 'PlayStation 3',
+ 'playstation vita' => 'PlayStation Vita',
+ 'hiptop' => 'Danger Hiptop',
+ 'nec-' => 'NEC',
+ 'panasonic' => 'Panasonic',
+ 'philips' => 'Philips',
+ 'sagem' => 'Sagem',
+ 'sanyo' => 'Sanyo',
+ 'spv' => 'SPV',
+ 'zte' => 'ZTE',
+ 'sendo' => 'Sendo',
+ 'nintendo dsi' => 'Nintendo DSi',
+ 'nintendo ds' => 'Nintendo DS',
+ 'nintendo 3ds' => 'Nintendo 3DS',
+ 'wii' => 'Nintendo Wii',
+ 'open web' => 'Open Web',
+ 'openweb' => 'OpenWeb',
+
+ // Operating Systems
+ 'android' => 'Android',
+ 'symbian' => 'Symbian',
+ 'SymbianOS' => 'SymbianOS',
+ 'elaine' => 'Palm',
+ 'series60' => 'Symbian S60',
+ 'windows ce' => 'Windows CE',
+
+ // Browsers
+ 'obigo' => 'Obigo',
+ 'netfront' => 'Netfront Browser',
+ 'openwave' => 'Openwave Browser',
+ 'mobilexplorer' => 'Mobile Explorer',
+ 'operamini' => 'Opera Mini',
+ 'opera mini' => 'Opera Mini',
+ 'opera mobi' => 'Opera Mobile',
+ 'fennec' => 'Firefox Mobile',
+
+ // Other
+ 'digital paths' => 'Digital Paths',
+ 'avantgo' => 'AvantGo',
+ 'xiino' => 'Xiino',
+ 'novarra' => 'Novarra Transcoder',
+ 'vodafone' => 'Vodafone',
+ 'docomo' => 'NTT DoCoMo',
+ 'o2' => 'O2',
+
+ // Fallback
+ 'mobile' => 'Generic Mobile',
+ 'wireless' => 'Generic Mobile',
+ 'j2me' => 'Generic Mobile',
+ 'midp' => 'Generic Mobile',
+ 'cldc' => 'Generic Mobile',
+ 'up.link' => 'Generic Mobile',
+ 'up.browser' => 'Generic Mobile',
+ 'smartphone' => 'Generic Mobile',
+ 'cellphone' => 'Generic Mobile',
+ ];
+
+ // There are hundreds of bots but these are the most common.
+ public $robots = [
+ 'googlebot' => 'Googlebot',
+ 'msnbot' => 'MSNBot',
+ 'baiduspider' => 'Baiduspider',
+ 'bingbot' => 'Bing',
+ 'slurp' => 'Inktomi Slurp',
+ 'yahoo' => 'Yahoo',
+ 'ask jeeves' => 'Ask Jeeves',
+ 'fastcrawler' => 'FastCrawler',
+ 'infoseek' => 'InfoSeek Robot 1.0',
+ 'lycos' => 'Lycos',
+ 'yandex' => 'YandexBot',
+ 'mediapartners-google' => 'MediaPartners Google',
+ 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler',
+ 'adsbot-google' => 'AdsBot Google',
+ 'feedfetcher-google' => 'Feedfetcher Google',
+ 'curious george' => 'Curious George',
+ 'ia_archiver' => 'Alexa Crawler',
+ 'MJ12bot' => 'Majestic-12',
+ 'Uptimebot' => 'Uptimebot',
+ ];
+}
diff --git a/app/Config/Validation.php b/app/Config/Validation.php
new file mode 100644
index 0000000..97f08c7
--- /dev/null
+++ b/app/Config/Validation.php
@@ -0,0 +1,36 @@
+ 'CodeIgniter\Validation\Views\list',
+ 'single' => 'CodeIgniter\Validation\Views\single',
+ ];
+
+ //--------------------------------------------------------------------
+ // Rules
+ //--------------------------------------------------------------------
+}
diff --git a/app/Config/View.php b/app/Config/View.php
new file mode 100644
index 0000000..f66b253
--- /dev/null
+++ b/app/Config/View.php
@@ -0,0 +1,34 @@
+session = \Config\Services::session();
+ }
+
+}
diff --git a/app/Controllers/CrudController.php b/app/Controllers/CrudController.php
new file mode 100644
index 0000000..04b6775
--- /dev/null
+++ b/app/Controllers/CrudController.php
@@ -0,0 +1,22 @@
+getUsers();
+ echo view('crud/user_table', $data);
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php
new file mode 100644
index 0000000..81d715b
--- /dev/null
+++ b/app/Controllers/Home.php
@@ -0,0 +1,12 @@
+findAll();
+ } else {
+ return $this->getWhere(['id' => $id]);
+ }
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/app/ThirdParty/.gitkeep b/app/ThirdParty/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/Views/crud/index_crud.php b/app/Views/crud/index_crud.php
new file mode 100644
index 0000000..ee2a5ff
--- /dev/null
+++ b/app/Views/crud/index_crud.php
@@ -0,0 +1,17 @@
+
+
+
\ No newline at end of file
diff --git a/app/Views/crud/user_table.php b/app/Views/crud/user_table.php
new file mode 100644
index 0000000..cf5e140
--- /dev/null
+++ b/app/Views/crud/user_table.php
@@ -0,0 +1,18 @@
+
+
+
+ Id
+ Name
+ Email
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/errors/cli/error_404.php b/app/Views/errors/cli/error_404.php
new file mode 100644
index 0000000..d5bccb4
--- /dev/null
+++ b/app/Views/errors/cli/error_404.php
@@ -0,0 +1,6 @@
+
+Message: = $message, "\n"; ?>
+Filename: = $exception->getFile(), "\n"; ?>
+Line Number: = $exception->getLine(); ?>
+
+
+
+ Backtrace:
+ getTrace() as $error): ?>
+
+ = trim('-' . $error['line'] . ' - ' . $error['file'] . '::' . $error['function']) . "\n" ?>
+
+
+
+
diff --git a/app/Views/errors/cli/production.php b/app/Views/errors/cli/production.php
new file mode 100644
index 0000000..7db744e
--- /dev/null
+++ b/app/Views/errors/cli/production.php
@@ -0,0 +1,5 @@
+
+
+
+
+ 404 Page Not Found
+
+
+
+
+
+
404 - File Not Found
+
+
+
+ = esc($message) ?>
+
+ Sorry! Cannot seem to find the page you were looking for.
+
+
+
+
+
diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php
new file mode 100644
index 0000000..09fddcb
--- /dev/null
+++ b/app/Views/errors/html/error_exception.php
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+
+ = htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8') ?>
+
+
+
+
+
+
+
+
+
+
+
+
= static::cleanPath($file, $line) ?> at line = $line ?>
+
+
+
+ = static::highlightFile($file, $line, 15); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $row) : ?>
+
+
+
+
+
+
+
+ {PHP internal code}
+
+
+
+
+ — = $row['class'] . $row['type'] . $row['function'] ?>
+
+
+ ( arguments )
+
+
+
+ getParameters();
+ }
+ foreach ($row['args'] as $key => $value) : ?>
+
+ = htmlspecialchars(isset($params[$key]) ? '$' . $params[$key]->name : "#$key", ENT_SUBSTITUTE, 'UTF-8') ?>
+ = print_r($value, true) ?>
+
+
+
+
+
+
+ ()
+
+
+
+
+ — = $row['function'] ?>()
+
+
+
+
+
+
+ = static::highlightFile($row['file'], $row['line']) ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$= $var ?>
+
+
+
+
+ Key
+ Value
+
+
+
+ $value) : ?>
+
+ = htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?>
+
+
+ = htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?>
+
+ = '' . print_r($value, true) ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
Constants
+
+
+
+
+ Key
+ Value
+
+
+
+ $value) : ?>
+
+ = htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?>
+
+
+ = htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?>
+
+ = '' . print_r($value, true) ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Path
+ = $request->uri ?>
+
+
+ HTTP Method
+ = $request->getMethod(true) ?>
+
+
+ IP Address
+ = $request->getIPAddress() ?>
+
+
+ Is AJAX Request?
+ = $request->isAJAX() ? 'yes' : 'no' ?>
+
+
+ Is CLI Request?
+ = $request->isCLI() ? 'yes' : 'no' ?>
+
+
+ Is Secure Request?
+ = $request->isSecure() ? 'yes' : 'no' ?>
+
+
+ User Agent
+ = $request->getUserAgent()->getAgentString() ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
$= $var ?>
+
+
+
+
+ Key
+ Value
+
+
+
+ $value) : ?>
+
+ = htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?>
+
+
+ = htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?>
+
+ = '' . print_r($value, true) ?>
+
+
+
+
+
+
+
+
+
+
+
+
+ No $_GET, $_POST, or $_COOKIE Information to show.
+
+
+
+
+ getHeaders(); ?>
+
+
+
Headers
+
+
+
+
+ Header
+ Value
+
+
+
+
+
+
+
+
+ = esc($h->getName(), 'html') ?>
+ = esc($h->getValueLine(), 'html') ?>
+
+
+
+
+
+
+
+
+
+
+ setStatusCode(http_response_code());
+ ?>
+
+
+
+ Response Status
+ = $response->getStatusCode() . ' - ' . $response->getReason() ?>
+
+
+
+ getHeaders(); ?>
+
+
+
+
Headers
+
+
+
+
+ Header
+ Value
+
+
+
+ $value) : ?>
+
+ = esc($name, 'html') ?>
+ = esc($response->getHeaderLine($name), 'html') ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = htmlspecialchars( static::cleanPath($file), ENT_SUBSTITUTE, 'UTF-8') ?>
+
+
+
+
+
+
+
+
+
+
+ Memory Usage
+ = static::describeMemory(memory_get_usage(true)) ?>
+
+
+ Peak Memory Usage:
+ = static::describeMemory(memory_get_peak_usage(true)) ?>
+
+
+ Memory Limit:
+ = ini_get('memory_limit') ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Views/errors/html/production.php b/app/Views/errors/html/production.php
new file mode 100644
index 0000000..cca49c2
--- /dev/null
+++ b/app/Views/errors/html/production.php
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ Whoops!
+
+
+
+
+
+
+
+
Whoops!
+
+
We seem to have hit a snag. Please try again later...
+
+
+
+
+
+
diff --git a/app/Views/templates/main.php b/app/Views/templates/main.php
new file mode 100644
index 0000000..489e359
--- /dev/null
+++ b/app/Views/templates/main.php
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+ Codeigniter AJAX Tutorial - Fetch Data from Database Example
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 0000000..b702fbc
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+ 403 Forbidden
+
+
+
+Directory access is forbidden.
+
+
+
diff --git a/builds b/builds
new file mode 100755
index 0000000..268e7a8
--- /dev/null
+++ b/builds
@@ -0,0 +1,163 @@
+#!/usr/bin/env php
+ 'vcs',
+ 'url' => GITHUB_URL,
+ ];
+ }
+
+ // Define the "require"
+ $array['require']['codeigniter4/codeigniter4'] = 'dev-develop';
+ unset($array['require']['codeigniter4/framework']);
+ }
+
+ // Release
+ else
+ {
+ // Clear 'minimum-stability'
+ unset($array['minimum-stability']);
+
+ // If the repo is configured then clear it
+ if (isset($array['repositories']))
+ {
+ // Check for the CodeIgniter repo
+ foreach ($array['repositories'] as $i => $repository)
+ {
+ if ($repository['url'] == GITHUB_URL)
+ {
+ unset($array['repositories'][$i]);
+ break;
+ }
+ }
+ if (empty($array['repositories']))
+ {
+ unset($array['repositories']);
+ }
+ }
+
+ // Define the "require"
+ $array['require']['codeigniter4/framework'] = LATEST_RELEASE;
+ unset($array['require']['codeigniter4/codeigniter4']);
+ }
+
+ // Write out a new composer.json
+ file_put_contents($file, json_encode($array, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES) . PHP_EOL);
+ $modified[] = $file;
+ }
+ else
+ {
+ echo 'Warning: Unable to decode composer.json! Skipping...' . PHP_EOL;
+ }
+ }
+ else
+ {
+ echo 'Warning: Unable to read composer.json! Skipping...' . PHP_EOL;
+ }
+}
+
+// Paths config and PHPUnit XMLs
+$files = [
+ __DIR__ . DIRECTORY_SEPARATOR . 'app/Config/Paths.php',
+ __DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml.dist',
+ __DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml',
+];
+
+foreach ($files as $file)
+{
+ if (is_file($file))
+ {
+ $contents = file_get_contents($file);
+
+ // Development
+ if ($dev)
+ {
+ $contents = str_replace('vendor/codeigniter4/framework', 'vendor/codeigniter4/codeigniter4', $contents);
+ }
+
+ // Release
+ else
+ {
+ $contents = str_replace('vendor/codeigniter4/codeigniter4', 'vendor/codeigniter4/framework', $contents);
+ }
+
+ file_put_contents($file, $contents);
+ $modified[] = $file;
+ }
+}
+
+if (empty($modified))
+{
+ echo 'No files modified' . PHP_EOL;
+}
+else
+{
+ echo 'The following files were modified:' . PHP_EOL;
+ foreach ($modified as $file)
+ {
+ echo " * {$file}" . PHP_EOL;
+ }
+ echo 'Run `composer update` to sync changes with your vendor folder' . PHP_EOL;
+}
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..4e75c63
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,32 @@
+{
+ "name": "codeigniter4/appstarter",
+ "type": "project",
+ "description": "CodeIgniter4 starter app",
+ "homepage": "https://codeigniter.com",
+ "license": "MIT",
+ "require": {
+ "php": ">=7.2",
+ "codeigniter4/framework": "^4"
+ },
+ "require-dev": {
+ "fzaninotto/faker": "^1.9@dev",
+ "mikey179/vfsstream": "1.6.*",
+ "phpunit/phpunit": "^8.5"
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\Support\\": "tests/_support"
+ }
+ },
+ "scripts": {
+ "post-update-cmd": [
+ "@composer dump-autoload"
+ ],
+ "test": "phpunit"
+ },
+ "support": {
+ "forum": "http://forum.codeigniter.com/",
+ "source": "https://github.com/codeigniter4/CodeIgniter4",
+ "slack": "https://codeigniterchat.slack.com"
+ }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..fc28dc2
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,1956 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "1e3c5712accb4893c8f1c11a63b6d6e5",
+ "packages": [
+ {
+ "name": "codeigniter4/framework",
+ "version": "v4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/codeigniter4/framework.git",
+ "reference": "1edcf84f77ff794640fddbfc59a10a024cd15b50"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/codeigniter4/framework/zipball/1edcf84f77ff794640fddbfc59a10a024cd15b50",
+ "reference": "1edcf84f77ff794640fddbfc59a10a024cd15b50",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "ext-intl": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "kint-php/kint": "^3.3",
+ "laminas/laminas-escaper": "^2.6",
+ "php": ">=7.2",
+ "psr/log": "^1.1"
+ },
+ "require-dev": {
+ "codeigniter4/codeigniter4-standard": "^1.0",
+ "fzaninotto/faker": "^1.9@dev",
+ "mikey179/vfsstream": "1.6.*",
+ "phpunit/phpunit": "^8.5",
+ "predis/predis": "^1.1",
+ "squizlabs/php_codesniffer": "^3.3"
+ },
+ "type": "project",
+ "autoload": {
+ "psr-4": {
+ "CodeIgniter\\": "system/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "The CodeIgniter framework v4",
+ "homepage": "https://codeigniter.com",
+ "time": "2020-07-16T03:44:28+00:00"
+ },
+ {
+ "name": "kint-php/kint",
+ "version": "3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/kint-php/kint.git",
+ "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/kint-php/kint/zipball/335ac1bcaf04d87df70d8aa51e8887ba2c6d203b",
+ "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.6"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.0",
+ "phpunit/phpunit": "^4.0",
+ "seld/phar-utils": "^1.0",
+ "symfony/finder": "^2.0 || ^3.0 || ^4.0",
+ "vimeo/psalm": "^3.0"
+ },
+ "suggest": {
+ "ext-ctype": "Simple data type tests",
+ "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages",
+ "ext-mbstring": "Provides string encoding detection",
+ "kint-php/kint-js": "Provides a simplified dump to console.log()",
+ "kint-php/kint-twig": "Provides d() and s() functions in twig templates",
+ "symfony/polyfill-ctype": "Replacement for ext-ctype if missing",
+ "symfony/polyfill-iconv": "Replacement for ext-iconv if missing",
+ "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "init.php"
+ ],
+ "psr-4": {
+ "Kint\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Vollebregt",
+ "homepage": "https://github.com/jnvsor"
+ },
+ {
+ "name": "Rokas Šleinius",
+ "homepage": "https://github.com/raveren"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/kint-php/kint/graphs/contributors"
+ }
+ ],
+ "description": "Kint - debugging tool for PHP developers",
+ "homepage": "https://kint-php.github.io/kint/",
+ "keywords": [
+ "debug",
+ "kint",
+ "php"
+ ],
+ "time": "2019-10-17T18:05:24+00:00"
+ },
+ {
+ "name": "laminas/laminas-escaper",
+ "version": "2.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-escaper.git",
+ "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/25f2a053eadfa92ddacb609dcbbc39362610da70",
+ "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70",
+ "shasum": ""
+ },
+ "require": {
+ "laminas/laminas-zendframework-bridge": "^1.0",
+ "php": "^5.6 || ^7.0"
+ },
+ "replace": {
+ "zendframework/zend-escaper": "self.version"
+ },
+ "require-dev": {
+ "laminas/laminas-coding-standard": "~1.0.0",
+ "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.6.x-dev",
+ "dev-develop": "2.7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laminas\\Escaper\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs",
+ "homepage": "https://laminas.dev",
+ "keywords": [
+ "escaper",
+ "laminas"
+ ],
+ "time": "2019-12-31T16:43:30+00:00"
+ },
+ {
+ "name": "laminas/laminas-zendframework-bridge",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-zendframework-bridge.git",
+ "reference": "fcd87520e4943d968557803919523772475e8ea3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/fcd87520e4943d968557803919523772475e8ea3",
+ "reference": "fcd87520e4943d968557803919523772475e8ea3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev",
+ "dev-develop": "1.1.x-dev"
+ },
+ "laminas": {
+ "module": "Laminas\\ZendFrameworkBridge"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/autoload.php"
+ ],
+ "psr-4": {
+ "Laminas\\ZendFrameworkBridge\\": "src//"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "Alias legacy ZF class names to Laminas Project equivalents.",
+ "keywords": [
+ "ZendFramework",
+ "autoloading",
+ "laminas",
+ "zf"
+ ],
+ "funding": [
+ {
+ "url": "https://funding.communitybridge.org/projects/laminas-project",
+ "type": "community_bridge"
+ }
+ ],
+ "time": "2020-05-20T16:45:56+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2020-03-23T09:12:05+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "f350df0268e904597e3bd9c4685c53e0e333feea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea",
+ "reference": "f350df0268e904597e3bd9c4685c53e0e333feea",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^6.0",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.13",
+ "phpstan/phpstan-phpunit": "^0.11",
+ "phpstan/phpstan-shim": "^0.11",
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-05-29T17:27:14+00:00"
+ },
+ {
+ "name": "fzaninotto/faker",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fzaninotto/Faker.git",
+ "reference": "5337ce5261b393937bd7aaebb21020159756a152"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/5337ce5261b393937bd7aaebb21020159756a152",
+ "reference": "5337ce5261b393937bd7aaebb21020159756a152",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "ext-intl": "*",
+ "phpunit/phpunit": "^4.8.35 || ^5.7",
+ "squizlabs/php_codesniffer": "^2.9.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Faker\\": "src/Faker/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "François Zaninotto"
+ }
+ ],
+ "description": "Faker is a PHP library that generates fake data for you.",
+ "keywords": [
+ "data",
+ "faker",
+ "fixtures"
+ ],
+ "time": "2020-05-11T08:39:57+00:00"
+ },
+ {
+ "name": "mikey179/vfsstream",
+ "version": "v1.6.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bovigo/vfsStream.git",
+ "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+ "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.5|^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "org\\bovigo\\vfs\\": "src/main/php"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Frank Kleine",
+ "homepage": "http://frankkleine.de/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Virtual file system to mock the real file system in unit tests.",
+ "homepage": "http://vfs.bovigo.org/",
+ "time": "2019-10-30T15:31:00+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.10.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
+ "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-06-29T13:22:24+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "phar-io/version": "^2.0",
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "time": "2018-07-08T19:23:20+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "time": "2018-07-08T19:19:57+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "3170448f5769fe19f456173d833734e0ff1b84df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/3170448f5769fe19f456173d833734e0ff1b84df",
+ "reference": "3170448f5769fe19f456173d833734e0ff1b84df",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2020-07-20T20:05:34+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "e878a14a65245fbe78f8080eba03b47c3b705651"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651",
+ "reference": "e878a14a65245fbe78f8080eba03b47c3b705651",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "time": "2020-06-27T10:12:23+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "1.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160",
+ "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.2",
+ "php": "^7.2",
+ "phpdocumentor/reflection-docblock": "^5.0",
+ "sebastian/comparator": "^3.0 || ^4.0",
+ "sebastian/recursion-context": "^3.0 || ^4.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^6.0",
+ "phpunit/phpunit": "^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.11.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2020-07-08T12:44:21+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "7.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf",
+ "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2",
+ "phpunit/php-file-iterator": "^2.0.2",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-token-stream": "^3.1.1",
+ "sebastian/code-unit-reverse-lookup": "^1.0.1",
+ "sebastian/environment": "^4.2.2",
+ "sebastian/version": "^2.0.1",
+ "theseer/tokenizer": "^1.1.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.2.2"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.7.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2019-11-20T13:55:58+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "050bedf145a257b1ff02746c31894800e5122946"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
+ "reference": "050bedf145a257b1ff02746c31894800e5122946",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2018-09-13T20:33:42+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21T13:50:34+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "2.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "1038454804406b0b5f5f520358e78c1c2f71501e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e",
+ "reference": "1038454804406b0b5f5f520358e78c1c2f71501e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2019-06-07T04:22:29+00:00"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
+ "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2019-09-17T06:23:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "8.5.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997",
+ "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.2.0",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.9.1",
+ "phar-io/manifest": "^1.0.3",
+ "phar-io/version": "^2.0.1",
+ "php": "^7.2",
+ "phpspec/prophecy": "^1.8.1",
+ "phpunit/php-code-coverage": "^7.0.7",
+ "phpunit/php-file-iterator": "^2.0.2",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-timer": "^2.1.2",
+ "sebastian/comparator": "^3.0.2",
+ "sebastian/diff": "^3.0.2",
+ "sebastian/environment": "^4.2.2",
+ "sebastian/exporter": "^3.1.1",
+ "sebastian/global-state": "^3.0.0",
+ "sebastian/object-enumerator": "^3.0.3",
+ "sebastian/resource-operations": "^2.0.1",
+ "sebastian/type": "^1.1.3",
+ "sebastian/version": "^2.0.1"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^2.0.0"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.5-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "funding": [
+ {
+ "url": "https://phpunit.de/donate.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-06-22T07:06:58+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2017-03-04T06:30:41+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
+ "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1",
+ "sebastian/diff": "^3.0",
+ "sebastian/exporter": "^3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2018-07-12T15:12:46+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
+ "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5 || ^8.0",
+ "symfony/process": "^2 || ^3.3 || ^4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "time": "2019-02-04T06:01:07+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "4.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
+ "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2019-11-20T08:46:58+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "3.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e",
+ "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2019-09-14T09:02:43+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
+ "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^8.0"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2019-02-01T05:30:01+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+ "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2017-08-03T12:35:26+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "time": "2017-03-29T09:07:27+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2017-03-03T06:23:57+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
+ "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2018-10-04T04:07:39+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
+ "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "time": "2019-07-02T08:10:15+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2016-10-03T07:35:21+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.18.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
+ "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.18-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-07-14T12:35:20+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2020-07-12T23:59:07+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0 || ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<3.9.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2020-07-08T17:02:28+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "fzaninotto/faker": 20
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=7.2"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "1.1.0"
+}
diff --git a/env b/env
new file mode 100644
index 0000000..11f4161
--- /dev/null
+++ b/env
@@ -0,0 +1,101 @@
+#--------------------------------------------------------------------
+# Example Environment Configuration file
+#
+# This file can be used as a starting point for your own
+# custom .env files, and contains most of the possible settings
+# available in a default install.
+#
+# By default, all of the settings are commented out. If you want
+# to override the setting, you must un-comment it by removing the '#'
+# at the beginning of the line.
+#--------------------------------------------------------------------
+
+#--------------------------------------------------------------------
+# ENVIRONMENT
+#--------------------------------------------------------------------
+
+# CI_ENVIRONMENT = production
+
+#--------------------------------------------------------------------
+# APP
+#--------------------------------------------------------------------
+
+# app.baseURL = ''
+# app.forceGlobalSecureRequests = false
+
+# app.sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler'
+# app.sessionCookieName = 'ci_session'
+# app.sessionSavePath = NULL
+# app.sessionMatchIP = false
+# app.sessionTimeToUpdate = 300
+# app.sessionRegenerateDestroy = false
+
+# app.cookiePrefix = ''
+# app.cookieDomain = ''
+# app.cookiePath = '/'
+# app.cookieSecure = false
+# app.cookieHTTPOnly = false
+
+# app.CSRFProtection = false
+# app.CSRFTokenName = 'csrf_test_name'
+# app.CSRFCookieName = 'csrf_cookie_name'
+# app.CSRFExpire = 7200
+# app.CSRFRegenerate = true
+# app.CSRFExcludeURIs = []
+
+# app.CSPEnabled = false
+
+#--------------------------------------------------------------------
+# DATABASE
+#--------------------------------------------------------------------
+
+# database.default.hostname = localhost
+# database.default.database = ci4
+# database.default.username = root
+# database.default.password = root
+# database.default.DBDriver = MySQLi
+
+# database.tests.hostname = localhost
+# database.tests.database = ci4
+# database.tests.username = root
+# database.tests.password = root
+# database.tests.DBDriver = MySQLi
+
+#--------------------------------------------------------------------
+# CONTENT SECURITY POLICY
+#--------------------------------------------------------------------
+
+# contentsecuritypolicy.reportOnly = false
+# contentsecuritypolicy.defaultSrc = 'none'
+# contentsecuritypolicy.scriptSrc = 'self'
+# contentsecuritypolicy.styleSrc = 'self'
+# contentsecuritypolicy.imageSrc = 'self'
+# contentsecuritypolicy.base_uri = null
+# contentsecuritypolicy.childSrc = null
+# contentsecuritypolicy.connectSrc = 'self'
+# contentsecuritypolicy.fontSrc = null
+# contentsecuritypolicy.formAction = null
+# contentsecuritypolicy.frameAncestors = null
+# contentsecuritypolicy.mediaSrc = null
+# contentsecuritypolicy.objectSrc = null
+# contentsecuritypolicy.pluginTypes = null
+# contentsecuritypolicy.reportURI = null
+# contentsecuritypolicy.sandbox = false
+# contentsecuritypolicy.upgradeInsecureRequests = false
+
+#--------------------------------------------------------------------
+# ENCRYPTION
+#--------------------------------------------------------------------
+
+# encryption.key =
+# encryption.driver = OpenSSL
+
+#--------------------------------------------------------------------
+# HONEYPOT
+#--------------------------------------------------------------------
+
+# honeypot.hidden = 'true'
+# honeypot.label = 'Fill This Field'
+# honeypot.name = 'honeypot'
+# honeypot.template = '{label} '
+# honeypot.container = '{template}
'
diff --git a/license.txt b/license.txt
new file mode 100644
index 0000000..2fb1bdd
--- /dev/null
+++ b/license.txt
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2019 British Columbia Institute of Technology
+Copyright (c) 2019-2020 CodeIgniter Foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000..96947df
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,60 @@
+
+
+
+
+ ./tests
+
+
+
+
+
+ ./app
+
+ ./app/Views
+ ./app/Config/Routes.php
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000..02026a3
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,48 @@
+# Disable directory browsing
+Options All -Indexes
+
+# ----------------------------------------------------------------------
+# Rewrite engine
+# ----------------------------------------------------------------------
+
+# Turning on the rewrite engine is necessary for the following rules and features.
+# FollowSymLinks must be enabled for this to work.
+
+ Options +FollowSymlinks
+ RewriteEngine On
+
+ # If you installed CodeIgniter in a subfolder, you will need to
+ # change the following line to match the subfolder you need.
+ # http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
+ # RewriteBase /
+
+ # Redirect Trailing Slashes...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteRule ^(.*)/$ /$1 [L,R=301]
+
+ # Rewrite "www.example.com -> example.com"
+ RewriteCond %{HTTPS} !=on
+ RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
+ RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
+
+ # Checks to see if the user is attempting to access a valid file,
+ # such as an image or css document, if this isn't true it sends the
+ # request to the front controller, index.php
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteRule ^([\s\S]*)$ index.php/$1 [L,NC,QSA]
+
+ # Ensure Authorization header is passed along
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+
+
+ # If we don't have mod_rewrite installed, all 404's
+ # can be sent to index.php, and everything works as normal.
+ ErrorDocument 404 index.php
+
+
+# Disable server signature start
+ ServerSignature Off
+# Disable server signature end
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..7ecfce2
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..3eaa592
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,45 @@
+systemDirectory, '/ ') . '/bootstrap.php';
+
+/*
+ *---------------------------------------------------------------
+ * LAUNCH THE APPLICATION
+ *---------------------------------------------------------------
+ * Now that everything is setup, it's time to actually fire
+ * up the engines and make this app do its thang.
+ */
+$app->run();
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..9e60f97
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/spark b/spark
new file mode 100755
index 0000000..0a0908d
--- /dev/null
+++ b/spark
@@ -0,0 +1,61 @@
+#!/usr/bin/env php
+systemDirectory, '/ ') . '/bootstrap.php';
+
+// Grab our Console
+$console = new \CodeIgniter\CLI\Console($app);
+
+// We want errors to be shown when using it from the CLI.
+error_reporting(-1);
+ini_set('display_errors', 1);
+
+// Show basic information before we do anything else.
+$console->showHeader();
+
+// fire off the command in the main framework.
+$response = $console->run();
+if ($response->getStatusCode() >= 300)
+{
+ exit($response->getStatusCode());
+}
diff --git a/tests/README.md b/tests/README.md
new file mode 100644
index 0000000..545ccfe
--- /dev/null
+++ b/tests/README.md
@@ -0,0 +1,108 @@
+# Running Application Tests
+
+This is the quick-start to CodeIgniter testing. Its intent is to describe what
+it takes to set up your application and get it ready to run unit tests.
+It is not intended to be a full description of the test features that you can
+use to test your application. Those details can be found in the documentation.
+
+## Resources
+* [CodeIgniter 4 User Guide on Testing](https://codeigniter4.github.io/userguide/testing/index.html)
+* [PHPUnit docs](https://phpunit.readthedocs.io/en/8.3/index.html)
+
+## Requirements
+
+It is recommended to use the latest version of PHPUnit. At the time of this
+writing we are running version 8.5.2. Support for this has been built into the
+**composer.json** file that ships with CodeIgniter and can easily be installed
+via [Composer](https://getcomposer.org/) if you don't already have it installed globally.
+
+ > composer install
+
+If running under OS X or Linux, you can create a symbolic link to make running tests a touch nicer.
+
+ > ln -s ./vendor/bin/phpunit ./phpunit
+
+You also need to install [XDebug](https://xdebug.org/index.php) in order
+for code coverage to be calculated successfully.
+
+## Setting Up
+
+A number of the tests use a running database.
+In order to set up the database edit the details for the `tests` group in
+**app/Config/Database.php** or **phpunit.xml**. Make sure that you provide a database engine
+that is currently running on your machine. More details on a test database setup are in the
+*Docs>>Testing>>Testing Your Database* section of the documentation.
+
+If you want to run the tests without using live database you can
+exclude @DatabaseLive group. Or make a copy of **phpunit.dist.xml** -
+call it **phpunit.xml** - and comment out the named "database". This will make
+the tests run quite a bit faster.
+
+## Running the tests
+
+The entire test suite can be run by simply typing one command-line command from the main directory.
+
+ > ./phpunit
+
+You can limit tests to those within a single test directory by specifying the
+directory name after phpunit.
+
+ > ./phpunit app/Models
+
+## Generating Code Coverage
+
+To generate coverage information, including HTML reports you can view in your browser,
+you can use the following command:
+
+ > ./phpunit --colors --coverage-text=tests/coverage.txt --coverage-html=tests/coverage/ -d memory_limit=1024m
+
+This runs all of the tests again collecting information about how many lines,
+functions, and files are tested. It also reports the percentage of the code that is covered by tests.
+It is collected in two formats: a simple text file that provides an overview as well
+as a comprehensive collection of HTML files that show the status of every line of code in the project.
+
+The text file can be found at **tests/coverage.txt**.
+The HTML files can be viewed by opening **tests/coverage/index.html** in your favorite browser.
+
+## PHPUnit XML Configuration
+
+The repository has a ``phpunit.xml.dist`` file in the project root that's used for
+PHPUnit configuration. This is used to provide a default configuration if you
+do not have your own configuration file in the project root.
+
+The normal practice would be to copy ``phpunit.xml.dist`` to ``phpunit.xml``
+(which is git ignored), and to tailor it as you see fit.
+For instance, you might wish to exclude database tests, or automatically generate
+HTML code coverage reports.
+
+## Test Cases
+
+Every test needs a *test case*, or class that your tests extend. CodeIgniter 4
+provides a few that you may use directly:
+* `CodeIgniter\Test\CIUnitTestCase` - for basic tests with no other service needs
+* `CodeIgniter\Test\CIDatabaseTestCase` - for tests that need database access
+
+Most of the time you will want to write your own test cases to hold functions and services
+common to your test suites.
+
+## Creating Tests
+
+All tests go in the **tests/** directory. Each test file is a class that extends a
+**Test Case** (see above) and contains methods for the individual tests. These method
+names must start with the word "test" and should have descriptive names for precisely what
+they are testing:
+`testUserCanModifyFile()` `testOutputColorMatchesInput()` `testIsLoggedInFailsWithInvalidUser()`
+
+Writing tests is an art, and there are many resources available to help learn how.
+Review the links above and always pay attention to your code coverage.
+
+### Database Tests
+
+Tests can include migrating, seeding, and testing against a mock or live1 database.
+Be sure to modify the test case (or create your own) to point to your seed and migrations
+and include any additional steps to be run before tests in the `setUp()` method.
+
+1 Note: If you are using database tests that require a live database connection
+you will need to rename **phpunit.xml.dist** to **phpunit.xml**, uncomment the database
+configuration lines and add your connection details. Prevent **phpunit.xml** from being
+tracked in your repo by adding it to **.gitignore**.
diff --git a/tests/_support/Database/Migrations/2020-02-22-222222_example_migration.php b/tests/_support/Database/Migrations/2020-02-22-222222_example_migration.php
new file mode 100644
index 0000000..1bfd4a3
--- /dev/null
+++ b/tests/_support/Database/Migrations/2020-02-22-222222_example_migration.php
@@ -0,0 +1,61 @@
+ [
+ 'type' => 'varchar',
+ 'constraint' => 31,
+ ],
+ 'uid' => [
+ 'type' => 'varchar',
+ 'constraint' => 31,
+ ],
+ 'class' => [
+ 'type' => 'varchar',
+ 'constraint' => 63,
+ ],
+ 'icon' => [
+ 'type' => 'varchar',
+ 'constraint' => 31,
+ ],
+ 'summary' => [
+ 'type' => 'varchar',
+ 'constraint' => 255,
+ ],
+ 'created_at' => [
+ 'type' => 'datetime',
+ 'null' => true,
+ ],
+ 'updated_at' => [
+ 'type' => 'datetime',
+ 'null' => true,
+ ],
+ 'deleted_at' => [
+ 'type' => 'datetime',
+ 'null' => true,
+ ],
+ ];
+
+ $this->forge->addField('id');
+ $this->forge->addField($fields);
+
+ $this->forge->addKey('name');
+ $this->forge->addKey('uid');
+ $this->forge->addKey(['deleted_at', 'id']);
+ $this->forge->addKey('created_at');
+
+ $this->forge->createTable('factories');
+ }
+
+ public function down()
+ {
+ $this->forge->dropTable('factories');
+ }
+}
diff --git a/tests/_support/Database/Seeds/ExampleSeeder.php b/tests/_support/Database/Seeds/ExampleSeeder.php
new file mode 100644
index 0000000..1b14ced
--- /dev/null
+++ b/tests/_support/Database/Seeds/ExampleSeeder.php
@@ -0,0 +1,40 @@
+ 'Test Factory',
+ 'uid' => 'test001',
+ 'class' => 'Factories\Tests\NewFactory',
+ 'icon' => 'fas fa-puzzle-piece',
+ 'summary' => 'Longer sample text for testing',
+ ],
+ [
+ 'name' => 'Widget Factory',
+ 'uid' => 'widget',
+ 'class' => 'Factories\Tests\WidgetPlant',
+ 'icon' => 'fas fa-puzzle-piece',
+ 'summary' => 'Create widgets in your factory',
+ ],
+ [
+ 'name' => 'Evil Factory',
+ 'uid' => 'evil-maker',
+ 'class' => 'Factories\Evil\MyFactory',
+ 'icon' => 'fas fa-book-dead',
+ 'summary' => 'Abandon all hope, ye who enter here',
+ ],
+ ];
+
+ $builder = $this->db->table('factories');
+
+ foreach ($factories as $factory)
+ {
+ $builder->insert($factory);
+ }
+ }
+}
diff --git a/tests/_support/DatabaseTestCase.php b/tests/_support/DatabaseTestCase.php
new file mode 100644
index 0000000..8b094d3
--- /dev/null
+++ b/tests/_support/DatabaseTestCase.php
@@ -0,0 +1,51 @@
+mockSession();
+ }
+
+ /**
+ * Pre-loads the mock session driver into $this->session.
+ *
+ * @var string
+ */
+ protected function mockSession()
+ {
+ $config = config('App');
+ $this->session = new MockSession(new ArrayHandler($config, '0.0.0.0'), $config);
+ \Config\Services::injectMock('session', $this->session);
+ }
+}
diff --git a/tests/database/ExampleDatabaseTest.php b/tests/database/ExampleDatabaseTest.php
new file mode 100644
index 0000000..2de0b6a
--- /dev/null
+++ b/tests/database/ExampleDatabaseTest.php
@@ -0,0 +1,42 @@
+findAll();
+
+ // Make sure the count is as expected
+ $this->assertCount(3, $objects);
+ }
+
+ public function testSoftDeleteLeavesRow()
+ {
+ $model = new ExampleModel();
+ $this->setPrivateProperty($model, 'useSoftDeletes', true);
+ $this->setPrivateProperty($model, 'tempUseSoftDeletes', true);
+
+ $object = $model->first();
+ $model->delete($object->id);
+
+ // The model should no longer find it
+ $this->assertNull($model->find($object->id));
+
+ // ... but it should still be in the database
+ $result = $model->builder()->where('id', $object->id)->get()->getResult();
+
+ $this->assertCount(1, $result);
+ }
+}
diff --git a/tests/session/ExampleSessionTest.php b/tests/session/ExampleSessionTest.php
new file mode 100644
index 0000000..6ec0d01
--- /dev/null
+++ b/tests/session/ExampleSessionTest.php
@@ -0,0 +1,18 @@
+session->set('logged_in', 123);
+
+ $value = $this->session->get('logged_in');
+
+ $this->assertEquals(123, $value);
+ }
+}
diff --git a/tests/unit/HealthTest.php b/tests/unit/HealthTest.php
new file mode 100644
index 0000000..1d059d0
--- /dev/null
+++ b/tests/unit/HealthTest.php
@@ -0,0 +1,33 @@
+assertTrue($test);
+ }
+
+ public function testBaseUrlHasBeenSet()
+ {
+ $env = $config = false;
+
+ // First check in .env
+ if (is_file(HOMEPATH . '.env'))
+ {
+ $env = (bool) preg_grep("/^app\.baseURL = './", file(HOMEPATH . '.env'));
+ }
+
+ // Then check the actual config file
+ $reader = new \Tests\Support\Libraries\ConfigReader();
+ $config = ! empty($reader->baseUrl);
+
+ $this->assertTrue($env || $config);
+ }
+}
diff --git a/writable/.htaccess b/writable/.htaccess
new file mode 100755
index 0000000..f24db0a
--- /dev/null
+++ b/writable/.htaccess
@@ -0,0 +1,6 @@
+
+ Require all denied
+
+
+ Deny from all
+
diff --git a/writable/cache/index.html b/writable/cache/index.html
new file mode 100755
index 0000000..b702fbc
--- /dev/null
+++ b/writable/cache/index.html
@@ -0,0 +1,11 @@
+
+
+
+ 403 Forbidden
+
+
+
+Directory access is forbidden.
+
+
+
diff --git a/writable/logs/index.html b/writable/logs/index.html
new file mode 100755
index 0000000..b702fbc
--- /dev/null
+++ b/writable/logs/index.html
@@ -0,0 +1,11 @@
+
+
+
+ 403 Forbidden
+
+
+
+Directory access is forbidden.
+
+
+
diff --git a/writable/session/index.html b/writable/session/index.html
new file mode 100755
index 0000000..b702fbc
--- /dev/null
+++ b/writable/session/index.html
@@ -0,0 +1,11 @@
+
+
+
+ 403 Forbidden
+
+
+
+Directory access is forbidden.
+
+
+
diff --git a/writable/uploads/index.html b/writable/uploads/index.html
new file mode 100755
index 0000000..b702fbc
--- /dev/null
+++ b/writable/uploads/index.html
@@ -0,0 +1,11 @@
+
+
+
+ 403 Forbidden
+
+
+
+Directory access is forbidden.
+
+
+