@directus/app 9.20.4 → 9.21.2

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.
Files changed (523) hide show
  1. package/dist/assets/@directus_extensions-sdk.7480601b.entry.js +1 -0
  2. package/dist/assets/{accounts.8d02a534.js → accounts.00ff05b9.js} +1 -1
  3. package/dist/assets/active-line.cc9189df.js +1 -0
  4. package/dist/assets/{activity-log.957853bb.js → activity-log.c1a2e5a3.js} +1 -1
  5. package/dist/assets/{activity.58bbe1c2.js → activity.7112cbee.js} +1 -1
  6. package/dist/assets/add-a-recipe.51bd348b.js +1 -0
  7. package/dist/assets/apl.1621a749.js +1 -0
  8. package/dist/assets/ar-SA.9ddb3ade.js +2 -0
  9. package/dist/assets/{architecture.0ded5b28.js → architecture.b7c26a3b.js} +1 -1
  10. package/dist/assets/asciiarmor.e1fbcb0f.js +1 -0
  11. package/dist/assets/asn.1.2c8391be.js +1 -0
  12. package/dist/assets/asterisk.96d854f7.js +1 -0
  13. package/dist/assets/{authentication.5b7d5fa7.js → authentication.27557f4f.js} +5 -5
  14. package/dist/assets/autorefresh.1aa0c08c.js +1 -0
  15. package/dist/assets/{aws.890dfda5.js → aws.ea312e0b.js} +1 -1
  16. package/dist/assets/{backing-directus.7f54a4af.js → backing-directus.890b9c33.js} +1 -1
  17. package/dist/assets/basic-workflows.8f3fd328.js +1 -0
  18. package/dist/assets/{bn-IN.7fa1e9d9.js → bn-IN.598e11ba.js} +1 -1
  19. package/dist/assets/brainfuck.952f0867.js +1 -0
  20. package/dist/assets/build-a-content-hierarchy.41daeccc.js +97 -0
  21. package/dist/assets/{cli.bf0b2442.js → cli.45e9e9c9.js} +2 -2
  22. package/dist/assets/{cli.4e995657.js → cli.5531b0c6.js} +4 -4
  23. package/dist/assets/clike.f871e0ce.js +1 -0
  24. package/dist/assets/clojure.dfb2a0aa.js +1 -0
  25. package/dist/assets/{cloudron.0a16f34b.js → cloudron.258380cb.js} +1 -1
  26. package/dist/assets/cmake.594f5b32.js +1 -0
  27. package/dist/assets/cobol.d45d2d27.js +1 -0
  28. package/dist/assets/{codebase-overview.2ba91a80.js → codebase-overview.91c7de8c.js} +1 -1
  29. package/dist/assets/coffeescript.4eedbbb9.js +1 -0
  30. package/dist/assets/{collections.ea858bf6.js → collections.61f6b248.js} +3 -3
  31. package/dist/assets/{collections.2a61805a.js → collections.7a3b1972.js} +2 -2
  32. package/dist/assets/{collections.7fa07fe7.js → collections.b4a89731.js} +2 -2
  33. package/dist/assets/commonlisp.69abac6b.js +1 -0
  34. package/dist/assets/{conditions.32339903.js → conditions.ef847cae.js} +1 -1
  35. package/dist/assets/{config-options.53449c2c.js → config-options.86135d5b.js} +12 -12
  36. package/dist/assets/configure-user-registration.43d439a1.js +1 -0
  37. package/dist/assets/{content.18716bf7.js → content.62c8fe47.js} +1 -1
  38. package/dist/assets/{creating-extensions.0a6d6d3b.js → creating-extensions.65b17dfe.js} +3 -3
  39. package/dist/assets/crystal.bfce7e90.js +1 -0
  40. package/dist/assets/css.2ea5f0dd.js +1 -0
  41. package/dist/assets/cypher.a8be90c4.js +4 -0
  42. package/dist/assets/d.970bc6c0.js +1 -0
  43. package/dist/assets/dart.c20a75fc.js +1 -0
  44. package/dist/assets/{data-model.b5eb7565.js → data-model.86dfb86e.js} +3 -3
  45. package/dist/assets/de-DE.590d3c70.js +1 -0
  46. package/dist/assets/diff.83efcafe.js +1 -0
  47. package/dist/assets/{digitalocean-app-platform.4063d6cc.js → digitalocean-app-platform.cbd270c2.js} +2 -2
  48. package/dist/assets/{display-templates.65a9b519.js → display-templates.3da93597.js} +1 -1
  49. package/dist/assets/display.7dbfefd3.js +1 -0
  50. package/dist/assets/{displays.b72d546c.js → displays.7de6431d.js} +5 -5
  51. package/dist/assets/django.16d84d07.js +1 -0
  52. package/dist/assets/{docker.ae6227ab.js → docker.415a4af1.js} +1 -1
  53. package/dist/assets/dockerfile.50ad5737.js +1 -0
  54. package/dist/assets/{documentation.6628aaac.js → documentation.42b788f9.js} +1 -1
  55. package/dist/assets/dtd.b44f327f.js +1 -0
  56. package/dist/assets/dylan.e71cf0e1.js +1 -0
  57. package/dist/assets/ebnf.b67ca2a8.js +1 -0
  58. package/dist/assets/ecl.a694637b.js +1 -0
  59. package/dist/assets/eiffel.8a8cdbc6.js +1 -0
  60. package/dist/assets/el-GR.c0a3a0bf.js +1 -0
  61. package/dist/assets/elm.e174f3d7.js +1 -0
  62. package/dist/assets/{email-templates.5e1b5472.js → email-templates.dc238bec.js} +1 -1
  63. package/dist/assets/{endpoints.44874916.js → endpoints.c3e9ad6d.js} +1 -1
  64. package/dist/assets/erlang.9b90684f.js +1 -0
  65. package/dist/assets/es-MX.30ad99ae.js +1 -0
  66. package/dist/assets/{extensions.9790f6ff.js → extensions.a5e33cc9.js} +1 -1
  67. package/dist/assets/factor.fc03459f.js +1 -0
  68. package/dist/assets/{faq.0fd5ca6e.js → faq.5be12255.js} +2 -2
  69. package/dist/assets/fcl.5f56a413.js +1 -0
  70. package/dist/assets/{field-types.e5bd5900.js → field-types.acf0e140.js} +1 -1
  71. package/dist/assets/{field.b9b55fc2.js → field.b9a392a5.js} +1 -1
  72. package/dist/assets/{fields.fc8af154.js → fields.49dc9c06.js} +1 -1
  73. package/dist/assets/{fields.7df6f624.js → fields.ec401376.js} +1 -1
  74. package/dist/assets/{file-library.7a11d866.js → file-library.099ad14e.js} +1 -1
  75. package/dist/assets/{files.84b41f2f.js → files.53806aa8.js} +2 -2
  76. package/dist/assets/{filter-rules.099e9689.js → filter-rules.6293da5a.js} +4 -4
  77. package/dist/assets/{filters.98d31bd5.js → filters.52d6e673.js} +1 -1
  78. package/dist/assets/flows-for-loop.c0d96bfd.js +1 -0
  79. package/dist/assets/{flows.b6ebb4b6.js → flows.4a144234.js} +6 -6
  80. package/dist/assets/{flows.2646c3ae.js → flows.bd12c724.js} +2 -2
  81. package/dist/assets/{folders.35cfde90.js → folders.eca400c9.js} +5 -5
  82. package/dist/assets/forth.15fd7f42.js +1 -0
  83. package/dist/assets/fortran.1ff32443.js +1 -0
  84. package/dist/assets/fr-FR.d8dbf5de.js +1 -0
  85. package/dist/assets/gas.58e29d15.js +1 -0
  86. package/dist/assets/{gcp.ce76381f.js → gcp.7798a1d4.js} +5 -5
  87. package/dist/assets/generate-work-reports.682b3aa0.js +1 -0
  88. package/dist/assets/gfm.bac67f82.js +1 -0
  89. package/dist/assets/gherkin.55ae80a8.js +1 -0
  90. package/dist/assets/{github-ci.b4dde47f.js → github-ci.c2c0213a.js} +2 -2
  91. package/dist/assets/{glossary.930fe38e.js → glossary.5818cbf2.js} +1 -1
  92. package/dist/assets/{glossary.3b14c64d.js → glossary.86dfcaa5.js} +1 -1
  93. package/dist/assets/go.0ba144bf.js +1 -0
  94. package/dist/assets/groovy.d6e7c99f.js +1 -0
  95. package/dist/assets/haml.1235f7df.js +1 -0
  96. package/dist/assets/handlebars.ff4e52b8.js +1 -0
  97. package/dist/assets/haskell-literate.31bd2912.js +1 -0
  98. package/dist/assets/haskell.7e315eae.js +1 -0
  99. package/dist/assets/haxe.89c17af0.js +1 -0
  100. package/dist/assets/{hooks.b9909639.js → hooks.121520b6.js} +1 -1
  101. package/dist/assets/htmlembedded.133b6fc4.js +1 -0
  102. package/dist/assets/{htmlmixed.a7900839.js → htmlmixed.5302f41a.js} +1 -1
  103. package/dist/assets/htmlmixed.655b4687.js +1 -0
  104. package/dist/assets/http.3e53c321.js +1 -0
  105. package/dist/assets/hu-HU.9b5d2817.js +1 -0
  106. package/dist/assets/id-ID.626b885e.js +1 -0
  107. package/dist/assets/idl.e221918d.js +1 -0
  108. package/dist/assets/{iis.63d75601.js → iis.c623e90b.js} +1 -1
  109. package/dist/assets/{import-export.fe680598.js → import-export.ed35bdb2.js} +2 -2
  110. package/dist/assets/{index.ffcfdc79.js → index.04b73e2f.js} +1 -1
  111. package/dist/assets/{index.3ccb1a62.js → index.09845961.js} +1 -1
  112. package/dist/assets/{index.671547c3.js → index.130287f6.js} +1 -1
  113. package/dist/assets/{index.20179e31.js → index.1ba23fe5.js} +1 -1
  114. package/dist/assets/{index.f19e5b18.js → index.1f330fc3.js} +1 -1
  115. package/dist/assets/{index.7f210d25.js → index.24999c03.js} +1 -1
  116. package/dist/assets/{index.7c5199ad.js → index.330c3aee.js} +1 -1
  117. package/dist/assets/{index.549a82a6.js → index.3470f134.js} +1 -1
  118. package/dist/assets/{index.a6c65314.js → index.4044e5c7.js} +1 -1
  119. package/dist/assets/{index.764b9d6e.js → index.4706b3f5.js} +1 -1
  120. package/dist/assets/{index.875a771b.js → index.4b24f075.js} +1 -1
  121. package/dist/assets/{index.6949d989.js → index.4c6e76b7.js} +1 -1
  122. package/dist/assets/{index.0d7f4d79.js → index.522f44b0.js} +1 -1
  123. package/dist/assets/{index.1c9cfeb8.js → index.525d8fd8.js} +1 -1
  124. package/dist/assets/{index.d8e4727e.js → index.528e4b54.js} +1 -1
  125. package/dist/assets/{index.d9e48160.js → index.52a4297c.js} +1 -1
  126. package/dist/assets/{index.34c47fcf.js → index.530fd584.js} +1 -1
  127. package/dist/assets/{index.91e98759.js → index.546018df.js} +1 -1
  128. package/dist/assets/{index.d557b36c.js → index.57542755.js} +1 -1
  129. package/dist/assets/{index.aa66a39f.js → index.579d3ebd.js} +1 -1
  130. package/dist/assets/{index.425c965c.js → index.5a8952da.js} +1 -1
  131. package/dist/assets/{index.9b6db0de.js → index.5cf97c2b.js} +1 -1
  132. package/dist/assets/{index.08c5d5a2.js → index.6b77e807.js} +1 -1
  133. package/dist/assets/{index.393b7fd6.js → index.6bf3a163.js} +1 -1
  134. package/dist/assets/{index.fe4bc374.js → index.6c07a132.js} +1 -1
  135. package/dist/assets/{index.1f99dc82.js → index.6c4fabf1.js} +1 -1
  136. package/dist/assets/{index.7468a23c.js → index.6fa71870.js} +1 -1
  137. package/dist/assets/{index.8fb3c07f.js → index.7045dfad.js} +1 -1
  138. package/dist/assets/{index.c3959367.js → index.77b8f02e.js} +1 -1
  139. package/dist/assets/{index.62e48e8e.js → index.7943fd38.js} +1 -1
  140. package/dist/assets/{index.ac96f5b3.js → index.7c5b74dc.js} +1 -1
  141. package/dist/assets/{index.f32d0fbe.js → index.7de5db57.js} +1 -1
  142. package/dist/assets/{index.8aa50b59.js → index.7e90d361.js} +1 -1
  143. package/dist/assets/{index.2399ffb8.js → index.7edb8b15.js} +1 -1
  144. package/dist/assets/{index.d370fafd.js → index.7fcf2b86.js} +1 -1
  145. package/dist/assets/{index.5c5acddc.js → index.80106d2d.js} +1 -1
  146. package/dist/assets/{index.8b8e6073.js → index.804b3c9b.js} +1 -1
  147. package/dist/assets/{index.5264aa26.js → index.8063dc25.js} +1 -1
  148. package/dist/assets/{index.eb772cab.js → index.81a02f8c.js} +1 -1
  149. package/dist/assets/{index.38e5dfc6.js → index.81d5b763.js} +1 -1
  150. package/dist/assets/{index.7269b9b7.js → index.8200528c.js} +1 -1
  151. package/dist/assets/{index.00acb7aa.js → index.82939b3a.js} +1 -1
  152. package/dist/assets/{index.d024a491.js → index.8446e18c.js} +1 -1
  153. package/dist/assets/index.87afb869.js +1 -0
  154. package/dist/assets/index.8d15d209.css +1 -0
  155. package/dist/assets/{index.7e37814b.js → index.92f59a75.js} +1 -1
  156. package/dist/assets/{index.3abfd687.js → index.98cb4ee1.js} +1 -1
  157. package/dist/assets/{index.3d4f0091.css → index.9bdfd349.css} +1 -1
  158. package/dist/assets/{index.486669b9.js → index.9d2fbf00.js} +1 -1
  159. package/dist/assets/{index.ec87e7f6.js → index.9dfe292c.js} +1 -1
  160. package/dist/assets/{index.4ce96101.js → index.a1b7be9b.js} +1 -1
  161. package/dist/assets/{index.1b594a21.js → index.a5356d91.js} +1 -1
  162. package/dist/assets/{index.b67fb5fc.js → index.ab4e5ca3.js} +1 -1
  163. package/dist/assets/{index.f511aff3.js → index.ab7b6cba.js} +1 -1
  164. package/dist/assets/{index.578c30ec.js → index.ac6c3fe9.js} +1 -1
  165. package/dist/assets/{index.5062f951.js → index.adc560cb.js} +1 -1
  166. package/dist/assets/index.ae2066f9.js +26 -0
  167. package/dist/assets/{index.045e97f0.js → index.ae4bf6ea.js} +1 -1
  168. package/dist/assets/{index.9f69b190.js → index.aeaa0aa9.js} +1 -1
  169. package/dist/assets/{index.8b9e43f4.js → index.afc6b30e.js} +1 -1
  170. package/dist/assets/{index.23def130.js → index.b02dbd39.js} +1 -1
  171. package/dist/assets/{index.3cb24d7f.js → index.b391672d.js} +1 -1
  172. package/dist/assets/{index.19a506a0.js → index.b503f187.js} +1 -1
  173. package/dist/assets/{index.a88d2d0b.js → index.b7113e87.js} +1 -1
  174. package/dist/assets/{index.7bb84aa5.js → index.c156c46e.js} +1 -1
  175. package/dist/assets/{index.68337c85.js → index.c5e16ef6.js} +1 -1
  176. package/dist/assets/{index.45686201.js → index.c85c3f77.js} +1 -1
  177. package/dist/assets/{index.03886e4a.js → index.cb7799d1.js} +1 -1
  178. package/dist/assets/{index.eb4d5cbc.js → index.cb93c1e8.js} +1 -1
  179. package/dist/assets/index.cd3542f6.js +1 -0
  180. package/dist/assets/{index.dc4d9b6a.js → index.d0d998a0.js} +1 -1
  181. package/dist/assets/{index.c2858d95.js → index.d790d684.js} +1 -1
  182. package/dist/assets/{index.a264494d.js → index.dc9006a1.js} +1 -1
  183. package/dist/assets/{index.8130aabc.js → index.e3619b04.js} +1 -1
  184. package/dist/assets/{index.ab5ebdc3.js → index.e4224764.js} +1 -1
  185. package/dist/assets/{index.426d219b.js → index.e5079c3a.js} +1 -1
  186. package/dist/assets/{index.90ecf353.js → index.e6971ab1.js} +1 -1
  187. package/dist/assets/{index.b2e447e3.js → index.e85bc569.js} +1 -1
  188. package/dist/assets/{index.42614221.js → index.e95b7e4b.js} +1 -1
  189. package/dist/assets/{index.0608a502.js → index.ec8cfaac.js} +1 -1
  190. package/dist/assets/{index.b0e3c55c.js → index.f2e26d1f.js} +1 -1
  191. package/dist/assets/{index.eecb0d4b.js → index.f60d22d0.js} +1 -1
  192. package/dist/assets/{index.a8b94b31.js → index.f828781f.js} +1 -1
  193. package/dist/assets/{index.f047ba76.entry.js → index.f8fd6ee3.entry.js} +2691 -2690
  194. package/dist/assets/{index.2b61f9fb.js → index.fb6b1657.js} +1 -1
  195. package/dist/assets/{index.9c4a7f65.js → index.fb8023b0.js} +1 -1
  196. package/dist/assets/{index.79264a03.js → index.fe536421.js} +1 -1
  197. package/dist/assets/{input-rich-text-html.7e721a60.js → input-rich-text-html.1b13024b.js} +30 -30
  198. package/dist/assets/{insights.bb6e6dd9.js → insights.6190eebc.js} +2 -2
  199. package/dist/assets/{installation.a80b7bdd.js → installation.6e591be8.js} +1 -1
  200. package/dist/assets/{interface.6b3d318d.js → interface.5ec8ca7e.js} +1 -1
  201. package/dist/assets/{interfaces.9c9cb203.js → interfaces.81902e8c.js} +4 -4
  202. package/dist/assets/{introduction.23bcca02.js → introduction.15496522.js} +1 -1
  203. package/dist/assets/{introduction.17ce0958.js → introduction.2f7199ad.js} +4 -4
  204. package/dist/assets/{introduction.74d5f276.js → introduction.c61e67d2.js} +1 -1
  205. package/dist/assets/{introduction.2b473cdb.js → introduction.efd590eb.js} +1 -1
  206. package/dist/assets/{items.d9558b12.js → items.6012bbd1.js} +1 -1
  207. package/dist/assets/{items.a200a734.js → items.904356b8.js} +5 -5
  208. package/dist/assets/javascript-hint.199abe65.js +1 -0
  209. package/dist/assets/javascript.705102e7.js +1 -0
  210. package/dist/assets/jinja2.876b8944.js +1 -0
  211. package/dist/assets/jsx.b818cda0.js +1 -0
  212. package/dist/assets/julia.cfb3ddf7.js +1 -0
  213. package/dist/assets/{layouts.67e010c3.js → layouts.50df5631.js} +1 -1
  214. package/dist/assets/{layouts.71139077.js → layouts.befbdcf8.js} +3 -3
  215. package/dist/assets/livescript.c806b66f.js +1 -0
  216. package/dist/assets/lua.bc0ae13c.js +1 -0
  217. package/dist/assets/{manual.be26c257.js → manual.26a85d2d.js} +4 -4
  218. package/dist/assets/mark-selection.bae469e3.js +1 -0
  219. package/dist/assets/match-highlighter.91a1ef15.js +1 -0
  220. package/dist/assets/{matchbrackets.e0f8c83a.js → matchbrackets.7a78411c.js} +1 -1
  221. package/dist/assets/mathematica.d2affb5f.js +1 -0
  222. package/dist/assets/mbox.c5ac45db.js +1 -0
  223. package/dist/assets/{migrations.58c8fd96.js → migrations.ea7075a2.js} +1 -1
  224. package/dist/assets/mirc.56d52081.js +1 -0
  225. package/dist/assets/mllike.20808ac2.js +1 -0
  226. package/dist/assets/modelica.5b43a6c9.js +1 -0
  227. package/dist/assets/{modules.0cfbe882.js → modules.7d28228b.js} +3 -3
  228. package/dist/assets/mscgen.5e9e2653.js +1 -0
  229. package/dist/assets/multi-sig-data-access.ddc3e687.js +1 -0
  230. package/dist/assets/multiplex.db4b19a1.js +3 -0
  231. package/dist/assets/mumps.35d30d83.js +1 -0
  232. package/dist/assets/nginx.503d686c.js +1 -0
  233. package/dist/assets/nl-NL.586911c8.js +1 -0
  234. package/dist/assets/{notifications.7b442623.js → notifications.26a8e535.js} +11 -11
  235. package/dist/assets/nsis.94e55abf.js +1 -0
  236. package/dist/assets/ntriples.ed05a2ae.js +1 -0
  237. package/dist/assets/octave.2e3cb27d.js +1 -0
  238. package/dist/assets/{operations.bd173669.js → operations.470e68ea.js} +11 -11
  239. package/dist/assets/{operations.30bbad94.js → operations.bdd544da.js} +2 -2
  240. package/dist/assets/{operations.6fcceb98.js → operations.cdb45c4e.js} +3 -3
  241. package/dist/assets/overlay.3f3f0599.js +1 -0
  242. package/dist/assets/{overview.23ad824a.js → overview.2fc175dd.js} +1 -1
  243. package/dist/assets/{overview.4c1683c3.js → overview.8e4d2c9b.js} +1 -1
  244. package/dist/assets/{overview.cb1196c4.js → overview.eb4b9326.js} +1 -1
  245. package/dist/assets/oz.97cc1ac9.js +1 -0
  246. package/dist/assets/{panels.187b8f0d.js → panels.ca5d230c.js} +2 -2
  247. package/dist/assets/pascal.f8c86cda.js +1 -0
  248. package/dist/assets/pegjs.97bb1322.js +1 -0
  249. package/dist/assets/perl.d9a95eca.js +1 -0
  250. package/dist/assets/permissions.081923f1.js +1 -0
  251. package/dist/assets/{permissions.2ad2e118.js → permissions.a09bb478.js} +4 -4
  252. package/dist/assets/personal-portfolio-using-m2a.5e30e6cc.js +11 -0
  253. package/dist/assets/php.89c2f9f7.js +1 -0
  254. package/dist/assets/pig.46306f9f.js +1 -0
  255. package/dist/assets/{pinia.24c7b35a.entry.js → pinia.0d44ec62.entry.js} +2 -2
  256. package/dist/assets/{pl-PL.2863a1a1.js → pl-PL.01cf6aca.js} +1 -1
  257. package/dist/assets/{plesk.279941fc.js → plesk.297b28ec.js} +5 -5
  258. package/dist/assets/powershell.7f59ea0d.js +1 -0
  259. package/dist/assets/{presets-bookmarks.62ac9314.js → presets-bookmarks.d7ef4b82.js} +1 -1
  260. package/dist/assets/{presets.0390ff92.js → presets.4ea72a6c.js} +8 -8
  261. package/dist/assets/{project-settings.8b91aa04.js → project-settings.073c480f.js} +1 -1
  262. package/dist/assets/{projects.97bc15fa.js → projects.667d06ab.js} +1 -1
  263. package/dist/assets/properties.b2e9e7dd.js +1 -0
  264. package/dist/assets/protobuf.a57768d6.js +1 -0
  265. package/dist/assets/pt-BR.2c2e8c4f.js +1 -0
  266. package/dist/assets/pug.11a0bdc8.js +1 -0
  267. package/dist/assets/puppet.768fa863.js +1 -0
  268. package/dist/assets/python.8b6df896.js +1 -0
  269. package/dist/assets/q.f71e2fb3.js +1 -0
  270. package/dist/assets/{query.19ee7756.js → query.91f32b7a.js} +1 -1
  271. package/dist/assets/{quickstart.96d7fa17.js → quickstart.54f032fc.js} +3 -3
  272. package/dist/assets/{quickstart.7f55e26e.js → quickstart.6a82ef4b.js} +2 -2
  273. package/dist/assets/r.a9a4ca12.js +1 -0
  274. package/dist/assets/{readme.abb2691e.js → readme.84bd1090.js} +1 -1
  275. package/dist/assets/{relations.1409faa0.js → relations.c63ae4da.js} +6 -6
  276. package/dist/assets/{relationship.8e3bc45d.js → relationship.01468083.js} +1 -1
  277. package/dist/assets/{relationships.2449eed5.js → relationships.d7b51fda.js} +7 -7
  278. package/dist/assets/{resources.f9b64d6f.js → resources.f9cebdba.js} +1 -1
  279. package/dist/assets/{revisions.7ffa76fe.js → revisions.f2bf9393.js} +4 -4
  280. package/dist/assets/ro-RO.4c33f715.js +1 -0
  281. package/dist/assets/{roles.ce6518a4.js → roles.554cdf0e.js} +7 -7
  282. package/dist/assets/roles.b34bd4b0.js +1 -0
  283. package/dist/assets/rpm.e5811a72.js +1 -0
  284. package/dist/assets/rst.4b01b126.js +1 -0
  285. package/dist/assets/ruby.2ba33d98.js +1 -0
  286. package/dist/assets/{ruby.57265cfb.js → ruby.e8984a81.js} +1 -1
  287. package/dist/assets/{running-locally.8b135453.js → running-locally.d2e38f5e.js} +6 -6
  288. package/dist/assets/runtime-core.esm-bundler.22ec0346.js +1 -0
  289. package/dist/assets/rust.531e50f1.js +1 -0
  290. package/dist/assets/sas.48362a0b.js +1 -0
  291. package/dist/assets/sass.bf4a8b44.js +1 -0
  292. package/dist/assets/{schema.6649576e.js → schema.fefe36d2.js} +1 -1
  293. package/dist/assets/scheme.09b14856.js +1 -0
  294. package/dist/assets/{sdk.33dcc072.js → sdk.1c1b1a8b.js} +17 -17
  295. package/dist/assets/{security.acb2be94.js → security.59975f74.js} +1 -1
  296. package/dist/assets/{server.60bfa539.js → server.ef4017d1.js} +2 -2
  297. package/dist/assets/{settings.a00aa4fa.js → settings.1aa8422b.js} +1 -1
  298. package/dist/assets/{settings.6ac3895b.js → settings.574bbb58.js} +1 -1
  299. package/dist/assets/{shares.9a7ea736.js → shares.7727bd4c.js} +1 -1
  300. package/dist/assets/shell.d1dbda55.js +1 -0
  301. package/dist/assets/show-hint.57ea873d.js +1 -0
  302. package/dist/assets/sieve.1a25767a.js +1 -0
  303. package/dist/assets/slim.e018ac1a.js +1 -0
  304. package/dist/assets/slugify-text-with-run-script.7c3cc2c4.js +15 -0
  305. package/dist/assets/smalltalk.0ccfbb10.js +1 -0
  306. package/dist/assets/smarty.b91d67c6.js +1 -0
  307. package/dist/assets/solr.dd29f408.js +1 -0
  308. package/dist/assets/soy.4e5bb4c1.js +1 -0
  309. package/dist/assets/sparql.cc878993.js +1 -0
  310. package/dist/assets/spreadsheet.4aefd96f.js +1 -0
  311. package/dist/assets/sql.64eab1fa.js +1 -0
  312. package/dist/assets/{sso-examples.eb3ba478.js → sso-examples.873240f6.js} +2 -2
  313. package/dist/assets/{sso.29d67116.js → sso.1a6b3ff0.js} +4 -4
  314. package/dist/assets/stex.2fdfddd4.js +1 -0
  315. package/dist/assets/{stex.a70dfdc0.js → stex.d01c95b1.js} +1 -1
  316. package/dist/assets/stylus.6d056ddf.js +1 -0
  317. package/dist/assets/{support.e9e535b3.js → support.87c6b5f6.js} +1 -1
  318. package/dist/assets/swift.76d77aff.js +1 -0
  319. package/dist/assets/tcl.3d53e7a7.js +1 -0
  320. package/dist/assets/{teams.347f0563.js → teams.d555eea3.js} +1 -1
  321. package/dist/assets/template_shell.96150c63.js +1 -0
  322. package/dist/assets/textile.4fa0ef27.js +1 -0
  323. package/dist/assets/{themes.32a50b86.js → themes.3a8f5b79.js} +2 -2
  324. package/dist/assets/tiddlywiki.7c0678e2.js +1 -0
  325. package/dist/assets/tiki.63b47d4f.js +1 -0
  326. package/dist/assets/toml.687ac678.js +1 -0
  327. package/dist/assets/tornado.9caaed61.js +1 -0
  328. package/dist/assets/{translation-strings.285d6bb2.js → translation-strings.c2e90e96.js} +1 -1
  329. package/dist/assets/translations.c1633bc8.js +1 -0
  330. package/dist/assets/{translations.f87a601e.js → translations.d4671c3a.js} +1 -1
  331. package/dist/assets/{triggers.325e50d8.js → triggers.c58cde75.js} +1 -1
  332. package/dist/assets/troff.65641cfa.js +1 -0
  333. package/dist/assets/ttcn-cfg.66abf94b.js +1 -0
  334. package/dist/assets/ttcn.cdbdbc10.js +1 -0
  335. package/dist/assets/turtle.30f5acd6.js +1 -0
  336. package/dist/assets/twig.76882629.js +1 -0
  337. package/dist/assets/{ubuntu.3ba252fe.js → ubuntu.74c798e5.js} +2 -2
  338. package/dist/assets/uk-UA.fe247137.js +1 -0
  339. package/dist/assets/{upgrades-migrations.a091b8af.js → upgrades-migrations.73d4da9b.js} +1 -1
  340. package/dist/assets/{use-sync.d9160f34.js → use-sync.e83d9ab3.js} +3 -3
  341. package/dist/assets/{user-directory.9ca05985.js → user-directory.2ceb13ba.js} +1 -1
  342. package/dist/assets/{users-roles-permissions.bb71f6c9.js → users-roles-permissions.a3e2d048.js} +1 -1
  343. package/dist/assets/{users.a44125e3.js → users.5e316cce.js} +1 -1
  344. package/dist/assets/users.6e0f9ff9.js +1 -0
  345. package/dist/assets/{utilities.0380c496.js → utilities.3e4e57c9.js} +7 -7
  346. package/dist/assets/validation.5eb143cd.js +1 -0
  347. package/dist/assets/vb.6ca2d658.js +1 -0
  348. package/dist/assets/vbscript.c9f7cdd8.js +1 -0
  349. package/dist/assets/velocity.f8f37fc1.js +1 -0
  350. package/dist/assets/verilog.5cadf8f9.js +1 -0
  351. package/dist/assets/vhdl.46742c88.js +1 -0
  352. package/dist/assets/vi-VN.7f9cab4b.js +1 -0
  353. package/dist/assets/{vue-i18n.df8d89e7.entry.js → vue-i18n.fbc77449.entry.js} +1 -1
  354. package/dist/assets/vue-router.3a828e63.entry.js +5 -0
  355. package/dist/assets/vue.425bdf79.js +1 -0
  356. package/dist/assets/vue.486f3e62.entry.js +1 -0
  357. package/dist/assets/vue.runtime.esm-bundler.f6138180.js +1 -0
  358. package/dist/assets/wast.7b52bae5.js +1 -0
  359. package/dist/assets/{webhooks.40d9a7a3.js → webhooks.121861b0.js} +4 -4
  360. package/dist/assets/{webhooks.2d23be4c.js → webhooks.af8dfb63.js} +1 -1
  361. package/dist/assets/webidl.0a6cdd93.js +1 -0
  362. package/dist/assets/{xml.ea66d5f3.js → xml.8dec85cf.js} +1 -1
  363. package/dist/assets/xquery.c295ca3d.js +1 -0
  364. package/dist/assets/yacas.dca8e311.js +1 -0
  365. package/dist/assets/yaml-frontmatter.ccdcb23a.js +1 -0
  366. package/dist/assets/yaml.f22fdd75.js +1 -0
  367. package/dist/assets/z80.da8cf83c.js +1 -0
  368. package/dist/assets/zh-CN.6fd4ae3a.js +1 -0
  369. package/dist/index.html +8 -8
  370. package/package.json +58 -71
  371. package/dist/assets/@directus_extensions-sdk.fd0e4213.entry.js +0 -1
  372. package/dist/assets/active-line.9ef493aa.js +0 -1
  373. package/dist/assets/apl.80228b26.js +0 -1
  374. package/dist/assets/ar-SA.c5ee16de.js +0 -2
  375. package/dist/assets/asciiarmor.6c86ea34.js +0 -1
  376. package/dist/assets/asn.1.c414ac8d.js +0 -1
  377. package/dist/assets/asterisk.b919c017.js +0 -1
  378. package/dist/assets/autorefresh.4d24f530.js +0 -1
  379. package/dist/assets/brainfuck.31207812.js +0 -1
  380. package/dist/assets/clike.4381bb65.js +0 -1
  381. package/dist/assets/clike.70f54732.js +0 -1
  382. package/dist/assets/clojure.5e71b148.js +0 -1
  383. package/dist/assets/cmake.4292630d.js +0 -1
  384. package/dist/assets/cobol.0f026188.js +0 -1
  385. package/dist/assets/coffeescript.c9867ce1.js +0 -1
  386. package/dist/assets/commonlisp.575f73fb.js +0 -1
  387. package/dist/assets/crystal.c6b2e074.js +0 -1
  388. package/dist/assets/css.68e5f1b4.js +0 -1
  389. package/dist/assets/cypher.b9a2a2ff.js +0 -4
  390. package/dist/assets/d.29704d27.js +0 -1
  391. package/dist/assets/dart.3bc9103c.js +0 -1
  392. package/dist/assets/de-DE.1232afb9.js +0 -1
  393. package/dist/assets/diff.ed5ea48e.js +0 -1
  394. package/dist/assets/display.4a967445.js +0 -1
  395. package/dist/assets/django.a4f2e396.js +0 -1
  396. package/dist/assets/dockerfile.63d471ed.js +0 -1
  397. package/dist/assets/dtd.a3075452.js +0 -1
  398. package/dist/assets/dylan.f084efb3.js +0 -1
  399. package/dist/assets/ebnf.04f6993f.js +0 -1
  400. package/dist/assets/ecl.716928e4.js +0 -1
  401. package/dist/assets/eiffel.adac2439.js +0 -1
  402. package/dist/assets/el-GR.99b9567f.js +0 -1
  403. package/dist/assets/elm.79decf86.js +0 -1
  404. package/dist/assets/erlang.3a8664fd.js +0 -1
  405. package/dist/assets/es-MX.1c06907f.js +0 -1
  406. package/dist/assets/factor.5720b335.js +0 -1
  407. package/dist/assets/fcl.23169462.js +0 -1
  408. package/dist/assets/forth.0aa4b2af.js +0 -1
  409. package/dist/assets/fortran.2a5ba2e9.js +0 -1
  410. package/dist/assets/fr-FR.fa3f9dfa.js +0 -1
  411. package/dist/assets/gas.bb020a68.js +0 -1
  412. package/dist/assets/gfm.ab87931a.js +0 -1
  413. package/dist/assets/gherkin.14ad5708.js +0 -1
  414. package/dist/assets/go.db54967b.js +0 -1
  415. package/dist/assets/groovy.70142c17.js +0 -1
  416. package/dist/assets/haml.48d17fa5.js +0 -1
  417. package/dist/assets/handlebars.99f3b281.js +0 -1
  418. package/dist/assets/haskell-literate.dd8055d7.js +0 -1
  419. package/dist/assets/haskell.5163bc39.js +0 -1
  420. package/dist/assets/haxe.c37e45b0.js +0 -1
  421. package/dist/assets/htmlembedded.259e134c.js +0 -1
  422. package/dist/assets/htmlmixed.d4ccede2.js +0 -1
  423. package/dist/assets/http.c2a41932.js +0 -1
  424. package/dist/assets/hu-HU.b086156a.js +0 -1
  425. package/dist/assets/id-ID.30858185.js +0 -1
  426. package/dist/assets/idl.756f9381.js +0 -1
  427. package/dist/assets/index.4ce1e26c.js +0 -1
  428. package/dist/assets/index.90515a60.css +0 -1
  429. package/dist/assets/index.a36c94c4.js +0 -1
  430. package/dist/assets/index.c781a7ba.js +0 -26
  431. package/dist/assets/javascript-hint.edf0fbfe.js +0 -1
  432. package/dist/assets/javascript.3f76a939.js +0 -1
  433. package/dist/assets/jinja2.5ece3da1.js +0 -1
  434. package/dist/assets/jsx.bf843278.js +0 -1
  435. package/dist/assets/julia.3deacccb.js +0 -1
  436. package/dist/assets/livescript.0f4ee94d.js +0 -1
  437. package/dist/assets/lua.55a0ef58.js +0 -1
  438. package/dist/assets/mark-selection.c61be770.js +0 -1
  439. package/dist/assets/match-highlighter.653539e4.js +0 -1
  440. package/dist/assets/mathematica.581f102c.js +0 -1
  441. package/dist/assets/mbox.b8d42368.js +0 -1
  442. package/dist/assets/mirc.54d6f3dc.js +0 -1
  443. package/dist/assets/mllike.3fea0214.js +0 -1
  444. package/dist/assets/modelica.e91f192a.js +0 -1
  445. package/dist/assets/mscgen.26838643.js +0 -1
  446. package/dist/assets/multiplex.93cf07bd.js +0 -3
  447. package/dist/assets/mumps.47e48202.js +0 -1
  448. package/dist/assets/nginx.87019c99.js +0 -1
  449. package/dist/assets/nl-NL.277f5ed5.js +0 -1
  450. package/dist/assets/nsis.fafee21f.js +0 -1
  451. package/dist/assets/ntriples.a43258b6.js +0 -1
  452. package/dist/assets/octave.1f682cef.js +0 -1
  453. package/dist/assets/overlay.a2442f5e.js +0 -1
  454. package/dist/assets/oz.62b729b0.js +0 -1
  455. package/dist/assets/pascal.0fa9599a.js +0 -1
  456. package/dist/assets/pegjs.32083f8f.js +0 -1
  457. package/dist/assets/perl.5a777d8c.js +0 -1
  458. package/dist/assets/php.c6ab96f7.js +0 -1
  459. package/dist/assets/pig.2c7c4277.js +0 -1
  460. package/dist/assets/powershell.e6b0a933.js +0 -1
  461. package/dist/assets/properties.35c2d705.js +0 -1
  462. package/dist/assets/protobuf.625d3a47.js +0 -1
  463. package/dist/assets/pt-BR.c51763f3.js +0 -1
  464. package/dist/assets/pug.da3530b5.js +0 -1
  465. package/dist/assets/puppet.655afe2c.js +0 -1
  466. package/dist/assets/python.a67d678a.js +0 -1
  467. package/dist/assets/q.cc56fcdd.js +0 -1
  468. package/dist/assets/r.c1bddb02.js +0 -1
  469. package/dist/assets/ro-RO.52802a17.js +0 -1
  470. package/dist/assets/rpm.e046de56.js +0 -1
  471. package/dist/assets/rst.424d4d80.js +0 -1
  472. package/dist/assets/ruby.c0348dbc.js +0 -1
  473. package/dist/assets/runtime-core.esm-bundler.fe249c5c.js +0 -4
  474. package/dist/assets/rust.b8eab4c6.js +0 -1
  475. package/dist/assets/sas.171b5cec.js +0 -1
  476. package/dist/assets/sass.ef1df49e.js +0 -1
  477. package/dist/assets/scheme.96f6ce73.js +0 -1
  478. package/dist/assets/shell.4c172f18.js +0 -1
  479. package/dist/assets/show-hint.e95ab391.js +0 -1
  480. package/dist/assets/sieve.bdcdd5e1.js +0 -1
  481. package/dist/assets/slim.bab26569.js +0 -1
  482. package/dist/assets/smalltalk.0234383f.js +0 -1
  483. package/dist/assets/smarty.d8aca261.js +0 -1
  484. package/dist/assets/solr.d8e27de0.js +0 -1
  485. package/dist/assets/soy.06b4848e.js +0 -1
  486. package/dist/assets/sparql.ef7b1e37.js +0 -1
  487. package/dist/assets/spreadsheet.0d9dfaef.js +0 -1
  488. package/dist/assets/sql.85f5cd30.js +0 -1
  489. package/dist/assets/stex.38cc6e30.js +0 -1
  490. package/dist/assets/stylus.4d43a0f9.js +0 -1
  491. package/dist/assets/swift.e665f92b.js +0 -1
  492. package/dist/assets/tcl.4f846188.js +0 -1
  493. package/dist/assets/textile.eef6bf65.js +0 -1
  494. package/dist/assets/tiddlywiki.29dce321.js +0 -1
  495. package/dist/assets/tiki.a2f71a50.js +0 -1
  496. package/dist/assets/toml.64d737ee.js +0 -1
  497. package/dist/assets/tornado.5ebb7f6b.js +0 -1
  498. package/dist/assets/translations.074feb87.js +0 -1
  499. package/dist/assets/troff.e64b5292.js +0 -1
  500. package/dist/assets/ttcn-cfg.1b57714e.js +0 -1
  501. package/dist/assets/ttcn.3ddce744.js +0 -1
  502. package/dist/assets/turtle.0839041f.js +0 -1
  503. package/dist/assets/twig.99a62381.js +0 -1
  504. package/dist/assets/uk-UA.99a7a7a6.js +0 -1
  505. package/dist/assets/validation.cb080608.js +0 -1
  506. package/dist/assets/vb.9a802cc7.js +0 -1
  507. package/dist/assets/vbscript.c3cbffdb.js +0 -1
  508. package/dist/assets/velocity.a1b7e170.js +0 -1
  509. package/dist/assets/verilog.d98a6823.js +0 -1
  510. package/dist/assets/vhdl.6a93f1eb.js +0 -1
  511. package/dist/assets/vi-VN.b85c8a24.js +0 -1
  512. package/dist/assets/vue-router.805cb517.entry.js +0 -5
  513. package/dist/assets/vue.c7dd8317.entry.js +0 -1
  514. package/dist/assets/vue.f82ff76a.js +0 -1
  515. package/dist/assets/vue.runtime.esm-bundler.eb605ed6.js +0 -1
  516. package/dist/assets/wast.2c3ec473.js +0 -1
  517. package/dist/assets/webidl.49c5abd3.js +0 -1
  518. package/dist/assets/xquery.a0c67ec5.js +0 -1
  519. package/dist/assets/yacas.d6cc38c0.js +0 -1
  520. package/dist/assets/yaml-frontmatter.f078c218.js +0 -1
  521. package/dist/assets/yaml.2ae1a5ef.js +0 -1
  522. package/dist/assets/z80.fc28354f.js +0 -1
  523. package/dist/assets/zh-CN.a9e8d795.js +0 -1
