{"id":1570,"date":"2019-04-24T00:00:00","date_gmt":"2019-04-23T22:00:00","guid":{"rendered":"https:\/\/demo.sidekick.be\/itenium\/ava-tutorial\/"},"modified":"2025-11-28T13:31:44","modified_gmt":"2025-11-28T12:31:44","slug":"ava-tutorial","status":"publish","type":"post","link":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/","title":{"rendered":"AVA Tutorial"},"content":{"rendered":"<p>AVA runs automatically ignore:<\/p>\n<ul>\n<li>Directories called <code>fixtures<\/code>, <code>helpers<\/code> or <code>node_modules<\/code><\/li>\n<li>Files starting with an underscore (<code>_<\/code>)<\/li>\n<\/ul>\n<p>Checkout the <a href=\"https:\/\/github.com\/avajs\/ava#recipes\">recipes<\/a> for examples when working with <a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/recipes\/typescript.md\">TypeScript<\/a>, <a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/recipes\/babel.md\">Babel<\/a>, <a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/recipes\/vue.md\">Vue.js<\/a>, Debugging with <a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/recipes\/debugging-with-chrome-devtools.md\">Chrome DevTools<\/a> and <a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/recipes\/debugging-with-webstorm.md\">WebStorm<\/a> and much more\u2026 There is also a <a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/08-common-pitfalls.md\">Common Pitfalls<\/a> document should you run into some trouble early on.<\/p>\n<h1 id=\"example\">Example<\/h1>\n<pre><code class=\"language-javascript\">import test from 'ava';\n\n\/\/ Parameter needs to be called `t`\n\/\/ for enhanced assertion messages.\ntest('Basic test example', t =&gt; {\n    \/\/ Test will fail if not exactly\n    \/\/ two assertions are made\n    t.plan(2);\n    t.pass();\n    \/\/ Skipped tests still count to the plan\n    t.true.skip();\n\n\n    t.log(...values);\n\n\n    \/\/ Test fails if exceeded.\n    \/\/ Resets after each assertion.\n    \/\/ There is no default timeout.\n    \/\/ Globally from CLI: --timeout=10s\n    t.timeout(ms);\n});\n\n\n\/\/ HOOKS:\n\/\/ Runs before the first test in the file\n\/\/ Runs before beforeEach hooks, if any.\ntest.before('optional title', t =&gt; {\n    t.context.data = 'Shared with the tests';\n    \/\/ t.context is an object by default but may be overwritten\n});\n\n\/\/ Runs after the last test in the file\ntest.after(() =&gt; {});\n\n\/\/ Individual test setup\/teardown\ntest.beforeEach(() =&gt; {});\ntest.afterEach(() =&gt; {});\n\n\/\/ Will run even if other hooks or the test fails\ntest.afterEach.always(() =&gt; {});\n\/\/ Also: test.after.always()\n\n\/\/ Hooks run concurrently by default, unless:\ntest.serial.before(() =&gt; {});\n<\/code><\/pre>\n<p class=\"title-url\"><a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/03-assertions.md\">Assertions<\/a><\/p>\n<h1 id=\"assertions\">Assertions<\/h1>\n<p>You can use any assertion library instead of or in addition to the built-in one, provided it throws exceptions on failures.<\/p>\n<p>All built-in assertions have a last optional <code>message<\/code> parameter.<\/p>\n<p><!-- [Object.is()](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Object\/is) --> <\/p>\n<pre><code class=\"language-javascript\">import test from 'ava';\n\ntest('Built-in', t =&gt; {\n    t.pass('optional message');\n    t.fail();\n\n    t.true(value); \/\/ t.false()\n    t.truthy(value); \/\/ t.falsy()\n\n    t.is(value, expected); \/\/ Object.is() comparison\n    t.not(value, expected); \/\/ Inverted t.is()\n\n    t.regex(contents, regex); \/\/ Also: notRegex()\n\n    t.deepEqual(value, expected); \/\/ Also: notDeepEqual()\n});\n<\/code><\/pre>\n<h4 id=\"power-assert\">power-assert<\/h4>\n<p><a href=\"https:\/\/github.com\/power-assert-js\/power-assert\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/power-assert-js\/power-assert.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/power-assert-js\/power-assert\">power-assert-js\/power-assert<\/a>: Very fancy assertion failure reporting<\/p>\n<pre><code class=\"language-javascript\">\/\/ Outputs failures with power-assert when value is falsy\nt.assert(value, [message]);\n<\/code><\/pre>\n<h2 id=\"macros\">Macros<\/h2>\n<p>Create custom testers with <a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/01-writing-tests.md#reusing-test-logic-through-macros\">macros<\/a>.<\/p>\n<pre><code class=\"language-javascript\">function macro(t, input, expected) {\n  t.is(input, expected);\n}\ntest('static title', macro, 'input', 'expected');\n\n\n\/\/ Dynamic Titles\nmacro.title = (providedTitle = undefined, input, expected) =&gt; '';\n\ntest(macro, 'input', 'expected');\ntest('providedTitle', macro, 'in', 'expected');\n<\/code><\/pre>\n<h2 id=\"exceptions\">Exceptions<\/h2>\n<pre><code class=\"language-javascript\">test('throws error', t =&gt; {\n    const err = t.throws(fn, [expected]); \/\/ Also: .notThrows()\n    \/\/ with expected either\n    \/\/ - A constructor (instanceof)\n    \/\/ - A string (error.message comparison)\n    \/\/ - A RegExp (error.message match)\n    \/\/ - A matcher object. Ex:\n    const matcher = {\n        instanceOf: TypeError,\n        is: 'Object.is()',\n        message: 'string | RegExp',\n        name: 'err.name',\n        code: 'err.code',\n    };\n    \/\/ When omitting expected, you still need to\n    \/\/ pass null if you want to set the message.\n});\n\n\ntest('throws async', async t =&gt; {\n    await t.throwsAsync(async () =&gt; {\n        throw new TypeError('oops');\n    }, {instanceOf: TypeError, message: 'oops'});\n    \/\/ Also: .notThrowsAsync()\n    \n    const error = await t.throwsAsync(() =&gt; Promise.reject('aargh'));\n    t.is(error.message, 'aargh');\n});\n<\/code><\/pre>\n<h2 id=\"not-included\">Not included<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/recipes\/endpoint-testing.md\">Endpoint testing Recipe<\/a>: Use your favourite library<\/li>\n<li><a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/recipes\/browser-testing.md\">Browser testing<\/a><\/li>\n<li>Anything else you might need? Someone might have done it already: <a href=\"https:\/\/github.com\/avajs\/awesome-ava\">Awesome AVA<\/a><\/li>\n<\/ul>\n<h1 id=\"workflow\">Workflow<\/h1>\n<pre><code class=\"language-javascript\">test.only('Like Jasmine fit', t =&gt; {\n    t.pass();\n});\n\ntest.skip('Like Jasmine xit', t =&gt; {\n    t.pass();\n});\n\ntest.todo('Really need to write this test');\n\ntest.failing('Passes only when the test does NOT pass', t =&gt; {\n    t.fail();\n});\n<\/code><\/pre>\n<p class=\"title-url\"><a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/05-command-line.md\">Command Line<\/a><\/p>\n<h1 id=\"cli\">CLI<\/h1>\n<p>Always runs the local AVA installation if available.<br \/> CLI takes precedence over configuration.<\/p>\n<pre><code class=\"language-bash\">npx ava --help\n\n# Default arguments\nnpx ava test.js test-*.js test\/**\/*.js **\/__tests__\/**\/*.js **\/*.test.js\n\nnpx ava\n    --watch     # or -w \n    --verbose   # or -v: Outputs all test titles\n    --match     # or -m: Run only matching test titles\n    --timeout   # or -T: in ms. Or: \"30s\" (30 seconds), \"3m\" (3 minutes)\n    --fail-fast # Stop on first failure\n\n# Case insensitive test title matching\n# Overrides .only\nnpx ava -m='startWith*' -m='!*notContains*' -m='exact'\n<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/sindresorhus\/matcher\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/sindresorhus\/matcher.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/sindresorhus\/matcher\">sindresorhus\/matcher<\/a>: Matcher used for <code>--match<\/code><\/p>\n<h4 id=\"other-cli-parameters\">Other CLI parameters<\/h4>\n<ul>\n<li><code>--serial<\/code>, <code>-s<\/code>: Run tests serially<\/li>\n<li><code>--concurrency<\/code>, <code>-c<\/code>: Max tests running at the same time (Default: # CPU Cores)<\/li>\n<li><code>--tap<\/code>, <code>-t<\/code>: Generate <a href=\"https:\/\/en.wikipedia.org\/wiki\/Test_Anything_Protocol\">Test Anything Protocol<\/a> output<\/li>\n<li><code>--color<\/code> and <code>--no-color<\/code>: With color by default<\/li>\n<li><code>--reset-cache<\/code><\/li>\n<\/ul>\n<p class=\"title-url\"><a href=\"https:\/\/github.com\/avajs\/ava\/blob\/master\/docs\/06-configuration.md\">Configuration<\/a><\/p>\n<h1 id=\"configuration\">Configuration<\/h1>\n<p>In your <code>package.json<\/code>:<\/p>\n<pre><code class=\"language-json\">{\n    \"ava\": {\n        \"files\": [\n            \"my-test-directory\/**\/*.js\",\n            \"!my-test-directory\/exclude-this-directory\/**\/*.js\",\n            \"!**\/exclude-this-file.js\"\n        ],\n        \"sources\": [ \/\/ changes to matching files re-run tests while in --watch mode\n            \"**\/*.{js,jsx}\",\n            \"!dist\/**\/*\"\n        ],\n        \"failWithoutAssertions\": false, \/\/ True by default: a test without assertion fails\n        \"compileEnhancements\": false,   \/\/ Disable power-assert\n        \"require\": [\n            \"@babel\/register\"\n        ],\n        \"babel\": {\n            \"extensions\": [\"jsx\"],\n            \"testOptions\": {\n                \"babelrc\": false\n            }\n        },\n        \"a-cli-arg\": \"ex: 'failFast': true\"\n    }\n}\n<\/code><\/pre>\n<ul>\n<li>Can also add json nodes matching the CLI parameters for failFast, tap, verbose, timeout and <code>match: string[]<\/code><\/li>\n<li><code>cache<\/code>: <code>true<\/code>: Use cache in <code>node_modules\/.cache\/ava<\/code>. <code>false<\/code>: Use temp dir.<\/li>\n<li>Also possible to create a <code>ava.config.js<\/code> in the same folder as your <code>package.json<\/code>.<\/li>\n<\/ul>\n<h1 id=\"async-support\">Async Support<\/h1>\n<pre><code class=\"language-javascript\">test('Promise support', t =&gt; {\n    return Promise.resolve(true).then(result =&gt; {\n        t.true(result);\n    });\n});\n\ntest('async\/await support', async t =&gt; {\n    const value = await Promise.resolve(true);\n    t.true(value);\n});\n\ntest('Observable support', t =&gt; {\n    return of(1).pipe(map(() =&gt; t.pass()));\n});\n\ntest.cb('Callback support with t.end', t =&gt; {\n    \/\/ Any truthy value passed as first argument\n    \/\/ to `t.end` will fail the test\n    fs.readFile('data.txt', t.end);\n});\n\n\ntest.afterEach.cb('This stuff also works for hooks', t =&gt; {\n    setImmediate(t.end);\n});\n\n\nconsole.log('Currently running', test.meta.file);\n<\/code><\/pre>\n<h1>Extras<\/h1>\n<p><b>Other interesting reads<\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/avajs\/awesome-ava\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/avajs\/awesome-ava.svg?style=social&#038;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/avajs\/awesome-ava\">avajs\/awesome-ava<\/a>: Awesome AVA<\/li>\n<\/ul>\n<h1> Package Versions <i class=\"fa fa-info-circle\" style=\"float: right; color: cornflowerblue; font-size: 28px\" title=\"Package versions used for this post and in the accompanying code on Github\"><\/i><\/h1>\n<div><a href=\"https:\/\/github.com\/avajs\/ava\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/avajs\/ava.svg?style=social&#038;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/avajs\/ava\">avajs\/ava<\/a>: v1.4.1 <\/div>\n","protected":false},"excerpt":{"rendered":"<p><a href=\"https:\/\/github.com\/avajs\/ava\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/avajs\/ava.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/avajs\/ava\">avajs\/ava<\/a>: \ud83d\ude80 Testing can be a drag. AVA helps you get it done.<\/p>\n<p> A concurrent test runner from the Andromeda galaxy. If I was to stray from <a href=\"https:\/\/itenium.be\/blog\/javascript\/javascript-testing-jasmine-getting-started\/\">Jasmine<\/a> then it could only be for a project <a href=\"https:\/\/github.com\/sindresorhus\">Sindre Sorhus<\/a> is working on \ud83d\ude42 The screenshots on the project site promised extensive assertion failure output with clean stack traces and built-in Promise, async\/await, Observable and React component support. So I tried it out and yup, AVA delivered.<\/p>\n<h1 class=\"hide-from-excerpt\" id=\"get-started\">Get Started<\/h1>\n<pre><code class=\"language-bash\"># Install\nnpm init ava\n\n# Run tests\nnpx ava --watch --verbose\n<\/code><\/pre>\n","protected":false},"author":1,"featured_media":2070,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[3],"tags":[21,6],"class_list":["post-1570","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-testing","tag-tutorial"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>AVA Tutorial - Itenium<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AVA Tutorial - Itenium\" \/>\n<meta property=\"og:description\" content=\"avajs\/ava: \ud83d\ude80 Testing can be a drag. AVA helps you get it done. A concurrent test runner from the Andromeda galaxy. If I was to stray from Jasmine then it could only be for a project Sindre Sorhus is working on :) The screenshots on the project site promised extensive assertion failure output with clean stack traces and built-in Promise, async\/await, Observable and React component support. So I tried it out and yup, AVA delivered.Get Started # Install npm init ava # Run tests npx ava --watch --verbose\" \/>\n<meta property=\"og:url\" content=\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"Itenium\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-23T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-28T12:31:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/ava.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"360\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Usdevelop\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Usdevelop\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/\",\"name\":\"AVA Tutorial - Itenium\",\"isPartOf\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/ava.jpg\",\"datePublished\":\"2019-04-23T22:00:00+00:00\",\"dateModified\":\"2025-11-28T12:31:44+00:00\",\"author\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\"},\"breadcrumb\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#primaryimage\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/ava.jpg\",\"contentUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/ava.jpg\",\"width\":360,\"height\":300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/demo.sidekick.be\/itenium\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AVA Tutorial\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/\",\"name\":\"Itenium\",\"description\":\"We build software. We build careers.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\",\"name\":\"Usdevelop\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"caption\":\"Usdevelop\"},\"sameAs\":[\"https:\/\/demo.sidekick.be\/itenium\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AVA Tutorial - Itenium","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"AVA Tutorial - Itenium","og_description":"avajs\/ava: \ud83d\ude80 Testing can be a drag. AVA helps you get it done. A concurrent test runner from the Andromeda galaxy. If I was to stray from Jasmine then it could only be for a project Sindre Sorhus is working on :) The screenshots on the project site promised extensive assertion failure output with clean stack traces and built-in Promise, async\/await, Observable and React component support. So I tried it out and yup, AVA delivered.Get Started # Install npm init ava # Run tests npx ava --watch --verbose","og_url":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/","og_site_name":"Itenium","article_published_time":"2019-04-23T22:00:00+00:00","article_modified_time":"2025-11-28T12:31:44+00:00","og_image":[{"width":360,"height":300,"url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/ava.jpg","type":"image\/jpeg"}],"author":"Usdevelop","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Usdevelop","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/","url":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/","name":"AVA Tutorial - Itenium","isPartOf":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#website"},"primaryImageOfPage":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#primaryimage"},"image":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/ava.jpg","datePublished":"2019-04-23T22:00:00+00:00","dateModified":"2025-11-28T12:31:44+00:00","author":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022"},"breadcrumb":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#primaryimage","url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/ava.jpg","contentUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/ava.jpg","width":360,"height":300},{"@type":"BreadcrumbList","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/ava-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/demo.sidekick.be\/itenium\/"},{"@type":"ListItem","position":2,"name":"AVA Tutorial"}]},{"@type":"WebSite","@id":"https:\/\/demo.sidekick.be\/itenium\/#website","url":"https:\/\/demo.sidekick.be\/itenium\/","name":"Itenium","description":"We build software. We build careers.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022","name":"Usdevelop","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","caption":"Usdevelop"},"sameAs":["https:\/\/demo.sidekick.be\/itenium"]}]}},"_links":{"self":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/comments?post=1570"}],"version-history":[{"count":3,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1570\/revisions"}],"predecessor-version":[{"id":2291,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1570\/revisions\/2291"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media\/2070"}],"wp:attachment":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media?parent=1570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/categories?post=1570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/tags?post=1570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}