@directus/app 9.0.1 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/@directus_extensions-sdk.bfcbcdb2.js +1 -0
- package/dist/assets/{active-line.1e85080e.js → active-line.26c5b22c.js} +1 -1
- package/dist/assets/{activity-log.f0b81785.js → activity-log.5e4655fe.js} +1 -1
- package/dist/assets/{activity.848efa17.js → activity.d1dc970c.js} +5 -5
- package/dist/assets/af-ZA.e55141de.js +1 -0
- package/dist/assets/{api-endpoints.6b2f9a0a.js → api-endpoints.8828b972.js} +2 -2
- package/dist/assets/{apl.81a36d94.js → apl.81ad0f83.js} +1 -1
- package/dist/assets/{app-overview.9d9e9cee.svg → app-overview.1d041c7b.svg} +2 -1
- package/dist/assets/{ar-SA.3368322c.js → ar-SA.c14aed74.js} +1 -1
- package/dist/assets/{asciiarmor.41807b38.js → asciiarmor.76e6426d.js} +1 -1
- package/dist/assets/{asn.1.2fb547c7.js → asn.1.71a91aed.js} +1 -1
- package/dist/assets/{asterisk.f25d8cae.js → asterisk.80f8502f.js} +1 -1
- package/dist/assets/{authentication.595f862f.js → authentication.2cacaeb9.js} +10 -9
- package/dist/assets/{autorefresh.47068160.js → autorefresh.b4c043fd.js} +1 -1
- package/dist/assets/{aws.684d8f17.js → aws.80878698.js} +1 -1
- package/dist/assets/{backing-directus.75b705d8.js → backing-directus.61d6e724.js} +1 -1
- package/dist/assets/bg-BG.2ccc4340.js +2 -0
- package/dist/assets/{br-FR.7a926846.js → br-FR.ac76f3c4.js} +1 -1
- package/dist/assets/{brainfuck.0eb32d6a.js → brainfuck.9cb7bbc7.js} +1 -1
- package/dist/assets/{ca-ES.2e706764.js → ca-ES.bb7c5b19.js} +1 -1
- package/dist/assets/{cli.6bc58792.js → cli.5550afc3.js} +2 -2
- package/dist/assets/cli.63d72df5.js +10 -0
- package/dist/assets/{clike.8a91e766.js → clike.e00b6fc0.js} +1 -1
- package/dist/assets/{clojure.680b2086.js → clojure.809a239a.js} +1 -1
- package/dist/assets/cloudron.faaaab54.js +1 -0
- package/dist/assets/cmake.9e2c3af3.js +1 -0
- package/dist/assets/{cobol.11746877.js → cobol.34952893.js} +1 -1
- package/dist/assets/{codebase-overview.bec34b38.js → codebase-overview.e1e8f010.js} +1 -1
- package/dist/assets/{coffeescript.cc7b12bb.js → coffeescript.961bb7e7.js} +1 -1
- package/dist/assets/{collections.fb0eff5f.js → collections.2a7f6562.js} +4 -4
- package/dist/assets/{commonlisp.81cf66cf.js → commonlisp.55bc3390.js} +1 -1
- package/dist/assets/{config-options.5ba591a6.js → config-options.7faffebc.js} +12 -12
- package/dist/assets/{content-collections.b24311e4.js → content-collections.a7de45b5.js} +1 -1
- package/dist/assets/{content-items.16fafd36.js → content-items.e9d9529c.js} +1 -1
- package/dist/assets/{content.31f08958.js → content.557c9218.js} +1 -1
- package/dist/assets/{crystal.88773be1.js → crystal.d7313cde.js} +1 -1
- package/dist/assets/css.17df7ad1.js +1 -0
- package/dist/assets/{cypher.62d62091.js → cypher.b89065cc.js} +1 -1
- package/dist/assets/{d.235b72e5.js → d.174a69ec.js} +1 -1
- package/dist/assets/{da-DK.0bec4b59.js → da-DK.3bcf884c.js} +1 -1
- package/dist/assets/{dart.d5e0dc33.js → dart.d0eb6182.js} +1 -1
- package/dist/assets/data-model.6fb88bd6.js +1 -0
- package/dist/assets/{de-DE.4b4b8e70.js → de-DE.cdcb9600.js} +1 -1
- package/dist/assets/{diff.236ec957.js → diff.b7a4963f.js} +1 -1
- package/dist/assets/digitalocean-app-platform.bf1a04c0.js +3 -0
- package/dist/assets/{displays.c55af3d6.js → displays.add8fe2c.js} +5 -5
- package/dist/assets/{django.b7dc3aae.js → django.da7ed745.js} +1 -1
- package/dist/assets/{docker.d76fac42.js → docker.1b49ec74.js} +1 -1
- package/dist/assets/{dockerfile.1019efd6.js → dockerfile.d6d3e269.js} +1 -1
- package/dist/assets/{documentation.1092ea83.js → documentation.7336014f.js} +1 -1
- package/dist/assets/{dtd.2a851c5f.js → dtd.45e86e6d.js} +1 -1
- package/dist/assets/{dylan.9bb2cd36.js → dylan.ec84c04e.js} +1 -1
- package/dist/assets/{ebnf.276406d3.js → ebnf.085fa852.js} +1 -1
- package/dist/assets/{ecl.11564c5b.js → ecl.270e9abf.js} +1 -1
- package/dist/assets/{eiffel.be49a681.js → eiffel.336802c1.js} +1 -1
- package/dist/assets/{elm.5c8852f7.js → elm.da8b96b6.js} +1 -1
- package/dist/assets/{email-templates.3c6a781e.js → email-templates.bf41e36a.js} +2 -2
- package/dist/assets/en-GB.361d696e.js +1 -0
- package/dist/assets/{erlang.ead9639d.js → erlang.b2f5e3ff.js} +1 -1
- package/dist/assets/es-419.994854a0.js +1 -0
- package/dist/assets/es-CL.3bf346ef.js +1 -0
- package/dist/assets/es-ES.5be51e8b.js +1 -0
- package/dist/assets/{et-EE.8aa32a45.js → et-EE.da648eba.js} +1 -1
- package/dist/assets/{extensions.b76bdde3.js → extensions.b3034cc8.js} +2 -2
- package/dist/assets/{factor.eed233f0.js → factor.5f1bd905.js} +1 -1
- package/dist/assets/faq.7223b3ed.js +1 -0
- package/dist/assets/{fcl.271814f0.js → fcl.fdd412a4.js} +1 -1
- package/dist/assets/fi-FI.64bf9412.js +1 -0
- package/dist/assets/{fields.238d924d.js → fields.a2b84f49.js} +2 -2
- package/dist/assets/{file-library.d7ca55fc.js → file-library.5f224a0d.js} +1 -1
- package/dist/assets/{files.92988e46.js → files.89714327.js} +1 -1
- package/dist/assets/{filter-rules.339629f8.js → filter-rules.b16f33ad.js} +2 -2
- package/dist/assets/{folders.54e223af.js → folders.964cb698.js} +4 -4
- package/dist/assets/{forth.5c226e69.js → forth.5e4a638c.js} +1 -1
- package/dist/assets/{fortran.a1e621fd.js → fortran.d037a8e9.js} +1 -1
- package/dist/assets/fr-FR.2b742996.js +1 -0
- package/dist/assets/{gas.249ccc95.js → gas.c1fb542a.js} +1 -1
- package/dist/assets/{gfm.392719b7.js → gfm.ef15b019.js} +1 -1
- package/dist/assets/{gherkin.f1c57004.js → gherkin.f2284a3d.js} +1 -1
- package/dist/assets/{github-ci.0ba5d515.js → github-ci.1993f260.js} +2 -2
- package/dist/assets/{glossary.4258b82f.js → glossary.53f5ccae.js} +1 -1
- package/dist/assets/{go.55fe2209.js → go.ee521b37.js} +1 -1
- package/dist/assets/{groovy.49803548.js → groovy.ff223850.js} +1 -1
- package/dist/assets/{haml.00447402.js → haml.dfd3a15e.js} +1 -1
- package/dist/assets/{handlebars.2c2675b3.js → handlebars.ee000b2a.js} +1 -1
- package/dist/assets/{haskell-literate.f95e4126.js → haskell-literate.7be3e5e8.js} +1 -1
- package/dist/assets/{haskell.613e1328.js → haskell.f0f6d0b5.js} +1 -1
- package/dist/assets/{haxe.e363e2e2.js → haxe.d7974a6e.js} +1 -1
- package/dist/assets/hi-IN.f686e98f.js +1 -0
- package/dist/assets/hooks.995bf7f1.js +72 -0
- package/dist/assets/{htmlembedded.5a5f0ffe.js → htmlembedded.fbe7b06d.js} +1 -1
- package/dist/assets/{htmlmixed.05e7a4e9.js → htmlmixed.8b21831b.js} +1 -1
- package/dist/assets/{http.36bf71f5.js → http.e1dcc6a6.js} +1 -1
- package/dist/assets/{hu-HU.1043806e.js → hu-HU.fc2083ad.js} +1 -1
- package/dist/assets/{id-ID.42c8e6ba.js → id-ID.06f8c7ad.js} +1 -1
- package/dist/assets/{idl.369d3687.js → idl.182ee0a1.js} +1 -1
- package/dist/assets/{iis.61b90801.js → iis.751d4784.js} +3 -2
- package/dist/assets/{index.53d7b4b1.js → index.00342ce9.js} +1 -1
- package/dist/assets/{index.7cb6c8da.js → index.06705dee.js} +1 -1
- package/dist/assets/{index.1fd33265.js → index.0aaf58e2.js} +1 -1
- package/dist/assets/{index.49fe7bbe.js → index.0b37920b.js} +1 -1
- package/dist/assets/{index.255ac1ac.js → index.0e9f9cdb.js} +1 -1
- package/dist/assets/{index.376099f6.js → index.10fa61dd.js} +1 -1
- package/dist/assets/{index.bd34bd8b.js → index.170c9aef.js} +1 -1
- package/dist/assets/{index.65c5205d.js → index.195486a9.js} +1 -1
- package/dist/assets/{index.bd506b24.js → index.1bd2ce1d.js} +1 -1
- package/dist/assets/{index.d03ceb16.js → index.1cb1c89c.js} +1 -1
- package/dist/assets/{index.aa99cd2b.js → index.1ef64264.js} +1 -1
- package/dist/assets/{index.f8360683.js → index.24dc2b50.js} +1 -1
- package/dist/assets/index.2603f9b4.css +1 -0
- package/dist/assets/{index.5ef6863e.js → index.2a532c34.js} +1 -1
- package/dist/assets/{index.e713a183.js → index.2c7690b7.js} +1 -1
- package/dist/assets/index.2ca0b263.css +1 -0
- package/dist/assets/{index.40abc1ae.js → index.2f09b0ab.js} +1 -1
- package/dist/assets/{index.6690c511.js → index.31d6290e.js} +1 -1
- package/dist/assets/{index.e65c230c.js → index.35b3227d.js} +1 -1
- package/dist/assets/{index.e68f5a19.js → index.3a55cb7a.js} +1 -1
- package/dist/assets/{index.f526c37a.js → index.3cdbbf75.js} +1 -1
- package/dist/assets/{index.7e86f332.js → index.3e7346f6.js} +1 -1
- package/dist/assets/{index.15d4ddd7.js → index.42b5c185.js} +1 -1
- package/dist/assets/{index.9597bb18.js → index.48b2303e.js} +1 -1
- package/dist/assets/{index.64b8816b.js → index.48e8585e.js} +1 -1
- package/dist/assets/{index.bba3d752.js → index.4b7ce3d9.js} +1 -1
- package/dist/assets/{index.31d1f296.js → index.50e58393.js} +1 -1
- package/dist/assets/{index.8fbbb686.js → index.570f038e.js} +1 -1
- package/dist/assets/{index.900f92f9.js → index.5ae5f490.js} +1 -1
- package/dist/assets/{index.19d9989e.js → index.5e1fa0bf.js} +1 -1
- package/dist/assets/{index.5caafb3d.js → index.609e713c.js} +1 -1
- package/dist/assets/{index.87946fe5.js → index.60c625fe.js} +1 -1
- package/dist/assets/{index.c36b50cf.js → index.63f139be.js} +1 -1
- package/dist/assets/{index.216b6328.js → index.640dd223.js} +1 -1
- package/dist/assets/{index.bee706b8.js → index.64591ec8.js} +1 -1
- package/dist/assets/{index.54a202be.js → index.65f3fbd9.js} +1 -1
- package/dist/assets/{index.5e175966.js → index.6df3a744.js} +1 -1
- package/dist/assets/{index.0caa5421.js → index.7250277a.js} +1 -1
- package/dist/assets/{index.0bd18bfd.js → index.72b20962.js} +1 -1
- package/dist/assets/{index.3c3c9275.js → index.777a345b.js} +1 -1
- package/dist/assets/{index.5d4c645c.js → index.7a4b3279.js} +1 -1
- package/dist/assets/{index.1d3c8b76.js → index.7b7bd2bb.js} +1 -1
- package/dist/assets/{index.1d2a8b64.js → index.7bd8fa33.js} +1 -1
- package/dist/assets/{index.f07bb8da.js → index.7f11024e.js} +1 -1
- package/dist/assets/{index.15f9b058.js → index.825757de.js} +1 -1
- package/dist/assets/{index.8e104536.js → index.85487066.js} +1 -1
- package/dist/assets/{index.83459924.js → index.91f9a8ea.js} +1 -1
- package/dist/assets/{index.550c7d98.js → index.9a34d0ad.js} +1 -1
- package/dist/assets/{index.d6eb48fd.js → index.9be0af27.js} +1 -1
- package/dist/assets/{index.266ef2c9.js → index.9df68447.js} +1 -1
- package/dist/assets/{index.0ed888d7.js → index.a142ec45.js} +1 -1
- package/dist/assets/{index.c2ece3ef.js → index.a3746c49.js} +1 -1
- package/dist/assets/{index.14bae658.js → index.aae790c3.js} +1 -1
- package/dist/assets/{index.b7e06d7c.js → index.ac5309a7.js} +1 -1
- package/dist/assets/{index.29fa87ff.js → index.adcd313e.js} +1 -1
- package/dist/assets/{index.b73273e0.js → index.af1f4431.js} +1 -1
- package/dist/assets/{index.61b86afb.js → index.b24bf29e.js} +1 -1
- package/dist/assets/{index.77f16025.js → index.b4db14a9.js} +1 -1
- package/dist/assets/{index.0b9941e1.js → index.b7968e56.js} +1 -1
- package/dist/assets/{index.0fb52a97.js → index.b803b5c0.js} +1 -1
- package/dist/assets/{index.94db319d.js → index.b94dcef9.js} +1 -1
- package/dist/assets/{index.5a304363.js → index.bb294572.js} +1 -1
- package/dist/assets/{index.59451527.js → index.bc07556a.js} +1 -1
- package/dist/assets/{index.aa7706f9.js → index.bdce1888.js} +1 -1
- package/dist/assets/{index.7a811ff8.js → index.be10baeb.js} +1 -1
- package/dist/assets/{index.b2adcd91.js → index.c046a8fd.js} +1 -1
- package/dist/assets/{index.1fb6fed8.js → index.c242e7b6.js} +1 -1
- package/dist/assets/{index.0ba5b42a.js → index.c5418cbb.js} +1 -1
- package/dist/assets/{index.6da8ed8b.js → index.c875d5a1.js} +1 -1
- package/dist/assets/{index.544fc3f4.js → index.cc291dcf.js} +1 -1
- package/dist/assets/{index.11bd8819.js → index.d15bff6b.js} +1 -1
- package/dist/assets/{index.1a242848.js → index.dd5da334.js} +1 -1
- package/dist/assets/{index.b75dc5c2.js → index.de5fa400.js} +1 -1
- package/dist/assets/{index.2ffae100.js → index.e59eb90f.js} +1 -1
- package/dist/assets/{index.8c729bf2.js → index.e8e78fe0.js} +1 -1
- package/dist/assets/{index.5286e9da.js → index.ee87082d.js} +1 -1
- package/dist/assets/index.eeba3fe9.js +26 -0
- package/dist/assets/{index.5c71b9bf.js → index.f2468536.js} +1 -1
- package/dist/assets/{index.9c37c372.js → index.f2f83988.js} +1 -1
- package/dist/assets/{index.750b633c.js → index.f650bdd2.js} +1 -1
- package/dist/assets/{index.dc1688d8.js → index.f992167b.js} +1 -1
- package/dist/assets/{index.19ae9f48.js → index.fc0d2b63.js} +1 -1
- package/dist/assets/{index.fefbb129.js → index.fd87d3cb.js} +1 -1
- package/dist/assets/{input-rich-text-html.67ebfae2.css → input-rich-text-html.01165183.css} +1 -1
- package/dist/assets/{input-rich-text-html.8fe88ffb.js → input-rich-text-html.c2f628ae.js} +43 -43
- package/dist/assets/{insights.fe74fe29.js → insights.35419fea.js} +1 -1
- package/dist/assets/installation.eae7bc78.js +1 -0
- package/dist/assets/{interfaces.23229e78.js → interfaces.106447a6.js} +7 -7
- package/dist/assets/{introduction.16f8f0b0.js → introduction.775bd94e.js} +1 -1
- package/dist/assets/introduction.8f825d90.js +1 -0
- package/dist/assets/{introduction.e29b10c2.js → introduction.9780c035.js} +7 -7
- package/dist/assets/{introduction.02e3c2a7.js → introduction.b9bb6e01.js} +2 -2
- package/dist/assets/it-IT.14bfc0b6.js +1 -0
- package/dist/assets/{items.4227ac2d.js → items.50d09d96.js} +6 -6
- package/dist/assets/ja-JP.ba312533.js +1 -0
- package/dist/assets/{javascript-hint.747ac6fc.js → javascript-hint.ef0fe16e.js} +1 -1
- package/dist/assets/{javascript.84e4549d.js → javascript.38e2ca1a.js} +1 -1
- package/dist/assets/{jinja2.a9a0ddb1.js → jinja2.8648ef63.js} +1 -1
- package/dist/assets/{jsx.5d18b001.js → jsx.9a8d51d6.js} +1 -1
- package/dist/assets/{julia.12cc2a8c.js → julia.c4e037f7.js} +1 -1
- package/dist/assets/ku-TR.3322375c.js +1 -0
- package/dist/assets/{layouts.1bd78154.js → layouts.ba122738.js} +5 -5
- package/dist/assets/{livescript.f585b533.js → livescript.d673b991.js} +1 -1
- package/dist/assets/{localization.a73190dd.js → localization.47f8e7e5.js} +1 -1
- package/dist/assets/logo-light.7a327cdd.svg +3 -0
- package/dist/assets/{lt-LT.69b9046b.js → lt-LT.497afd55.js} +1 -1
- package/dist/assets/{lua.a656cb84.js → lua.7cfb30be.js} +1 -1
- package/dist/assets/{manual.794bb884.js → manual.6d92664d.js} +4 -4
- package/dist/assets/{mark-selection.98a1b6fc.js → mark-selection.665c33af.js} +1 -1
- package/dist/assets/{match-highlighter.e1444e0b.js → match-highlighter.ffb4832f.js} +1 -1
- package/dist/assets/{mathematica.448ae8b5.js → mathematica.93a46a1f.js} +1 -1
- package/dist/assets/{mbox.977764b6.js → mbox.deb92f82.js} +1 -1
- package/dist/assets/migrations.ca569233.js +19 -0
- package/dist/assets/{mirc.ac98dd7b.js → mirc.96b69659.js} +1 -1
- package/dist/assets/{mllike.ee7c202f.js → mllike.2604471e.js} +1 -1
- package/dist/assets/{modelica.0e691287.js → modelica.07417903.js} +1 -1
- package/dist/assets/{modules.116e46b4.js → modules.3f25c2ca.js} +6 -6
- package/dist/assets/{mscgen.4c9c356e.js → mscgen.ce94fb84.js} +1 -1
- package/dist/assets/{multiplex.91d67c6e.js → multiplex.553fdcf6.js} +1 -1
- package/dist/assets/{mumps.c8a6b66b.js → mumps.6d4f6a77.js} +1 -1
- package/dist/assets/{nginx.048f88c1.js → nginx.1b1b7a85.js} +1 -1
- package/dist/assets/{nl-NL.bff34791.js → nl-NL.edb61cc3.js} +1 -1
- package/dist/assets/no-NO.ebaacb8a.js +1 -0
- package/dist/assets/notifications.7d5b4018.js +153 -0
- package/dist/assets/{nsis.1830f129.js → nsis.800b8ecf.js} +1 -1
- package/dist/assets/{ntriples.dff164ff.js → ntriples.5b70253c.js} +1 -1
- package/dist/assets/{octave.27aaa450.js → octave.d674345b.js} +1 -1
- package/dist/assets/{overlay.ff3e2ac4.js → overlay.aaae46c1.js} +1 -1
- package/dist/assets/{overview.c3721f80.js → overview.391169f1.js} +1 -1
- package/dist/assets/overview.b3257d1a.js +1 -0
- package/dist/assets/{oz.c625131c.js → oz.a57cd6c6.js} +1 -1
- package/dist/assets/{panels.c9913c4b.js → panels.3d54322a.js} +1 -1
- package/dist/assets/{pascal.2c02faa8.js → pascal.bd6858f9.js} +1 -1
- package/dist/assets/{pegjs.0854aa70.js → pegjs.094d5776.js} +1 -1
- package/dist/assets/{perl.6bf3c050.js → perl.3aa60c3c.js} +1 -1
- package/dist/assets/{permissions.83661a53.js → permissions.564eb072.js} +4 -4
- package/dist/assets/php.aad9a05c.js +1 -0
- package/dist/assets/{pig.f6acccd0.js → pig.60e1b8d9.js} +1 -1
- package/dist/assets/pl-PL.fcac44cc.js +1 -0
- package/dist/assets/{plesk.20b032fb.js → plesk.938ab777.js} +6 -6
- package/dist/assets/{powershell.3fe72e38.js → powershell.bff1f89c.js} +1 -1
- package/dist/assets/{presets-bookmarks.dfa9b52f.js → presets-bookmarks.b268b023.js} +1 -1
- package/dist/assets/{presets.7e0c88ae.js → presets.cff54053.js} +1 -1
- package/dist/assets/project-settings.c887fbea.js +1 -0
- package/dist/assets/{properties.8c3f631c.js → properties.0698e9c9.js} +1 -1
- package/dist/assets/{protobuf.ff5609be.js → protobuf.3cefb795.js} +1 -1
- package/dist/assets/pt-BR.eff6bc85.js +1 -0
- package/dist/assets/{pt-PT.b923e241.js → pt-PT.33683147.js} +1 -1
- package/dist/assets/{pug.e66669ae.js → pug.2823ac37.js} +1 -1
- package/dist/assets/{puppet.8585cc4d.js → puppet.6b5f8999.js} +1 -1
- package/dist/assets/{python.ce0163fc.js → python.f0335e64.js} +1 -1
- package/dist/assets/{q.4a99aff9.js → q.ab5b1dd7.js} +1 -1
- package/dist/assets/{query.998e770c.js → query.065bc71e.js} +3 -3
- package/dist/assets/{quickstart.1aa6ffca.js → quickstart.cdf47561.js} +3 -3
- package/dist/assets/{r.d0ae744a.js → r.cc002fd5.js} +1 -1
- package/dist/assets/{relations.7edadd3b.js → relations.028171dc.js} +4 -4
- package/dist/assets/{relationships.b6ef88eb.js → relationships.dc4de6fe.js} +14 -17
- package/dist/assets/{revisions.9a70b1ec.js → revisions.9c06a6cd.js} +3 -3
- package/dist/assets/{roles.f017240c.js → roles.05aa20d3.js} +7 -7
- package/dist/assets/{rpm.f0a7ad70.js → rpm.16e37784.js} +1 -1
- package/dist/assets/rst.bc8cd4f0.js +1 -0
- package/dist/assets/ru-RU.2e06b3ed.js +1 -0
- package/dist/assets/{ruby.4d15c7d1.js → ruby.207c3c8d.js} +1 -1
- package/dist/assets/{running-locally.bd69d8dc.js → running-locally.74954cf8.js} +5 -5
- package/dist/assets/{rust.e4dfe0d4.js → rust.e5e8db34.js} +1 -1
- package/dist/assets/{sas.709abdd1.js → sas.732c1fb5.js} +1 -1
- package/dist/assets/{sass.2505dd07.js → sass.a6d54759.js} +1 -1
- package/dist/assets/{scheme.897fc126.js → scheme.bf86a054.js} +1 -1
- package/dist/assets/sdk.027e1905.js +300 -0
- package/dist/assets/{security.548b2b76.js → security.3ecda9dd.js} +1 -1
- package/dist/assets/{server.d6f5abdc.js → server.2f493acf.js} +4 -4
- package/dist/assets/{settings.4b550f79.js → settings.5730c27d.js} +1 -1
- package/dist/assets/{settings.5c0f889e.js → settings.9e861c3c.js} +9 -5
- package/dist/assets/{shell.19de1cf8.js → shell.29cd4035.js} +1 -1
- package/dist/assets/{show-hint.0412391d.js → show-hint.23eb7a45.js} +1 -1
- package/dist/assets/{sieve.da5795e7.js → sieve.d831b5ce.js} +1 -1
- package/dist/assets/{simple.ab4d8d4b.js → simple.312a5b01.js} +1 -1
- package/dist/assets/{sl-SI.bfbe276b.js → sl-SI.41305ef8.js} +1 -1
- package/dist/assets/{slim.2805b872.js → slim.cab15ca2.js} +1 -1
- package/dist/assets/{smalltalk.ee9f0dd3.js → smalltalk.4f6a7ed7.js} +1 -1
- package/dist/assets/{smarty.08c649b4.js → smarty.a78117f3.js} +1 -1
- package/dist/assets/{solr.36ddf5d2.js → solr.f90334b7.js} +1 -1
- package/dist/assets/soy.d1e38e2c.js +1 -0
- package/dist/assets/{sparql.e90ce227.js → sparql.3d8087d4.js} +1 -1
- package/dist/assets/{spreadsheet.812bc4c1.js → spreadsheet.3b78c411.js} +1 -1
- package/dist/assets/sql.5f7a694e.js +1 -0
- package/dist/assets/{sr-CS.b4de8472.js → sr-CS.0b70ed56.js} +1 -1
- package/dist/assets/sso.2a03ed28.js +22 -0
- package/dist/assets/{stex.8fe110b6.js → stex.d0d6fa5e.js} +1 -1
- package/dist/assets/stylus.bb6171bb.js +1 -0
- package/dist/assets/{support.618bb824.js → support.f442955d.js} +1 -1
- package/dist/assets/sv-SE.07c9dbad.js +1 -0
- package/dist/assets/{swift.a963a96b.js → swift.599d450c.js} +1 -1
- package/dist/assets/{tcl.c00f0ec5.js → tcl.30b6bd0a.js} +1 -1
- package/dist/assets/{textile.431d240b.js → textile.2aaadb71.js} +1 -1
- package/dist/assets/{th-TH.81e128af.js → th-TH.51bd50db.js} +1 -1
- package/dist/assets/{themes.ec95c8cb.js → themes.7af7ef21.js} +2 -2
- package/dist/assets/{tiddlywiki.1b4d0a22.js → tiddlywiki.6c21f5fe.js} +1 -1
- package/dist/assets/{tiki.d37bbabb.js → tiki.f7b3b608.js} +1 -1
- package/dist/assets/{toml.1475fc5c.js → toml.70cd3de1.js} +1 -1
- package/dist/assets/{tornado.e812c41b.js → tornado.da87f7ab.js} +1 -1
- package/dist/assets/{tr-TR.0be85b79.js → tr-TR.fea3a7da.js} +1 -1
- package/dist/assets/{translations.8406cfe3.js → translations.c313e520.js} +1 -1
- package/dist/assets/{troff.52251200.js → troff.057eadf9.js} +1 -1
- package/dist/assets/{ttcn-cfg.4e31c9ce.js → ttcn-cfg.0acb6ffd.js} +1 -1
- package/dist/assets/{ttcn.3ea9f7e4.js → ttcn.5cb1c005.js} +1 -1
- package/dist/assets/{turtle.7f166fc9.js → turtle.f8cfe16f.js} +1 -1
- package/dist/assets/{twig.7c77b8f7.js → twig.bbb4c257.js} +1 -1
- package/dist/assets/ubuntu.195a12bc.js +11 -0
- package/dist/assets/uk-UA.b339fbea.js +1 -0
- package/dist/assets/{upgrades-migrations.df5c4042.js → upgrades-migrations.4262de4c.js} +1 -1
- package/dist/assets/use-sync.df5f0627.js +1 -0
- package/dist/assets/{user-directory.63d4d638.js → user-directory.315e2e53.js} +1 -1
- package/dist/assets/{users-roles-permissions.68584449.js → users-roles-permissions.1d02ef32.js} +1 -1
- package/dist/assets/{users.c3c87007.js → users.850440e1.js} +19 -19
- package/dist/assets/{utilities.e7ef40fc.js → utilities.a706557a.js} +3 -3
- package/dist/assets/{vb.1551d2a2.js → vb.227d7bae.js} +1 -1
- package/dist/assets/{vbscript.0c1ac8ad.js → vbscript.b4c906c8.js} +1 -1
- package/dist/assets/{velocity.63a0cbb3.js → velocity.1dc1dd7a.js} +1 -1
- package/dist/assets/vendor.327371af.js +2039 -0
- package/dist/assets/{verilog.37081dae.js → verilog.00006420.js} +1 -1
- package/dist/assets/{vhdl.8c76cefa.js → vhdl.7ea928c0.js} +1 -1
- package/dist/assets/{vi-VN.14101822.js → vi-VN.12000d52.js} +1 -1
- package/dist/assets/{vue.2098315b.js → vue.06dc381f.js} +1 -1
- package/dist/assets/{wast.b90e42f3.js → wast.9ebd9127.js} +1 -1
- package/dist/assets/{webhooks.2dd2256f.js → webhooks.27290345.js} +5 -5
- package/dist/assets/{webhooks.59b09c0d.js → webhooks.40c7a452.js} +1 -1
- package/dist/assets/{webidl.76dda28b.js → webidl.91787b9d.js} +1 -1
- package/dist/assets/{xquery.5d4fe342.js → xquery.8f2f2640.js} +1 -1
- package/dist/assets/{yacas.b1b2324d.js → yacas.e74d7b64.js} +1 -1
- package/dist/assets/{yaml-frontmatter.6a71ce09.js → yaml-frontmatter.09f551ca.js} +1 -1
- package/dist/assets/{yaml.ca3ba26d.js → yaml.6c188844.js} +1 -1
- package/dist/assets/{z80.a23bb6d3.js → z80.2ec7da50.js} +1 -1
- package/dist/assets/zh-CN.7e212f77.js +1 -0
- package/dist/assets/{zh-TW.3efec3f7.js → zh-TW.ef28a778.js} +1 -1
- package/dist/index.0b1b074c.js +351 -0
- package/dist/index.html +4 -4
- package/dist/vue-i18n.9dd4f933.js +1 -0
- package/dist/vue-router.1ce019c2.js +1 -0
- package/dist/vue.6e63c09e.js +1 -0
- package/package.json +18 -17
- package/dist/@directus_extensions-sdk.8dd2238a.js +0 -1
- package/dist/assets/af-ZA.5bc87dbc.js +0 -1
- package/dist/assets/bg-BG.9212fbf7.js +0 -2
- package/dist/assets/cli.9c35ba03.js +0 -10
- package/dist/assets/cmake.59d9f97d.js +0 -1
- package/dist/assets/css.f0a27894.js +0 -1
- package/dist/assets/data-model.66f7e0e4.js +0 -1
- package/dist/assets/digitalocean-app-platform.d8054fb4.js +0 -3
- package/dist/assets/es-419.f8a62d18.js +0 -1
- package/dist/assets/es-CL.76c7e2d1.js +0 -1
- package/dist/assets/es-ES.f23f1053.js +0 -1
- package/dist/assets/faq.e629faf1.js +0 -1
- package/dist/assets/fi-FI.26f5b2cc.js +0 -1
- package/dist/assets/fr-FR.e2625f19.js +0 -1
- package/dist/assets/hi-IN.d224762a.js +0 -1
- package/dist/assets/hooks.9441eb32.js +0 -75
- package/dist/assets/index.570f6759.js +0 -26
- package/dist/assets/index.9fb5b610.css +0 -1
- package/dist/assets/index.a49dcfb2.css +0 -1
- package/dist/assets/installation.24a44faf.js +0 -1
- package/dist/assets/introduction.25a5119e.js +0 -1
- package/dist/assets/it-IT.3c8c35dd.js +0 -1
- package/dist/assets/ja-JP.1e745c98.js +0 -1
- package/dist/assets/ku-TR.62749d99.js +0 -1
- package/dist/assets/logo-light.1a93a59d.svg +0 -3
- package/dist/assets/migrations.992a23b0.js +0 -15
- package/dist/assets/no-NO.66c87fac.js +0 -1
- package/dist/assets/overview.b56593b7.js +0 -1
- package/dist/assets/php.7f583bfa.js +0 -1
- package/dist/assets/pl-PL.8f26d744.js +0 -1
- package/dist/assets/project-settings.31256b54.js +0 -1
- package/dist/assets/pt-BR.e623fc8a.js +0 -1
- package/dist/assets/rst.f0464fbc.js +0 -1
- package/dist/assets/ru-RU.fec4e20e.js +0 -1
- package/dist/assets/sdk.b41be838.js +0 -282
- package/dist/assets/soy.2c180864.js +0 -1
- package/dist/assets/sql.f222e1b8.js +0 -1
- package/dist/assets/stylus.02531228.js +0 -1
- package/dist/assets/sv-SE.1739ab58.js +0 -1
- package/dist/assets/ubuntu.67ddbadb.js +0 -11
- package/dist/assets/uk-UA.46578a03.js +0 -1
- package/dist/assets/use-sync.da76e524.js +0 -1
- package/dist/assets/vendor.299bc11c.js +0 -2039
- package/dist/assets/zh-CN.355da8e5.js +0 -1
- package/dist/index.0f7650cb.js +0 -340
- package/dist/vue-i18n.b2a4a29c.js +0 -1
- package/dist/vue-router.cd2fde56.js +0 -1
- package/dist/vue.642980f3.js +0 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import{r as o,p as a,q as c,w as u,B as l,P as e}from"./vendor.327371af.js";const r=l("div",{class:"markdown-body"},[l("blockquote",null,[l("p",null,"Custom API Hooks allow running custom logic when a specified event occurs within your project. Types of API hooks are Actions, Filters, Init, and Schedule.")]),l("p",null,[l("div",{class:"table-of-contents"},[l("ul",null,[l("li",null,[l("a",{href:"#types-of-hooks"},"Types of Hooks")]),l("li",null,[l("a",{href:"#available-events"},"Available Events")]),l("li",null,[l("a",{href:"#creating-a-hook"},"Creating a Hook")])])])]),l("h2",{id:"types-of-hooks"},[e("Types of Hooks "),l("a",{class:"header-anchor",href:"#types-of-hooks"},"#")]),l("ul",null,[l("li",null,[l("a",{href:"#action"},"Action")]),l("li",null,[l("a",{href:"#filter"},"Filter")]),l("li",null,[l("a",{href:"#init"},"Init")]),l("li",null,[l("a",{href:"#schedule"},"Schedule")])]),l("p",null,"Use filter hooks when you want the hook to fire before the event. Use action hooks when you want the hook to fire after the event."),l("p",null,[e("Hooks can impact performance when not carefully implemented. Filter hooks happen before the event fires, making them much more susceptible to performance issues. Hooks on "),l("code",null,"read"),e(" actions can also impact performance since a single request can result in many database reads.")]),l("h3",{id:"action"},[e("Action "),l("a",{class:"header-anchor",href:"#action"},"#")]),l("p",null,"An action event executes after a defined event and receives data related to the event. Use actions hooks when you need to automate responses to CRUD events on items or server actions."),l("p",null,"The action register function receives two parameters:"),l("ul",null,[l("li",null,"The event name"),l("li",null,"A callback function that is executed whenever the event fires.")]),l("p",null,"The callback function itself receives two parameters:"),l("ul",null,[l("li",null,"An event-specific meta object"),l("li",null,"A context object")]),l("p",null,"The context object has the following properties:"),l("ul",null,[l("li",null,[l("code",null,"database"),e(" \u2014 The current database transaction")]),l("li",null,[l("code",null,"schema"),e(" \u2014 The current API schema in use")]),l("li",null,[l("code",null,"accountability"),e(" \u2014 Information about the current user")])]),l("h3",{id:"filter"},[e("Filter "),l("a",{class:"header-anchor",href:"#filter"},"#")]),l("p",null,"Filter hooks act on the event\u2019s payload before the event is fired. They allow you to check, modify, or cancel an event."),l("p",null,[e("Below is an example of canceling a "),l("code",null,"create"),e(" event by throwing a standard Directus exception.")]),l("pre",null,[l("code",{class:"language-js"},[l("span",{class:"hljs-built_in"},"module"),e(".exports = "),l("span",{class:"hljs-function"},[l("span",{class:"hljs-keyword"},"function"),e(),l("span",{class:"hljs-title"},"registerHook"),e("("),l("span",{class:"hljs-params"},"{ filter }, { exceptions }"),e(") ")]),e(`{
|
|
2
|
+
`),l("span",{class:"hljs-keyword"},"const"),e(` { InvalidPayloadException } = exceptions;
|
|
3
|
+
|
|
4
|
+
filter(`),l("span",{class:"hljs-string"},"'items.create'"),e(", "),l("span",{class:"hljs-keyword"},"async"),e(` (input) => {
|
|
5
|
+
`),l("span",{class:"hljs-keyword"},"if"),e(` (LOGIC_TO_CANCEL_EVENT) {
|
|
6
|
+
`),l("span",{class:"hljs-keyword"},"throw"),e(),l("span",{class:"hljs-keyword"},"new"),e(` InvalidPayloadException(WHAT_IS_WRONG);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
`),l("span",{class:"hljs-keyword"},"return"),e(` input;
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
`)])]),l("p",null,"The filter register function receives two parameters:"),l("ul",null,[l("li",null,"The event name"),l("li",null,"A callback function that is executed whenever the event fires.")]),l("p",null,"The callback function itself receives three parameters:"),l("ul",null,[l("li",null,"The modifiable payload"),l("li",null,"An event-specific meta object"),l("li",null,"A context object")]),l("p",null,"The context object has the following properties:"),l("ul",null,[l("li",null,[l("code",null,"database"),e(" \u2014 The current database transaction")]),l("li",null,[l("code",null,"schema"),e(" \u2014 The current API schema in use")]),l("li",null,[l("code",null,"accountability"),e(" \u2014 Information about the current user")])]),l("h3",{id:"init"},[e("Init "),l("a",{class:"header-anchor",href:"#init"},"#")]),l("p",null,"An init event executes at a defined point within the lifecycle of Directus. Use init event objects to inject logic into internal services."),l("p",null,"The init register function receives two parameters:"),l("ul",null,[l("li",null,"The event name"),l("li",null,"A callback function that is executed whenever the event fires.")]),l("p",null,"The callback function itself receives one parameter:"),l("ul",null,[l("li",null,"An event-specific meta object")]),l("h3",{id:"schedule"},[e("Schedule "),l("a",{class:"header-anchor",href:"#schedule"},"#")]),l("p",null,[e("A schedule event executes at certain points in time rather than when Directus performs a specific action. This is supported through "),l("a",{href:"https://www.npmjs.com/package/node-cron",target:"_blank",rel:"noopener noreferrer"},[l("code",null,"node-cron")]),e(". To set up a scheduled event, provide a cron statement as the first parameter to the "),l("code",null,"schedule()"),e(" function. For example "),l("code",null,"schedule('15 14 1 * *', <...>)"),e(" (at 14:15 on day-of-month 1) or "),l("code",null,"schedule('5 4 * * sun', <...>)"),e(" (at 04:05 on Sunday). See example below:")]),l("pre",null,[l("code",{class:"language-js"},[l("span",{class:"hljs-keyword"},"const"),e(" axios = "),l("span",{class:"hljs-built_in"},"require"),e("("),l("span",{class:"hljs-string"},"'axios'"),e(`);
|
|
13
|
+
|
|
14
|
+
`),l("span",{class:"hljs-built_in"},"module"),e(".exports = "),l("span",{class:"hljs-function"},[l("span",{class:"hljs-keyword"},"function"),e(),l("span",{class:"hljs-title"},"registerHook"),e("("),l("span",{class:"hljs-params"},"{ schedule }"),e(") ")]),e(`{
|
|
15
|
+
schedule(`),l("span",{class:"hljs-string"},"'*/15 * * * *'"),e(", "),l("span",{class:"hljs-keyword"},"async"),e(` () => {
|
|
16
|
+
`),l("span",{class:"hljs-keyword"},"await"),e(" axios.post("),l("span",{class:"hljs-string"},"'http://example.com/webhook'"),e(", { "),l("span",{class:"hljs-attr"},"message"),e(": "),l("span",{class:"hljs-string"},"'Another 15 minutes passed...'"),e(` });
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
`)])]),l("h2",{id:"available-events"},[e("Available Events "),l("a",{class:"header-anchor",href:"#available-events"},"#")]),l("h3",{id:"action-events"},[e("Action Events "),l("a",{class:"header-anchor",href:"#action-events"},"#")]),l("table",null,[l("thead",null,[l("tr",null,[l("th",null,"Name"),l("th",null,"Meta")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"server.start")]),l("td",null,[l("code",null,"server")])]),l("tr",null,[l("td",null,[l("code",null,"server.stop")]),l("td",null,[l("code",null,"server")])]),l("tr",null,[l("td",null,[l("code",null,"response")]),l("td",null,[l("code",null,"request"),e(", "),l("code",null,"response"),e(", "),l("code",null,"ip"),e(", "),l("code",null,"duration"),e(", "),l("code",null,"finished")])]),l("tr",null,[l("td",null,[l("code",null,"auth.login")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"status"),e(", "),l("code",null,"user"),e(", "),l("code",null,"provider")])]),l("tr",null,[l("td",null,[l("code",null,"files.upload")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"key"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"(<collection>.)items.read")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"query"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"(<collection>.)items.create")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"key"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"(<collection>.)items.update")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"keys"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"(<collection>.)items.delete")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"<system-collection>.create")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"key"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"<system-collection>.update")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"keys"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"<system-collection>.delete")]),l("td",null,[l("code",null,"payload"),e(", "),l("code",null,"collection")])])])]),l("div",{class:"tip hint"},[l("div",{class:"hint-title"},"System Collections"),l("p",null,[l("code",null,"<system-collection>"),e(" should be replaced with one of the system collection names "),l("code",null,"activity"),e(", "),l("code",null,"collections"),e(", "),l("code",null,"fields"),e(", "),l("code",null,"folders"),e(", "),l("code",null,"permissions"),e(", "),l("code",null,"presets"),e(", "),l("code",null,"relations"),e(", "),l("code",null,"revisions"),e(", "),l("code",null,"roles"),e(", "),l("code",null,"settings"),e(", "),l("code",null,"users"),e(" or "),l("code",null,"webhooks"),e(".")])]),l("h3",{id:"filter-events"},[e("Filter Events "),l("a",{class:"header-anchor",href:"#filter-events"},"#")]),l("table",null,[l("thead",null,[l("tr",null,[l("th",null,"Name"),l("th",null,"Payload"),l("th",null,"Meta")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"request.not_found")]),l("td",null,[l("code",null,"false")]),l("td",null,[l("code",null,"request"),e(", "),l("code",null,"response")])]),l("tr",null,[l("td",null,[l("code",null,"request.error")]),l("td",null,"The request errors"),l("td",null,"\u2013")]),l("tr",null,[l("td",null,[l("code",null,"database.error")]),l("td",null,"The database error"),l("td",null,[l("code",null,"client")])]),l("tr",null,[l("td",null,[l("code",null,"auth.login")]),l("td",null,"The login payload"),l("td",null,[l("code",null,"status"),e(", "),l("code",null,"user"),e(", "),l("code",null,"provider")])]),l("tr",null,[l("td",null,[l("code",null,"auth.jwt")]),l("td",null,"The auth token"),l("td",null,[l("code",null,"status"),e(", "),l("code",null,"user"),e(", "),l("code",null,"provider"),e(", "),l("code",null,"type")])]),l("tr",null,[l("td",null,[l("code",null,"(<collection>.)items.read")]),l("td",null,"The read item"),l("td",null,[l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"(<collection>.)items.create")]),l("td",null,"The new item"),l("td",null,[l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"(<collection>.)items.update")]),l("td",null,"The updated item"),l("td",null,[l("code",null,"keys"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"(<collection>.)items.delete")]),l("td",null,"The keys of the item"),l("td",null,[l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"<system-collection>.create")]),l("td",null,"The new item"),l("td",null,[l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"<system-collection>.update")]),l("td",null,"The updated item"),l("td",null,[l("code",null,"keys"),e(", "),l("code",null,"collection")])]),l("tr",null,[l("td",null,[l("code",null,"<system-collection>.delete")]),l("td",null,"The keys of the item"),l("td",null,[l("code",null,"collection")])])])]),l("div",{class:"tip hint"},[l("div",{class:"hint-title"},"System Collections"),l("p",null,[l("code",null,"<system-collection>"),e(" should be replaced with one of the system collection names "),l("code",null,"activity"),e(", "),l("code",null,"collections"),e(", "),l("code",null,"fields"),e(", "),l("code",null,"folders"),e(", "),l("code",null,"permissions"),e(", "),l("code",null,"presets"),e(", "),l("code",null,"relations"),e(", "),l("code",null,"revisions"),e(", "),l("code",null,"roles"),e(", "),l("code",null,"settings"),e(", "),l("code",null,"users"),e(" or "),l("code",null,"webhooks"),e(".")])]),l("h3",{id:"init-events"},[e("Init Events "),l("a",{class:"header-anchor",href:"#init-events"},"#")]),l("table",null,[l("thead",null,[l("tr",null,[l("th",null,"Name"),l("th",null,"Meta")])]),l("tbody",null,[l("tr",null,[l("td",null,[l("code",null,"cli.before")]),l("td",null,[l("code",null,"program")])]),l("tr",null,[l("td",null,[l("code",null,"cli.after")]),l("td",null,[l("code",null,"program")])]),l("tr",null,[l("td",null,[l("code",null,"app.before")]),l("td",null,[l("code",null,"app")])]),l("tr",null,[l("td",null,[l("code",null,"app.after")]),l("td",null,[l("code",null,"app")])]),l("tr",null,[l("td",null,[l("code",null,"routes.before")]),l("td",null,[l("code",null,"app")])]),l("tr",null,[l("td",null,[l("code",null,"routes.after")]),l("td",null,[l("code",null,"app")])]),l("tr",null,[l("td",null,[l("code",null,"routes.custom.before")]),l("td",null,[l("code",null,"app")])]),l("tr",null,[l("td",null,[l("code",null,"routes.custom.after")]),l("td",null,[l("code",null,"app")])]),l("tr",null,[l("td",null,[l("code",null,"middlewares.before")]),l("td",null,[l("code",null,"app")])]),l("tr",null,[l("td",null,[l("code",null,"middlewares.after")]),l("td",null,[l("code",null,"app")])])])]),l("h2",{id:"creating-a-hook"},[e("Creating a Hook "),l("a",{class:"header-anchor",href:"#creating-a-hook"},"#")]),l("h3",{id:"1.-create-a-hook-file"},[e("1. Create a Hook File "),l("a",{class:"header-anchor",href:"#1.-create-a-hook-file"},"#")]),l("p",null,[e("Custom hooks are dynamically loaded from within your extensions folder. By default, this directory is located at "),l("code",null,"/extensions"),e(", but it can be configured within your project\u2019s env file to be located anywhere. The hook-id is the name of your hook.")]),l("h4",{id:"default-standalone-hook-location"},[e("Default Standalone Hook Location "),l("a",{class:"header-anchor",href:"#default-standalone-hook-location"},"#")]),l("pre",null,[l("code",null,`/extensions/hooks/<hook-id>/index.js
|
|
20
|
+
`)]),l("h3",{id:"2.-register-your-hook"},[e("2. Register your Hook "),l("a",{class:"header-anchor",href:"#2.-register-your-hook"},"#")]),l("p",null,[e("The "),l("code",null,"registerHook"),e(" function receives an object containing the type-specific register functions as the first parameter:")]),l("ul",null,[l("li",null,[l("code",null,"filter"),e(" \u2014 Listen for a filter event")]),l("li",null,[l("code",null,"action"),e(" \u2014 Listen for an action event")]),l("li",null,[l("code",null,"init"),e(" \u2014 Listen for an init event")]),l("li",null,[l("code",null,"schedule"),e(" \u2014 Execute a function at certain points in time")])]),l("p",null,"A second parameter is a context object with the following properties:"),l("ul",null,[l("li",null,[l("code",null,"services"),e(" \u2014 All API internal services")]),l("li",null,[l("code",null,"exceptions"),e(" \u2014 API exception objects that can be used for throwing \u201Cproper\u201D errors")]),l("li",null,[l("code",null,"database"),e(" \u2014 Knex instance that is connected to the current database")]),l("li",null,[l("code",null,"getSchema"),e(" \u2014 Async function that reads the full available schema for use in services")]),l("li",null,[l("code",null,"env"),e(" \u2014 Parsed environment variables")]),l("li",null,[l("code",null,"logger"),e(" \u2014 "),l("a",{href:"https://github.com/pinojs/pino",target:"_blank",rel:"noopener noreferrer"},"Pino"),e(" instance.")])]),l("p",null,"Each custom hook is registered to its event scope using a function with the following format:"),l("pre",null,[l("code",{class:"language-js"},[l("span",{class:"hljs-keyword"},"const"),e(" axios = "),l("span",{class:"hljs-built_in"},"require"),e("("),l("span",{class:"hljs-string"},"'axios'"),e(`);
|
|
21
|
+
|
|
22
|
+
`),l("span",{class:"hljs-built_in"},"module"),e(".exports = "),l("span",{class:"hljs-function"},[l("span",{class:"hljs-keyword"},"function"),e(),l("span",{class:"hljs-title"},"registerHook"),e("("),l("span",{class:"hljs-params"},"{ action }"),e(") ")]),e(`{
|
|
23
|
+
action(`),l("span",{class:"hljs-string"},"'items.create'"),e(", "),l("span",{class:"hljs-function"},"() =>"),e(` {
|
|
24
|
+
axios.post(`),l("span",{class:"hljs-string"},"'http://example.com/webhook'"),e(`);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
`)])]),l("h3",{id:"3.-develop-your-custom-hook"},[e("3. Develop your Custom Hook "),l("a",{class:"header-anchor",href:"#3.-develop-your-custom-hook"},"#")]),l("p",null,"Trigger your custom hook with any of the platform\u2019s many API events."),l("p",null,"Event names consist of multiple scopes delimited by a dot:"),l("pre",null,[l("code",null,`<scope>.<scope>...
|
|
28
|
+
// eg: items.create
|
|
29
|
+
// eg: users.update
|
|
30
|
+
// eg: auth.login
|
|
31
|
+
// eg: routes.custom.before
|
|
32
|
+
`)]),l("p",null,[e("Using the example from step 2, "),l("code",null,"action()"),e(" is the hook type and it receives two arguments. "),l("code",null,"items.create"),e(" is the API event that should trigger the hook. It also receives a callback function that says what the hook should do when the API event occurs.")]),l("pre",null,[l("code",{class:"language-js"},[l("span",{class:"hljs-keyword"},"const"),e(" axios = "),l("span",{class:"hljs-built_in"},"require"),e("("),l("span",{class:"hljs-string"},"'axios'"),e(`);
|
|
33
|
+
|
|
34
|
+
`),l("span",{class:"hljs-built_in"},"module"),e(".exports = "),l("span",{class:"hljs-function"},[l("span",{class:"hljs-keyword"},"function"),e(),l("span",{class:"hljs-title"},"registerHook"),e("("),l("span",{class:"hljs-params"},"{ action }"),e(") ")]),e(`{
|
|
35
|
+
action(`),l("span",{class:"hljs-string"},"'items.create'"),e(", "),l("span",{class:"hljs-function"},"() =>"),e(` {
|
|
36
|
+
axios.post(`),l("span",{class:"hljs-string"},"'http://example.com/webhook'"),e(`);
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
`)])]),l("h3",{id:"4.-restart-the-api"},[e("4. Restart the API "),l("a",{class:"header-anchor",href:"#4.-restart-the-api"},"#")]),l("p",null,"To deploy your hook, restart the API by running:"),l("pre",null,[l("code",{class:"language-bash"},`npx directus start
|
|
40
|
+
`)]),l("h3",{id:"full-example"},[e("Full Example "),l("a",{class:"header-anchor",href:"#full-example"},"#")]),l("p",null,[l("code",null,"extensions/hooks/sync-with-external/index.js"),e(":")]),l("pre",null,[l("code",{class:"language-js"},[l("span",{class:"hljs-keyword"},"const"),e(" axios = "),l("span",{class:"hljs-built_in"},"require"),e("("),l("span",{class:"hljs-string"},"'axios'"),e(`);
|
|
41
|
+
|
|
42
|
+
`),l("span",{class:"hljs-built_in"},"module"),e(".exports = "),l("span",{class:"hljs-function"},[l("span",{class:"hljs-keyword"},"function"),e(),l("span",{class:"hljs-title"},"registerHook"),e("("),l("span",{class:"hljs-params"},"{ filter }, { services, exceptions }"),e(") ")]),e(`{
|
|
43
|
+
`),l("span",{class:"hljs-keyword"},"const"),e(` { MailService } = services;
|
|
44
|
+
`),l("span",{class:"hljs-keyword"},"const"),e(` { ServiceUnavailableException, ForbiddenException } = exceptions;
|
|
45
|
+
|
|
46
|
+
`),l("span",{class:"hljs-comment"},"// Sync with external recipes service, cancel creation on failure"),e(`
|
|
47
|
+
filter(`),l("span",{class:"hljs-string"},"'items.create'"),e(", "),l("span",{class:"hljs-keyword"},"async"),e(` (input, { collection }, { schema }) => {
|
|
48
|
+
`),l("span",{class:"hljs-keyword"},"if"),e(" (collection !== "),l("span",{class:"hljs-string"},"'recipes'"),e(") "),l("span",{class:"hljs-keyword"},"return"),e(` input;
|
|
49
|
+
|
|
50
|
+
`),l("span",{class:"hljs-keyword"},"const"),e(" mailService = "),l("span",{class:"hljs-keyword"},"new"),e(` MailService({ schema });
|
|
51
|
+
|
|
52
|
+
`),l("span",{class:"hljs-keyword"},"try"),e(` {
|
|
53
|
+
`),l("span",{class:"hljs-keyword"},"await"),e(" axios.post("),l("span",{class:"hljs-string"},"'https://example.com/recipes'"),e(`, input);
|
|
54
|
+
`),l("span",{class:"hljs-keyword"},"await"),e(` mailService.send({
|
|
55
|
+
`),l("span",{class:"hljs-attr"},"to"),e(": "),l("span",{class:"hljs-string"},"'person@example.com'"),e(`,
|
|
56
|
+
`),l("span",{class:"hljs-attr"},"template"),e(`: {
|
|
57
|
+
`),l("span",{class:"hljs-attr"},"name"),e(": "),l("span",{class:"hljs-string"},"'item-created'"),e(`,
|
|
58
|
+
`),l("span",{class:"hljs-attr"},"data"),e(`: {
|
|
59
|
+
`),l("span",{class:"hljs-attr"},"collection"),e(`: collection,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
} `),l("span",{class:"hljs-keyword"},"catch"),e(` (error) {
|
|
64
|
+
`),l("span",{class:"hljs-keyword"},"throw"),e(),l("span",{class:"hljs-keyword"},"new"),e(` ServiceUnavailableException(error);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
input.syncedWithExample = `),l("span",{class:"hljs-literal"},"true"),e(`;
|
|
68
|
+
|
|
69
|
+
`),l("span",{class:"hljs-keyword"},"return"),e(` input;
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
`)])])],-1),f={setup(i,{expose:t}){const n={title:"Custom API Hooks",modularExtension:!0};return t({frontmatter:n}),(d,h)=>{const s=o("DocsWrapper");return a(),c(s,{frontmatter:n},{default:u(()=>[r]),_:1})}}};export{f as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{bH as i}from"./vendor.327371af.js";import{a as l}from"./htmlmixed.8b21831b.js";import{m as a}from"./multiplex.553fdcf6.js";function s(n,o){return o.forEach(function(e){e&&typeof e!="string"&&!Array.isArray(e)&&Object.keys(e).forEach(function(m){if(m!=="default"&&!(m in n)){var t=Object.getOwnPropertyDescriptor(e,m);Object.defineProperty(n,m,t.get?t:{enumerable:!0,get:function(){return e[m]}})}})}),Object.freeze(n)}var p={exports:{}};(function(n,o){(function(e){e(i.exports,l.exports,a.exports)})(function(e){e.defineMode("htmlembedded",function(m,t){var d=t.closeComment||"--%>";return e.multiplexingMode(e.getMode(m,"htmlmixed"),{open:t.openComment||"<%--",close:d,delimStyle:"comment",mode:{token:function(c){return c.skipTo(d)||c.skipToEnd(),"comment"}}},{open:t.open||t.scriptStartRegex||"<%",close:t.close||t.scriptEndRegex||"%>",mode:e.getMode(m,t.scriptingModeSpec)})},"htmlmixed"),e.defineMIME("application/x-ejs",{name:"htmlembedded",scriptingModeSpec:"javascript"}),e.defineMIME("application/x-aspx",{name:"htmlembedded",scriptingModeSpec:"text/x-csharp"}),e.defineMIME("application/x-jsp",{name:"htmlembedded",scriptingModeSpec:"text/x-java"}),e.defineMIME("application/x-erb",{name:"htmlembedded",scriptingModeSpec:"ruby"})})})();var r=p.exports,b=Object.freeze(s({__proto__:null,[Symbol.toStringTag]:"Module",default:r},[p.exports]));export{b as h};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{bH as R,bJ as _}from"./vendor.327371af.js";import{a as I}from"./javascript.38e2ca1a.js";import{a as z}from"./css.17df7ad1.js";function A(m,x){return x.forEach(function(c){c&&typeof c!="string"&&!Array.isArray(c)&&Object.keys(c).forEach(function(u){if(u!=="default"&&!(u in m)){var g=Object.getOwnPropertyDescriptor(c,u);Object.defineProperty(m,u,g.get?g:{enumerable:!0,get:function(){return c[u]}})}})}),Object.freeze(m)}var $={exports:{}};(function(m,x){(function(c){c(R.exports,_.exports,I.exports,z.exports)})(function(c){var u={script:[["lang",/(javascript|babel)/i,"javascript"],["type",/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i,"javascript"],["type",/./,"text/plain"],[null,null,"javascript"]],style:[["lang",/^css$/i,"css"],["type",/^(text\/)?(x-)?(stylesheet|css)$/i,"css"],["type",/./,"text/plain"],[null,null,"css"]]};function g(n,a,l){var o=n.current(),r=o.search(a);return r>-1?n.backUp(o.length-r):o.match(/<\/?$/)&&(n.backUp(o.length),n.match(a,!1)||n.match(o)),l}var S={};function k(n){var a=S[n];return a||(S[n]=new RegExp("\\s+"+n+`\\s*=\\s*('|")?([^'"]+)('|")?\\s*`))}function w(n,a){var l=n.match(k(a));return l?/^\s*(.*?)\s*$/.exec(l[2])[1]:""}function y(n,a){return new RegExp((a?"^":"")+"</s*"+n+"s*>","i")}function T(n,a){for(var l in n)for(var o=a[l]||(a[l]=[]),r=n[l],i=r.length-1;i>=0;i--)o.unshift(r[i])}function O(n,a){for(var l=0;l<n.length;l++){var o=n[l];if(!o[0]||o[1].test(w(a,o[0])))return o[2]}}c.defineMode("htmlmixed",function(n,a){var l=c.getMode(n,{name:"xml",htmlMode:!0,multilineTagIndentFactor:a.multilineTagIndentFactor,multilineTagIndentPastTag:a.multilineTagIndentPastTag,allowMissingTagName:a.allowMissingTagName}),o={},r=a&&a.tags,i=a&&a.scriptTypes;if(T(u,o),r&&T(r,o),i)for(var p=i.length-1;p>=0;p--)o.script.unshift(["type",i[p].matches,i[p].mode]);function b(t,e){var f=l.token(t,e.htmlState),j=/\btag\b/.test(f),h;if(j&&!/[<>\s\/]/.test(t.current())&&(h=e.htmlState.tagName&&e.htmlState.tagName.toLowerCase())&&o.hasOwnProperty(h))e.inTag=h+" ";else if(e.inTag&&j&&/>$/.test(t.current())){var d=/^([\S]+) (.*)/.exec(e.inTag);e.inTag=null;var N=t.current()==">"&&O(o[d[1]],d[2]),M=c.getMode(n,N),P=y(d[1],!0),E=y(d[1],!1);e.token=function(v,s){return v.match(P,!1)?(s.token=b,s.localState=s.localMode=null,null):g(v,E,s.localMode.token(v,s.localState))},e.localMode=M,e.localState=c.startState(M,l.indent(e.htmlState,"",""))}else e.inTag&&(e.inTag+=t.current(),t.eol()&&(e.inTag+=" "));return f}return{startState:function(){var t=c.startState(l);return{token:b,inTag:null,localMode:null,localState:null,htmlState:t}},copyState:function(t){var e;return t.localState&&(e=c.copyState(t.localMode,t.localState)),{token:t.token,inTag:t.inTag,localMode:t.localMode,localState:e,htmlState:c.copyState(l,t.htmlState)}},token:function(t,e){return e.token(t,e)},indent:function(t,e,f){return!t.localMode||/^\s*<\//.test(e)?l.indent(t.htmlState,e,f):t.localMode.indent?t.localMode.indent(t.localState,e,f):c.Pass},innerMode:function(t){return{state:t.localState||t.htmlState,mode:t.localMode||l}}}},"xml","javascript","css"),c.defineMIME("text/html","htmlmixed")})})();var F=$.exports,H=Object.freeze(A({__proto__:null,[Symbol.toStringTag]:"Module",default:F},[$.exports]));export{$ as a,H as h};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{bH as g}from"./vendor.327371af.js";function b(i,s){return s.forEach(function(t){t&&typeof t!="string"&&!Array.isArray(t)&&Object.keys(t).forEach(function(u){if(u!=="default"&&!(u in i)){var c=Object.getOwnPropertyDescriptor(t,u);Object.defineProperty(i,u,c.get?c:{enumerable:!0,get:function(){return t[u]}})}})}),Object.freeze(i)}var p={exports:{}};(function(i,s){(function(t){t(g.exports)})(function(t){t.defineMode("http",function(){function u(r,e){return r.skipToEnd(),e.cur=f,"error"}function c(r,e){return r.match(/^HTTP\/\d\.\d/)?(e.cur=a,"keyword"):r.match(/^[A-Z]+/)&&/[ \t]/.test(r.peek())?(e.cur=h,"keyword"):u(r,e)}function a(r,e){var o=r.match(/^\d+/);if(!o)return u(r,e);e.cur=d;var n=Number(o[0]);return n>=100&&n<200?"positive informational":n>=200&&n<300?"positive success":n>=300&&n<400?"positive redirect":n>=400&&n<500?"negative client-error":n>=500&&n<600?"negative server-error":"error"}function d(r,e){return r.skipToEnd(),e.cur=f,null}function h(r,e){return r.eatWhile(/\S/),e.cur=v,"string-2"}function v(r,e){return r.match(/^HTTP\/\d\.\d$/)?(e.cur=f,"keyword"):u(r,e)}function f(r){return r.sol()&&!r.eat(/[ \t]/)?r.match(/^.*?:/)?"atom":(r.skipToEnd(),"error"):(r.skipToEnd(),"string")}function l(r){return r.skipToEnd(),null}return{token:function(r,e){var o=e.cur;return o!=f&&o!=l&&r.eatSpace()?null:o(r,e)},blankLine:function(r){r.cur=l},startState:function(){return{cur:c}}}}),t.defineMIME("message/http","http")})})();var y=p.exports,k=Object.freeze(b({__proto__:null,[Symbol.toStringTag]:"Module",default:y},[p.exports]));export{k as h};
|