fbpx
Wikipedia

Yesod (web framework)

Yesod (IPA: [je'sod]; Hebrew: יְסוֺד, "Foundation") is a web framework based on the programming language Haskell for productive development of type-safe, representational state transfer (REST) model based (where uniform resource locators (URLs) identify resources, and Hypertext Transfer Protocol (HTTP) methods identify transitions), high performance web applications, developed by Michael Snoyman, et al. It is free and open-source software released under an MIT License.

Yesod
Original author(s)Michael Snoyman
Developer(s)Michael Snoyman et al.
Initial release2010; 14 years ago (2010)
Stable release
1.6.2.1[1]  / 8 September 2022; 19 months ago (8 September 2022)
Repository
  • github.com/yesodweb/yesod
Written inHaskell
Operating systemCross-platform
Available inEnglish
TypeWeb framework
LicenseMIT
Websitewww.yesodweb.com

Yesod is based on templates, to generate instances for listed entities, and dynamic content process functions, through Template Haskell constructs to host domain-specific language (eDSL) content templates called QuasiQuotes, where the content is translated into code expressions by metaprogramming instructions.[2]

There are also web-like language snippet templates that admit code expression interpolations, making them fully type-checked at compile time.[3]

Yesod divides its functions in separate libraries (database, html rendering, forms, etc.) so functions may used as needed.

MVC architecture edit

(MVC)

Controller edit

Server interface edit

Yesod uses a Web application interface (WAI),[4] a type of application programming interface (API), to isolate servlets, aka web apps., from servers, with handlers for the server protocols Common Gateway Interface (CGI),[5] FastCGI,[6] Simple Common Gateway Interface (SCGI),[7] Warp,[8] Launch (open as local URL to the default browser, closing the server when the window is closed),[9]

The foundation type edit

See ref.[10] Yesod requires a data type that instantiates the model–view–controller classes. This is called the foundation type. In the example below, it is named "MyApp".

The REST model identifies a web resource with a web path. Here, REST resources are given names with an R suffix (like "HomeR") and are listed in a parseRoutes site map description template. From this list, route names and dispatch handler names are derived.

Yesod makes use of Template Haskell metaprogramming to generate code from templates at compile time, assuring that the names in the templates match and everything typechecks (e.g. web resource names and handler names).

By inserting a mkYesod call, this will call Template Haskell primitives to generate the code[11] corresponding to the route type members, and the instances of the dispatch controller classes as to dispatch GET calls to route HomeR to a routine named composing them both as "getHomeR", expecting an existing handler that matches the name.

Hello World edit

"Hello, World!" program example based on a Common Gateway Interface (CGI) server interface (the handler types have changed, but the philosophy remains):

{- file wai-cgi-hello.hs -} {-# LANGUAGE PackageImports, TypeFamilies, QuasiQuotes, MultiParamTypeClasses,   TemplateHaskell, OverloadedStrings #-} import "wai" Network.Wai import "wai-extra" Network.Wai.Handler.CGI (run) -- interchangeable WAI handler import "yesod" Yesod import "yesod-core" Yesod.Handler (getRequest) import "text" Data.Text (Text) import "shakespeare" Text.Cassius (Color(..), colorBlack) -- the Foundation type data MyApp = MyApp -- sitemap template, listing path, resource name and methods accepted -- `mkYesod` takes the foundation type name as param. for name composition of dispatch functions mkYesod "MyApp" [parseRoutes| / HomeR GET |] instance Yesod MyApp -- indentation structured CSS template myStyle :: [Text]  CssUrl url myStyle paramStyle =  [cassius| .box  border: 1px solid #{boxColor} |]  where  boxColor = case paramStyle of   ["high-contrast"]  colorBlack   _  Color 0 0 255 -- indentation structured HTML template myHtml :: [(Text, Text)]  HtmlUrl url myHtml params = [hamlet| 
<!-- indentation, or lack of it, under starting tags or commands ('$' prefix)   describe the content or sequence tree structure --> <!-- '.' or '#' prefixes in tags introduce css styled "class" or "id" attribute values --> <!-- interpolation of haskell expressions follow the "shakespeare templates" #{expr} syntax --> <p>Hello World! There are <span .box>#{length params} parameters</span>: $if null params <p>Nothing to list $else <ul> $forall param <- params  <li>#{fst param}: #{snd param} |] 
getHomeR :: Handler RepHtml getHomeR = do  req <- getRequest  let params = reqGetParams req  paramStyle <- lookupGetParams "style"    defaultLayout $ do  -- adding widgets to the Widget monad (a ''Writer'' monad)  setTitle "Yesod example"  toWidgetHead $ myStyle paramStyle  toWidgetBody $ myHtml params -- there are ''run'' function variants for different WAI handlers main = toWaiApp MyApp >>= run 
# cgi test export REMOTE_ADDR=127.0.0.1 export REQUEST_METHOD=GET export PATH_INFO=/ export QUERY_STRING='p1=abc;p2=def;style=high-contrast' ./wai-cgi-hello 

[10]

Resources, routes, HTTP method handlers edit

See ref.[12][13] Yesod follows the representational state transfer model of access to web documents, identifying docs. and directories as resources with a Route constructor, named with an uppercase R suffix (for example, HomeR).

The routes table
The parseRoutes template should list the resources specifying route pieces, resource name and dispatch methods to be accepted.

URL segment capture as parameter is possible specifying a '#' prefix for single segment capture or '*' for multisegment capture, followed by the parameter type.

-- given a MyApp foundation type mkYesod "MyApp" [parseRoutes| /  HomeR -- no http methods stated: all methods accepted /blog  BlogR GET POST -- the '#' prefix specify the path segment as a route handler parameter /article/#ArticleId ArticleR GET PUT -- the '*' prefix specify the parameter as a sequence of path pieces /branch/*Texts BranchR GET -- to simplify the grammar, compound types must use an alias, eg. type Texts for ''[Text]'' |] 
  • Applying the previous template generates the following route constructors:
data Route MyApp =   HomeR  -- referenced in templates as: @{HomeR}  | BlogR  -- in templates: @{BlogR}  | ArticleR ArticleId -- in templates: @{ArticleR myArticleId}  | BranchR Texts -- in templates: @{BranchR myBranchSegments} 
  • For every supported HTTP method a handler function must be created to match the dispatch names generated by mkYesod from the parseRoutes template, by prefixing the method name (or the prefix "handler" if no method stated) to the resource, as described (actual versions handler types have changed, but the philosophy remains):
-- for "/ HomeR" -- no http methods stated ⇒ only one handler with prefix ''handler'' handlerHomeR :: HasReps t  Handler t -- for "/blog BlogR GET POST" getBlogR :: HasReps t  Handler t postBlogR :: HasReps t  Handler t -- for "/article/#ArticleId ArticleR GET PUT" getArticleR :: HasReps t  ArticleId  Handler t putArticleR :: HasReps t  ArticleId  Handler t 

Request data, parameters, cookies, languages, other header info edit

See ref.[12]

Authentication, authorization edit

See ref.[14] Authentication plugins: OpenID, BrowserID, Email, GoogleEmail, HashDB, RpxNow.[15]

There is an important setting for automatic redirection after authentication.[16]

Sessions edit

See ref.[17] Session back-ends: ClientSession[18] (it stores the session in a cookie), ServerSession[19][20] (it stores most of the session data at the server)

>> To avoid undue bandwidth overhead, production sites can serve their static content from a separate domain name to avoid the overhead of transmitting the session cookie for each request
Session messages edit

A success, failure or indicative message can be stored (setMessage) in the Session and will be shown, if it exists, by the default_layout routine through the default_layout.hamlet template, being cleared on consultation.[21]

Subsites edit

Common URL prefix subsites for workflows, file serving or site partitioning. See ref.[22][23]

Built-in subsites: Static,[24][25] Auth[26]

Form processing, layout generation edit

See ref.[27]

The Form type here is an object that is used in the controller to parse and process the form fields user input and produce a (FormResult, Widget) pair were the widget holds the layout of the next rendering of the form with error messages and marks. It can also be used to generate a new form with blanks or default values.

The form type takes the shape of a function of an html snippet to be embedded in the view, that will hold security purpose hidden fields.

A form object is generated from an ApplicativeMonadic composition of fields for a combined, sequential parsing of field inputs.

There are three types of forms:

  • Applicative (with tabular layout),
  • Monadic (with free layout style), both in the Yesod.Form.Functions module,
  • Input (for parsing only, no view generated) in the Yesod.Form.Input module.

The field generators, whose names are composed by the form type initial (a|m|i) followed by (req|opt){- required or optional -}, have a fieldParse component and a fieldView one.[28]

  • the function runForm{Post|Get} runs the field parsers against the form field inputs and generates a (FormResult, Widget) pair from the views offering a new form widget with the received form field values as defaults. The function suffix is the http method used in the form submission.
  • while generateForm{Post|Get} ignores inputs from the client and generates a blank or defaults form widget.[29]

The actual function parameters and types have changed through Yesod versions. Check the Yesod book and libraries signatures.

The magic is in the FormResult data type Applicative instance, where (<*>) collects the error messages for the case of FormFailure [textErrMsg] result values[30]

Monadic forms permit free form layout and better treatment of hiddenField members.[27]

A sample of an Applicative[31] form:

-- a record for our form fields data Person = Person {personName :: Text, personAge :: Int, personLikings :: Maybe Text} -- the Form type has an extra parameter for an html snippet to be embedded, containing a CSRF token hidden field for security type Form sub master x = Html  MForm sub master (FormResult x, Widget) {- -- for messages in validation functions:  @param master: yesod instance to use in renderMessage (return from handler's getYesod)  @param languages: page languages to use in renderMessage -- optional defaults record:  @param mbPersonDefaults: Just defaults_record, or Nothing for blank form -} personForm :: MyFoundationType  [Text]  Maybe Person  Form sub master Person {- ''aopt'' (optional field AForm component) for "Maybe" fields,  ''areq'' (required fld AForm comp.) will insert the "required" attribute -} personForm master languages mbPersonDefaults = renderTable $   Person <$> areq textField fldSettingsName mbNameDefault   <*> areq customPersonAgeField fldSettingsAge mbAgeDefault   <*> aopt textareaField fldSettingsLikings mbLikingsDefault   where  mbNameDefault = fmap personName mbPersonDefaults  mbAgeDefault = fmap personAge mbPersonDefaults  mbLikingsDefault = fmap personLikings mbPersonDefaults  -- "fieldSettingsLabel" returns an initial fieldSettings record  -- recently the "FieldSettings" record can be defined from a String label since it implements IsString  fldSettingsName = (fieldSettingsLabel MsgName) {fsAttrs = [("maxlength","20")]}  fldSettingsAge = fieldSettingsLabel MsgAge  fldSettingsLikings = (fieldSettingsLabel MsgLikings) {fsAttrs = [("cols","40"),("rows","10")]}  customPersonAgeField = check validateAge intField  validateAge y  | y < 18 = Left $ renderMessage master languages MsgUnderAge  | otherwise = Right y 

View edit

The types shown correspond to an older version, but the philosophy remains.

The Handler monad returns content in one or more of several formats as components of types that implement the HasReps class[32] {RepHtml, RepJson, RepXml, RepPlain, the dual RepHtmlJson, a pair or list of pairs [(ContentType, Content)], ..}.[33][34] Json examples:[35][36][37]

The HasReps default implementation of chooseRep chooses the document representation to be returned according to the preferred content-type list of the client accept header.[32]

  • Widgets[38] are HTML DOM code snippets made by specific commands (e.g. setTitle) or from templates of structure (HTML) / behaviour (JavaScript) / style (CSS), whose types instantiate the classes ToWidget, ToWidgetHead or ToWidgetBody.

A Widget monad,[39] based on a Writer[40] one and argument to defaultLayout, facilitate to piece the widgets together.

Indentation based templates for tree structured markup edit

'$' prefixes lines of logic statements.

Automatic closing tags are generated only for the tag at line start position.

  • the whamlet quasiquoter returns a Widget expression. (saves to Widget before [hamlet|..|]).
toWidget [hamlet| $doctype 5 <html> <!-- only the tag at the beginning of the line will be automatically closed --> <!-- '.' or '#' prefixes in tags introduce class/id names, à la CSS --> <!-- ":boolVar:" prefix in attributes makes them conditionally generated --> <!-- interpolation of haskell expressions follow the "shakespearean templates"  syntax introduced in the so named section --> <head> <title>#{pageTitle} - My Site <link rel=stylesheet href=@{Stylesheet_route}> <body> <header> ^{headerTemplate} <section #mySectionId>  <p><span .titleClass>_{MsgArticleListTitle}</span>  $if null articles  <p :isRed:style="color:red">_{MsgSorryNoArticles}  $else  <ul>  $forall art <- articles  <li>#{articleNumber art} .- #{articleTitle art} <footer>  ^{footerTemplate} |] 
Template interpolation - Shakespearean templates edit

See ref.[42] These are content view templates that follow a common substitution pattern of code expressions within curly brackets with different character prefix to refer to

template expressions with ^{...}
refers to other templates of the same type, with given parameters as ^{template params},
route expressions with @{...}
safe (typed) urls as @{HomeR},
message expressions with _{...}
i18n message rendering as _{MsgMessageLabel params}
other Haskell expressions with #{...}
haskell expression rendering as #{haskell_expression} which type must be convertible
    • in case of hamlet html templates, the expression type must be an instance of Text.Blaze.ToMarkup[44]
    • in case of CSS templates, the expression type must be an instance of Text.Cassius.ToCss[45]
    • in case of JavaScript templates, the expression type must be an instance of Text.Julius.ToJavascript [46]
    • in case of i18n message definitions (in "<isoLanguage>.msg" files) with parameter interpolations, the expression type must be an instance of Text.Shakespeare.I18N.ToMessage [47]
    • in case of text/plain templates (for use in emails), the expression type must be an instance of Text.Shakespeare.Text.ToText [48]

Using non-English text in expressions requires use of the Unicode-aware type Text, since the Glasgow Haskell Compiler's (GHC's) show for the type String renders non-ASCII characters as escaped numerical codes.

External file templates
  • at compile time: Template content can be loaded from external files using compile time splice calls as $(expr).[49]
  • at run time: There is a reload mode for reparsing external template files at every service call, except for HTML hamlet templates: See doc.[50]
Other templates edit
for JavaScript, CoffeeScript, Roy
the julius quasiquoter: introduces a JavaScript template.[51] JavaScript variants CoffeeScript and Roy-language[52] have also specific quasiquoters.[2][51]
for CSS
  • the cassius quasiquoter: introduces a css template with indentation based structuring.[53]
  • the lucius quasiquoter: introduces a css template with standard syntax plus shakespeare-template style substitutions.[54]
TypeScript and JSX templates
the tsc and tscJSX quasiquoters. Only on UNIX derivatives (no Windows by now).[55]
text/plain templates
for e-mail or text/plain http content type.[56]
  1. templates: lt: lazy text, st: strict text
  2. templates for text with a left margin delimiter '|': lbt (lazy), sbt (strict)

Localizable messages edit

See ref.[57]

Yesod app messages are localizable (i18n). They should be held within the messages folder, in files named based on ISO, as <iso-language>.msg

Message entries follow the EBNF pattern:

-- EBNF: identifier, {' ', parameter, '@', type}, ":", text with interpolations ArticleUnexistent param@Int64 : unexistent article #{param} 
  • message constructors are formed prepending "Msg" to the message label identifier.
  • the message datatype is formed appending "Message" to the foundation type name.
-- in code myMsg :: MyAppMessage -- datatype appending "Message" to the foundation type myMsg = MsgArticleUnexistent myArticleId -- constructor prepending "Msg" to the msg. label -- in widget templates  _{MsgArticleUnexistent myArticleId} 

Actual i18n support is missing from the stack app template. The mkMessage "MyApp" messagesFolder isoLangDefault must be added to the "Foundation.hs" file to get the messages instantiated.[58]

Navigation breadcrumbs edit

  • Navigation breadcrumbs.[59] A YesodBreadcrumbs instance must be provided for the site where the generator function breadcrumb should return for each route a title and parent one. Then, the query function breadcrumbs will return the present route title and the ancestors' (route, title) pairs.

Search engine XML Sitemap edit

  • Search engines XML Sitemaps,[60] where sitemap returns an XML Sitemap as http response, with the routes we want the search engines to crawl, and attributes to instruct the crawler, from a provided list of SitemapUrl records.

Web feed views edit

  • Web feed views (RDF Site Summary (RSS) – Atom).[61] Handlers return RepRss, RepAtom, or dual RepAtomRss content (to be selected on accept headers' preferred content-type list) from a given Feed structure.

Model edit

Using in-memory mutable data (in the foundation datatype) edit

E.g. a visitor count. See ref.[62]

The Database layer edit

  • persistent is the name of the database access layer with templates for generating types for entities and keys as well as schema initialization.[63][64][65]

There is first class support for PostgreSQL, SQLite, MongoDB, CouchDB and MySQL, with experimental support for Redis.[63]

The Database layout is described in a template listing the entities, fields and constraints.[66]

  • For every entity listed, an integer key column "id" is generated with autoincrement and primary index attributes, with a type alias appending Id to the entity name
  • For every entity listed, a record type named as the entity is generated were record fields names are composed prefixing the entity name to the field name like "personName". An EntityField type "PersonName" is also generated for foreign key referencing from other entities.
  • There is an automatic database schema migration mechanism for DB schema updates, which, to succeed, requires, when adding columns to existent tables, to specify 'Default-column-value constraints with sql level notation.[67]
  • "At most one" cardinality has a special mechanism around the type Checkmark.[68]
  • Weak entities (childs in life constrained owner-child relationships) have no special support for cascade delete triggers, but there are functions to deleteCascade manually in the Database.Persist.Class module.[69]
automatic table creation, schema update and table migration
Modifications of the entities template produces an schema update with automatic table creation, and migration for the DBMS's that support "ALTER TABLE" SQL commands in a migrateAll procedure, generated from the template content. See "Migrations" in ref.[63] to look for migration aware DBMS.
share [mkPersist sqlSettings,  mkMigrate "migrateAll" -- generates the migration procedure with the specified name  ] [persist| User -- table name and entity record type  -- implicit autoincrement column "id" as primary key, typed UserId  ident Text  -- refers to db. table column "ident";    -- generates a record field prefixing the table name as "userIdent"  password Text Maybe -- Maybe indicates Nullable field  UniqueUser ident -- unique constraint with space sep. field sequence Email -- table name and entity record type  -- implicit autoincrement column "id" as primary key, typed EmailId  email Text  user UserId  -- foreign key by specifying other tables EntityField types  verkey Text Maybe  newlyAddedColumn Text "default='sometext'::character varying" -- sql level Default constraint  UniqueEmail email -- unique constraint |] 
  • Esqueleto: is a haskell combinators layer to generate correct relational queries to persistent.[70]

Example for persistent rawSQL and Esqueleto queries.[71]

E-mail edit

The following packages are part of the yesod-platform:[72]

  • email-validate: Validating an email address.[73]
  • mime-mail: Compose and send MIME email messages.[74]

Facebook edit

  • Useful glue functions between the fb library and Yesod.[75]

Development cycle edit

New Yesod apps are generated from the HaskellStack tool[76] templates, replacing previous command "yesod init"

Stack based app. template names are prefixed by yesod as "yesod-{minimal | postgres | sqlite | mysql | mongo | ...}"

  • Since HaskellStack uses the stackage repo by default, extra packages from the hackage repo should be referred in the "stack.yaml" extra-deps section.
  • Packages may be customized to a local subfolder. They must be referred in the "stack.yaml" packages section.

The "Yesod helper" tool edit

  • The yesod helper tool [77]
    • yesod devel run from the project site, recompiles and restarts the project at every file tree modification.
    • yesod add-handler adds a new handler and module to the project, adding an import clause for the handler in the "Application" module.

Deploying with Keter: A web app server monitor and reverse proxy server edit

See refs.[78][79] [80]

Keter is a process as a service that handles deployment and restart of Yesod web app servers, and, per web app, database creation for PostgreSQL.

The console command yesod keter packs the web app. as a keter bundle for uploading to a keter folder named "incoming".

Keter monitors the "incoming" folder and unpacks the app. to a temporary one, then assigns the web app a port to listen to, and starts it.

Initially it worked with Nginx as reverse proxy (keter version 0.1*), adding virtual server entries to its configuration and making Nginx reload it, but now Keter itself provides its own reverse proxy functionality, removing Nginx dependency and acting as the main web server.[81]

Old documentation (Nginx based).[82][83]

Integration with JavaScript generated from functional languages edit

See ref.[84][85][86]

See also edit

References edit

  1. ^ "Release 1.6.2.1". 8 September 2022. Retrieved 24 October 2022.
  2. ^ a b c "HaskellWiki - QuasiQuotation". Haskell.org. 2012-05-26. Retrieved 2012-10-23.
  3. ^ "University of Kent - Comparing Dynamic and Static Language Approaches to Web Frameworks - Yesod vs Ruby on Rails" (PDF). Retrieved 2012-10-23.
  4. ^ "The wai package". Hackage.haskell.org. Retrieved 2012-10-23.
  5. ^ "The wai-extra package with CGI WAI handler". Hackage.haskell.org. Retrieved 2012-10-23.
  6. ^ "The wai-handler-fastcgi package". Hackage.haskell.org. Retrieved 2012-10-23.
  7. ^ "The wai-handler-scgi package". Hackage.haskell.org. Retrieved 2012-10-23.
  8. ^ "The warp package". Hackage.haskell.org. Retrieved 2012-10-23.
  9. ^ "The wai-handler-launch package". Hackage.haskell.org. Retrieved 2012-10-23.
  10. ^ a b "book - Basics". Yesodweb.com. Retrieved 2012-10-23.
  11. ^ The mkYesod code
  12. ^ a b "book - Routing and Handlers". Yesodweb.com. Retrieved 2012-10-23.
  13. ^ "Playing with Routes and Links". FPComplete.com. 2012-10-17. Retrieved 2012-10-28.
  14. ^ "book - Authentication and Authorization". Yesodweb.com. Retrieved 2012-10-23.
  15. ^ "The yesod-auth package". Hackage.haskell.org. Retrieved 2012-10-26.
  16. ^ "book - Sessions - See section "Ultimate Destination"". Yesodweb.com. Retrieved 2012-11-17.
  17. ^ "Sessions". Yesodweb.com. Retrieved 2012-10-23.
  18. ^ "Web.ClientSession". Hackage.haskell.org. Retrieved 2012-10-25.
  19. ^ "ServerSession: secure modular server-side sessions". Hackage.haskell.org. Retrieved 2018-10-29.
  20. ^ "Web.ServerSession.Frontend.Yesod". Hackage.haskell.org. Retrieved 2018-10-29.
  21. ^ "Session Messages". Yesodweb.com. Retrieved 2018-10-23.
  22. ^ "Creating a Subsite". Yesodweb.com. Retrieved 2012-10-25.
  23. ^ "Yesod and subsites: a no-brainer". Monoid.se. 2012-08-22. Retrieved 2012-10-28.[]
  24. ^ "The Magic of Yesod, part 2 - See section "Static Subsite"". Yesodweb.com. 2010-12-25. Retrieved 2012-10-25.
  25. ^ "The package yesod-static - Static Subsite". Hackage.haskell.org. Retrieved 2012-10-25.
  26. ^ "The package yesod-auth - Auth Subsite". Hackage.haskell.org. Retrieved 2012-10-25.
  27. ^ a b "book - Forms". Yesodweb.com. Retrieved 2012-10-23.
  28. ^ "Yesod.Form.Fields". Hackage.haskell.org. Retrieved 2012-10-23.
  29. ^ "Yesod.Form.Functions runFormPost". Hackage.haskell.org. Retrieved 2012-10-25.
  30. ^ "Yesod.Form.Types". Hackage.haskell.org. Retrieved 2012-10-23.
  31. ^ "HaskellWiki - Applicative functor". haskell.org. Retrieved 2012-10-24.
  32. ^ a b "The class HasReps". Hackage.haskell.org. Retrieved 2012-10-23.
  33. ^ "RESTful Content". Yesodweb.com. Retrieved 2012-10-23.
  34. ^ "The class ToContent". Hackage.haskell.org. Retrieved 2012-10-23.
  35. ^ "More Client Side Yesod: todo sample". Yesodweb.com. 2012-04-23. Retrieved 2012-10-23.
  36. ^ "JSON Web Service". Yesodweb.com. Retrieved 2012-10-23.
  37. ^ "The yesod-json package". Hackage.haskell.org. Retrieved 2012-10-23.
  38. ^ "book - Widgets". Yesodweb.com. Retrieved 2012-10-23.
  39. ^ "The widget monad". Hackage.haskell.org. Retrieved 2012-10-23.
  40. ^ "The Writer monad". Haskell.org. Retrieved 2012-10-23.
  41. ^ "Template Haskell Quasi-quotation". Haskell.org. Retrieved 2012-11-02.
  42. ^ a b "book - Shakesperean templates". Yesodweb.com. Retrieved 2012-10-23.
  43. ^ "The hamlet template module". Hackage.haskell.org. Retrieved 2012-10-23.
  44. ^ "Class Text.Blaze.ToMarkup". Hackage.haskell.org. Retrieved 2012-10-23.
  45. ^ "Class Text.Cassius.ToCss". Hackage.haskell.org. Retrieved 2012-10-23.
  46. ^ "Class Text.Julius.ToJavascript". Hackage.haskell.org. Retrieved 2012-10-23.
  47. ^ "Class Text.Shakespeare.I18N.ToMessage". Hackage.haskell.org. Retrieved 2012-10-24.
  48. ^ "Class Text.Shakespeare.Text.ToText". Hackage.haskell.org. Retrieved 2012-10-24.
  49. ^ "Template Haskell". haskell.org. Retrieved 2012-11-03.
  50. ^ "book - Shakesperean templates # Calling shakespeare". Yesodweb.com. Retrieved 2012-10-23.
  51. ^ a b "The Julius template module". Hackage.haskell.org. Retrieved 2012-10-23.
  52. ^ "Roy language". Roy.brianmckenna.org. Retrieved 2012-10-23.
  53. ^ "The Cassius template module". Hackage.haskell.org. Retrieved 2012-10-23.
  54. ^ "The Lucius template module". Hackage.haskell.org. Retrieved 2012-10-23.
  55. ^ "The Typescript template module". Hackage.haskell.org. Retrieved 2018-10-10.
  56. ^ "Shakespeare plain text templates module". Hackage.haskell.org. Retrieved 2012-10-24.
  57. ^ "book - Internationalization". Yesodweb.com. Retrieved 2012-10-23.
  58. ^ mkMessage
  59. ^ "The YesodBreadcrumbs class". Hackage.haskell.org. Retrieved 2012-11-05.
  60. ^ "The yesod-sitemap package". Hackage.haskell.org. Retrieved 2012-10-26.
  61. ^ "The yesod-newsfeed package for RSS / Atom views". Hackage.haskell.org. Retrieved 2012-10-26.
  62. ^ "Book - Initializing data in the foundation datatype". Yesodweb.com. Retrieved 2014-05-26.
  63. ^ a b c "book - Persistent". Yesodweb.com. Retrieved 2012-10-23.
  64. ^ "Yesod-persistent package". Hackage.haskell.org. Retrieved 2012-10-23.
  65. ^ "Yesod-persistent docs". github.com. Retrieved 2018-10-16.
  66. ^ "Yesod-persistent entity syntax". github.com. Retrieved 2018-10-16.
  67. ^ "Redundant migrations for fields' default values". GitHub.com. Retrieved 2012-12-04.
  68. ^ ""At most one" cardinality enforcement in persistent with type Checkmark". Hackage.haskell.org. Retrieved 2018-10-16.
  69. ^ "How can I create a foreign key constraint using Yesod/Persistent?". stackoverflow.com. Retrieved 2018-10-16.
  70. ^ "esqueleto package". Hackage.haskell.org. Retrieved 2012-10-23.
  71. ^ "Query example at". Stackoverflow.com. 2012-09-19. Retrieved 2012-10-23.
  72. ^ "The yesod package". Hackage.haskell.org. Retrieved 2019-06-26.
  73. ^ "The email-validate package". Hackage.haskell.org. Retrieved 2012-10-26.
  74. ^ "The mime-mail package". Hackage.haskell.org. Retrieved 2012-10-26.
  75. ^ "The yesod-fb package". Hackage.haskell.org. Retrieved 2012-10-26.
  76. ^ Haskell Stack - How to install
  77. ^ The yesod-bin pkg with the helper tool (with instructions for use with the stack tool)
  78. ^ "book - Deploying your Webapp". Yesodweb.com. Retrieved 2012-10-23.
  79. ^ Readme.Md. "Yesod keter readme". GitHub. Retrieved 2012-10-23.
  80. ^ "The keter package". Hackage.haskell.org. Retrieved 2012-10-23.
  81. ^ "Keter updates". Yesodweb.com. 2012-10-25. Retrieved 2012-10-25.
  82. ^ "Keter: Web App Deployment". Yesodweb.com. 2012-05-11. Retrieved 2012-10-23.
  83. ^ "Keter: It's Alive!". Yesodweb.com. 2012-05-17. Retrieved 2012-10-23.
  84. ^ "Javascript Options". github.com. Retrieved 2014-03-12.
  85. ^ "Yesod, AngularJS and Fay". yesodweb.com. 2012-10-30. Retrieved 2014-03-12.
  86. ^ "HaskellWiki - The JavaScript Problem". haskell.org. Retrieved 2014-04-12.

External links edit

  • Official website  
  • Presentations: InfoQ, Haskell eXchange 2012
  • Slides: A.C.M. at Johns Hopkins University - ReST-ful Websites with Yesod
  • ScreenCast: Yesod 1.0 at Vimeo
  • O'Reilly ebook - Developing Web Applications with Haskell and Yesod - Safety-Driven Web Development
  • Q&A: StackOverflow.com - Yesod tagged Q&A

Blog tutorials edit

  • FPComplete.com - My First Web Site, Playing with Routes and Links
  • Yesod for newbies
  • hamberg.no - handlerToIO: use forkIO in Yesod handlers

Comparisons edit

  • HaskellWiki - Haskell web frameworks
  • A Hopefully Fair and Useful Comparison of Haskell Web Frameworks
  • University of Kent - Comparing Dynamic and Static Language Approaches to Web Frameworks - Yesod vs Ruby on Rails

Other languages edit

  • Haskell Biblio. - Yesod (in Spanish) University of Cadiz

At Linux distributions edit

  • Yesod at Debian
  • Yesod at Ubuntu

yesod, framework, this, article, multiple, issues, please, help, improve, discuss, these, issues, talk, page, learn, when, remove, these, template, messages, this, article, written, like, manual, guide, please, help, rewrite, this, article, remove, advice, ins. This article has multiple issues Please help improve it or discuss these issues on the talk page Learn how and when to remove these template messages This article is written like a manual or guide Please help rewrite this article and remove advice or instruction September 2018 This article relies excessively on references to primary sources Please improve this article by adding secondary or tertiary sources Find sources Yesod web framework news newspapers books scholar JSTOR September 2018 Learn how and when to remove this message This article contains instructions advice or how to content Please help rewrite the content so that it is more encyclopedic or move it to Wikiversity Wikibooks or Wikivoyage September 2018 Learn how and when to remove this message Yesod IPA je sod Hebrew י סו ד Foundation is a web framework based on the programming language Haskell for productive development of type safe representational state transfer REST model based where uniform resource locators URLs identify resources and Hypertext Transfer Protocol HTTP methods identify transitions high performance web applications developed by Michael Snoyman et al It is free and open source software released under an MIT License YesodOriginal author s Michael SnoymanDeveloper s Michael Snoyman et al Initial release2010 14 years ago 2010 Stable release1 6 2 1 1 8 September 2022 19 months ago 8 September 2022 Repositorygithub wbr com wbr yesodweb wbr yesodWritten inHaskellOperating systemCross platformAvailable inEnglishTypeWeb frameworkLicenseMITWebsitewww wbr yesodweb wbr com Yesod is based on templates to generate instances for listed entities and dynamic content process functions through Template Haskell constructs to host domain specific language eDSL content templates called QuasiQuotes where the content is translated into code expressions by metaprogramming instructions 2 There are also web like language snippet templates that admit code expression interpolations making them fully type checked at compile time 3 Yesod divides its functions in separate libraries database html rendering forms etc so functions may used as needed Contents 1 MVC architecture 1 1 Controller 1 1 1 Server interface 1 1 2 The foundation type 1 1 3 Hello World 1 1 4 Resources routes HTTP method handlers 1 1 5 Request data parameters cookies languages other header info 1 1 6 Authentication authorization 1 1 7 Sessions 1 1 7 1 Session messages 1 1 8 Subsites 1 1 9 Form processing layout generation 1 2 View 1 2 1 Indentation based templates for tree structured markup 1 2 1 1 Template interpolation Shakespearean templates 1 2 1 2 Other templates 1 2 2 Localizable messages 1 2 3 Navigation breadcrumbs 1 2 4 Search engine XML Sitemap 1 2 5 Web feed views 1 3 Model 1 3 1 Using in memory mutable data in the foundation datatype 1 3 2 The Database layer 1 4 E mail 1 5 Facebook 2 Development cycle 2 1 The Yesod helper tool 2 2 Deploying with Keter A web app server monitor and reverse proxy server 3 Integration with JavaScript generated from functional languages 4 See also 5 References 6 External links 6 1 Blog tutorials 6 2 Comparisons 6 3 Other languages 6 4 At Linux distributionsMVC architecture editSee also Model view controller MVC Controller edit Server interface edit Yesod uses a Web application interface WAI 4 a type of application programming interface API to isolate servlets aka web apps from servers with handlers for the server protocols Common Gateway Interface CGI 5 FastCGI 6 Simple Common Gateway Interface SCGI 7 Warp 8 Launch open as local URL to the default browser closing the server when the window is closed 9 The foundation type edit See ref 10 Yesod requires a data type that instantiates the model view controller classes This is called the foundation type In the example below it is named MyApp The REST model identifies a web resource with a web path Here REST resources are given names with an R suffix like HomeR and are listed in a parseRoutes site map description template From this list route names and dispatch handler names are derived Yesod makes use of Template Haskell metaprogramming to generate code from templates at compile time assuring that the names in the templates match and everything typechecks e g web resource names and handler names By inserting a mkYesod call this will call Template Haskell primitives to generate the code 11 corresponding to the route type members and the instances of the dispatch controller classes as to dispatch GET calls to route HomeR to a routine named composing them both as getHomeR expecting an existing handler that matches the name Hello World edit Hello World program example based on a Common Gateway Interface CGI server interface the handler types have changed but the philosophy remains file wai cgi hello hs LANGUAGE PackageImports TypeFamilies QuasiQuotes MultiParamTypeClasses TemplateHaskell OverloadedStrings import wai Network Wai import wai extra Network Wai Handler CGI run interchangeable WAI handler import yesod Yesod import yesod core Yesod Handler getRequest import text Data Text Text import shakespeare Text Cassius Color colorBlack the Foundation type data MyApp MyApp sitemap template listing path resource name and methods accepted mkYesod takes the foundation type name as param for name composition of dispatch functions mkYesod MyApp parseRoutes HomeR GET instance Yesod MyApp indentation structured CSS template myStyle Text CssUrl url myStyle paramStyle cassius box border 1 px solid boxColor where boxColor case paramStyle of high contrast colorBlack Color 0 0 255 indentation structured HTML template myHtml Text Text HtmlUrl url myHtml params hamlet lt indentation or lack of it under starting tags or commands prefix describe the content or sequence tree structure gt lt or prefixes in tags introduce css styled class or id attribute values gt lt interpolation of haskell expressions follow the shakespeare templates expr syntax gt lt p gt Hello World There are lt span box gt length params parameters lt span gt if null params lt p gt Nothing to list else lt ul gt forall param lt params lt li gt fst param snd param getHomeR Handler RepHtml getHomeR do req lt getRequest let params reqGetParams req paramStyle lt lookupGetParams style defaultLayout do adding widgets to the Widget monad a Writer monad setTitle Yesod example toWidgetHead myStyle paramStyle toWidgetBody myHtml params there are run function variants for different WAI handlers main toWaiApp MyApp gt gt run cgi test export REMOTE ADDR 127 0 0 1 export REQUEST METHOD GET export PATH INFO export QUERY STRING p1 abc p2 def style high contrast wai cgi hello 10 Resources routes HTTP method handlers edit See ref 12 13 Yesod follows the representational state transfer model of access to web documents identifying docs and directories as resources with a Route constructor named with an uppercase R suffix for example HomeR The routes table The parseRoutes template should list the resources specifying route pieces resource name and dispatch methods to be accepted URL segment capture as parameter is possible specifying a prefix for single segment capture or for multisegment capture followed by the parameter type given a MyApp foundation type mkYesod MyApp parseRoutes HomeR no http methods stated all methods accepted blog BlogR GET POST the prefix specify the path segment as a route handler parameter article ArticleId ArticleR GET PUT the prefix specify the parameter as a sequence of path pieces branch Texts BranchR GET to simplify the grammar compound types must use an alias eg type Texts for Text Applying the previous template generates the following route constructors data Route MyApp HomeR referenced in templates as HomeR BlogR in templates BlogR ArticleR ArticleId in templates ArticleR myArticleId BranchR Texts in templates BranchR myBranchSegments For every supported HTTP method a handler function must be created to match the dispatch names generated by mkYesod from the parseRoutes template by prefixing the method name or the prefix handler if no method stated to the resource as described actual versions handler types have changed but the philosophy remains for HomeR no http methods stated only one handler with prefix handler handlerHomeR HasReps t Handler t for blog BlogR GET POST getBlogR HasReps t Handler t postBlogR HasReps t Handler t for article ArticleId ArticleR GET PUT getArticleR HasReps t ArticleId Handler t putArticleR HasReps t ArticleId Handler t Request data parameters cookies languages other header info edit See ref 12 Authentication authorization edit See ref 14 Authentication plugins OpenID BrowserID Email GoogleEmail HashDB RpxNow 15 There is an important setting for automatic redirection after authentication 16 Sessions edit See ref 17 Session back ends ClientSession 18 it stores the session in a cookie ServerSession 19 20 it stores most of the session data at the server gt gt To avoid undue bandwidth overhead production sites can serve their static content from a separate domain name to avoid the overhead of transmitting the session cookie for each request Session messages edit A success failure or indicative message can be stored setMessage in the Session and will be shown if it exists by the default layout routine through the default layout hamlet template being cleared on consultation 21 Subsites edit Common URL prefix subsites for workflows file serving or site partitioning See ref 22 23 Built in subsites Static 24 25 Auth 26 Form processing layout generation edit See ref 27 The Form type here is an object that is used in the controller to parse and process the form fields user input and produce a FormResult Widget pair were the widget holds the layout of the next rendering of the form with error messages and marks It can also be used to generate a new form with blanks or default values The form type takes the shape of a function of an html snippet to be embedded in the view that will hold security purpose hidden fields A form object is generated from an Applicative Monadic composition of fields for a combined sequential parsing of field inputs There are three types of forms Applicative with tabular layout Monadic with free layout style both in the Yesod Form Functions module Input for parsing only no view generated in the Yesod Form Input module The field generators whose names are composed by the form type initial a m i followed by req opt required or optional have a fieldParse component and a fieldView one 28 the function runForm Post Get runs the field parsers against the form field inputs and generates a FormResult Widget pair from the views offering a new form widget with the received form field values as defaults The function suffix is the http method used in the form submission while generateForm Post Get ignores inputs from the client and generates a blank or defaults form widget 29 The actual function parameters and types have changed through Yesod versions Check the Yesod book and libraries signatures The magic is in the FormResult data type Applicative instance where lt gt collects the error messages for the case of FormFailure textErrMsg result values 30 Monadic forms permit free form layout and better treatment of hiddenField members 27 A sample of an Applicative 31 form a record for our form fields data Person Person personName Text personAge Int personLikings Maybe Text the Form type has an extra parameter for an html snippet to be embedded containing a CSRF token hidden field for security type Form sub master x Html MForm sub master FormResult x Widget for messages in validation functions param master yesod instance to use in renderMessage return from handler s getYesod param languages page languages to use in renderMessage optional defaults record param mbPersonDefaults Just defaults record or Nothing for blank form personForm MyFoundationType Text Maybe Person Form sub master Person aopt optional field AForm component for Maybe fields areq required fld AForm comp will insert the required attribute personForm master languages mbPersonDefaults renderTable Person lt gt areq textField fldSettingsName mbNameDefault lt gt areq customPersonAgeField fldSettingsAge mbAgeDefault lt gt aopt textareaField fldSettingsLikings mbLikingsDefault where mbNameDefault fmap personName mbPersonDefaults mbAgeDefault fmap personAge mbPersonDefaults mbLikingsDefault fmap personLikings mbPersonDefaults fieldSettingsLabel returns an initial fieldSettings record recently the FieldSettings record can be defined from a String label since it implements IsString fldSettingsName fieldSettingsLabel MsgName fsAttrs maxlength 20 fldSettingsAge fieldSettingsLabel MsgAge fldSettingsLikings fieldSettingsLabel MsgLikings fsAttrs cols 40 rows 10 customPersonAgeField check validateAge intField validateAge y y lt 18 Left renderMessage master languages MsgUnderAge otherwise Right y View edit The types shown correspond to an older version but the philosophy remains The Handler monad returns content in one or more of several formats as components of types that implement the HasReps class 32 RepHtml RepJson RepXml RepPlain the dual RepHtmlJson a pair or list of pairs ContentType Content 33 34 Json examples 35 36 37 The HasReps default implementation of chooseRep chooses the document representation to be returned according to the preferred content type list of the client accept header 32 Widgets 38 are HTML DOM code snippets made by specific commands e g setTitle or from templates of structure HTML behaviour JavaScript style CSS whose types instantiate the classes ToWidget ToWidgetHead or ToWidgetBody A Widget monad 39 based on a Writer 40 one and argument to defaultLayout facilitate to piece the widgets together Indentation based templates for tree structured markup edit the hamlet quasiquoter a parser to compile time Template Haskell code 2 41 specified in the T H Oxford brackets syntax qq introduces an indentation based structured html template See doc 42 43 prefixes lines of logic statements Automatic closing tags are generated only for the tag at line start position the whamlet quasiquoter returns a Widget expression saves to Widget before hamlet toWidget hamlet doctype 5 lt html gt lt only the tag at the beginning of the line will be automatically closed gt lt or prefixes in tags introduce class id names a la CSS gt lt boolVar prefix in attributes makes them conditionally generated gt lt interpolation of haskell expressions follow the shakespearean templates syntax introduced in the so named section gt lt head gt lt title gt pageTitle My Site lt link rel stylesheet href Stylesheet route gt lt body gt lt header gt headerTemplate lt section mySectionId gt lt p gt lt span titleClass gt MsgArticleListTitle lt span gt if null articles lt p isRed style color red gt MsgSorryNoArticles else lt ul gt forall art lt articles lt li gt articleNumber art articleTitle art lt footer gt footerTemplate Template interpolation Shakespearean templates edit See ref 42 These are content view templates that follow a common substitution pattern of code expressions within curly brackets with different character prefix to refer to template expressions with refers to other templates of the same type with given parameters as template params route expressions with safe typed urls as HomeR message expressions with i18n message rendering as MsgMessageLabel params other Haskell expressions with haskell expression rendering as haskell expression which type must be convertible in case of hamlet html templates the expression type must be an instance of Text Blaze ToMarkup 44 in case of CSS templates the expression type must be an instance of Text Cassius ToCss 45 in case of JavaScript templates the expression type must be an instance of Text Julius ToJavascript 46 in case of i18n message definitions in lt isoLanguage gt msg files with parameter interpolations the expression type must be an instance of Text Shakespeare I18N ToMessage 47 in case of text plain templates for use in emails the expression type must be an instance of Text Shakespeare Text ToText 48 Using non English text in expressions requires use of the Unicode aware type Text since the Glasgow Haskell Compiler s GHC s show for the type String renders non ASCII characters as escaped numerical codes External file templates at compile time Template content can be loaded from external files using compile time splice calls as expr 49 at run time There is a reload mode for reparsing external template files at every service call except for HTML hamlet templates See doc 50 Other templates edit for JavaScript CoffeeScript Roy the julius quasiquoter introduces a JavaScript template 51 JavaScript variants CoffeeScript and Roy language 52 have also specific quasiquoters 2 51 for CSS the cassius quasiquoter introduces a css template with indentation based structuring 53 the lucius quasiquoter introduces a css template with standard syntax plus shakespeare template style substitutions 54 TypeScript and JSX templates the tsc and tscJSX quasiquoters Only on UNIX derivatives no Windows by now 55 text plain templates for e mail or text plain http content type 56 templates lt lazy text st strict text templates for text with a left margin delimiter lbt lazy sbt strict Localizable messages edit See ref 57 Yesod app messages are localizable i18n They should be held within the messages folder in files named based on ISO as lt iso language gt msgMessage entries follow the EBNF pattern EBNF identifier parameter type text with interpolations ArticleUnexistent param Int64 unexistent article param message constructors are formed prepending Msg to the message label identifier the message datatype is formed appending Message to the foundation type name in code myMsg MyAppMessage datatype appending Message to the foundation type myMsg MsgArticleUnexistent myArticleId constructor prepending Msg to the msg label in widget templates MsgArticleUnexistent myArticleId Actual i18n support is missing from the stack app template The mkMessage MyApp messagesFolder isoLangDefault must be added to the Foundation hs file to get the messages instantiated 58 Navigation breadcrumbs edit Navigation breadcrumbs 59 A YesodBreadcrumbs instance must be provided for the site where the generator function breadcrumb should return for each route a title and parent one Then the query function breadcrumbs will return the present route title and the ancestors route title pairs Search engine XML Sitemap edit Search engines XML Sitemaps 60 where sitemap returns an XML Sitemap as http response with the routes we want the search engines to crawl and attributes to instruct the crawler from a provided list of SitemapUrl records Web feed views edit Web feed views RDF Site Summary RSS Atom 61 Handlers return RepRss RepAtom or dual RepAtomRss content to be selected on accept headers preferred content type list from a given Feed structure Model edit Using in memory mutable data in the foundation datatype edit E g a visitor count See ref 62 The Database layer edit persistent is the name of the database access layer with templates for generating types for entities and keys as well as schema initialization 63 64 65 There is first class support for PostgreSQL SQLite MongoDB CouchDB and MySQL with experimental support for Redis 63 The Database layout is described in a template listing the entities fields and constraints 66 For every entity listed an integer key column id is generated with autoincrement and primary index attributes with a type alias appending Id to the entity name For every entity listed a record type named as the entity is generated were record fields names are composed prefixing the entity name to the field name like personName An EntityField type PersonName is also generated for foreign key referencing from other entities There is an automatic database schema migration mechanism for DB schema updates which to succeed requires when adding columns to existent tables to specify Default column value constraintswithsql level notation 67 At most one cardinality has a special mechanism around the type Checkmark 68 Weak entities childs in life constrained owner child relationships have no special support for cascade delete triggers but there are functions to deleteCascade manually in the Database Persist Class module 69 automatic table creation schema update and table migration Modifications of the entities template produces an schema update with automatic table creation and migration for the DBMS s that support ALTER TABLE SQL commands in a migrateAll procedure generated from the template content See Migrations in ref 63 to look for migration aware DBMS share mkPersist sqlSettings mkMigrate migrateAll generates the migration procedure with the specified name persist User table name and entity record type implicit autoincrement column id as primary key typed UserId ident Text refers to db table column ident generates a record field prefixing the table name as userIdent password Text Maybe Maybe indicates Nullable field UniqueUser ident unique constraint with space sep field sequence Email table name and entity record type implicit autoincrement column id as primary key typed EmailId email Text user UserId foreign key by specifying other tables EntityField types verkey Text Maybe newlyAddedColumn Text default sometext character varying sql level Default constraint UniqueEmail email unique constraint Esqueleto is a haskell combinators layer to generate correct relational queries to persistent 70 Example for persistent rawSQL and Esqueleto queries 71 E mail edit The following packages are part of the yesod platform 72 email validate Validating an email address 73 mime mail Compose and send MIME email messages 74 Facebook edit Useful glue functions between the fb library and Yesod 75 Development cycle editNew Yesod apps are generated from the HaskellStack tool 76 templates replacing previous command yesod init Stack based app template names are prefixed by yesod as yesod minimal postgres sqlite mysql mongo Since HaskellStack uses the stackage repo by default extra packages from the hackage repo should be referred in the stack yaml extra deps section Packages may be customized to a local subfolder They must be referred in the stack yaml packages section The Yesod helper tool edit The yesod helper tool 77 yesod devel run from the project site recompiles and restarts the project at every file tree modification yesod add handler adds a new handler and module to the project adding an import clause for the handler in the Application module Deploying with Keter A web app server monitor and reverse proxy server edit See refs 78 79 80 Keter is a process as a service that handles deployment and restart of Yesod web app servers and per web app database creation for PostgreSQL The console command yesod keter packs the web app as a keter bundle for uploading to a keter folder named incoming Keter monitors the incoming folder and unpacks the app to a temporary one then assigns the web app a port to listen to and starts it Initially it worked with Nginx as reverse proxy keter version 0 1 adding virtual server entries to its configuration and making Nginx reload it but now Keter itself provides its own reverse proxy functionality removing Nginx dependency and acting as the main web server 81 Old documentation Nginx based 82 83 Integration with JavaScript generated from functional languages editSee ref 84 85 86 See also edit nbsp Free and open source software portal Snap web framework References edit Release 1 6 2 1 8 September 2022 Retrieved 24 October 2022 a b c HaskellWiki QuasiQuotation Haskell org 2012 05 26 Retrieved 2012 10 23 University of Kent Comparing Dynamic and Static Language Approaches to Web Frameworks Yesod vs Ruby on Rails PDF Retrieved 2012 10 23 The wai package Hackage haskell org Retrieved 2012 10 23 The wai extra package with CGI WAI handler Hackage haskell org Retrieved 2012 10 23 The wai handler fastcgi package Hackage haskell org Retrieved 2012 10 23 The wai handler scgi package Hackage haskell org Retrieved 2012 10 23 The warp package Hackage haskell org Retrieved 2012 10 23 The wai handler launch package Hackage haskell org Retrieved 2012 10 23 a b book Basics Yesodweb com Retrieved 2012 10 23 The mkYesod code a b book Routing and Handlers Yesodweb com Retrieved 2012 10 23 Playing with Routes and Links FPComplete com 2012 10 17 Retrieved 2012 10 28 book Authentication and Authorization Yesodweb com Retrieved 2012 10 23 The yesod auth package Hackage haskell org Retrieved 2012 10 26 book Sessions See section Ultimate Destination Yesodweb com Retrieved 2012 11 17 Sessions Yesodweb com Retrieved 2012 10 23 Web ClientSession Hackage haskell org Retrieved 2012 10 25 ServerSession secure modular server side sessions Hackage haskell org Retrieved 2018 10 29 Web ServerSession Frontend Yesod Hackage haskell org Retrieved 2018 10 29 Session Messages Yesodweb com Retrieved 2018 10 23 Creating a Subsite Yesodweb com Retrieved 2012 10 25 Yesod and subsites a no brainer Monoid se 2012 08 22 Retrieved 2012 10 28 The Magic of Yesod part 2 See section Static Subsite Yesodweb com 2010 12 25 Retrieved 2012 10 25 The package yesod static Static Subsite Hackage haskell org Retrieved 2012 10 25 The package yesod auth Auth Subsite Hackage haskell org Retrieved 2012 10 25 a b book Forms Yesodweb com Retrieved 2012 10 23 Yesod Form Fields Hackage haskell org Retrieved 2012 10 23 Yesod Form Functions runFormPost Hackage haskell org Retrieved 2012 10 25 Yesod Form Types Hackage haskell org Retrieved 2012 10 23 HaskellWiki Applicative functor haskell org Retrieved 2012 10 24 a b The class HasReps Hackage haskell org Retrieved 2012 10 23 RESTful Content Yesodweb com Retrieved 2012 10 23 The class ToContent Hackage haskell org Retrieved 2012 10 23 More Client Side Yesod todo sample Yesodweb com 2012 04 23 Retrieved 2012 10 23 JSON Web Service Yesodweb com Retrieved 2012 10 23 The yesod json package Hackage haskell org Retrieved 2012 10 23 book Widgets Yesodweb com Retrieved 2012 10 23 The widget monad Hackage haskell org Retrieved 2012 10 23 The Writer monad Haskell org Retrieved 2012 10 23 Template Haskell Quasi quotation Haskell org Retrieved 2012 11 02 a b book Shakesperean templates Yesodweb com Retrieved 2012 10 23 The hamlet template module Hackage haskell org Retrieved 2012 10 23 Class Text Blaze ToMarkup Hackage haskell org Retrieved 2012 10 23 Class Text Cassius ToCss Hackage haskell org Retrieved 2012 10 23 Class Text Julius ToJavascript Hackage haskell org Retrieved 2012 10 23 Class Text Shakespeare I18N ToMessage Hackage haskell org Retrieved 2012 10 24 Class Text Shakespeare Text ToText Hackage haskell org Retrieved 2012 10 24 Template Haskell haskell org Retrieved 2012 11 03 book Shakesperean templates Calling shakespeare Yesodweb com Retrieved 2012 10 23 a b The Julius template module Hackage haskell org Retrieved 2012 10 23 Roy language Roy brianmckenna org Retrieved 2012 10 23 The Cassius template module Hackage haskell org Retrieved 2012 10 23 The Lucius template module Hackage haskell org Retrieved 2012 10 23 The Typescript template module Hackage haskell org Retrieved 2018 10 10 Shakespeare plain text templates module Hackage haskell org Retrieved 2012 10 24 book Internationalization Yesodweb com Retrieved 2012 10 23 mkMessage The YesodBreadcrumbs class Hackage haskell org Retrieved 2012 11 05 The yesod sitemap package Hackage haskell org Retrieved 2012 10 26 The yesod newsfeed package for RSS Atom views Hackage haskell org Retrieved 2012 10 26 Book Initializing data in the foundation datatype Yesodweb com Retrieved 2014 05 26 a b c book Persistent Yesodweb com Retrieved 2012 10 23 Yesod persistent package Hackage haskell org Retrieved 2012 10 23 Yesod persistent docs github com Retrieved 2018 10 16 Yesod persistent entity syntax github com Retrieved 2018 10 16 Redundant migrations for fields default values GitHub com Retrieved 2012 12 04 At most one cardinality enforcement in persistent with type Checkmark Hackage haskell org Retrieved 2018 10 16 How can I create a foreign key constraint using Yesod Persistent stackoverflow com Retrieved 2018 10 16 esqueleto package Hackage haskell org Retrieved 2012 10 23 Query example at Stackoverflow com 2012 09 19 Retrieved 2012 10 23 The yesod package Hackage haskell org Retrieved 2019 06 26 The email validate package Hackage haskell org Retrieved 2012 10 26 The mime mail package Hackage haskell org Retrieved 2012 10 26 The yesod fb package Hackage haskell org Retrieved 2012 10 26 Haskell Stack How to install The yesod bin pkg with the helper tool with instructions for use with the stack tool book Deploying your Webapp Yesodweb com Retrieved 2012 10 23 Readme Md Yesod keter readme GitHub Retrieved 2012 10 23 The keter package Hackage haskell org Retrieved 2012 10 23 Keter updates Yesodweb com 2012 10 25 Retrieved 2012 10 25 Keter Web App Deployment Yesodweb com 2012 05 11 Retrieved 2012 10 23 Keter It s Alive Yesodweb com 2012 05 17 Retrieved 2012 10 23 Javascript Options github com Retrieved 2014 03 12 Yesod AngularJS and Fay yesodweb com 2012 10 30 Retrieved 2014 03 12 HaskellWiki The JavaScript Problem haskell org Retrieved 2014 04 12 External links editOfficial website nbsp Presentations InfoQ Haskell eXchange 2012 Slides A C M at Johns Hopkins University ReST ful Websites with Yesod ScreenCast Yesod 1 0 at Vimeo O Reilly ebook Developing Web Applications with Haskell and Yesod Safety Driven Web Development Q amp A StackOverflow com Yesod tagged Q amp A Blog tutorials edit FPComplete com My First Web Site Playing with Routes and Links Yesod for newbies hamberg no handlerToIO use forkIO in Yesod handlers Comparisons edit HaskellWiki Haskell web frameworks A Hopefully Fair and Useful Comparison of Haskell Web Frameworks University of Kent Comparing Dynamic and Static Language Approaches to Web Frameworks Yesod vs Ruby on Rails Other languages edit Haskell Biblio Yesod in Spanish University of Cadiz At Linux distributions edit Yesod at Debian Yesod at Ubuntu Retrieved from https en wikipedia org w index php title Yesod web framework amp oldid 1214863570, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.