@@ -1,4 +1,4 @@
1
- import{a as r,o as c,b as u,w as t,l as e,E as o,e as l}from"./runtime-core.esm-bundler.fe249c5c.js";const d={class:"markdown-body"},h=e("p",null,[o("While there are many different ways to run Directus on GCP, from single "),e("a",{href:"https://cloud.google.com/compute",target:"_blank",rel:"noopener noreferrer"},"Compute Engine"),o(" instances to a full "),e("a",{href:"https://cloud.google.com/kubernetes-engine",target:"_blank",rel:"noopener noreferrer"},"Kubernetes Engine"),o(" stack, we like the following combination of services:")],-1),p=e("ul",null,[e("li",null,[e("a",{href:"https://cloud.google.com/run",target:"_blank",rel:"noopener noreferrer"},"Google Cloud Run")]),e("li",null,[e("a",{href:"https://cloud.google.com/sql",target:"_blank",rel:"noopener noreferrer"},"Google Cloud SQL")]),e("li",null,[e("a",{href:"https://cloud.google.com/storage",target:"_blank",rel:"noopener noreferrer"},"Google Cloud Storage")])],-1),g=e("h2",{id:"google-cloud-run",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#google-cloud-run"},"#"),o(" Google Cloud Run")],-1),_=e("p",null,"We will run Directus in an autoscaling managed container environment called Google Cloud Run. Google Cloud Run will scale back to zero instances by default but can be configured to meet every scalability requirements.",-1),m=e("p",null,[o("While there a numerous ways to get a Docker container up and running in Cloud Run, we will talk you through a simple setup with still a lot of improvements to be made. The section "),e("a",{href:"#additional-improvements"},"Additional improvements"),o(" stipulates additional improvements you can make to your setup.")],-1),f=e("h2",{id:"google-cloud-sql",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#google-cloud-sql"},"#"),o(" Google Cloud SQL")],-1),y=e("p",null,"Fully managed relational database service for MySQL, PostgreSQL, and SQL Server. This will be the persistent database layer. In this guide we will use PostgreSQL.",-1),b=e("h2",{id:"google-cloud-storage",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#google-cloud-storage"},"#"),o(" Google Cloud Storage")],-1),w=e("p",null,"Will be used as object/file storage. Since we\u2019re running Directus in Google Cloud, it\u2019ll be authenticated and authorized to access all storage buckets in the same Google Cloud project by default. We just need to set it up in the environment variables.",-1),k=e("h2",{id:"cost",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#cost"},"#"),o(" Cost")],-1),C=e("p",null,[o("Running Directus in Google Cloud can and will infer costs. Please read and understand all pricing options per service before rolling out Directus on Google Cloud. As a rule of thumb you could say that with the setup written here the main costs come from a persistent Postgres in CloudSQL. You can estimate the pricing here: "),e("a",{href:"https://cloud.google.com/products/calculator",target:"_blank",rel:"noopener noreferrer"},"https://cloud.google.com/products/calculator")],-1),S=e("h2",{id:"cloud-run-click-to-deploy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#cloud-run-click-to-deploy"},"#"),o(" Cloud Run click to deploy")],-1),v=e("p",null,"Just to see Directus work on Google Cloud you can try it out by clicking this button. Keep in mind, this will use a non persistent SQLite database inside the container itself, so everything will be lost once the container shuts down. And it will shut down.",-1),G=e("p",null,[e("a",{href:"https://deploy.cloud.run/?git_repo=https://github.com/directus-community/gcp-example",target:"_blank",rel:"noopener noreferrer"},[e("img",{src:"https://deploy.cloud.run/button.svg",alt:"Run on Google Cloud"})])],-1),D=e("p",null,[o("After deploying you can login with "),e("code",null,"admin@example.com"),o(" and "),e("code",null,"localpassword")],-1),R=e("h2",{id:"walkthrough-complete-setup",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#walkthrough-complete-setup"},"#"),o(" Walkthrough complete setup")],-1),E=e("p",null,"Let\u2019s get into it.",-1),A=e("li",null,[e("p",null,[o("Install the "),e("a",{href:"https://cloud.google.com/sdk/docs/install",target:"_blank",rel:"noopener noreferrer"},"Google Cloud SDK"),o(". We will run a lot of "),e("code",null,"gcloud"),o(" commands to get your GCP environment setup.")])],-1),T=e("li",null,[e("p",null,"Add a start script to your package.json like so:")],-1),j=e("pre",null,[e("code",null,`"scripts": {
1
+ import{a as r,o as c,e as u,y as t,u as e,q as o,z as l}from"./runtime-core.esm-bundler.22ec0346.js";const d={class:"markdown-body"},h=e("p",null,[o("While there are many different ways to run Directus on GCP, from single "),e("a",{href:"https://cloud.google.com/compute",target:"_blank",rel:"noopener noreferrer"},"Compute Engine"),o(" instances to a full "),e("a",{href:"https://cloud.google.com/kubernetes-engine",target:"_blank",rel:"noopener noreferrer"},"Kubernetes Engine"),o(" stack, we like the following combination of services:")],-1),p=e("ul",null,[e("li",null,[e("a",{href:"https://cloud.google.com/run",target:"_blank",rel:"noopener noreferrer"},"Google Cloud Run")]),e("li",null,[e("a",{href:"https://cloud.google.com/sql",target:"_blank",rel:"noopener noreferrer"},"Google Cloud SQL")]),e("li",null,[e("a",{href:"https://cloud.google.com/storage",target:"_blank",rel:"noopener noreferrer"},"Google Cloud Storage")])],-1),g=e("h2",{id:"google-cloud-run",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#google-cloud-run"},"#"),o(" Google Cloud Run")],-1),_=e("p",null,"We will run Directus in an autoscaling managed container environment called Google Cloud Run. Google Cloud Run will scale back to zero instances by default but can be configured to meet every scalability requirements.",-1),m=e("p",null,[o("While there a numerous ways to get a Docker container up and running in Cloud Run, we will talk you through a simple setup with still a lot of improvements to be made. The section "),e("a",{href:"#additional-improvements"},"Additional improvements"),o(" stipulates additional improvements you can make to your setup.")],-1),f=e("h2",{id:"google-cloud-sql",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#google-cloud-sql"},"#"),o(" Google Cloud SQL")],-1),y=e("p",null,"Fully managed relational database service for MySQL, PostgreSQL, and SQL Server. This will be the persistent database layer. In this guide we will use PostgreSQL.",-1),b=e("h2",{id:"google-cloud-storage",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#google-cloud-storage"},"#"),o(" Google Cloud Storage")],-1),w=e("p",null,"Will be used as object/file storage. Since we\u2019re running Directus in Google Cloud, it\u2019ll be authenticated and authorized to access all storage buckets in the same Google Cloud project by default. We just need to set it up in the environment variables.",-1),k=e("h2",{id:"cost",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#cost"},"#"),o(" Cost")],-1),C=e("p",null,[o("Running Directus in Google Cloud can and will infer costs. Please read and understand all pricing options per service before rolling out Directus on Google Cloud. As a rule of thumb you could say that with the setup written here the main costs come from a persistent Postgres in CloudSQL. You can estimate the pricing here: "),e("a",{href:"https://cloud.google.com/products/calculator",target:"_blank",rel:"noopener noreferrer"},"https://cloud.google.com/products/calculator")],-1),S=e("h2",{id:"cloud-run-click-to-deploy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#cloud-run-click-to-deploy"},"#"),o(" Cloud Run click to deploy")],-1),v=e("p",null,"Just to see Directus work on Google Cloud you can try it out by clicking this button. Keep in mind, this will use a non persistent SQLite database inside the container itself, so everything will be lost once the container shuts down. And it will shut down.",-1),G=e("p",null,[e("a",{href:"https://deploy.cloud.run/?git_repo=https://github.com/directus-community/gcp-example",target:"_blank",rel:"noopener noreferrer"},[e("img",{src:"https://deploy.cloud.run/button.svg",alt:"Run on Google Cloud"})])],-1),D=e("p",null,[o("After deploying you can login with "),e("code",null,"admin@example.com"),o(" and "),e("code",null,"localpassword")],-1),R=e("h2",{id:"walkthrough-complete-setup",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#walkthrough-complete-setup"},"#"),o(" Walkthrough complete setup")],-1),E=e("p",null,"Let\u2019s get into it.",-1),A=e("li",null,[e("p",null,[o("Install the "),e("a",{href:"https://cloud.google.com/sdk/docs/install",target:"_blank",rel:"noopener noreferrer"},"Google Cloud SDK"),o(". We will run a lot of "),e("code",null,"gcloud"),o(" commands to get your GCP environment setup.")])],-1),T=e("li",null,[e("p",null,"Add a start script to your package.json like so:")],-1),j=e("pre",null,[e("code",null,`"scripts": {
2
2
  "start": "npx directus bootstrap; npx directus start"
3
3
  }
4
4
  `)],-1),L=e("ol",{start:"4"},[e("li",null,[o("Add a new "),e("code",null,"Dockerfile"),o(" file to the root of your newly setup Directus folder and add these contents")])],-1),x=e("pre",null,[e("code",null,`FROM node:16-alpine
@@ -11,14 +11,14 @@ RUN npm install --production
11
11
 
12
12
  CMD ["npm", "run", "start"]
13
13
  `)],-1),I=e("ol",{start:"5"},[e("li",null,[e("p",null,[o("Create a new project in "),e("a",{href:"https://cloud.google.com/resource-manager/docs/creating-managing-projects#creating_a_project",target:"_blank",rel:"noopener noreferrer"},"Google Cloud"),o(": "),e("code",null,"gcloud projects create <your-project-id>"),o(" and make sure "),e("code",null,"your-project-id"),o(" is globally unique. Write down this ID as it will be used in all subsequent gcloud commands.")])]),e("li",null,[e("p",null,[o("Add/link a billing account/details to your project by going here: "),e("code",null,"https://console.cloud.google.com/billing/linkedaccount?project=<your-project-id>"),o(". Since the database and storage bucket are persistent, there are (costs)[#cost] involved.")])]),e("li",null,[e("p",null,"Create a storage bucket where Directus will store files:")])],-1),P=e("pre",null,[e("code",null,`gsutil mb -p <your-project-id> -c standard -l europe-west4 gs://<unique-bucket-name>/
14
- `)],-1),O=e("p",null,"Some notes:",-1),q=e("ul",null,[e("li",null,"The region (europe-west4) is the region where the bucket resides. It\u2019s a good idea, sometimes even mandatory, to set all services to the same region."),e("li",null,"The bucket name should be globally unique")],-1),N=e("ol",{start:"8"},[e("li",null,"Create a Postgres13 database:")],-1),B=e("pre",null,[e("code",null,`gcloud sql instances create <database-instance-name> --region=europe-west4 --tier=db-f1-micro --project=<your-project-id> --database-version=POSTGRES_13
14
+ `)],-1),q=e("p",null,"Some notes:",-1),O=e("ul",null,[e("li",null,"The region (europe-west4) is the region where the bucket resides. It\u2019s a good idea, sometimes even mandatory, to set all services to the same region."),e("li",null,"The bucket name should be globally unique")],-1),N=e("ol",{start:"8"},[e("li",null,"Create a Postgres13 database:")],-1),B=e("pre",null,[e("code",null,`gcloud sql instances create <database-instance-name> --region=europe-west4 --tier=db-f1-micro --project=<your-project-id> --database-version=POSTGRES_13
15
15
  `)],-1),M=e("p",null,"Some notes:",-1),W=e("ul",null,[e("li",null,"The region (europe-west4) is the region where the database resides. It\u2019s a good idea, sometimes even mandatory, to set all services to the same region."),e("li",null,[o("The "),e("a",{href:"https://cloud.google.com/sql/docs/postgres/instance-settings",target:"_blank",rel:"noopener noreferrer"},"tier"),o(" determines resources and cost of the database. For this example we\u2019ve picked the smallest one.")]),e("li",null,[o("This operation will take a while. If, for some reason, the gcloud times out, you can still find your database instance and its status "),e("a",{href:"https://console.cloud.google.com/sql/instances",target:"_blank",rel:"noopener noreferrer"},"here"),o(".")])],-1),Q=e("p",null,"The output will look something like this:",-1),U=e("pre",null,[e("code",null,`Creating Cloud SQL instance...done.
16
16
  Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/your-project-id/instances/your-project-id-pg13].
17
17
  NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS
18
18
  your-project-id-pg13 POSTGRES_13 europe-west4-b db-f1-micro 123.456.789.0 - RUNNABLE
19
19
  `)],-1),Y=e("p",null,[o("Write down the IP address (in this example "),e("code",null,"123.456.789.0"),o("), you\u2019ll need to set it in your "),e("code",null,".env"),o(" later")],-1),V=e("ol",{start:"9"},[e("li",null,"Set the root user password in your database:")],-1),K=e("pre",null,[e("code",null,`gcloud sql users set-password root --host=% --instance <database-instance-name> --password <your-safe-root-password> --project=<your-project-id>
20
- `)],-1),H=e("ol",{start:"10"},[e("li",null,"Create the directus database:")],-1),F=e("pre",null,[e("code",null,`gcloud sql databases create directus --instance=<database-instance-name> --project=<your-project-id>
21
- `)],-1),z=e("p",null,[o("In this example the database is called "),e("code",null,"directus")],-1),J=e("ol",{start:"11"},[e("li",null,"Get the connection name of your CloudSQL instance:")],-1),X=e("pre",null,[e("code",null,`gcloud sql instances describe <database-instance-name> --project=<your-project-id>
20
+ `)],-1),H=e("ol",{start:"10"},[e("li",null,"Create the directus database:")],-1),z=e("pre",null,[e("code",null,`gcloud sql databases create directus --instance=<database-instance-name> --project=<your-project-id>
21
+ `)],-1),F=e("p",null,[o("In this example the database is called "),e("code",null,"directus")],-1),J=e("ol",{start:"11"},[e("li",null,"Get the connection name of your CloudSQL instance:")],-1),X=e("pre",null,[e("code",null,`gcloud sql instances describe <database-instance-name> --project=<your-project-id>
22
22
  `)],-1),Z=e("p",null,[o("You will need the value of "),e("code",null,"connectionName"),o(" in step 12 and 14.")],-1),$=e("ol",{start:"12"},[e("li",null,[o("Add these items to your "),e("code",null,".env"),o(" file:")])],-1),ee=e("pre",null,[e("code",null,`DB_CLIENT="pg"
23
23
  DB_PORT="5432"
24
24
  DB_DATABASE=directus
@@ -57,4 +57,4 @@ docker push eu.gcr.io/<your-project-id>/directus
57
57
  --platform "managed" \\
58
58
  --allow-unauthenticated \\
59
59
  --add-cloudsql-instances "<database-connection-name-from-step11>"
60
- `)],-1),ie=e("p",null,[o("Note: the value of "),e("code",null,"connectionName"),o(" from step 11 should be used as the value of "),e("code",null,"add-cloudsql-instances"),o(" without any prefix.")],-1),ce=e("ol",{start:"15"},[e("li",null,[o("Done! The deploy command should\u2019ve told you the URL where you can access your Directus instance. You can login with "),e("code",null,"admin@example.com"),o(" and "),e("code",null,"localpassword"),o(".")])],-1),ue=e("h2",{id:"additional-improvements",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#additional-improvements"},"#"),o(" Additional improvements")],-1),de=e("li",null,[o("You should make your CloudSQL instance only accessible through a private IP and VPC connector. This way only your current cloud project is able to access the database. More on this "),e("a",{href:"https://cloud.google.com/sql/docs/postgres/connect-run#private-ip",target:"_blank",rel:"noopener noreferrer"},"here"),o(".")],-1),he=e("li",null,[o("You should not store your "),e("code",null,".env"),o(" file locally and build it into your Dockerfile. Ideally you should save your "),e("code",null,".env"),o(" file in "),e("a",{href:"https://cloud.google.com/secret-manager",target:"_blank",rel:"noopener noreferrer"},"Google Cloud Secret Manager"),o(" and in your CI/CD pipeline retrieve it and add it to your container. Or, even better, let the container pick the "),e("code",null,".env"),o(" up at runtime from Google Secret Manager.")],-1),pe=e("li",null,[o("Cloud Run typically allocates resources in a request context. Meaning async hooks etc will get drastically less CPU and memory, often even resulting in those processes not completing. You have two options: "),e("a",{href:"https://cloud.google.com/run/docs/configuring/cpu-allocation",target:"_blank",rel:"noopener noreferrer"},"CPU allocation"),o(" that is always allocated (which will increase cost) or handle everything in your extensions synchronously.")],-1),ge=e("a",{href:"https://cloud.google.com/memorystore/docs/redis",target:"_blank",rel:"noopener noreferrer"},"Memorystore for Redis",-1),_e=e("a",{href:"https://cloud.google.com/scheduler",target:"_blank",rel:"noopener noreferrer"},"Cloud Scheduler",-1),we="Google Cloud Platform",ke=!1,Ce="How to host Directus on Google Cloud Platform.",Se="6 min read",ve={__name:"gcp",setup(me,{expose:a}){const s={title:"Google Cloud Platform",modularExtension:!1,description:"How to host Directus on Google Cloud Platform.",readTime:"6 min read"};return a({frontmatter:s}),(fe,ye)=>{const n=r("router-link"),i=r("docs-wrapper");return c(),u(i,{frontmatter:s},{default:t(()=>[e("div",d,[h,p,g,_,m,f,y,b,w,k,C,S,v,G,D,R,E,e("ol",null,[A,e("li",null,[e("p",null,[o("Go over the steps for "),l(n,{to:"/docs/self-hosted/installation/manual"},{default:t(()=>[o("Manually installing Directus")]),_:1})])]),T]),j,L,x,I,P,O,q,N,B,M,W,Q,U,Y,V,K,H,F,z,J,X,Z,$,ee,oe,te,ne,le,se,re,ae,ie,ce,ue,e("ul",null,[de,he,pe,e("li",null,[o("You could setup "),l(n,{to:"/docs/self-hosted/config-options#cache"},{default:t(()=>[o("caching")]),_:1}),o(" using "),ge]),e("li",null,[o("Since, by default, Google Cloud Run will scale back to zero instances of the container, it\u2019s impossible to use the "),l(n,{to:"/docs/extensions/hooks#schedule"},{default:t(()=>[o("Schedule hooks")]),_:1}),o(" since there is no container to handle those schedules / cron jobs. Again you have two options: Set the minimum number of instances to 1, this will definitely increase cost as at least 1 container keeps on running 24/7. Or you could use "),_e,o(" to schedule calls to custom endpoints which will do the tasks.")])])])]),_:1})}}};export{ve as default,Ce as description,ke as modularExtension,Se as readTime,we as title};
60
+ `)],-1),ie=e("p",null,[o("Note: the value of "),e("code",null,"connectionName"),o(" from step 11 should be used as the value of "),e("code",null,"add-cloudsql-instances"),o(" without any prefix.")],-1),ce=e("ol",{start:"15"},[e("li",null,[o("Done! The deploy command should\u2019ve told you the URL where you can access your Directus instance. You can login with "),e("code",null,"admin@example.com"),o(" and "),e("code",null,"localpassword"),o(".")])],-1),ue=e("h2",{id:"additional-improvements",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#additional-improvements"},"#"),o(" Additional improvements")],-1),de=e("li",null,[o("You should make your CloudSQL instance only accessible through a private IP and VPC connector. This way only your current cloud project is able to access the database. More on this "),e("a",{href:"https://cloud.google.com/sql/docs/postgres/connect-run#private-ip",target:"_blank",rel:"noopener noreferrer"},"here"),o(".")],-1),he=e("li",null,[o("You should not store your "),e("code",null,".env"),o(" file locally and build it into your Dockerfile. Ideally you should save your "),e("code",null,".env"),o(" file in "),e("a",{href:"https://cloud.google.com/secret-manager",target:"_blank",rel:"noopener noreferrer"},"Google Cloud Secret Manager"),o(" and in your CI/CD pipeline retrieve it and add it to your container. Or, even better, let the container pick the "),e("code",null,".env"),o(" up at runtime from Google Secret Manager.")],-1),pe=e("li",null,[o("Cloud Run typically allocates resources in a request context. Meaning async hooks etc will get drastically less CPU and memory, often even resulting in those processes not completing. You have two options: "),e("a",{href:"https://cloud.google.com/run/docs/configuring/cpu-allocation",target:"_blank",rel:"noopener noreferrer"},"CPU allocation"),o(" that is always allocated (which will increase cost) or handle everything in your extensions synchronously.")],-1),ge=e("a",{href:"https://cloud.google.com/memorystore/docs/redis",target:"_blank",rel:"noopener noreferrer"},"Memorystore for Redis",-1),_e=e("a",{href:"https://cloud.google.com/scheduler",target:"_blank",rel:"noopener noreferrer"},"Cloud Scheduler",-1),we="Google Cloud Platform",ke=!1,Ce="How to host Directus on Google Cloud Platform.",Se="6 min read",ve={__name:"gcp",setup(me,{expose:a}){const s={title:"Google Cloud Platform",modularExtension:!1,description:"How to host Directus on Google Cloud Platform.",readTime:"6 min read"};return a({frontmatter:s}),(fe,ye)=>{const n=r("router-link"),i=r("docs-wrapper");return c(),u(i,{frontmatter:s},{default:t(()=>[e("div",d,[h,p,g,_,m,f,y,b,w,k,C,S,v,G,D,R,E,e("ol",null,[A,e("li",null,[e("p",null,[o("Go over the steps for "),l(n,{to:"/docs/self-hosted/installation/manual"},{default:t(()=>[o("Manually installing Directus")]),_:1})])]),T]),j,L,x,I,P,q,O,N,B,M,W,Q,U,Y,V,K,H,z,F,J,X,Z,$,ee,oe,te,ne,le,se,re,ae,ie,ce,ue,e("ul",null,[de,he,pe,e("li",null,[o("You could setup "),l(n,{to:"/docs/self-hosted/config-options#cache"},{default:t(()=>[o("caching")]),_:1}),o(" using "),ge]),e("li",null,[o("Since, by default, Google Cloud Run will scale back to zero instances of the container, it\u2019s impossible to use the "),l(n,{to:"/docs/extensions/hooks#schedule"},{default:t(()=>[o("Schedule hooks")]),_:1}),o(" since there is no container to handle those schedules / cron jobs. Again you have two options: Set the minimum number of instances to 1, this will definitely increase cost as at least 1 container keeps on running 24/7. Or you could use "),_e,o(" to schedule calls to custom endpoints which will do the tasks.")])])])]),_:1})}}};export{ve as default,Ce as description,ke as modularExtension,Se as readTime,we as title};
@@ -0,0 +1 @@
1
+ import{a as r,o as i,e as d,y as u,u as e,t as n,q as t}from"./runtime-core.esm-bundler.22ec0346.js";const c={class:"markdown-body"},h={class:"tip hint"},p={class:"hint-title"},_=e("strong",null,"Directus Version:",-1),f=e("h2",{id:"explanation",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#explanation"},"#"),t(" Explanation")],-1),m=e("h2",{id:"the-recipe",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#the-recipe"},"#"),t(" The Recipe")],-1),g=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Requirements"),e("p",null,"You\u2019ll need something to validate against.")],-1),v=e("video",{autoplay:"",playsinline:"",muted:"",loop:"",controls:""},[e("source",{src:"",type:"video/mp4"})],-1),k=e("h3",{id:"get-stakeholders",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#get-stakeholders"},"#"),t(" Get Stakeholders")],-1),w=e("ul",null,[e("li",null,"cron job"),e("li",null,[t("read data "),e("ul",null,[e("li",null,"Get relevant authors/managers/etc.")])]),e("li",null,[t("trigger flow "),e("ul",null,[e("li",null,"pass array of users/stakeholders into payload")])])],-1),x=e("h3",{id:"generate-and-send-report",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#generate-and-send-report"},"#"),t(" Generate and Send Report")],-1),y=e("ul",null,[e("li",null,"another flow: for user in user_list"),e("li",null,[t("read data "),e("ul",null,[e("li",null,"get data/content using a query"),e("li",null,"get authors and managers"),e("li",null,"send data")])]),e("li",null,[t("run script (optional) "),e("ul",null,[e("li",null,"format data for report")])]),e("li",null,[t("email or notification "),e("ul",null,[e("li",null,"send to managers or stakeholders")])])],-1),b=e("h2",{id:"final-tips",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#final-tips"},"#"),t(" Final Tips")],-1),T="Generate Work Reports",q=!1,D="This recipe outlines a method to generate reports using Directus Flows.",B=[],F=null,S="9.18.1",V=null,$="Eron Powell",C={__name:"generate-work-reports",setup(E,{expose:s}){const l={title:"Generate Work Reports",modularExtension:!1,description:"This recipe outlines a method to generate reports using Directus Flows.",tags:[],skill_level:null,directus_version:"9.18.1",author_override:null,author:"Eron Powell"};return s({frontmatter:l}),(o,G)=>{const a=r("docs-wrapper");return i(),d(a,{frontmatter:l},{default:u(()=>[e("div",c,[e("blockquote",null,[e("p",null,n(o.$frontmatter.description),1)]),e("div",h,[e("div",p,"Author: "+n(o.$frontmatter.author),1),e("p",null,[_,t(" "+n(o.$frontmatter.directus_version),1)])]),f,m,g,v,k,w,x,y,b])]),_:1})}}};export{$ as author,V as author_override,C as default,D as description,S as directus_version,q as modularExtension,F as skill_level,B as tags,T as title};
@@ -0,0 +1 @@
1
+ import{z as k,C as b}from"./index.f8fd6ee3.entry.js";import{r as v}from"./overlay.3f3f0599.js";function h(a,c){for(var t=0;t<c.length;t++){const o=c[t];if(typeof o!="string"&&!Array.isArray(o)){for(const i in o)if(i!=="default"&&!(i in a)){const r=Object.getOwnPropertyDescriptor(o,i);r&&Object.defineProperty(a,i,r.get?r:{enumerable:!0,get:()=>o[i]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}var u={exports:{}};(function(a,c){(function(t){t(k.exports,b.exports,v())})(function(t){var o=/^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i;t.defineMode("gfm",function(i,r){var p=0;function d(e){return e.code=!1,null}var m={startState:function(){return{code:!1,codeBlock:!1,ateSpace:!1}},copyState:function(e){return{code:e.code,codeBlock:e.codeBlock,ateSpace:e.ateSpace}},token:function(e,n){if(n.combineTokens=null,n.codeBlock)return e.match(/^```+/)?(n.codeBlock=!1,null):(e.skipToEnd(),null);if(e.sol()&&(n.code=!1),e.sol()&&e.match(/^```+/))return e.skipToEnd(),n.codeBlock=!0,null;if(e.peek()==="`"){e.next();var g=e.pos;e.eatWhile("`");var f=1+e.pos-g;return n.code?f===p&&(n.code=!1):(p=f,n.code=!0),null}else if(n.code)return e.next(),null;if(e.eatSpace())return n.ateSpace=!0,null;if((e.sol()||n.ateSpace)&&(n.ateSpace=!1,r.gitHubSpice!==!1)){if(e.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?=.{0,6}\d)(?:[a-f0-9]{7,40}\b)/))return n.combineTokens=!0,"link";if(e.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/))return n.combineTokens=!0,"link"}return e.match(o)&&e.string.slice(e.start-2,e.start)!="]("&&(e.start==0||/\W/.test(e.string.charAt(e.start-1)))?(n.combineTokens=!0,"link"):(e.next(),null)},blankLine:d},s={taskLists:!0,strikethrough:!0,emoji:!0};for(var l in r)s[l]=r[l];return s.name="markdown",t.overlayMode(t.getMode(i,s),m)},"markdown"),t.defineMIME("text/x-gfm","gfm")})})();const x=u.exports,z=h({__proto__:null,default:x},[u.exports]);export{z as g};
@@ -0,0 +1 @@
1
+ import{z as t}from"./index.f8fd6ee3.entry.js";function u(i,r){for(var a=0;a<r.length;a++){const n=r[a];if(typeof n!="string"&&!Array.isArray(n)){for(const e in n)if(e!=="default"&&!(e in i)){const l=Object.getOwnPropertyDescriptor(n,e);l&&Object.defineProperty(i,e,l.get?l:{enumerable:!0,get:()=>n[e]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}var o={exports:{}};(function(i,r){(function(a){a(t.exports)})(function(a){a.defineMode("gherkin",function(){return{startState:function(){return{lineNumber:0,tableHeaderLine:!1,allowFeature:!0,allowBackground:!1,allowScenario:!1,allowSteps:!1,allowPlaceholders:!1,allowMultilineArgument:!1,inMultilineString:!1,inMultilineTable:!1,inKeywordLine:!1}},token:function(n,e){if(n.sol()&&(e.lineNumber++,e.inKeywordLine=!1,e.inMultilineTable&&(e.tableHeaderLine=!1,n.match(/\s*\|/,!1)||(e.allowMultilineArgument=!1,e.inMultilineTable=!1))),n.eatSpace(),e.allowMultilineArgument){if(e.inMultilineString)return n.match('"""')?(e.inMultilineString=!1,e.allowMultilineArgument=!1):n.match(/.*/),"string";if(e.inMultilineTable)return n.match(/\|\s*/)?"bracket":(n.match(/[^\|]*/),e.tableHeaderLine?"header":"string");if(n.match('"""'))return e.inMultilineString=!0,"string";if(n.match("|"))return e.inMultilineTable=!0,e.tableHeaderLine=!0,"bracket"}return n.match(/#.*/)?"comment":!e.inKeywordLine&&n.match(/@\S+/)?"tag":!e.inKeywordLine&&e.allowFeature&&n.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)?(e.allowScenario=!0,e.allowBackground=!0,e.allowPlaceholders=!1,e.allowSteps=!1,e.allowMultilineArgument=!1,e.inKeywordLine=!0,"keyword"):!e.inKeywordLine&&e.allowBackground&&n.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\-ho\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)?(e.allowPlaceholders=!1,e.allowSteps=!0,e.allowBackground=!1,e.allowMultilineArgument=!1,e.inKeywordLine=!0,"keyword"):!e.inKeywordLine&&e.allowScenario&&n.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)?(e.allowPlaceholders=!0,e.allowSteps=!0,e.allowMultilineArgument=!1,e.inKeywordLine=!0,"keyword"):e.allowScenario&&n.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)?(e.allowPlaceholders=!1,e.allowSteps=!0,e.allowBackground=!1,e.allowMultilineArgument=!0,"keyword"):!e.inKeywordLine&&e.allowScenario&&n.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)?(e.allowPlaceholders=!1,e.allowSteps=!0,e.allowBackground=!1,e.allowMultilineArgument=!1,e.inKeywordLine=!0,"keyword"):!e.inKeywordLine&&e.allowSteps&&n.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\* )/)?(e.inStep=!0,e.allowPlaceholders=!0,e.allowMultilineArgument=!0,e.inKeywordLine=!0,"keyword"):n.match(/"[^"]*"?/)?"string":e.allowPlaceholders&&n.match(/<[^>]*>?/)?"variable":(n.next(),n.eatWhile(/[^@"<#]/),null)}}}),a.defineMIME("text/x-feature","gherkin")})})();const d=o.exports,s=u({__proto__:null,default:d},[o.exports]);export{s as g};
@@ -1,2 +1,2 @@
1
- import{a as l,o as i,b as u,w as o,l as e,E as t,e as c}from"./runtime-core.esm-bundler.fe249c5c.js";const d={class:"markdown-body"},h=e("div",{class:"warning hint"},[e("div",{class:"hint-title"},"Using a fork in production is neither supported nor recommended."),e("p",null,"Only do so if:"),e("ol",null,[e("li",null,"The feature you want to implement doesn\u2019t satisfy the 80/20 principle"),e("li",null,"There is a technical limitation preventing you from implementing it as an extension")]),e("p",null,"Forks are not officially supported - please don\u2019t submit fork-specific bugs and questions on the official repo."),e("p",null,[t("If you suspect a bug to not be part of your changes please confirm this by reproducing it with the official version "),e("strong",null,"before"),t(" submitting an issue.")])],-1),p=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Minimum Requirements"),e("p",null,"If you want to publish your fork to hub.docker.com or NPM you need to have an account there."),e("p",null,"Note: to publish to NPM you probably have to change all the package names. Publishing to NPM should almost never be necessary.")],-1),f=e("h2",{id:"1.-setup-environment-variables%2Fsecrets",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#1.-setup-environment-variables%2Fsecrets"},"#"),t(" 1. Setup environment variables/secrets")],-1),m=e("h2",{id:"general",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#general"},"#"),t(" General")],-1),b=e("table",null,[e("thead",null,[e("tr",null,[e("th",null,"Variable"),e("th",null,"Description"),e("th",null,"Example")])]),e("tbody",null,[e("tr",null,[e("td",null,[e("code",null,"GHCR_IMAGE")]),e("td",null,"Image name for GitHub Container Registry. Be sure to use the full URL."),e("td",null,[e("code",null,"ghcr.io/directus/directus")])]),e("tr",null,[e("td",null,[e("code",null,"DOCKERHUB_IMAGE")]),e("td",null,"Image name for hub.docker.com, no prefix."),e("td",null,[e("code",null,"directus/directus")])])])],-1),_=e("table",null,[e("thead",null,[e("tr",null,[e("th",null,"Secret"),e("th",null,"Description"),e("th",null,"Example")])]),e("tbody",null,[e("tr",null,[e("td",null,[e("code",null,"NPM_TOKEN")]),e("td",null,"Your NPM token. Make sure to use the type \u201Cautomation\u201D."),e("td",null,[e("code",null,"12345678-...")])]),e("tr",null,[e("td",null,[e("code",null,"DOCKERHUB_USERNAME")]),e("td",null,"Dockerhub Username"),e("td",null,[e("code",null,"directus")])]),e("tr",null,[e("td",null,[e("code",null,"DOCKERHUB_PASSWORD")]),e("td",null,"Dockerhub Password"),e("td",null,[e("code",null,"hunter2")])])])],-1),g=e("h2",{id:"2.-create-a-release",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#2.-create-a-release"},"#"),t(" 2. Create a release")],-1),k=e("pre",null,[e("code",{class:"language-bash"},`npm run release
2
- `)],-1),N="GitHub CI",w=!1,C="This guide explains how to publish a forked version of Directus on NPM, Dockerhub and GHCR. You need to first create a fork.",E="2 min read",M={__name:"github-ci",setup(v,{expose:r}){const n={title:"GitHub CI",modularExtension:!1,description:"This guide explains how to publish a forked version of Directus on NPM, Dockerhub and GHCR. You need to first create a fork.",readTime:"2 min read"};return r({frontmatter:n}),(y,x)=>{const s=l("router-link"),a=l("docs-wrapper");return i(),u(a,{frontmatter:n},{default:o(()=>[e("div",d,[e("blockquote",null,[e("p",null,[t("This guide explains how to publish a forked version of Directus on NPM, Dockerhub and GHCR. You need to first "),c(s,{to:"/docs/contributing/running-locally"},{default:o(()=>[t("create a fork")]),_:1})])]),h,p,f,m,b,_,g,k])]),_:1})}}};export{M as default,C as description,w as modularExtension,E as readTime,N as title};
1
+ import{a as l,o as i,e as u,y as o,u as e,q as t,z as c}from"./runtime-core.esm-bundler.22ec0346.js";const d={class:"markdown-body"},h=e("div",{class:"warning hint"},[e("div",{class:"hint-title"},"Using a fork in production is neither supported nor recommended."),e("p",null,"Only do so if:"),e("ol",null,[e("li",null,"The feature you want to implement doesn\u2019t satisfy the 80/20 principle"),e("li",null,"There is a technical limitation preventing you from implementing it as an extension")]),e("p",null,"Forks are not officially supported - please don\u2019t submit fork-specific bugs and questions on the official repo."),e("p",null,[t("If you suspect a bug to not be part of your changes please confirm this by reproducing it with the official version "),e("strong",null,"before"),t(" submitting an issue.")])],-1),p=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Minimum Requirements"),e("p",null,"If you want to publish your fork to hub.docker.com or NPM you need to have an account there."),e("p",null,"Note: to publish to NPM you probably have to change all the package names. Publishing to NPM should almost never be necessary.")],-1),f=e("h2",{id:"1.-setup-environment-variables%2Fsecrets",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#1.-setup-environment-variables%2Fsecrets"},"#"),t(" 1. Setup environment variables/secrets")],-1),m=e("h2",{id:"general",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#general"},"#"),t(" General")],-1),b=e("table",null,[e("thead",null,[e("tr",null,[e("th",null,"Variable"),e("th",null,"Description"),e("th",null,"Example")])]),e("tbody",null,[e("tr",null,[e("td",null,[e("code",null,"GHCR_IMAGE")]),e("td",null,"Image name for GitHub Container Registry. Be sure to use the full URL."),e("td",null,[e("code",null,"ghcr.io/directus/directus")])]),e("tr",null,[e("td",null,[e("code",null,"DOCKERHUB_IMAGE")]),e("td",null,"Image name for hub.docker.com, no prefix."),e("td",null,[e("code",null,"directus/directus")])])])],-1),_=e("table",null,[e("thead",null,[e("tr",null,[e("th",null,"Secret"),e("th",null,"Description"),e("th",null,"Example")])]),e("tbody",null,[e("tr",null,[e("td",null,[e("code",null,"NPM_TOKEN")]),e("td",null,"Your NPM token. Make sure to use the type \u201Cautomation\u201D."),e("td",null,[e("code",null,"12345678-...")])]),e("tr",null,[e("td",null,[e("code",null,"DOCKERHUB_USERNAME")]),e("td",null,"Dockerhub Username"),e("td",null,[e("code",null,"directus")])]),e("tr",null,[e("td",null,[e("code",null,"DOCKERHUB_PASSWORD")]),e("td",null,"Dockerhub Password"),e("td",null,[e("code",null,"hunter2")])])])],-1),g=e("h2",{id:"2.-create-a-release",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#2.-create-a-release"},"#"),t(" 2. Create a release")],-1),k=e("pre",null,[e("code",{class:"language-bash"},`npm run release
2
+ `)],-1),N="GitHub CI",C=!1,M="This guide explains how to publish a forked version of Directus on NPM, Dockerhub and GHCR. You need to first create a fork.",w="2 min read",E={__name:"github-ci",setup(y,{expose:r}){const n={title:"GitHub CI",modularExtension:!1,description:"This guide explains how to publish a forked version of Directus on NPM, Dockerhub and GHCR. You need to first create a fork.",readTime:"2 min read"};return r({frontmatter:n}),(v,x)=>{const s=l("router-link"),a=l("docs-wrapper");return i(),u(a,{frontmatter:n},{default:o(()=>[e("div",d,[e("blockquote",null,[e("p",null,[t("This guide explains how to publish a forked version of Directus on NPM, Dockerhub and GHCR. You need to first "),c(s,{to:"/docs/contributing/running-locally"},{default:o(()=>[t("create a fork")]),_:1})])]),h,p,f,m,b,_,g,k])]),_:1})}}};export{E as default,M as description,C as modularExtension,w as readTime,N as title};
@@ -1 +1 @@
1
- import{a as r,o as d,b as c,w as o,l as e,E as t,e as s}from"./runtime-core.esm-bundler.fe249c5c.js";const u={class:"markdown-body"},h=e("h2",{id:"asset-storage",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#asset-storage"},"#"),t(" Asset Storage")],-1),p=e("p",null,[t("Directus Core allows asset storage for any type of file. This applies to all Cloud Projects. However, on Directus Cloud, certain hard technical limits apply to file uploads, such as limits on size per asset and total asset storage per Project. For more details, see "),e("a",{href:"https://directus.io/cloud-policies#",target:"_blank",rel:"noopener noreferrer"},"Cloud Policies"),t(".")],-1),m=e("h2",{id:"automatic-updates",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#automatic-updates"},"#"),t(" Automatic Updates")],-1),f=e("p",null,[t("Software updates on any app can be a time-consuming chore, taking developer energy and focus away from core business logic. Cloud Projects are updated every two weeks in rolling releases "),e("em",null,"(i.e. done with no downtime)"),t(". These updates keep your Project on the latest version and fully up to date with all "),e("a",{href:"#cloud-exclusives"},"Cloud Exclusives"),t(", dependencies and security patches.")],-1),_=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Version-locking"),e("p",null,"Version-locking is available on Enterprise Projects.")],-1),g=e("h2",{id:"backups",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#backups"},"#"),t(" Backups")],-1),y=e("p",null,[t("By default, file assets and databases are backed up once per day on all Standard and Enterprise Projects. Additionally, Enterprise customers can work with our team for more tailored backup solutions. In the event of an emergency, such as your Node crashing, don\u2019t worry! Your data will be safe. If you need access to your backed-up data, "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"contact us"),t(".")],-1),b=e("div",{class:"warning hint"},[e("p",null,"Please note that Community Projects are not backed up.")],-1),w=e("h2",{id:"caching",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#caching"},"#"),t(" Caching")],-1),v=e("p",null,[t("Caching is enabled on Cloud Projects. Public data is cached in the CDN for a short period of time. All Directus Cloud Projects are running behind a "),e("a",{href:"#global-cdn"},"Global CDN"),t(", but Enterprise Projects offer advanced caching strategies, as well.")],-1),P=e("h2",{id:"cloud-exclusives",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#cloud-exclusives"},"#"),t(" Cloud Exclusives")],-1),C=e("p",null,[t("Our managed service includes several Cloud-Exclusive "),e("a",{href:"#extensions"},"Extensions"),t(" that are not available to self-hosted users. It\u2019s important to note that these are "),e("strong",null,"not"),t(" paywalled Core features, but are progressive enhancements that add to the base offering. Our team is always adding new exclusives, so check back often to stay up to date with the latest and greatest features! Cloud Exclusives development is managed by the Core Team, so these will stay up to date with the "),e("a",{href:"#automatic-updates"},"latest version of Directus"),t(". Examples include:")],-1),x=e("ul",null,[e("li",null,"Kanban Layout")],-1),j=e("div",{class:"tip hint"},[e("p",null,[t("Looking to sponsor development of an Extension or Cloud Exclusive? "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"Contact Us"),t(".")])],-1),k=e("h2",{id:"data-portability",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#data-portability"},"#"),t(" Data Portability")],-1),S=e("p",null,"Directus Core is totally detached from the database. Data can be cleanly imported and exported on Projects with the API via the schema endpoints.",-1),E=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Enterprise Clients"),e("p",null,[t("The Directus Team will help you work through this process on all "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"Enterprise Projects"),t(".")])],-1),D=e("h2",{id:"datacenter-regions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#datacenter-regions"},"#"),t(" Datacenter Regions")],-1),T=e("p",null,"The location you choose to host your Project in can have a measurable impact. To help optimize your Project and meet any local data compliance laws such as GDPR, Standard and Enterprise offer multiple Datacenter regions to host from. There are 19 regions available for Enterprise Projects, 3 for Standard Projects, and 1 for Community Projects:",-1),A=e("table",null,[e("tr",null,[e("th",null,"Region"),e("th",null,"Enterprise"),e("th",null,"Standard"),e("th",null,"Community")]),e("tr",null,[e("td",null,"United States, East"),e("td",null,"\u2705"),e("td",null,"\u2705"),e("td",null,"\u2705")]),e("tr",null,[e("td",null,"Europe, Frankfurt"),e("td",null,"\u2705"),e("td",null,"\u2705"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Singapore"),e("td",null,"\u2705"),e("td",null,"\u2705"),e("td")]),e("tr",null,[e("td",null,"United States, West"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Africa, Cape Town"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Hong Kong"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Jakarta"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Mumbai"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Osaka"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Seoul"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Sydney"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Tokyo"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Canada, Central"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Europe, Ireland"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Europe, London"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Europe, Paris"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Europe, Stockholm"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Middle East, Bahrain"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"South America, S\xE3o Paulo"),e("td",null,"\u2705"),e("td"),e("td")])],-1),N=e("h2",{id:"encryption-and-security",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#encryption-and-security"},"#"),t(" Encryption and Security")],-1),I=e("p",null,[e("a",{href:"#asset-storage"},"Asset Storage"),t(", data storage and in-transit encryption are included on all Cloud Projects. All data at rest remains encrypted, and HTTPS/TLS protocols are enabled on all in-transit data. Cloud Projects are created with secure and safe "),e("a",{href:"#multi-tenancy"},"tenancy architectures"),t(".")],-1),q=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Directus Core Security Features"),e("p",null,"Directus core comes with even more security features out-of-the-box, including IP address whitelabeling, MFA enabling, SSO options, customization for Password Rule requirements and the flexibility to use any access token paradigm desired.")],-1),R=e("h2",{id:"extensions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#extensions"},"#"),t(" Extensions")],-1),G=e("em",null,"Extension",-1),L=e("p",null,[t("All Cloud Projects have access to the "),e("a",{href:"#cloud-exclusives"},"Cloud Exclusive Extensions"),t(", which are developed and maintained by the Core Team. Enterprise Projects get all Cloud Exclusives, but also have the option to implement their own custom Extensions as needed.")],-1),B=e("h2",{id:"global-cdn",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#global-cdn"},"#"),t(" Global CDN")],-1),H=e("p",null,"A Global CDN is provided for all Cloud Projects, out-of-the-box, with over 300 cache locations. This means assets and data will be delivered with the lowest possible latency.",-1),F=e("h2",{id:"infrastructure",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#infrastructure"},"#"),t(" Infrastructure")],-1),z=e("a",{href:"#multi-tenancy"},"database",-1),M=e("a",{href:"#nodes"},"serverless nodes",-1),U=e("a",{href:"#asset-storage"},"asset storage",-1),V=e("a",{href:"#global-cdn"},"global CDN",-1),O=e("a",{href:"https://directus.io/pricing",target:"_blank",rel:"noopener noreferrer"},"Pricing page",-1),Y=e("h2",{id:"nodes",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#nodes"},"#"),t(" Nodes")],-1),W=e("p",null,"When you configure a project on Directus Cloud, you get to choose processing power of its Nodes as well as the number of Nodes it runs on. You can configure and reconfigure Nodes to meet traffic needs at any scale.",-1),K=e("p",null,[t("In general, there are two approaches to scale performance: vertical-scaling and horizontal-scaling. Vertical-scaling refers to the use of improved hardware "),e("em",null,"(e.g. better CPUs and more RAM)"),t(" to scale up. In Directus Cloud, configuring the Node Type will provide vertical-scaling. Horizontal-scaling refers to increasing the number of Nodes to scale up. In Directus Cloud, adding more Reserved Nodes will provide horizontal-scaling.")],-1),J=e("h3",{id:"node-types",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#node-types"},"#"),t(" Node Types")],-1),Q=e("p",null,"Each Node Type provides a different level of processing power.",-1),X=e("strong",null,"Community",-1),Z=e("br",null,null,-1),$=e("li",null,[e("p",null,[e("strong",null,"Lite"),e("br"),t(" Lite Nodes are the basic Node Type offered on Standard Projects. These Nodes are the right choice for most small- to medium- scale, production-ready use cases.")])],-1),ee=e("li",null,[e("p",null,[e("strong",null,"General Purpose Tier"),e("br"),t(" General Purpose Tier Nodes provide better performance under certain conditions, such as for handling Image transformations as well as fetching deeply nested or complex relationships via the API.")])],-1),te=e("li",null,[e("p",null,[e("strong",null,"Enterprise"),e("br"),t(" Configuration options are flexible and customizable, tailored to your Project\u2019s needs.")])],-1),oe=e("h3",{id:"reserved-nodes",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#reserved-nodes"},"#"),t(" Reserved Nodes")],-1),ne=e("strong",null,"Reserved Nodes",-1),se=e("h2",{id:"quotas",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#quotas"},"#"),t(" Quotas")],-1),ae=e("p",null,[t("Directus does not impose "),e("em",null,"arbitrary"),t(" software-based limits of any kind. So for things like Collections, Roles or Users - whether you have 10 or 10,000 of them - you are free to build out your Project as needed, with no up-charge. However, actual Project performance is going to depend on Node configuration, so there are hard technical limits. For details, see "),e("a",{href:"https://directus.io/cloud-policies",target:"_blank",rel:"noopener noreferrer"},"Cloud Policies"),t(".")],-1),re=e("h2",{id:"rate-limiting",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rate-limiting"},"#"),t(" Rate Limiting")],-1),ie=e("p",null,"Rate limiting refers to technical limitations within Directus Cloud as well as Cloud Projects. You will encounter the following API request limits at each node tier.",-1),le=e("table",null,[e("thead",null,[e("tr",null,[e("th",null,"Tier"),e("th",null,"Limit")])]),e("tbody",null,[e("tr",null,[e("td",null,"Community"),e("td",null,[t("10 requests per second per IP "),e("em",null,"(50 per second max)")])]),e("tr",null,[e("td",null,"Standard (Lite)"),e("td",null,"25 requests per second per node per IP")]),e("tr",null,[e("td",null,"Standard (General Purpose)"),e("td",null,"50 requests per second per node per IP")]),e("tr",null,[e("td",null,"Enterprise"),e("td",null,"100 requests per second per node per IP")])])],-1),de=e("div",{class:"tip hint"},[e("p",null,[t("These limits are additive and load balanced. For example, a Standard Project with two General Purpose nodes would get 100 requests per second per IP "),e("code",null,"50 requests * 2 nodes = 100"),t(".")])],-1),ce=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Learn More"),e("p",null,[t("For details on other limitations, please see "),e("a",{href:"https://directus.io/cloud-policies/#",target:"_blank",rel:"noopener noreferrer"},"Cloud Policies"),t(".")])],-1),ue=e("h2",{id:"support-options",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#support-options"},"#"),t(" Support Options")],-1),he=e("p",null,"There are three types of support for Directus:",-1),pe=e("h3",{id:"community-support",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#community-support"},"#"),t(" Community Support")],-1),me=e("p",null,[t("Because Directus is an open-source Project, you\u2019re encouraged to reach out to the Community for help on Projects, "),e("em",null,"and of course help others as well"),t(". Find us on "),e("a",{href:"https://github.com/directus/directus/discussions",target:"_blank",rel:"noopener noreferrer"},"GitHub"),t(" and "),e("a",{href:"https://directus.chat",target:"_blank",rel:"noopener noreferrer"},"Discord"),t(" to join the thousands of other developers all discussing and guiding the future of the Directus platform. Most common questions have already been asked and answered and can be easily searched.")],-1),fe=e("div",{class:"warning hint"},[e("div",{class:"hint-title"},"No Guaranteed Response Time"),e("p",null,"While the Directus Core Team plays an active and engaged role in community discussions and aims to answer questions within a few days, there is no guaranteed response time for Community Support.")],-1),_e=e("h3",{id:"basic-and-premium-support",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#basic-and-premium-support"},"#"),t(" Basic and Premium Support")],-1),ge=e("p",null,"Basic and Premium Support offer direct communication with the Directus Core Team. Basic support is included on all Enterprise Projects, and Premium Support adds 24/7 response times for critical software issues only.",-1),ye=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Add-on Support"),e("p",null,[t("Looking for Basic or Premium Support on a self-hosted Project? "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"Contact Sales"),t(".")])],-1),be=e("h2",{id:"system-status",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#system-status"},"#"),t(" System Status")],-1),we=e("video",{alt:"System Status",loop:"",muted:"",controls:"",autoplay:"",playsinline:""},[e("source",{src:"https://cdn.directus.io/docs/v9/cloud/glossary/glossary-20220322A/system-status-20220329A.mp4",type:"video/mp4"})],-1),ve=e("p",null,[t("Click "),e("span",{mi:"",icon:""},"check"),t(" in the Dashboard Header to navigate to the System Status page. This page is where to "),e("em",null,"find out what happened"),t(" in the super rare event that the network slows down or goes offline. Here you can view the current connectivity status of Directus Cloud, the status on individual Projects by URL and a daily Incidents log. For more information, see "),e("a",{href:"https://directus.io/cloud-policies#",target:"_blank",rel:"noopener noreferrer"},"Cloud Policies"),t(".")],-1),Pe=e("h2",{id:"multi-tenancy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#multi-tenancy"},"#"),t(" Multi-tenancy")],-1),Ce=e("p",null,"Tenancy refers to how client data is stored within a database. In single-tenancy architecture, a database stores data from only one tenant. In multi-tenancy architecture, a database stores data from multiple tenants, with mechanisms in place to protect data privacy. In the context of Directus Cloud, each Project represents a tenant.",-1),xe=e("p",null,[e("strong",null,"Community"),e("br"),t(" Community project databases are technically single-tenant, but also file-based, and therefore may be too limited on power for a production-ready environment.")],-1),je=e("p",null,[e("strong",null,"Standard"),e("br"),t(" Standard Projects are created using a multi-tenant architecture. However, if your neighbor\u2019s Project gets busy, it will not impact your Project, because each Standard Project is scoped to one container per Project with dedicated minimum resources. Projects also have the ability to scale beyond this minimum allocation based on currently available resources within the multitenant pool. However, these additional resources are not guaranteed and are offered on a dynamic first-come, first-serve basis. For end-to-end, single-tenant infrastructure with fully dedicated resources, "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"contact us about our Enterprise Tier")],-1),ke=e("p",null,[e("strong",null,"Enterprise"),e("br"),t(" Databases on Enterprise Projects are single-tenant, 100% dedicated to your Project - no neighbors! Ready to upgrade to Enterprise? "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"Contact us")],-1),Se=e("div",{class:"tip hint"},[e("p",null,"This section refers to how your Cloud Project is stored alongside other Cloud Projects and has nothing to do with how you design your Project\u2019s data model. You can implement single or multi-tenant architecture within any Directus Cloud Project.")],-1),Ne="Glossary",Ie=!1,qe="A glossary of terms specific to Directus Cloud.",Re="10 min read",Ge={__name:"glossary",setup(Ee,{expose:i}){const a={title:"Glossary",modularExtension:!1,description:"A glossary of terms specific to Directus Cloud.",readTime:"10 min read"};return i({frontmatter:a}),(De,Te)=>{const n=r("router-link"),l=r("docs-wrapper");return d(),c(l,{frontmatter:a},{default:o(()=>[e("div",u,[h,p,m,f,_,g,y,b,w,v,P,C,x,j,k,S,E,D,T,A,N,I,q,R,e("p",null,[t("The term "),G,t(" refers to any feature or component that adds to the functionality of Directus Core. Directus has been architected to be "),s(n,{to:"/docs/extensions/introduction"},{default:o(()=>[t("completely modular and extensible")]),_:1}),t(" to ensure you will never hit a hard feature ceiling within the platform.")]),L,B,H,F,e("p",null,[t("In the context of these docs, Infrastructure refers to the hardware running your Project, including the "),z,t(", "),M,t(", "),U,t(" and "),V,t(". Infrastructure differs by Project tier. Please refer to "),s(n,{to:"/docs/cloud/projects"},{default:o(()=>[t("Projects")]),_:1}),t(" as well as the Infrastructure section on the "),O,t(" for side-by-side comparisons.")]),Y,W,K,J,Q,e("ul",null,[e("li",null,[e("p",null,[X,Z,t(" Community Projects come equipped with one Node, which can handle basic web traffic required for hobby projects, learning and demoing Directus Cloud, and other non-production use cases. Community Nodes are paused after a certain duration of runtime. However, you can "),s(n,{to:"/docs/cloud/projects#resume-a-community-project"},{default:o(()=>[t("extend this period")]),_:1}),t(" forever.")])]),$,ee,te]),oe,e("p",null,[t("The term "),ne,t(" indicates the number of nodes available to immediately handle incoming requests, including rapid spikes.This determines your base "),s(n,{to:"/docs/cloud/teams.md#manage-billing"},{default:o(()=>[t("monthly billing")]),_:1}),t(".")]),se,ae,re,ie,le,de,ce,ue,he,pe,me,fe,_e,ge,ye,be,we,ve,Pe,Ce,xe,je,ke,Se])]),_:1})}}};export{Ge as default,qe as description,Ie as modularExtension,Re as readTime,Ne as title};
1
+ import{a as r,o as d,e as c,y as o,u as e,q as t,z as s}from"./runtime-core.esm-bundler.22ec0346.js";const u={class:"markdown-body"},h=e("h2",{id:"asset-storage",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#asset-storage"},"#"),t(" Asset Storage")],-1),p=e("p",null,[t("Directus Core allows asset storage for any type of file. This applies to all Cloud Projects. However, on Directus Cloud, certain hard technical limits apply to file uploads, such as limits on size per asset and total asset storage per Project. For more details, see "),e("a",{href:"https://directus.io/cloud-policies#",target:"_blank",rel:"noopener noreferrer"},"Cloud Policies"),t(".")],-1),m=e("h2",{id:"automatic-updates",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#automatic-updates"},"#"),t(" Automatic Updates")],-1),f=e("p",null,[t("Software updates on any app can be a time-consuming chore, taking developer energy and focus away from core business logic. Cloud Projects are updated every two weeks in rolling releases "),e("em",null,"(i.e. done with no downtime)"),t(". These updates keep your Project on the latest version and fully up to date with all "),e("a",{href:"#cloud-exclusives"},"Cloud Exclusives"),t(", dependencies and security patches.")],-1),_=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Version-locking"),e("p",null,"Version-locking is available on Enterprise Projects.")],-1),g=e("h2",{id:"backups",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#backups"},"#"),t(" Backups")],-1),y=e("p",null,[t("By default, file assets and databases are backed up once per day on all Standard and Enterprise Projects. Additionally, Enterprise customers can work with our team for more tailored backup solutions. In the event of an emergency, such as your Node crashing, don\u2019t worry! Your data will be safe. If you need access to your backed-up data, "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"contact us"),t(".")],-1),b=e("div",{class:"warning hint"},[e("p",null,"Please note that Community Projects are not backed up.")],-1),w=e("h2",{id:"caching",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#caching"},"#"),t(" Caching")],-1),v=e("p",null,[t("Caching is enabled on Cloud Projects. Public data is cached in the CDN for a short period of time. All Directus Cloud Projects are running behind a "),e("a",{href:"#global-cdn"},"Global CDN"),t(", but Enterprise Projects offer advanced caching strategies, as well.")],-1),P=e("h2",{id:"cloud-exclusives",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#cloud-exclusives"},"#"),t(" Cloud Exclusives")],-1),C=e("p",null,[t("Our managed service includes several Cloud-Exclusive "),e("a",{href:"#extensions"},"Extensions"),t(" that are not available to self-hosted users. It\u2019s important to note that these are "),e("strong",null,"not"),t(" paywalled Core features, but are progressive enhancements that add to the base offering. Our team is always adding new exclusives, so check back often to stay up to date with the latest and greatest features! Cloud Exclusives development is managed by the Core Team, so these will stay up to date with the "),e("a",{href:"#automatic-updates"},"latest version of Directus"),t(". Examples include:")],-1),x=e("ul",null,[e("li",null,"Kanban Layout")],-1),j=e("div",{class:"tip hint"},[e("p",null,[t("Looking to sponsor development of an Extension or Cloud Exclusive? "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"Contact Us"),t(".")])],-1),k=e("h2",{id:"data-portability",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#data-portability"},"#"),t(" Data Portability")],-1),S=e("p",null,"Directus Core is totally detached from the database. Data can be cleanly imported and exported on Projects with the API via the schema endpoints.",-1),E=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Enterprise Clients"),e("p",null,[t("The Directus Team will help you work through this process on all "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"Enterprise Projects"),t(".")])],-1),D=e("h2",{id:"datacenter-regions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#datacenter-regions"},"#"),t(" Datacenter Regions")],-1),T=e("p",null,"The location you choose to host your Project in can have a measurable impact. To help optimize your Project and meet any local data compliance laws such as GDPR, Standard and Enterprise offer multiple Datacenter regions to host from. There are 19 regions available for Enterprise Projects, 3 for Standard Projects, and 1 for Community Projects:",-1),A=e("table",null,[e("tr",null,[e("th",null,"Region"),e("th",null,"Enterprise"),e("th",null,"Standard"),e("th",null,"Community")]),e("tr",null,[e("td",null,"United States, East"),e("td",null,"\u2705"),e("td",null,"\u2705"),e("td",null,"\u2705")]),e("tr",null,[e("td",null,"Europe, Frankfurt"),e("td",null,"\u2705"),e("td",null,"\u2705"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Singapore"),e("td",null,"\u2705"),e("td",null,"\u2705"),e("td")]),e("tr",null,[e("td",null,"United States, West"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Africa, Cape Town"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Hong Kong"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Jakarta"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Mumbai"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Osaka"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Seoul"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Sydney"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Asia Pacific, Tokyo"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Canada, Central"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Europe, Ireland"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Europe, London"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Europe, Paris"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Europe, Stockholm"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"Middle East, Bahrain"),e("td",null,"\u2705"),e("td"),e("td")]),e("tr",null,[e("td",null,"South America, S\xE3o Paulo"),e("td",null,"\u2705"),e("td"),e("td")])],-1),N=e("h2",{id:"encryption-and-security",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#encryption-and-security"},"#"),t(" Encryption and Security")],-1),I=e("p",null,[e("a",{href:"#asset-storage"},"Asset Storage"),t(", data storage and in-transit encryption are included on all Cloud Projects. All data at rest remains encrypted, and HTTPS/TLS protocols are enabled on all in-transit data. Cloud Projects are created with secure and safe "),e("a",{href:"#multi-tenancy"},"tenancy architectures"),t(".")],-1),q=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Directus Core Security Features"),e("p",null,"Directus core comes with even more security features out-of-the-box, including IP address whitelabeling, MFA enabling, SSO options, customization for Password Rule requirements and the flexibility to use any access token paradigm desired.")],-1),R=e("h2",{id:"extensions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#extensions"},"#"),t(" Extensions")],-1),G=e("em",null,"Extension",-1),L=e("p",null,[t("All Cloud Projects have access to the "),e("a",{href:"#cloud-exclusives"},"Cloud Exclusive Extensions"),t(", which are developed and maintained by the Core Team. Enterprise Projects get all Cloud Exclusives, but also have the option to implement their own custom Extensions as needed.")],-1),B=e("h2",{id:"global-cdn",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#global-cdn"},"#"),t(" Global CDN")],-1),H=e("p",null,"A Global CDN is provided for all Cloud Projects, out-of-the-box, with over 300 cache locations. This means assets and data will be delivered with the lowest possible latency.",-1),F=e("h2",{id:"infrastructure",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#infrastructure"},"#"),t(" Infrastructure")],-1),z=e("a",{href:"#multi-tenancy"},"database",-1),M=e("a",{href:"#nodes"},"serverless nodes",-1),U=e("a",{href:"#asset-storage"},"asset storage",-1),V=e("a",{href:"#global-cdn"},"global CDN",-1),O=e("a",{href:"https://directus.io/pricing",target:"_blank",rel:"noopener noreferrer"},"Pricing page",-1),Y=e("h2",{id:"nodes",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#nodes"},"#"),t(" Nodes")],-1),W=e("p",null,"When you configure a project on Directus Cloud, you get to choose processing power of its Nodes as well as the number of Nodes it runs on. You can configure and reconfigure Nodes to meet traffic needs at any scale.",-1),K=e("p",null,[t("In general, there are two approaches to scale performance: vertical-scaling and horizontal-scaling. Vertical-scaling refers to the use of improved hardware "),e("em",null,"(e.g. better CPUs and more RAM)"),t(" to scale up. In Directus Cloud, configuring the Node Type will provide vertical-scaling. Horizontal-scaling refers to increasing the number of Nodes to scale up. In Directus Cloud, adding more Reserved Nodes will provide horizontal-scaling.")],-1),J=e("h3",{id:"node-types",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#node-types"},"#"),t(" Node Types")],-1),Q=e("p",null,"Each Node Type provides a different level of processing power.",-1),X=e("strong",null,"Community",-1),Z=e("br",null,null,-1),$=e("li",null,[e("p",null,[e("strong",null,"Lite"),e("br"),t(" Lite Nodes are the basic Node Type offered on Standard Projects. These Nodes are the right choice for most small- to medium- scale, production-ready use cases.")])],-1),ee=e("li",null,[e("p",null,[e("strong",null,"General Purpose Tier"),e("br"),t(" General Purpose Tier Nodes provide better performance under certain conditions, such as for handling Image transformations as well as fetching deeply nested or complex relationships via the API.")])],-1),te=e("li",null,[e("p",null,[e("strong",null,"Enterprise"),e("br"),t(" Configuration options are flexible and customizable, tailored to your Project\u2019s needs.")])],-1),oe=e("h3",{id:"reserved-nodes",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#reserved-nodes"},"#"),t(" Reserved Nodes")],-1),ne=e("strong",null,"Reserved Nodes",-1),se=e("h2",{id:"quotas",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#quotas"},"#"),t(" Quotas")],-1),ae=e("p",null,[t("Directus does not impose "),e("em",null,"arbitrary"),t(" software-based limits of any kind. So for things like Collections, Roles or Users - whether you have 10 or 10,000 of them - you are free to build out your Project as needed, with no up-charge. However, actual Project performance is going to depend on Node configuration, so there are hard technical limits. For details, see "),e("a",{href:"https://directus.io/cloud-policies",target:"_blank",rel:"noopener noreferrer"},"Cloud Policies"),t(".")],-1),re=e("h2",{id:"rate-limiting",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rate-limiting"},"#"),t(" Rate Limiting")],-1),ie=e("p",null,"Rate limiting refers to technical limitations within Directus Cloud as well as Cloud Projects. You will encounter the following API request limits at each node tier.",-1),le=e("table",null,[e("thead",null,[e("tr",null,[e("th",null,"Tier"),e("th",null,"Limit")])]),e("tbody",null,[e("tr",null,[e("td",null,"Community"),e("td",null,[t("10 requests per second per IP "),e("em",null,"(50 per second max)")])]),e("tr",null,[e("td",null,"Standard (Lite)"),e("td",null,"25 requests per second per node per IP")]),e("tr",null,[e("td",null,"Standard (General Purpose)"),e("td",null,"50 requests per second per node per IP")]),e("tr",null,[e("td",null,"Enterprise"),e("td",null,"100 requests per second per node per IP")])])],-1),de=e("div",{class:"tip hint"},[e("p",null,[t("These limits are additive and load balanced. For example, a Standard Project with two General Purpose nodes would get 100 requests per second per IP "),e("code",null,"50 requests * 2 nodes = 100"),t(".")])],-1),ce=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Learn More"),e("p",null,[t("For details on other limitations, please see "),e("a",{href:"https://directus.io/cloud-policies/#",target:"_blank",rel:"noopener noreferrer"},"Cloud Policies"),t(".")])],-1),ue=e("h2",{id:"support-options",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#support-options"},"#"),t(" Support Options")],-1),he=e("p",null,"There are three types of support for Directus:",-1),pe=e("h3",{id:"community-support",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#community-support"},"#"),t(" Community Support")],-1),me=e("p",null,[t("Because Directus is an open-source Project, you\u2019re encouraged to reach out to the Community for help on Projects, "),e("em",null,"and of course help others as well"),t(". Find us on "),e("a",{href:"https://github.com/directus/directus/discussions",target:"_blank",rel:"noopener noreferrer"},"GitHub"),t(" and "),e("a",{href:"https://directus.chat",target:"_blank",rel:"noopener noreferrer"},"Discord"),t(" to join the thousands of other developers all discussing and guiding the future of the Directus platform. Most common questions have already been asked and answered and can be easily searched.")],-1),fe=e("div",{class:"warning hint"},[e("div",{class:"hint-title"},"No Guaranteed Response Time"),e("p",null,"While the Directus Core Team plays an active and engaged role in community discussions and aims to answer questions within a few days, there is no guaranteed response time for Community Support.")],-1),_e=e("h3",{id:"basic-and-premium-support",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#basic-and-premium-support"},"#"),t(" Basic and Premium Support")],-1),ge=e("p",null,"Basic and Premium Support offer direct communication with the Directus Core Team. Basic support is included on all Enterprise Projects, and Premium Support adds 24/7 response times for critical software issues only.",-1),ye=e("div",{class:"tip hint"},[e("div",{class:"hint-title"},"Add-on Support"),e("p",null,[t("Looking for Basic or Premium Support on a self-hosted Project? "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"Contact Sales"),t(".")])],-1),be=e("h2",{id:"system-status",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#system-status"},"#"),t(" System Status")],-1),we=e("video",{alt:"System Status",loop:"",muted:"",controls:"",autoplay:"",playsinline:""},[e("source",{src:"https://cdn.directus.io/docs/v9/cloud/glossary/glossary-20220322A/system-status-20220329A.mp4",type:"video/mp4"})],-1),ve=e("p",null,[t("Click "),e("span",{mi:"",icon:""},"check"),t(" in the Dashboard Header to navigate to the System Status page. This page is where to "),e("em",null,"find out what happened"),t(" in the super rare event that the network slows down or goes offline. Here you can view the current connectivity status of Directus Cloud, the status on individual Projects by URL and a daily Incidents log. For more information, see "),e("a",{href:"https://directus.io/cloud-policies#",target:"_blank",rel:"noopener noreferrer"},"Cloud Policies"),t(".")],-1),Pe=e("h2",{id:"multi-tenancy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#multi-tenancy"},"#"),t(" Multi-tenancy")],-1),Ce=e("p",null,"Tenancy refers to how client data is stored within a database. In single-tenancy architecture, a database stores data from only one tenant. In multi-tenancy architecture, a database stores data from multiple tenants, with mechanisms in place to protect data privacy. In the context of Directus Cloud, each Project represents a tenant.",-1),xe=e("p",null,[e("strong",null,"Community"),e("br"),t(" Community project databases are technically single-tenant, but also file-based, and therefore may be too limited on power for a production-ready environment.")],-1),je=e("p",null,[e("strong",null,"Standard"),e("br"),t(" Standard Projects are created using a multi-tenant architecture. However, if your neighbor\u2019s Project gets busy, it will not impact your Project, because each Standard Project is scoped to one container per Project with dedicated minimum resources. Projects also have the ability to scale beyond this minimum allocation based on currently available resources within the multitenant pool. However, these additional resources are not guaranteed and are offered on a dynamic first-come, first-serve basis. For end-to-end, single-tenant infrastructure with fully dedicated resources, "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"contact us about our Enterprise Tier")],-1),ke=e("p",null,[e("strong",null,"Enterprise"),e("br"),t(" Databases on Enterprise Projects are single-tenant, 100% dedicated to your Project - no neighbors! Ready to upgrade to Enterprise? "),e("a",{href:"https://directus.io/contact",target:"_blank",rel:"noopener noreferrer"},"Contact us")],-1),Se=e("div",{class:"tip hint"},[e("p",null,"This section refers to how your Cloud Project is stored alongside other Cloud Projects and has nothing to do with how you design your Project\u2019s data model. You can implement single or multi-tenant architecture within any Directus Cloud Project.")],-1),Ne="Glossary",Ie=!1,qe="A glossary of terms specific to Directus Cloud.",Re="10 min read",Ge={__name:"glossary",setup(Ee,{expose:i}){const a={title:"Glossary",modularExtension:!1,description:"A glossary of terms specific to Directus Cloud.",readTime:"10 min read"};return i({frontmatter:a}),(De,Te)=>{const n=r("router-link"),l=r("docs-wrapper");return d(),c(l,{frontmatter:a},{default:o(()=>[e("div",u,[h,p,m,f,_,g,y,b,w,v,P,C,x,j,k,S,E,D,T,A,N,I,q,R,e("p",null,[t("The term "),G,t(" refers to any feature or component that adds to the functionality of Directus Core. Directus has been architected to be "),s(n,{to:"/docs/extensions/introduction"},{default:o(()=>[t("completely modular and extensible")]),_:1}),t(" to ensure you will never hit a hard feature ceiling within the platform.")]),L,B,H,F,e("p",null,[t("In the context of these docs, Infrastructure refers to the hardware running your Project, including the "),z,t(", "),M,t(", "),U,t(" and "),V,t(". Infrastructure differs by Project tier. Please refer to "),s(n,{to:"/docs/cloud/projects"},{default:o(()=>[t("Projects")]),_:1}),t(" as well as the Infrastructure section on the "),O,t(" for side-by-side comparisons.")]),Y,W,K,J,Q,e("ul",null,[e("li",null,[e("p",null,[X,Z,t(" Community Projects come equipped with one Node, which can handle basic web traffic required for hobby projects, learning and demoing Directus Cloud, and other non-production use cases. Community Nodes are paused after a certain duration of runtime. However, you can "),s(n,{to:"/docs/cloud/projects#resume-a-community-project"},{default:o(()=>[t("extend this period")]),_:1}),t(" forever.")])]),$,ee,te]),oe,e("p",null,[t("The term "),ne,t(" indicates the number of nodes available to immediately handle incoming requests, including rapid spikes.This determines your base "),s(n,{to:"/docs/cloud/teams.md#manage-billing"},{default:o(()=>[t("monthly billing")]),_:1}),t(".")]),se,ae,re,ie,le,de,ce,ue,he,pe,me,fe,_e,ge,ye,be,we,ve,Pe,Ce,xe,je,ke,Se])]),_:1})}}};export{Ge as default,qe as description,Ie as modularExtension,Re as readTime,Ne as title};
@@ -1 +1 @@
1
- import{a as i,o as d,b as c,w as a,l as e,E as t,e as o}from"./runtime-core.esm-bundler.fe249c5c.js";const u={class:"markdown-body"},h=e("blockquote",null,[e("p",null,"This is list of platform-specific terminology, and their meanings. Most are simply more approachable names for technical database terms.")],-1),p=e("h2",{id:"admin-%2F-administrator",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#admin-%2F-administrator"},"#"),t(" Admin / Administrator")],-1),f=e("p",null,"An \u201CAdministrator\u201D Role (with Admin access enabled) is included when you first install the platform. All admin roles bypass the permissions check, providing unrestricted access to all data within the App and API. Additionally, only roles with the admin option enabled can manage Settings within the app.",-1),m=e("h2",{id:"alias",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#alias"},"#"),t(" Alias")],-1),g=e("a",{href:"#fields"},"Fields",-1),y=e("h2",{id:"api",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#api"},"#"),t(" API")],-1),_=e("p",null,"The Application Programming Interface (API) provided by the platform is how you can programmatically connect your project\u2019s content, files, and system information to external code (like a website) or with other third-party services.",-1),b=e("h2",{id:"app",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#app"},"#"),t(" App")],-1),v=e("p",null,[t("An intuitive no-code application for managing database content. Powered by the API, the modular and highly extensible App is written in "),e("a",{href:"https://vuejs.org",target:"_blank",rel:"noopener noreferrer"},"Vue.js"),t(".")],-1),w=e("h2",{id:"activity",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#activity"},"#"),t(" Activity")],-1),x=e("p",null,"Activity is a log of all events that take place within the platform. Used for accountability, each activity record tracks the event type, user, timestamp, IP address, user-agent, and any associated revision data.",-1),A=e("h2",{id:"collections",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#collections"},"#"),t(" Collections")],-1),k=e("strong",null,"table",-1),I=e("a",{href:"#title-formatter"},"title formatter",-1),T=e("p",null,[t("Collections can be organized in any way that is appropriate for your project. You can architect them platform-specific (e.g., "),e("em",null,"pages"),t(" of a website), or in a more platform-agnostic way (e.g., raw "),e("em",null,"customers"),t(" of your business). While there\u2019s no right or wrong way to structure your data-model, we recommend keeping your data as agnostic as possible so it is easier to repurpose in the future. "),e("strong",null,"In short, learn to see your data as its own asset \u2014 not only through the lens of your immediate project needs"),t(".")],-1),C=e("p",null,[t("The only requirement of a collection is that it must contain a "),e("a",{href:"#primary-key-pk"},"Primary Key"),t(" field. This field stores a unique value that is used to reference the Collection\u2019s items throughout the database/platform.")],-1),D=e("h3",{id:"relevant-guides",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides"},"#"),t(" Relevant Guides")],-1),j=e("h2",{id:"dashboards",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#dashboards"},"#"),t(" Dashboards")],-1),S=e("p",null,[t("Dashboards within the Insights module organize different "),e("a",{href:"#panels"},"Panels"),t(" into an at-a-glance view. They can be used to group data based on department, objective, business process or anything you choose.")],-1),P=e("h2",{id:"database-abstraction",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#database-abstraction"},"#"),t(" Database Abstraction")],-1),F=e("p",null,"Directus supports mirroring all the most widely used SQL databases, including PostgreSQL, MySQL, Microsoft SQL Server, SQLite, OracleDB, MariaDB, CockroachDB, and other variants. Each vendor has subtle (and sometimes not so subtle) differences in how they function, so Directus includes an abstraction layer that helps it avoid writing different code for each type.",-1),R=e("p",null,[t("This means there is also the possibility of supporting other datastores in the future, such as NoSQL options like MongoDB, or even third-party data services like Firebase or Heroku. However these options are "),e("em",null,"fundamentally"),t(" different from the relational SQL databases we currently support, and so more research is needed.")],-1),M=e("h2",{id:"displays",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#displays"},"#"),t(" Displays")],-1),L=e("p",null,[t("Displays are the smaller, read-only counterpart to "),e("a",{href:"#interfaces"},"Interfaces"),t(", defining how a field\u2019s data will be displayed inline throughout the App.")],-1),z=e("p",null,[t("For example, you may have a \u201CStatus\u201D field that uses a "),e("em",null,"Dropdown"),t(" Interface on the Item Detail page, and a smaller "),e("em",null,"Badge"),t(" Display when the field is referenced throughout the rest of the App. Directus includes many Displays out-of-the-box, below are the some key examples:")],-1),B=e("ul",null,[e("li",null,[e("strong",null,"Raw"),t(" \u2014 The exact value, straight from the API")]),e("li",null,[e("strong",null,"Formatted Value"),t(" \u2014 Provides options for string formatting")]),e("li",null,[e("strong",null,"Boolean"),t(" \u2014 Customizable True/False icons")]),e("li",null,[e("strong",null,"Color"),t(" \u2014 A color swatch preview")]),e("li",null,[e("strong",null,"DateTime"),t(" \u2014 Formatted or relative datetimes")]),e("li",null,[e("strong",null,"Image"),t(" \u2014 Thumbnail previews")]),e("li",null,[e("strong",null,"Labels"),t(" \u2014 Small, custom colored badges")]),e("li",null,[e("strong",null,"Rating"),t(" \u2014 Customizable stars")]),e("li",null,[e("strong",null,"Related Values"),t(" \u2014 Displays relational display titles")]),e("li",null,[e("strong",null,"User"),t(" \u2014 Avatar and name of a system user")])],-1),E=e("p",null,"In addition to the included core displays, custom displays allow for creating new and/or proprietary ways to view or represent field data. For example, you could create progress indicators, tooltips for relational data, specific formatting styles, or anything else.",-1),G=e("h3",{id:"relevant-guides-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-1"},"#"),t(" Relevant Guides")],-1),q=e("h2",{id:"environments",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#environments"},"#"),t(" Environments")],-1),U=e("p",null,"Environments (e.g., dev, staging, prod) are tracked as separate Project instances. You can then use schema/content migrations to promote data between them.",-1),Q=e("h2",{id:"extensions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#extensions"},"#"),t(" Extensions")],-1),O=e("h2",{id:"fields",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#fields"},"#"),t(" Fields")],-1),W=e("p",null,[t("Fields are a specific type of value within a Collection, storing the data of your item\u2019s content. Each field represents a "),e("strong",null,"column"),t(" in your database. For example, an "),e("code",null,"articles"),t(),e("a",{href:"#collections"},"Collection"),t(" might have "),e("code",null,"title"),t(", "),e("code",null,"body"),t(", "),e("code",null,"author"),t(", and "),e("code",null,"date_published"),t(" field. Fields mirror the characteristics of their associated column, including its "),e("code",null,"name"),t(", "),e("code",null,"type"),t(", "),e("code",null,"default"),t(", "),e("code",null,"length"),t(", "),e("code",null,"allow_null"),t(", etc.")],-1),N=e("h3",{id:"relevant-guides-2",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-2"},"#"),t(" Relevant Guides")],-1),V=e("h2",{id:"files-%26-assets",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#files-%26-assets"},"#"),t(" Files & Assets")],-1),H=e("p",null,"As you might have guessed, files includes images, videos, PDFs, text documents, or anything else. While files can technically be stored as code in the database, it is far more common to manage them as individual assets on a \u201Cdrive\u201D. The platform supports many options for uploading, storing, transforming, and retrieving different types of files, and it is an excellent Digital Asset Management system.",-1),Y=e("h2",{id:"icons",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#icons"},"#"),t(" Icons")],-1),K=e("h3",{id:"material-icons",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#material-icons"},"#"),t(" Material Icons")],-1),J=e("p",null,[t("Full list of icons "),e("a",{href:"https://fonts.google.com/icons",target:"_blank",rel:"noopener noreferrer"},"can be found here"),t(". Directus supports both filled & outlined variants of Material icons.")],-1),X=e("h3",{id:"social-icons",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#social-icons"},"#"),t(" Social Icons")],-1),Z=e("p",null,[t("They are Font Awesome 5\u2019s brands icons. Full list of icons "),e("a",{href:"https://fontawesome.com/v5.15/icons?d=gallery&s=brands",target:"_blank",rel:"noopener noreferrer"},"can be found here"),t(". When using them as one of the auth provider icons, make sure to use underscores, such as "),e("code",null,"blogger_b"),t(" for "),e("a",{href:"https://fontawesome.com/v5.15/icons/blogger-b?style=brands",target:"_blank",rel:"noopener noreferrer"},"blogger-b"),t(" icon.")],-1),$=e("h2",{id:"interfaces",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#interfaces"},"#"),t(" Interfaces")],-1),ee=e("p",null,"Interfaces determine how you view or interact with a field. In most cases, they offer some sort of input tailored to managing data of a specific type, but can also be used exclusively for presentation. Examples include text inputs, toggles, WYSIWYG editors, dropdowns, sliders, image galleries, and more.",-1),te=e("p",null,[t("In addition to the many core interfaces included out-of-the-box, "),e("em",null,"custom"),t(" interfaces allow for creating more tailored or proprietary options, such as seating charts, QR codes, or Stripe customer info.")],-1),ae=e("h3",{id:"relevant-guides-3",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-3"},"#"),t(" Relevant Guides")],-1),se=e("h2",{id:"items",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#items"},"#"),t(" Items")],-1),oe=e("p",null,[t("Items are objects within a Collection which contain values for one or more fields. Each collection represents a "),e("strong",null,"record"),t(" in your database.")],-1),ne=e("p",null,"Items are the primary building blocks of your project content. Similar to a \u201Crow\u201D within a spreadsheet, all data within the platform is accessed via these \u201Catomic\u201D data units. Items themselves are fairly straightforward, however their real power comes from the complexity that begins to form when items are relationally connected to each other.",-1),ie=e("p",null,[t("Items are referenced (both individually and relationally) by their unique "),e("a",{href:"#primary-key-pk"},"primary key"),t(".")],-1),le=e("h4",{id:"relevant-guides-4",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-4"},"#"),t(" Relevant Guides")],-1),re=e("h2",{id:"junction-collections",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#junction-collections"},"#"),t(" Junction Collections")],-1),de=e("p",null,[t("The platform allows you to group Items within different Collections. But often times it is important to \u201Clink\u201D items across different collections (such as relating "),e("code",null,"recipes"),t(" and "),e("code",null,"ingredients"),t(") \u2014 this is called a relationship. There are several different types of relationships, but only some (M2M and M2A) require an additional collection to properly connect data. For instance, if you have a "),e("code",null,"recipes"),t(" collection and an "),e("code",null,"ingredients"),t(" collection, you would also need a "),e("code",null,"recipe_ingredients"),t(" junction collection to sit between and connect the two.")],-1),ce=e("h2",{id:"layouts",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#layouts"},"#"),t(" Layouts")],-1),ue=e("p",null,"Layouts determine how you view or interact with a Collection. In most cases, they offer a way to browse items based on a specific type of data, but can also be used to visualize or interact with data. Directus includes several Layout options out-of-the-box, each with different features and configuration options.",-1),he=e("ul",null,[e("li",null,[e("strong",null,"Table"),t(" \u2014 Works with any type of data, showing items as rows and their fields as columns.")]),e("li",null,[e("strong",null,"Cards"),t(" \u2014 Ideal for image data, this layout shows items as a grid of image cards.")]),e("li",null,[e("strong",null,"Calendar"),t(" \u2014 Ideal for \u201Ctemporal\u201D data that is sorted by date or datetime.")]),e("li",null,[e("strong",null,"Map"),t(" \u2014 Ideal for \u201Cgeospatial\u201D data that is shown on a world map.")])],-1),pe=e("p",null,"In addition to these core layouts, custom layouts allow for creating more tailored or proprietary ways to experience data within the App, such as Gantt charts, seating maps, or spreadsheets.",-1),fe=e("h3",{id:"relevant-guides-5",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-5"},"#"),t(" Relevant Guides")],-1),me=e("h2",{id:"modules",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#modules"},"#"),t(" Modules")],-1),ge=e("p",null,"Modules are the highest and broadest level of organization within the App. There are several modules included out-of-the-box, however you can also add your own.",-1),ye=e("p",null,[t("In addition to these core modules, custom modules offer a "),e("em",null,"blank canvas"),t(" for creating altogether new/different experiences within the App, such as proprietary dashboards, compound datasets, or third-party integrations (e.g., a Stripe Payments Console).")],-1),_e=e("h3",{id:"relevant-guides-6",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-6"},"#"),t(" Relevant Guides")],-1),be=e("h2",{id:"multitenancy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#multitenancy"},"#"),t(" Multitenancy")],-1),ve=e("p",null,"Multitenancy is an architecture that allows multiple tenants (e.g., customers) to be managed by the platform. There are two main ways to achieve multitenancy:",-1),we=e("ul",null,[e("li",null,[e("strong",null,"Project Scoping"),t(" \u2014 Creating a super-admin layer that provisions new tenant projects has been made easier by the Cloud-native model of Directus 9+. This method involves developing custom code that can dynamically spin up/down projects, but is also the most flexible, supporting scoped extensions and differentiated project settings.")]),e("li",null,[e("strong",null,"Role Scoping"),t(" \u2014 In this method, you create one Role per tenant, and configure their permissions to properly scope them within a single project. This direction allows for tenants to share a single schema using "),e("em",null,"item"),t(" scoped permissions, or different schemas by using "),e("em",null,"collection"),t(" scoped permissions.")])],-1),xe=e("h2",{id:"panels",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#panels"},"#"),t(" Panels")],-1),Ae=e("a",{href:"#dashboards"},"Dashboard",-1),ke=e("h3",{id:"relevant-guides-7",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-7"},"#"),t(" Relevant Guides")],-1),Ie=e("h2",{id:"permissions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#permissions"},"#"),t(" Permissions")],-1),Te=e("p",null,"Permissions are attached directly to a Role, defining what a user can create, read, update, and delete within the platform. Extremely granular, these filter-based permissions control access for the entire system.",-1),Ce=e("h2",{id:"presets",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#presets"},"#"),t(" Presets")],-1),De=e("p",null,[t("Presets store the exact state of a "),e("a",{href:"#collections"},"collection page"),t(". They are used to set layout defaults for a user, or to define bookmarks that can be used to quickly recall specific datasets.")],-1),je=e("h4",{id:"relevant-guides-8",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-8"},"#"),t(" Relevant Guides")],-1),Se=e("h2",{id:"primary-key-(pk)",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#primary-key-(pk)"},"#"),t(" Primary Key (PK)")],-1),Pe=e("p",null,[t("When we\u2019re trying to view or reference a specific "),e("a",{href:"#items"},"Item"),t(" within a "),e("a",{href:"#collections"},"Collection"),t(", you need some sort of unique identifier to know exactly where to look. Much like an address for a house, the primary key field provides the location of an item within its collection. For that reason, every collection must have a primary key field, and so they are configured when you create the collection. There are different types of identifiers you can use, but the field is often called "),e("code",null,"id"),t(".")],-1),Fe=e("h2",{id:"projects",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#projects"},"#"),t(" Projects")],-1),Re=e("p",null,[t("A Project is a complete instance of the platform. Each project represents a "),e("strong",null,"Database"),t(", but also encapsulates a config file, asset storage, and any custom extensions. Projects are the highest level of organization in Directus.")],-1),Me=e("h2",{id:"relationships",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relationships"},"#"),t(" Relationships")],-1),Le=e("code",null,"recipes",-1),ze=e("code",null,"ingredients",-1),Be=e("em",null,"relational",-1),Ee=e("h2",{id:"revisions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#revisions"},"#"),t(" Revisions")],-1),Ge=e("p",null,"Revisions are created whenever an Item is updated. These alternate versions are tracked so that previous states can be recovered. Every change made to items in Directus is stored as a complete versioned snapshot and a set of specific changes made (the delta). The revisions system is tightly coupled to the activity logs system, with each revision linked to the activity event where it was created.",-1),qe=e("h2",{id:"roles",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#roles"},"#"),t(" Roles")],-1),Ue=e("p",null,"Roles define a specific set of access permissions, and are the primary organizational structure for Users within the platform. You can create an unlimited number of roles, so organize your users in whatever way feels most appropriate.",-1),Qe=e("p",null,[t("During the installation process, Directus automatically creates an \u201CAdministrators\u201D Role, which is used to provide the initial admin user with full platform access. However this is just a "),e("em",null,"normal"),t(" role, and so it can still be updated, renamed, or even deleted. Keep in mind that your project must maintain at least one role with Admin Access at all times.")],-1),Oe=e("p",null,"There is also a \u201CPublic\u201D role that determines access for unauthenticated access.",-1),We=e("h3",{id:"relevant-guides-9",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-9"},"#"),t(" Relevant Guides")],-1),Ne=e("h2",{id:"singleton",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#singleton"},"#"),t(" Singleton")],-1),Ve=e("ul",null,[e("li",null,[e("strong",null,"Directus"),t(" - A collection that only contains one single item")]),e("li",null,[e("a",{href:"https://www.patterns.dev/posts/singleton-pattern/",target:"_blank",rel:"noopener noreferrer"},[e("strong",null,"Design pattern")]),t(" - Classes which can be instantiated once and can be accessed globally. This single instance can be shared throughout our application, which makes singletons great for managing global state in an application.")])],-1),He=e("h2",{id:"storage-adapters",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#storage-adapters"},"#"),t(" Storage Adapters")],-1),Ye=e("p",null,"Storage adapters allow project files to be stored in different locations or services. By default, Directus includes the following drivers:",-1),Ke=e("ul",null,[e("li",null,[e("strong",null,"Local Filesystem"),t(" \u2014 The default, any file system location or network-attached storage")]),e("li",null,[e("strong",null,"S3 or Equivalent"),t(" \u2014 Including AWS S3, DigitalOcean Spaces, Alibaba OSS, and others")]),e("li",null,[e("strong",null,"Google Cloud Storage"),t(" \u2014 A RESTful web service on the Google Cloud Platform")]),e("li",null,[e("strong",null,"Azure Blob Storage"),t(" \u2014 Azure storage account containers")])],-1),Je=e("h2",{id:"title-formatter",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#title-formatter"},"#"),t(" Title Formatter")],-1),Xe=e("p",null,[t("Special Casing \u2014 If you are trying to update the specific casing (uppercase/lowercase) for a word (e.g., "),e("code",null,"Dna"),t(" to "),e("code",null,"DNA"),t(") you will want to add the edge-case to the "),e("a",{href:"https://github.com/directus/format-title",target:"_blank",rel:"noopener noreferrer"},"Format Title package"),t(". If you feel the case passes our "),e("a",{href:"https://docs.directus.io/contributing/introduction#feature-requests",target:"_blank",rel:"noopener noreferrer"},"80/20 rule"),t(" you should submit a Pull Request to the codebase, otherwise you can update this in your instance.")],-1),Ze=e("h2",{id:"translations",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#translations"},"#"),t(" Translations")],-1),$e=e("p",null,[t("The platform supports internationalization across its entire Admin App. Many languages are currently supported, with more being added all the time. Anyone can add or refine any languages through the integration with "),e("a",{href:"https://locales.directus.io",target:"_blank",rel:"noopener noreferrer"},"CrowdIn"),t(".")],-1),et=e("p",null,"In addition to the App itself being multilingual, the platform allows translating your schema too. By default, collections and field names come from the database\u2019s naming, but you can override this in different languages.",-1),tt=e("p",null,"The platform also includes different ways to manage multilingual content. The built-in translation interface supports authoring content in any number of languages, side-by-side reference editing, and mixing in language agnostic content (such as dates or toggles).",-1),at=e("h2",{id:"types",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#types"},"#"),t(" Types")],-1),st=e("p",null,"The \u201Ctype\u201D defines how field content is stored in the database and how it is returned by the API. Often called a data-type, these are important in ensuring field values are saved in a standardized format. Changing a field\u2019s type can cause data loss, so types are locked within the platform after a field is created.",-1),ot=e("h3",{id:"data-type-superset",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#data-type-superset"},"#"),t(" Data Type Superset")],-1),nt=e("p",null,[t("Directus uses its built-in database abstraction to properly support all the different SQL vendors. However, these vendors do not share support for the same data types, instead, each SQL vendor maintains their own list. To standardize all of these differences, Directus has a single "),e("em",null,"superset"),t(" of types that map to the vendor-specific ones.")],-1),it=e("ul",null,[e("li",null,[e("strong",null,"String"),t(" \u2014 A shorter set of characters with a configurable max length")]),e("li",null,[e("strong",null,"Text"),t(" \u2014 A longer set of characters with no real-world max length")]),e("li",null,[e("strong",null,"Boolean"),t(" \u2014 A True or False value")]),e("li",null,[e("strong",null,"Binary"),t(" \u2014 The data of a binary file")]),e("li",null,[e("strong",null,"Integer"),t(" \u2014 A number without a decimal point")]),e("li",null,[e("strong",null,"Big Integer"),t(" \u2014 A larger number without a decimal point")]),e("li",null,[e("strong",null,"Float"),t(" \u2014 A less exact number with a floating decimal point")]),e("li",null,[e("strong",null,"Decimal"),t(" \u2014 A higher precision, exact decimal number often used in finances")]),e("li",null,[e("strong",null,"Timestamp"),t(" \u2014 A date, time, and timezone saved in ISO 8601 format")]),e("li",null,[e("strong",null,"DateTime"),t(" \u2014 A date and time saved in the database vendor\u2019s format")]),e("li",null,[e("strong",null,"Date"),t(" \u2014 A date saved in the database vendor\u2019s format")]),e("li",null,[e("strong",null,"Time"),t(" \u2014 A time saved in the database vendor\u2019s format")]),e("li",null,[e("strong",null,"JSON"),t(" \u2014 A value nested in JavaScript Object Notation")]),e("li",null,[e("strong",null,"CSV"),t(" \u2014 A comma-separated value, returned as an array of strings")]),e("li",null,[e("strong",null,"UUID"),t(" \u2014 A universally unique identifier saved in UUIDv4 format")]),e("li",null,[e("strong",null,"Hash"),t(" \u2014 A string hashed using argon2 cryptographic hash algorithm")]),e("li",null,[e("strong",null,"Alias"),t(" \u2014 For fields that do not have a database column "),e("a",{href:"#"},"Learn More")])],-1),lt=e("div",{class:"warning hint"},[e("p",null,[t("For "),e("strong",null,"SQLite"),t(", the "),e("strong",null,"Timestamp"),t(" type is stored as a "),e("strong",null,"DateTime"),t(".")])],-1),rt=e("h2",{id:"users",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#users"},"#"),t(" Users")],-1),dt=e("p",null,[t("An active User is required to access a project. Each user is assigned to a "),e("a",{href:"#roles"},"Role"),t(" that determines what they have access to see and do. This means that the experience of users may vary significantly depending on their role\u2019s permissions.")],-1),ft="Glossary",mt=!1,gt="A glossary of key Directus terminology.",yt="15 min read",_t={__name:"glossary",setup(ct,{expose:l}){const n={title:"Glossary",modularExtension:!1,description:"A glossary of key Directus terminology.",readTime:"15 min read"};return l({frontmatter:n}),(ut,ht)=>{const s=i("router-link"),r=i("docs-wrapper");return d(),c(r,{frontmatter:n},{default:a(()=>[e("div",u,[h,p,f,m,e("p",null,[g,t(" that do not map directly to an actual database column are called \u201Calias\u201D fields. For example, presentation fields (such as dividers and groups) and certain relational types that display data stored elsewhere (such as "),o(s,{to:"/docs/configuration/data-model/relationships#one-to-many-o2m"},{default:a(()=>[t("One-to-Many (O2M)")]),_:1}),t(" and "),o(s,{to:"/docs/configuration/data-model/relationships#many-to-many-m2m"},{default:a(()=>[t("Many-to-Many (M2M)")]),_:1}),t(").")]),y,_,b,v,w,x,A,e("p",null,[t("Collections are containers for specific types of Items and contain any number of fields. Each collection represents a "),k,t(" in your database. By default, the "),I,t(" is used to display any existing database table names as human-readable collection titles. There are also \u201Cfolder\u201D collections that are "),o(s,{to:"/docs/configuration/data-model#sorting-grouping"},{default:a(()=>[t("exclusively used for organizational purposes")]),_:1}),t(", and don\u2019t hold any data themselves.")]),T,C,D,e("ul",null,[e("li",null,[o(s,{to:"/docs/configuration/data-model#creating-a-collection"},{default:a(()=>[t("Creating a Collection")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/data-model#configuring-a-collection"},{default:a(()=>[t("Configuring a Collection")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/data-model#deleting-a-collection"},{default:a(()=>[t("Deleting a Collection")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/data-model#adjusting-a-collection-layout"},{default:a(()=>[t("Adjusting a Collection Layout")]),_:1})])]),j,S,P,F,R,M,L,z,B,E,G,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/displays"},{default:a(()=>[t("Creating a Custom Display")]),_:1})])]),q,U,Q,e("p",null,[t("The platform has been built to be modular and extensible. This helps keep the core codebase simple and clean (see the "),o(s,{to:"/docs/contributing/introduction#feature-requests"},{default:a(()=>[t("80/20 Rule")]),_:1}),t("), while allowing the flexibility needed to satisfy all use-cases\u2026 no matter how complex. There are many different types of supported extensions, each offering a way to deeply customize, override, or extend the core platform. "),o(s,{to:"/docs/extensions/introduction"},{default:a(()=>[t("Learn more about Extensions")]),_:1}),t(".")]),O,W,N,e("ul",null,[e("li",null,[o(s,{to:"/docs/reference/system/fields#creating-a-field"},{default:a(()=>[t("Creating a Field")]),_:1})]),e("li",null,[o(s,{to:"/docs/reference/system/fields#duplicating-a-field"},{default:a(()=>[t("Duplicating Fields")]),_:1})]),e("li",null,[o(s,{to:"/docs/reference/system/fields#adjusting-field-layout"},{default:a(()=>[t("Adjusting Field Layout")]),_:1})]),e("li",null,[o(s,{to:"/docs/reference/system/fields#deleting-a-field"},{default:a(()=>[t("Deleting Fields")]),_:1})])]),V,H,Y,K,J,X,Z,$,ee,te,ae,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/interfaces"},{default:a(()=>[t("Creating a Custom Interface")]),_:1})])]),se,oe,ne,ie,le,e("ul",null,[e("li",null,[o(s,{to:"/docs/app/content/items#create-an-item"},{default:a(()=>[t("Creating an Item")]),_:1})]),e("li",null,[o(s,{to:"/docs/app/content/items#archive-an-item"},{default:a(()=>[t("Archiving an Item")]),_:1})]),e("li",null,[o(s,{to:"/docs/app/content/collections#manually-sort-items"},{default:a(()=>[t("Manually Sorting Items")]),_:1})]),e("li",null,[o(s,{to:"/docs/app/content/items#delete-an-item"},{default:a(()=>[t("Deleting an Item")]),_:1})])]),re,de,ce,ue,he,pe,fe,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/layouts"},{default:a(()=>[t("Creating a Custom Layout")]),_:1})])]),me,ge,e("p",null,[t("The "),o(s,{to:"/docs/app/overview#_1-module-bar"},{default:a(()=>[t("Module Bar")]),_:1}),t(" lists all available Modules and allows you to switch between them. Each module also controls its own navigation bar to provide tailored access to sub-pages. All core functionality within the App can be bucketed into one of the following modules:")]),e("ul",null,[e("li",null,[o(s,{to:"/docs/app/content/collections"},{default:a(()=>[t("Content")]),_:1}),t(" \u2014 The primary way to view and interact with database content")]),e("li",null,[o(s,{to:"/docs/app/user-directory"},{default:a(()=>[t("User Directory")]),_:1}),t(" \u2014 A dedicated section for the platform\u2019s system Users")]),e("li",null,[o(s,{to:"/docs/app/file-library"},{default:a(()=>[t("File Library")]),_:1}),t(" \u2014 An aggregate of all files uploaded and managed within the platform")]),e("li",null,[o(s,{to:"/docs/app/insights"},{default:a(()=>[t("Insights")]),_:1}),t(" \u2014 Access to infinitely customizable data dashboards")]),e("li",null,[o(s,{to:"/docs/app/overview"},{default:a(()=>[t("App Guide")]),_:1}),t(" \u2014 A tailored, in-app portal for the platform\u2019s concepts, guides, and reference")]),e("li",null,[o(s,{to:"/docs/app/settings"},{default:a(()=>[t("Settings")]),_:1}),t(" \u2014 An admin-only section for configuring the project and system settings")])]),ye,_e,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/modules"},{default:a(()=>[t("Creating a Custom Module")]),_:1})])]),be,ve,we,xe,e("p",null,[t("Panels are modular units of data visualization that exist within the "),o(s,{to:"/docs/app/insights"},{default:a(()=>[t("Insights module")]),_:1}),t(". Each panel exists within a "),Ae,t(" and can be positioned and resized as needed.")]),ke,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/panels"},{default:a(()=>[t("Creating a Custom Panel")]),_:1})])]),Ie,Te,Ce,De,je,e("ul",null,[e("li",null,[o(s,{to:"/docs/reference/system/presets#create-a-preset"},{default:a(()=>[t("Creating a Preset")]),_:1})]),e("li",null,[o(s,{to:"/docs/reference/system/presets#delete-a-preset"},{default:a(()=>[t("Deleting a Preset")]),_:1})])]),Se,Pe,Fe,Re,e("ul",null,[e("li",null,[o(s,{to:"/docs/self-hosted/installation"},{default:a(()=>[t("Creating a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/config-options"},{default:a(()=>[t("Configuring a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/project-settings"},{default:a(()=>[t("Adjusting Project Settings")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/upgrades-migrations"},{default:a(()=>[t("Upgrading a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/upgrades-migrations#backing-up-a-project"},{default:a(()=>[t("Backing-up a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/upgrades-migrations#migrating-a-project"},{default:a(()=>[t("Migrating a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/upgrades-migrations#deleting-a-project"},{default:a(()=>[t("Deleting a Project")]),_:1})])]),Me,e("p",null,[t("The platform allows you to group Items within different Collections. But often times it is important to \u201Clink\u201D items across different collections (such as relating "),Le,t(" and "),ze,t(") \u2014 this is called a relationship, a crucial concept within any "),Be,t(" database. There are several different types of relationships, each serving a specific purpose. "),o(s,{to:"/docs/configuration/data-model/relationships"},{default:a(()=>[t("Learn more about Relationships")]),_:1}),t(".")]),Ee,Ge,qe,Ue,Qe,Oe,We,e("ul",null,[e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#creating-a-role"},{default:a(()=>[t("Creating a Role")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#configure-a-role"},{default:a(()=>[t("Configuring a Role")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#configure-permissions"},{default:a(()=>[t("Configuring Role Permissions")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#configure-system-permissions"},{default:a(()=>[t("Configuring System Permissions")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#deleting-a-role"},{default:a(()=>[t("Deleting a Role")]),_:1})])]),Ne,Ve,He,Ye,Ke,Je,Xe,Ze,$e,et,tt,at,st,ot,nt,it,lt,rt,dt])]),_:1})}}};export{_t as default,gt as description,mt as modularExtension,yt as readTime,ft as title};
1
+ import{a as i,o as d,e as c,y as a,u as e,q as t,z as o}from"./runtime-core.esm-bundler.22ec0346.js";const u={class:"markdown-body"},h=e("blockquote",null,[e("p",null,"This is list of platform-specific terminology, and their meanings. Most are simply more approachable names for technical database terms.")],-1),p=e("h2",{id:"admin-%2F-administrator",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#admin-%2F-administrator"},"#"),t(" Admin / Administrator")],-1),f=e("p",null,"An \u201CAdministrator\u201D Role (with Admin access enabled) is included when you first install the platform. All admin roles bypass the permissions check, providing unrestricted access to all data within the App and API. Additionally, only roles with the admin option enabled can manage Settings within the app.",-1),m=e("h2",{id:"alias",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#alias"},"#"),t(" Alias")],-1),g=e("a",{href:"#fields"},"Fields",-1),y=e("h2",{id:"api",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#api"},"#"),t(" API")],-1),_=e("p",null,"The Application Programming Interface (API) provided by the platform is how you can programmatically connect your project\u2019s content, files, and system information to external code (like a website) or with other third-party services.",-1),b=e("h2",{id:"app",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#app"},"#"),t(" App")],-1),v=e("p",null,[t("An intuitive no-code application for managing database content. Powered by the API, the modular and highly extensible App is written in "),e("a",{href:"https://vuejs.org",target:"_blank",rel:"noopener noreferrer"},"Vue.js"),t(".")],-1),w=e("h2",{id:"activity",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#activity"},"#"),t(" Activity")],-1),x=e("p",null,"Activity is a log of all events that take place within the platform. Used for accountability, each activity record tracks the event type, user, timestamp, IP address, user-agent, and any associated revision data.",-1),A=e("h2",{id:"collections",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#collections"},"#"),t(" Collections")],-1),k=e("strong",null,"table",-1),T=e("a",{href:"#title-formatter"},"title formatter",-1),C=e("p",null,[t("Collections can be organized in any way that is appropriate for your project. You can architect them platform-specific (e.g., "),e("em",null,"pages"),t(" of a website), or in a more platform-agnostic way (e.g., raw "),e("em",null,"customers"),t(" of your business). While there\u2019s no right or wrong way to structure your data-model, we recommend keeping your data as agnostic as possible so it is easier to repurpose in the future. "),e("strong",null,"In short, learn to see your data as its own asset \u2014 not only through the lens of your immediate project needs"),t(".")],-1),I=e("p",null,[t("The only requirement of a collection is that it must contain a "),e("a",{href:"#primary-key-pk"},"Primary Key"),t(" field. This field stores a unique value that is used to reference the Collection\u2019s items throughout the database/platform.")],-1),D=e("h3",{id:"relevant-guides",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides"},"#"),t(" Relevant Guides")],-1),j=e("h2",{id:"dashboards",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#dashboards"},"#"),t(" Dashboards")],-1),S=e("p",null,[t("Dashboards within the Insights module organize different "),e("a",{href:"#panels"},"Panels"),t(" into an at-a-glance view. They can be used to group data based on department, objective, business process or anything you choose.")],-1),P=e("h2",{id:"database-abstraction",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#database-abstraction"},"#"),t(" Database Abstraction")],-1),F=e("p",null,"Directus supports mirroring all the most widely used SQL databases, including PostgreSQL, MySQL, Microsoft SQL Server, SQLite, OracleDB, MariaDB, CockroachDB, and other variants. Each vendor has subtle (and sometimes not so subtle) differences in how they function, so Directus includes an abstraction layer that helps it avoid writing different code for each type.",-1),R=e("p",null,[t("This means there is also the possibility of supporting other datastores in the future, such as NoSQL options like MongoDB, or even third-party data services like Firebase or Heroku. However these options are "),e("em",null,"fundamentally"),t(" different from the relational SQL databases we currently support, and so more research is needed.")],-1),M=e("h2",{id:"displays",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#displays"},"#"),t(" Displays")],-1),L=e("p",null,[t("Displays are the smaller, read-only counterpart to "),e("a",{href:"#interfaces"},"Interfaces"),t(", defining how a field\u2019s data will be displayed inline throughout the App.")],-1),z=e("p",null,[t("For example, you may have a \u201CStatus\u201D field that uses a "),e("em",null,"Dropdown"),t(" Interface on the Item Detail page, and a smaller "),e("em",null,"Badge"),t(" Display when the field is referenced throughout the rest of the App. Directus includes many Displays out-of-the-box, below are the some key examples:")],-1),B=e("ul",null,[e("li",null,[e("strong",null,"Raw"),t(" \u2014 The exact value, straight from the API")]),e("li",null,[e("strong",null,"Formatted Value"),t(" \u2014 Provides options for string formatting")]),e("li",null,[e("strong",null,"Boolean"),t(" \u2014 Customizable True/False icons")]),e("li",null,[e("strong",null,"Color"),t(" \u2014 A color swatch preview")]),e("li",null,[e("strong",null,"DateTime"),t(" \u2014 Formatted or relative datetimes")]),e("li",null,[e("strong",null,"Image"),t(" \u2014 Thumbnail previews")]),e("li",null,[e("strong",null,"Labels"),t(" \u2014 Small, custom colored badges")]),e("li",null,[e("strong",null,"Rating"),t(" \u2014 Customizable stars")]),e("li",null,[e("strong",null,"Related Values"),t(" \u2014 Displays relational display titles")]),e("li",null,[e("strong",null,"User"),t(" \u2014 Avatar and name of a system user")])],-1),E=e("p",null,"In addition to the included core displays, custom displays allow for creating new and/or proprietary ways to view or represent field data. For example, you could create progress indicators, tooltips for relational data, specific formatting styles, or anything else.",-1),G=e("h3",{id:"relevant-guides-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-1"},"#"),t(" Relevant Guides")],-1),q=e("h2",{id:"environments",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#environments"},"#"),t(" Environments")],-1),U=e("p",null,"Environments (e.g., dev, staging, prod) are tracked as separate Project instances. You can then use schema/content migrations to promote data between them.",-1),Q=e("h2",{id:"extensions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#extensions"},"#"),t(" Extensions")],-1),O=e("h2",{id:"fields",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#fields"},"#"),t(" Fields")],-1),W=e("p",null,[t("Fields are a specific type of value within a Collection, storing the data of your item\u2019s content. Each field represents a "),e("strong",null,"column"),t(" in your database. For example, an "),e("code",null,"articles"),t(),e("a",{href:"#collections"},"Collection"),t(" might have "),e("code",null,"title"),t(", "),e("code",null,"body"),t(", "),e("code",null,"author"),t(", and "),e("code",null,"date_published"),t(" field. Fields mirror the characteristics of their associated column, including its "),e("code",null,"name"),t(", "),e("code",null,"type"),t(", "),e("code",null,"default"),t(", "),e("code",null,"length"),t(", "),e("code",null,"allow_null"),t(", etc.")],-1),N=e("h3",{id:"relevant-guides-2",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-2"},"#"),t(" Relevant Guides")],-1),V=e("h2",{id:"files-%26-assets",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#files-%26-assets"},"#"),t(" Files & Assets")],-1),H=e("p",null,"As you might have guessed, files includes images, videos, PDFs, text documents, or anything else. While files can technically be stored as code in the database, it is far more common to manage them as individual assets on a \u201Cdrive\u201D. The platform supports many options for uploading, storing, transforming, and retrieving different types of files, and it is an excellent Digital Asset Management system.",-1),Y=e("h2",{id:"icons",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#icons"},"#"),t(" Icons")],-1),K=e("h3",{id:"material-icons",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#material-icons"},"#"),t(" Material Icons")],-1),J=e("p",null,[t("Full list of icons "),e("a",{href:"https://fonts.google.com/icons",target:"_blank",rel:"noopener noreferrer"},"can be found here"),t(". Directus supports both filled & outlined variants of Material icons.")],-1),X=e("h3",{id:"social-icons",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#social-icons"},"#"),t(" Social Icons")],-1),Z=e("p",null,[t("They are Font Awesome 5\u2019s brands icons. Full list of icons "),e("a",{href:"https://fontawesome.com/v5.15/icons?d=gallery&s=brands",target:"_blank",rel:"noopener noreferrer"},"can be found here"),t(". When using them as one of the auth provider icons, make sure to use underscores, such as "),e("code",null,"blogger_b"),t(" for "),e("a",{href:"https://fontawesome.com/v5.15/icons/blogger-b?style=brands",target:"_blank",rel:"noopener noreferrer"},"blogger-b"),t(" icon.")],-1),$=e("h2",{id:"interfaces",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#interfaces"},"#"),t(" Interfaces")],-1),ee=e("p",null,"Interfaces determine how you view or interact with a field. In most cases, they offer some sort of input tailored to managing data of a specific type, but can also be used exclusively for presentation. Examples include text inputs, toggles, WYSIWYG editors, dropdowns, sliders, image galleries, and more.",-1),te=e("p",null,[t("In addition to the many core interfaces included out-of-the-box, "),e("em",null,"custom"),t(" interfaces allow for creating more tailored or proprietary options, such as seating charts, QR codes, or Stripe customer info.")],-1),ae=e("h3",{id:"relevant-guides-3",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-3"},"#"),t(" Relevant Guides")],-1),se=e("h2",{id:"items",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#items"},"#"),t(" Items")],-1),oe=e("p",null,[t("Items are objects within a Collection which contain values for one or more fields. Each collection represents a "),e("strong",null,"record"),t(" in your database.")],-1),ne=e("p",null,"Items are the primary building blocks of your project content. Similar to a \u201Crow\u201D within a spreadsheet, all data within the platform is accessed via these \u201Catomic\u201D data units. Items themselves are fairly straightforward, however their real power comes from the complexity that begins to form when items are relationally connected to each other.",-1),ie=e("p",null,[t("Items are referenced (both individually and relationally) by their unique "),e("a",{href:"#primary-key-pk"},"primary key"),t(".")],-1),le=e("h4",{id:"relevant-guides-4",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-4"},"#"),t(" Relevant Guides")],-1),re=e("h2",{id:"junction-collections",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#junction-collections"},"#"),t(" Junction Collections")],-1),de=e("p",null,[t("The platform allows you to group Items within different Collections. But often times it is important to \u201Clink\u201D items across different collections (such as relating "),e("code",null,"recipes"),t(" and "),e("code",null,"ingredients"),t(") \u2014 this is called a relationship. There are several different types of relationships, but only some (M2M and M2A) require an additional collection to properly connect data. For instance, if you have a "),e("code",null,"recipes"),t(" collection and an "),e("code",null,"ingredients"),t(" collection, you would also need a "),e("code",null,"recipe_ingredients"),t(" junction collection to sit between and connect the two.")],-1),ce=e("h2",{id:"layouts",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#layouts"},"#"),t(" Layouts")],-1),ue=e("p",null,"Layouts determine how you view or interact with a Collection. In most cases, they offer a way to browse items based on a specific type of data, but can also be used to visualize or interact with data. Directus includes several Layout options out-of-the-box, each with different features and configuration options.",-1),he=e("ul",null,[e("li",null,[e("strong",null,"Table"),t(" \u2014 Works with any type of data, showing items as rows and their fields as columns.")]),e("li",null,[e("strong",null,"Cards"),t(" \u2014 Ideal for image data, this layout shows items as a grid of image cards.")]),e("li",null,[e("strong",null,"Calendar"),t(" \u2014 Ideal for \u201Ctemporal\u201D data that is sorted by date or datetime.")]),e("li",null,[e("strong",null,"Map"),t(" \u2014 Ideal for \u201Cgeospatial\u201D data that is shown on a world map.")])],-1),pe=e("p",null,"In addition to these core layouts, custom layouts allow for creating more tailored or proprietary ways to experience data within the App, such as Gantt charts, seating maps, or spreadsheets.",-1),fe=e("h3",{id:"relevant-guides-5",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-5"},"#"),t(" Relevant Guides")],-1),me=e("h2",{id:"modules",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#modules"},"#"),t(" Modules")],-1),ge=e("p",null,"Modules are the highest and broadest level of organization within the App. There are several modules included out-of-the-box, however you can also add your own.",-1),ye=e("p",null,[t("In addition to these core modules, custom modules offer a "),e("em",null,"blank canvas"),t(" for creating altogether new/different experiences within the App, such as proprietary dashboards, compound datasets, or third-party integrations (e.g., a Stripe Payments Console).")],-1),_e=e("h3",{id:"relevant-guides-6",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-6"},"#"),t(" Relevant Guides")],-1),be=e("h2",{id:"multitenancy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#multitenancy"},"#"),t(" Multitenancy")],-1),ve=e("p",null,"Multitenancy is an architecture that allows multiple tenants (e.g., customers) to be managed by the platform. There are two main ways to achieve multitenancy:",-1),we=e("ul",null,[e("li",null,[e("strong",null,"Project Scoping"),t(" \u2014 Creating a super-admin layer that provisions new tenant projects has been made easier by the Cloud-native model of Directus 9+. This method involves developing custom code that can dynamically spin up/down projects, but is also the most flexible, supporting scoped extensions and differentiated project settings.")]),e("li",null,[e("strong",null,"Role Scoping"),t(" \u2014 In this method, you create one Role per tenant, and configure their permissions to properly scope them within a single project. This direction allows for tenants to share a single schema using "),e("em",null,"item"),t(" scoped permissions, or different schemas by using "),e("em",null,"collection"),t(" scoped permissions.")])],-1),xe=e("h2",{id:"panels",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#panels"},"#"),t(" Panels")],-1),Ae=e("a",{href:"#dashboards"},"Dashboard",-1),ke=e("h3",{id:"relevant-guides-7",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-7"},"#"),t(" Relevant Guides")],-1),Te=e("h2",{id:"permissions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#permissions"},"#"),t(" Permissions")],-1),Ce=e("p",null,"Permissions are attached directly to a Role, defining what a user can create, read, update, and delete within the platform. Extremely granular, these filter-based permissions control access for the entire system.",-1),Ie=e("h2",{id:"presets",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#presets"},"#"),t(" Presets")],-1),De=e("p",null,[t("Presets store the exact state of a "),e("a",{href:"#collections"},"collection page"),t(". They are used to set layout defaults for a user, or to define bookmarks that can be used to quickly recall specific datasets.")],-1),je=e("h4",{id:"relevant-guides-8",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-8"},"#"),t(" Relevant Guides")],-1),Se=e("h2",{id:"primary-key-(pk)",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#primary-key-(pk)"},"#"),t(" Primary Key (PK)")],-1),Pe=e("p",null,[t("When we\u2019re trying to view or reference a specific "),e("a",{href:"#items"},"Item"),t(" within a "),e("a",{href:"#collections"},"Collection"),t(", you need some sort of unique identifier to know exactly where to look. Much like an address for a house, the primary key field provides the location of an item within its collection. For that reason, every collection must have a primary key field, and so they are configured when you create the collection. There are different types of identifiers you can use, but the field is often called "),e("code",null,"id"),t(".")],-1),Fe=e("h2",{id:"projects",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#projects"},"#"),t(" Projects")],-1),Re=e("p",null,[t("A Project is a complete instance of the platform. Each project represents a "),e("strong",null,"Database"),t(", but also encapsulates a config file, asset storage, and any custom extensions. Projects are the highest level of organization in Directus.")],-1),Me=e("h2",{id:"relationships",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relationships"},"#"),t(" Relationships")],-1),Le=e("code",null,"recipes",-1),ze=e("code",null,"ingredients",-1),Be=e("em",null,"relational",-1),Ee=e("h2",{id:"revisions",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#revisions"},"#"),t(" Revisions")],-1),Ge=e("p",null,"Revisions are created whenever an Item is updated. These alternate versions are tracked so that previous states can be recovered. Every change made to items in Directus is stored as a complete versioned snapshot and a set of specific changes made (the delta). The revisions system is tightly coupled to the activity logs system, with each revision linked to the activity event where it was created.",-1),qe=e("h2",{id:"roles",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#roles"},"#"),t(" Roles")],-1),Ue=e("p",null,"Roles define a specific set of access permissions, and are the primary organizational structure for Users within the platform. You can create an unlimited number of roles, so organize your users in whatever way feels most appropriate.",-1),Qe=e("p",null,[t("During the installation process, Directus automatically creates an \u201CAdministrators\u201D Role, which is used to provide the initial admin user with full platform access. However this is just a "),e("em",null,"normal"),t(" role, and so it can still be updated, renamed, or even deleted. Keep in mind that your project must maintain at least one role with Admin Access at all times.")],-1),Oe=e("p",null,"There is also a \u201CPublic\u201D role that determines access for unauthenticated access.",-1),We=e("h3",{id:"relevant-guides-9",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#relevant-guides-9"},"#"),t(" Relevant Guides")],-1),Ne=e("h2",{id:"singleton",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#singleton"},"#"),t(" Singleton")],-1),Ve=e("ul",null,[e("li",null,[e("strong",null,"Directus"),t(" - A collection that only contains one single item")]),e("li",null,[e("a",{href:"https://www.patterns.dev/posts/singleton-pattern/",target:"_blank",rel:"noopener noreferrer"},[e("strong",null,"Design pattern")]),t(" - Classes which can be instantiated once and can be accessed globally. This single instance can be shared throughout our application, which makes singletons great for managing global state in an application.")])],-1),He=e("h2",{id:"storage-adapters",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#storage-adapters"},"#"),t(" Storage Adapters")],-1),Ye=e("p",null,"Storage adapters allow project files to be stored in different locations or services. By default, Directus includes the following drivers:",-1),Ke=e("ul",null,[e("li",null,[e("strong",null,"Local Filesystem"),t(" \u2014 The default, any file system location or network-attached storage")]),e("li",null,[e("strong",null,"S3 or Equivalent"),t(" \u2014 Including AWS S3, DigitalOcean Spaces, Alibaba OSS, and others")]),e("li",null,[e("strong",null,"Google Cloud Storage"),t(" \u2014 A RESTful web service on the Google Cloud Platform")]),e("li",null,[e("strong",null,"Azure Blob Storage"),t(" \u2014 Azure storage account containers")])],-1),Je=e("h2",{id:"title-formatter",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#title-formatter"},"#"),t(" Title Formatter")],-1),Xe=e("p",null,[t("Special Casing \u2014 If you are trying to update the specific casing (uppercase/lowercase) for a word (e.g., "),e("code",null,"Dna"),t(" to "),e("code",null,"DNA"),t(") you will want to add the edge-case to the "),e("a",{href:"https://github.com/directus/format-title",target:"_blank",rel:"noopener noreferrer"},"Format Title package"),t(". If you feel the case passes our "),e("a",{href:"https://docs.directus.io/contributing/introduction#feature-requests",target:"_blank",rel:"noopener noreferrer"},"80/20 rule"),t(" you should submit a Pull Request to the codebase, otherwise you can update this in your instance.")],-1),Ze=e("h2",{id:"translations",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#translations"},"#"),t(" Translations")],-1),$e=e("p",null,[t("The platform supports internationalization across its entire Admin App. Many languages are currently supported, with more being added all the time. Anyone can add or refine any languages through the integration with "),e("a",{href:"https://locales.directus.io",target:"_blank",rel:"noopener noreferrer"},"Crowdin"),t(".")],-1),et=e("p",null,"In addition to the App itself being multilingual, the platform allows translating your schema too. By default, collections and field names come from the database\u2019s naming, but you can override this in different languages.",-1),tt=e("p",null,"The platform also includes different ways to manage multilingual content. The built-in translation interface supports authoring content in any number of languages, side-by-side reference editing, and mixing in language agnostic content (such as dates or toggles).",-1),at=e("h2",{id:"types",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#types"},"#"),t(" Types")],-1),st=e("p",null,"The \u201Ctype\u201D defines how field content is stored in the database and how it is returned by the API. Often called a data-type, these are important in ensuring field values are saved in a standardized format. Changing a field\u2019s type can cause data loss, so types are locked within the platform after a field is created.",-1),ot=e("h3",{id:"data-type-superset",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#data-type-superset"},"#"),t(" Data Type Superset")],-1),nt=e("p",null,[t("Directus uses its built-in database abstraction to properly support all the different SQL vendors. However, these vendors do not share support for the same data types, instead, each SQL vendor maintains their own list. To standardize all of these differences, Directus has a single "),e("em",null,"superset"),t(" of types that map to the vendor-specific ones.")],-1),it=e("ul",null,[e("li",null,[e("strong",null,"String"),t(" \u2014 A shorter set of characters with a configurable max length")]),e("li",null,[e("strong",null,"Text"),t(" \u2014 A longer set of characters with no real-world max length")]),e("li",null,[e("strong",null,"Boolean"),t(" \u2014 A True or False value")]),e("li",null,[e("strong",null,"Binary"),t(" \u2014 The data of a binary file")]),e("li",null,[e("strong",null,"Integer"),t(" \u2014 A number without a decimal point")]),e("li",null,[e("strong",null,"Big Integer"),t(" \u2014 A larger number without a decimal point")]),e("li",null,[e("strong",null,"Float"),t(" \u2014 A less exact number with a floating decimal point")]),e("li",null,[e("strong",null,"Decimal"),t(" \u2014 A higher precision, exact decimal number often used in finances")]),e("li",null,[e("strong",null,"Timestamp"),t(" \u2014 A date, time, and timezone saved in ISO 8601 format")]),e("li",null,[e("strong",null,"DateTime"),t(" \u2014 A date and time saved in the database vendor\u2019s format")]),e("li",null,[e("strong",null,"Date"),t(" \u2014 A date saved in the database vendor\u2019s format")]),e("li",null,[e("strong",null,"Time"),t(" \u2014 A time saved in the database vendor\u2019s format")]),e("li",null,[e("strong",null,"JSON"),t(" \u2014 A value nested in JavaScript Object Notation")]),e("li",null,[e("strong",null,"CSV"),t(" \u2014 A comma-separated value, returned as an array of strings")]),e("li",null,[e("strong",null,"UUID"),t(" \u2014 A universally unique identifier saved in UUIDv4 format")]),e("li",null,[e("strong",null,"Hash"),t(" \u2014 A string hashed using argon2 cryptographic hash algorithm")]),e("li",null,[e("strong",null,"Alias"),t(" \u2014 For fields that do not have a database column "),e("a",{href:"#"},"Learn More")])],-1),lt=e("div",{class:"warning hint"},[e("p",null,[t("For "),e("strong",null,"SQLite"),t(", the "),e("strong",null,"Timestamp"),t(" type is stored as a "),e("strong",null,"DateTime"),t(".")])],-1),rt=e("h2",{id:"users",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#users"},"#"),t(" Users")],-1),dt=e("p",null,[t("An active User is required to access a project. Each user is assigned to a "),e("a",{href:"#roles"},"Role"),t(" that determines what they have access to see and do. This means that the experience of users may vary significantly depending on their role\u2019s permissions.")],-1),ft="Glossary",mt=!1,gt="A glossary of key Directus terminology.",yt="15 min read",_t={__name:"glossary",setup(ct,{expose:l}){const n={title:"Glossary",modularExtension:!1,description:"A glossary of key Directus terminology.",readTime:"15 min read"};return l({frontmatter:n}),(ut,ht)=>{const s=i("router-link"),r=i("docs-wrapper");return d(),c(r,{frontmatter:n},{default:a(()=>[e("div",u,[h,p,f,m,e("p",null,[g,t(" that do not map directly to an actual database column are called \u201Calias\u201D fields. For example, presentation fields (such as dividers and groups) and certain relational types that display data stored elsewhere (such as "),o(s,{to:"/docs/configuration/data-model/relationships#one-to-many-o2m"},{default:a(()=>[t("One-to-Many (O2M)")]),_:1}),t(" and "),o(s,{to:"/docs/configuration/data-model/relationships#many-to-many-m2m"},{default:a(()=>[t("Many-to-Many (M2M)")]),_:1}),t(").")]),y,_,b,v,w,x,A,e("p",null,[t("Collections are containers for specific types of Items and contain any number of fields. Each collection represents a "),k,t(" in your database. By default, the "),T,t(" is used to display any existing database table names as human-readable collection titles. There are also \u201Cfolder\u201D collections that are "),o(s,{to:"/docs/configuration/data-model#sorting-grouping"},{default:a(()=>[t("exclusively used for organizational purposes")]),_:1}),t(", and don\u2019t hold any data themselves.")]),C,I,D,e("ul",null,[e("li",null,[o(s,{to:"/docs/configuration/data-model#creating-a-collection"},{default:a(()=>[t("Creating a Collection")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/data-model#configuring-a-collection"},{default:a(()=>[t("Configuring a Collection")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/data-model#deleting-a-collection"},{default:a(()=>[t("Deleting a Collection")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/data-model#adjusting-a-collection-layout"},{default:a(()=>[t("Adjusting a Collection Layout")]),_:1})])]),j,S,P,F,R,M,L,z,B,E,G,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/displays"},{default:a(()=>[t("Creating a Custom Display")]),_:1})])]),q,U,Q,e("p",null,[t("The platform has been built to be modular and extensible. This helps keep the core codebase simple and clean (see the "),o(s,{to:"/docs/contributing/introduction#feature-requests"},{default:a(()=>[t("80/20 Rule")]),_:1}),t("), while allowing the flexibility needed to satisfy all use-cases\u2026 no matter how complex. There are many different types of supported extensions, each offering a way to deeply customize, override, or extend the core platform. "),o(s,{to:"/docs/extensions/introduction"},{default:a(()=>[t("Learn more about Extensions")]),_:1}),t(".")]),O,W,N,e("ul",null,[e("li",null,[o(s,{to:"/docs/reference/system/fields#creating-a-field"},{default:a(()=>[t("Creating a Field")]),_:1})]),e("li",null,[o(s,{to:"/docs/reference/system/fields#duplicating-a-field"},{default:a(()=>[t("Duplicating Fields")]),_:1})]),e("li",null,[o(s,{to:"/docs/reference/system/fields#adjusting-field-layout"},{default:a(()=>[t("Adjusting Field Layout")]),_:1})]),e("li",null,[o(s,{to:"/docs/reference/system/fields#deleting-a-field"},{default:a(()=>[t("Deleting Fields")]),_:1})])]),V,H,Y,K,J,X,Z,$,ee,te,ae,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/interfaces"},{default:a(()=>[t("Creating a Custom Interface")]),_:1})])]),se,oe,ne,ie,le,e("ul",null,[e("li",null,[o(s,{to:"/docs/app/content/items#create-an-item"},{default:a(()=>[t("Creating an Item")]),_:1})]),e("li",null,[o(s,{to:"/docs/app/content/items#archive-an-item"},{default:a(()=>[t("Archiving an Item")]),_:1})]),e("li",null,[o(s,{to:"/docs/app/content/collections#manually-sort-items"},{default:a(()=>[t("Manually Sorting Items")]),_:1})]),e("li",null,[o(s,{to:"/docs/app/content/items#delete-an-item"},{default:a(()=>[t("Deleting an Item")]),_:1})])]),re,de,ce,ue,he,pe,fe,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/layouts"},{default:a(()=>[t("Creating a Custom Layout")]),_:1})])]),me,ge,e("p",null,[t("The "),o(s,{to:"/docs/app/overview#_1-module-bar"},{default:a(()=>[t("Module Bar")]),_:1}),t(" lists all available Modules and allows you to switch between them. Each module also controls its own navigation bar to provide tailored access to sub-pages. All core functionality within the App can be bucketed into one of the following modules:")]),e("ul",null,[e("li",null,[o(s,{to:"/docs/app/content/collections"},{default:a(()=>[t("Content")]),_:1}),t(" \u2014 The primary way to view and interact with database content")]),e("li",null,[o(s,{to:"/docs/app/user-directory"},{default:a(()=>[t("User Directory")]),_:1}),t(" \u2014 A dedicated section for the platform\u2019s system Users")]),e("li",null,[o(s,{to:"/docs/app/file-library"},{default:a(()=>[t("File Library")]),_:1}),t(" \u2014 An aggregate of all files uploaded and managed within the platform")]),e("li",null,[o(s,{to:"/docs/app/insights"},{default:a(()=>[t("Insights")]),_:1}),t(" \u2014 Access to infinitely customizable data dashboards")]),e("li",null,[o(s,{to:"/docs/app/overview"},{default:a(()=>[t("App Guide")]),_:1}),t(" \u2014 A tailored, in-app portal for the platform\u2019s concepts, guides, and reference")]),e("li",null,[o(s,{to:"/docs/app/settings"},{default:a(()=>[t("Settings")]),_:1}),t(" \u2014 An admin-only section for configuring the project and system settings")])]),ye,_e,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/modules"},{default:a(()=>[t("Creating a Custom Module")]),_:1})])]),be,ve,we,xe,e("p",null,[t("Panels are modular units of data visualization that exist within the "),o(s,{to:"/docs/app/insights"},{default:a(()=>[t("Insights module")]),_:1}),t(". Each panel exists within a "),Ae,t(" and can be positioned and resized as needed.")]),ke,e("ul",null,[e("li",null,[o(s,{to:"/docs/extensions/panels"},{default:a(()=>[t("Creating a Custom Panel")]),_:1})])]),Te,Ce,Ie,De,je,e("ul",null,[e("li",null,[o(s,{to:"/docs/reference/system/presets#create-a-preset"},{default:a(()=>[t("Creating a Preset")]),_:1})]),e("li",null,[o(s,{to:"/docs/reference/system/presets#delete-a-preset"},{default:a(()=>[t("Deleting a Preset")]),_:1})])]),Se,Pe,Fe,Re,e("ul",null,[e("li",null,[o(s,{to:"/docs/self-hosted/installation"},{default:a(()=>[t("Creating a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/config-options"},{default:a(()=>[t("Configuring a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/project-settings"},{default:a(()=>[t("Adjusting Project Settings")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/upgrades-migrations"},{default:a(()=>[t("Upgrading a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/upgrades-migrations#backing-up-a-project"},{default:a(()=>[t("Backing-up a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/upgrades-migrations#migrating-a-project"},{default:a(()=>[t("Migrating a Project")]),_:1})]),e("li",null,[o(s,{to:"/docs/self-hosted/upgrades-migrations#deleting-a-project"},{default:a(()=>[t("Deleting a Project")]),_:1})])]),Me,e("p",null,[t("The platform allows you to group Items within different Collections. But often times it is important to \u201Clink\u201D items across different collections (such as relating "),Le,t(" and "),ze,t(") \u2014 this is called a relationship, a crucial concept within any "),Be,t(" database. There are several different types of relationships, each serving a specific purpose. "),o(s,{to:"/docs/configuration/data-model/relationships"},{default:a(()=>[t("Learn more about Relationships")]),_:1}),t(".")]),Ee,Ge,qe,Ue,Qe,Oe,We,e("ul",null,[e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#creating-a-role"},{default:a(()=>[t("Creating a Role")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#configure-a-role"},{default:a(()=>[t("Configuring a Role")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#configure-permissions"},{default:a(()=>[t("Configuring Role Permissions")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#configure-system-permissions"},{default:a(()=>[t("Configuring System Permissions")]),_:1})]),e("li",null,[o(s,{to:"/docs/configuration/users-roles-permissions#deleting-a-role"},{default:a(()=>[t("Deleting a Role")]),_:1})])]),Ne,Ve,He,Ye,Ke,Je,Xe,Ze,$e,et,tt,at,st,ot,nt,it,lt,rt,dt])]),_:1})}}};export{_t as default,gt as description,mt as modularExtension,yt as readTime,ft as title};
@@ -0,0 +1 @@
1
+ import{z}from"./index.f8fd6ee3.entry.js";function w(a,d){for(var u=0;u<d.length;u++){const l=d[u];if(typeof l!="string"&&!Array.isArray(l)){for(const o in l)if(o!=="default"&&!(o in a)){const f=Object.getOwnPropertyDescriptor(l,o);f&&Object.defineProperty(a,o,f.get?f:{enumerable:!0,get:()=>l[o]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}var m={exports:{}};(function(a,d){(function(u){u(z.exports)})(function(u){u.defineMode("go",function(l){var o=l.indentUnit,f={break:!0,case:!0,chan:!0,const:!0,continue:!0,default:!0,defer:!0,else:!0,fallthrough:!0,for:!0,func:!0,go:!0,goto:!0,if:!0,import:!0,interface:!0,map:!0,package:!0,range:!0,return:!0,select:!0,struct:!0,switch:!0,type:!0,var:!0,bool:!0,byte:!0,complex64:!0,complex128:!0,float32:!0,float64:!0,int8:!0,int16:!0,int32:!0,int64:!0,string:!0,uint8:!0,uint16:!0,uint32:!0,uint64:!0,int:!0,uint:!0,uintptr:!0,error:!0,rune:!0},v={true:!0,false:!0,iota:!0,nil:!0,append:!0,cap:!0,close:!0,complex:!0,copy:!0,delete:!0,imag:!0,len:!0,make:!0,new:!0,panic:!0,print:!0,println:!0,real:!0,recover:!0},g=/[+\-*&^%:=<>!|\/]/,i;function p(e,n){var t=e.next();if(t=='"'||t=="'"||t=="`")return n.tokenize=b(t),n.tokenize(e,n);if(/[\d\.]/.test(t))return t=="."?e.match(/^[0-9]+([eE][\-+]?[0-9]+)?/):t=="0"?e.match(/^[xX][0-9a-fA-F]+/)||e.match(/^0[0-7]+/):e.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/),"number";if(/[\[\]{}\(\),;\:\.]/.test(t))return i=t,null;if(t=="/"){if(e.eat("*"))return n.tokenize=x,x(e,n);if(e.eat("/"))return e.skipToEnd(),"comment"}if(g.test(t))return e.eatWhile(g),"operator";e.eatWhile(/[\w\$_\xa1-\uffff]/);var r=e.current();return f.propertyIsEnumerable(r)?((r=="case"||r=="default")&&(i="case"),"keyword"):v.propertyIsEnumerable(r)?"atom":"variable"}function b(e){return function(n,t){for(var r=!1,c,k=!1;(c=n.next())!=null;){if(c==e&&!r){k=!0;break}r=!r&&e!="`"&&c=="\\"}return(k||!(r||e=="`"))&&(t.tokenize=p),"string"}}function x(e,n){for(var t=!1,r;r=e.next();){if(r=="/"&&t){n.tokenize=p;break}t=r=="*"}return"comment"}function y(e,n,t,r,c){this.indented=e,this.column=n,this.type=t,this.align=r,this.prev=c}function s(e,n,t){return e.context=new y(e.indented,n,t,null,e.context)}function h(e){if(!!e.context.prev){var n=e.context.type;return(n==")"||n=="]"||n=="}")&&(e.indented=e.context.indented),e.context=e.context.prev}}return{startState:function(e){return{tokenize:null,context:new y((e||0)-o,0,"top",!1),indented:0,startOfLine:!0}},token:function(e,n){var t=n.context;if(e.sol()&&(t.align==null&&(t.align=!1),n.indented=e.indentation(),n.startOfLine=!0,t.type=="case"&&(t.type="}")),e.eatSpace())return null;i=null;var r=(n.tokenize||p)(e,n);return r=="comment"||(t.align==null&&(t.align=!0),i=="{"?s(n,e.column(),"}"):i=="["?s(n,e.column(),"]"):i=="("?s(n,e.column(),")"):i=="case"?t.type="case":(i=="}"&&t.type=="}"||i==t.type)&&h(n),n.startOfLine=!1),r},indent:function(e,n){if(e.tokenize!=p&&e.tokenize!=null)return u.Pass;var t=e.context,r=n&&n.charAt(0);if(t.type=="case"&&/^(?:case|default)\b/.test(n))return e.context.type="}",t.indented;var c=r==t.type;return t.align?t.column+(c?0:1):t.indented+(c?0:o)},electricChars:"{}):",closeBrackets:"()[]{}''\"\"``",fold:"brace",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//"}}),u.defineMIME("text/x-go","go")})})();const O=m.exports,E=w({__proto__:null,default:O},[m.exports]);export{E as g};
@@ -0,0 +1 @@
1
+ import{z as _}from"./index.f8fd6ee3.entry.js";function S(a,h){for(var l=0;l<h.length;l++){const f=h[l];if(typeof f!="string"&&!Array.isArray(f)){for(const o in f)if(o!=="default"&&!(o in a)){const p=Object.getOwnPropertyDescriptor(f,o);p&&Object.defineProperty(a,o,p.get?p:{enumerable:!0,get:()=>f[o]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}var E={exports:{}};(function(a,h){(function(l){l(_.exports)})(function(l){l.defineMode("groovy",function(f){function o(e){for(var n={},t=e.split(" "),r=0;r<t.length;++r)n[t[r]]=!0;return n}var p=o("abstract as assert boolean break byte case catch char class const continue def default do double else enum extends final finally float for goto if implements import in instanceof int interface long native new package private protected public return short static strictfp super switch synchronized threadsafe throw throws trait transient try void volatile while"),O=o("catch class def do else enum finally for if interface switch trait try while"),T=o("return break continue"),B=o("null true false this"),i;function k(e,n){var t=e.next();if(t=='"'||t=="'")return b(t,e,n);if(/[\[\]{}\(\),;\:\.]/.test(t))return i=t,null;if(/\d/.test(t))return e.eatWhile(/[\w\.]/),e.eat(/eE/)&&(e.eat(/\+\-/),e.eatWhile(/\d/)),"number";if(t=="/"){if(e.eat("*"))return n.tokenize.push(x),x(e,n);if(e.eat("/"))return e.skipToEnd(),"comment";if(v(n.lastToken,!1))return b(t,e,n)}if(t=="-"&&e.eat(">"))return i="->",null;if(/[+\-*&%=<>!?|\/~]/.test(t))return e.eatWhile(/[+\-*&%=<>|~]/),"operator";if(e.eatWhile(/[\w\$_]/),t=="@")return e.eatWhile(/[\w\$_\.]/),"meta";if(n.lastToken==".")return"property";if(e.eat(":"))return i="proplabel","property";var r=e.current();return B.propertyIsEnumerable(r)?"atom":p.propertyIsEnumerable(r)?(O.propertyIsEnumerable(r)?i="newstatement":T.propertyIsEnumerable(r)&&(i="standalone"),"keyword"):"variable"}k.isBase=!0;function b(e,n,t){var r=!1;if(e!="/"&&n.eat(e))if(n.eat(e))r=!0;else return"string";function c(g,m){for(var s=!1,y,z=!r;(y=g.next())!=null;){if(y==e&&!s){if(!r)break;if(g.match(e+e)){z=!0;break}}if(e=='"'&&y=="$"&&!s&&g.eat("{"))return m.tokenize.push(C()),"string";s=!s&&y=="\\"}return z&&m.tokenize.pop(),"string"}return t.tokenize.push(c),c(n,t)}function C(){var e=1;function n(t,r){if(t.peek()=="}"){if(e--,e==0)return r.tokenize.pop(),r.tokenize[r.tokenize.length-1](t,r)}else t.peek()=="{"&&e++;return k(t,r)}return n.isBase=!0,n}function x(e,n){for(var t=!1,r;r=e.next();){if(r=="/"&&t){n.tokenize.pop();break}t=r=="*"}return"comment"}function v(e,n){return!e||e=="operator"||e=="->"||/[\.\[\{\(,;:]/.test(e)||e=="newstatement"||e=="keyword"||e=="proplabel"||e=="standalone"&&!n}function w(e,n,t,r,c){this.indented=e,this.column=n,this.type=t,this.align=r,this.prev=c}function d(e,n,t){return e.context=new w(e.indented,n,t,null,e.context)}function u(e){var n=e.context.type;return(n==")"||n=="]"||n=="}")&&(e.indented=e.context.indented),e.context=e.context.prev}return{startState:function(e){return{tokenize:[k],context:new w((e||0)-f.indentUnit,0,"top",!1),indented:0,startOfLine:!0,lastToken:null}},token:function(e,n){var t=n.context;if(e.sol()&&(t.align==null&&(t.align=!1),n.indented=e.indentation(),n.startOfLine=!0,t.type=="statement"&&!v(n.lastToken,!0)&&(u(n),t=n.context)),e.eatSpace())return null;i=null;var r=n.tokenize[n.tokenize.length-1](e,n);if(r=="comment")return r;if(t.align==null&&(t.align=!0),(i==";"||i==":")&&t.type=="statement")u(n);else if(i=="->"&&t.type=="statement"&&t.prev.type=="}")u(n),n.context.align=!1;else if(i=="{")d(n,e.column(),"}");else if(i=="[")d(n,e.column(),"]");else if(i=="(")d(n,e.column(),")");else if(i=="}"){for(;t.type=="statement";)t=u(n);for(t.type=="}"&&(t=u(n));t.type=="statement";)t=u(n)}else i==t.type?u(n):(t.type=="}"||t.type=="top"||t.type=="statement"&&i=="newstatement")&&d(n,e.column(),"statement");return n.startOfLine=!1,n.lastToken=i||r,r},indent:function(e,n){if(!e.tokenize[e.tokenize.length-1].isBase)return l.Pass;var t=n&&n.charAt(0),r=e.context;r.type=="statement"&&!v(e.lastToken,!0)&&(r=r.prev);var c=t==r.type;return r.type=="statement"?r.indented+(t=="{"?0:f.indentUnit):r.align?r.column+(c?0:1):r.indented+(c?0:f.indentUnit)},electricChars:"{}",closeBrackets:{triples:`'"`},fold:"brace",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//"}}),l.defineMIME("text/x-groovy","groovy")})})();const j=E.exports,P=S({__proto__:null,default:j},[E.exports]);export{P as g};
@@ -0,0 +1 @@
1
+ import{z as h}from"./index.f8fd6ee3.entry.js";import{r as y}from"./htmlmixed.655b4687.js";import{r as a}from"./ruby.2ba33d98.js";function b(l,p){for(var i=0;i<p.length;i++){const r=p[i];if(typeof r!="string"&&!Array.isArray(r)){for(const o in r)if(o!=="default"&&!(o in l)){const u=Object.getOwnPropertyDescriptor(r,o);u&&Object.defineProperty(l,o,u.get?u:{enumerable:!0,get:()=>r[o]})}}}return Object.freeze(Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}))}var d={exports:{}};(function(l,p){(function(i){i(h.exports,y(),a())})(function(i){i.defineMode("haml",function(r){var o=i.getMode(r,{name:"htmlmixed"}),u=i.getMode(r,"ruby");function m(n){return function(e,t){var c=e.peek();return c==n&&t.rubyState.tokenize.length==1?(e.next(),t.tokenize=k,"closeAttributeTag"):f(e,t)}}function f(n,e){return n.match("-#")?(n.skipToEnd(),"comment"):u.token(n,e.rubyState)}function k(n,e){var t=n.peek();if(e.previousToken.style=="comment"&&e.indented>e.previousToken.indented)return n.skipToEnd(),"commentLine";if(e.startOfLine){if(t=="!"&&n.match("!!"))return n.skipToEnd(),"tag";if(n.match(/^%[\w:#\.]+=/))return e.tokenize=f,"hamlTag";if(n.match(/^%[\w:]+/))return"hamlTag";if(t=="/")return n.skipToEnd(),"comment"}if((e.startOfLine||e.previousToken.style=="hamlTag")&&(t=="#"||t=="."))return n.match(/[\w-#\.]*/),"hamlAttribute";if(e.startOfLine&&!n.match("-->",!1)&&(t=="="||t=="-"))return e.tokenize=f,e.tokenize(n,e);if(e.previousToken.style=="hamlTag"||e.previousToken.style=="closeAttributeTag"||e.previousToken.style=="hamlAttribute"){if(t=="(")return e.tokenize=m(")"),e.tokenize(n,e);if(t=="{"&&!n.match(/^\{%.*/))return e.tokenize=m("}"),e.tokenize(n,e)}return o.token(n,e.htmlState)}return{startState:function(){var n=i.startState(o),e=i.startState(u);return{htmlState:n,rubyState:e,indented:0,previousToken:{style:null,indented:0},tokenize:k}},copyState:function(n){return{htmlState:i.copyState(o,n.htmlState),rubyState:i.copyState(u,n.rubyState),indented:n.indented,previousToken:n.previousToken,tokenize:n.tokenize}},token:function(n,e){if(n.sol()&&(e.indented=n.indentation(),e.startOfLine=!0),n.eatSpace())return null;var t=e.tokenize(n,e);if(e.startOfLine=!1,t&&t!="commentLine"&&(e.previousToken={style:t,indented:e.indented}),n.eol()&&e.tokenize==f){n.backUp(1);var c=n.peek();n.next(),c&&c!=","&&(e.tokenize=k)}return t=="hamlTag"?t="tag":t=="commentLine"?t="comment":t=="hamlAttribute"?t="attribute":t=="closeAttributeTag"&&(t=null),t}}},"htmlmixed","ruby"),i.defineMIME("text/x-haml","haml")})})();const T=d.exports,z=b({__proto__:null,default:T},[d.exports]);export{z as h};
@@ -0,0 +1 @@
1
+ import{z as m}from"./index.f8fd6ee3.entry.js";import{r as l}from"./multiplex.db4b19a1.js";import{s as p}from"./simple.1606e663.js";function g(o,a){for(var e=0;e<a.length;e++){const r=a[e];if(typeof r!="string"&&!Array.isArray(r)){for(const t in r)if(t!=="default"&&!(t in o)){const n=Object.getOwnPropertyDescriptor(r,t);n&&Object.defineProperty(o,t,n.get?n:{enumerable:!0,get:()=>r[t]})}}}return Object.freeze(Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}))}var s={exports:{}};(function(o,a){(function(e){e(m.exports,p.exports,l())})(function(e){e.defineSimpleMode("handlebars-tags",{start:[{regex:/\{\{\{/,push:"handlebars_raw",token:"tag"},{regex:/\{\{!--/,push:"dash_comment",token:"comment"},{regex:/\{\{!/,push:"comment",token:"comment"},{regex:/\{\{/,push:"handlebars",token:"tag"}],handlebars_raw:[{regex:/\}\}\}/,pop:!0,token:"tag"}],handlebars:[{regex:/\}\}/,pop:!0,token:"tag"},{regex:/"(?:[^\\"]|\\.)*"?/,token:"string"},{regex:/'(?:[^\\']|\\.)*'?/,token:"string"},{regex:/>|[#\/]([A-Za-z_]\w*)/,token:"keyword"},{regex:/(?:else|this)\b/,token:"keyword"},{regex:/\d+/i,token:"number"},{regex:/=|~|@|true|false/,token:"atom"},{regex:/(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/,token:"variable-2"}],dash_comment:[{regex:/--\}\}/,pop:!0,token:"comment"},{regex:/./,token:"comment"}],comment:[{regex:/\}\}/,pop:!0,token:"comment"},{regex:/./,token:"comment"}],meta:{blockCommentStart:"{{--",blockCommentEnd:"--}}"}}),e.defineMode("handlebars",function(r,t){var n=e.getMode(r,"handlebars-tags");return!t||!t.base?n:e.multiplexingMode(e.getMode(r,t.base),{open:"{{",close:/\}\}\}?/,mode:n,parseDelimiters:!0})}),e.defineMIME("text/x-handlebars-template","handlebars")})})();const d=s.exports,i=g({__proto__:null,default:d},[s.exports]);export{s as a,i as h};
@@ -0,0 +1 @@
1
+ import{z as f}from"./index.f8fd6ee3.entry.js";import{a as u}from"./haskell.7e315eae.js";function c(a,l){for(var e=0;e<l.length;e++){const n=l[e];if(typeof n!="string"&&!Array.isArray(n)){for(const t in n)if(t!=="default"&&!(t in a)){const r=Object.getOwnPropertyDescriptor(n,t);r&&Object.defineProperty(a,t,r.get?r:{enumerable:!0,get:()=>n[t]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}var s={exports:{}};(function(a,l){(function(e){e(f.exports,u.exports)})(function(e){e.defineMode("haskell-literate",function(n,t){var r=e.getMode(n,t&&t.base||"haskell");return{startState:function(){return{inCode:!1,baseState:e.startState(r)}},token:function(o,i){return o.sol()&&(i.inCode=o.eat(">"))?"meta":i.inCode?r.token(o,i.baseState):(o.skipToEnd(),"comment")},innerMode:function(o){return o.inCode?{state:o.baseState,mode:r}:null}}},"haskell"),e.defineMIME("text/x-literate-haskell","haskell-literate")})})();const d=s.exports,b=c({__proto__:null,default:d},[s.exports]);export{b as h};
@@ -0,0 +1 @@
1
+ import{z as W}from"./index.f8fd6ee3.entry.js";function I(m,s){for(var a=0;a<s.length;a++){const f=s[a];if(typeof f!="string"&&!Array.isArray(f)){for(const o in f)if(o!=="default"&&!(o in m)){const l=Object.getOwnPropertyDescriptor(f,o);l&&Object.defineProperty(m,o,l.get?l:{enumerable:!0,get:()=>f[o]})}}}return Object.freeze(Object.defineProperty(m,Symbol.toStringTag,{value:"Module"}))}var b={exports:{}};(function(m,s){(function(a){a(W.exports)})(function(a){a.defineMode("haskell",function(f,o){function l(e,r,t){return r(t),t(e,r)}var E=/[a-z_]/,y=/[A-Z]/,h=/\d/,F=/[0-9A-Fa-f]/,R=/[0-7]/,c=/[a-z_A-Z0-9'\xa1-\uffff]/,p=/[-!#$%&*+.\/<=>?@\\^|~:]/,k=/[(),;[\]`{}]/,g=/[ \t\v\f]/;function u(e,r){if(e.eatWhile(g))return null;var t=e.next();if(k.test(t)){if(t=="{"&&e.eat("-")){var n="comment";return e.eat("#")&&(n="meta"),l(e,r,v(n,1))}return null}if(t=="'")return e.eat("\\"),e.next(),e.eat("'")?"string":"string error";if(t=='"')return l(e,r,w);if(y.test(t))return e.eatWhile(c),e.eat(".")?"qualifier":"variable-2";if(E.test(t))return e.eatWhile(c),"variable";if(h.test(t)){if(t=="0"){if(e.eat(/[xX]/))return e.eatWhile(F),"integer";if(e.eat(/[oO]/))return e.eatWhile(R),"number"}e.eatWhile(h);var n="number";return e.match(/^\.\d+/)&&(n="number"),e.eat(/[eE]/)&&(n="number",e.eat(/[-+]/),e.eatWhile(h)),n}if(t=="."&&e.eat("."))return"keyword";if(p.test(t)){if(t=="-"&&e.eat(/-/)&&(e.eatWhile(/-/),!e.eat(p)))return e.skipToEnd(),"comment";var n="variable";return t==":"&&(n="variable-2"),e.eatWhile(p),n}return"error"}function v(e,r){return r==0?u:function(t,n){for(var i=r;!t.eol();){var d=t.next();if(d=="{"&&t.eat("-"))++i;else if(d=="-"&&t.eat("}")&&(--i,i==0))return n(u),e}return n(v(e,i)),e}}function w(e,r){for(;!e.eol();){var t=e.next();if(t=='"')return r(u),"string";if(t=="\\"){if(e.eol()||e.eat(g))return r(O),"string";e.eat("&")||e.next()}}return r(u),"string error"}function O(e,r){return e.eat("\\")?l(e,r,w):(e.next(),r(u),"error")}var x=function(){var e={};function r(i){return function(){for(var d=0;d<arguments.length;d++)e[arguments[d]]=i}}r("keyword")("case","class","data","default","deriving","do","else","foreign","if","import","in","infix","infixl","infixr","instance","let","module","newtype","of","then","type","where","_"),r("keyword")("..",":","::","=","\\","<-","->","@","~","=>"),r("builtin")("!!","$!","$","&&","+","++","-",".","/","/=","<","<*","<=","<$>","<*>","=<<","==",">",">=",">>",">>=","^","^^","||","*","*>","**"),r("builtin")("Applicative","Bool","Bounded","Char","Double","EQ","Either","Enum","Eq","False","FilePath","Float","Floating","Fractional","Functor","GT","IO","IOError","Int","Integer","Integral","Just","LT","Left","Maybe","Monad","Nothing","Num","Ord","Ordering","Rational","Read","ReadS","Real","RealFloat","RealFrac","Right","Show","ShowS","String","True"),r("builtin")("abs","acos","acosh","all","and","any","appendFile","asTypeOf","asin","asinh","atan","atan2","atanh","break","catch","ceiling","compare","concat","concatMap","const","cos","cosh","curry","cycle","decodeFloat","div","divMod","drop","dropWhile","either","elem","encodeFloat","enumFrom","enumFromThen","enumFromThenTo","enumFromTo","error","even","exp","exponent","fail","filter","flip","floatDigits","floatRadix","floatRange","floor","fmap","foldl","foldl1","foldr","foldr1","fromEnum","fromInteger","fromIntegral","fromRational","fst","gcd","getChar","getContents","getLine","head","id","init","interact","ioError","isDenormalized","isIEEE","isInfinite","isNaN","isNegativeZero","iterate","last","lcm","length","lex","lines","log","logBase","lookup","map","mapM","mapM_","max","maxBound","maximum","maybe","min","minBound","minimum","mod","negate","not","notElem","null","odd","or","otherwise","pi","pred","print","product","properFraction","pure","putChar","putStr","putStrLn","quot","quotRem","read","readFile","readIO","readList","readLn","readParen","reads","readsPrec","realToFrac","recip","rem","repeat","replicate","return","reverse","round","scaleFloat","scanl","scanl1","scanr","scanr1","seq","sequence","sequence_","show","showChar","showList","showParen","showString","shows","showsPrec","significand","signum","sin","sinh","snd","span","splitAt","sqrt","subtract","succ","sum","tail","take","takeWhile","tan","tanh","toEnum","toInteger","toRational","truncate","uncurry","undefined","unlines","until","unwords","unzip","unzip3","userError","words","writeFile","zip","zip3","zipWith","zipWith3");var t=o.overrideKeywords;if(t)for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}();return{startState:function(){return{f:u}},copyState:function(e){return{f:e.f}},token:function(e,r){var t=r.f(e,function(i){r.f=i}),n=e.current();return x.hasOwnProperty(n)?x[n]:t},blockCommentStart:"{-",blockCommentEnd:"-}",lineComment:"--"}}),a.defineMIME("text/x-haskell","haskell")})})();const T=b.exports,_=I({__proto__:null,default:T},[b.exports]);export{b as a,_ as h};