- Now local dependencies also could be created with
:DEFER
argument. (Thanks for thePR
to Breinstew@github)
- Fixed an error inside
reblocks/actions:make-js-action
function when called without:ARGS
. (Thanks to olivercsr@github for thePR
)
JS
function initiateFormAction now accepts four arguments instead of three. Second argument should be an event, third - the form object and fourth an options object.
This change allows to submit form using different buttons having their values passed to a lisp callback.
An examples/simple-form.lisp
file was added to demonstrate how this feature works when
form has Submit and Cancel buttons.
Note: if you've used Reblocks-UI
system, then you'll need to update it to the newest version.
- Generic-function
reblocks/widget:get-html-tag
now can return a list like(list :input :onchange \"somevalue\")
to change not onlyHTML
tag of the widget node, but also to add some arguments to it.
A new function reblocks/response:status-code
was added as a replacement to reblocks/response:get-code
.
The new function is setfable. Now you can change HTTP
status code of the currently rendered page.
This is especially helpful when rendering "Not found" or error pages.
- Error about missing action now is continuable. In case if "continue" restart was selected, page is refreshed to update actions in the session.
- Now it is possible to use symbol as an action and it will be funcalled to handle an action.
- Generic-function
reblocks/page:body-classes
was added and can be used to specify classes forHTML
body. This can be helpful when making a site using frameworks likeTailwindCSS
.
- Optional argument :defer was added to javascript dependencies.
- Argument
BASE-URI
was added toreblocks/response:make-uri
function. - Now Reblocks responds with Server-Timing and this performance information can be viewed in the browser. Read more about this header at Mozilla's docs.
- Generic-function
reblocks/widget:update
now has an optional argumentREMOVED
. You can set it to T to remove widget from theDOM
tree.
Function reblocks/request:get-remote-ip
was added.
Now function reblocks/actions:make-action-url
removed old action
argument if it is present in the
current URL
. This fixes the case when you want to make an action url from the callback processing
another action.
JavaScript function initiateFormAction
now does not overwrites whole options.args object,
but only replaces the keys corresponding to a form data fields.
Now all commands added using reblocks/response:send-script
or reblocks/commands:add-command
during the call to reblocks/widget:update
generic-function, are added after the command
for updating DOM
node on the frontend. This fixes a problem happened when you attach
some JS
handlers to the DOM
node, but after the update these handlers are deleted.
- Documentation on
reblocks/widgets/string-widget:string-widget
class and it's methods.q
- Function
reblocks/actions:make-js-action
now acceptsARGS
argument. If given, it will be serialized as a dictionary and embedded into the action calling code. This way you can pass the arguments back into your lisp callback.
- Added
includeCSS
andincludeJS
command handlers. This makes it possible to send such kind of commands via a websocket. - Now all widgets rendered on a page are collected into a hash table and you can find them by dom-id using
reblocks/page:find-widget-by-id
function.
Fixed a bug when session lock was written into the session itself instead of into the inner hash table.
Fixed error handling when debug-mode is off. Previously, the debugger was invoked before showing 500 error page to the user.
Now every response has "Cache-Control: no-cache, no-store, must-revalidate" header to prevent caching of dynamic content in the browser. This fixes the issue when you did some changes using actions then went to another page and returned using "Back" button in the browser. Previously browser was able to show you an old content of the page.
Added a notion of the current page. Now all actions are bound to some page and pages can expire, clearing actions from the memory. This should prevent memory leak leading to posible DoS attack. Page expiration is controlled by two values:
- A number of seconds while page should be considered alive. This prevents evil person from filling memory by creation of many separate sessions.
- A maximum number of pages per session. This may be needed to protect from opening too many pages within one session.
Also, you can use reblocks/page:extend-expiration-time
function to extend current page's
expiration time.
When all pages in the session are expired, session is removed from the memory too.
Generic-function reblocks/page:on-page-refresh
was added.
Another interesting feature is mixin class reblocks/cached-dependencies-mixin:cached-dependencies-mixin
.
These functions were moved to separate package REBLOCKS/PAGE-DEPENDENCIES
:
- with-collected-dependencies
- get-collected-dependencies
- push-dependencies
- already-loaded-p
- page-dependencies
New generic-function reblocks/session:init-session
was introduced. Define a method if you
need to add something into the user's session when it is initialized. This function will
be called once per user.
Generic function REBLOCKS/SESSION:INIT
was replaced with reblocks/page:init-page
and it will
be called each time a user opens site in a new browser window or tab. When user refreshes
the page it will not be called.
Function reblocks/debug:reset-latest-session
now provides a convenient restart to enable debug mode.
Function reblocks/widgets/root:get
was deleted. Use (page-root-widget (current-page))
instead.
Also root-widget-key
and corresponding package reblocks/widgets/root
were removed.
New functional was added which allows to control how does HTTP
middlewares list is generated for the server.
You might define your own reblocks/server:server
class and a method for reblocks/server:make-middlewares
generic-function.
Inside this method, you might inject additional middlewares using reblocks/server:insert-middleware
function.
Also, a variable reblocks/server:*default-samesite-policy*
was introdiced, to control default value of the SameSite HTTP
header.
As a bonus, loading of reblocks-docs system was fixed.
Now Reblocks remembers which dependencies are already loaded into the page and
will not fetch them again. This fixes issue when it fetched jQuery and broke
it's extensions making further action calls made via GET
instead of Ajax.
Added ability to set cookie in response handler. You can do it in any render method.
Here is an example how to expire a cookie right now:
(reblocks/response:set-cookie
(list :name "auth_token"
:value ""
:path "/"
:expires (get-universal-time)
:secure t
:samesite :lax))
- Error page rendering was fixed. Now such variables as page description, tags and title are
bound to their defaults while calling
reblocks/error-handler:on-error
generic-function.
- Generic-function
reblocks/error-handler:on-error
now acceptsBACKTRACE
argument which may contain a string with a backtrace. Previously, default method of this generic-function has rendered wrong backtrace when you aborted request in debugger. - Also, a function
log4cl-extras/error:print-backtrace
is used now to format a backtrace for error page and now it looks the same as backtrace in logs. - Plus, a backtrace now logged only once when unhandled error happens.
- Macro
WITH-HANDLED-ERRORS
is not exported fromREBLOCKS/ERROR-HANDLER
package anymore.
- Fixed how
reblocks/page:get-title
and other similar functions change the state. Previously there was a bug and these functions have changed a global variables.
- Fixed loading of
CSS
styles for new widgets appearing on a page. - Fixed starting server in debug mode.
- Added function
reblocks/preview:stop
to stop an app for previewing widgets during development.
- Fixed the way how dependencies are rendered in
AJAX
action response. Previously, when many widgets of the same class were updated on one user action Reblocks sent a duplicate css/js dependencies. - Function
reblocks/request:refresh-request-p
was fixed and now works as expected.
- Interactive demos now are rendered just as code block into markdown documents.
Such code block is followed by a link to
HTML
documentation ifASDF
system defines ahomepage
.
- Fixed the way how welcome page app is started. Now it always started unless some other application does not use "/" prefix.
- Also, fixed the way how application is choosen depending on request url path.
- Function
reblocks/server:stop
now removes all application and routes from the server instance. This way when you'll start it again, server might serve another set of the applications. - Now if you redefine your app using
reblocks/app:defapp
macro and changeAUTOSTART
argument fromT
toNIL
, this app will be removed from the list of applications to autostart.
- Now macro
reblocks/app:defapp
supportsDOCUMENTATION
argument. Use it to add documentation to application's class.
- Argument
CACHE-IN-MEMORY
was added toreblocks/dependencies:make-dependency
function. It allows to compile local dependency into the memory. This way you can build a standalone executable webserver withoutJS
andCSS
dependencies! - jQuery and some other dependencies now are cached in memory at compilation time.
- Now each app set's its own root widget. Root widgets is choosen depending on current application. and current application depends on the url path prefix. Previously site with multiple apps always shown the same root widget.
- Fixed the error occured after you stopped the webserver and started it again using the same port. Previously Reblocks complained that the server is already running on this port.
- Fixed the way how Reblocks signal an error on missing action. Now it does this by default
from the default implementation of the
reblocks/actions:on-missing-action
generic-function. But if variablereblocks/variables:*ignore-missing-actions*
ist
, then error will not be signaled and user will be redirected to the application's previx path.
- Documentation examples server was changed to render a list of
ASDF
systems for which documentation was built. reblocks/preview:preview
is able to accept a widget's class as a symbol.
- Function
reblocks/utils/misc:asdf-system-directory
. Useasdf:system-source-directory
instead.
- Added a welcome screen app on "/" that lists the active apps.
- Generic-function
reblocks/widget:create-widget-from
now returns a more user-friendly error message, explaining that the widget is not of a good type, instead of "no applicable generic method". - A new function
reblocks/preview:preview
was added. Give it a widget and it will setup a server on a random port and show the widget in a browser! - Ability to run many web servers each on it's own
HTTP
port. Each server can have it's own set of applications. - Added a log in
weblocks/app:start
to show the prefix of the app that is started. - Changed
(weblocks/debug:on)
andoff
so they set the log level todebug
andwarn
, respectively. - Changed a library used to log unhandled errors. Now log4cl-extras is used, because it is a successor of log4cl-json.
- Function
reblocks/server:stop
now accepts optionalinterface
andport
arguments. - Function
reblocks/action::function-or-action->action
was renamed toreblocks/actions:make-action
and made public. Oldreblocks/action:make-action
was renamed toreblocks/action::internal-make-action
. JS
function initiateActionWithArgs now usesPOST
method by default.- Function
reblocks/actions:make-action-url
is exported now and it keeps query params by default.
- Package
reblocks/widgets/base
was removed. All code now is in thereblocks/widget
package, which was a nickname previously. reblocks/app:get-active-apps
reblocks/app:finalize-webapp
reblocks/app:app-active-p
reblocks/app:start
reblocks/app:stop
reblocks/app:restart
JS
functioninitiateActionWithArgsAndDeferredCallback
was removed because of leaky abstraction of a single deferred object per page.JS
functionsinitiateActionWithArgs
andinitiateActionWithArgsAndCallback
were combined into a singleinitiateAction
function.JS
functionsinitiateFormAction
andinitiateFormActionWithCallback
were combined into ainitiateFormAction
function.
Also removed:
- A variable
*current-page-headers*
, define an:AFTER
method forreblocks/page:render-headers
instead. *approved-return-codes*
*current-page-keywords*
*current-page-title*
*style-warn-on-circular-dirtying*
*style-warn-on-late-propagation*
*rewrite-for-session-urls*
- Functions
reblocks/routes:add-route
andreblocks/routes:add-routes
were made internal.
If local dependency can't be found relative to the given ASDF
system, we try to search
the same path relative to the current directory and throw error if file can't be found.
This could happen if you've compiled the webserver into a binary and moved it to another
container or machine.
reblocks/server:start
function now accepts SAMESITE-POLICY
argument which should be one of
keywords: :LAX
, :STRICT
or :NONE
. This parameter modifies SameSite
part of the cookies
sent to the client.
Hooks API
was refactored in a backward incompatible manner. reblocks/hooks:defhook
macro now requires
to specify hook's arguments and all macros generated by the reblocks/hooks:defhook
also require arguments
specification.
jQuery was upgraded from 1.8.2 to 3.6.0. It's plugins jquery.ba-bbq.js and jquery-seq.js were turned off.
- Fixed processing of the value
x-forwarded-port
. Previously, when Weblocks was used along with lastest (after the 2019-09-07)Woo
server, this header lead to the 500 error. Because behavior of theWoo
was changed:
Now Woo does not parses numeric headers and Weblocks has to do it itself.
- A new macro
reblocks/routes:defroute
was added.
It defines a handler for a given route. By default route should return
a serialized JSON
:
(defroute (app /api/data)
"{\"my-data\": [1, 2, 3]}")
but you can redefine the content type:
(defroute (app /api/data :content-type "application/xml")
"<my-data><item>1</item><item>2</item></my-data>")
each route is associate with application class and these routes
are added to the mapper when you call a start
method.
- A small fix to make it work with
weblocks-websocket
.
- Unhandled error processing was fixed. There were numerous problems with error processing:
- Previosly server stopped to work because clack tried to write into a closed stream.
- Also, before this fix, error page didn't showed propertly.
- Any error in the route lead to a server stop because there wasn't any handler at all.
Now they are handled with
on-error
method as errors in block/page rendering.
All of them are fixed now.
- Removed check if
:bordeaux-threads
is in the*features*
, because this does not work in runtime in precompiled binary.
- Added function
weblocks/session:expire
, which can be used to tell Weblocks to delete current session after request processing. - Also, now session middleware is created explicitly along with memory store. This made possible to add another two functions to gather some statistics about number of sessions:
weblocks/session:get-number-of-sessions
;weblocks/session:get-number-of-anonymous-sessions
;- The function
weblocks/widgets/base:get-html-tag
was fixed to render tables correctly. If the widget's parent is a:table
element, then this function returns:tr
(instead of a:div
). If it is:tr
, it returns:td
, and:div
otherwise. - A new setting
weblocks/html:*pretty-html*
was created, to further control pretty printing of html both in code and in tests.
- Added a
weblocks/response:add-retpath-to
function, useful to add aretpath
GET
parameter to theURL
.
For example, calling:
(add-retpath-to "/login" :retpath
"http://example.com:10050/foo/bar")
Will return:
```lisp
"/login?retpath=http%3A%2F%2Fexample.com%3A10050%2Ffoo%2Fbar"
Argument :retpath
is optional. By default, function
will take an URL
of the current web page.
- Subsystem
weblocks/utils/i18n
was added to asd file, because otherwise systemweblocks-ui
can't be installed from the Ultralisp.
- Previosly, when you called
(weblocks/debug:off)
, subsequent call to(weblocks/debug:status)
returnedT
, but should returnNIL
.
This was fixed now.
Request handling pipeline was refactored.
The idea of this refactoring, is to separate roles of the functions
which process requests. Now weblocks/server:handle-http-request
prepares data received from the Clack
and calls
weblocks/request-handler:handle-request
to do the real job.
In it's turn, weblocks/request-handler:handle-request
should return
an object of type weblocks/response:response
containing a content,
HTTP
status code and headers of the response. Any error signal, thrown
from the handle-request
is considered by handle-http-request
as
an "unhandled error" and returned with 500 HTTP
status code.
Here is a list of changes:
- Macro
weblocks/hooks:on-application-hook-handle-request
was renamed toweblocks/hooks:on-application-hook-handle-http-request
. - Generic-function
weblocks/request-handler:handle-client-request
was renamed toweblocks/request-handler:handle-request
and now this function should return eitherstring
or an object of typeresponse
. Previously, it also made a non-local exit by throwing a tag, if request was aborted (for example to return a redirect response). But now it should only unwind a stack in case if some unhandled errow was thrown. Any condition of typeweblocks/response:immediate-response
will be catched inside a:around weblocks/request-handler:handle-request
method and returned as usualresponse
object. - Function
weblocks/response:abort-processing
was renamed toweblocks/response:immediate-return
, symbols*code*
,*headers*
and*content-type
are not exported anymore. Instead of these global variables, use newly exported functionsget-content
,get-code
,get-headers
,get-custom-headers
andget-content-type
to extract information from theresponse
object. - Package
weblocks/response
does not export symbols*code*
and*content-type*
anymore, but exports a functionmake-response
which can be used by aweblocks/request-handler:handle-reqiest
to return response.
- Function
weblocks/request:get-scheme
was added and it is usesX-Forwarded-Proto
header, if it is available.
- Function
weblocks/request:get-port
now will useX-Forwarded-Port
header if it is available. - Function
weblocks/request:get-host
now will useX-Forwarded-Host
header if it is available.
- Fixed issue introduced in
0.33.2
release - systemlack-middleware-session
was loaded successfully, butSBCL
was unable to findlack-middleware-session
package. - Now
HTML
is pretty-printed by default on all implementations. - Function
weblocks/request:get-uri
was fixed to work correctly when server is behind a reverse proxy which providesX-Forwarded-*
headers.
- Added dependency on
lack-middleware-session
system because wee use it to store sessions.
- Now unhandled exceptions are logged with tracebacks if you are using
log4cl-json
library. To turn it on, just do:
(log4cl-json:setup)
- Function
response:redirect
and it'sJS
counterpart was fixed and now work as expected. - Request processing was streamlined and now
weblocks/server:handle-request
does not contain non-local exits. This fixes usage of thehandle-request
hook, because previously, if you wrap some code around(call-next-hook)
, then part followingcall-next-hook
was ignored.
For example:
(weblocks/hooks:on-application-hook-handle-request
connect-to-database ()
(let ((success nil))
(unwind-protect (progn (setup-transaction)
(weblocks/hooks:call-next-hook)
(setf success t))
(if success
(commit)
(rollback)))))
Before this fix, rollback
always called, because execution never
hitted (setf success t)
. Now this is fixed.
- Removed external symbol
weblocks/app:make-uri
because it wasn't fbound to any function after some refactoring.
Use weblocks/response:make-uri
instead.
- A separate file
widget.lisp
was added to define aweblocks/widget
package. This solves issues whenASDF
package inferred loading is unable to findweblocks/widget
system. Seems it plays badly whenweblocks/widget
is nickname forweblocks/widgets/base
.
- A new hook was added -
start-weblocks
. It is called around the code in(weblocks/server:start)
and can be used to setup some additional routes, for example.
- Previosly, there was an error if you are using
ASDF
's package inferred system class and don't have explicit dependency on theweblocks
page.
The error was raised during code loading:
` ;;; > Error: There is no applicable method for the generic function:
#<STANDARD-GENERIC-FUNCTION WEBLOCKS/JS/BASE:MAKE-JS-BACKEND #x3020027E292F> when called with arguments: (:JQUERY)
`
Now it is fixed and package weblocks/js/jquery
is a dependency of
weblocks/server
and always loads.
- Now weblocks system explicitly requires
ASDF
>= 3.1, because it usespackage-inferred-system
class.
- Fixed error about missing 'bool type under
SBCL
.
- We don't enforce
*print-pretty*
inside ofweblocks/html:with-html
macro. This hack was required because the bug in the spinneret, which was fixed at 2018-01-04:
https://github.com/ruricolist/spinneret/commit/06b280612aff07cf376f593746d080230f2c7462
- Error was fixed when you are trying to start a server which is already running. Now you have a "restart" to stop the old version of the server before starting the new one.
However, it does not work with Woo
server, because C library libev
crashes with error:
Assertion failed: (("libev: a signal must not be attached to two different loops", !signals [w->signum - 1].loop || signals [w->signum - 1].loop == loop)), function ev_signal_start, file ev.c, line 4082
- Fixed the order of commands for frontend. Now they are returned in the chronological order.
Class weblocks/dependencies:dependency
now requires that type
attribute shoulde be of type (member :css :js :png :jpg :gif)
Also, functions make-local-js-dependency
,
make-local-css-dependency
, make-local-image-dependency
,
make-remote-js-dependency
and make-remote-css-dependency
were
removed from package weblocks/dependencies
. Use make-dependency
function, it will figure out which dependency type to create itself.
A new function weblocks/debug:get-session-value
was added. It can be
used to get values from the last session seen by weblocks.
Error handling was fixed. Previously it aborted Woo's worker thread and break the server.
Variable weblocks/variables::*catch-errors-p*
was renamed to
weblocks/variables::*invoke-debugger-on-error*
and it's value was
inverted. If this variable is True, then debugger will be
invoked. Otherwise - Weblocks will return 500 error page.
Argument :invoke-debugger-on-errors
of weblocks/debug:on
function was renamed to :invoke-debugger-on-error
.
Method weblocks/error-handler:on-error
now is called when you abort
request processing from the debugger. It is called with current app as
the first argument and the nil
instead of condition.
Fixed a typo in string-widget
and funcall-widget
package definitions.
Now string-widget
and funcall-widget
depends on
weblocks/widgets/base
instead of weblocks/widget
.
Reloading of the defapp definition now does not tries to restart an application. Previously, restart caused the problem – when there is only one application, whole Weblocks server was shut down. So, I've removed this implicit action.
Code which logs action result on the client-side was improved.
Symbols add-application-hook
, add-request-hook
,
add-session-hook
, prepare-hooks
and call-hook
aren't exported from weblocks/hooks
anymore. Use new macro
defhook
instead.
Here is how it works:
You use defhook
as the toplevel form of your file if you want to define
a new hook. This macro will create few other macroses in
weblocks/hooks
package and will export them. For example:
(defhook database-opened
"This hook is called when your application opens a database.")
This code will add these macroses into the weblocks/hooks
package:
on-session-hook-database-opened
,
on-request-hook-database-opened
,
on-application-hook-database-opened
,
with-database-opened-hook
and
call-database-opened-hook
.
You need to wrap code, which opens a database, with
with-database-opened-hook
:
(weblocks/hooks:with-database-opened-hook ()
(do-some-staff-to-open-database))
And in any other piece of code, you can define callbacks, using one of other three macroses:
(weblocks/hooks:on-session-hook-database-opened
log-database-opening ()
(weblocks/hooks:call-next-hook)
(log:info "Database was opened"))
Usage of defhook
macro gives more transparency to all defined hooks,
because all of them now visible as external symbols in
weblocks/hooks
package.
System weblocks/hooks
now depends on log4cl
and
metatilities
, because previously sometimes it was impossible to load weblocks
.
Old tests for widgets, removed from core framework were removed.
Tests for widget's MOP
methods were ported to Rove.
Package weblocks/utils/close
now loaded with main :weblocks
system.
Few old widget tests were removed.
Added function weblocks/session:reset
which resets current session.
Quickstart tutorial was fixed!
Function render-widget
was replaced with weblocks/widget:render :around
method. Method implementation were moved to
weblocks/widgets/render-methods
.
Funcall-widget's package was refactored to conform package inferred requirements.
Function make-js-action
was moved to weblocks/actions
package.
Package weblocks/app
now exports functions stop
and restart
.
Previously they were internal and were called like stop-webapp
and
restart-webapp
.
Package weblocks/server
does not export start-weblocks
and
stop-weblocks
functions. They were replaced with just start
and
stop
. Also, it's internal generics start
and stop
were
renamed and transformed to start-server
and stop-server
functions.
File default-application.lisp
was removed, because now every
application has default session initialization method.
File default-init.lisp
was refactored. Now it provides default
method for weblocks/session:init
generic and :around
method for
same generic, which allows end user just to return a string or a
function from his init
method.
Now user can return any string or function from his method
weblocks/session:init
and it will be passed to a new generic
weblocks/widget:create-widget-from
to create a root widget. You can
also define create-widget-from
for you custom types.
Function weblocks/debug:on
now turns on mode when Weblocks does not
intercept unhandled conditions, but calls an interactive debugger.
session-name-string-pair
this function was removed in previous releases, but didn't find it's way to the changelog, still used in some older tests not ported to the Rove.- Macro
defrender
was removed.
All rendering code was refactored.
Macroses with-html
and with-html-to-string
replaced
with weblocks.html:with-html
and weblocks.html:with-html-string
.
Stream *weblocks-output-stream*
was moved to
weblocks.html::*stream*
and is not external anymore. Please, don't
use it directly.
Procedure update-widget-tree
was removed and not widgets can't
change html header's tags, description, title, etc. If you need this,
change them in the render
method.
Macro root-widget
was removed and replaced with function
weblocks.widgets.root:get
.
Functions post-action-redirect
, post-render-redirect
and
initial-request-p
were removed from weblocks
package.
Function pure-request-p
was moved to weblocks.request
package.
Variable *json-content-type*
was removed.
Variable *latest-request*
was moved to
weblocks.debug:*latest-request*
.
Functions parse-location-hash
, ajax-request-p
were moved to
weblocks.request
package.
Function redirect
was moved to weblocks.response:redirect
.
Functionality, related to opening another window instead of redirection
or deferring redirection until the end of action or rendering was
removed.
Functions remove-duplicate-dirty-widgets
,
update-location-hash-dependents
and update-widget-tree
were
removed.
Call to weblocks::update-dialog-on-request
from
handle-client-request
was commented.
Generic method weblocks/error-handler:on-error
now accepts two
arguments - application object and condition.
All code from uri-parameters-slotmap.lisp
was removed.
All code, related to application class, was moved to the package
weblocks.app
. Base aplication class was renamed to
weblocks.app:app
, and macro for definition of the new
application was renamed to weblocks.app:defapp
.
All code related to application's metaclass, was moved to
the package weblocks.app-mop
. Metaclass was renamed to
weblocks.app-mop:app-class
.
Application's slot html-indent-p
and corresponding accessor
weblocks-webapp-html-indent-p
were removed because now spinneret
generates non indented code.
Slot init-user-session
was completely removed and replace with a generic
weblocks.session:init
.
These dependency related slots and accessors were removed:
application-dependencies
weblocks-webapp-application-dependencies
bundle-dependency-types
version-dependency-types
gzip-dependency-types
And macro for defining a special readers for them was removed as well:
def-debug-p-slot-readers
.
Also, these arguments to defapp
was removed:
:ignore-default-dependencies
, :dependencies
Function update-thread-status
and method webapp-update-thread-status
were removed.
Function get-webapps-for-class
was renamed to app-active-p
and
now returns t
if application of given class is already active.
Function start-webapp
was renamed to weblocks.app:start
.
Function get-webapp
was renamed to get-active-app
and optional
argument error-p
was renamed to keyword argument signal-error
.
Function find-app
was removed.
Function in-webapp
was moved to weblocks.debug:in-app
.
Variable *default-webapp*
was removed.
Variable *active-webapps*
was renamed to
weblocks.app::*active-apps*
and made internal. Use
weblocks.app:get-active-apps
function.
Reader weblocks-webapp-prefix
was renamed to
weblocks.app:get-prefix
.
Slot default-store-name
and its accessor
webapp-default-store-name
were removed.
Variable *current-webapp*
was moved to
weblocks.variables::*current-app*
.
Functions compute-webapp-public-files-uri-prefix
,
compute-webapp-public-files-uri-prefix
,
compute-webapp-public-files-path
,
make-webapp-public-file-uri
,
weblocks-webapp-public-files-cache-time
and variable
*default-public-files-path*
were removed because
now there is another way to serve static.
Function webapp-serves-hostname
was renamed to
weblocks.app:app-serves-hostname-p
and now accepts app as the first
argument and hostname as the second.
Variable *uri-tokens*
was removed and weblocks does not set
'last-request-uri session value to all uri tokens anymore.
Macro with-webapp
was moved to weblocks.app:with-app
.
Function webapp-permanent-action
was moved to
weblocks.app-actions:get-action
.
Function add-webapp-permanent-action
was moved to
weblocks.app-actions:add-action
and remove-webapp-permanent-action
to
weblocks.app-actions:remove-action
.
Macroses define-permanent-action
and define-permanent-action/cc
were moved to weblocks.app-actions:define-action
and
weblocks.app-actions:define-action/cc
.
Function make-webapp-uri
was removed, use
weblocks/response:make-uri
instedad.
Accessor webapp-js-backend
was renamed to get-js-backend
These functions were moved into the separate package
weblocks.current-app
and renamed:
webapp-prefix
->get-prefix
;
Function weblocks.actions:add-command
was moved to
weblocks.commands
.
Function weblocks:get-request-action
was moved to
weblocks/actions:get-request-action
Keyword argment :action
was removed from action calls.
Package weblocks.js
was renamed to weblocks/js/base
.
Functions escape-script-tags
, %js
and macroses
with-javascript
, with-javascript-to-string
were moved to the
package weblocks/js/base
.
These variables were moved from weblocks
package to
weblocks/variables
:
*current-page-title*
*current-page-keywords*
*current-page-headers*
*rewrite-for-session-urls*
*default-content-type*
*ignore-missing-actions*
dom-object-mixin
dom-id
request-uri-path
add-get-param-to-url
remove-parameter-from-uri
pluralize
singularize
proper-number-form
vowelp
consonantp
proper-indefinite-article
articlize
*current-locale*
current-locale
russian-proper-number-form
noun-vocative-to-genitive
*debug-words-forms*
*debug-words-genders*
determine-gender
style-warn
webapp-style-warning
renamed tostyle-warning
.non-idempotent-rendering
misunderstood-action
function-or-action->action
make-action
generate-action-code
To make Weblocks core smaller, many files were removed: views
, widgets
,
html-parts
, utilities
.
Systems weblocks-util
, weblocks-testutils
were removed.
Accessor dom-class
and generic function dom-classes
were removed
and replaced with generic function weblocks/widget:get-css-classes
.
Generic function weblocks:handle-error-condition
was removed.
Variable *dirty-widgets*
was removed along with
render-dirty-widgets
function.
Rendering of remote (non cached) dependencies was fixed.
- Symbol
weblocks.routes:*routes*
is not external anymore. Useweblocks.routes:add-route
andweblocks.routes:get-route
to add new routes and to search a route matched on a path. - Fixed getting the rendered widgets in
weblocks.widget:update
method when making:update-widget
or:insert-widget (before)
commands. - Temporary added method
weblocks::child-of-p
for new type of widget. This should fix some issues, with widgets updating.
- Class
weblocks.widget:widget
was exported, to make possible to define widgets based on it and some mixins.
- Code broken in previos release was fixed.
Most functions from weblocks.request
were refactored and renamed:
request-parameters
->get-parameters
;request-parameter
->get-parameter
;request-header
->get-header
;remove-request-header
->remove-header
;request-server-name
->get-host
;request-server-port
->get-port
;request-uri
->get-uri
(and now it returns fullURI
with scheme, host and port;request-path-info
->get-path
(and now it has keyword argumentwith-params
to copy behaviour of oldrequest-uri
and return strings like/some/path?with=parameters
;request-method
->get-method
.
All these function now accept keyword argument :request
. Previously
it was &optional
.
Another change is a new function weblocks.response:make-uri
. It can
be used to build new uri, based on the uri of the current request. This
can be useful when embedding links into emails, for example.
Warning! These changes require a newer version of Lack.
I've made a pull request fukamachi/lack#31 it is not merged yet, so, alternative version of Lack can be used, by installing it using Qlot, from here:
https://github.com/40ants/lack
- Macro
weblocks.session:get-value
was replaced with a regular function. - Function
weblocks.session:set-value
was removed and replaced with a setter(setf get-value)
.
- Removed debug these debug messages from client-side
JS
: LOADED
;- Starting
AJAX
; - Stopping
AJAX
progress; - Some
AJAX
error; - Action success.
- Package
weblocks.debug
now does not export*on
variable, but provides three functionson
,off
andstatus
. - New method
weblocks.server:serve-static-file
was introduced. It can be used to create static routes which will respond with file's content. For example, you could add this to your app'sinitialize-instance
method:
(weblocks.server:serve-static-file
"/favicon.png"
(asdf:system-relative-pathname :app "favicon.png"))
- Now weblocks rebinds
*random-state*
to itself for each request to allow it to usesetf
and change*random-state*
until the end of request processing.
- Dirty widgets rendering was fixed.
- Variable
*expired-action-handler*
, methodexpired-action-handler
and functiondefault-expired-action-handler
were replaced with methodweblocks.actions:on-missing-action
. - Now we are trying to call action only if action's name was given.
- Old method
weblocks:handle-client-request ((app weblocks-webapp))
was removed. Look at it's newer version inweblocks.request-handler
.
- Commented out call to
update-widget-tree
inside of(setf widget-children)
, because it breaks on(get-widgets-by-type 'selector :root obj)
sometimes. Seems this is because I've removed selector's code previously.
Warning! Probably parent/children handling code will be removed soon.
- Backtrace printing code was replaced with direct usage of
trivial-backtrace:print-backtrace
. - Call to
prepare-hooks
was moved fromweblocks.request-handler:handle-client-request
to the the weblocks.server:handler-request, to fix session hooks processing when:process-request
hook is called.
- Error handling code was fixed. It was broken in 0.17.1 and prevented system loading.
- Fixed error handling when debug mode is "off". Now weblocks returns
result of
(weblocks.error-handler:on-error app)
call.
- Added a
weblocks.actions
package. - Also, a
commands
were introduced. Commands describe remote calls which have to be applied on a client as a result of action's execution. Previously, weblocks used similar technic to replace dirty widgets and to execute some javascript code before or after replacement. The new mechanism of "commands" is more generic and uses theJSON-RPC
to pass function name and parameters from backend to client-side. - Added
weblocks.session:in-session-p
function which returnst
if session data can be retrived or stored without error. - Now function
initiateActionWithArgsAndCallback
send arguments asJSON
payload. This allows to send any datastructures as action's params. - Function
weblocks.response:send-script
was changed to use new mechanizm with commands. When you send script from the action, it will add a command:execute-code
to the stack. All commands are executed in same order as they were added. If you want some code to be executed before widget update, just executesend-code
beforeweblocks.widget:update
.
- New package was introduced -
weblocks.widget
it contains a newwidget
class with simplified rendering based onspinneret
templating library. - Now class
route
is exported fromweblocks.routes
and should be used instead ofroutes:route
. - New package
weblocks.error-handler
was introduced. It contains aon-error
generic method which is called when some unhandled error raise by application. - Fixed issue of adding multuple routes mapped to the same path. Now if url mapper already have a route all subsequent attempts to add a route with same path are ignored.
- Fixed error:
Undefined function WEBLOCKS:WEBAPP-SESSION-KEY called with arguments (#<APP::APP #x3020052F01DD>)
- Fixed
Content-Type
of the default 500 page. Previously it wasplain/text
and browser didn't undestand that and downloaded the file.
Now Content-Type
is text/plain
.
- Now weblocks does not checks if all tokens from
URL
were consumed by app during root widget rendering. Previously it returned 404 if some token weren't consumed. Implement this logic in your app if needed. - Macro
assert-hooks-called
was changed to return hooks in the order they were called. Also, now it waits hooks description as aDSL
, like:
lisp (assert-hooks-called (:fact-created contact "[email protected]") (:fact-removed contact "[email protected]"))
- New system
weblocks-testutils
was introduced. It compilesweblocks.t.utils
package which macroses useful for unittesting.
Also, a new macro catch-hooks
was added to check if some
hooks were called during a unittest.
- Now weblocks does not open a new tab or window on 500 error during an action execution.
- No more
declaim optimize
in different places. These declarations changed compiler's settings at unexpected moments. - Fixed error happened when "File not found", and now
with-hook
macro returns the value of the last form's evaluation.
- Default method of
render-page
was fixed to really wrap page with<html>...
block. - Fixed a way how weblocks.debug:latest-session is processed.
- Function
weblocks.request:remove-request-header
now returns a new instance of request object and does not modify the original request. This fixes issue inweblocks-websocket
.
- Added package
weblocks.debug
and keeping latest session was rewritten using:process-request
hook.
- Added function
weblocks.request:remove-request-header
. - Added a hook
(:reset-session session)
, which is called around a code for clearing given session. Right now it is called only fromweblocks.sessions:reset-latest-session
.
html
,menu
,suggest
andrepl
utilities were excluded.- Code which was in
request-handler.lisp
, was excluded from build and partly moved torequest-handler2.lisp
. - Added
:stop-weblocks
hook. - Misc helper for repl were removed:
sessions
,in-session
andpt
. May be the will be restored in separate package. - Page boilerplate rendering method
render-page
now does not use complex templating with contextes. - Symbols refactoring:
*style-warn-on-circular-dirtying*
variable ->weblocks.variables
;*style-warn-on-late-propagation*
variable ->weblocks.variables
;gen-id
function ->weblocks.session
;send-script
function ->weblocks.response
;with-html-form
macro ->weblocks-ui
;*approved-return-codes*
variable ->weblocks.variables
;handle-ajax-request
method ->weblocks.request-handler
;update-location-hash-dependents
function ->weblocks.request-handler
.render-link
function was moved toweblocks-ui.form
in separate system.
- Added
weblocks.hooks:call-hook
helper. - Now
call-next-hook
is called automatically if it wasn't called explicitly.
- Added
:handle-request
dynamic hook called around request handling code.
Called when weblocks.request:*request*
and weblocks.session:*session*
are already bound.
- Added
:handle-request
dynamic hook called around request handling code.
Called when weblocks.request:*request*
and weblocks.session:*session*
are already bound.
- Added integrity field for remove javascript dependencies.
Also,
get-cross-origin
and:cross-origin
were removed toget-crossorigin
and:crossorigin
, to conform the html attibute's spelling.
- Fixed error on
(weblocks:redirect...)
call. - Fixed dependency handling in ajax requests.
- Now if unhandled exception occure, Woo's handler remains working. Previously, handler's thread shut down on any unhandled exception.
- Ajax progress now does not inserted into the document,
but if element with id
ajax-progress
is present, it will be shown and hidden by jQuery's.show
and.hide
methods. Also, they take optional speed parameters fromdata-*
attributesdata-show-speed
anddata-hide-speed
. - Reformatted documentation. Started to keep a changelog.
- Previous history wasn't tracked.