# Release Notes for 1.x
# [1.0.0-alpha.2](https://github.com/flextype/flextype/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2022-09-13)
### Features
* **rest-api** Added new Query API [587](https://github.com/flextype/flextype/issues/587).
* **entries** Added new private fields functionality for entries [585](https://github.com/flextype/flextype/issues/585).
* Private field starts with `_` and evailable only in the current entry.
**entry.md**
```yaml
---
title: Product item
_message: Message...
_vars:
currency: "USD"
vat: "@type[int] [[ strings().random(2, 1234567890) ]]"
price: "[[ 100 + _vars.vat ]]"
price_with_currency: "[[ price ~ ' ' ~ _vars.currency ]]"
---
[[ title ]] // Product item
[[ _message ]] // Message...
```
**response**
```yaml
{
"title": "Product item",
"price": "120",
"price_with_currency": "120 USD"
"content": "Product item \n Message..."
}
```
* **vars** Added new `Vars` service to store global variables.
* **directives** Added ability to disable expressions using `!expressions`.
* **directives** Added ability to disable shortcodes using `!shortcodes`.
* **directives** Added ability to disable markdown using `!markdown`.
* **directives** Added ability to disable textile using `!textile`.
* **directives** Added ability to disable php using `!php`.
* **directives** Added ability to disable types using `!types`.
* **expressions** Expressions language as a part of Parsers [586](https://github.com/flextype/flextype/issues/586).
* From now Expressions are part of Parsers, configurable and available globally.
* Ability to configure opening/closing tags for variables, blocks and comments.
```yaml
opening_variable_tag: "[["
closing_variable_tag: "]]"
opening_block_tag: "[%"
closing_block_tag: "%]"
opening_comment_tag: "[#"
closing_comment_tag: "#]"
```
* Ability to write multiline expressions
```yaml
[[
field1 ~
field2 ~
field2
]]
```
* Ability to store parsed expressions in the cache.
* Ability to quickly access current entries fields.
```yaml
[[ field_name ]]
```
* **expressions** Added new expression function `when`.
* **expressions** Added new expression function `unless`.
* **expressions** Added new expression function `time`.
* **expressions** Added new expression function `strtotime`.
* **expressions** Added new expression function `round`.
* **expressions** Added new expression function `abs`.
* **expressions** Added support for `Vars` service. [583](https://github.com/flextype/flextype/issues/583)
- New function `vars()` returns instance of `Vars` service.
- New function `var()` for quick access to variables stored in `Vars` service.
* **shortcodes** Added support for `Vars` service. [583](https://github.com/flextype/flextype/issues/583)
- New shortcode `(var)` to get, set, unset and delete variables from `Vars` service.
* **core** Added new package `Guzzle`.
* **core** Added a new `fetch` helper, expression function and shortcode with the ability to fetch data from different sources, entries, files, and URLs. [581](https://github.com/flextype/flextype/issues/581)
### Bug Fixes
* **expressions** Fixed `strings` expression function.
* **expressions** Fixed `Entries` Expressions methods.
* **helpers** Fixed issue in `collection` helper with limit and offset double check.
### BREAKING CHANGES
* **expressions** Configuration for expressions moved from entries to parsers section.
* **expressions** Use `parsers()->expressions()` instead of `expressions()` to access methods.
* **entries** Local `vars` are replaced with global variables and local private fields.
* **shortcodes** Use `registerShortcodes()` instead of `initShortcodes()` to register custom shortcodes.
* **directives** Use `registerDirectives()` instead of `initDirectives()` to register custom directives.
* **expressions** Use `registerExpressions()` instead of `initExpressions()` to register custom expressions.
# [1.0.0-alpha.1](https://github.com/flextype/flextype/compare/v0.9.16...v1.0.0-alpha.1) (2022-07-12)
### Features
* **core** Minimum PHP version required PHP 8.1.0.
* **core** Core application updated from Slim 3 to Slim 4!
See: [Upgrade Guide](https://www.slimframework.com/docs/v4/start/upgrade.html)
* **core** New PHP-DI added instead of Pimple DI.
See: [Usage Guide](https://php-di.org/doc/frameworks/slim.html)
* **console** Added Extendable Flextype CLI Application.
```
Flextype CLI Application 1.0.0-alpha.1
Usage:
command [options] [arguments]
Options:
-h, --help Display help for the given command. When no command is given display help for the list command
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
about Get information about Flextype.
completion Dump the shell completion script
help Display help for a command
list List commands
cache
cache:clear Clear cache.
cache:clear-config Clear cache config.
cache:clear-data Clear cache data.
cache:clear-routes Clear cache routes.
cache:delete Delete item.
cache:delete-multiple Delete mutiple items.
cache:get Get item.
cache:get-multiple Get multiple items.
cache:has Check whether cache item exists.
cache:set Set item.
cache:set-multiple Set multiple items.
entries
entries:copy Copy entry.
entries:create Create entry.
entries:delete Delete entry.
entries:fetch Fetch entry.
entries:has Check whether entry exists.
entries:move Move entry.
entries:update Update entry.
tokens
tokens:create Create a new unique token.
tokens:delete Delete token entry.
tokens:fetch Fetch token entry.
tokens:generate Generate token.
tokens:generate-hash Generate token hash.
tokens:has Check whether token entry exists.
tokens:update Update tokens entry.
tokens:verify-hash Verify token hash.
```
* **core** Added `Thermage` library for better Flextype CLI Application styling.
* **core** Added ability to execute specific project related code.
- `before-plugins` to bootstrap file before plugins intialization.
- `after-plugins` to bootstrap file after plugins intialization.
* **core** Added new core constants: `FLEXTYPE_PROJECT_NAME`, `FLEXTYPE_PATH_PROJECT`, `FLEXTYPE_PATH_TMP`, `FLEXTYPE_START_TIME`.
* **core** Added ability to run Flextype in silent mode by disabling `app` and `cli`.
* **core** Added New [Glowy PHP](https://awilum.github.io/glowyphp/) Packages `View`, `Macroable`, `Strings`, `Arrays`, `Csrf`, `Filesystem`, `Registry`, `Session`.
* **core** Added built-in I18n module.
* **core** Added ability to override default constants
* **entries** Added new functionality that allows implementing Virtual Entries by overriding default entries CRUD methods with the help of events.
* **entries** Added ability to create completely customisable high-level collections for entries with their fields and various formats.
* **entries** Added ability to set custom events for each entries collections.
* **entries** Added ability to create and use entries fields directives.
See: [Documentation](https://awilum.github.io/flextype/documentation/core/entries#directives)
* **entries** Added ability to create custom entries macros.
Built-in macros: `entries`, `php`, `registry`.
* **entries** Added new method `registry` to get entries registry.
* **entries** Added new method `options` to get entries options.
* **entries** Added new method `setOptions` to set entries options.
* **entries** Added new method `setRegistry` to set entries registry.
* **entries** Added ability to override logic for built-in custom fields.
Example:
If you want to have your custom logic for processing field `uuid` just update flextype project settings.
from:
```yaml
...
entries:
default:
...
fields:
...
uuid:
enabled: true
path: "src/flextype/core/Entries/Fields/Default/UuidField.php"
...
...
...
...
```
to:
```yaml
...
entries:
default:
...
fields:
...
uuid:
enabled: true
path: "project/plugins/your-custom-plugin/Entries/Fields/Default/UuidField.php"
...
...
...
...
```
* **directives** Added new directive `@type` to set field type.
* **directives** Added new directive `@markdown` to parse markdown text inside current field.
* **directives** Added new directive `@shortcodes` to parse shortcodes text inside current field.
* **directives** Added new directive `@textile` to parse textile text inside current field.
* **directives** Added new directive `@php` to execute php code text inside current field.
* **directives** Added new directive `[[ ]]` to eval expression.
* **endpoints** All Rest API Endpoints codebase was rewritten from scratch.
* **endpoints** Added new Rest API Endpoint `POST /api/v1/cache/clear` to clear cache.
* **endpoints** Added new Rest API Endpoint `POST /api/v1/tokens/generate` to generate token hash.
* **endpoints** Added new Rest API Endpoint `POST /api/v1/tokens/verify-hash` to verify token hash.
* **endpoints** Added new Rest API Endpoint `POST /api/v1/tokens` to create token entry.
* **endpoints** Added new Rest API Endpoint `PATCH /api/v1/tokens` to update token entry.
* **endpoints** Added new Rest API Endpoint `DELETE /api/v1/tokens` to delete token entry.
* **endpoints** Added new Rest API Endpoint `GET /api/v1/tokens` to fetch token entry.
* **csrf** Added Glowy CSRF protection for Cross Site Request Forgery protection by comparing provided token with session token to ensure request validity.
* **frontmatter** Added ability to define custom frontmatter header parsers for entries. Example: instead of first `---` you may set serializer `---json`, `---json5` `---yaml` or `---neon`.
* **serializers** Added new serializer `Json5`.
See: [Documentation](https://awilum.github.io/flextype/documentation/core/serializers/json5)
* **serializers** Added new serializer `Neon`.
See: [Documentation](https://awilum.github.io/flextype/documentation/core/serializers/neon)
* **serializers** Added ability to set global settings for all built-in serializers.
`src/flextype/settings.yaml`
```yaml
serializers:
json:
decode:
cache:
enabled: true
string: ""
assoc: true
depth: 512
flags: 0
encode:
options: 0
depth: 512
json5:
decode:
cache:
enabled: true
string: ""
assoc: true
depth: 512
flags: 0
encode:
options: 0
depth: 512
yaml:
decode:
cache:
enabled: true
string: ""
native: true
flags: 0
encode:
inline: 10
indent: 2
flags: 0
frontmatter:
decode:
cache:
enabled: true
string: ""
cache_id_string: ""
header:
serializer: yaml
allowed: ['yaml', 'json', 'json5', 'neon']
encode:
header:
serializer: yaml
allowed: ['yaml', 'json', 'json5', 'neon']
neon:
decode:
cache:
enabled: true
string: ""
encode:
blockMode: false
indentation: "\t"
phparray:
decode:
cache:
enabled: true
string: ""
encode:
wrap: true
```
* **serializers** Added ability to set specific header serializer for `Frontmatter` serializer (default is YAML).
`src/flextype/settings.yaml`
```yaml
frontmatter:
decode:
cache:
enabled: true
string: ""
cache_id_string: ""
header:
serializer: yaml
allowed: ['yaml', 'json', 'json5', 'neon']
encode:
header:
serializer: yaml
allowed: ['yaml', 'json', 'json5', 'neon']
```
* **parsers** Markdown parser [Commonmark updated to v2](https://commonmark.thephpleague.com/2.0/upgrading/)
* **parsers** Added new Textile parser.
* **parsers** Added ability to set global settings for all parsers.
`src/flextype/settings.yaml`
```yaml
parsers:
markdown:
cache:
enabled: true
string: ""
commonmark:
renderer:
block_separator: "\n"
inner_separator: "\n"
soft_break: "\n"
commonmark:
enable_em: true
enable_strong: true
use_asterisk: true
use_underscore: true
unordered_list_markers: ['-', '*', '+']
html_input: 'allow'
allow_unsafe_links: false
max_nesting_level: 9223372036854775807
slug_normalizer:
max_length: 255
textile:
cache:
enabled: true
string: ""
restricted: false
document_type: 'xhtml'
document_root_directory: ''
lite: false
images: true
link_relation_ship: ''
raw_blocks: false
block_tags: true
line_wrap: true
image_prefix: ''
link_prefix: ''
symbol: []
dimensionless_images: true
shortcodes:
cache:
enabled: true
string: ""
cache_id_string: ""
opening_tag: "("
closing_tag: ")"
closing_tag_marker: "/"
parameter_value_separator: ":"
parameter_value_delimiter: "'"
shortcodes:
entries:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/EntriesShortcode.php"
fetch:
enabled: true
php:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/PhpShortcode.php"
raw:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/RawShortcode.php"
textile:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/TextileShortcode.php"
markdown:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/MarkdownShortcode.php"
registry:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/RegistryShortcode.php"
get:
enabled: true
url:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/UrlShortcode.php"
strings:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/StringsShortcode.php"
filesystem:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/FilesystemShortcode.php"
get:
enabled: true
i18n:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/I18nShortcode.php"
if:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/IfShortcode.php"
when:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/WhenShortcode.php"
unless:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/UnlessShortcode.php"
uuid:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/UuidShortcode.php"
const:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/ConstShortcode.php"
var:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/VarShortcode.php"
field:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/FieldShortcode.php"
calc:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/CalcShortcode.php"
eval:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/EvalShortcode.php"
type:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/TypeShortcode.php"
```
* **parsers** Added ability to override logic for built-in shortcodes.
Example:
If you want to have your custom logic for processing shortcode `url` just update flextype settings.
from:
```yaml
...
parsers:
shortcodes:
shortcodes:
...
url:
enabled: true
path: "src/flextype/core/Parsers/Shortcodes/UrlShortcode.php"
...
...
...
...
```
to:
```yaml
...
parsers:
shortcodes:
shortcodes:
...
url:
enabled: true
path: "project/plugins/your-custom-plugin/Parsers/Shortcodes/UrlShortcode.php"
...
...
...
...
```
* **routes** Added ability to set custom projects routes in `/projects/routes/routes.php`.
* **shortcodes** Added new shortcode `(entries)` to fetch entry (or entries collection) or specific field.
* **shortcodes** Added new shortcode `(registry)` to fetch data from registry.
* **shortcodes** Added new shortcode `(filesystem)` to work with filesystem.
* **shortcodes** Added new shortcode `(uuid)` to generate uuid.
* **shortcodes** Added new shortcode `(strings)` for strings manipulation.
* **shortcodes** Added new shortcode `(textile)` to parse textile text.
* **shortcodes** Added new shortcode `(php)` to execute php code.
* **shortcodes** Added new shortcode `(eval)` to eval expression.
* **shortcodes** Added new shortcode `(calc)` to calculate values.
* **shortcodes** Added new shortcode `(type)` to set field type.
* **shortcodes** Added new shortcode `(markdown)` to parse markdown text.
* **shortcodes** Added new shortcode `(getProjectUrl)` to get project url.
* **shortcodes** Added new shortcode `(getBaseUrl)` to get base url.
* **shortcodes** Added new shortcode `(getBasePath)` to get base path.
* **shortcodes** Added new shortcode `(getAbsoluteUrl)` to get absolute url.
* **shortcodes** Added new shortcode `(url)` to get url.
* **shortcodes** Added new shortcode `(urlFor)` to get url for route.
* **shortcodes** Added new shortcode `(getUriString)` to get uri string.
* **shortcodes** Added new shortcode `(filesystem)` to do filesytem manipulations.
* **shortcodes** Added new shortcode `(date)` to get date.
* **shortcodes** Added new shortcode `(tr)` to returns translation of a string.
* **shortcodes** Added new shortcode `(if)` to use logical if conditions.
* **shortcodes** Added new shortcode `(when)` to use logical positive if conditions.
* **shortcodes** Added new shortcode `(unless)` to use logical negative if conditions.
* **shortcodes** Added new shortcode `(var)` to get and set entry variables values.
* **shortcodes** Added new shortcode `(field)` to get entry fields values.
* **shortcodes** Added new shortcode `(const)` to get defined costants.
* **shortcodes** Added new shortcode `(raw)` to ignore shortcodes processing.
* **expressions** Added a new configurable and extendable expressions engine with a collection of predefined expressions.
* **expressions** Added new expression function `actions` to get actions service.
* **expressions** Added new expression function `collection` to create a new arrayable collection object from the given elements.
* **expressions** Added new expression function `collectionFromJson` to create a new arrayable collection object from the given JSON string.
* **expressions** Added new expression function `collectionFromString` to create a new arrayable collection object from the given string.
* **expressions** Added new expression function `collectionWithRange` to create a new arrayable object with a range of elements.
* **expressions** Added new expression function `collectionFromQueryString` to create a new arrayable object from the given query string.
* **expressions** Added new expression function `filterCollection` to filter collection.
* **expressions** Added new expression function `const` to get defined constants.
* **expressions** Added new expression function `var` to get current entry var.
* **expressions** Added new expression function `field` to get current entry field.
* **expressions** Added new expression function `csrf` to get csrf hidden input.
* **expressions** Added new expression function `entries` to get entries service.
* **expressions** Added new expression function `filesystem` to get filesystem instance.
* **expressions** Added new expression function `strings` to get strings instance.
* **expressions** Added new expression function `tr` to return translation of a string. If no translation exists, the original string will be returned.
* **expressions** Added new expression function `__` to return translation of a string. If no translation exists, the original string will be returned.
* **expressions** Added new expression function `max` to return the highest value in an array, or the highest value of several specified values.
* **expressions** Added new expression function `min` to return the lowest value in an array, or the lowest value of several specified values.
* **expressions** Added new expression function `ceil` to round a number up to the nearest integer.
* **expressions** Added new expression function `floor` to round a number down to the nearest integer.
* **expressions** Added new expression function `parsers` to get parsers service.
* **expressions** Added new expression function `serializers` to get serializers service.
* **expressions** Added new expression function `registry` to get registry service.
* **expressions** Added new expression function `slugify` to get slugify service.
* **expressions** Added new expression function `date` to get date.
* **expressions** Added new expression function `url` to get the url.
* **expressions** Added new expression function `urlFor` to get the url for a named route.
* **expressions** Added new expression function `fullUrlFor` to get the full url for a named route.
* **expressions** Added new expression function `isCurrentUrl` to determine is current url equal to route name.
* **expressions** Added new expression function `getCurrentUrl` to get current path on given Uri.
* **expressions** Added new expression function `getBasePath` to get the base path.
* **expressions** Added new expression function `getBaseUrl` to get the base url.
* **expressions** Added new expression function `getAbsoluteUrl` to get the absolute url.
* **expressions** Added new expression function `getProjectUrl` to get the project url.
* **expressions** Added new expression function `getUriString` to get the uri string.
* **expressions** Added new expression function `redirect` to create redirect.
* **cache** Added new cache driver `Phparray` to store cache data in raw php arrays files.
* **cache** Added router cache.
* **cache** Added ability to set custom cache ID string for `entries`, `parsers` and `serializers`.
* **tokens** Added new Tokens API.
* **helpers** All core helpers are located in the `src/flextype/helpers/`.
* **helpers** Added helper function `app` to get Flextype Application instance.
* **helpers** Added helper function `container` to get Flextype Application Container instance.
* **helpers** Added helper function `emitter` to get Flextype Emitter Service.
* **helpers** Added helper function `cache` to get Flextype Cache Service.
* **helpers** Added helper function `entries` to get Flextype Entries Service.
* **helpers** Added helper function `parsers` to get Flextype Parsers Service.
* **helpers** Added helper function `serializers` to get Flextype Serializers Service.
* **helpers** Added helper function `logger` to get Flextype Logger Service.
* **helpers** Added helper function `session` to get Flextype Session Service.
* **helpers** Added helper function `csrf` to get Flextype CSRF Service.
* **helpers** Added helper function `plugins` to get Flextype Plugins Service.
* **helpers** Added helper function `console` to get Flextype Console Service.
* **helpers** Added helper function `imageFile` to create a new image instance for image file.
* **helpers** Added helper function `imageCanvas` to create a new image canvas instance.
* **helpers** Added helper function `generateToken` to generate unique token.
* **helpers** Added helper function `generateTokenHash` to generate unique token hash.
* **helpers** Added helper function `verifyTokenHash` to validate token hash.
* **helpers** Added helper function `url` to get url.
* **helpers** Added helper function `urlFor` to get url for a named route.
* **helpers** Added helper function `fullUrlFor` to get full url for a named route.
* **helpers** Added helper function `isCurrentUrl` to determine is current url equal to route name.
* **helpers** Added helper function `getCurrentUrl` to get current path on given Uri.
* **helpers** Added helper function `getBasePath` to get base path.
* **helpers** Added helper function `setBasePath` to set base path.
* **helpers** Added helper function `redirect` to create redirect.
* **helpers** Added helper function `upload` to upload files and process uloaded images.
* **uploder** Added Configurable Sirius Uploader for file upload.
```yaml
# Upload
upload:
# Uploads directory
directory: '/uploads'
# Overwrite existing files.
overwrite: true
# Auto-confirm uploads.
autoconfirm: false
# Prefixing uploads.
prefix: ''
# Validation options
validation:
# Allowed file extensions.
allowed_file_extensions: ['gif', 'jpg', 'jpeg', 'png', 'ico', 'webm', 'svg']
# Maximum file size.
max_file_size: '24M'
# Image validation options
image:
# Image maxiumum and minimum width
width:
max: 4920
min: 100
# Image maxiumum and minimum height
height:
max: 3264
min: 100
# Image ratio
#ratio:
# The option can be a number (eg: 1.3) or a ratio-like string (eg: 4:3, 16:9).
# size: 1.3
# The option error_margin specifies how much the image is allowed to
# deviate from the target ratio. Default value is 0.
# error_margin: 0
# Process uploaded files
process:
# Images process settings
image:
# Image quality
quality: 70
```
* **macros** All core macros are located in the `src/flextype/macros/`.
* **macros** Added `onlyFromCollection` and `exceptFromCollection` macros for Arrays ([#553](https://github.com/flextype/flextype/issues/553))
* **actions** Added new Actions API ([#549](https://github.com/flextype/flextype/issues/549))
#### Usage
##### Example 1
```php
// Set new action entries.create
actions()->set('entries.create', function($id, $data) {
return entries()->create($id, $data);
});
// Get action entries.create
actions()->get('entries.create')('hello-world', []);
```
##### Example 2
```php
// Set new action entries.update
actions()->set('entries.update', function($id, $data) {
if (entries()->update($id, $data)) {
logger()->info("Content {$id} successfully updated");
cache()->delete($id);
} else {
logger()->error("Content {$id} was not updated");
}
});
// Get action entries.update
actions()->get('entries.update')('hello-world', []);
```
##### Example 3
```php
// Set new action entries.create
actions()->set('entries.create', function($id, $data) {
if(registry()->get('database') == 'MySQL') {
// ... create new entry in the MySQL database.
} else {
return entries()->create($id, $data);
}
});
// Get action entries.create
actions()->get('entries.create')('blog/post-1', []);
actions()->get('entries.create')('blog/post-2', []);
actions()->get('entries.create')('blog/post-3', []);
```
The Flextype Actions API provides new capabilities to extend the Flextype core by registering and reusing useful code snippets from global actions namespace.
### Bug Fixes
* **parsers** Fixed issue with double cashing.
* **htaccess** Security fixes for `.htaccess`
* **entries** Fixed issue when entries collection fetch returns empty result.
* **plugins** Fixed Plugins API translation loading process.
* **plugins** Fixed Plugins API initialization ([#551](https://github.com/flextype/flextype/issues/551))
* **plugins** Fixed Plugins API dependency initialization.
* **plugins** Fixed Plugins API issue with non valid plugins ([#551](https://github.com/flextype/flextype/issues/555))
* **plugins** Fixed Plugins API loader issue with disabled plugins.
### BREAKING CHANGES
* **media** Media and Glide functionality removed from the flextype core due to security and perfomance reasons. Recomended to use imagekit or imgix instead.
* **core** Use new constant `FLEXTYPE_PATH_PROJECT` instead of `PATH['project']` and `FLEXTYPE_PATH_TMP` instead of `PATH['tmp']`.
* **shortcodes** New default shortcodes syntax and signatures changes for all shortocodes.
```yaml
opening_tag: "("
closing_tag: ")"
closing_tag_marker: "/"
parameter_value_separator: ":"
parameter_value_delimiter: '"'
```
* **helpers** Use new helpers functions to access Flextype Services.
* use `entries()` instead of `flextype('entries')`
* use `session()` instead of `flextype('session')`
* use `cache()` instead of `flextype('cache')`
* use `app()` instead of `flextype()`
* use `container()` instead of `flextype('container_name_here')`
* use `parsers()` instead of `flextype('parsers')`
* use `serializers()` instead of `flextype('serializers')`
* use `plugins()` instead of `flextype('plugins')`
* use `emitter()` instead of `flextype('emitter')`
* use `logger()` instead of `flextype('logger')`
* use `registry()` instead of `flextype('registry')`
* **helpers** Use helper function `app` to access Flextype Application instance instead of old helper function `flextype()`.
* **helpers** Use helper function `container` to access Flextype Application container instead of old helper function `flextype()` with container name argument.
* use `container()->get('entries')` instead of `flextype('entries')`
* use `container()->set('entries', new Entries())` instead of `flextype()['entries'] = new Entries()`
* **helpers** Use helper function `filterCollection` instead of old `filter`.
* **tokens** Project tokens moved from `project/tokens` to `project/entries/tokens`.
* **entries** Changes for etnries memory storage.
* use `entries()->registry()->get()` instead of `flextype('entries')->storage()->get()`
* use `entries()->registry()->set()` instead of `flextype('entries')->storage()->set()`
* use `entries()->registry()->has()` instead of `flextype('entries')->storage()->has()`
* use `entries()->registry()->delete()` instead of `flextype('entries')->storage()->delete()`
note: all method from Glowy PHP Arrays are available for Arrays Storage Object manipulations
docs: https://github.com/glowyphp/arrays
### Refactoring
* **core** General code refactoring and improvements.
* **tests** All unit tests were rewritten.